OmniAICreator/Qiita-1.07M huggingface dataset:
Mac OS High SierraにeclipseをHomebrewでインストールした際のメモ

## 経緯

勉強会で必要そうだったので。。

## 対象環境

* MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports) 256GB
* Mac OS High Sierra

## 前提

[Homebrew](https://brew.sh/index_ja.html)がインストールされていること

***

#### javaインストール

検索

```
$ brew cask search java
==> Exact Match
java
==> Partial Matches
charles-applejava           eclipse-javascript          java-jdk-javadoc            java8                       netbeans-java-se
eclipse-java                font-noto-sans-javanese     java6                       netbeans-java-ee            yourkit-java-profiler
```

javaインストール

```
$ brew cask install java
```

確認

```
$ java --version
java 10.0.1 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)
```

java 10がインストールされた模様

***

#### eclipseのインストール

検索

```
$ brew cask search eclipse
eclipse-cpp                        eclipse-java                       eclipse-php                        eclipse-scout
eclipse-dsl                        eclipse-javascript                 eclipse-platform                   eclipse-smarthome-designer
eclipse-ide                        eclipse-jee                        eclipse-ptp                        eclipse-testing
eclipse-installer                  eclipse-modeling                   eclipse-rcp                        nodeclipse
```

IEDインストール

```
brew cask install eclipse-ide
```

起動 ※画像はAlfredから

<img width="611" alt="スクリーンショット 2018-05-26 8.27.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/25578/6be0db26-a087-f9e8-17d7-292ba58b02e2.png">

Oxygenがインストールされた様子

<img width="452" alt="スクリーンショット 2018-05-26 8.27.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/25578/fbc3972d-14d9-e939-4dfa-94487c5fabde.png">

Workspaceの設定

<img width="704" alt="スクリーンショット 2018-05-26 8.27.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/25578/0cf43811-9f93-ed28-62d4-43d8bc884e6e.png">

確認

<img width="1136" alt="スクリーンショット 2018-05-26 8.27.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/25578/64900661-6b3f-642f-7136-d95591657658.png">

## 感想

コマンドでササッと構築できるようになってて便利。
NATに関して可能な限り分かりやすくまとめて見た。

# はじめに
現代は老若男女問わずパソコンを使用してインターネットの世界を楽しめる
時代であり、殆どの家にインターネット回線を引いている状況です。

何気なく利用している、インターネットではありますが
その裏ではNATと言う技術の恩恵を誰もが受けています。

自分のパソコン
おとうさんのパソコン
おかあさんのパソコン
おじいちゃんのワークステーション

これら全てのパソコンが同時にインターネット接続できるのもNATのおかげであり、
これが無ければ、回線の奪い合いを行う骨肉の争いにもなりかねません。
家庭の平和を守っている技術とも言えます。
※正確にはNAPT(PAT)になりますが、後述します。

#NATとはなにか？

NAT（Network Address Translation）

ねっとわーく　あどれす　とらんすれーしょん

ネットワークのアドレスを変換する技術のこと

- ネットワークアドレスとは？<BR>
パソコンやルータに設定される住所の様な物であり、ネットワークアドレスには、世界で一意な値であるグローバルIPアドレスと自由に決められるプライベートIPアドレスが存在する。

プライベートIPアドレス参考
http://www.atmarkit.co.jp/aig/06network/privateip.html

グローバルIPアドレス参考
http://www.atmarkit.co.jp/aig/06network/globalip.html


#なぜNATが必要であるのか？
プライベートIPアドレスはインターネット上に経路(ルーティング)が無い為、通信先の相手がどこへ通信を返せばいいかわかりません。
そのため、インターネットでの通信のやり取りはNATでプライベートIPアドレスをグローバルIPアドレスに変換して行う必要があります。


![nat1.png](https://qiita-image-store.s3.amazonaws.com/0/160993/51ad0cba-d8dc-afe0-3c4c-e45ecd7a14b3.png)

![nat2ー.png](https://qiita-image-store.s3.amazonaws.com/0/160993/866af6a1-9ad8-cc6a-d419-75b27b85e292.png)


直接グローバルIPアドレスをパソコンに設定する事も可能ではありますが、セキュリティ考慮が必要であったり、接続するパソコン分グローバルIPアドレスが必要になります。
一般家庭で複数グローバルIPアドレスを持つことは費用的にも現実的でない為、NAT技術を利用します。

#NATの種類
NATは大きく分けて2種類あります。

- NAT 
- NAPT(PAT)

NATは「1対1」でのアドレス変換をおこない、NAPT(PAT)は「N対1」のアドレス変換を行う技術になります。

ここからNATとNAPT(PAT)は言葉として分けて説明していきます。

#NATについて詳しく
ルータやFW配下のプライベートIPアドレスを持ったWEBサーバを、外部公開する場合などに利用する技術。

- 宛先を変換するDNAT（デスティネーションNAT）
送信先グローバルIPアドレス →　送信先プライベートIPアドレス
![nat3.png](https://qiita-image-store.s3.amazonaws.com/0/160993/73e44b03-2bb9-265b-eefb-bd41d129a235.png)


- 送信元を変換するSNAT（ソースナット）
送信元プライベートIPアドレス →　送信元グローバルIPアドレス
![nat4.png](https://qiita-image-store.s3.amazonaws.com/0/160993/743127d9-f4ab-188c-e316-1622d3c96360.png)

#NAPT(PAT)について詳しく
冒頭で説明した、家族全員が同時にインターネット接続できるようになる技術です。

NATと違う部分としては、変換するグローバルIPアドレスにポート番号を割り当てている為、複数のプライベートIPアドレスを一つのグローバルIPアドレスに変換する事が可能になります。
![nat5.png](https://qiita-image-store.s3.amazonaws.com/0/160993/274b99bb-9c07-06c6-b41b-de50042061f5.png)


変換前と変換後のIPアドレスとポート番号をrouterのNAPT変換テーブルに記録してる。

|変換前IP |変換前ポート  | 変換後IP |変換後ポート|
|---|---|---|---|
|192.168.1.1|10000|100.100.100.100|10001|
|192.168.1.2|20000|100.100.100.100|20001|


#利用したツール
cacoo
https://cacoo.com/diagrams/
Laravelでvagrant + Homestead利用中にviewエラーが出た時の対処法

Laravelをvagrant + Homesteadの環境で利用していた時、ソースをGITでブランチの切り替えをすると、今まで正常に表示されていたのに、viewファイルが「not found」となってエラーで表示されなくなりました。

例えば以下のような環境の場合

```homestead.yaml
folders:
    -
        map: 'C:\WorkSpace\hogeproject'
        to: /home/vagrant/code
```

コマンドプロンプトなどで

```
> cd C:\WorkSpace\hogeproject
> php artisan config:cache
```

と、やっても解決せず。

この場合、`vagrant ssh` で接続し、

```
$ cd /home/vagrant/code
$ php artisan config:cache
```

と、やらなければいけないようです。
ArduCopter tips


###Mapping serial port
https://docs.emlid.com/navio/common/ardupilot/installation-and-running/

Mapping between switches and serial ports (TCP or UDP can be used instead of serial ports):

-A - serial 0 (always console; default baud rate 115200)
-C - serial 1 (normally telemetry 1; default baud rate 57600)
3DR Radios are configured for 57600 by default, so the simplest way to connect over them is to run with -C option.
-D - serial 2 (normally telemetry 2; default baud rate 57600)
-B - serial 3 (normally 1st GPS; default baud rate 38400)
-E - serial 4 (normally 2st GPS; default baud rate 38400)
-F - serial 5
Additionally take a look at list of serial parameters for Mission Planner.

When using UART for telemetry please keep in mind that serial ports have default baud rates.

Reload configuration¶
If you changed something in the previous step you need to reload configuration for systemd to work properly.

###AC3.6系のパラメータ

Loiter with Breakの実装以降パラメータが変わっている。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/PqcNdVJD04E/0.jpg)](https://www.youtube.com/watch?v=PqcNdVJD04E&feature=youtu.be&fbclid=IwAR1FnM98KsAEl1R5V-wmUsHyxjpZbGixn-gtMxKn8ncdYhFGYilgRCI5qNw)  

ザックとみた感じで、これらが追加になって。
LOIT_ANG_MAX
LOIT_SPEED
LOIT_ACC_MAXLOIT_BRK_JERK
LOIT_BRK_DELAY

これらがなくなった。
WPNAV_LOIT_JERK
WPNAV_LOIT_JERK
WPNAV_LOIT_MAXA
WPNAV_LOIT_MINA
WPNAV_LOIT_SPEED
**MissionPlanner->Configuration->extended画面でこれらのパラメータはグレーアウトされる。**


これら以外にも変更になったパラメータがあるので、それらについては調査中。

##Firmware Build from source code 
###Setting up the Build Environment
http://ardupilot.org/dev/docs/building-the-code.html

###How to build firmware with make 
http://ardupilot.org/dev/docs/building-px4-with-make.html 

###How to build firmware with waf 
https://github.com/ArduPilot/ardupilot/blob/master/BUILD.md



https://github.com/ArduPilot/ardupilot/issues/5583

https://discuss.ardupilot.org/t/building-ardupilot-on-osx-with-waf/10618/3

##Pixhawk 4 Power Module (PM07) – Holybro
####Battery Monitor on ac3.6.11
BATT_VOLT_PIN  0 
BATT_CURR_PIN  1
Ubuntu 18.04LTSで、GPUマイニング

# きっかけ
IT関連の友人より、マイニングが面白いと教えもらった。
その友人にマイニングの現状を教えてもらうまでは私も懐疑的だったのだが、次の要素から面白いんじゃないかということで始めてみることにした。

1. 自作パソコンのオーバークロック的面白さ
2. GPUはAIをやる上でも結構重要だとか
3. 結果が金額で現れる

どれかといえば1の理由が大きいかな。
ミニ四駆を競わせる的な要素が面白そうに思えた。
3は全く無くはないのだが、グラボ1つだと雀の涙になる可能性大。

# 事前準備／前提

## 必要なもの
* どこでもいいのでウォレットを作っておく
* マイニングプールへの登録

## 前提
* 表題の通り、Ubuntu 18.04LTSを使う
    * 本稿では、Ubuntu 18.04LTSがインストール済みの段階から記載
* GPUはNVIDIAのグラボを一つだけ使う
* 私はモナコインでマイニングする（2018/5とうとう悪意によるブロックチェーンの改竄があったということで怪しいのだけど。。）
* マイニングプールは[VIP POOL](https://vippool.net/)
    * マイニングにウォレットのアドレスを設定するなどアカウントの説明は省く
* ウォレットは[bitFlyer](https://vippool.net/)
* マイニングプログラムは[ccminer](https://github.com/tpruvot/ccminer)

# 手順

## グラボの設定
### ドライバ
1. 左上の「アクティビティ」をクリックすると、Windowsの「コマンドを指定して実行」ようなものが出てくるのでそこで「ドライバ」と入力する
2. 「ソフトウェアとアップデート」のアイコンをクリック
3. 「追加のドライバ」タブでNVIDIAのドライバを選択する（このドライバはデフォルトで入っているらしい）
4. 設定を適用する。

### 動作の設定
1. 「アクティビティ」から「NVIDIA」で「NVIDIA X Xserver Settings」を起動する
2. 「GPU X」（Xは数字）でグラボが認識されていることを確認
3. ツリーを展開して、「PowerMizer」を選択
4. 「Preferred Mode」で「Prefer Maximum Performance」を選択

## マイニングプログラムのビルド
ここからが鬼門。
まだやってる人が少なくて情報の乏しさに苦労した。

### 必要なものをインストール
とりあえずgitから。

```
sudo apt update
sudo apt upgrade
sudo apt install git
```

次に、cudaというGPU用のコンパイラなどのインストール。
参考にさせていただいたのはこちら。
http://blog.michinari-nukazawa.com/2018/02/ubuntu1804-alphacudainstall.html

cudaはNVIDIAが作っているものでソースは公開されていない。
ドライバもそうだが、今回はとことんNVIDIAのクローズの世界になる。

これでインストールする。
https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1710&target_type=deblocal

次にgcc、g++をインストールするわけだが、大きな注意点がある。
18.04ではデフォルトでgccとg++のv6とv7が入っている。
しかし、ccminerのプログラムはv5で実装されている。
update-alternativeも使ったこともあったがどうしてもv5の方を向いてくれないので、v6とv7はアンインストールした。

```
sudo apt-get remove gcc-6
sudo apt-get remove g++-6
sudo apt-get remove gcc-7
sudo apt-get remove g++-7 
sudo apt-get install gcc-5 g++-5
sudo ln -s /usr/bin/gcc-5 /usr/bin/gcc
sudo ln -s /usr/bin/g++-5 /usr/bin/g++
sudo apt-get install libcurl4-openssl-dev libssl-dev libjansson-dev automake autotools-dev build-essential
```

### ソースの取得とビルド
任意のディレクトリで下記を実行。

```
git clone https://github.com/tpruvot/ccminer.git
cd ccminer
./autogen.sh
```

この時点で、configure.shが存在し、一部編集する必要がある。

```
        ./configure CXXFLAGS="-O3 $extracflags" --with-cuda=/usr/local/cuda --with-nvml=libnvidia-ml.so
```

↓

```
        ./configure CXXFLAGS="-O3 $extracflags" --with-cuda=/usr/local/cuda-9.2 --with-nvml=libnvidia-ml.so
```

私の環境では、cuda toolkitのインストールパスが/usr/local/cuda-9.2だった。
これは後々、参考にしたサイトを忘れたが.bashrcにも追加しておいた方が良いというようなことで、次の記述が./bashrcにも追記した。

```
CUDA=/usr/local/cuda-9.2
export PATH=$PATH:$CUDA/bin
export CPATH=$CUDA/include:$CPATH
export LD_LIBRARY_PATH=$CUDA/lib64:$LD_LIBRARY_PATH
```

以降はコマンドの続き。

```
./build.sh
./ccminer --version
```

### 実行
予めマイングプールの画面で、ワーカーの設定をしておく。
ワーカーがccminerとリンクして実行する形。

```
./cpuminer -a lyra2rev2 -o stratum+tcp://stratum1.vippool.net:8888 -u マイニングプールのアカウント.ワーカーのID -p ワーカーのパスワード
```

# 最後に
実ははじめにCPUマイナーからやってしまったり、ccminerはフォークがいくつかあるようでビルドできないソースで時間を使ったりミスリードがいくつかあった。
それを言いたくてこの内容をまとめたようなもの。
Pythonで世界地図-7（地球が自転するアニメgif動画）

アニメgifを作成するのでは無く、グラフを再描画することで地球を自転させる方法がわかりました。
ただし、specが低いPC（私のPC i3-7100,8GB）では、非常に遅いです。

Pythonで世界地図-18（地球が自転するアニメグラフ）
https://qiita.com/ty21ky/items/0c6c7b53eeaa789a89c5

#####動かした環境
Ubuntu Stdio 18.04
インテル i3-7100 8GB
で1度毎に360枚作成（pngで保存）するのに約55分かかりました。
白黒の地球だと２〜３分程度だと思います。
地図の精度を上げていくと、１日くらいかかるかも。

アニメgifを作成するのは１分以下です。

アニメgifは容量オーバーでアップできないので画像で。
白黒のアニメgifは、
https://qiita.com/ty21ky/items/1ea94c449cdd0ec1b748
にあります。
![地球自転A0200.png](https://qiita-image-store.s3.amazonaws.com/0/238800/1ac01600-e190-5a1e-99c2-e27aceaf9632.png)

```python:
#!/usr/bin/python3
# coding: UTF-8

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

lat = 35
lon = 0
i=0
while True:
    fig = plt.figure(figsize=(4,4))
    my_map = Basemap(projection='ortho', lat_0=lat, lon_0=lon,resolution='c', area_thresh=10000.0)

    my_map.shadedrelief() #標高図
    my_map.drawcoastlines()

    plt.savefig('地球自転A{:0>4}.png'.format(str(i)), transparent=True) #番号が４桁になるように数字の前に"0"で埋める
                                                     #transparent=True)#背景を透明にする
    plt.close()  #クローズしてメモリを開放する。連続して行う場合は必ず必要。

    lon -= 1 #地球が自転している方向（反時計回り）

    if i < 359: 
        i+=1
    else:
        exit() #終了
```

昨日はplt.close()を入れなかったので、メモリ使用料がどんどん大きくなり、１枚の保存時間も何倍もの時間がかかり、終いにメモリが足りません？エラーで途中で止まってしまいました。

#####アニメgifの作成
ImageMagickを使用しました。

インストール(Ubuntuの場合)

```shell-session
$ sudo apt install imagemagick
```

アニメgifの作成（例）

```shell-session
$ convert -delay 5 -loop 0 地球自転0*.png ファイル名.gif
```

画像ファイルのファイル名の番号は、0000〜0359と桁数を合わせないと変な物が出来ます。

#####地球と気象衛星「ひまわり」が自転するアニメgif
ImageMagickが悪いのか？、作成された.pngファイルが問題なのか？ImageMagickがフリーズしてしまいます。
長く放置すると、マウスカーソルも動かなくなり強制ログアウトしなくてはいけなくなりました。
ファイルの番号の100番代だけでアニメgifを作成すると、ちゃんとアニメgifができるので、.pngファイルが悪いような気がするのですが、何回作成しても固まってしまいます。
バグがある時に限って成功します。

ImageMagickで作成すると、何度やっても固まるのでgimpに手動で360枚貼り付けて、作成しました。30分以上かかったと思う。

ImageMagickは再インストールが必要か？
原因がわかりました。単なるメモリ不足でした。
大きい画像で枚数が多いと8GBでは足りず、今回のアニメgifでは16GB以上必要でした。

![ひまわり5号.gif](https://qiita-image-store.s3.amazonaws.com/0/238800/aa7545fc-f21c-0583-e140-cf2542c6928b.gif)

#####超高速インターネット衛星「きずな」
参考
http://www.jaxa.jp/projects/sat/winds/index_j.html
http://www.satnavi.jaxa.jp/basic/seminar/pdf/seminar_090611.pdf
上記資料を見てわかったこと。（基礎知識はほぼ０なので間違っているかも）
・種子島宇宙センターから直接、起動傾斜角28.5度で打ち上げることはできないので、約５度程度　南向きに打ち上げて東経210度、北緯0度の手前で第2段エンジンを始動し、長楕円軌道にのせるため加速し、起動傾斜角28.5度にするため軌道修正をする。
・東経210度、北緯0度附近で衛星を分離する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/603c2ee1-c66e-ee0d-6aec-5236726f8e07.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/2c66c602-5cb6-6d13-8892-f0a52829e6b0.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/bdcd6740-0340-a7f7-b02b-f98abb08dde5.png)


![静止衛星きずな軌道.png](https://qiita-image-store.s3.amazonaws.com/0/238800/1944660a-632e-3457-473a-51dd9b8319bc.png)
OculusGoでの処理負荷をOVRMonitorで可視化

# はじめに

OculusGoで負荷検証の可視化どうやるの？と疑問に思ってたのを試してみたやつ。
Unity->OculusGoの流れを前提にまとめます。

## 環境

* MacOS 10.13.4
* OVRMonitor 

# OVRMonitor

負荷の可視化はOVRMonitor(Oculus VR Monitor)を使って可視化できる。

* [公式ドキュメント](https://developer.oculus.com/documentation/mobilesdk/latest/concepts/mobile-remote-monitor/)
* [OVRMonitorダウンロード(MacOS)](https://developer.oculus.com/documentation/mobilesdk/latest/concepts/mobile-remote-monitor/)

<img width="1392" alt="スクリーンショット 0030-05-26 午前6.22.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/51857/fb65c03b-0d54-c22f-12c7-0d61aadb97e8.png">

<img width="1392" alt="スクリーンショット 0030-05-26 午前6.21.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/51857/fabb1b34-39ea-522d-bb75-be383b7a615c.png">
<img width="1392" alt="スクリーンショット 0030-05-26 午前6.21.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/51857/69ce6b42-516e-997e-9abc-c400f2971ff5.png">

<img width="1392" alt="スクリーンショット 0030-05-26 午前5.52.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/51857/254c7d6a-4307-1a6d-e1f9-8e1f6392da0d.png">

# 使用までの流れ

1. Android SDKをインストールしておく。
2. ADB Pathを設定する。
    * だいたいここにある-> `/Users/<username>/Library/Android/sdk/platform-tools`
<img width="598" alt="スクリーンショット 0030-05-26 午前6.05.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/51857/782148a9-6cfb-5070-423f-4bc5a5a5f7a5.png">
![スクリーンショット 0030-05-26 午前6.06.17.png](https://qiita-image-store.s3.amazonaws.com/0/51857/06cf8c49-db25-6bed-6710-6cf8455ee1bd.png)

3. OculusGoをUSB接続してUnityのアプリをBuild&Runしておく。
<img width="658" alt="スクリーンショット 0030-05-26 午前6.13.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/51857/e212a382-e989-ffa2-9347-acb8746a1234.png">

4. Enable/Disable Capture ServerでOculusGoのDeviceがIDで確認できるので、選択してOKを押す。
<img width="514" alt="スクリーンショット 0030-05-26 午前6.04.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/51857/8af063b7-c7c5-88c1-e8e7-167bc4c97586.png">
<img width="753" alt="スクリーンショット 0030-05-26 午前6.03.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/51857/d9dc49ea-68a2-d0d6-26b3-e6bc8cb1991e.png">
    * ちなみに、もう一度これを実行するとDisabled状態になってCapture対象から外れる。

5. *Start Capture*を実行し、アプリへのネットワークが確認できるので、選択してOKで実行。
<img width="1392" alt="スクリーンショット 0030-05-26 午前6.15.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/51857/7460ffd3-d7b4-52fc-9748-edb3cc9d52ad.png">
6. Captureをリアルタイムで開始する。



# オプション

## Session Settings

Session Settingsで各種Captureする項目の選択が可能。

<img width="611" alt="スクリーンショット 0030-05-26 午前6.20.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/51857/6add8f97-993d-6c36-20c3-8f2170e34a88.png">

ただ、現時点で、タブにもでているLost Framesを実行してみてみようとするとOVRMonitorがクラッシュする。。

# Tips

## Screenshots

保存場所はOculusGoの中。
`/oculus/Screenshots` 以下にアプリケーション名で保存されいている。
撮影サイズも保存場所もOculusGoのデフォルトのScreenshots撮影機能と一緒。
Android TransferなどでPC側にひっぱってくることは可能。

# 使ってみた

以下、OculusGoの負荷を眺めて感じたことをだらだらと箇条書き。

* 軽い状態でのFPSは60くらい
* Realtime ReflectionをResolution 128とかをやると一気に24fpsくらいまで落ちる。やめよう
nginxの設定ミスで起こるパス トラバーサル

# はじめに
この記事は下記リンクの日本語翻訳記事です

https://github.com/yandex/gixy/blob/master/docs/en/plugins/aliastraversal.md

翻訳が誤っている場合はコメントか[@no1zy_sec](https://twitter.com/no1zy_sec)までお知らせいただけると幸いです。


# [alias_traversal] Path traversal via misconfigured alias
[alias](https://nginx.ru/en/docs/http/ngx_http_core_module.html#alias)ディレクティブは指定されたlocationのパスのreplaceに使用されます。
例えば以下の設定:

```nginx
location /i/ {
    alias /data/w3/images/;
}
```

`/i/top.gif` のリクエストで, `/data/w3/images/top.gif` のファイルが送られます。

しかし、ディレクトリセパレーター (すなわち `/` ) でlocationが終わっていない場合:

```nginx
location /i {
    alias /data/w3/images/;
}
```

`/i../app/config.py` のリクエストで, `/data/w3/app/config.py` のファイルが送られます。

つまり、不適切な `alias` の設定は攻撃者が対象のフォルダの外に保存されているファイルの読み込みを可能にします。

# 対策
それは非常にシンプルです
1. まず、`alias`ディレクティブを全て見つける必要があります。
2. 次に、親のprefixed locationが `/` で終わることを確認してください。

## 関連リンク
[nginxの設定ミスで起こるHTTP Splitting](https://qiita.com/no1zy_sec/items/fe7c44b5a0fdd4807bbe)
[nginxの設定ミスで起こるSSRF](https://qiita.com/no1zy_sec/items/2718f4a99bb8368ac374)
[nginxの設定ミスで起こるMultiline response headers](https://qiita.com/no1zy_sec/items/da280cb5c1e154babe2a)
[nginxの設定ミスで起こるレスポンスヘッダの出力不備](https://qiita.com/no1zy_sec/items/b786abcba5d796ccc300)
[nginxの設定ミスで起こるreferer/origin検証の問題](https://qiita.com/no1zy_sec/items/93f1efe3c58102807de8)
[nginxの設定ミスで起こるHostヘッダフォージェリ](https://qiita.com/no1zy_sec/items/dfccd91cf76bf73b7754)
[nginxの設定ミスで起こるリファラの検証不備](https://qiita.com/no1zy_sec/items/9d73f4923ebef1598e7d)
Git関連で参考にするURL

完全なる自分メモ。
Gitに関して、案外本家のサイト（ https://git-scm.com ）を見ないのが自分でも不思議だが、参考にしているURLを記載する。
GitLab、backlog、GitBucketは仕事で使ったことがあるから一応記載予定。
bitbucketはGitBucketと何が違うかわからないから調べるつもりで記載予定。

# Git関連

## インストール

### Windows
https://gitforwindows.org/

### Linux
https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

#### Ubuntuで最新化
https://qiita.com/isaoshimizu/items/e0891fead893f6d87b0e

## GitをGUIで使う
GitはCLIで使う人が多くて、CLIの情報も非常に多いけど、GUIはやっぱり楽。

ということで、GUIで使う場合を記載。

### SourceTree
https://ja.atlassian.com/software/sourcetree

これが今のところでは使いやすいかなぁ。
無料で使えるものの、アトラシアンのアカウント登録が必要だったりする。

#### SourceTreeでWinMergeを使う設定
ソース比較と、コンフリクト時のマージにWinMergeを使うための設定。
https://qiita.com/kyanro@github/items/2d7279c3c0ec1b28a12c

### TortoiseGit
https://tortoisegit.org/

SVN時代はTortoise派だったので一応。
MercurialではTortoiseを使用中。

### Git for Windows
https://gitforwindows.org/

WindowsでGitをCLIで使うのにインストールするわけだが、一応、GUIのインターフェースもある。
→使いづらそうであんまり開いたことない。

## エラーのとき

### Pushができない
https://qiita.com/asuzuki2008/items/f3b1c9940c052b114c90

### いつの間にか改行コードが変わっている
https://qiita.com/yokoh9/items/1ec8099696ade0c1f36e

## よく忘れるコマンド

### プロジェクト作成でディレクトリ名指定
https://qiita.com/ko_coon/items/f7a555a1f57fa49e0ff9

### addの取消
https://qiita.com/nabezokodaikon/items/7ee4900d28d8d863978e

### tagのチェックアウト
http://d.hatena.ne.jp/kanonji/20110304/1299211488

### コミット関連でやっちゃったとき
https://qiita.com/yaotti/items/0d5364eae36ad1bb8e01

### gitのコマンド一覧の説明のあるURL
https://qiita.com/fukumone/items/73e1a9a62c5e4454263b

分かりやすくまとめてみたらしい。
https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0

# 呟き
「本家を見ない」ことに関して何となく思っているのが、次の理由。

* Bookとあって、本を意識してか文字の密度が高い。
* なんか言ってることがむずい。

文献を意識しているのか、正式なドキュメントだということなのかスッと入ってこないんだよなぁ。。。
SEが技術資料を読む時の注意点（勉強法）

自分用のメモです。

ドキュメントを読む際の注意点をまとめます。

・音読する事
-職場で実践する事は難しいため家で行いましょう。
自分の声で発音し、言葉を自分の耳で聞くことで理解が深まり記憶に定着します。
技術資料に限らず、どの分野の勉強も同じだと思いますが音読し理解を深めましょう。

・単語を正確に理解する
理解できない文書を読むことは苦痛でしかありません。わからない用語を一つ一つ調べ段階的に理解しましょう。クロームを利用している場合、わからない用語を選択し右クリック一つでgoogle先生に聞くことができます。非常に便利です。

・思い出す
-休憩中でも、あれ？さっきの資料何と書いてあったっけ？と思い返す。
何も見ないで思い出して、第三者に説明できるレベルになれば大丈夫。
思い出すという行為は脳に負荷をかけることができます。

・声に出してアウトプットする
読んだ内容を何も見ずに声に出して自分に説明してみましょう。記憶の定着しやすくなります。

・復習する
-期間：寝る前、次の日の朝、週末、一か月後
よく言われることですね

・姿勢を正しくする
-じかんがたつと猫背に。。背筋をピンっと伸ばしましょう
猫背の場合だと脳に酸素が多く送られないため早く疲労を感じるようです。
私の場合、姿勢が悪くなると頭が痛くなります。

・文を指でなぞりながら読む（黙読の場合）
-私の場合、黙読だと無意識のうちに読み飛ばしてしまっている場合が多々あります。。
「わかっているつもり」になっている時が多くあります。本当に自分自身が理解できているか

・他人に教えるつもりでソロ説明を行う。
-よく言われる事ですが、他人に教えるつもりで説明してみましょう。何も見らずに説明できるようになればOKです。言葉言うのは簡単ですが実際はなかなかむずかしいです。

・時間に対するコミットメントを高くする
-集中して読みましょう。
（自分自身の全神経をドキュメントにフォーカスして、目の瞳孔をぱっちりと開き読みましょう）

・読み上げソフトを利用する
-読み上げソフトを利用して、文章を音に変換して覚えましょう
黙読による読み飛ばし防止になります（家でしかできませんが）
私の愛用そふとはbalabolkaです。

私は姿勢が元々悪く（猫背）で長時間PCで作業していると頭が痛くなってしまっていました。ですが、背筋を伸ばすことを心掛けてから長時間作業しても頭痛が改善され集中力もアップしたように感じます。
nginxの設定ミスで起こるSSRF

# はじめに
この記事は下記リンクの日本語翻訳記事です

https://github.com/yandex/gixy/blob/master/docs/en/plugins/ssrf.md

翻訳が誤っている場合はコメントか[@no1zy_sec](https://twitter.com/no1zy_sec)までお知らせいただけると幸いです。


# [SSRF] Server Side Request Forgery
Server Side Request Forgeryはサーバーに任意のリクエストの実行を強制する攻撃です。例えばnginxの場合、`proxy_pass`ディレクティブの第2引数を攻撃者が指定できる場合に攻撃が可能になります。

# どうやって見つけるか
ここにサーバーを脆弱にする2種類のエラーがあります。

* `internal`ディレクティブの欠如。
    - これは内部リクエストにのみ使うことができることを示すために使用されます
* 安全でない内部リダイレクト


## internalディレクティブの欠如

internalディレクティブの欠如でSSRFをすることができる典型的な設定ミスです。

```nginx
location ~ /proxy/(.*)/(.*)/(.*)$ {
    proxy_pass $1://$2/$3;
}
```

攻撃者はプロキシされたアドレスを完全に制御できるため、Nginxの代わりにリクエストを送信することが可能になります。

## 安全でない内部リダイレクト
サーバー設定に internal locationがあり、そのlocationがプロキシされたサーバーのアドレスとしていずれかのリクエストデータを使用しているとします。

例:

```nginx
location ~* ^/internal-proxy/(?<proxy_proto>https?)/(?<proxy_host>.*?)/(?<proxy_path>.*)$ {
    internal;

    proxy_pass $proxy_proto://$proxy_host/$proxy_path ;
    proxy_set_header Host $proxy_host;
}
```

Nginxのドキュメントによると、内部リクエストは下記のようにあります。

> * requests redirected by the error_page, index, random_index, and try_files directives;
> * requests redirected by the “X-Accel-Redirect” response header field from an upstream server;
> * subrequests formed by the “include virtual” command of the ngx_http_ssi_module module and by the ngx_http_addition_module module directives;
> * requests changed by the rewrite directive

### 日本語訳
* `error_page`,　`index`,　`random_index`,　`try_files` によってリクエストはリダイレクトされます。
* upstreamサーバーからのレスポンスの`X-Accel-Redirect`ヘッダーフィールドによってリクエストはリダイレクトされます。
* ngx_http_addition_moduleモジュールディレクティブとngx_http_ssi_moduleモジュールの`include virtual` コマンドによって形成されたサブリクエスト
* `rewrite`ディレクティブによって変更されたリクエスト

従って、安全でない書き換えは攻撃者が内部リクエストを行い、プロキシされたサーバーのアドレスを制御することを可能にします。

誤った設定の例:

```nginx
rewrite ^/(.*)/some$ /$1/ last;

location ~* ^/internal-proxy/(?<proxy_proto>https?)/(?<proxy_host>.*?)/(?<proxy_path>.*)$ {
    internal;

    proxy_pass $proxy_proto://$proxy_host/$proxy_path ;
    proxy_set_header Host $proxy_host;
}
```

# 対策

このような設定を書くときには下記のようないくつかのルールがあります。

* プロキシ処理は`internal locations`のみを使用する。
* もし可能な場合、ユーザーデータの送信を禁止する。
* プロキシされたサーバーアドレスの保護:
    - プロキシされたホストの数が制限されている場合、それらをハードコードして、`map`で選択するか、他の方法で行うことができます。
    - ホストをプロキシに書くことができない場合、アドレスに署名する必要があります。

## 関連リンク
[nginxの設定ミスで起こるHTTP Splitting](https://qiita.com/no1zy_sec/items/fe7c44b5a0fdd4807bbe)
[nginxの設定ミスで起こるパス トラバーサル](https://qiita.com/no1zy_sec/items/e541f1c838874ff400bb)
[nginxの設定ミスで起こるMultiline response headers](https://qiita.com/no1zy_sec/items/da280cb5c1e154babe2a)
[nginxの設定ミスで起こるレスポンスヘッダの出力不備](https://qiita.com/no1zy_sec/items/b786abcba5d796ccc300)
[nginxの設定ミスで起こるreferer/origin検証の問題](https://qiita.com/no1zy_sec/items/93f1efe3c58102807de8)
[nginxの設定ミスで起こるHostヘッダフォージェリ](https://qiita.com/no1zy_sec/items/dfccd91cf76bf73b7754)
[nginxの設定ミスで起こるリファラの検証不備](https://qiita.com/no1zy_sec/items/9d73f4923ebef1598e7d)
nginxの設定ミスで起こるHTTP Splitting

# はじめに
この記事は下記リンクの日本語翻訳記事です

https://github.com/yandex/gixy/blob/master/docs/en/plugins/httpsplitting.md

翻訳が誤っている場合はコメントか[@no1zy_sec](https://twitter.com/no1zy_sec)までお知らせいただけると幸いです。

# [http_splitting] HTTP Splitting
HTTP Splitting は 不適切なバリデーションを使用する攻撃です。通常、Nginx (HTTP Request Splitting) やそのユーザー (HTTP Response Splitting) の背後にあるwebアプリケーションを対象としています。

攻撃者がNginxによって作成されたリクエストやレスポンスの中にnewline character(`\n`や`\r`)を挿入できるときに脆弱性になります。

##　どうやって見つけるか
* リクエストの作成を担当する変数がディレクティブ内で使用されています。例: `rewrite`, `add_header`, `proxy_set_header` または `proxy_pass`
* `$uri` や `$document_uri` 変数がディレクティブ内で使用されています。なぜならURLエンコードされた値をデコードした値が含まれているからです。
* 排他的な範囲から選択される変数。例: `(?P<myvar>[^.]+)`

排他的な範囲から選択された変数を含んだ設定の例:

```nginx
server {
    listen 80 default;

    location ~ /v1/((?<action>[^.]*)\.json)?$ {
        add_header X-Action $action;
        return 200 "OK";
    }
}
```

Exploitation:

```
GET /v1/see%20below%0d%0ax-crlf-header:injected.json HTTP/1.0
Host: localhost

HTTP/1.1 200 OK
Server: nginx/1.11.10
Date: Mon, 13 Mar 2017 21:21:29 GMT
Content-Type: application/octet-stream
Content-Length: 2
Connection: close
X-Action: see below
x-crlf-header:injected

OK
```

見ての通り、攻撃者が `x-crlf-header: injected` をレスポンスヘッダーに追加することができます。
これが可能な理由:

* `add_header` をエンコードまたは入力値をバリデーションしていない。
* locationを処理する前にpathの値を正規化している。
* 排他的な範囲の正規表現 `[^.]*` から `$action` の値が指定されている。
* その結果、`$action` の値は `see below\r\nx-crlf-header:injected` と等価になり、レスポンスヘッダーが追加された。

# 対策
* 安全な変数を試す。例: `$uri` の代わりに `$request_uri`
* `/some/(?<action>[^/]+` の代わりに `/some/(?<action>[^/\s]+)` を使用することによる排他的な範囲でのnew lineシンボルの使用を禁止する。
* `$uri` を検証すると良いと思います。(変数に何が入っているのかわかっている場合のみ)

## 関連リンク
[nginxの設定ミスで起こるSSRF](https://qiita.com/no1zy_sec/items/2718f4a99bb8368ac374)
[nginxの設定ミスで起こるパス トラバーサル](https://qiita.com/no1zy_sec/items/e541f1c838874ff400bb)
[nginxの設定ミスで起こるMultiline response headers](https://qiita.com/no1zy_sec/items/da280cb5c1e154babe2a)
[nginxの設定ミスで起こるレスポンスヘッダの出力不備](https://qiita.com/no1zy_sec/items/b786abcba5d796ccc300)
[nginxの設定ミスで起こるreferer/origin検証の問題](https://qiita.com/no1zy_sec/items/93f1efe3c58102807de8)
[nginxの設定ミスで起こるHostヘッダフォージェリ](https://qiita.com/no1zy_sec/items/dfccd91cf76bf73b7754)
[nginxの設定ミスで起こるリファラの検証不備](https://qiita.com/no1zy_sec/items/9d73f4923ebef1598e7d)
3種のノイズでUnity Shader Forge入門

## Pref.
Unity ShaderForgeの入門がてらノイズを作ってみました．
![54hrtefg.PNG](https://qiita-image-store.s3.amazonaws.com/0/181807/6870f7b3-5765-2cec-d972-7a28f3a024a5.png)

はい．
これだと勉強にならないのでゼロから作ってみます．

## Env.
Unity 2018.1.0f2
Unity ShaderForge 1.38

## Method
左手前から

- Random Noise
- Block Noise
- Value Noise

です．

![e4twernh.PNG](https://qiita-image-store.s3.amazonaws.com/0/181807/7159666a-c72f-fe46-0c14-a3613d27d703.png)


### Random Noise
![randomnoise.PNG](https://qiita-image-store.s3.amazonaws.com/0/181807/48ec3255-4032-75c9-744d-90917ae8081d.png)


### Block Noise
![BlockNoise.PNG](https://qiita-image-store.s3.amazonaws.com/0/181807/c6f5d16e-bf1f-04f5-a289-d616f37dadd9.png)


### Value Noise
![ValueNoise.PNG](https://qiita-image-store.s3.amazonaws.com/0/181807/a70cb656-ca4a-2db8-8b44-efd62209d600.png)

パーリンノイズやセルラーノイズもやろうとしましたが，関数定義みたいなことできないとノードの数的に辛い...
関数どうやってやれば定義できるのかな？...

## Reference
[おもちゃラボ](http://nn-hokuson.hatenablog.com/entry/2017/01/27/195659)
いつもありがとうございます．
松尾研のDeep Learning基礎講座演習コンテンツをやってみた(Chap.1,2-Numpy)

はじめまして。最近プログラミング学習を始めました。
ある程度は基本的な文法を学び終えたと思うので、以前かなり話題になっていた松尾研究室が公開している教材をやってみることにしました。(じつは過去にやろうとしてJupyterの存在を知らず断念したのはないしょ)

__Chap1__
さて、本教材のChapter１はpython文法の復習みたいなもので、まぁ言われたとおりに復習しました。
こういうのもあるんだなぁ、と思ったのは次の内包表記やzip関数

```
sample_data_list1 = [i * 2 for i in sample_data_list1　if i%2==0]
print(sample_data_list1)

for one, two in zip([1, 2, 3], [11, 12, 13]):
    print("", one, "&", two)
```
みたいな



#chap2
それで、Chap2に入るとNumpy、Scipy、Pandas、Matplotlibの基礎になりグッとデータサイエンスっぽくなってきた。
このへんは知らないことがたくさんあった。

まず前準備なんだけど

```
import numpy as np
import numpy.random as random
import scipy as sp
import pandas as pd
from pandas import Series, DataFrame
```
```
#可視化モジュール
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
%matplotlib inline
```

```
#小数第３まで表示
%precision 3
```

jupyterのライン?上にmatplotlibで表示できるのとか表示する小数の位を指定するものとか、この一連のimportまわりは便利そうです。

```
# 次元数
print("次元数:",sample_numpy_data.ndim)

# 要素数
print("要素数:",sample_numpy_data.size)

#sort
sample_numpy_data.sort()/div>
```
そしてあたりまえのように次元数も教えてくれるしソートもしてくれるnumpyちゃん。
<details><div>
```
なお、降順（大きい数字から小さい数字）にしたい場合は、sample_numpy_data[::-1].sort()のように、スライスを使ってやります。[::-1]は、-1つずつ飛ばすという意味で、-1は逆からを意味するので、逆さから数字を1つずたどっていくことになります。
```
はえーなるほど
</div></details>

#積み上げ計算
```
#積み上げ
print("Cum:",sample_numpy_data.cumsum())
# 積み上げ割合
print("Ratio:",sample_numpy_data.cumsum()/sample_numpy_data.sum())
```
cumsum()で積み上げ加算、それをsum()で割れば累積分布も出せる。

#numpyの正規分布の乱数発生
```
# 乱数の発生のためのモジュール読み込み
import numpy.random as random
__=random.randn(10)
N = 10**6
normal_sample_data = [random.random() for _ in range(N)]
```
基本はこれで、シードも設定できる。
あと

```
%%timeit
```

で実行時間表示してくれるんですね。知らなかった。

#dot積

```
# 行列の積
print(np.dot(sample_multi_array_data1,sample_multi_array_data2)) 
print(sample_multi_array_data1*sample_multi_array_data2)
```

```
#出力
[[ 42  45  48]
 [150 162 174]
 [258 279 300]]
[[  0  10  22]
 [ 36  52  70]
 [ 90 112 136]]
```

特になし

#練習問題

一応、私も解いたので載せますがきたねーですよ。

<details><summary>問題１</summary>
```
%%timeit 
int_number=np.arange(1,51)
print(np.sum(int_number))
```
</details>

<details><summary>問題2</summary>
```
import numpy.random as random
random.seed(0)
正規分布（平均0、分散1）の乱数を10個発生
norm_random_sample_data2 = random.randn(10)
print("乱数10個の配列:", norm_random_sample_data2)
print(np.min(norm_random_sample_data2))
print(np.max(norm_random_sample_data2))
print(np.sum(norm_random_sample_data2))
```
</details>

<details><summary>問題3</summary>
```
3の配列
three_data=np.ones((3,3),dtype='f')*3
print(three_data)
three_square=np.dot(three_data,three_data)
print(three_square)
```
</details>



今回はここまで
Access VBA フィールド名をExcelと同様に列挙体で表すことができる

#Excelは知る人ぞ知る
[Excel VBAの列挙体を使ってセルを指定する。](http://thom.hateblo.jp/entry/2015/02/13/222116)

```visualbasic
Enum c '列挙体名。なんでも良いが、長いとコーディングが面倒なのでColumnのcとした。
    名前 = 1
    ふりがな
    アドレス
    電話番号
    都道府県
End Enum
```

>定数値を指定しないと自動で 0 から連番が設定されます。

#ということはもしかするとAccessもフィールド名を列挙体で定義できるのか？？

#実はこれはできる

```visualbasic

Public Enum efld
ID = 0
CreationTime
LastAccessTime
directoryname
FullName
sName
BaseName
Extension
Attributes
isreadonly
Length
check
End Enum
```
ID=0の=0は本当は不要だけど明示した方が可読性があるので書いています。
Length は予約語だからか、小文字でも大文字になります。

```visualbasic
Sub test()
Dim cDB As dao.Database: Set cDB = CurrentDb
Dim tdf As TableDef: Set tdf = cDB.TableDefs("ChildVbs")
Dim fld As Field
Dim dRS As dao.Recordset
Set dRS = cDB.OpenRecordset(tdf.Name)
dRS.MoveFirst
Set fld = dRS.Fields(efld.check)
Stop
End Sub
```

#もちろん空白はダメ

```visualbasic
Public Enum
Prefecture Code
End Enum
```
のようなことはできません。
```visualbasic
Set fld = dRS.Fields(efld.check)
```
ここで列挙体を使っています。
ヒト22番染色体を Burrows-Wheeler 変換してランの分布を見る

前回はバイナリファイルの中のランの分布を見るプログラムを書いた

+ [バイナリデータ中のランの度数分布をとる](https://qiita.com/flyio/items/a0f33153230ba368b3c4)

これを使ってヒト染色体データを BWT したときのランの分布を見てみる．
ちなみに 22番染色体は https://github.com/zfy0701/Parallel-LZ77/tree/master/testData でゲット

![chr22.dna.bwt.run.png](https://qiita-image-store.s3.amazonaws.com/0/28651/b9c1784a-7ad2-66f5-3aec-1cf213bad5ca.png)

+ かなり長いランが出現している
+ べき分布らしき形状
+ これは繰り返し文字列が多い兆候．試しに DNA 文字列をシャッフルしたあとに BWT してランの分布を見てみると以下の通り

![chr22.dna.shuffle.bwt.run.png](https://qiita-image-store.s3.amazonaws.com/0/28651/df29c882-1bf5-d25a-36e4-c84ddc93c2bc.png)

BWT のコード (sais.hxx を利用)

```c++
/* bwt.cpp */

#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>

#include "sais.hxx"

using namespace std;

template <class UINT_T>
vector<UINT_T> bwt(string filename){
  vector<UINT_T> S;
  ifstream fin(filename);
  UINT_T buf;

  bool do_shuffle = true;
  //bool do_shuffle = false;

  if(!fin){
    cerr << filename << "cannot open" << endl;
    exit(-1);
  }

  // Read file
  while(!fin.eof()){
    fin.read((char*)&buf, sizeof(buf));
    S.push_back(buf);
  }
  fin.close();

  if(do_shuffle){
    mt19937 rand(0);
    shuffle(S.begin(), S.end(), rand);
  }

  vector<int32_t> SA(S.size(),0);
  vector<UINT_T> BWT(S.size(),0);

  int32_t n = S.size();
  saisxx(S.begin(), SA.begin(), n);

  for(int i=0;i<S.size();++i){
    if(SA[i]==0){
      BWT[i] = S[S.size()-1];
    } else {
      BWT[i] = S[SA[i]-1];
    }      
  }

  return BWT;
}

int main(){
  string filename = "chr22.dna";
  auto BWT = bwt<uint8_t>(filename);

  ofstream out(filename + ".shuffle.bwt");
  for(auto c : BWT){
    out.write((char*)&c, sizeof(uint8_t));
  }
}
```
UnityのOculusGo向けのライティング #OculusGoDev



OclusGo向けアプリ開発中、こんな事が起こっていました

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ふぁってなった。これ15時間待ってろってこと？<a href="https://twitter.com/hashtag/OculusGoDev?src=hash&amp;ref_src=twsrc%5Etfw">#OculusGoDev</a> <a href="https://twitter.com/hashtag/unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#unity3d</a> <a href="https://t.co/ivQgro8WSx">pic.twitter.com/ivQgro8WSx</a></p>&mdash; m0a (@abe00makoto) <a href="https://twitter.com/abe00makoto/status/999789494453727232?ref_src=twsrc%5Etfw">2018年5月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

*ベイクとは？*
明かりを事前に計算してテクスチャ化しておくものと言う理解で良さそうです。
これにすごく時間がかかっています。

困っていたところ、
[さやちゃんぐbot](https://twitter.com/songofsaya_)先生にライティングについて教えていただきました。
ありがたく知見を纏めます。

# ライティングの設定

window -> lighting -> Settings でライティングの設定画面ができるので移動してインスペクタと同じ場所においておきます

<img width="800" alt="Unity_2018_1_0f2_Personal__64bit__-_stage4_unity_-_FPS2018_-_Android__Personal___Metal_.png" src="https://qiita-image-store.s3.amazonaws.com/0/3844/e4f5e6a1-b5e6-203c-eb39-3e9978c54a71.png">

各種設定は以下の通り

<img width="474" alt="Unity_2018_1_0f2_Personal__64bit__-_stage4_unity_-_FPS2018_-_Android__Personal___Metal_.png" src="https://qiita-image-store.s3.amazonaws.com/0/3844/1d0e7521-f117-b122-32f7-278996eb8224.png">

上から順に

 - Realtime Global IlluminationはOclusGoのようなモバイルにはスペック不足なのでoffに設定
 - LightmapperはProgressiveに(2018.1以降ならデフォルト)
 - Indirect SamplesはProgressive Lightmapperが間接照明計算に使用するサンプル数を制御します。これも500から50に減らしておきます。
 - Auto Generateは毎回自動で生成はしんどいのでoffにし 手動でGenerateする。

こんな感じです。

それとレイヤーというものについても教えていただきました。
# レイヤーについて
レイヤーとはPhotoShopのレイヤーと同じようなもの。
使い方として

<img width="428" alt="UnityEditor_LayerVisibilityWindow_と_Unity_2018_1_0f2_Personal__64bit__-_stage4_unity_-_FPS2018_-_Android__Personal___Metal__と_Franz.png" src="https://qiita-image-store.s3.amazonaws.com/0/3844/4108d9ce-8bfb-8b17-a7ca-f5e87baf6876.png">

EditLayersでLayer設定画面を出しPlayerを追加します。
実際のPlayerに対応するオブジェクトにPlayer Layerを割り当てます。
<img width="566" alt="Unity_2018_1_0f2_Personal__64bit__-_stage4_unity_-_FPS2018_-_Android__Personal___Metal_.png" src="https://qiita-image-store.s3.amazonaws.com/0/3844/14252c07-9ce2-91cf-66a4-0a3ba3eb11d4.png">



そしてライトの設定で

<img width="484" alt="Light.png" src="https://qiita-image-store.s3.amazonaws.com/0/3844/fa953df0-973f-b04b-88fa-99d5138d3613.png">

ModeをBakedにして移動しないオブジェクトであるPlayerをライトの対象外から除外できます。
このようにして事前に計算できるものを増やすことでモバイルでも動作可能なライティングができていきます。

この場合はstaticに設定されているオブジェクト用のライトになります。したがってPlayer専用のライトも別途作る必要があります。
複数のライトを駆使してライティングを作っていきます。

(ライトは一つのGameObject内にまとめて管理していましたので、真似しようと思います。)

## 影の形

ライトの設定には影の設定があります。

- SoftShadows
柔らかい影の形。冬っぽい？

- HardShadows
境界のはっきりした影。夏っぽくなる。



# おまけ

skyboxの無料アセットがあるそうです。


https://assetstore.unity.com/packages/2d/textures-materials/sky/skybox-series-free-103633
Vapor 3.0 でクライアントのリモートIPアドレスを知る方法

Vapor 2 では、クライアントのリモートIPアドレスを知るには req.peerHostname を使うことができましたが、Vapor 3.0 では Request や HTTP モジュールが刷新され上記のメソッドも使えなくなっています。

## Vapor 3.0 でクライアントのリモートIPアドレスを知る方法

`req.http.remotePeer.hostname`

で取得できます。

詳細: 
https://api.vapor.codes/http/latest/HTTP/Protocols/HTTPMessage.html
Androidでファイルハッシュを計算する

# 概要

AndroidでURIからファイルのハッシュを計算する処理を実装しました。

# 方法

指定したalgorithmでuriの対象となるファイルのハッシュを計算し、Hexで返すculcFileHashメソッドを実装します。

```kotlin
fun culcFileHash(algorithm: String, uri: Uri): String {
    val inputStream = context.contentResolver.openInputStream(uri)
    val buffer = readAll(inputStream)
    val sb = StringBuilder()

    lateinit var md: MessageDigest

    try {
        md = MessageDigest.getInstance(algorithm)
    } catch (e: NoSuchAlgorithmException) {
        e.printStackTrace()
    }

    md.update(buffer)

    for (b in md.digest()) {
        val hex = String.format("%02x", b)
        sb.append(hex)
    }
    return sb.toString()
}

fun readAll(inputStream: InputStream): ByteArray {
    val bOut = ByteArrayOutputStream()
    val buffer = ByteArray(1024*1024*20) //20MB
    while (true) {
        val len = inputStream.read(buffer)
        if (len < 0) {
            break
        }
        bOut.write(buffer, 0, len)
    }
    return bOut.toByteArray()
}
```
# ポイント
URIから実際にファイルの情報を得て色々するためには一度Fileオブジェクトを得る必要があると思っている人が少なからずいる(自分がそうでした)と思いますが、バイナリデータがほしいのであれば`context.contentResolver.openInputStream(uri)`を使用することで事足ります。

# 補足

[こちら](https://5hyn3.github.io/posts/culc-filehash-on-android/)に背景などもまとめておきました。

# 参考

[Qiita - Javaで暗号化（ハッシュ）](https://qiita.com/rsuzuki/items/7e3bd8248c55dab8341d)
[java.io.InputStreamからデータを全て読み込んでbyte配列に格納する方法](http://d.hatena.ne.jp/muupan/20120304/1330834324)
[No module named 'keras.models'; 'keras' is not a package]というエラーの解決法

#No module named 'keras.models'; 'keras' is not a package
kerasをインポートできないというエラーがでた。

#解決法
自分で作成したkeras.pyというファイルを実行していた。情けない・・・
自分のスクリプトの名前はユニークな名前にしよう！（当たり前）
自分用AWS クラウドサービス活用資料集メモ AWS Elastic Beanstalk編

# AWS クラウドサービス活用資料集メモ

## サービス別資料

### コンピューティング

#### [AWS Elastic Beanstalk](https://aws.amazon.com/jp/elasticbeanstalk/)

情報元: [AWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk](http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-aws-elastic-beanstalk)

* 定番構成の構築・アプリデプロイの自動化サービス
    * 早く簡単にアプリケーションをデプロイ可能
    * インフラの準備＆運営からアプリケーションスタックの管理まで自動化
    * Auto Scalingに対応
    * Java, PHP, Ruby, Python, Node.js, .NEET, Docker, Goに対応
    * 追加料金無し
    * Webサーバ環境とワーカー環境の2種類が用意されている
* 構成
    * アプリケーション: バージョン、環境、環境設定が含まれているトップレベルの論理単位
    * バージョン: デプロイ可能なコードでS3上でバージョン管理される。また異なる環境に異なるバージョンをデプロイ可能
    * 環境: インフラ環境、ソースコードがデプロイされる
    * 環境設定: EC2インスタンスタイプ、Auto Scaling等の設定パラメータ
* eb initでアプリケーションの作成、eb createで環境作成、コードのデプロイ、eb deployでデプロイ
* In Place Deployment, Blue/Green Deployment両方対応
* デプロイ方式
    * All at once
    * Rolling
    * Rolling with additional batch
    * Immutable
    * URL swap
    * Route53による切り替え
* デプロイ対象（軽微なのか、大きい改修なのか）、デプロイに掛かる時間、既存環境への影響(ダウンタイム、一時的に利用可能な台数)等のトレードオフを考える、DNSキャッシュ
* 環境設定（インスタンスタイプ等）変更時のインスタンス置き換え方法
    * 無効: All at Onceでアップデート
    * ヘルスに基づくローリング: ヘルスチェックの結果が正常なら次のバッチをアップデート
    * Immutable: 新規インスタンスを作成して入れ替え
    * マネージドプラットフォーム更新: 自動的に最新バージョンのAMIに更新。ただし更新方式はImmutable方式
* .ebextensions: デフォルトの環境設定にはないカスタマイズが行える（DynaomoDBの作成やソフトのインストール等）
* Dockerもサポート。ECSも対応しており複数コンテナも利用可能
* 時間指定のスケーリングも可能
[GCP] Cloud Container Builderで何回git pushしてもトリガーが反応しない場合の話

Google Cloud Container BuilderでGitHubのリポジトリを参照していて
ブランチpushのトリガーでビルドをしようとした時に
何回pushしても反応しなくてハマったのでメモ

# 直接的な原因
- GitHubにwebhookが設定されないことが直接的な原因

# 解決策
- ContainerBuilderでGitHubと連携する場合、CloudSourceRepositoryにミラーリポジトリができているので `接続解除` してから`トリガー`を作り直す
	- そうすると、CloudSourceRepositoryに新しくミラーリポジトリができて、webhookがGitHubのリポジトリに設定される
	- `https://source.developers.google.com/webhook/github?id=xxx&project=xxxx` みたいなwebhookが設定されていればOK

# 発生した経緯
- 以前、ContainerBuilderをためそうとしてトリガーを作ったことがあった
	- この時点では問題があって、見送った
- その後、リポジトリを整理していて、不要なwebhookを消した
	- `この時CloudSourceRepositoryへの通知用のwebhookも消してしまった`
- GCP側はそんなこと知らないので、ひたすらwebhookで通知が来るのを待っている…
	- でも、webhookは消えているので永遠に通知はされない
- ContainerBuilderのトリガーを作り直しても、CloudSourceRepositoryにミラーリポジトリは既にあるので、作り直したりはしない
	- 故に、webhookも再設定されない

# 余談
- CloudContainerBuilder、割と速くて、ビルド用のマシンタイプも選べて良い
- 外部への通知はPub/Subを介してCloudFunctionとかで自前で実装する必要がある
	- カスタマイズが自由で良い分、面倒でもある
バイナリデータ中のランの度数分布をとる

はじめてのqiitaへの投稿．

適当なバイナリデータが与えられたときに，「ラン」の度数分布を計算したい．
ランの定義は以下の通り
たとえば 0000110000011111 という文字列を考える
このとき同じ文字が4回，2回，5回，5回と続くので度数分布 h[i] は
h[0]=0, h[1]=0, h[2]=1, h[3]=0, h[4]=1, h[5]=2 となる．

以下はバイナリデータを4バイト区切りで解釈してランの度数分布を求めるための c++ コード

```c++
/* run_count.cpp */

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

template<class UINT_T>
int run_count(string filename, int max=256){
  vector<uint32_t> hist(max,0);
  ifstream fin(filename);
  UINT_T buf, prev=max;
  uint32_t run = 0;

  if(!fin){
    cerr << filename << "cannot open" << endl;
    exit(-1);
  }

  bool first = true;
  while(!fin.eof()){
    fin.read((char*)&buf, sizeof(buf));
    if(buf!=prev){
      prev = buf;
      run++;
      if(run>=max){ run = max-1; }
      hist[run] += 1;
      run = 0;
    } else { run++; }
  }
  hist[run] += 1;

  hist[1] -= 1;  // this is to reduce the first dummy run

  for(int i=0;i<max;++i){
    cout << i << " " << hist[i] << endl;
  }
}

int main(){
  cout << "=== test.binary ===" << endl;
  run_count<uint32_t>("test.binary",64);

  cout << "=== toy.binary ===" << endl;
  run_count<uint32_t>("toy.binary",16);
}

```

適当なデータ生成プログラム

```c++
#include <random>
#include <fstream>

using namespace std;

void gen_data(uint32_t len,     // length of the data
              ostream &out      // output stream
              )
{
  uint32_t n, N=0;
  mt19937 gen(0);
  geometric_distribution<uint32_t> rand(0.3);
  int k=0;
  while(true){
    n = rand(gen);
    N += n;
    for(int i=0;i<n;++i){
      out.write((char*)&k, sizeof(uint32_t));
    }
    if(N>len) break;
    k++; k=k%2;
  }
}

void gen_data_toy(ostream &out      // output stream
                  )
{
  vector<int> x = {7,5,4};
  int k=0;

  for(auto xi : x){
    for(int i=0;i<xi;++i){
      out.write((char*)&k, sizeof(uint32_t));
    }
    k++; k=k%2;
  }
}

int main(){
  ofstream out("test.binary");
  gen_data(1000000, out);
  out.close();

  ofstream out2("toy.binary");
  gen_data_toy(out2);
}

```
Android開発でのTextViewの1行表示の実装方法について

# TextViewでの1行表示の制御

iOSではUILabelに相当するであるAndroidのTextViewの行表示なのですが、
今日おどろきましたので共有することにします。
前提はAPI通信でTextに表示する文字列を取得後にUIKitにsetTextさせてLabelやらTextViewやらに
文字を表示させる状況です。
固定文字列だったらこんな制御の話になるはずがありませんからね！

## iOSでのUILabelについて

デフォルトだとUILabelは２行以上になるけど、UILabelの高さが1行分しか表示できないサイズであれば、
文字列として表示されるのは「1行」で文字切れ部分は「xxxx...」と省略されます。

## AndroidでのTextViewについて

デフォルトだと2行以上の文字数であれば、TextViewの表示のされ方は
文字列として表示されるのは「1行」で文字切れ部分は「xxxx」と表示されていたのである。

そこでディくれクターからiOSの仕様に合わせてくれとのことだったので
プログラムで「...」を表示させるのが今回の議題であった。

## 実装方法について

```label_text.xml
<TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:singleLine="true"
        android:textColor="@drawable/RED" />

```

という風に `android:singleLine`を`true`に設定して、
`eandroid:ellipsize`を`end`と設定すれば「xxxx...」を実現できた。


## ellipsizeのオプションについて

ellipsizeのオプションについては下記の表の通りの制御となります。

| Value      |       TextViewのデフォルト値 |    動作    |
|:-----------------|------------------:|:------------------:|
| none             |              ○ |        何もしない        |
| start           |             |       ...xxxx       |
| middle             |               |        xxx...xxx       |
| end               |                 |         xxxxxx...         |


スマホアプリの開発現場だとだいたいの仕様はiOSに合わせるかAndroidに合わせるかなので、
両OSでどのように挙動が変わるのかを事前に知っておくとスマートな実装が実現できますよね。

そういう意味も込めて、今AndroidのSDKやUIについて勉強しています。

まあ、でもそろそろKotlinも触って行きたいな。
Prism入門 その5 - IEventAggregator

## はじめに

Prism入門5回目です。
今回もVMからVに通知する方法について説明します。

前回はVMからVに通知してダイアログを表示する方法のみを話しました。
予め設定されているダイアログは表示できますが、それ以外はできません。
エラー表示だけならそれで十分ですが、実際には広告や起動時のヘルプの表示など、
好きなようにVMからVを操作できるようにする必要が出てきます。

Prismでは任意の操作をVMからVに行うために、EventAggregatorという機能があります。

## EventAggregator

EventAggregatorは今までと同じように、
コンストラクタに```IEventAggregator eventAggregator```を記述することで使用できるようになります。
今までと異なり、ViewModelのクラスにだけでなくViewのクラスにも引数を記述します。

Viewには可能な限りソースコードを書かないのが望ましいですが、書かないとVMからVへの操作を行えないので、仕方がなく書きます。

EventAggregatorはVMでメッセージを送信し、Vでメッセージを受信してイベントを発生させることでVMからVの操作を実現しています。

VMではボタンをクリックするとEventAggregatorを通じてメッセージをVに通知するようにします。
メッセージを通知するには```eventAggregator.GetEvent<T>().Publish(S);```を使用します。
Tのクラスを引数Sのコンストラクタで初期化して、Tのインスタンスを送信します。

TのクラスはEventBaseを継承する必要があります。
ただ、簡単に使うだけなら予め定義されているPubSubEventを使用するのが楽です。

VMの例です。PubSubEvent<string>を「Publish!」という文字列で初期化して送信します。

### VM
```
using Prism.Events;　// IEventAggregatorはPrism.Eventsで定義されている

...

public DelegateCommand Clicked { get; private set; }

public MainPageViewModel(IEventAggregator eventAggregator)
{
    Clicked = new DelegateCommand(() => {
       eventAggregator.GetEvent<PubSubEvent<string>>().Publish("Publish!");
    });
}
```

メッセージはVで受信します。
受信する方法を定義するには```eventAggregator.GetEvent<T>().Subscribe(S);```を使用します。
Tのクラスが送信された時に受信してSのメソッドを実行します。Sのメソッドの引数にはVMの```Publish("Publish!")```で指定した引数が渡されます。
今回のサンプルでは「Publish!」という文字列が渡されます。

指定したメソッドでは渡された文字列をダイアログとして表示します。

### V
```
using Prism.Events;　// IEventAggregatorはPrism.Eventsで定義されている

...

public MainPage(IEventAggregator eventAggregator)
{
    InitializeComponent();

    eventAggregator.GetEvent<PubSubEvent<string>>().Subscribe(ShowMessage);
}

void ShowMessage(string message)
{
    DisplayAlert("Subscribe", message, "OK");
}
```

前回より記述は長くなりましたが独自に記述したソースコードでVMからVを操作できました。

ただ、この方法は危ないところがいくつかあります。

1つ目はSubscribeはイベントを弱参照で保持していることです。
GCのタイミングで処理が消えることがあります。
それを抑制するには、イベントにはインスタンスのメソッドを渡すか、
インスタンスのメンバ変数を使用したラムダ式を渡すようにします。

2つ目はイベントの送受信はどのクラスからもできることです。
現在表示されているMVとVの間のみならず、既に破棄された画面のVMとも送受信してしまうかもしれません。
必要なくなったら、UnsubscribeやDisposeでイベントが呼ばれなくしましょう。

個人的意見ですが、そもそもVMからVを操作するようなこと自体がシステムを複雑化してしまうので、
設計レベルでそのようなことが可能な限り起きないようにしたほうが無難だと思います。

EventAggregatorでは処理を受信するスレッドを指定したり、自作のクラスを受け渡すこともできます。
ちなみに、最初は分かりやすくするために説明しませんでしたが、
PublishやSubscribeはPubSubEventの機能です。そのあたりも含め、全て自作できます。

## 最後に
EventAggregatorを使用すればVMからVも操作できますし、
Mから前のページのMを操作するといったこともできます。
自由度が高い分、扱いには注意しましょう。
nexeでNode.jsのアプリをパッケージングしてみた

Node.jsのパッケージングというと[pkg](https://github.com/zeit/pkg)とか[Electron](https://github.com/electron/electron)で無理やりとかしか知らなかったのですが、
[nexe](https://github.com/nexe/nexe)というものを新しく知ったので使ってみました。

nexeだと１ファイルにまとまるので他の人に使ってもらうとかの場合に導入しやすいと思います。

# 使う前の準備

```
npm -g i nexe
```

# 単純なアプリの場合
### ソース

```javascript:index.js
console.log('hello world', process.version);
```

### パッケージングする

```
nexe index.js
```

ここで必要に応じて prebuilt node.js のダウンロードが行われる。Proxy環境の場合、環境変数 `HTTPS_PROXY=http://proxyuser:proxypass@proxyserver:port` のように指定してやれば通り抜けられる。

### 実行結果

```
hello world v8.10.0
```

v8.11.2にしたら以下のエラーが出てしまっていました。まだ対応していないとかかな？

```
Error: windows-x64-8.11.2 not available, create it using the --build flag
```

### 分かったこと、気づいたこと
1. Node.jsのバージョンはデフォルトは、node -vで取得できるものを使用する（パッケージング時にバージョン指定もできる）
1. exeの名前のデフォルトは親ディレクトリ名？（少なくともpackage.jsonからではなかった）

# 外部モジュールをrequireする場合
### ソース

```javascript:index.js
const _ = require('underscore');

console.log('hello world', process.version);
console.log(_.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]));
```

### パッケージングする

```
nexe index.js
```

### 実行結果

```
hello world v8.10.0
[ [ 'moe', 30, true ],
  [ 'larry', 40, false ],
  [ 'curly', 50, false ] ]
```

### node_modulesディレクトリを消してから実行してみる

```
hello world v8.10.0
[ [ 'moe', 30, true ],
  [ 'larry', 40, false ],
  [ 'curly', 50, false ] ]
```

依存パッケージはexeの中に埋め込まれているみたいですね

### 分かったこと、気づいたこと
1. requireの行をコメントアウトしてパッケージングしてみると、ちょうどunderscore.js本体の容量(57KB)だけexeファイルが軽くなっていたので特に圧縮とかはしていない様子（underscore-min.jsなら18KB）

# まとめ
Node.jsがそのまま入るようで、ファイルサイズは大きくなりがちですが、1ファイルの実行可能ファイルができるのは便利そうです。

参考
プラットフォームの指定などもできるようですね
http://d.hatena.ne.jp/Kazuhira/20180212/1518447476
windowsのcapsとcontrolキーを入れ替える with レジストリエディタ

# 概要
「caps lock キー」と「Control キー」を入れ替える動作についてまとめる．
新しいPCをセットアップする度にやる操作なので忘れないように個人的なメモとして作成しました．
レジストリハックするので自己責任で．

# 環境
windows 7
8,10でも同様に行えると思う．．．

# やること

* レジストリエディタでキー入力の値をハック
* 「caps lock キー」と「Control キー」を入れ替え

# 手順
1. windowsの検索メニューから「regedit」で検索をかける
1. 結果に出てくる「レジストリエディタ」を開く．
2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layoutを開く
3. 右クリックから新しいキーを登録
4. 名前を「Scancode Map」
5. キーの中身を以下の写真のように書き換える．
6. 再起動すると適用される．
![14_500x281.jpg](https://qiita-image-store.s3.amazonaws.com/0/125382/66ed40f6-d126-d79c-b16d-e33113d6f322.jpeg)

# 補足
レジストリの値を書き換えるだけなのでregファイルを読み込ませても可
その方法はリンク参照してください

# 参考
[Windows7-CapsLockをCtrlに変更する](http://capm-network.com/?tag=Windows7-CapsLock%E3%82%92Ctrl%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)
[CtrlとCapsを入れ替え！　Windowsのキー配列をカスタマイズ](http://ascii.jp/elem/000/000/927/927191/)