OmniAICreator/Qiita-1.07M huggingface dataset:
[Python] Multiprocessing内でグローバル変数は参照できないっぽい

これに関するレポートが無かったのでメモ書きを落としておきます。

Pythonでは標準モジュールのMultiprocessingにより、並列計算を行うことができます。
GPUのようなハードウェア的並列計算がサポートされるわけではなく、あくまでCPU上でのマルチプロセス処理です。

並列で処理したい関数の引数に、プールした引数リストの要素がそれぞれ渡されます。

並列処理される関数内でグローバル変数を参照するようなスクリプトを書いてみると以下のようになります。

```py3:example.py
import multiprocessing as mp

a = 0

def init_global():
    global a
    a = 100

def func(proc):
    global a
    print("Inside MultiProcess: ", proc, a)
    return a

if __name__ == "__main__":

    print("Before Change", a)

    init_global()

    print("After Change", a)

    pool = mp.Pool(4)
    callback = pool.map(func, range(4))
    pool.terminate()
    pool.join()

    print(sum(callback))

```

結果
![2017-03-14_150753.jpg](https://qiita-image-store.s3.amazonaws.com/0/127402/ae48bf3a-ac1c-d5ec-159c-645609bb8dea.jpeg)
この通り、通常の関数内(init_global)では参照及び代入ができていますが、並列処理される関数内でグローバル変数が参照できていません。


---

どうしても並列処理関数内でグローバル変数の値を参照したい場合は呼び出し元から引数指定するしかなさそうです。
(複数の引数を渡したい場合はタプルを生成してやる必要があります)

```py3:example.py
import multiprocessing as mp

a = 0
b = 1111

def init_global():
    global a
    a = 100

def func(proc):
    print("Inside MultiProcess: ", proc[0], proc[1])
    return proc[0]

if __name__ == "__main__":

    print("Before Change", a)

    init_global()

    print("After Change", a)

    pool = mp.Pool(4)
    args = [(a,b) for i in range(4)]
    callback = pool.map(func, args)
    pool.terminate()
    pool.join()

    print(sum(callback))
```

結果
![2017-03-14_151709.jpg](https://qiita-image-store.s3.amazonaws.com/0/127402/6b8a98f9-1941-398d-b578-fa3ef272e8a6.jpeg)
渡せました。

もしかするとちゃんとした方法があるのかもしれませんが、見つけきれなかったので、より良い方法があればご報告よろしくお願い致します。
Mapserver その2

#概要
Mapserverの地図をleafletで表示してみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/K/7/m/K7mP.jpg?t=1489472185)

#成果物

http://jsdo.it/ohisama1/K7mP

#サンプルコード

```
var map = L.map('map').setView([38.0, 140.0], 11);
var mvr = L.tileLayer("", {
    attribution: 'mvr',
    maxZoom: 18,
});
mvr.getTileUrl = function(coord) {
    var zoom = coord.z;
    var s = Math.pow(2, coord.z);
    var llp = L.point((coord.x * 256 + 128) / s, (coord.y * 256 + 128) / s);
    var ll = fromPointToLatLng(llp, s);
    var lng = ll.lng;    
    var lat = ll.lat;
    return "http://yumeblog.dip.jp/yb2g0.php?zoom=" + zoom + "&long=" + lng + "&lat=" + lat;
};
mvr.addTo(map);
function fromPointToLatLng(point, max_zoom) {
	var size = (1 << max_zoom) * 256,
		lat = (2 * Math.atan(Math.exp((point.y - size / 2) / -(size / (2 * Math.PI)))) - (Math.PI / 2)) * (180 / Math.PI),
		lng = (point.x - size / 2) * (360 / size);
	return L.latLng(lat, lng);
}
```
Swift:storyboardを利用したサンプル

<2015年のときの書きかけ、下書きで残っていたのを放出>
少しは何かのメモになるか。。

swiftを使う準備として
[SwiftをXcodeで使ってみる](http://qiita.com/tagosaku324/items/4d0742a60e0aa840b9d5)


storyboardを利用して
・画面遷移（Navigation Controller）の動線を確認する。
・TableView　を確認する。

※気がついた注意点
・storyboardを利用しなくても、すべてソースに記載すれば同じことはできる。
・ソースに追加してもstoryboardに部品は追加されない。
・storyboardに部品を追加してもソースには自動的に反映されない。

*言葉で躓いたこと
・「アウトレット接続」：画面とプログラムをマウスを引っ張ってつなげることをいうらしいです。 
ユーティリティエリアの丸矢印で「Outlets」に表示されていれば処理が登録されたことになるようです。 
この作業をしておかないと、処理ができないということみたいですね。

#画面遷移（Navigation Controller）
以下のURLを参考にさせてもらいました。
[Navigation Controllerを使って二つのビューを画面遷移させる](http://mushikago.com/i/?p=5082)
このサイトはstoryboardで作成するパターンと、ソースに追加して作成するパターンと両方あるのでとてもべんきょうになりました。

上記のとおりに進めてシミュレータで表示させようとしたときにエラーになりました。
![スクリーンショット 2015-05-19 16.24.10.png](https://qiita-image-store.s3.amazonaws.com/0/39911/fbe9e848-460e-9471-0bdc-021f2ebf67d9.png)

何か単純なエラーなんですが、ソースは記載されないのでよくわからない。
調べたところ
初期の起動 View を選択していないと起きるエラーとのこと
http://blog.77jp.net/iphone-perhaps-the-designated-entry-point-is-not-set-error
よくよくみると、storyboardに出だしの「→」がありません。
Navigation Controllerを選択して「 Is Initial View Controller」にチェックをいれると「→」がでてきました。
![スクリーンショット 2015-05-19 18.14.21.png](https://qiita-image-store.s3.amazonaws.com/0/39911/f037ee9b-705c-9879-51eb-1b47095125d2.png)
これで無事にシュミレータで確認ができるようになりました。


# TableViewを使ってリストを表示させる
Xcodeの使い方として以下のサイトを参考にさせてもらいました。
[Storyboard - UIViewにUITableViewを追加する](http://enamelsystems.com/0012/)
![スクリーンショット 2015-05-26 15.27.25.png](https://qiita-image-store.s3.amazonaws.com/0/39911/0ffc509d-1987-6c61-679c-09e41375108d.png)
dreamweaverの「ファイル」パネルが表示されない。

というのをしばしば私もやってしまうので
解決方法をメモらせて頂きます。

https://oshiete.goo.ne.jp/qa/3658271.html

メニューバーの「ウィンドウ」をクリックし、非表示にしたパネルグループの中にあるパネル名を選択すれば再表示される筈です

との事。

メモ失礼します。
macOSでのtidyverseのインストールでコケた場合の対処

## 環境

### OS
```
Darwin HOSTNAME 15.6.0 Darwin Kernel Version 15.6.0: Mon Jan  9 23:07:29 PST 2017; root:xnu-3248.60.11.2.1~1/RELEASE_X86_64 x86_64
```

### XCode
```
Version 8.2.1 (8C1002)
```

### R
```
R version 3.3.3 (2017-03-06) -- "Another Canoe"
```

## 症状

tidyverseのインストールでコケる。下記のようなエラーが出て、xml2のインストールに失敗する。

```R
install.packages('tidyverse')
...
...
(省略)
...
...
ld: file not found: /usr/lib/system/libsystem_symptoms.dylib for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [xml2.so] Error 1
ERROR: compilation failed for package ‘xml2’
* removing ‘/usr/local/lib/R/3.3/site-library/xml2’
Warning in install.packages :
  installation of package ‘xml2’ had non-zero exit status
ERROR: dependency ‘xml2’ is not available for package ‘rvest’
* removing ‘/usr/local/lib/R/3.3/site-library/rvest’
Warning in install.packages :
  installation of package ‘rvest’ had non-zero exit status
ERROR: dependencies ‘rvest’, ‘xml2’ are not available for package ‘tidyverse’
* removing ‘/usr/local/lib/R/3.3/site-library/tidyverse’
Warning in install.packages :
  installation of package ‘tidyverse’ had non-zero exit status
```

## 対処法

エラーでググると下記のStackOverflowが引っかかる。Xcodeのバグらしい。

- http://stackoverflow.com/questions/39536144/libsystem-symptoms-dylib-missing-in-xcode-8

Raymond Naseefさんの次の回答にあるコマンドを実行するとdylibへの参照が消えてコンパイルできるようになる。自分の環境ではこれでインストールできるようになりました。

- http://stackoverflow.com/a/40315953

引用コマンド（2017/03/14閲覧）

```
sudo /usr/bin/sed -i.backup -E -e 's@/usr/lib/system/libsystem_symptoms.dylib(, )?@@' \
$(grep -ril /usr/lib/system/libsystem_symptoms.dylib \
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/lib)
```
面白いと思った論文動画

- Event-Based Camera でカメラ運動追跡＆3次元再構成 
https://youtu.be/yHLyhdMSw7w
- 複数の人物が存在するシーン中で、どこのエリアが人々の注意を集め得るかを推定する
https://youtu.be/dQSobApwt6g
- 映像が印刷物のように衣服にぴったり張り付いて投影する
https://youtu.be/-bh1MHuA5jU
- 古い画像を自動色付け
https://youtu.be/ys5nMO4Q0iY
- スマホなどの携帯できる小型デバイスで撮影した顔を3Dアバター化
https://youtu.be/6zP0E2atshw
- 密な動線抽出による行動認識
https://lear.inrialpes.fr/people/wang/dense_trajectories
- 遷移行動を認識することで数秒先の未来を予測
https://youtu.be/m1AmdIYGaBY
- Multi-task Network Cascades (MNCs)を提案し，カスケード内 でDeep Residual Networks (ResNet)も用いてセマンティックセグメンテーションの課題に取り組んだ https://youtu.be/bUjyXASy_Jo
- Optical Flow Estimation における離散グリッド間マッピングス ペースの計算処理を大幅に削減した最適化手法の提案 https://youtu.be/XPvsZpsTmps
- 静止画でなく，ビデオに対するセマンティックセグメンテーション に関する手法を提案
https://youtu.be/k9EgyFpiH8g
- 教師なし学習によりエッジ検出を高精度に実行する
https://youtu.be/3P00etv20d0
- オプティカルフローを高度に用いたセマンティックセグメンテー ション手法の提案
https://youtu.be/QwmBSTWgr_s
- 筋肉の基本モデルから、筋肉質にしたり、太らせたりできるモデルを作成
https://youtu.be/1Rw1rlB866k
- 人間の様々な動きの３Dモデルデータセット
https://youtu.be/mWthea2K8-Q

###その他
- Breathing Life into Shape https://youtu.be/4CRMgPcgKp4
- Implicit Skinning: Real-Time Skin Deformation with Contact Modeling https://youtu.be/RHySGIqEgyk
- Real-Time High-Fidelity Facial Performance Capture https://youtu.be/MMa2oT1wMIs
- Online Modeling For Realtime Facial Animation https://youtu.be/DBoChIFrj2c
- Sparse Iterative Closest Point https://youtu.be/ii2vHBwlmo8
- Go-ICP: Solving 3D Registration Efficiently and Globally Optimally https://youtu.be/LCKowDdh9Gs
- Tracking Surfaces with Evolving Topology https://youtu.be/JaBBQDx2BBk
- Viscous SPH https://youtu.be/3yyLIG935zc
- A Benchmark Dataset and Evaluation Methodology for Video Object Segmentation https://youtu.be/8f9y17-OAwI
- Garment Transfer for Quadruped Characters https://youtu.be/-tCUG5zllNo
- Egocentric Future Localization https://youtu.be/0YY3aBX0GTQ
Batファイルまとめ

### ネットワークドライブの疎通確認

↓は実在するフォルダ p:\main\ に対する疎通確認の例

```bat:if.bat
if not exist P:\main\ (
	実行したい処理
)
```

### ログを追記する
記録先はbatファイルと同一フォルダにあるエラー記録.log

```bat:ログ追記.bat
echo "文字列" >> %0\..\エラー記録.log
```

###日付と時間と文字列を記録
```bat:日時と文字列書き出し.bat
echo %date% %time%  "Pドライブ接続失敗">> %0\..\P_errLog.txt
```

###5秒ごとに繰り返す
```bat:repert5sec
:top
timeout 5
　繰り返したい処理
goto top
```

###全部まとめると↓

```bat:chkNAS.bat
:top
timeout 5
if not exist P:\main\ (
	echo %date% %time%  "Pドライブ接続失敗">> %0\..\P_errLog.txt
)
goto top
```
シェル初心者のための基本的な操作方法のまとめ

<h2>カーソル移動</h2>　
<ul>
<li>ctrl + f（前方に1文字分）</li>
<li>ctrl + b（後方に1文字分）</li>
<li>ctrl + a（行頭）</li>
<li>ctrl + e（行末）</li>
<li>alt + f （前方に単語1つ分）</li>
<li>alt + b （後方に単語1つ分）</li>
</ul>

<h2>文字の削除</h2>
<ul>
<li>ctrl + h (カーソル位置の後方に1文字削除）</li>
<li>ctrl + d (カーソル位置の1文字削除）</li>
<li>ctrl + w (後方にスペース区切りで1単語分削除）</li>
</ul>

<h2>カットとヤンク</h2>
<ul>
<li>ctrl + k（カーソル位置から行末までを削除する）</li>
<li>ctrl + u（カーソル位置から行頭までを削除する）</li>
<li>ctrl + y（最後に削除した内容を挿入する）</li>
</ul>

<h2>実行中のコマンドを強制終了</h2>
<ul>
<li>ctrl + c</li>
</ul>

<h2>画面を消去する</h2>
<ul>
<li>ctrl + l</li>
</ul>

<h2>コマンド名の補完</h2>
<ul>
<li>Tab</li>
</ul>

<h2>コマンド履歴の操作</h2>
<ul>
<li>ctrl + p（1つ前のコマンド履歴）</li>
<li>ctrl + n（次のコマンド履歴）</li>
<li>ctrl + r（インクリメンタル検索）</li>
</ul>

<h2>インクリメンタル検索時の操作</h2>
<ul>
<li>文字の入力（検索語を追加して再検索）</li>
<li>ctrl + r  （1つ前の検索結果へ移動）</li>
<li>enter     （現在の検索結果をそのまま実行）</li>
<li>esc       （現在の検索結果を表示したまま、コマンドラインに戻る）</li>
<li>ctrl + g  （検索結果を破棄し、プロンプトに戻る）</li>
</ul>
Auth0+firebase+react nativeでログイン認証


#利用するサービス、ライブラリ

firebase
https://firebase.google.com
Google提供のアプリ用バックエンド。

Auth0
https://auth0.com
各サービスごとに実装するとかなり手間がかかるログイン処理を簡単に使えるサービス。

react-native-lock
https://github.com/auth0/react-native-lock
Auth0の公式ライブラリ。
後述しますが、まだドキュメントが古かったり、ログイン画面のカスタマイズなどができなかったりします。

簡単にできるかと思いきや、けっこうハマったので、メモを作っておきます。

#チュートリアル

https://auth0.com/docs/quickstart/native/react-native-ios


#firebaseへログイン

	lock.show({}, (err, profile, token) => {
	  console.log('Logged in!');
	  firebase.auth().signInWithCustomToken(token.idToken);
	});


ログイン画面の表示までは、わりと簡単にできたけれど、firebaseに渡す、idTokenがこれでは、通らない。

https://auth0.com/docs/tokens/delegation

Delegationというのをしないといけないらしい。
react-native-lockにその機能はないみたい。

Auth0のdelgation API
https://auth0.com/docs/api/authentication#delegation


	POST https://calil.auth0.com/delegation
	Content-Type: 'application/json'
	{
	  "client_id": "YOUR_CLIENT_ID",
	  "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
	  "id_token" or "refresh_token" : "TOKEN",
	  "target": "TARGET_CLIENT_ID",
	  "scope": "openid",
	  "api_type": "API_TYPE"
	}

これを叩く必要がある。
実際のコード。

```Javascript
import request from 'superagent';
lock.show({}, (err, profile, token) => {
  if (err) return alert(err);
  // Authentication worked!
  // console.log('Logged in with Auth0!');
  // console.log(token);
  const url = 'https://{your-id}.auth0.com/delegation';
  request.post(url).send({
    client_id: '{YOUR_CLIENT_ID}',
    grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
    refresh_token: token.refreshToken,
    scope: 'open_id',
    api_type: 'firebase',
  }).end((err, res) => {
    // console.log(err);
    // console.log(res);
    if (!err) {
      firebase.auth().signInWithCustomToken(res.body.id_token)
      .catch(error => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
        alert(errorMessage);
      });
    }
  });
```

#delgationがエラー

https://auth0.com/authenticate/react-native-ios/firebase

こちらの手順で、dashboardでfirebaseのキーなどの設定が必要です。

#Andoridのビルドでエラー

https://github.com/auth0/react-native-lock#manually-1

	rnpm link react-native-lock

だけでは、足りないようで、↑のmanuallyで不足部分を足す必要があります。

#iOSのReleaseビルドだけエラー

Xcodeで
ld: warning: directory not found for option '-L

というエラーが出ます

https://github.com/auth0/react-native-lock/issues/70

If not, try right clicking on Libraries, select "Add Files To..." and go under <Your Project>/ios/Pods/ and select Pods.xcodeproj. The problem for me was that XCode didn't know where to find all those libraries.

#公式のチュートリアルが古い問題

たぶん、この２つのビルドエラーは、
	react-native link react-native-lock
を使っておけば解決したのだと思います。

https://auth0.com/docs/quickstart/native/react-native-ios
↑の公式ドキュメントでは、
	rnpm link react-native-lock
となってたので、ハマってしまいました。

https://github.com/auth0/react-native-lock

こちらのドキュメントの手順を踏むべきでした。

#感想

いろいろハマりましたが、わりと簡単にログイン処理ができるのは間違いないです。
他のプラットフォーム版のように、ログイン画面のカスタマイズもできるようになることに期待。
ASP.NET Core Fundamentals - 日本語意訳

このドキュメントは ASP.NET Core の Fundamentals セクションの日本語意訳です。

- 公式ドキュメント：https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/

まだ日本語版が存在していないようなので、ASP.NET Core 学習はもとより、自身の英語学習も兼ねて日本語化をしていきたいと思います。

# 目次
- [概要](http://qiita.com/tkiryu/items/e1d7fe62642fcc67cf47) - 2017/03/14 公開
- [ASP.NET Core でのアプリケーションの起動](http://qiita.com/tkiryu/items/012a0123c9eb317a0624) - 2017/03/15 公開
- [Middleware](http://qiita.com/tkiryu/items/211d2b2f27af5dec5b52) - 2017/03/23 公開
- [静的ファイルの扱い](http://qiita.com/tkiryu/items/c8a68c80211d4612d482) - 2017/04/09 公開
- [Routing](http://qiita.com/tkiryu/items/ba6d6affb771ee9ba3ae) - 2017/06/15 公開
- [URL Rewriting Middleware](http://qiita.com/tkiryu/items/b9da836b4dd0461ac19b) - 2017/07/07 公開
- [エラー処理](http://qiita.com/tkiryu/items/d14f6a8c687401690bed) - <font color="red">NEW</font> 2017/07/29 公開
- WebSockets
- Globalization and localization
- Configuration
- Logging
- File Providers
- Dependency Injection
- Working with Multiple Environments
- Hosting
- Session and application state
- Servers
    - Kestrel
    - ASP​.NET Core Module
    - WebListener
- Request Features
- Open Web Interface for ​.NET (OWIN)
- Choose between ASP​.NET Core and ASP​.NET
- Choose between ​.NET Core and ​.NET Framework runtime
migrationの最新バージョンを取得する(rails)

# 経緯
マイグレーションの実行状況はschema_migrationsに設定されているのは知っているが
最後に実行したバージョン(最新のバージョン)を取得する方法がなかなか見つからなかったのでメモ。


# 取得方法
```ruby:
ActiveRecord::Migrator.current_version
```

# railsで使われていた場所

最新バージョンを取得するrakeタスクが用意されている
[db:version](https://github.com/rails/rails/blob/b1459fce6e5b64e9b70351b472816b219af5d6fd/activerecord/lib/active_record/railties/databases.rake#L157-L160)

```ruby:rails/activerecord/lib/active_record/railties/databases.rake
  desc "Retrieves the current schema version number"
  task version: [:environment, :load_config] do
    puts "Current version: #{ActiveRecord::Migrator.current_version}"
  end
```
Firefoxでマルチプロセスを有効化するメモ

これはFirefoxでe10sを強制的に有効化してメモリ節約よりも快適化を優先してヒャッハーするための備忘録です。

この手の資料はネット上にごろごろ転がっているので改めて作る必要もなかったのですが、、。
微妙に資料が古かったり知りたいパラメータが欠けていて複数ページみたりと大変だったので、自分の欲しい範囲でひとまずまとめました。

# 設定

Firefoxのアドレスバーに ```about:config``` と入力して設定画面を開く。

以下のように各項目の値を設定します。設定名が見当たらない場合は新規で作ります。

設定名 | 型 | 値
------|----|----
extensions.e10sBlocksEnabling | 真偽値 | false
extensions.e10sBlockedByAddons | 真偽値 | false
dom.ipc.processCount | 整数値 | 4 ～ 8程度
~~browser.tabs.remote.autostart~~ | ~~真偽値~~ | ~~true~~
~~browser.tabs.remote.autostart.1~~ | ~~真偽値~~ | ~~true~~
~~browser.tabs.remote.force-enable~~ | ~~真偽値~~ | ~~true~~

Firefox51から ```browser.tabs.remote.autostart``` と ```browser.tabs.remote.force-enable``` は不要になったようです。

## dom.ipc.processCountの補足

```dom.ipc.processCount``` はパソコンに搭載しているCPUのコア数と同数～半分くらいがよさそうでした。
多くすればその分多くのページを同時に開くのに有利ですが、その分メモリも食うので様子を見ながら調整です。

このプロセス数以上にページを開くと、１つのプロセスが複数のページのレンダリングを受け持つようになるようです。
そのため、たまたま豪華な作りのページのレンダリングに引っ張られて、他方のページ表示がもたつくような場合もあります。

およそ、１プロセスあたり200MB～300MB位のメモリを食う感じです。

# 確認

Firefoxのアドレスバーに ```about:support``` と入力してサポートページを開く。

マルチプロセスウィンドウの項目が「1/1」になっていればマルチプロセスが機能しています。

※Firefox53ベータ版での画面ショット
![about_support.png](https://qiita-image-store.s3.amazonaws.com/0/3934/e0aef49c-4eb2-0fc6-0153-e93ce79a7bca.png)
git > commit間で変更したファイル名のうち.cppを確認する > git diff --name-only 344c53a f140f0b | grep \\.cpp

```txt:動作環境
C++ Builder XE4
Source Tree v.1.6.22.0
Windwos 7 Pro (32bit)
```

gitリポジトリにて2つのcommit間で変更したファイル名のうち、.cppと.hを確認したい。

参考 http://stackoverflow.com/questions/1552340/how-to-list-the-file-names-only-that-changed-between-two-commits

SourceTreeにおいてターミナルから以下を実行することで`.cpp`の変更が分かる。

```
$ git diff --name-only 344c53a f140f0b | grep \\.cpp
```

The same goes for `.h` files.

```
$ git diff --name-only 344c53a f140f0b | grep \\.h
```
Vivado, PetaLinuxのバージョンとサポートされるUbuntuのリリース

私は開発ターゲットごとに仮想マシンを作成し，Vivado/PetaLinuxをインストールしているが，毎回調べるのが面倒なのでまとめた．

|Version |Vavado           |PetaLinux             |
|:-------|:----------------|:---------------------|
|2016.1  |14.04.03 (64bit) |14.04.3 (64bit)       |
|2016.2  |14.04.03 (64bit) |14.04.3/16.04 (64bit) |
|2016.3  |16.04 (64bit)    |14.04.3/16.04 (64bit) |
|2016.4  |16.04 (64bit)    |16.04 (64bit)         |
|2017.1  |16.04.1 (64bit)  |16.04.1 (64bit)       |
|2017.2  |16.04.1 (64bit)  |16.04.1 (64bit)       |

## 情報元
下のURLのバージョン部分を目的のバージョンに修正すれば取得可能．
https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2017_2/ug973-vivado-release-notes-install-license.pdf
https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2017_2/ug1144-petalinux-tools-reference-guide.pdf
RailsでServiceクラスのジェネレータを作ってみる


```
$ rails g generator Service
```
でジェネレータを生成する。
以下のファイルと

+ lib/generators/service/service_generator.rb
+ lib/generators/service/USAGE

以下のディレクトリが生成される。

+ lib/generators/service/templates


次のように修正して

```lib/generators/service/service_generator.rb
class ServiceGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('../templates', __FILE__)

  def generate
    template 'app.erb', path_of_app
    template 'spec.erb', path_of_spec
  end

  private
    def path_of_app
      File.join('app/services', "#{file_name}_service.rb")
    end

    def path_of_spec
      File.join('spec/services', "#{file_name}_service_spec.rb")
    end
end
```

```lib/generators/service/USAGE
Description:
    Create a new service.

Example:
    `rails generate service IssueSearch`

    This will create:
        app/services/issue_search_service.rb
        spec/services/issue_search_service_spec.rb
```


以下のファイルを追加

```lib/generators/service/templates/app.erb
class <%= class_name %>Service
  def initialize(params = {})
  end
end
```

```lib/generators/service/templates/spec.erb
require 'rails_helper'

RSpec.describe <%= class_name %>Service do
  subject { <%= class_name %>Service.new(params) }
  let(:params) {
    {
      some_args: :write_here
    }
  }
  pending "add some examples to (or delete) #{__FILE__}"
end
```

以上


### 参考
[Rails の GeneratorGenerator を使ってみる - Qiita](http://qiita.com/mshioda/items/78314be7a4d393d0cb44)
GameProgrammingPatterns: 第19章 オブジェクトプール

# 概要
- 社内勉強会で読んでます！
  - [Game Programming Patterns ソフトウェア開発の問題解決メニュー](https://www.amazon.co.jp/Programming-Patterns-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC-impress-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B015R0M8W0/ref=sr_1_1?ie=UTF8&qid=1476782331&sr=8-1&keywords=game+programming+patterns)

*****

# フラグメンテーションの呪い
- ゲーム/モバイル機器のメモリは少ない
- 効率の良いコンパクトメモリマネージャ(無駄な領域解放/断片化解消)が出来るのは稀
- 結果としてフラグメンテーション(ヒープ内の空きスペースが細切れになり、十分なメモリが存在しても再割当て出来ない)状態が起こる可能性がある

*****

# フラグメンテーションの回避
- 例えば、ゲーム開始に大きなメモリ領域を確保し、終了まで開放しない
- この方法では進行中の生成/破棄することが難しい

*****

# オブジェクトプール
- **一度生成したオブジェクトを使いまわすのが肝**

*****

- 再利用可能なオブジェクト群を管理するプールクラスを定義
- 初期化時に必要量を未使用状態で生成
- オブジェクトを使用する場面で、プールクラスは未使用のオブジェクトを使用中状態にして返す

*****

- オブジェクトが不要になった時は未使用状態に戻す
- フラグメンテーションを気にせず、オブジェクトを使用できる
- 都度都度のメモリ割り当てと解放のコストを避けることが出来る

*****

# 推奨される場面
- オブジェクトの生成と破壊が頻繁に必要な場合
- オブジェクトのサイズが似ている場合
- フラグメンテーションを起こす場合
- 各オブジェクトがデータベースやネットワーク等のリソースをカプセル化してあり、リソース取得のコストが高く、再利用が可能である場合

*****

# 使用上の注意

*****

## 大きなプールサイズ
- 必要最小限なプールサイズを指定する

*****

## 一時期に利用出来るオブジェクト数が固定される
- オブジェクトの生成を行わせない (e.g: パーティクル等)
- 古いオブジェクトを再利用する (e.g: 効果音)
- プールサイズを動的に増やす

*****

## 各オブジェクトのメモリサイズが固定される
- 最大のサイズでも収まるプールスロットが必要になってしまう
- オブジェクトのサイズによってプールを分けるべき

*****

## 再利用されるオブジェクトは自動的に初期化されない
- 利用時等に明示的に初期化する必要がある

*****

## 使用されていないオブジェクトがメモリに残る
- オブジェクトプールはオブジェクトの解放まで行われない
  - 全て使用されなくなった場合には他のオブジェクトへの参照をクリアする

*****

# オブジェクトプールの拡張
- オブジェクトとプールの結合させない
  - 仮により汎用的で再利用可能なプールを作りたい場合
  - 使用中かどうかはビットフィールドで管理する

```
template <class TObject>
class GenericPool
{
private:
  static const int POOL_SIZE = 100;

  TObject pool_[POOL_SIZE];
  bool inUse_[POOL_SIZE];
}
```

*****

# オマケ: Unityにおけるオブジェクトプール 
- [公式のチュートリアル](https://github.com/unity3d-jp-tutorials/2d-shooting-game/wiki/%E7%AC%AC01%E5%9B%9E-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%97%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0)で解説されている
- Instantiate/Destoryのコスト削減が主
GitHubを使ってWebサイトを公開する

# 概要

このエントリが対象とするのは主にWebデザイナーやフロントエンドエンジニア、ホリデープログラマーであり、GitHubを使って簡単にポートフォリオサイト等を公開する方法を紹介する。

※このエントリは次の自エントリの日本語版です。
[How to Release Your WebSite on GitHub – Medium](https://medium.com/@wifeofvillon/how-to-release-your-website-on-github-934938af9282)

## 参考

[2016年新機能! GitHubのmasterブランチをWebページとして公開する手順 - Qiita](http://qiita.com/tonkotsuboy_com/items/f98667b89228b98bc096)

## 目標

このエントリのゴールはGitHubリポジトリのmasterブランチを次のようなURLで公開することである。
`http：//{accountName}.github.io /{repositoryName}/`

## なぜgithub.ioを用いるか？

Webサイトを公開する際、**レンタルサーバー×独自ドメイン**というのが少し前までのトレンドとしてあったように思う。
ただ、Webデザイナー（あるいはフロントエンドエンジニアも）にとってレンタルサーバー（AWS含む）と独自ドメインを管理する労力や金銭負担は小さくないし、CMSを使わずポートフォリオサイトを作るだけならレンタルサーバーやAWSはオーバースペックだ。
また、github.ioで公開することによって、「GitHub使ってますよ」アピールやGitを使う練習ができることはとても有益だと思う。

## 必要なもの

- GitHubアカウント
- Gitを扱えるアプリケーション（GUIで十分）
- Webページを構築するアプリケーション

# GitHubでWebサイトを公開する5ステップ

## 1. index.htmlを作る

慣れた方法でindex.htmlを作る（画像ではAtom使用）。

![github.io.01.png](https://qiita-image-store.s3.amazonaws.com/0/95607/1b6d2b95-5c8a-05cf-1b5e-47e974b39eb1.png)

## 2. GitHubリポジトリへコミット

git-commitしてGitHubに連携する（画像ではGitHub-Desktop使用）。

![github.io.02.png](https://qiita-image-store.s3.amazonaws.com/0/95607/28c467b4-3c91-2933-89f8-1fa821b93846.png)

## 3. GitHubリポジトリの設定を変更する

GitHubリポジトリのWebページを開いて、
[Setting]>[GitHub Pages]>[Source]を「master branch」に変更する。
もちろん、リポジトリ内にdocsディレクトリを切って、そちらをdocument rootとして扱っても構わない。そのリポジトリが何を扱うかによる。

![github.io.03.png](https://qiita-image-store.s3.amazonaws.com/0/95607/e758de60-4769-09e8-d161-baa07c310166.png)
↓
![github.io.04.png](https://qiita-image-store.s3.amazonaws.com/0/95607/f14ead71-1387-de56-308e-cd45719a2eef.png)

## 4. できあがったGitHubページを確認する

ページソースを指定するとGitHubページへのリンクが表示される。

![github.io.05.png](https://qiita-image-store.s3.amazonaws.com/0/95607/70f83680-11ff-cdc1-1443-b666f87c037e.png)

## 5. 編集＆コミット

あとはブランチ切って編集してmargeしたり、masterを直接編集したりしてオリジナリティあふれるページにしていってもらえばいい。（例ではMaterializeを使ってアレンジした。）
注意点としては、masterは常に最新のものが反映されるので、ミスると即反映されること。

![github.io.06.png](https://qiita-image-store.s3.amazonaws.com/0/95607/53366725-715d-48cb-306c-c1fc6f340622.png)
↓
![github.io.07.png](https://qiita-image-store.s3.amazonaws.com/0/95607/16884541-8f4a-d298-cf9f-b60baf77d1ff.png)

アクセストークンとかAPIキーが必要なアプリを含める場合は気をつけた方がいい。
Azure Container Registryを使ってみる

#実施内容
Azure Container Registry（プレビュー版）を作成し、プライベートなコンテナレジストリとして使用する。

Azure Container Registryの詳細は下記を参照。

[Azure Container Registry](https://azure.microsoft.com/ja-jp/services/container-registry/
)
#注意事項
記事の投稿時（2017年3月14日）、Azure Container Registryはプレビュー版となっております。料金や機能等は正式版提供時に変更となっている可能性があります。
最新情報はAzureのサイトをご確認お願いいたします。
[Microsoft Azure](https://azure.microsoft.com/ja-jp/)

#動機
##何故、プライベートコンテナレジストリが欲しかったか
契約上、限られた人間のみ使えるアプリケーションをコンテナ化してチームで共有したかったのです。

##何故、Azureなのか
AWSもストレージ料金とネットワーク使用量のみのため、特に料金に差はありませんでした。既に契約をしているAzureにしました。
後、サイトの日本語が一番解り易かったです。

#手順
まずはAzureのMarketplaceで"Container Registry"で検索すると一番上に出てきます。
![WS000000_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/168941/c281bdd9-1ad3-bf66-bb67-89bb384c2b5d.jpeg)
選択すると説明文が出てくるので、それを読んで新規作成。
その後に、レジストリ名やサブスクリプション、リソースグループを入れる欄が出てくるので記入します。![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/168941/09a271fa-cc35-7b3a-cff3-2312e7515702.jpeg)
Adminユーザは初期段階では作らないことにしました。

作成ボタンを押すとデプロイが開始されるので待ちます。
今回の場合は2分も経たずに出来上がりました。

##一時的にAdminユーザを作成し、レジストリにイメージを登録してみる。
AzureのコンソールでAdmin userをEnableにすると、dockerからログインが出来るようになります。
ユーザ名はレジストリの名前になります。パスワードは自動で設定されます。
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/168941/6d367d60-186b-a734-88f7-11bb5405ab5b.jpeg)

ログインしてみます。ログイン先は*”レジストリ名-on.azurecr.io”*となります。

```bash
[user@host ~]$ sudo docker login registoryname-on.azurecr.io
Username: registoryuser
#自動発行されたパスワードを入れる。
Password:
Login Succeeded
```
ログインできました。

ためしにコンテナイメージを作成してPUSHしてみます。

```bash
[user@host ~]$ sudo docker run -i -t centos /bin/bash
#ここからコンテナ
[root@d0ed30ad7354 /]# java- verion
#省略
bash: java-: command not found
#JavaがないのでJavaを入れる。
[root@d0ed30ad7354 /]# yum install -y java
[root@d0ed30ad7354 /]# java -version
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (build 1.8.0_121-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
[root@d0ed30ad7354 /]# exit
exit
#ここからホスト
[user@host ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
d0ed30ad7354        centos              "/bin/bash"         9 minutes ago       Exited (0) About a minute ago                       admiring_nobel
[user@host ~]$ sudo docker commit d0ed30ad7354 centos-java1.8
sha256:
#Javaが入ったCentOSをPush
[user@host ~]$ sudo docker tag centos-java1.8 registoryuser-on.azurecr.io/centos-java1.8
[user@host ~]$ sudo docker push registoryuser-on.azurecr.io/centos-java1.8
The push refers to a repository [registoryuser-on.azurecr.io/centos-java1.8]
e709da995a8c: Pushed
34e7b85d83e4: Pushed
latest: digest: sha256:
91b25c808f3e size: 741
```

Azureのコンソールで確認すると、無事にレジストリにPush出来たことを確認できます。
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/168941/fc222e90-7eca-58e6-c5f2-bac3a89c7870.jpeg)


#まとめと今後

~~かなり簡単にレジストリが作成できますが、利用するユーザの制限はできませんでした。~~
~~リポジトリのURIが解ると誰でも利用できてしまうので、**本来やりたかったことが出来ません**。~~
~~正式版提供の際は是非とも改善して、AWSとの差別化を図って欲しいところです。~~

~~今後は別のサービスを考えたいと思います。~~
ごめんなさい嘘でした。Adminユーザ以外使えませんでした。
こまかいユーザ毎のアクセス制限はできませんが、ユーザ／パスワードを知る人しか利用出来なくなります。正式版の際は細かいユーザ制御も出来るようになると素晴らしくなると思います。

一か月ほど使ってみて、課金具合がどんなものか見ていきます。
AWSのリージョン・サービスごとのIPレンジ確認コマンド

## 使用ツール
- [httpie](https://github.com/jakubroztocil/httpie)
- [jq](https://stedolan.github.io/jq/)

## コマンド例
```
http -b https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[] | select(.region=="ap-northeast-1") | .ip_prefix'
```

```
http -b https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[] | select((.service=="AMAZON") and (.region=="ap-northeast-1")) | .ip_prefix'
```

```
http -b https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[] | select((.service=="EC2") and (.region=="ap-northeast-1")) | .ip_prefix'
```

```
http -b https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[] | select(.service=="CLOUDFRONT") | .ip_prefix'
```

```
http -b https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[] | select((.service=="S3") and (.region=="ap-northeast-1")) | .ip_prefix'
```

```
http -b https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[] | select((.service=="ROUTE53_HEALTHCHECKS") and (.region=="ap-northeast-1")) | .ip_prefix'
```
Ansibleでtd-agentのプラグインを管理するRole


td-agentのプラグインはtd-agent-gemで導入しますが、Ansibleにはそのモジュールがありません。

というわけでcommandモジュールで実装します。幸いtd-agent-gemはすでに導入済みのプラグインについて再度実行しても問題ないので、`changed_when: no`にしてchangedがカウントされないようにします。

また、バージョン指定・未指定でも動くようにします。

念のため、コマンドの終了コードを見てretryをかけます。

```bash:ディレクトリ構成
├── roles
│   └── td-agent_plugin
│       └── tasks
│           └── main.yml
├── site.yml
└── vars
    └── vars.yml
```

`when`でvarsが未定義の場合と`--check`時には実行されないようにします。

```yaml:roles/td-agent_plugin/tasks/main.yml
---
- name: install td-agent plugin
  command: >-
    /usr/sbin/td-agent-gem install
    {{ item.name }}
    {% if item.version is defined %}
    -v {{ item.version }}
    {% endif %}
    --no-ri --no-rdoc
  changed_when: no
  become: yes
  register: result
  until: result.rc == 0
  retries: 5
  delay: 10
  with_items: "{{ my_vars.middlewares.td_agent.configs.plugin.params }}"
  when: my_vars.middlewares.td_agent.configs.plugin is defined and not ansible_check_mode
```
```yaml:vars/vars.yml
---
my_vars:
  middlewares:
    td_agent:
      configs:
        plugin:
          params:
            - name: fluent-plugin-config-expander
            - name: fluent-plugin-secure-forward
              version: 0.3.3dev2
```
```bash:site.yml
---
- hosts: targethost
  roles:
    - role: td-agent_plugin

  vars_files:
    - ./vars/vars.yml
```
Mapserver

#概要
Mapserverの地図をgoogleマップで表示してみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/s/c/4/sc43.jpg?t=1489456339)

#成果物

http://jsdo.it/ohisama1/sc43

#サンプルコード

```
var koko = document.getElementById("map");
var maps = [];
for (var type in google.maps.MapTypeId) 
{
    maps.push(google.maps.MapTypeId[type]);
}
maps.push("mvr");
var map = new google.maps.Map(koko, {
    center: new google.maps.LatLng(38.0, 140.0),
    zoom: 11,
    mapTypeId: "mvr",
    mapTypeControlOptions: {
        mapTypeIds: maps
    }
});
map.mapTypes.set("mvr", new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
        var z = Math.pow(2, zoom);
        var llp = new google.maps.Point((coord.x * 256 + 128) / z, (coord.y * 256 + 128) / z);
        var ll = map.getProjection().fromPointToLatLng(llp);
        var lng = ll.lng();
        var lat = ll.lat();
        return "http://yumeblog.dip.jp/yb2g0.php?zoom=" + zoom + "&long=" + lng + "&lat=" + lat;
    },
    tileSize: new google.maps.Size(256, 256),
    name: "mvr",
    maxZoom: 18,
    isPng: true
}));

```
【Laravel5】Modelのリレーションは動的に変更できる

# Eloquent Modelのリレーションは動的に変更できる
まさか出来るとは思っていなかったため、せっかくなのでメモ。

## 概要
リレーションの接続先に当たるテーブルが動的に変化する状態のモデルを、自然にリレーションとして接続したい。

例：
<pre>
hoge_table
-id
-type
-type_id
-その他ユーザーデータ...

huga_table
-id
-note
-date

hage_table
-id
-note
-date
</pre>

この時、`hoge_table`を示すモデルから、`huga_table`と`hage_table`のどちらのテーブルと関連しているかを、`type`の値を`huga`または`hage`という文字列のどちらが入るかで管理。
`type_id`はその時の関連テーブルの`id`が代入されている。

## 実装
```php:Hoge.php
namespace App;

class Hoge extends Model {
   protected $table = "hoge_table";

   //従来の方式
   public function huga() {
      return $this->hasOne("App\\Huga", "id", "type_id");
   }

   public function hage() {
      return $this->hasOne("App\\Hage", "id", "type_id");
   }

   //今回の提案する方式
   public function hugaOrHage() {
      if ($this->type === "huga") {
          return $this->huga();
      } else if ($this->type === "hage") {
          return $this->hage();
      } else {
          return null;
      }
   }
}
```
```php:Huga.php
class Huga extends Model {
   protected $table = "huga_table";
}
```
```php:Hage.php
class Hage extends Model {
   protected $table = "hage_table";
}
```

このようにリレーションを実装すると、

```php
$hugaOrHageModel = Hoge::find($id)->hugaOrHage;
```

このように、どちらのリレーションが来るのか意識せずに１つのオブジェクトで呼び出すことが出来るようになる。
ただし、typeにhugaまたはhageが入っていない。つまりnullの値を返す場合は、throwが発生するので注意すること。
~~また、このように記述したリレーションhugaOrHageに対してEagerロードも出来る。~~
↑まだ未確認。確認次第追記
JSON に変換できないエラーの原因の一つにハマった


## 事象

### JAX-RS のフィルターでエラー終了しようとして

Stack Dump = org.codehaus.jackson.map.JsonMappingException: Problem introspecting bean properties: type mismatch between read and write methods (through reference chain: hoge.bar.Foo["result"])

という例外が発生した。

どうやら entity に指定した hoge.bar.Foo について問題があるらしい。
"read and write methods" は hoge.bar.Foo の result フィールドを処理中に読み書きのメソッド、つまり getter と setter を指していることが、スタックトレースの情報から、ブレークポイントを仕掛けた java.beans.PorpertyDescriptor の処理をデバッグモードで見てわかった。

結局 result というフィールドに設定したオブジェクトには、ある一つのフィールドに対して、getter が一つ、setter が二つあって、 setter のうちの一つは getter とは型が合わないものであったので、それがダメだと怒られていたという状態。

hoge.bar.Foo 内で read/write で不整合なんてないので、暫くの間迷走してしまった。

要注意
Claudia.jsで画像ダウンロードAPIを作成

## 概要

2016年11月にAPI GatewayでBinaryデータが扱えるようになりました。
[Binary Data Now Supported by API Gateway](https://aws.amazon.com/jp/about-aws/whats-new/2016/11/binary-data-now-supported-by-api-gateway/)

Claudia.jsのAPI Builderでも対応していたため、試しにClaudia.jsでS3に置いた画像ファイルをAPI経由でダウンロードできるようにしてみたいと思います。

## コード

まずAPIBuilderの設定で、どのMIME-TYPEをバイナリとして扱うかを指定する必要があります。これは`setBinaryMediaTypes`で行います。


```js
import ApiBuilder from 'claudia-api-builder'

const api = new ApiBuilder()
api.setBinaryMediaTypes(['image/jpeg', 'image/jpg', 'image/png'])
```

各APIリソースの設定では、レスポンスのオプションで`contentHandling: ''CONVERT_TO_BINARY''` を指定する必要があります。このオプションを指定することにより、APIGatewayでbase64エンコーディングされた文字列がバイナリデータに変換されます。

```
api.get('/img', requestHandler, {
  success: {
    contentHandling: 'CONVERT_TO_BINARY',
  },
})
```

リクエストハンドラーの処理は以下のようになります。

```
const requestHandler = async () => {
  const params = {
    Bucket: 'bucketName',
    Key: 'images/sample01.jpg',
  }
  const data = await this.s3.getObject(params).promise()
  const response = new api.ApiResponse(data.Body, {
    'Content-Type': data.ContentType,
  }, 200)
  return response
}
```

動的にS3データのContent-Typeをレスポンスヘッダに指定しています。動的にResponseを返す場合は`api.ApiResponse`のインスタンスを返す必要があります。

responseのbodyは、base64に変換しなくてもBufferのまま返せばClaudia.jsのAPIBuilderが自動でbase64に変換してくれます。


## 検証

この状態でデプロイし、テストしてみます。事前にS3のバケットを用意して適当な場所(`images/sample01.jpg`等)に画像ファイルを配置しておきます。

HTTPリクエストは以下のように`Accept`ヘッダを指定する必要があります。

```
curl -H "Accept: image/jpg" "https://<id>.execute-api.ap-northeast-1.amazonaws.com/latest/img"  > /tmp/image.jpg
```

ダウンロードしたファイルをビューワー等で問題なく開くことができればOKです。

## 問題

画像がダウンロードできるようになったのでWebページのHTMLの`<img>`タグのsrcに指定して利用したいところですが、問題があります。`Accept`ヘッダに複数のMIME-TYPE(`"image/*"`や、`"image/png, image/jpg"`等)を指定した場合、画像が正常にダウンロードできません。Claudia.jsの[ドキュメント](https://claudiajs.com/tutorials/binary-content.html)にも以下のように書かれていますが、`Accept`ヘッダを複数指定した場合変換がうまく動作しないようです。


> Similarly, although the documentation suggests that multiple content types can be specified in the Accept header for binary responses, it seems that this breaks the conversion. This makes the current implementation useless for browsers, which by default request complex Accept headers. This means that it’s currently not possible to use the API Gateway/AWS_PROXY integration to return images that can be just included into a web page using the img tag.

ブラウザのデフォルトの動作として、imgタグのHTTPリクエストではデフォルトでAcceptヘッダを複数指定するため、正常に画像を取得することができません。つまり、現状では`<img>`タグからは利用できないということになります。

## 終わりに

現状では`<img>`タグからは利用できませんが、こちらの問題がクリアされれば、Webページの画像APIとしてバリバリ利用できそうな気がします。

※サンプルコードはGithubに上げてます (https://github.com/gaishimo/claudiajs-image-downloader)


## 参照

- [Handling binary content with API Gateway](https://claudiajs.com/tutorials/binary-content.html)
LPからの離脱時にポップアップ表示機能を導入する

## やりたいこと

広告や他社に出稿してるページから弊社の企業ページにランディングした時、
「戻る」というアクションをした時に離脱防止をするためのポップアップを表示させたい
PC・SPでもどちらでも動いて欲しい

## 前提

jQuery を1.9 以上に上げること

## 内容

```html
<script type="text/javascript">
 $(function(){
   jQuery(document).ready(function(){
     (function(b) {
       var c = function() {
         this.initialize();
       };
       c.prototype = {
         initialize: function() {
           history.replaceState("beforeunload", null, null);
           history.pushState(null, null, null);
           b(window).on("popstate", b.proxy(this.popstate, this));
         },
         popstate: function(b) {
           if (b.originalEvent.state === "beforeunload") {
             viewBackGuide();
           }
         },
       };
       new c();
     })(jQuery);
     function viewBackGuide() {
       $('#backGuide').show();
     }
   });
 });
</script>
<div id="backGuide">
  <p>離脱防止の文言を入力する</p>
</div>
```

React とかで書いても良さげ

## 結果

|計測指数|数値|
|---|---:|
|ページへの全体流入数|3,842|
|そのページを見た人のCV数|51|
|ポップアップのクリック数|102|
|ポップアップ経由のCV数|15|

## 考察

CV数の約　1/3 がポップアップを経由している
ポップアップを表示することで、ランディングしてきたユーザーによりよい提案が出来ているのではないかと考えている
network > (IP, Port) mapper > socatを使う > sudo socat UDP4-RECVFROM:6000,fork UDP4-SENDTO:192.168.3.141:7000 / eth1指定の場合は sudo socat UDP4-RECVFROM:6000,fork,bindtodevice=eth1 UDP4-SENDTO:192.168.3.141:7000

```txt:動作環境
CentOS 6.8 (64bit)
Windows 8.1 Pro (64bit)
```

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

(IP, port)のリレー方法。


### 何をしたいか

1. OS Aから送信ポート6000でOS Bにコマンドを送信する
2. OS Bが送信コマンドのリレーをする
3. リレー先でコマンド応答処理をする
4. OS Bが応答のリレーをする
5. OS Aが応答を受ける

### 構成

- OS A 
    - Windows 8.1 Pro (64bit)
    - 送信ソフト: [UDP/IPテストツール](http://nonsoft.la.coocan.jp/Download/UdpTool/index.html) by NonSoftさん
    - 受信ソフト: 自作のUDP echo server (C++ Builder XE4で実装)
- OS B
    - CentOS 6.8 (64bit)
    - リレー: socat使用 (後述)

### 方法

socatを使う。

参考 http://mattryall.net/blog/2011/09/udp-port-forwarding-with-socat

### 実施手順

OS B上で以下を実行しておく。

```
$ sudo socat UDP4-RECVFROM:6000,fork UDP4-SENDTO:192.168.3.141:7000
```

ここで`192.168.3.141`は転送先のOS (この例ではOS Aとしている)。

以下を行う。

1. OS AにてUDP echo server を起動
   - 7000ポートで受信したものをecho backするようにしておく
2. OS AからUDP/IPテストツールにて「AAB<CR><LF>」を送信
   - リレーが行われecho serverがecho backする
   - リレーが行われecho back文字列がUDP/IPテストツールの受信として処理される

### 他に試したこと > 失敗

nc (netcat)で以下を試した。

```
$ nc -u -l 6000 | nc -u 192.168.3.141 7000
```

OS Bのポート6000に来た文字をOS Aのポート7000にリレーはできた。
問題はecho back文字列がリレーできないこと。
echo back文字列は別のポートになり、そのポート番号が分からない。
色々調べたところ、socatの方が楽だった。

### socat > 特定のNICに対する処理

複数のNICがある場合(eth0, eth1)、eth1のポート6000だけ転送するには以下のようにする。

```
$ sudo socat UDP4-RECVFROM:6000,fork,bindtodevice=eth1 UDP4-SENDTO:192.168.3.141:7000
```

参考 http://www.dest-unreach.org/socat/doc/linuxwochen2007-socat.pdf
のp27にbindtodeviceの記載があった。

manなどで見た場合,`so-bindtodevice`指定かと思ったが、それは有効ではなかった。
プログラミングPHP 4章 文字列

# 文字列定数のクォート処理
## 変数の展開
ダブルクォート、ヒアドキュメント内・・・変数は展開される
シングルクォート・・・変数は展開されない

展開する変数を{}で囲むことで、どこからどこまでが変数かを明示できる
ex)

```php:
$n = 12;
echo "You are the {$n}th person";
→You are the 12th person
```

## シングルクォートで囲まれた文字列のエスケープシーケンス
シングルクォートで囲まれた文字列内では以下の2つのエスケープシーケンスのみが使用できる。
\\ →　\
\' → '


## ヒアドキュメント
ex)

```php:
$a = <<< EndOfQuote
Sir Humphrey Davy
Abominated gravy.
He lived in the odium
Of having discovered sodium.
EndOfQuote;
echo $a;
→
Sir Humphrey Davy
Abominated gravy.
He lived in the odium
Of having discovered sodium.
```

- <<< と識別子(上記ではEndOfQuote)の間には少なくとも一つの空白文字が必要

- ヒアドキュメントの後に式が続く場合はヒアドキュメントの後に（;は、なしで）いったん改行を置いた上で式を続ける
ex)

```php:
printf(<<<Template
%s is %d years old.
Template
,"Fred", 35)
```

- ヒアドキュメント内のシングルクォート、ダブルクォート、空白文字はそのまま出力される。
- ヒアドキュメント文字列の最後に改行文字を残したい場合は、空行を余分に追加する必要あり。

## 文字列の表示
文字列の表示には以下の4通りがある
echo, print, printf, print_rとvar_dump
- echo
	- ポイント：echoは関数でないので、式の一部としては使えない ex) if(echo("テスト")){・・・}はNG
- print ex) print("テスト\n");
- printf 
	- ex) printf(%.2f',27.452); → 27.45
- print_r, var_dump デバッグ等に利用

## strlen() →　文字数を返す
ex) 
$string = 'Hello,world';
$length = strlen($string) → 12

## 文字列のお掃除
### trim,ltrim(左）,rtrim（右）
デフォルトで除去する文字は、空白(" ")、タブ("\t")、改行("\n")、キャリッジリターン("\r")、NULバイト("\0")、垂直タブ("x0B")
第2引数に除去する文字を指定することが可能
ex) trim($record, " \r\n\0\xB")→タブは除去しない

###　大文字小文字の変換 
- strtolower　大文字へ変換
- strtoupper　小文字へ変換
- ucfirst　最初の文字だけ大文字へ変換
- ucwords　単語の最初だけ大文字へ変換

## エンコードとエスケープ
### HTMLのエンコード、エスケープ
#### htmlentities() 特殊文字の変換
不等号、＆、アクセント記号、ウムラウト付き記号（Ü）　を&lt,&amp等に変換する
#### htmlspecialchars() 必要最小限の文字のみを変換。対象は以下。
- & → &amp
- " → &quot
- '→ &#039
- < → &lt
- > → &gt

#### HTMLタグの除去 strip_tags()
string strip_tags ( string $str [, string $allowable_tags = 取り除かないタグ] )

#### mataタグの抽出 get_meta_tags()
array get_meta_tags ( string $filename [, bool   $use_include_path = false ] )

### URLのエンコード、エスケープ
- rawurlencode(),rawurldecode()　リンクURL用
- urlencode(),urldecode()　クエリ文字列作成用

違いは、空白文字の扱い。raw〜関数が空白文字を%20に変換するのに対して、rawがつかない関数はプラス記号(+)に変換。→クエリ文字列やクッキーの方式。したがって、クエリ文字列を作成する場合

### SQLのエスケープ
特殊文字の前に\を追加するための関数がaddslashes() 反対がstripslashes()

## 文字列の比較
### == と ===
== キャストして比較
=== キャストせず比較

### strcmp() →　数値を文字列にキャストし、文字列として比較
★strcasecmp()は、小文字変換して比較する関数
★strnatcmp(),strnatcasecmp()は自然順（文字列中の数値は数値として比較）で比較する関数

### 文字列の類似性を調べる関数　soundex(),metaphone(),similar_text(),levenshtein() 

## 文字列の操作と検索
### substr() 文字列の一部を取り出す
string substr ( string $string , int $start [, int $length ] )

### substr_count()　文字列の中で、特定の文字列が何回登場するか調べる
int substr_count ( string $haystack , string $needle [, int $offset = 0 [, int $length ]] )

### substr_replace() 文字列の一部を置換する
mixed substr_replace ( mixed $string , mixed $replacement , mixed $start [, mixed $length ] )

### strrev() 逆順にする
### str_repeat() 繰り返す
### str_pad() ある文字列に別の文字列を継ぎ足す

## 文字列の分解
explode(),strtok(),sscanf()　→ reference参照

## 文字列の検索関数
strpos(),strrpos(),strstr(),stristr(),strchr(),strrchr(),parse_url()　→ reference参照
プログラミングPHP 3章関数

# 変数のスコープ
## グローバル変数
ex)

```php:
$a = 3;
function foo(){
	global $a; // $a = & $GLOBALS['a']でもOK
	$a += 2;
}
foo();
echo $a;
```
結果: 5

## スタティック変数
関数内でstatic変数を宣言すると、全ての呼び出し元で共有される。
スタティック変数の初期化は、関数が最初に呼び出された時に一度だけ行われる。
ex)

```php:
function counter(){
	static $count = 0;

	return $count++;
}

for($i = 0; $i <= 5; $i++){
	print counter();
}
```
結果：012345

# 関数のパラメータ
## 参照渡しのパラメータ
参照渡しを行うと、関数内から直接変数の値を操作できるようになる。
参照渡しを行うには、引数として変数を指定しなければならない。
ex)

```php:
function doubler(&$value){
	$value = $value << 1;
}

$a = 3;
doubler($a);

echo $a;
```
結果： 6

## パラメータのデフォルト値
関数のパラメータにデフォルト値を設定する事が可能。参照渡しの場合でも同様に可能。
デフォルト値はスカラー値しか取れない。

## 可変パラメータ
関数の引数の値を可変にしたい場合は、関数のパラメータの欄を空にして関数を宣言する。
以下の関数で関数に渡されたパラメータの情報を取得できる。

+ $array = func_get_args()　パラメータの配列を返す。
+ $count = func_num_args() パラメータの数を返す。
+ $value = func_get_arg(n) n番目のパラメータ値を返す。 
※上記の関数の結果は別の関数へのパラメータとして直接使う事はできない。
ex) foo(func_num_args());はNGなので、$count = func_num_args();と、変数に代入した上、foo($count); とすればOK

ex)

```php:
function countList(){
	if (func_num_args() == 0){
		return false;
	}
	else{
		$count = 0;
		for( $i=0; $i < func_num_args(); $i++ ){
			$count += func_get_arg($i);
		}

		return $count;
	}
}

echo !countList(1, 5, 9)?  "false" :  countList(1, 5, 9) ;
```
→結果： 1+5+9 = 15

## パラメータの省略
関数の呼び出し時に引数の省略が可能。指定しなかったパラメータは未処理のまま、処理は止まらず警告が発生する。

```php:
function tekesTwo($a, $b){
	if (isset($a)){
		echo "aが設定されています。a=$a \n";
	}
	if (isset($b)){
		echo "bが設定されています。b=$b \n";
	}
}

echo "引数を2つ指定します\n";
tekesTwo(1, 2);
echo "引数を1つ指定します\n";
tekesTwo(1);
```

結果

```
引数を2つ指定します
aが設定されています。a=1 
bが設定されています。b=2 
引数を1つ指定します
PHP Warning:  Missing argument 2 for tekesTwo(), called 〜.
aが設定されています。a=1 
```

## タイプヒンティング
関数を定義する時、関数のパラメータが特定のクラスである事を指定できる。
タイプヒントを指定したパラメータに指定できるのは、

+ NULL
+ 指定された型（クラスのインスタンス、配列、callableなど）

だけ。 **スカラー型(integer,string等）には対応していない。** 

## 返り値
関数の返り値は値を1つだけ返す事ができる。複数返したい場合は配列を使用する。
値の参照が返されるようにするには、関数名の前に&をつけて宣言し、関数呼び出し時にも、関数の前に&をつける。
ex)

```php:
$names = array("Fred", "Barney", "Wiliam", "Betty");

function &findone($n){
	global $names;
	return $names[$n];
}

$person = & findOne(1); // $personは$names[1]の参照
echo "$person\n"; // Barney

$person = "Barnetta"; //$names[1]の値が書きかわる
echo "$person\n"; // Barnneta
```

## 可変関数
可変関数では関数の名前を変数で指定して($$構文を使って)その値を参照する。
変数名の後ろにカッコをつけると、その値と同じ名前の関数を呼び出す事ができる。
ex)

```php:

function first(){
	echo "関数firstを呼び出しました\n";
}

function which($which)
{
	if (function_exists($which)) {
		$which();
	} else {
		echo "関数".$which."は存在しません\n";
	}
}
$which = 'first';
which($which); //first()を呼び出す

$which = 'second';
which($which); //second()は存在しない

```

## 無名関数（ラムダ関数)
その場限りの関数を無名関数にて作成できる。
無名関数からは外側のスコープの変数にアクセスできないので、useを使って変数を定義する。

ex)

```php:
$sortOption = 'random'; //ランダムにソート
//$sortOption = 'normal'; //文字数順にソート
$array = array("really long string aaaaaaaaa" , "short", "middling length");

usort($array, function($a, $b) use ($sortOption){
	if ($sortOption == 'random') {
		//ランダムにソートするため、-1,0,1を無作為に返す;
		return rand(0, 2) - 1;
	}else{
		//文字数順
		return strlen($a) - strlen($b);
	}
});

echo ("sortOptionは". $sortOption. "\n");
print_r($array); // $sort_optionniよるソート順で$arrayが表示される。
```
Javaでキーでソートされた重複のないMap


こんにちはsekitakaです。

HashMapのキーでソートしたいなと思い調べたところ、TreeMapというものがあり便利だったので紹介します。
TreeMapはHashMap同様キーの重複がないMapです。
それに加えてキーでのソートが自動で行われます。

# 使い方

```Java
TreeMap<String,String> treeMap = new TreeMap<>();
treeMap.put("2","2");
treeMap.put("b","B");
treeMap.put("1","1");
treeMap.put("a","A");
treeMap.put("1","1(2回目)");
System.out.println(treeMap); 
```

以下の結果が出力されます。

```
{1=1(2回目), 2=2, a=A, b=B}
```

期待したとおりキーでソートされ、キーの重複がなくなっています。

# カスタムソート
デフォルトのソート順はJavaの自然順序付けですが、以下のようにコンストラクタにComparatorを指定することで、独自のソートロジックを指定することも可能です。

```Java
TreeMap<String,String> treeMap = new TreeMap<>(new Comparator<String>(){
    @Override
    public int compare(String o1, String o2) {
        // [略]カスタムソートのロジック
    }
});
```

# まとめ
いかがでしたでしょうか。Javaは標準ライブラリが豊富なので探せば色々と便利なクラスが見つかるものですね。
upsert系の処理が超遅いときは

以前やった[MongoDBにCSVから大量のデータを流し込む](http://qiita.com/khirose/items/dfff73706e2fe2fd8d4b)ではINSERTのみの処理だったわけですが今回upsert(findOneAndUpdate)を大量にbulkWriteする機会がありまして作ってみたら超遅かったので自戒をこめてメモ

# filterに指定してるフィールド、インデックスはってるか？

はい、考えてみればごくごく当たり前な原因でした(´・ω・｀)
1回ごとにコレクションなめてたらそりゃね・・・
現場と自社を行き来する人用、自端末IPアドレス切替バッチ

#現場と自社を行き来する人用、自端末IPアドレス切替バッチ
現場（静的IP）と自社（DHCP）を行ったりきたりしていると、IPアドレス切替が面倒かったりします。そこでこのバッチファイルをデスクトップ上に置いておいて、一発切替！というわけです。

いちいちGUIパネル開いて設定するよりこっちのほうが早かったりするかもですね。
内容は見れば解ると思います。注意としては全部の値は無理やりでも入れておいたほうがいいので（実行時に引数が飛ぶかも）アドレス未設定の場合は0.0.0.0でも入れておいてください。

インターフェース名は事前にネットワーク設定を確認して変更願います。
windows7なら"ローカル エリア接続"ですが、windows10なら"イーサネット"です。

```bat:IPチェンジャ.bat
@echo off

rem -- set IFNAME="ローカル エリア接続"
set IFNAME="イーサネット"

set IPADDR=192.168.10.123
set MASK=255.255.252.0
set GW=0.0.0.0
set DNS1=192.168.10.11
set DNS2=192.168.10.12

echo [1] : DHCP設定にリセット！！
echo [2] : set Static IP address 
echo [3] : おわるんだぜ (´・ω・)
echo  ---
set /p NUM="どうするか選ぶがよい--->"
if "%NUM%"=="1" goto dhcp
if "%NUM%"=="2" goto ipconf
if "%NUM%"=="3" goto end

:dhcp
netsh interface ipv4 set address name=%IFNAME% dhcp
netsh interface ipv4 set dnsservers name=%IFNAME% dhcp
goto end

:ipconf
netsh interface ipv4 set address name=%IFNAME% static %IPADDR% %MASK% %GW% 1
netsh interface ipv4 set dnsservers name=%IFNAME% static %DNS1% primary validate=no
netsh interface ipv4 add dnsservers name=%IFNAME% %DNS2% index=2 validate=no
goto end

:end
DockerでWordpressを使い、UIDとディレクトリを設定する方法

# 概要
Dockerを使ってWordpress環境を構築する際に、WordpressのURLと永続化用ディレクトリのユーザーIDを設定したくて作成した設定です。私自身は、Wordpressは全くの初心者でここ最近必要に迫られてセットアップしたもので、ひょっとしたら動作に不都合があるかもしれません(起動までは確認)。

# カスタマイズイメージを作成し、起動する
## Dockerfile
wordpress:4.7-php7.1-apacheをベースに作成。

```
FROM wordpress:4.7-php7.1-apache
RUN groupmod -g 1000 www-data \
 && usermod -u 1000 www-data \
 && chown -R www-data:www-data /usr/src/wordpress
```

```
$ docker build -t mywordpress .
```

### 解説
wordpress:4.7-php7.1-apacheではディレクトリのユーザーがwww-dataになっているので、ユーザーwww-dataのUIDおよびGIDを自分が使いたいID(ここでは1000:1000)にセットしています。
また、初回起動時に/usr/src/wordpressの内容がweb公開用ディレクトリ(後述)にコピーされるため、それらのファイルのIDをセットし直しています。

## 起動方法
初期設定では、WordpressのURLは http://example.com/ のようなトップディレクトリになっていますが、 http://example.com/wp/ のようにサブディレクトリにセットアップして起動してみます。
ここではwp-mysqlがMySQLのコンテナインスタンスです(設定は標準なので省略)。

```
docker run -d --restart always --name wp-app \
  -p 8080:80 \
  --workdir /var/www/html/wp \
  --link wp-mysql \
  -v /path/to/wp:/var/www/html/wp \
  -e WORDPRESS_DB_HOST=wp-mysql \
  -e WORDPRESS_DB_USER=wordpress \
  -e WORDPRESS_DB_PASSWORD=mypasswd \
  -e WORDPRESS_DB_NAME=wordpress \
  mywordpress
```

### 解説
WORKDIRにWordpressのファイルが展開されるので、`--workdir`オプションで使いたいディレクトリを指定すればできるみたいです。`/var/www/html`がWebルートなので`/var/www/html/wp`としています。
また、`/path/to/wp`をWORKDIRにバインドして永続化しています。
Pynq-Z1でHDMI入力を2系統にできるか

Pynq-Z1で２系統のHDMI入力を実現できるかどうかを調べた．

## Pynq-Z1のHTMI入力端子
<img width="673" alt="スクリーンショット 2017-03-13 12.11.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/2448/122f8a69-e3b0-9956-e8e2-4894204f23ee.png">
[回路図](https://reference.digilentinc.com/_media/reference/programmable-logic/pynq-z1/pynq-z1_sch.pdf)より引用

HPDが入出力共に専用になっており，出力を入力として使うことはできない．

## ZyboのHDMI端子
<img width="619" alt="スクリーンショット 2017-03-13 12.13.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/2448/e01a1a16-8ce3-a6a9-c1b9-c22170d0b523.png">
[回路図](https://reference.digilentinc.com/_media/zybo:zybo_sch.pdf)より引用

HDMI_OUT_ENの制御で入力にも出力にもなる．Pynq-Z1のHTMI IN/OUTがこの構成になってればうれしかったな．

## 株式会社エム・アイ・エーのZedBoard用フルカラーDVI出力アダプタ
FPGAマガジンで何度か紹介されている[株式会社エム・アイ・エー製のZedBoard用フルカラーDVI出力アダプタ](http://www.miajapan.com/product_ZED_DVI.html)．
![株式会社エム・アイ・エー製のZedBoard用フルカラーDVI出力アダプタ](http://www.miajapan.com/images/ZedBoard01.jpg)
PMODなのでハードウェア的には使えるはず．ZyboのHDMIのように構成されていれば入力としても使えるが…
[回路図](http://www.miajapan.com/download/ZED_DVI_circuit.pdf)より引用
<img width="1092" alt="スクリーンショット 2017-03-13 13.38.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/2448/1e515666-5f25-1c02-6c1e-a527f299021b.png">
バススイッチを通してPMODに接続してある．入力としても使えそう．

Pynq-Z1のPMODに保護用の抵抗が入ってる．
<img width="480" alt="スクリーンショット 2017-03-13 13.45.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/2448/885763bb-7ad9-d436-4611-7fdbf0c0d626.png">
Zyboの[High Speed PMODに関する記述](https://reference.digilentinc.com/reference/programmable-logic/zybo/reference-manual#high-speed_pmod)からするとPynq-Z1のPMODにHDMIを（Transmitter, Receiverを使わずに）直結するなら0Ω抵抗に置き換えた方がよい．

## まとめ（2017.3.11現在）
株式会社エム・アイ・エー製のZedBoard用フルカラーDVI出力アダプタをHDMI入力に流用することはできそう．入力に限らずHDMIをPMODに接続する以上はPynq-Z1のPMODについている抵抗を付け替える必要がありそう．Source/Sinkにつなぐデバイスにも依存しそうなので，まずはハードウェアを改造することなしで試してみる．

## まとめ(2017.3.13現在)
株式会社エム・アイ・エー製のZedBoard用フルカラーDVI出力アダプタとPynq-Z1のHDMI　IN端子が物理的に干渉することが判明！
![IMG_0307.jpg](https://qiita-image-store.s3.amazonaws.com/0/2448/385981cd-2303-cb9b-ea13-a844b716c48d.jpeg)

PynqがZybo, ZedBoardに対応するのを待つか，Pynq用HDMI IN/OUTボードを作るかなやみどころ．
HDMI　IN/OUT基板を作ったらだれか使ってくれる人はいるだろうか．

## 疑問
株式会社エム・アイ・エー製のZedBoard用フルカラーDVI出力アダプタにはバススイッチのSN74CBTLV3245Aが使われてるけど5V Tolerantじゃないけどいいのかなぁ．