OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Batch AIでCNTKのサンプルプログラムを動かしてみる（その2:クラスター作成編）

# はじめに
本稿ではAzure Batch AIでCNTKサンプルジョブを実行するための手順を記載していきます。
[前回](https://qiita.com/masa_sato/items/786fe9e14e527cf6983b)まででBatch AI利用の準備は出来たので、今回は、BatchAIのクラスタ作成まで試してみます。

# Batch AIクラスタ作成
## クラスタ作成手順
### 1. リソースグループ作成
　i. Azureポータルにログインします。
　ii. [すべてのサービス]→[リソースグループ]を選択します。
　　![05_01_リソースグループ作成01.png](https://qiita-image-store.s3.amazonaws.com/0/204058/7f60ffa5-a118-4acf-edde-c09ab8166c35.png)
　iii.  [+追加]を選択してリソースグループ名を入力し、サブスクリプション、リソースグループの場所を選択して[作成]を押下します。
　　![05_01_リソースグループ作成02.png](https://qiita-image-store.s3.amazonaws.com/0/204058/4385683c-1048-162a-faa6-024ac7fed5b1.png)
　※Batch AIが利用できるリージョンは、2018年4月末時点で米国東部、米国西部2、西ヨーロッパのみのようです。
　　そのため、リソースグループの場所も、上記3リージョンのいずれかにすることをおススメします。

### 2. ストレージアカウント・ファイル共有作成
　i. Azureポータルから[すべてのサービス]→[ストレージアカウント]を選択します。　
  ![05_02_ストレージアカウント作成01.png](https://qiita-image-store.s3.amazonaws.com/0/204058/5ec0dc78-cedd-2799-ac64-4857ab4f70cd.png)
　ii. [+追加]を選択してストレージアカウント名を入力し、サブスクリプション、1.で作成したリソースグループの場所等を選択して、
　　　[作成]を押下します。
　　![05_02_ストレージアカウント作成02.png](https://qiita-image-store.s3.amazonaws.com/0/204058/6cc8f9ea-805b-5d27-670d-458990f7d920.png)
　iii. ii.で作成したストレージアカウントを選択し、[概要]→[ファイル]を選択します。
　　![05_03_ファイル共有作成01.png](https://qiita-image-store.s3.amazonaws.com/0/204058/a4e09302-33d5-0341-5680-d3d77101a6ff.png)
　iv. [+ファイル共有]を選択し、名前とクォータ(容量の上限)を入力します。
　　　※ここではサンプルコードの都合上、名前を"batchaisample"と入力します。クォータは5120GBまでの任意の値です。
　　　　サンプル実行だけなら小さくても差し支えないですが、今後同じストレージアカウントでジョブ実行をする場合は、
　　　　多少余裕を持って設定すると良いかもしれません。
　　![05_03_ファイル共有作成02.png](https://qiita-image-store.s3.amazonaws.com/0/204058/a3a53d56-e568-27af-762a-7a4c07d59ca6.png)

### 3. Batch AIクラスタ作成
 ※現在(2018年4月末時点)、日本語版ポータルでは正常にBatchAIクラスタを作成することが出来ません。
　　そのため、BatchAIクラスタ作成のみ、ポータルを英語表記に変更して実行します。
　　(現状、リージョン選択ができない状態です。MSサポートによると、一般提供までに修正する方向で対応中とのことです。)
　　・ポータル言語変更方法
　　　ポータル画面右上の設定ボタン(歯車のアイコン)を押下→[言語(更新が必要)]を[English]に変更
　　　(その下の地域設定も自動的に変更されます。)
　　<img width="439" alt="05_BatchAI_03-0_ポータル言語設定切替.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/a2c8dcd9-b657-cf45-48d4-3a72b1f3c637.png">

　i. Azureポータルから[All Services(すべてのサービス)]→[Batch AI]を選択します。
　　![05_04_BatchAI作成01.png](https://qiita-image-store.s3.amazonaws.com/0/204058/939a2be4-2afc-95fc-e1d2-09dc4a358bc3.png)
　ii. [Cluster(クラスター)]→[+Add(追加)]を選択し、クラスター名やリージョン、リソースグループ、ノード価格帯等を選択します。
　　![05_04_BatchAI作成02.png](https://qiita-image-store.s3.amazonaws.com/0/204058/32255eec-1296-565d-4500-63e5b6e36a23.png)
　iii.　クラスターの管理者IDとパスワードを入力します。
　　※現状、adminなど単純なID名称だと、クラスターが正常に作成できないケースがあるようです。
　　　失敗する場合は、"xxxadmin"等、若干ID名を変えると正常に作成できます。
　iv. 共有ファイルのマウントを選択し、2.で作成したファイル共有の情報を入力します。
　　![05_04_BatchAI作成04.png](https://qiita-image-store.s3.amazonaws.com/0/204058/3ed8b39b-501b-bc6e-4a71-4c25bc7aab8d.png)
　v. [OK]を押下すると、クラスターが作成されます。

# 次回
次回は、今回作成したBatch AIクラスターでCNTKジョブを実行してみます。
miChecker起動時のエラーを回避するには

# miChekcerとは
総務省が提供する、webアクセシビリティの評価ツール。
以下、[公式ページ](http://www.soumu.go.jp/main_sosiki/joho_tsusin/b_free/michecker.html)からの引用です。
> みんなのアクセシビリティ評価ツール：miChecker (エムアイチェッカー)Ver.2.0
「みんなのアクセシビリティ評価ツール：miChecker」（以下、「miChecker」という。）は、
JIS X 8341-3:2016（高齢者・障害者等配慮設計指針－情報通信における機器，ソフトウェア及びサービス－第3部：ウェブコンテンツ）に基づく
ウェブアクセシビリティ対応の取組を支援するために、総務省が開発し、提供するアクセシビリティ評価ツールです。
その第一の目的は検証作業の支援です。加えて、付属文書等に沿って検証作業を行うことで、関連する知識の習得が可能です。

作成したwebページが、高齢者や障がい者などに配慮された設計になっているかを検証するツールですね。
[公式ページ](http://www.soumu.go.jp/main_sosiki/joho_tsusin/b_free/michecker.html)からDLできます。

実行環境がJavaなのですが、
起動してもエラーを出してしまいました。
![miCheker_error_13.png](https://qiita-image-store.s3.amazonaws.com/0/143784/80994cf1-95b5-6f45-a8c5-661630a8f524.png)
Javaはちゃんと入れてるのに、ドウナッテルノ…

## 解消方法
公式の[miCheker導入手順書](http://www.soumu.go.jp/main_content/000413932.pdf)をよ～く見てると…
> 2.1.2 Java 実行環境の確認・導入
miChecker を利用するためには Java **32bit 版** Version７以上の実行環境が必要です。

**32bit 版** …だと…

はい、見落としです。
というわけで[Java公式ページ](https://java.com/ja/download/manual.jsp)の「Windows オフライン」から
今度こそ32bit版をダウンロードし、インストール。
再度miChecker.exeを実行すると…![michecker.png](https://qiita-image-store.s3.amazonaws.com/0/143784/862a3ceb-656a-b977-7982-3e607a14372f.png)

起動しました、よかった…
官庁系ソフトらしい実行環境の手狭さですね。Mac非対応だし。
同じエラーに悩ませれている人も少なからずいるのでは？と思い記事にしました。
PhpStormで画面分割をショートカットに登録する

# PhpStormでの画面分割
- [PhpStormで画面分割しまくる - Qiita](https://qiita.com/Vexus2/items/7bf3babb9b69204afb31)

**知識が雑魚過ぎてこれだけ見てもショートカットとかさっぱりでした。**
ので、似たような人いそうだな（傲慢）ってことでメモです。

## メニューから
![スクリーンショット 2018-05-11 14.12.43.jpg](https://qiita-image-store.s3.amazonaws.com/0/214031/cddd9001-6cbe-9622-170e-3fa59ee614bc.jpeg)

メニューの`Window > Editor Tabs`にSplit VerticallyもHorizontallyもあります。
それ以外は使いこなせる気がしないのでスルー。

初期状態ではショートカットは設定されてません。


## ショートカットから
というわけでショートカットを追加する方法。

### 探す
**メニューの`PhpStorm > Preferences...`で開く画面のKeymapの何処かにあります。**

検索窓でsplit verくらいまで入れれば見つかります。
入れてから気付きましたが、メニューバーの中身と全く同じなんですね。

![スクリーンショット 2018-05-11 14.17.48.jpg](https://qiita-image-store.s3.amazonaws.com/0/214031/2c8d7fc1-dfe1-da49-570c-33f575186a4f.jpeg)

ダブルクリックすると上の画像のようなメニューが出てくるので、`Add Keyboard Shortcut`を選択。


### 設定
![スクリーンショット 2018-05-11 14.19.40.jpg](https://qiita-image-store.s3.amazonaws.com/0/214031/e7ab1625-4c00-c95c-9d95-700485e2d82a.jpeg)

というわけで実際にショートカットを入力します。
競合するものがあったらちゃんと教えてくれます。

Splitに関係させるのは怖すぎるので、VerticallyとかHorizontallyとかかな……と思いつついろいろ試してたらCommand+Hで窓が全部隠れました。
心臓に悪いですよねこいつ。

このショートカット前々からいらねーなと思っていたので消し方調べたんですけど見つかりませんでした。

仕方ないのでControl+Shift+Hで設定しました。

**なんでわざわざ宣言してるのかというと、忘れそうだからです。**


# おまけ
Command+Hを殺そうとしていたらCommand+Qをアプリケーション単位で無効化する（というか他の変なところに変更する）方法が出てきたのでついでに設定してました。

- [Command（⌘）+Qのショートカットを無効にしてブラウザ・アプリケーションの終了を防ぐ設定方法 | FABREC](https://fabrec.jp/2017/11/06/command-q-goodbye/)
quilt メモ

## 導入

```
sudo apt install quilt -y
alias dquilt="quilt --quiltrc=${HOME}/.quiltrc-dpkg"
complete -F _longopt -o filenames dquilt
```

_longoptはcatと同じ補完関数です。

## 設定ファイルの用意

```:$HOME/.quiltrc-dpkg
d=. ; while [ ! -d $d/debian -a `readlink -e $d` != / ]; do d=$d/..; done
if [ -d $d/debian ] && [ -z $QUILT_PATCHES ]; then
    # if in Debian packaging tree with unset $QUILT_PATCHES
    QUILT_PATCHES="debian/patches"
    QUILT_PATCH_OPTS="--reject-format=unified"
    QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"
    QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
    QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33"
    if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi
fi
```

## パッチを配置するディレクトリの用意

```
mkdir debian/patches
```

## パッチファイルの登録

最初に空のパッチファイルを作成します

```
dquilt new foo.patch
```

debian/patches/seriesというファイルにパッチファイルが登録されます。

## 編集するファイルを追加する

```
dquilt add foo.bar
```

## 編集する

```
vim foo.bar
```

add->vimを同時に行う`edit`サブコマンドも存在します。

## 差分をパッチファイルに反映

```
dquilt refresh
```

debian/patches/foo.patchに差分が保存されます。

## パッチファイル（差分ファイル）にヘッダをつける

```
dquilt header -e
```

いまいち用途がわかってませんがコミットコメントみたいなものですかね？

## changelogに変更内容を残す

```:現在のバージョンに変更を追加する場合
dch -i
```

```:新たなバージョンとして変更を追加する場合
dch -v <version>-<revision>
```

debian/changelogに変更が追加されます。

## seriesファイルに書かれた順に従ってpatchを1つはずす

```
dquilt pop
```

foo.patchが外れ、編集前の状態に戻ったはずです。

## seriesファイルに書かれた順に従ってpatchを1つあてる

```
dquilt push
```

foo.patchがあたり、編集後の状態に戻ったはずです。

## 全てのパッチファイルをあてる/はずす

```
dquilt push -a
dquilt pop -a
```

## 現在までの差分を表示

```
dquilt diff
```
AWS to GCP for CloudEndure（クラウドエンジャー） 

AWSからGCPへ移行したいという話があったので、色々と調べた所、CloudEndureというのがあったのでやってみる。


##１．GCP サービスアカウントの作成
![CloudEndure011.JPG](https://qiita-image-store.s3.amazonaws.com/0/160548/86f0fb4d-b374-68a4-6b4e-3b10187bccd5.jpeg)
　サービスアカウント名 : 任意（案件名とか）
　サービスアカウントID : 任意（案件名とか）
　役割：Project -> オーナーを選択
　新しい秘密鍵の提供 : チェックする
　キータイプ：JSON

　※このJSONファイルと、プロジェクトIDは後で使う

##２．CloudEndureにログイン
![02.png](https://qiita-image-store.s3.amazonaws.com/0/160548/f7ef474a-a6c2-2530-96ec-a918f9afd563.png)

　ログインURL：https://gcp.cloudendure.com/
　　「SIGN　IN WITH GOOGLE」からGCPのアカウントを選択

##３．プロジェクトの作成と設定
　プロジェクト名 : 任意（案件名とか）
　　勝手に「GCP CREDENTIALS」の画面に飛ぶ
　
　GCPのプロジェクトIDとJSONのファイルを選択
![CloudEndure016.JPG](https://qiita-image-store.s3.amazonaws.com/0/160548/b0246c06-e0cf-29ad-d535-8a76aacba38a.jpeg)

　SAVEってするとMachinesの画面に飛ぶからTokenをコピーする
　　Tokenは次のAgentインストールで使う

##４．移行元サーバにAgentのインストール

```
wget -O ./installer_linux.py https://gcp.cloudendure.com/installer_linux.py
python ./installer_linux.py
```
　Tokenを入力
　移行するデバイスを選択
　「Installation finished successfully.」と出たら完了

　CloudEndureの画面で進捗が見れる
※この時点ではまだ移行のサーバは作られていなく、レプリケーションサーバが勝手に作成され、移行元のサーバの吸出しを行っている。



##５．ブループリントを設定する
　Continuous Data Replicationのステータスになったらそのマシンを選択
　
　Machine Type : 任意（移行元に合わせる）
　Machine Name : 任意（移行元に合わせる）
　Subnet       : 任意（Default)
　Private IP   : 任意（Create New)
　Disks        : 任意（移行元に合わせる）

　「SAVE BLUEPRINT」をクリック

##６．テスト的に作成
　LAUNCH TARGET MACHINEからTest Modeを選択　CONTINUE

##７．接続して、テストを実施する。
　STATUSが「Target Launched.」になっていたらGCPで仮想マシンが起動している。
　色々問題がないかテストする。
　
##８．正式に作成する。
　LAUNCH TARGET MACHINEからCutOverを選択　CONTINUE

##９．完了！
　LIVE MIGRATION LIFECYCLEがCutoverになってたら完了！
  AMIとか使ってのイメージ移行よりこっちのが断然楽ですね。



---
##Agentの削除方法
CloudEndureの画面の「MACHINE ACTIONS」にある[Remove Machines from This Console」でCloudEndureの管理画面から削除＆Agent削除が行われる。

ちなみに
「Delete Target Machines」を選ぶとGCP上の仮想マシンが削除（CloudEndure上では残るので移行のやり直しが出来る。
「Stop Data Replication」はレプリケーションをやり直す？想定するシチュエーションが分からないので触れないでおく。

##残ったレプリケーションサーバ
CloudEndureに登録されてるマシンは全て削除して、プロジェクトも削除したら数分後に勝手に消えました。


参考URL
https://cloud.google.com/compute/docs/tutorials/migrating-vms-compute-engine?hl=ja
AWS WAFでCross site scriptingとSQL injectionをブロックする

# はじめに
AWS WAFを使ってXSSとSQLinjection攻撃をブロックする設定してみます。

# AWS WAFの構成
|要素|説明|
|:--|:--|
|Web ACLs|Ruleを複数持つWAFの母体となるサービス。このACLをCDNに関連付けることで、WAFが有効となる。|
|Rule|Conditionを複数持つ固まり。Rule単位でACLに追加/削除を行なうため、関連の高いConditionを1つのルールにまとめておくとメンテナンスし易い。|
|Condition|実際に制御を行なう条件。Cross-site scriptiong、Geo match、IP addresses、Size constraints、SQL injection、String matchingがある。複数のFilterを持つ。|
|Filter|AWS WAFを構成する最小単位。特定の条件に対して、RequestのPartとConvertを指定してConditionに追加していく。|

# 前提事項
AWS WAFを利用するためには、アプリケーションがAWS Cloudfrontを利用している（ドメインの向き先がCloudfrontのドメインになっている）ことが前提となります。Cloudfrontの概要や設定方法は以下などを参考にしてください。
https://dev.classmethod.jp/cloud/cm-advent-calendar-2015-aws-re-entering-cloudfront/

# WAFの設定
## 1. ACLの名前を入力
※ [AWS resource to associate]は空のままにしておく。

![スクリーンショット 2018-05-11 13.20.03.png](https://qiita-image-store.s3.amazonaws.com/0/165992/5c5876ce-170b-ca94-5ed5-fe024e146439.png)

## 2. Conditionの作成
### 2.1 Cross-site scripting のCondition作成
Query String、URIに対してフィルターを設定する。

![スクリーンショット 2018-05-11 13.26.32.png](https://qiita-image-store.s3.amazonaws.com/0/165992/b9475b0e-b5d6-6c0d-1457-7fdd1fef233a.png)

### 2.2 SQL injection のCondition作成
Query String、Body に対してフィルターを設定する。

![スクリーンショット 2018-05-11 13.28.29.png](https://qiita-image-store.s3.amazonaws.com/0/165992/787daed7-f947-debc-97f2-2bf0d1d02a8b.png)

## 3. Ruleの作成
[Create Rule]からRule作成Windowを開き、Ruleの名前と2で作った2つのConditionを入力する。

![スクリーンショット 2018-05-11 13.50.45.png](https://qiita-image-store.s3.amazonaws.com/0/165992/c66a7a0d-8351-d5cc-d9e8-bc1d9349977a.png)

## 4. Ruleの適用
3.で作成したRuleがリストに追加されていることを確認し、Default Actionを選択して[Review and create]へ進む。

![スクリーンショット 2018-05-11 13.53.49.png](https://qiita-image-store.s3.amazonaws.com/0/165992/cedc758c-d0bd-86cf-9c93-4b9e274d0ff5.png)

## 5. ACLの作成
入力内容を確認し[Confirm and create]をクリックでACL作成完了。
![スクリーンショット 2018-05-11 13.58.23.png](https://qiita-image-store.s3.amazonaws.com/0/165992/8a781a10-8300-e04d-7f31-4bb7fdb932f5.png)

## 6. Cloudfrontへの適用
Cloudfrontのリストから該当するCloudfrontを選択して[General]>[Edit]から編集画面を開き、[AWS WAF Web ACL]の項目で、5.で作成したACLを選択する。

![スクリーンショット 2018-05-11 14.02.42.png](https://qiita-image-store.s3.amazonaws.com/0/165992/a7f5e2dd-2075-da1f-c1cc-4303a00dabf8.png)

## 7. 動作確認
WAFの適用が完了したので、ブラウザからXSSとSQL injectionのテストを実施。
以下のような画面が表示されればOK。

![スクリーンショット 2018-05-11 14.15.26.png](https://qiita-image-store.s3.amazonaws.com/0/165992/abbf3ed0-889d-4a24-effa-dff7b08946bc.png)
SQL備忘録　日付と時刻を合体させる方法　

忘れた頃に必要となるので備忘録。


```SQL:SQL
DECLARE @Day VARCHAR(10) = '20140801'
DECLARE @Time VARCHAR(10) = '10:10'

SELECT CONVERT(DATETIME, CONVERT(VARCHAR, @Day, 111) + ' ' + CONVERT(VARCHAR, @Time, 108))
```

Skill-Note さんより。感謝。
Ubuntu環境でkeras使ってplot_modelしようとしたらエラーになったので対処したお話

### 要点
ubuntu14.04上でkerasのplot_modelを成功させるまでの手順をまとめます
(使用しているPythonのバージョンは3.6.3)



### 状況
kerasで[モデルの可視化](URL "https://keras.io/ja/visualization/")ができるということが分かったので、さっそく自分の学習モデルを可視化すべく以下のコードを追加。


```python:
from keras.utils import plot_model
plot_model(model, to_file='model.png', show_shapes=True)
# show_shapesオプション→Trueで各層のデータのshape情報も追加される
```

#しかし

エラーが出た。

pydotを入れろ、というエラーだったので

`pip install pydot`
でインストール。

#しかs(ry
またもエラーが出た。
どうやらpydotだけでは不十分なよう。

#結局

1. graphvizというパッケージが必要
1. pydotはpythonのバージョンによっては使えない(現在は開発されていないようです 3.5系、3.6系はNGのようです)


1に関してはGraphvizというパッケージをインストール。
pipコマンドを使ってpython用のラッパーと、apt-get でパッケージ本体をインストール。
`pip install graphviz`
`sudo apt-get install graphviz`

2に関してはpydotの代替としてpydotplusをインストール。
`pip install pydotplus`

これで解決しました。
2018-05-11 documentation > 動作環境を書こう > テンプレート使用

### 症例

Windows 10 Fall Creators Updateでの設定情報を探していたら、Windows 10 Anniversary Updateの情報で時間を潰した経験がある人。

まだ経験がないWindows 10ユーザは、そのうち、そういう経験をするので大丈夫?です。

### 動作環境を書こう

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
Google Chrome バージョン: 66.0.3359.170（Official Build） （64 ビット）
```

Qiita記事に上記のような動作環境があれば、数秒目を通して「探している情報かどうか」判断できます。
閲覧者にやさしいドキュメントになります。

その閲覧者は「将来の自分」かもしれません。

### 面倒な操作の回避

記事ごとに動作環境を書くのは面倒、と思われる方。
確かに面倒です。
テンプレートもないですし。

2018年5月現在僕がしているのは、以下のツール(Q Accelerator)を使ってテンプレートにしています。
[Qiitaをより便利にするChrome拡張機能をつくりました](https://qiita.com/howdy39/items/e6136b8454099ebfef29) by @howdy39 さん

以下のようにしています。
[Q Accelerator > 新規投稿時のテンプレート > 動作環境のテンプレートとしての使用案](https://qiita.com/7of9/items/6992704790d12d542a75#_reference-38043d68a4e820b3e590)

rawgitでは更新がうまく行かないので、githackで使っています。
https://github.com/howdy39/q-accelerator/issues/180

### 単純な作業

「退屈なことはPythonにやらせよう」というようなタイトルの本があります。

退屈な(or 単純で時間がかかる)作業は適切なツールを使って効率的にするといいでしょう。
情報の精度を高めながら、他の作業に時間をまわすことができます。
(2018年5月現在、Qiita記事数ナンバー1の人が思っていることらしいです）。


### 未来へのメッセージ

@ プログラマが知るべき97のこと by Kevlin Henney

> 未来へのメッセージ by Linda Rising

> 「自分の書くコードは、全部、未来の誰かへのメッセージだと思うのよ。その誰かは、あなたの弟さんかもしれない。誰か、とても賢い人に、自分が難しい問題をどう解いたのか、丁寧に説明するつもりで書くの」

未来の我々が平穏に過ごせますように。
Pleasanterの拡張SQLと拡張スクリプトでユーザーIDと名前を取得

## レコード作成者のユーザーIDや名前を取得したい
Pleasanterの特長として、複数ユーザーで同時にデータの更新ができます。
複数ユーザーで同じサイトを使用していると「ユーザーによって動作を変えたい」「ユーザーの上司だけに閲覧権限を付与したい」といった要件が出てきました。

そのためには、ユーザーを特定する必要があるので、そのユーザーIDや名前ってどうやって取得すれば良いか調べてみました。

## 拡張SQL
拡張SQLで取得する時は、以下のように記述したファイルを、WEBサーバールート\pleasanter\App_Data\Parameters\ExtendedSqls以下に拡張子をjsonにして配置したあと、IISを再起動すれば取得できました。
ただ、このままだと取得できるだけなので、実際に利用する時はupdateやinsertで、どこかのテーブルに反映する必要がありました。

```json:Sample.json
{
    "Description": "Sample",
    "SiteIdList": [2],
    "IdList": null,
    "OnCreating": false,
    "OnCreated": true,
    "OnUpdating": false,
    "OnUpdated": false,
    "OnDeleting": false,
    "OnDeleted": false,
    "OnBulkDeleting": false,
    "OnBulkDeleted": false,
    "OnImporting": false,
    "OnImported": false,
    "CommandText": "select creator from items where ReferenceId = {{Id}}"
}
```

##拡張スクリプト
### 前提条件
拡張スクリプトを使用して、ユーザー名を取得したものを任意の項目に反映させるには、私が構築した環境では、以下のパッチがあたっていなかったので、事前に当てておく必要がありました。
https://github.com/Implem/Implem.Pleasanter/commit/6a0472233fac596fca9322a7e0f59930205d5c1d

### どうやって取得するか…
バージョンアップによって、以下のコードで取得できるようになりました。

```JavaScript:getUserId.js
var UserId = $("#UserId").val();
```
以前は、以下のような方法で取得していました。
ユーザー名を取得したい時にはいまでも有効なので、参考の為に残しておきます。

新規作成ページを開き、HTMLソースを眺めていたら、新規作成時に作成者の名前とIDが担当者欄に設定されていたので、これを取得しました。

```JavaScript:getUsername.js
var txt = $('[name=Results_Owner] option:selected').text();
var Id = $('#Results_Owner').val(); // ユーザーID

$p.set($('#Results_DescriptionA'), txt); // ユーザー名を設定
$p.set($('#Results_NumA'), Id); // ユーザーIDを設定
```

![ユーザー情報取得.png](https://qiita-image-store.s3.amazonaws.com/0/256425/95a3ac62-55d9-ac9c-9d7d-d25c4634250d.png)

拡張スクリプトを新規作成時のみに実行させるため「出力先」の「全て」の、チェックボックスのチェックを外し、「新規作成」のみにチェックを入れるようにしました。

以上で、説明Aにユーザー名、数値AにIDが入力されました。

## まとめ
分かってしまえば、どうということはないのですが、拡張SQLも拡張スクリプトも作成者のユーザーIDや名前を格納している変数が用意されていないので、以上のようにして取得する必要がありました。
RailsでRollbackしたあとにエラーメッセージを返したい

複数件の同じようなデータをインサート/アップデートしたいときに全件成功時のみ保存して`nil`を返す。
失敗時は全件ロールバックしたうえでエラーメッセージが取得したい…というケースがあった。

このやり方がわからなくて滅茶苦茶困った&PHPのときと同じ考えをしていて大変苦労した。

## 解決方法:
結論、トランザクションのblock外に変数と返り値を設定すればOK

何故かというと`ActiveRecord::Rollback`すると`transaction`ブロックを抜けてしまうから。
よって値を返したい場合はtransactionブロック外で`return`に相当する実装を行えばよい。

今回の実装ではエラーメッセージ、もしくは`nil`が返るようになっている。
実行検証はしてないので動かなかったら、すまんな。
イメージはこんな感じということで許してくれ。

```ruby
def save
  errors = []
  ActiveRecord::Base.transaction do
    [[:name => "Alice"], [:name => "Bob"], [:name => "Charlie"]].each do |row|
      person = Person.new(row)
      if !person.save
        errors << person.errors.full_messages
      end
    end
    raise ActiveRecord::Rollback if errors.present?
  end
  # ここが重要だった
  errors.presence || nil
end

```

## 勘違いしていたこと:

### PHPのように`ActiveRecord::Rollback("メッセージ")`みたいなことが出来る
実際は出来ない。Syntax Errorになる。

### `rescue ActiveRecord::Rollback`でキャッチする

`rescue`節を追加してロールバック後にエラーメッセージ返すのだろうと思っていた、PHPなどではありがちな手法なので。
ところが`def ~ rescue ~ end`をしても実際にはキャッチできなくてめちゃくちゃ困惑した。

### ロールバックしたあとに返り値を指定できる

そんなことはなかった、ロールバック後`nil`が返っていた。
↓な感じにコードを書いたら動かないかな？と薄い期待をしていた。
当たり前だがロールバックは実行されない、`return errors`は実行されるので失敗しているものは保存されず、成功しているものは保存されてしまうという最悪な状態になる。


```
ActiveRecord::Rollback
return errors
```

## まとめ

他言語の仕様での考えが強くロールバックするとトランザクションブロックを抜ける…という基礎的な部分を理解していなかった。
ロールバック実行後はメソッドを抜けてしまうものだとばかり考えていたが実際にはそうでないという言われてみればごくごく当たり前の話しに気づくことができず苦労した。

当たり前すぎるのかあまりそういう情報がなくて困ったということもあったので書いておこうと思った次第。
pythonによる.csvの読み込みから線形単回帰分析まで

今年から学部2年生の誤差解析がpythonを用いたものなるということで、事前に院生の自分が実際に流れを通ってみようということでやってみたのと、技術的アウトプットの練習ということでこの記事を書きました。参考になれば幸いです。

# .csvファイルの作成
そもそも.csvファイルとはなんなのかというと、文字（数字）とカンマだけで構成されたファイルである。こんなやつ↓（）

今回の実習では実際に測定したものをPCに打ち込むらしいのだが、macでテキストエディタを用いて作成する際は"フォーマット"から"標準テキストにする"を忘れないように。拡張子を.csvに変更できなくなってしまう。（）

# pythonによる処理
フォルダを準備してそこに準備した.csvファイルを置いてjupyterを起動します。

###必要なモジュールをimportする
```py
import pandas as pd 
import numpy as np
from sklearn import linear_model
%matplotlib inline
from matplotlib import pyplot as plt
```
###.csvを読み込んでみる
```py
pd.read_csv("tab2.csv") #今回用いたファイル名はtab2.csv
```
jupyter上だと読み込むと以下のように表示される（）

###読み込んだ.csvをデータフレーム（df）に格納する
```py
df = pd.read_csv("tab2.csv")
print(df)
x = df["n"] #ついでに各カラム（列）ごとに取り出してみる
print(x)
ya = df["測定A"]
print(ya)
yb = df["測定B"]
print(yb)
```
###データフレームを使いやすいように変形する
（本体のデータがxy対応してあればこの作業は必要ないもので、一つのキーに複数のハッシュをもつ配列かあれば、もっと上手いやり方があるかもしれません。知識不足のパワープレイです）
使いづらいので要素を取り出して使いやすいよう変形する（３列をx,yの二成分の２列へ） 
カラム名（列名）が異なると同じ列として結合できないことに注意する 1回目をdf1に、2回目をdf2に格納し、"n"を"x"に、"測定値"を"y"に変更した。

```py
df1 = df[["n","測定A"]]
print(df1)
df1_new = df1.rename(columns={'n': 'x', '測定A': 'y'})
print(df1_new)
df2 = df[["n","測定B"]]
print(df2)
df2_new = df2.rename(columns={'n': 'x', '測定B': 'y'})
print(df2_new)
```
二つのデータフレームを結合させdf3として、これを解析に用いる。

```py
df3 = pd.concat([df1_new, df2_new])
print(df3)
```
散布図として出してみる

```py
x = df3["x"]
y = df3["y"]
plt.scatter(x,y)
```

###回帰係数、切片、決定係数を求めた

```py
model = linear_model.LinearRegression()
model.fit(x[:, np.newaxis], y)　#ここで線形回帰モデルへの当てはめを実行している
print(model.coef_, model.intercept_)
a = float(model.coef_)
b = float(model.intercept_)
print("y=" + str(round(a,2)) + "x+" + str(round(b,2)))
print(model.score(x[:, np.newaxis], y))
```

散布図と回帰直線をプロットしてみる

```py
xx = np.arange(0, 10)
yy = model.predict(xx[:, np.newaxis])
plt.plot(xx, yy)
plt.scatter(x, y)
plt.xlim(0,10)
plt.ylim(0,30)
```

画像準備します。

サンプルが少なくほぼ散布図上を通る直線が引けるという結果であるが、今回はあくまで手法の流れという事と技術的アウトプットの練習という事で一時的にこのような形で投稿することをお許しください。
CentOS7でMySQLのタイムゾーンを変更する

調べても出てこなかったので、備忘録的に残しておきます。

# やりたいこと

CentOS 7.2 にインストールされたMySQLのタイムゾーンをJSTからUTCにしたい。

# 調べたら出てくる解決方法

```my.cnf
$ cat /etc/my.cnf 
[mysqld_safe]
timezone = UTC
```

`my.cnf`が上記の状態でMySQLを再起動するが、変化なし。

# はじめは原因が全くわからなかった

記述場所の問題やConfが上書きされている可能性を考えたが、全てクリア。

MySQLのタイムゾーン情報を取り込んでるし、

`SET GLOBAL timezone=UTC`

を実行すると変更されるので、起動時に設定が正しく反映されていないのはわかったんですが。

# 原因

調べてる過程で、`mysqld_safe`にオプション渡して起動してみようと思ったら、`mysqld_safe`がなかった。

なんでやねん、と思ってたらこんな情報を発見した。

https://teratail.com/questions/53026

記事内抜粋：
CentOS 7では`systemd`で管理されているため、`mysqld_safe`が使用できないようです。

これか・・・。

# 対応

というわけで、`my.cnf`で設定の記述場所を以下に変更。

```my.cnf
$ cat /etc/my.cnf 
[mysqld]
timezone = UTC
```

`mysqld_safe`のオプションは`mysqld`に渡されているので、`mysqld`の設定に記述してしまえばよいのでは、的な発想。


```
mysql> show variables like '%time_zone%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| system_time_zone | JST   |
| time_zone        | UTC   |
+------------------+-------+
2 rows in set (0.00 sec)
```

いけたっぽい。

**正しいのかは知らんけど。**
Thorntail (旧WildFly Swarm) の DevTools で ホットリロードやってみた

# 概要

## Thorntail について

今後、 WildFly Swarm は Thorntail と名前を変え、WildFly にとらわれない成長を志すとのことです。

## 動機

これまで、 WildFly Swarm アプリの開発ではホットリロードが扱えず開発に苦労していた。
WildFly Swarm は UberJar (実行可能JAR) を作成し、 `java -jar` コマンドで実行する他がなかった。
WildFly Swawrm の UberJAR はおよそ数十メガバイト〜100メガを超えることもざらにあり、開発においてパッケージする度に時間を要していた。
Thorntail に変わるにつき、 Developer Tool が提供されるようになり、ホットリロードできるようになりました。(アプリケーションサーバは起動させたまま、アプリケーション全てをパッケージしたりデプロイし直したりすることがなく、変更のあったクラスだけをリロードする仕組み)

今回はその機能を試してみたので、サンプルコードと共に実行手順を以下に書いておきます。

※SpringBootでは既にその仕組があったっぽいです。


# 手順

## 準備

この記事を書いた時点では、Thorntail はまだ SNAPSHOT版しかなく、Maven Centralにはリリースされていなかったため、ThorntailのSNAPSHOT版のライブラリやプラグインの依存性解決ができるように、`$HOME/.m2/settings.xml` に Snapshotリポジトリとして `https://oss.sonatype.org/content/repositories/snapshots` を追加してください。

```xml:$HOME/.m2/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <profile>
      <id>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <snapshots />
          <id>ossrh</id>
          <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <snapshots />
          <id>ossrh</id>
          <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
```

GitHub に私が作ったサンプルコードを公開しています。
https://github.com/sightseeker/thorntail-demo

プロジェクトをイチから作る手順は割愛します。

```bash:サンプルコードのチェックアウト
git clone git@github.com:sightseeker/thorntail-demo.git && cd thorntail-demo
```

ソースには JAX-RS (REST API) 一つだけが書いてあります。

```
├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── sightseekerstudio
        │           ├── MyApplication.java
        │           └── MyResource.java
        └── resources
            └── META-INF
                ├── application.properties
                └── beans.xml
```

以下の手順では、ターミナルウィンドウは2枚使います。(Thorntail実行用(A) と コンパイルプロセス用(B))

## Thorntailを開発モードで起動

```bash:ターミナルA
# アプリの初期ビルド
mvn package

# 開発モードをリロードにして、Thorntailを起動
THORNTAIL_DEV_MODE=reload
./target/thorntail-demo-1.0-SNAPSHOT-bin/bin/run.sh

# 標準出力にサーバのログが出ます
```

## アプリ (JAX-RSリソース) にアクセスできることを確認

ブラウザ等で http://localhost:8080 にアクセスして、`Hello World` と表示されることを確認。

## 変更を検知してコンパイルさせるプロセスを常駐させる

Fizzed Watcher Maven Plugin というのおを使って、変更検知で compile が動くように pom.xml に設定してます。
以下のコマンドでファイルの変更検知で compile が動きます。

```bash:ターミナルB
mvn fizzed-watcher:run
```

## JAX-RSリソースのクラスを変更してみる

このタイミングで、エディタ等で、`src/main/java/com/sightseekerstudio/MyResource.java` の Hello World の文字列を変更してみる。

すると、ターミナルBでコンパイルが実行され、その後に、ターミナルAでコンパイルで変更の入った　`MyResource`のクラスがリロードされます。

再度、 http://localhost:8080 にアクセスし、変更した文字列が表示されることが確認できます。
ログから処理時間を出力するスクリプトを書いてみた

# 実現したいこと
下記のようなログから処理にかかった時間（ミリ秒）を計測してファイルに出力する。

```
ログ（記録日 記録時刻 ホスト名 スレッドID レベル カテゴリ メッセージ）
2018/05/02 13:05:42.446 host01 [1] INFO  Category Start_Job
2018/05/02 13:05:42.537 host01 [1] INFO  Category End_Job

出力結果（ジョブ開始時刻 メッセージ1, ジョブ終了時刻 メッセージ1, かかった時間
08:57:00.323 Start_Job,08:57:00.745 End_Job,422
```

#背景
開発している製品で現場から障害報告とともにログが送られてきた。内容を見てみると、ある処理で非常に時間がかかっていることが分かった。
間欠的に発生しているようだが、発生個所をいちいち目視で確認するのはたいへんなので自動的に調べるようにしたいと思った。

プラットフォームはWindowsなのでPowerShellが第一候補だったが、Creators Updateでbashがサポートされたという情報を聞いていたので、勉強を兼ねてbashで書いてみようと思った。

#環境
* OS：Windows 10
* Unix動作環境：CygWin  
※WSL は環境構築が面倒くさそうだったのでCygWinを使うことにした。いずれは試してみたい。

#スクリプト
bash初心者なので、非常にしょぼい内容になっているがご容赦ください。
一時ファイル作成で列区切をスペースにすれば、もっと簡潔なプログラムにできた気がする。
また、grepする文字列も引数で渡せるようにすればよかった。

```shell

#!/bin/bash

## ##を二つ並べたコメントは学習用のコメント(for me)
## 最初の行は bashを使うと宣言

# usage 関数
## ${0}はコマンド引数の0番目になる。eg. ./detect_proc_time.sh
## basename でファイル名だけ取り出している。detect_proc_time.sh
function usage {
  cat <<EOF
$(basename ${0}) is a tool for detecting processing time.

Usage:
  $(basename ${0}) 'InputFile OutputFile <threashold_ms>'

Args:
  InputFile:targe file
  OutputFile:output file
  threashold_ms:a processing time longer than this, then output.(msec, default=0)
Example:
  $(basename ${0}) './Log/20180425.log Output.txt 1000'
EOF
}

# entry
## $#はコマンド引数の個数
if [ $# -lt 2 ]; then
  usage
  exit 0
fi

## ${3}は3番目のコマンド引数
threshold_ms=0
if [[ ${3} -gt 0 ]]; then
  threshold_ms=${3}
fi

# 指定文字列が存在する行を一時ファイルに出力する
## ファイルから指定文字列の行を抜き出し、2列目と7列目を出力する(awk '/Start_Job/ || /End_Job/ {print $2, $7}' $1)
## Unix改行に変える(tr -d '\r')
## 2行を1行にまとめる(awk '{if(NR%2)ORS=",";else ORS="\n";print}')
awk '/Start_Job/ || /End_Job/ {print $2, $7}' $1 | tr -d '\r'  | awk '{if(NR%2)ORS=",";else ORS="\n";print}' > temp.txt

## 組み込みコマンド':'(何もしない)を使って、結果ファイルの中身をクリアする
offset_file=${2}
: > $offset_file

# 処理時間を出力する
cat temp.txt | while read line; do
  #echo $line
  
  #先処理の時刻を検出
  ##先頭から12この数字を切り出す(${line:0:12})
  tm=${line:0:12}
  time1=`expr ${tm:0:2} \* 3600000 \+ ${tm:3:2} \* 60000 \+ ${tm:6:2}  \* 1000 \+ ${tm:9:3} `

  #後処理の時刻を検出
  ##40桁から12この数字を切り出す(${line:0:12})
  tm=${line:40:12}
  time2=`expr ${tm:0:2} \* 3600000 \+ ${tm:3:2} \* 60000 \+ ${tm:6:2}  \* 1000 \+ ${tm:9:3} `

  ##expr は文字列から数値に変換するコマンド。
  ## 四則演算の前に\を付けることで演算子と認識する。
  time_offset=`expr $time2 \- $time1`
  echo 'time_offset =' $time_offset
  if [ $time_offset -lt $threshold_ms ]; then 
    continue
  fi

  echo $line','$time_offset >> $offset_file
done

# 一時ファイルの後始末
rm temp.txt
```

#その他
* Cygwin内でDドライブに移動する方法  
cd /cygdrive/d
Image Generation from Scene Graphsを読んだ

Justin Johnson, Agrim Gupta, Li Fei-Fei, CVPR2018
[arxiv](https://arxiv.org/abs/1804.01622), [pdf](https://arxiv.org/pdf/1804.01622.pdf)

#1.どんなもの？
シーングラフから画像を生成する．

#2.先行研究と比べてどこがすごいの？
複雑な文章を再現できる．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/0824be65-f00c-7104-9135-522f18790de9.png)

#3.技術や手法のキモはどこにあるか？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/d7cb9965-6d90-792c-2054-fa1c5d00e022.png)
###1.グラフ構造のを処理する方法を開発
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/8cd8584f-dfda-9283-53c5-93885deb820a.png)
グラフ畳み込みネットワークで処理．
画像のCNNのように，グラフのつながりに沿って畳み込みを行う．
###2.生成された画像がグラフによって指定されたオブジェクトと関係するようにした
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/6c8264de-603b-bf72-5eb8-b1ab5966d05a.png)
オブジェクトごとに荒い画像と，バウンディングボックスを予測し，バウンディングボックス内に画像を配置したレイアウト画像を作成する．
アップサンプリングする場合は各層で前の層からの入力と，ダウンサンプリングされたレイアウト画像を用いる．
###3.合成画像が現実的であることを確認
ディスクリミネータを用いて学習することで現実的な画像を生成するよう訓練する．

#4.どうやって有効だと検証した？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/88cd3701-02e8-94f9-b0ba-9bf9f137bd56.png)

#5.議論はあるか？

#6.次に読むべき論文はあるか？
[StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks](https://arxiv.org/abs/1612.03242)
ZeplinとRevealでピクセル単位のデザイン調整を高速に行う

iOSをはじめとするフロントエンド開発において、デザインの微調整は地味に時間を取られる作業です。特にピクセル単位の微妙なズレは見つけづらく、デザイナに確認してもらって初めて気づく場合もあるでしょう。

ここではZeplinとRevealを使って簡単にデザインのズレを確認し、微調整を行う方法について紹介します。

# Zeplinのポップアウト機能
[Comparing app/website with designs using Pop Out | Zeplin Help Center](https://support.zeplin.io/zeplin-101/comparing-appwebsite-with-designs-using-pop-out)

ZeplinのmacOSアプリには、スクリーンを透過ウインドウでポップアウトする機能が備わっています。以下のようにして透過したスクリーンをSimulatorに重ねることで、微妙なUIパーツのズレも簡単に確認することができます。

![May-11-2018 01-47-02.gif](https://qiita-image-store.s3.amazonaws.com/0/7325/a21f5268-5351-a55d-977e-4534a7378d91.gif)

# Revealの動的なUI変更機能を組み合わせる
[Reveal - Runtime view debugging for iOS & tvOS apps & extensions](https://revealapp.com/)

RevealはUIデバッガとしての用途に加え、Simulatorでアプリを実行中にViewの位置やサイズを変更したり、表示しているテキストを差し替えるといった事ができます。

![May-09-2018 01-35-20.gif](https://qiita-image-store.s3.amazonaws.com/0/7325/80ef51c2-bf70-bad8-7737-07b3b3fc98c3.gif)


Zeplinのポップアウト画面を重ねながらRevealで位置調整をすれば、何pt動かせばデザインとぴったり合うかが一発で分かり、コードを修正してビルドしてから微妙なズレに気づく・・・といった事を防ぐ事ができます。

(GIFが荒くて見えませんが、ズレていたラベルを動かして重ねているデザインとぴったり揃えています)

---
以上、ZeplinとRevealを組み合わせて素早くデザイン調整を行う方法についての紹介でした。
Javaエンジニアが Java 11 リリースに向けて備えておくべきこと

～～ イマドキな開発スタイルに乗りきれていないエンジニアのために ～～

## JDKのバージョンアップに備える

JDKの機能リリース・サイクルが6か月サイクルになりました。
LTSバージョンや、有償サポートを受けていない限り、新しいバージョンがリリースされれば、以前のバージョンがサポート終了となります。
長期にわたる開発スパンの途中にJDKの新バージョンがリリースされることは容易に想像でき、あらかじめ考慮しておく必要があります。
開発期間中はバージョン固定で開発を進めることもできますが、開発したソフトウエアのリリースや、システムのC/O時点では最新のJDKバージョンであることが求められます。
したがって、リグレッション・テストがサイクリックに実施できる開発インフラの整備が必須になります。

Java 11になると、これまで非推奨(Deprecated)としてマークされているものの、継続して利用できたAPIが削除される可能性があります。
こういった変更が与える影響を素早くキャッチアップできる必要性も出てきます。

### Java 9 でビルドし、Java 11への移行時の影響を予測する（2018/05/21 追記）
Java 9 の時点で、[Project Jigsaw](http://openjdk.java.net/projects/jigsaw/)などの変更もあり、既に削除されているAPIや、これまで参照できていた内部実装クラスが参照できなくなったりといった変更が発生しています。
Java 9 が入手できる今のタイミングでJava 9でのビルドや動作確認などしておき、Java 11への移行に予め備えておきましょう。Java 11への移行時のインパクトが少なくて済みます。

### Java 11で削除されるAPIの代替が必要

Java 11 の変更内容として、[JEP 320](http://openjdk.java.net/jeps/320)が含まれており、 Java 9 で非推奨になったJava EEやCORBAなどが削除されます。Java 8 からの移行を検討するにあたっては、これらの代替になる外部ライブラリへの書き換えを行う必要があります。
Java EEにおいては、Jakarta EEに移管されることになっていますから、パッケージ名の書き換えなど必要に応じて対応することになります。

#### 削除される対象のパッケージ
- java.xml.ws （JAX-WS、関連技術SAAJおよびWebサービスメタデータ ）
- java.xml.bind （JAXB）
- java.activation （JAF）
- java.xml.ws.annotation （共通注釈）
- java.corba （CORBA）
- java.transaction （JTA）
- java.se.ee （上記6つのモジュールの集約モジュール）
- jdk.xml.ws （JAX-WS用ツール）
jdk.xml.bind （JAXB用ツール）



## 依存ライブラリのバージョンアップに備える

同時に、依存する外部ライブラリのバージョンアップに備える必要もあります。
セキュリティパッチ・リリースに備えることも当然ですが、JDKのバージョンアップに合わせて、これらの外部ライブラリもバージョンアップされる事は容易に想像できます。
やはりここでも、リグレッション・テストが容易に実施できる必要性があります。

依存ライブラリのバージョン管理には、パッケージマネージャーや、そういった機能を備えたMaven や Gradleといったビルドツールを使います。

## リグレッション・テストにコストをかけない

ヒトの手で1つ1つテストケースを消化するのは、もはや時代遅れです。
リグレッション・テストをサイクリックにかつ容易に実施するには自動化する以外、他にありません。
すべてのソースコードをビルドして、すべてのテストコードを実行するのを、開発作業PCで実施するのは、現実的ではありませんので、専用のサーバーを用意します。

ただし、カバレッジ計測や、品質確保のための再利用可能なテストコードを書く方にコストをかけることになります。
（決して、TDDやTest-Firstである必要はありません。）
DBなどに影響を与えるようなコードをテストする場合は、モックを使うか、テスト終了時にしっかり後始末できるテストコードを書くように心がけるのは言うまでもありません。

画面のあるシステム開発では自動化が難しい部分もあります。
ココでは、『JDKや依存ライブラリのバージョンアップが与える影響を素早くキャッチアップする』事を目的として、『今まで通り動くよね』がテストできれば良いこととします。

### CI（継続的インテグレーション）ツールの活用

ソースコードのビルドや、テストコードの実行などを自動化するために、JenkinsやTravis CIなどのCIツールを導入しましょう。
ソースコードの変更が反映されたら直にビルドされるように設定します。
静的検査の実行や、テストコードの実行、カバレッジ計測など、開発作業の裏で実行されるようになります。

また、クラウド（IaaS,PaaS,SaaSなど）や、SDI（Software Defined Infrastructure）、Dockerなどの仮想化技術をうまく活用することで、開発リソースの変更が反映された検証環境を素早く構築することも可能です。

## まだSVNを使っているなら、Gitに乗り換える

いまどき、開発リソースのバージョン管理をしていないなんてあり得ないと思いますが。
SVNで出来なかったことが、Gitではできます。SVNで出来たことはより便利になっているのがGitです。
バージョン管理、リビジョン管理が煩雑になる事は容易に想像できます。
GitHubや、GitBucketなど、Pull-Request（マージ・リクエスト）機能を持つGitサーバーの運用を今すぐにでも開始しましょう。
構成管理が厳格にできないのであれば、なおさらです。


## 2019年1月 Oracle JDK 8 公式アップデート終了に向けて

以下のいずれかを選択する事を検討しましょう

- Oracle JDK 8 の有償サポートを受け、延長する
- Oracleの有償サポートを受け、 Oracle JDK 11へ移行する
- 無償のOpenJDK 11 へ移行する（ただし、LTSにならない場合は、6か月サイクルでの更新計画を立てる必要がある）

## Java11 のリリースをワクワクしながら待とう！(2018/09/08 追記)

[ココ](http://openjdk.java.net/projects/jdk/11/)にあるスケジュールでは、一般利用が可能になるのは、9/25とあります。
もうじきですね・・・。万全な体制を整えて、ワクワクしながら待ちましょう。

Fedora27のUpdatesリポジトリではリリース候補版が提供されているようですネ。
openFrameworks(0.10.0)でofxBox2Dを動かす

ofxBox2Dを動かしてみた。

環境
openFrameworks : 0.10.0
ofxBox2D : ofxBox2d/master (https://github.com/vanderlin/ofxBox2d)
VisualStudio : 2017
Windows 10

##1. ofxBox2Dのインストール
ほかのサイトにもさんざん書かれているので省略しますが、GitHubからhttps://github.com/vanderlin/ofxBox2d　
のマスターをダウンロードします。(openFrameworksのversionによってダウンロードするブランチが違うようなので注意)
その後、インストール済みのopenFrameworksのaddonフォルダに格納して準備完了。

##2. ビルド
新規プロジェクトを作成して、適当なコードを書いてビルドをしてみる。
今回は、マウスクリックしたところに白いボールを生成して、cキーを押すとクリアするコードを書いた。
書いたコードは以下。

```c++:ofApp.h
#pragma once

#include "ofMain.h"
#include "ofxBox2d.h"
#include <vector>

class ofApp : public ofBaseApp {

public:
	void setup();
	void update();
	void draw();

	void keyPressed(int key);
	void keyReleased(int key);
	void mouseMoved(int x, int y);
	void mouseDragged(int x, int y, int button);
	void mousePressed(int x, int y, int button);
	void mouseReleased(int x, int y, int button);
	void mouseEntered(int x, int y);
	void mouseExited(int x, int y);
	void windowResized(int w, int h);
	void dragEvent(ofDragInfo dragInfo);
	void gotMessage(ofMessage msg);

	ofxBox2d box2d; // box2dのインスタンス変数
	std::vector<ofxBox2dCircle*> circles;

};
```
```cpp:ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup() {

	ofBackground(0, 0, 0);

	box2d.init();

	box2d.setGravity(0, 9.8);

	box2d.createBounds();

	box2d.setFPS(30);
}

//--------------------------------------------------------------
void ofApp::update() {
	box2d.update();
}

//--------------------------------------------------------------
void ofApp::draw() {

	for (auto it = circles.begin(); it != circles.end(); ++it) {
		
		ofSetColor(ofColor(255, 255, 255));
		(*it)->draw();
	}
}

//--------------------------------------------------------------
void ofApp::keyPressed(int key) {

	if (key == 'c')
	{
		for (auto it = circles.begin(); it != circles.end();) {
			(*it)->destroy();
			delete *it;
			it = circles.erase(it);
		}
	}
}

//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button) {

	ofxBox2dCircle* circle = new ofxBox2dCircle();
	circle->setPhysics(10.0, 0.8, 0);
	circle->setup(box2d.getWorld(), x, y, 20);
	circles.push_back(circle);
}
```
すると、以下のような旨のエラーがでる。

1. ofDefaultVertexTypeが定義されてない
2. ofRotateDegが定義されてない


いろいろ調べたんですが、あまり参考になる記事がなく、結局コードを漁ってくと、
どうにも、宣言している型名が変わってる模様。
以下のようにofDefaultVertexType ,ofRotateDeg が書かれてる部分をすべて修正したところ無事動いた。

1. ofDefaultVertexType を ofPoint に修正
2. ofRotateDeg を ofRotate に修正


動作するとこんな感じ。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/192240/298a2757-dd4e-33e3-0acc-f18d51a0dec7.png)
domainからazure tenantIdを取得する

# 公式な取得方法
公式な方法は下記の通りです。
Azure Portalにログインするか、PowerShellを使う必要があります。
[Office 365 テナント ID を検索する](https://support.office.com/ja-jp/article/Office-365-テナント-ID-を検索する-6891b561-a52d-4ade-9f39-b492285e2c9b)

# 上記手順が面倒な僕みたいな人

下記のMSのエンドポイントにリクエストを送ることで、tenantID等を取得することができます。
https://login.windows.net/${domain}/.well-known/openid-configuration

nodejsでスクリプトも書いてみました。標準ライブラリだけで動作するはず。

```javascript
"use strict";

const https = require("https");

if(process.argv.length !== 3){
    console.log("domain name should be specified");
    process.exit(1);
}
const domain = process.argv[2];

https.get({
  hostname: 'login.windows.net',
  port: 443,
  path: `/${domain}/.well-known/openid-configuration`,
  agent: false
}, (res) => {
    let body = '';
    res.setEncoding('utf8');

    res.on('data', (chunk) => {
      body += chunk;
    });

    res.on('end', (res) => {
      res = JSON.parse(body);
      if(res.error){
        console.log(res.error_description);
        process.exit(1);
    }
      const issuer = res.issuer;
      const tenantId = issuer.replace("https://sts.windows.net/","").replace("/","");
      console.log(tenantId);
    });
});
```

# Webサービスにドメイン名を渡しても抵抗がない人
一発で検索してくれるサービスがあります。
僕とは全然関係ないサイトですし、取得方法も上記とは異なる可能性があります。
[What is your domain name](https://www.whatismytenantid.com)
PM2の簡単な使い方と環境によるアプリ名の変更など


node.jsアプリの本番運用に便利な[PM2](http://pm2.keymetrics.io/)。その基本的な利用方法と応用（自分ニーズ）のメモ。

## 基本操作

### インストール

```bash
npm install -g pm2
```

>環境によってはsudoする必要があります。

### 起動

```bash
pm2 start index.js
```

### リスト

```bash
pm2 list
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬──────────┬────────┬──────────┐
│ App name │ id │ mode │ pid   │ status │ restart │ uptime │ cpu │ mem      │ user   │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────┼──────────┼────────┼──────────┤
│ index    │ 0  │ fork │ 47551 │ online │ 0       │ 0s     │ 2%  │ 9.8 MB   │ hoge   │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴──────────┴────────┴──────────┘
```

### restart

```bash
pm2 restart index #app name
```

### delete

```bash
pm2 delete index #app name
```

### logを見る

pm2の場合、console.log()の出力はログファイルに出力されるようです。

```bash
pm2 logs

pm2 --lines 100 #行数指定
pm2 flush #全ログのクリア
```

>pm2 logs app_name という感じでアプリ名を指定することもできるようです。

## 応用１：環境により動作を切り替えたい

素のnodeなら、下記のようにすればいいのですが、PM2だと設定ファイルを用意する必要があります。

```bash
NODE_ENV=development node index.js
```

>なお、素のnodeで環境変数を設定・利用する方法については[こちら](https://qiita.com/zaburo/items/e0061e31f4f4a1e66949)を参考にしてください。

### 設定ファイル

例えば、下記のような設定ファイルを用意します。

```js:pm2.config.json
{
	"name" : "app",
    "script" : "index.js",
    "env" : {
        "NODE_ENV" : "development",
    },
    "env_production" : {
        "NODE_ENV" : "production",
    }
}
```

### 設定ファイルを利用した起動

設定ファイルを利用して下記のように起動できます。

```bash
pm2 start pm2.config.json --env production
```

## 応用２：環境により起動App nameを変更したい（管理上の問題）

設定ファイルは便利なのですが、環境毎に起動アプリ名を指定する方法がわからなくて調べました。

下記のようにname変数も環境毎の変数として記述すればよいようです。

```js:pm2.config.json
{
    "script" : "index.js",
    "env" : {
        "NODE_ENV" : "development",
        "name" : "app_test"
    },
    "env_production" : {
        "NODE_ENV" : "production",
        "name" : "app_pro"
    }
}
```

### 起動

```bash
pm2 start pm2.config.json --env production

┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬──────────┬────────┬──────────┐
│ App name │ id │ mode │ pid   │ status │ restart │ uptime │ cpu │ mem      │ user   │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────┼──────────┼────────┼──────────┤
│ app_pro  │ 0  │ fork │ 48616 │ online │ 3       │ 0s     │ 0%  │ 9.8 MB   │ hoge   │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴──────────┴────────┴──────────┘
```

App nameが環境に応じたものになっています。

>同じポートを利用していたらエラーとなります。状況にもよりますが、実際は環境により起動ポートを変えたりします。
[React.js]styled-componentsの使い方メモ

年末にアップロードしようとしていた記事が、下書きに残っていたので投稿しちゃいます笑

- Componentごとにスコープを区切りたい
- どこでCSSが使われているのかわかりやすくしたい
- 通常のCSS通りの文法で記載したい　など....

そんな時に、styled-componentsがいいとお聞きしたので試してみました。
この記事では、どんなことができるのか紹介していきたいと思います。
##styled-componentsとは
styled-componentsはReactコンポーネントとスタイルをまとめて書くことを目的とした新たなライブラリーです。
CSS In JSと言われているやつですね。

##styled-componentsの使い方
```javascript:components/Hello.js
import React from 'react'
import styled from 'styled-components';

const Hello = styled.h1`
  color: #F00;
`

export default function HelloComponent() {
    return (
        <div>
            <Hello>Hello World</Hello>
        </div>
    );
}
```
##Media Queries
```javascript:utile/Helper.js

import { css, keyframes } from 'styled-components'

export const media = {
    desktop: (...args) => css`
    @media (min-width: 1025px) {
      ${ css(...args)}
    }
  `,
    tablet: (...args) => css`
    @media (max-width: 1024px) {
      ${ css(...args)}
    }
  `,
    phone: (...args) => css`
    @media (max-width: 568px) {
      ${ css(...args)}
    }
  `
}
```

```javascript:components/Hello.js
import React from 'react'
import styled from 'styled-components';

const Hello = styled.h1`
  ${media.desktop`color: #F00;`}
  ${media.tablet`color: #0F0;`}
  ${media.phone`color: #00F;`}
`

export default function HelloComponent() {
    return (
        <div>
            <Hello>Hello World</Hello>
        </div>
    );
}
```
Pythonのデバッガpdb コマンドまとめ


pythonのデバッガpdbのコマンドを、自分の備忘録用も兼ねてまとめる。


# コマンド

| コマンド | 何の略   | 処理                                                         |
| -------- | -------- | ------------------------------------------------------------ |
| h        | help     | `h コマンド名`でコマンドのhelpを表示                         |
| w        | where    | スタックトレース(プログラムの実行過程の記録)を表示           |
| s        | step     | 現在行を実行し、次の行に進む。<br />次の行が関数の場合、関数内で停止。 |
| n        | next     | 現在行を実行し、次の行に進む。<br />次の行が関数であっても、関数内で停止しない。 |
| r        | return   | 現在の関数から抜ける                                         |
| l        | list     | 現在行周辺のソースを表示<br />(なお、`ll`コマンドで、より広範囲のソースを表示できる) |
| a        | args     | 現在関数の引数一覧を表示                                     |
| p        | print    | `p 変数名`で、その変数の値を表示                             |
| b        | break    | `b 行数`で、その指定行数にブレークポイントをつけることが出来る |
| cl       | clear    | `cl 番号`で、指定した番号のブレークポイントを削除            |
| c        | continue | ブレークポイント、あるいは`pdb.set_trace()`がある行まで実行を継続 |
| q        | quit     | デバッガを終了する。<br />実行中のプログラムは中断される。   |



# 参考文献
- https://docs.python.jp/3/library/pdb.html
- [Effective Python ―Pythonプログラムを改良する59項目](https://www.amazon.co.jp/Effective-Python-%E2%80%95Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E6%94%B9%E8%89%AF%E3%81%99%E3%82%8B59%E9%A0%85%E7%9B%AE-Brett-Slatkin/dp/4873117569)
Vue.js 環境をDocker化しようとしたら接続できなかった

`npm run dev` を docker から実行したかった。動かなかった。
EXPOSE も docker run -p も指定したのに動かなかった。

----

`--host 0.0.0.0` を足したら動いた。

```json:package.json
{
  ...
  "scripts": {
    "dev": "webpack-dev-server --host 0.0.0.0 --inline --progress --config build/webpack.dev.conf.js",
    ...
  }
}
```

# (追記) 上記方法は駄目。以下の方法。
```
disableHostCheck: true
```
https://github.com/webpack/webpack-dev-server/issues/882


### 参考
https://stackoverflow.com/questions/39632038/cannot-run-webpack-dev-server-inside-docker/39638515#39638515

成功した後に見つけたので試してないけど、 `config/index.js` で host を `0.0.0.0` に直しても動くらしい。
https://qiita.com/Yorinton/items/938cda034334cdcfcb72

(追記)
ただし、こいつを指定した場合、 今度は local 環境から localhost でアクセスすることが出来なくなるので注意。
.htmlファイル内でPHPを動かす


## やりたいこと
- `xxxx.html`ファイル内で`<?php ?>`を動かしたい

## 手順
1. `httpd.conf`の修正

	~~~
	# 以下を追加する
	AddType application/x-httpd-php .html
	~~~

1. apachを再起動

	~~~bash
	sudo service httpd restart
	~~~
Windows10とUbuntu16.04のデュアルブート環境でWindowsアップデートを行って再起動したら grub rescue が出力されて起動しない時の対処方法

久しぶりに利用したノートPCが、Windows10とUbuntu16.04のデュアルブート環境でWindowsアップデートを行って再起動したら更新プログラムの構成が75%程度のどころで再起動中に grub rescue が出力されてOSが起動しないときに行った対応方法のメモ書き。

<font color="Red">
※注意
この手順で作業するとWindowsアップデートは継続できたけどデュアルブートしなくなったので自己責任でお願いします。
</font>

なんかトラブルは同時に複数発生する模様。(ToT)

# 状況
## Windowsアップデートの再起動中にgrub(GRand Unified Bootloader) が表示される

再起動中に黒い画面が出て

~~~
grub rescue>
~~~

と表示された。grub は GRand Unified Bootloader の略で、GNUプロジェクトで開発されているブートローダ。 https://ja.wikipedia.org/wiki/GNU_GRUB 

とりあえず ls コマンドでチェックすると…

~~~
grub rescue>ls
(hd0) (hd0,msdos5) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1)
~~~

と表示されるのでさらに ls コマンドでチェックしようとすると…
ls (hd0) と入力したいのに、( を入力しようと Shift 押しながら 8 を押下すると * が表示される。つまりこれは、キーボードマッピングが英語キーボードになっているので、Shift を押しながら 9 を押下すると ( が表示された。

気を取り直してlsコマンドでチェック。

~~~
grub rescue>ls (hd0)
(hd0): Filesystem is unknown.
grub rescue>ls (hd0,msdos5)
(hd0,msdos5): Filesystem is unknown.
以下すべてが同様・・・
~~~

となった。setコマンドで確認すると

~~~
grub rescue>set
cmdpath=(hd0)
prefix=(hd0,msdos6)/boot/grub
root=hd0,msdos6
~~~

と表示された。

うむぅ。

msdos6 って、 lsコマンドで出てこないのだけど…？？？

とりあえずマスターブートレコード(MBR)が壊れてるのは確実だと考えて復旧を試みる。

# 復旧方法
## WindowsPE のインストール

Windowsでの復旧方法は、問題なく動作する別のPCで、Windows PE（Windows Preinstallation Environment) をインストールして復旧させるのが一般的なようだ。
https://msdn.microsoft.com/ja-jp/library/windows/hardware/dn938389(v=vs.85).aspx

起動用のDVDを作成しようとしたけど壊れてるPC(ノート)のみDVDが付いているので以下を参考にしてUSBブートを行うことにした。
https://msdn.microsoft.com/ja-jp/library/windows/hardware/dn938386(v=vs.85).aspx

動画での解説は下記参照。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/UJWGeK7_XDE/0.jpg)](https://www.youtube.com/watch?v=UJWGeK7_XDE)

正しくインストールされると、【展開およびイメージングツール環境】がインストールされるので、スタートメニューにある【最近追加されたもの】から探して『管理者として』起動する。なお、［スタートメニュー］ -> ［Windows Kits］ -> ［展開およびイメージングツール環境］に存在する。

## WindowPEのコピー
WindowsPEをインストールしたPCで以下のコマンドでWindowsPEをコピーする。

~~~
copype amd64 C:\WinPE_amd64
~~~

![copype.png](https://qiita-image-store.s3.amazonaws.com/0/255677/b22b0770-0269-a92d-826c-773d6ea306b5.png)

## ドライブ文字を指定して、USB フラッシュ ドライブに Windows PE をインストール
管理者として起動していない場合、このときにエラーが出力される。

USBがDドライブの場合は下記の通り。

~~~
MakeWinPEMedia /UFD C:\WinPE_amd64 D:
~~~

![MakeWinpeMedia.png](https://qiita-image-store.s3.amazonaws.com/0/255677/6f6550ee-1b53-5667-d4a0-ea917607b610.png)

## 復旧させるPCでWindows PE を起動する

復旧させるPCにUSBデバイスを接続し、USBでブートできるようにBIOSの設定を変更し、USBブートさせる。BIOSはPCによって異なるのでメーカーのマニュアルを探してください。

起動後は wpeinit コマンドが自動的に動作するのでしばらく待つ。

~~~
X:\windows\system32>wpeinit
X:\windows\system32>
~~~

## MBRのブートストラップローダの修復

~~~
bootsect /nt60 sys /mbr
~~~

というコマンドを入力。コマンドの詳細は下記を参照。

https://msdn.microsoft.com/ja-jp/library/windows/hardware/dn898493(v=vs.85).aspx

USBドライブを抜いてexitコマンドで抜ける。

~~~
X:\windows\system32>exit
~~~

そうすると、Windowsアップデートが継続されて正しく終了した。
なお、更新にはかなり時間かかりましたので放置です。

あ、再起動したらデュアルブートしなくなった・・・(ToT)

以上です。
viewでrenderを繰り返し呼ぶと重い？

Railsのviewで、eachを回してる中で繰り返しrenderしているところがあって、体感的に特に遅かったわけでは無いのですが、ファイルの読み込みや検索が繰り返し行われてるんじゃ無いかと気になってベンチを取ってみました。

```erb
<% Benchmark.bm 10 do |r|%>
  <% r.report "inline" do %>
    <% 1000.times do%>
    <div><%= Time.zone.now.strftime('%Y-%m-%d %H:%M:%S') %></div>
    <%end%>
  <% end %>

  <% r.report "render" do %>
    <% 1000.times do%>
    <%= render 'root/foobar' %>
    <%end%>
  <% end %>

  <% r.report "read" do %>
    <% erb = File.read(Rails.root.join('app', 'views', 'root', '_foobar.html.erb')) %>
    <% 1000.times do%>
    <%== ERB.new(erb).result(binding) %>
    <%end%>
  <% end %>
<% end %>
```

```erb
# app/views/root/_foobar.html.erb
<div><%= Time.zone.now.strftime('%Y-%m-%d %H:%M:%S') %></div>
```

結果はこんな感じです。

```
                 user     system      total        real
inline       0.018214   0.000176   0.018390 (  0.021384)
render       0.709417   0.749956   1.459373 (  1.526002)
read         0.095806   0.000444   0.096250 (  0.097051)
```

renderは`system`に非常に時間がかかってるので、毎回ファイルを読み込んでいそうです。試しにキャッシュして読み込むメソッドを作ってみた。

```rb
# app/helpers/application_helper.rb
  def render_erb_with_cache(path, locals = {})
    erb = Rails.cache.fetch "#{path}@render_erb_with_cache" do
      # ActionView::LookupContextでテンプレートを見つける。
      lookup_context = ActionView::LookupContext.new('app/views')

      # 3番目の引数は`partial`でこれをtrueにするとファイル名に`_`を付与して探します。
      # 返り値はActionView::Template
      template_path = lookup_context.find_template(path, [], true, [], {})
      # sourceアトリビュートで内容が取得可能。
      template_path.source
    end

    # renderする
    render(inline: erb, locals: locals)
  end
```
VB6.0からJAVAに移行する際の注意点

##はじめに
この記事では、VB6.0からjavaに移行する際に、私がはまったところ、苦労した所を書いていきます。

###文字列を抜き出し(Left)
VB6.0では10文字入った変数の11文字目を取る処理を書いてもエラーになりません。(0～11文字目を取得する処理の場合0~10文字目までが取れます。)
そのため、javaに移行する処理通り書いてしまうと文字数チェックエラー(StringIndexOutOfBoundsException)が出てしまう可能性があります。
そのため、文字列を抜き出す前に、文字数チェックを入れることでエラーを回避することができます。

VBソース

```vb
'abcが入ります。
test = Left("abc", 4)

```

javaソース

```java

test = "abc";

if (test.length() >= 4) {
  // 4文字以上の場合は4文字までtest2に入れる
  test2 = test.substring(0, 4);
} else {
  // 4文字未満の場合そのまま入れる
  test2 = test;
}

```

##LenB
LenBとは、指定された文字列の半角文字を1バイト、全角文字を2バイトとして計算し、バイト数の合計を返します。
javaで上記のような、対応するには文字列を「Shift_JIS」コードに変えて、合計バイト数を取ることによりLenBと同じ実装ができます。

文字コードのバイト数について
[別サイト様リンク](https://blogs.yahoo.co.jp/k3_labs/4128879.html)

##ソースコードを読む点での注意点
VB6.0を使っていた時代は、処理の先頭で処理内で、使う変数を全部宣言することが多いです。
そのため、宣言していても実際使われてない変数があったり、かなり奥のほうで密かに使われてたりする事があります。(私の入った案件だけかもしれませんが。。。)
また、VB6.0のコントロールと現在のVB.NETのコントロールで動きは同じだけど、名称が違うものがいくつかあります。

VB6.0、VB.NETコントロールの名称の違い
[別サイト様リンク](https://msdn.microsoft.com/ja-jp/library/ms973208.aspx)

##最後に
移行前のソースコードを読んだとき、何でこんな無駄な処理を入れているのか、なぜ昔あったメソッドが現在無くなってしまったのかなど、疑問に思うことが多いと思いますが、その処理やメソッドが昔に使わないといけなかった理由を調べると、プログラマーの歴史に触れられたようです楽しいので、移行で少し疲れたら気分転換に調べて見るといいかもしれません。
Java 6 での tls1.2 を使った HTTPS 接続

## 環境
- Java 6 (古い…)
- TLS 1.2

## TLS1.2
脆弱性が確認されていない暗号化通信プロトコル

HTTPS通信の際にも使用される。
SSL3.0, TLS1.0, TLS1.1 は脆弱性が見つかってしまった。
HTTPS通信では使用するプロトコルを限定できるので、相手側がTLS1.2 に限定した場合はこちらも対応しなければならない

## Java 6
無償版ではバージョンアップがされていないので非対応…

## 試行錯誤
ググったら stackoverflow で似たような事をやろうとしている記事を発見。
自分なりに整理して github に載せました。（要bouncycastle)

https://github.com/a--i--r/TLSSocketFactory

## TLSSocketFactory
* シンプル形式  
`HttpsURLConnection.setDefaultSSLSocketFactory(new TLSSocketFactory());`

* 自己証明書対応  
`HttpsURLConnection.setDefaultSSLSocketFactory(new TLSSocketFactory(true));`

* 自己証明書＋ソケットタイムアウト設定  
`HttpsURLConnection.setDefaultSSLSocketFactory(new TLSSocketFactory(true, 60000));`

HttpsURLConnection を使った通信が TLS1.2 に対応可能になります。
古いプログラムの対応等で使っていただければ嬉しいです。