OmniAICreator/Qiita-1.07M huggingface dataset:
文字列→塩基配列の相互変換ツールをつくってみた(PHP)

#はじめに
[以前この記事](https://qiita.com/am10/items/a3b6a5239905da3ec18f)を書いたのですが、せっかくなんで何か公開しようと思い、これ[💩これは世界一の臭いであるウンコードを出力します💩](https://qiita.com/redshoga/items/82b804f06e11dfb28e4e)をみて思いつきで作ってみました。

#つくったもの
つくったものは[これ（http://adventam10.php.xdomain.jp/dna/index.php）](http://adventam10.php.xdomain.jp/dna/index.php)
#機能
* 入力した文字を塩基配列に変換してくれる
* 塩基配列を文字に変換してくれる

左が入力文字、右が変換後です。上のラジオボタンでモードを選択します。

文字→塩基配列
<img width="1142" alt="２" src="https://user-images.githubusercontent.com/34936885/54935340-74b6bb80-4f63-11e9-91d5-b2bf1df206cf.png">

塩基配列→文字
<img width="1139" alt="１" src="https://user-images.githubusercontent.com/34936885/54935311-67013600-4f63-11e9-8119-46b2e1e9135d.png">

#仕組み	
仕組みは単純で文字を一度4進数に変換し、その後それぞれの数字を塩基に置き換えているだけです。

[💩これは世界一の臭いであるウンコードを出力します💩](https://qiita.com/redshoga/items/82b804f06e11dfb28e4e)この記事を読んで、一度バイナリに変換したら全ての文字を２文字で表現できるのか！と思い作ってみました。

PHPで作っており`bin2hex`で一度文字を16進数に変換し、その後4進数に変換しています。

16→4進数の変換は`base_convert`でできるかと思ったのですが、大きな数値は変換できず「あいうえお」でさえ変換できなかったので[PHPマニュアル](https://www.php.net/manual/ja/function.base-convert.php)に書いてあった`convBase`でどうにか実現できました。

`gmp_strval`を使えばできるというのもみたのですがXFREEサーバーへの導入方法がわからず（そもそも導入可能なのか？）`convBase`で落ち着きました。

#さいごに
生命科学を履修した身としてどうにか活かせないかと苦悩し、今回この塩基配列変換ツールを作成しました。

この塩基配列変換ツールがどなたかの役に立つことを心より願っております。

当初はアミノ酸までしてやろうと思ったのですが、非可逆になってしまうので断念しました...

#参考
* [💩これは世界一の臭いであるウンコードを出力します💩](https://qiita.com/redshoga/items/82b804f06e11dfb28e4e)
* [PHP: base_convert - Manual](https://www.php.net/manual/ja/function.base-convert.php)
Django簡単なアプリケーションができるまで③

#おさらい
前回まではプロジェクトの作成、Djangoのモデルパターンや処理フローを確認しました。

#アプリケーションの追加
アプリケーションを追加していきます。

```
$ python manage.py startapp posts
```
以上のコマンドでプロジェクトの構造は以下のようになっていると思います。

```
 ・blog
   ・...py
   ・...py
   ・...py
   ・posts
     ・...py
     ・...py
       ・
       ・
       ・
```




#Hello World!
プログラミングおなじみのHello World!です。
先ほど作成したアプリケーションフォルダ配下にあるviews.pyを以下の様に変更します。

```python:views.py
import django.http import HttpResponse

def index(request):
    return HttpResponse("Hello World!")
```

#ルーティングファイルの追加
次にアプリケーションフォルダの中に新しくurlr.pyを追加します。
追加したurls.pyを

```python:urls.py
from . import views

urlpatterns = [(path('', views.index, name="index")]
```
としてあげます。
特に指定されたファイルが見つからなければ、views.pyにあるindex関数を呼び出す処理です。

ここまで書けたら、runserverして、
http://127.0.0.1:8000/posts を見にいきましょう。

すると、Hello World!と表示されているかと思います。

この記事はここまで
Django簡単なアプリケーションができるまで②

#おさらい
前回まではプロジェクトの作成から初めてのDjangoのページを見に行くとこまでやりました。

#Djangoのモデルパターン
次のステップに行く前にDjangoのモデルパターンや処理フローを確認しておきましょう。
DjangoはMTVモデルといっても良いと思います。(models,template,views)MVCモデルのmodels,views,controllerの前から順にMTVモデルの各部品に相当します。

#Djangoの処理フロー
<img width="793" alt="スクリーンショット 2019-03-26 1.32.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/376889/20d0f41a-5f0a-8721-723d-624f12d07d82.png">

だいたいこんな感じです。


この記事はここまで
Mac 版 LINE のキャッシュを削除して軽量化する方法

# はじめに
Mac 版 LINE のキャッシュファイルは画像が主で、1つ1つの画像は数十KBしかないが、削除せずに溜まっていくと数GBになる。放っておいても問題はないが、HDD・SSD の空き容量を作りたい場合に削除したり、バックアップの除外フォルダに指定したりしておくといいだろう。
> キャッシュファイルとは、PCでアクセス頻度の高いファイルを一時的に保存したファイルのことである。 キャッシュファイルに格納されたデータは、必要なときに再利用されることで、同じファイルをHDDから読み出す場合に比べてパフォーマンスを向上させている。
https://www.weblio.jp/content/キャッシュファイル

:information_source: この記事は macOS Mojave 10.14.3, LINE Ver. 5.13.1.1876 に基づいています。

# Mac 版 LINE のキャッシュファイルのある場所

```
~/Library/Containers/jp.naver.line.mac/Data/Library/Containers/jp.naver.line/Data/Cache
```

通常 `ライブラリ` フォルダは Finder から見えないようになっているので、`移動` → `フォルダへ移動...` に上記のパスを入力するとアクセスできる。
<img width="267" alt="go" src="https://qiita-image-store.s3.amazonaws.com/0/155587/5f146f9e-166e-1a84-db25-9fd93e94ee86.png">

ターミナルから削除するには

```shell
$ rm -rf ~/Library/Containers/jp.naver.line.mac/Data/Library/Containers/jp.naver.line/Data/Cache
```

# その他のファイルの場所
|ファイル|場所|
|---|---|
| 通知音 | `~/Library/Containers/jp.naver.line.mac/Data/Library/Containers/jp.naver.line/Data/resource` |
| 着信音・発信音 | `~/Library/Containers/jp.naver.line.mac/Data/Library/Containers/jp.naver.line/Data/sound` |
| スタンプ | `~/Library/Containers/jp.naver.line.mac/Data/Library/Containers/jp.naver.line/Data/Sticker` |
| 絵文字 | `~/Library/Containers/jp.naver.line.mac/Data/Library/Containers/jp.naver.line/Data/Sticon` |
Django簡単なアプリケーションができるまで①

#はじめに
Djangoで1つの簡単なアプリケーションができるまでを随時更新していきます。
チュートリアルというよりかは、できるまでを追った様な記事になるかと思いますので悪しからず。

作るものとしては簡単なposts投稿管理アプリ見たいなものです。

Djangoの管理者ページからpostした投稿を取得して表示させ、Bootstrapを使い少しかっこよくするとこまで書いていきます。


#環境、バージョン
macOS Mojave(ver 10.14.2)
Python 3.7.0
Django 2.1.7

#プロジェクトの作成
```
$ django-admin startproject プロジェクト名
```
今回は 'blog' というプロジェクト名で作業を進めていきます。

#runserver
さっそくサーバーを起動し、ページを見に行ってみたいと思います。

```
$ python manage.py runserver
```
頻繁にmanage.pyとはざっくりいうとDjangoを操作するためのファイルです。

http://127.0.0.1:8000 を見に行ってみましょう。
すると初めての接続やらなんやらが書かれたページが見れると思います。

この記事はここまで
SCSSでお絵かきしてみる（アンパンマンpart1)

## はじめに
CSS(SCSS)を感覚的に使えるようになるため、
練習していきたいと思います。
まずは白黒のすごく簡単な絵を描きます。

今回のお題はアンパンマンです。
何も見ずに描いたので、また精度を上げて描きたいと思います。
（キャラクターの再現精度のほう)

一応githubにソース全体を上げています。
https://github.com/t-motoki/scss-oekaki/tree/master/src/oekaki/ampanman

## 注意
- ただの自己満足です
- 絵を描くことが目的です
- googlechromeでのみ動作確認済みです

## 描いたもの

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="t-motoki" data-slug-hash="xBQMzv" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="xBQMzv">
  <span>See the Pen <a href="https://codepen.io/t-motoki/pen/xBQMzv/">
  xBQMzv</a> by Takashi Motoki (<a href="https://codepen.io/t-motoki">@t-motoki</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 一応解説
- 縦の並びはblock要素(div)を並べました
- 横の並びはdisplay:flexを活用しました
- 円はborder-radiusで表現しています
- 半円はborderの描画を1辺にしています


## 今回の反省
- 半円を描くのを手抜きなので、口が先細りしてしまった
- scssのメリットを生かしきれてなかった

## 次の課題
- 色をつける
- 角度をつけたり、リアルさを追求していく
- inline要素などもつかっていく
複数のタイムゾーンの時刻を同時に比較できる Web サイト5選

# はじめに
[UTC](https://ja.wikipedia.org/wiki/協定世界時) や [PDT](https://ja.wikipedia.org/wiki/太平洋夏時間) など、[JST](https://ja.wikipedia.org/wiki/日本標準時)（日本標準時）以外のタイムゾーンでの時刻を JST に直したいとき、グローバル規模のオンラインイベントを開催したいが最も多く人が参加できる時間帯はいつか知りたいときなど、複数のタイムゾーンの時刻を同時に見たいときに便利な Web サイトを紹介します。

ちなみに[UTC](https://ja.wikipedia.org/wiki/協定世界時)（Coordinated Universal Time；協定世界時）≒ [GMT](https://ja.wikipedia.org/wiki/グリニッジ標準時)（Greenwich Mean Time；グリニッジ標準時）であり、これはロンドンのグリニッジ天文台の時刻を指します。
[JST](https://ja.wikipedia.org/wiki/日本標準時)（Japan Standard Time；日本標準時）は UTC(GMT)+9 なので、日本と UTC(GMT) の時差は9時間です(日本が早い)。[日本標準時子午線](https://ja.wikipedia.org/wiki/日本標準時子午線)は東経135度で、経度15度ごとに1時間の時差が発生するからです（135÷15=9）。

# [Every Time Zone](https://everytimezone.com/)
![everytimezone.gif](https://qiita-image-store.s3.amazonaws.com/0/155587/3153278e-8182-6dae-043c-c30485c6b7ff.gif)

- 黄緑のバーをドラッグすることで各都市の時刻を見ることができる
- デフォルトで結構多くの都市が入っているので設定の手間が省ける
- 指定した時間への URL が作れる（おそらく環境によって表示される時刻が変わる）↓
<img width="549" alt="link" src="https://qiita-image-store.s3.amazonaws.com/0/155587/3a94f82c-ec08-6472-d8b1-a34e91779694.png">



# [World Time Buddy](https://www.worldtimebuddy.com/)
![worldtimebuddy.gif](https://qiita-image-store.s3.amazonaws.com/0/155587/9ed785d7-1535-d01f-2120-85a41ff1177c.gif)

- 期間の選択ができる
- 指定した時間への URL が作れる
- :x: 無料版は4個しか表示できない

# [Homeslice](https://homeslice.in/)
![homeslice.gif](https://qiita-image-store.s3.amazonaws.com/0/155587/91d172a6-d40a-f92e-84c1-642732b2da01.gif)

- :x: 選択した都市を保存することができないので毎回選択し直さなければならない

# [Time Zone Map](https://www.timeanddate.com/time/map/)
<img width="953" alt="SS 2019-03-26 at 1.02.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/155587/10a54b7e-f114-daf5-e980-8d117c6baadf.png">

- カーソルを合わせた都市の現在の時刻を表示する
- タイムゾーンごとに色分けがされているのでわかりやすい

# [Time Zone Converter](https://www.timeanddate.com/worldclock/converter.html)
<img width="953" alt="SS 2019-03-26 at 1.00.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/155587/d9ba0325-c2e9-a47c-f8a7-bb7d7d7b7f33.png">

- 時刻を別のタイムゾーンに変換する
- 下のスライダーで調整することも調節入力することも可能
- 国名、地域名、タイムゾーンの略称など割となんでも認識してくれる
- 業務時間、祝日などに応じて右に色付きの●でステータスを表示する
13日目: Two at Once: Enhancing Learning and Generalization Capacities via IBN-Net

# Two at Once: Enhancing Learning and Generalization Capacities via IBN-Net 要約
## 読んだ論文
Two at Once: Enhancing Learning and Generalization Capacities via IBN-Net
Xingang Pan • Ping Luo • Jianping Shi • Xiaoou Tang
https://arxiv.org/abs/1807.09441v2
上記の論文を読んだので簡単にまとめます．ECCV2018で発表されている論文です．

## 3行でまとめる
- 既存のモデル構造は，単一ドメイン単一タスクのパフォーマンス向上に向け設計されている（一般化されていない）．
- 対して提案手法（IBN-Net）は，特定のドメイン（e.g. Cityscapes）でのモデリング能力を向上させるだけでなく，別ドメイン（e.g. GTA5）での一般化能力もFine-tuningなしに向上させる．
- ResNet等の既存手法と併用できる手法として，IN（Instance Normalization）とBN（Batch Normalization）を高度に統合した手法を提案する．

## 提案手法
### BN (Batch Normalization) [^1]
Batch NormalizationはIoffeらにより2015年に発表された手法で，現在主流のCNNモデルにはたいてい使用されているテクニックです．簡単に言えばミニバッチ単位で正規化しようというそれだけのことです．内部共変量シフトを防ぎ，学数の収束高速化と過学習防止につながるとか．詳細は[こちらの記事](https://qiita.com/cfiken/items/b477c7878828ebdb0387)でも触れられていますので割愛します．

[^1]: [Ioffe, Sergey and Szegedy, Christian.  Batch normalization: Accelerating deep network training byreducing internal covariate shift.arXiv preprint arXiv:1502.03167, 2015.](https://arxiv.org/abs/1502.03167)

### IN (Instance Normalization) [^2][^3]
Instance NormalizationはBNに対して，インスタンスごとに正規化を行うというそれだけのことです．なお，最近では，Layer Normalization，Group Normalizationなども提案されていて，[解説記事もありますので紹介しておきます．](https://blog.albert2005.co.jp/2018/09/05/group_normalization/)
BNとの違いの一つとして，BNは訓練時と推論時に異なる変換を行うが，INは同じ変換を行うということである．

[^2]: [Ulyanov,  D.,  Vedaldi,  A.,  Lempitsky,  V.:  Improved  texture  networks:  Maximiz-ing quality and diversity in feed-forward stylization and texture synthesis. CVPR(2017)](https://arxiv.org/abs/1701.02096)
[^3]: [Ulyanov, D.,  Vedaldi, A., Lempitsky, V.: Instance normal-ization: The missing ingredient for fast stylization.arXivpreprint arXiv:1607.08022, 2016.](https://arxiv.org/abs/1607.08022)

### 提案モデル
![20190325_001.png](https://qiita-image-store.s3.amazonaws.com/0/376859/841d34f9-67dd-c965-c9a1-2b8bb115eb39.png)

Fig.3.が提案するIN導入モデルである．ここで，IN導入時には2点に注意する．一つはDeepな層でのコンテンツ間の差分をなくさないように，CNN最後ではINを導入しないこと．もう一つは，BNの機能の一部を保持することである．（原文意訳，話半分くらいにしかわからない．）
Fig.3(a)はベーシックなResNetのResidual Blockである．(b)はIN導入手法1つ目で，最初のConv後にINを行うチャネルと，BNを行うチャネルに半々で分かれる様子．また，別の導入方法が(c)である．

![20190325_002.png](https://qiita-image-store.s3.amazonaws.com/0/376859/b5bbad41-faed-3a22-1abf-b8557b910982.png)

その他にもFig.4.のように様々なINの導入方法を比較検証している．（図中のidentityがどのような手法をとるのかは論文中からは読み解けなかったが，スキップコネクションを経由してきた情報(x)はそのまま通し，Convを通ってきた情報はINするという解釈をしている（違っていたら教えていただきたい）．）

## 評価実験
![20190325_003.png](https://qiita-image-store.s3.amazonaws.com/0/376859/f6a84536-2a52-61ee-ee65-d20faec49c5c.png)

色々と実験を行っていたようだが，特に興味深い結果は上図の通り．CityscapesとGTA5データセットを用いて評価しており，片方で訓練して，両方で評価した場合の精度を検証している．
結果を見て分かる通り，訓練時と推論時が同一ドメインの時に精度向上しているのみではなく，ドメインが異なるときにも精度が向上している．（よく考えたら表現力が上がっただけという話しにも見えてきた．）

## まとめ
- BNとINを組み合わせた手法によって表現力が向上する手法を提案した．
- 本手法は従来のモデル構造にも流用できるため，色々応用の幅が広そうである．
- 一方Group Normalization等の手法も出てきているので，そちらも見ていきたい．

## 所管
ざっくり読みですが2時間弱くらいで読了です．やっぱり一日にこのくらいの時間を掛けるのは負担が大きいですね．毎日，やるの辛いなと思いつつ，新しい知識が増えていくのは楽しみでもあり，複雑な感情の中，いつも記事を書いています．
ABC - 056 - A&B&C

#AtCoder ABC 056 B&C
[AtCoder - 056](https://atcoder.jp/contests/abc056)

#A問題

a='H'の時は`AtCoDeerは正直に話している`
a='D'の時は`AtCoDeerは嘘をついている`

b='H'の時は`AtCoDeerはTopCoDeerを正直者だと言っている`
b='D'の時は`AtCoDeerはTopCoDeerは嘘つきだと言っている`

で、TopCoDeerが正直か嘘つきかを判定する。

 - a='H' の時、 
    - b='H' `AtCoDeerは正直に、TopCoDeerを正直者だと言っている`
    - b='D' `AtCoDeerは正直に、TopCoDeerを嘘つきだと言っている`

 - a='D' の時、 
    - b='H' `AtCoDeerは嘘をついていて、TopCoDeerを正直者だと言っている`
        - TopCoDeerは嘘つきなのに、AtCoDeerはTopCoDeerが正直だと嘘をついている。
    - b='D' `AtCoDeerは嘘をついていて、TopCoDeerを嘘つきだと言っている`
        - TopCoDeerは正直者なのに、AtCoDeerはTopCoDeerが嘘つきだと嘘をついている。

```java
	private void solveA() {
		String strA = next();
		String strB = next();

		if (strA.equals("H")) {
			System.out.println(strB.equals("H") ? "H" : "D");
		} else {
			System.out.println(strB.equals("H") ? "D" : "H");
		}

	}
```


##B問題

四角形Aと四角形Bと考えて、パターンは二つ

 - 四角形Aが四角形Bより-のX座標軸にいる
    - 四角形Aの左端(座標A)より、四角形Bの右端（座標B＋W）が-の位置にいる
 - 四角形Aが四角形Bより+のX座標軸にいる
    - 四角形Aの右端(座標A＋W)より、四角形Bの左端（座標B）が+の位置にいる

上記2パターン以外は四角形Aと四角形BのX軸は一部かぶるので移動する必要がない。
そのため、常に移動量は0となる。

```java
	private void solveB() {
		int numW = nextInt();
		int numA = nextInt();
		int numB = nextInt();

		long res = 0;

		if (numA + numW < numB) {
			res = Math.abs(numB - (numA + numW));
		} else if (numB + numW < numA) {
			res = Math.abs(numA - (numB + numW));
		}
		System.out.println(res);
	}
```

##C問題

カンガルーは-/0/+に移動することができる。
座標Xに移動するために必要な最小の秒数を求める。
これ、考えてみると-に移動する必要がないと思う。
カンガルーの行動として、その場にとどまるか、進むか以外の選択をする必要がない。
単純に、`i秒後`にいることが可能な点`i!`を算出し、`i!`が`X座標以上かどうか`

練習のためにStreamを使って実装してみた。
　->コメントアウトの部分
結論として、このパターンにおいてはStreamを使うべきではないのでは？という結論になった。
頑張ったのですが、ろくな実装にならない。
おとなしくwhile使っておけという感じ。

```java
	private void solveC() {
		int numX = nextInt();

		int res = 0;
		int cnt = 0;
		int wkTotal = 0;
		while (true) {
			cnt++;
			wkTotal += cnt;
			if (wkTotal >= numX) {
				res = cnt;
				break;
			}
		}
		//
		//		for (int i = 0;; i++) {
		//			sum += i;
		//			if (sum >= numX) {
		//				res = i;
		//				break;
		//			}
		//		}

		//		AtomicInteger wkRes = new AtomicInteger(-1);
		//		IntStream.range(0, 1000000000).reduce(0, (inSum, index) -> {
		//			int wk = inSum + index;
		//			if (wk >= numX && wkRes.intValue() == -1) {
		//				wkRes.set(index);
		//			}
		//			return wk;
		//		});

		//		AtomicInteger wkTotal2 = new AtomicInteger(0);
		//		AtomicInteger wkRes2 = new AtomicInteger(-1);
		//		IntStream.range(0, 200).forEach(index -> {
		//			wkTotal2.addAndGet(index);
		//			if (wkTotal2.intValue() >= numX && wkRes2.intValue() == -1) {
		//				wkRes2.set(index);
		//				return;
		//			}
		//		});

		out.println(res);
	}
```

##参照
[Stream　APIの使い方](https://www.task-notes.com/entry/20150521/1432177200)
[Streamの使い方](https://www.slideshare.net/zoetrope/java8-lambdaandstream)
[loop内でindexを取得する方法](https://qiita.com/tsuka611/items/3049c033c67eb93aa09f#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E7%95%AA%E5%8F%B7%E3%81%A3%E3%81%A6%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%A0%E3%82%8D%E3%81%86%E3%81%8B)
Selenium+Rubyに入門してみる②

というわけでチュートリアルをやってみる
http://katsulog.tech/ruby-selenium-webdriver-tutorial/

###準備
環境は前回実施したので大丈夫なはず
progateでrubyをざっくり学習

文字列はダブルクォテーションを使っとけばいいのか？
attr_accessorってさらっと出てきたけど、なんかややこしそう。

###チュートリアル1 - driverを宣言する
chromeが立ち上がったので成功とする
2重コロンあたりがよくわからないが、後回し。

###チュートリアル2 – URLにアクセスして表示させる
演習まで特に問題なく実行
ちなみにvscodeを使っています（Code Runnerで実行）

コマンドの意味を下記で確認しつつ
https://qiita.com/wMETAw/items/8ea0ff9c7a63ca6134b9

###チュートリアル3,4,5,6
特に問題なし
- Rubyは「<<」で配列の末尾に要素を追加できるっぽい。

###チュートリアル7 – デバック
なんかうまくいかないので後回し
post.txtを実行してもタイトル表示されず、
nを実行すると最後までコードが実行されてしまう。

###チュートリアル8,9,10
特に問題なし

###チュートリアル11,12
- sleepは非推奨、wait/sizeを使ったほうがいいらしい

###まとめ
seleniumの世界にちょっと足を踏み入れた気分

---

####追記（チュートリアル7 – デバック）
この辺を参考にデバッグ出来た気になった。
https://qiita.com/kuniken/items/a6341297a97925f5081a

次は下記に変更
https://qiita.com/oh_rusty_nail/items/40150d4311d44ea966bb
ゼロから始めるNSX-v Vol.1

VCP-NV取得するまでの学習メモ的なもの

# 公式情報

* NSX-v(NSX for vSphere): vSphere向け
* NSX-T(NSX Transformation): vSphere以外のHypervisor + Public Cloud向け

## オンラインリソース

* [サポートページ](https://www.vmware.com/support/nsx.html)
* [ドキュメント](https://docs.vmware.com/jp/VMware-NSX-Data-Center-for-vSphere/index.html)
  * 日本語版は情報が古い場合があるので英語版を見る
* [Trending Support Issues](https://kb.vmware.com/s/article/2131154)
  * 今流行りのサポート情報一覧
  * 日本語版は情報が古いので英語版を（ry
* [HOL](https://labs.hol.vmware.com/HOL/catalogs/catalog/877)
  * VMware系は自宅で検証環境用意するのがとにかくハードル高い
  * Hands On Labs と呼ばれるオンラインで試せるサービスができた

## 試験情報

* [VMware Japan Education Blog](https://blogs.vmware.com/jp-education/)
  * 資格/試験の最新情報を追うのに便利
  * [VCPバージョンが西暦表示になった件](https://blogs.vmware.com/jp-education/2019/02/06/newvcp2019ver/)とか

* [Certification](https://www.vmware.com/education-services/certification.html)
  * 資格の取得条件とか
  * 日本語版は（ry

* [VCP-NV2019](https://www.vmware.com/education-services/certification/vcp-nv-2019.html)をゼロから取得する場合の条件
  * NSXの技術要素を理解していること
  * NSXに関連するVMwareの認定トレーニングコースを受講していること
  * Foundations Exam（Webで受験）に合格すること
  * VCP-NV2019 Exam（VUE認定テストセンターで受験）に合格すること


# vSphere Network Components

## 仮想スイッチ, ポートグループ

* 仮想スイッチ
  * ESXiホストのVMkernelで動作する抽象化されたNWデバイス
  * 原則、物理SWと同じ動作をする
  * 仮想マシンのネットワークアダプタ（vNIC）や物理NICごとに論理ポートを1つ使う
* ポートグループ（PG）
  * 論理ポートを用途やポリシーごとにまとめたもの
  * 特に物理NICと紐づいているPGをアップリンクPGと呼ぶことがある
  * VLANの設定はPG単位
* VMwareの仮想スイッチにおけるVLANの扱い
  * 0: タグなしVLANとして処理
  * 1-4094: 該当VLANのTrunkフレームとして処理
  * 4095: ゲストOSタギング（ゲストOSで生成されたTrunkフレームを転送）として処理

仮想スイッチは標準スイッチ（vSS）と分散スイッチ（vDS）の２つがある

* vSS
  * ESXi毎に構成、管理
  * 各ホスト毎に設定が必要なので管理台数、VLAN数が増えるとヤバイ
* vDS
  * vCenter上で1つのSWとして構成、管理
  * 実態としてvDSを作成するとESXi上にHost Proxy Switch（隠された仮想スイッチ）が作成され、ESXi毎にそのSWが通信を制御する
  * vDSの設定を変更すると、vCenter経由でそのvDSを持つESXi全てに同じ変更が適用される
  * vCenter死亡時は設定の閲覧/更新はできないが、通信自体は継続できる
  * ポートの状態監視, Network I/O Controlなどの機能が使えるようになる

## VMkernelポート

VMkernel用の仮想NICでHypervisor Serviceを提供する。

* Management
* vSphere vMotion
* IP Storage
* vSphere Replication
* vSphere FT(Fault Tolerance)
* vSAN Data Replication
* **VTEP(VXLAN Tunnel EndPoint)**
  * NSXが提供するVMkernel機能の1つ


# ユースケースとライセンス

NSXを利用する目的とか。

* 自動化: IT Automation, Multi-Tenant Infrastructure
* セキュリティ: Micro Segmentation, DMZ Anywhere
* アプリケーションの継続性: Disaster Recovery, Hybrid Cloud Network
* コンプライアンス: セキュリティポリシーの構築、適用、可視化

ユースケースに応じて[ライセンス](https://kb.vmware.com/s/article/2145269)を選択する。最新のバージョンだと5種類に増えた。
Standard < Professional < Advanced < Enterprise Plus の順に~~お高くなる~~機能が増える。
機能毎にライセンスを選ぶなら以下のような感じ（Remote Office Branch Officeは用途が特殊）。

* 分散ルーティング → Standard
* 分散ファイアウォール → Professional
* VPN, Cross vCenter NSX → Advanced
* L7分散ファイアウォール, NSXの可視化 → Enterprise Plus


# まとめ

NSXの学習を始めるにあたっての触り的な以下の情報を整理した。

* ドキュメント、資格試験情報
* vSphereのネットワークコンポーネント
* ユースケース

次回はNSXのアーキテクチャを整理する予定。
Reactの関数コンポーネントで親子間のprops受け渡し

Reactで親コンポーネントから子コンポーネントへ値を渡すのは以下のようすれば十分だったが、子コンポーネントから親コンポーネントに値を渡す方法がわからなかったので調べてみた。

```tsx
import React from 'react';

const App = () => {
  const greeting = 'Hello Function Component!';
  // 子コンポーネントにvalueをセット
  return <Headline value={greeting} />;
}

// valueをFunctionComponentの引数として使用する設定
const Headline:React.FunctionComponent<{value: any}> = ({ value }) => {
  // valueを表示
  return <h1>{value}</h1>;
}

export default App;
```

子コンポーネントから親コンポーネントに値を渡す方法とはつまり、vueでいうこんな感じのテクニック。
[API - Vue.js vm.$emit( eventName, […args] )](https://jp.vuejs.org/v2/api/index.html#vm-emit)

```tsx
// 子コンポーネントからemit
// 第一引数が子コンポーネントに設定した要素名(親のテンプレートに@をつけて設置する)で、第二引数がコールバックの引数になる
this.$emit('method', "this is argument")

// 親コンポーネントで受け取り、コールバック関数を実行
<template>
  <div>
    <ChildComponent @method="callback"/>
  </div>
</template>
<script>
// 省略
  callback(argument) {
    console.log(argument) // this is argument
  }
// 省略
</script>
```

結論から言って、Reactには子コンポーネントから親コンポーネントへ値を渡す方法はないらしい。
では、子から親へ値を渡して、子の変更時に親の方にも連動する変更を行いたい場合にはどうすれば良いのか......？

**A. 親コンポーネントの関数を子コンポーネントへ渡し、子コンポーネントでその親の関数を実行する。**

propsでやりとりするのではなく、関数を実行してpropsが必要な状況自体が必要ないようにするって考えておけばいいのだろうか。
それでもpropsが必要なんだが。。。みたいな状況になったら、つまりそれはReactでの開発思考的に間違った設計になっているだけの話なのかもしれない:thinking:

やっていることは親コンポーネントが子コンポーネントにpropsを渡しているのと変わりないが、渡しているものが親コンポーネントと繋がっている（実際に実行して確認してないので、コピペするだけではエラーが出るかもしれません）。

```tsx
// parent
const App = () => {
  const [flag, setFlag] = React.useState(false)
  function switchFlag() {
    setState(true) // flag = true
  }
  // 子コンポーネントにswitchFlag関数をセット
  return (
    <div>
      <ChildComponent switchFlag={switchFlag}/>
    </div>
  )
}

// child
// switchFlag関数をFunctionComponentの引数として使用する設定
const ChildComponent:React.FunctionComponent<{switchFlag: any}> = ({switchFlag}) => {
  // switchFlagをボタンとして設置
  return (
    <div>
      <button onClick={switchFlag}>Click</button>
    </div>
  )
}
```

この状態でボタンを押すと、親コンポーネント側の関数が実行され、親コンポーネントのstateであるflagがtrueに変わる。
子コンポーネントでボタンが押されたときになんらかの処理を行ってから、そのあとにswitchFlag()で親コンポーネントの関数を実行するのものオッケー(下みたいな感じで):ok_hand_tone2:

```tsx
// child
const ChildComponent:React.FunctionComponent<{switchFlag: any}> = ({switchFlag}) => {
  function onClickHandler() {
    // なんらかの処理
    switchFlag() // 親コンポーネントのswitchFlag関数の実行
  }
  return (
    <div>
      <button onClick={onClickHandler}>Click</button>
    </div>
  )
}
```

ここのページが参考になりました。:point_down_tone2::point_down_tone2::point_down_tone2:
[How to pass Props from child to parent Component?](https://www.robinwieruch.de/react-pass-props-to-component/#react-props-child-parent)
[React Function Component: Callback Function](https://www.robinwieruch.de/react-function-component/#react-function-component-callback-function)
正規表現の$と^を覚える方法（行頭、行末）

正規表現の行末($)と行頭(^)って覚えにくいですよね。今回はその覚え方を解説します。

## 正規表現の$と^を覚える方法（行頭、行末）
これは、Vimでのカーソル移動を覚えて頂ければ自然と馴染むことができます。
行末への移動には$を、行頭への移動には^を使いますよね。それと同じと覚えれば良いのです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Hugoでポートフォリオサイトを作ってみた

Hugoの[Academicテンプレート](https://themes.gohugo.io/academic/)でポートフォリオサイトを作ってみました。
GitHub Pagesを利用して公開しています。https://haruto830.github.io/portfolio/

作成手順を備忘録として。
## 前提
- Hugoがインストールされている環境であること
- GitHubにポートフォリオ用のリポジトリが作成されていること

## セットアップ
HugoのAcademicテンプレートを落としてきます。
今回は、[Portfolio]という名前のフォルダを作成します。

```
$ git clone https://github.com/sourcethemes/academic-kickstart.git Portfolio
$ cd Portfolio
$ git submodule update --init --recursive
```

テンプレートを落としてきたら、一旦Hugoをローカル実行してみます。

```
$ hugo server
```

`http://localhost:1313`にアクセスすると、デモページが表示されます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/215847/c3b70fd7-51cd-39a2-a13b-4004997e511d.png" width=80%>

## サイトの編集
デモページが表示されたら、内容を編集していきます。

```
Portfolio
|-- LICENSE.md
|-- README.md
|-- academic.Rproj
|-- config
|   `-- _default
|       |-- config.toml
|       |-- languages.toml
|       |-- menus.toml
|       `-- params.toml
|-- content
|   |-- author
|   |   `-- admin
|   |       |-- _index.md
|   |       `-- avatar.jpg
|   |-- home
|   |   |-- about.md
|   |   |-- accomplishments.md
|   |   |-- contact.md
|   |   |-- demo.md
|   |   |-- experience.md
|   |   |-- featured.md
|   |   |-- hero.md
|   |   |-- index.md
|   |   |-- people.md
|   |   |-- posts.md
|   |   |-- projects.md
|   |   |-- publications.md
|   |   |-- skills.md
|   |   |-- slider.md
|   |   |-- tags.md
|   |   `-- talks.md
|   |-- post
|   |   `-- _index.md
|   |-- publication
|   |   `-- _index.md
|   `-- talk
|       `-- _index.md
|-- netlify.toml
|-- scripts
|   `-- init_kickstart.sh
|-- static
|   `-- img
|-- themes
|   `-- academic
|       |-- LICENSE.md
|       ...
```

ページの編集は、基本的にcontent/home配下のファイルを更新していきます。
各ページのmdファイルがあるので、対応しているものを更新してきます。

使わないページは、対応するmdファイルを削除するか、mdファイル内の`active`を`active = false`に更新することで非表示になります。

各ページの編集方法は、ソースのコメント又は公式ドキュメントに記載されているので割愛。
[公式ドキュメント](https://sourcethemes.com/academic/docs/)

## ビルド
実行中の場合はHugoを停止し（[Ctl]+[c]）、`config.toml`の`baseurl`の設定を更新します。
予めGitHubに作成しておいた`portfolio`リポジトリのGithub Pagesを設定します。

```
baseurl = "https://<USERNAME>.github.io/portfolio"
```

ローカルでの動作確認が完了したら、以下コマンドでビルドします。

```
$ hugo 
```

ビルドが完了すると、publicフォルダ内に静的コンテンツが作成されます。

## デプロイ
今回は、GitHub Pagesを利用し、生成された静的コンテンツをホスティングします。 
予めGitHubに作成しておいた`portfolio`リポジトリにデプロイします。

```
$ cd public/
$ git init
$ git branch gh-pages
$ git checkout gh-pages
$ git add --all
$ git commit -m "Initial commit"

```

リモートリポジトリに`gh-pages`ブランチを作成します。

```
$ git remote add origin git@github.com:haruto830/portfolio.git
$ git remote -v
$ git push origin gh-pages
```

`gh-pages`ブランチに静的コンテンツをpushします。

GitHub Pagesにアクセスすると、pushしたpubicの内容が表示されます。
https://{username}.github.io/portfolio/

## 参考
[Hugo + GitHub Pagesでポートフォリオを作る](http://kohki.hatenablog.jp/entry/hugo-portfolio)
[HugoとGitHub Pagesで静的サイトを公開する](https://qiita.com/satzz/items/e24bd703fc04fb45f7ef)
UIは固まってほしくないがUIスレッドをその場で待機させたい

## 動機

`Window.ShowDialog()`を呼び出すとモーダルにWindowが表示されますが、このとき呼び出し側の処理はShowDialogしたところで止まったままで、表示されたWindowを閉じるとその続きが実行されるようになります。

こんな風に、UIスレッドの処理を（呼び出し元に復帰させずに）その場で待機させつつ、かつUIは固まらないようにする方法を紹介します。

用途としては、新しいWindowを作らずに（ダイアログとか使わずに）、既存のWindowの中でメッセージを表示するようなUIを実装する手段でしょうか。WindowsストアアプリのメッセージボックスみたいなUIをWPFのWindowの中に実装したい場合です。

単にメッセージを表示するだけなら突き放しで表示してもいいんですが、たとえばバックグランド処理の結果エラーが発生した場合にユーザーの応答によって次の処理を分岐したい、みたいな場合だと、ユーザーが応答するまで処理をブロックできれば綺麗な形で実装できると思います。

## 参考
メッセージループをアプリケーション内で複数作ってみる
http://posaune.hatenablog.com/entry/2013/05/21/010735

WPFでDoEventsを実現する 
http://ochi-lab.blogspot.com/2015/03/wpfdoevents.html

## 実装方法

UIスレッドでループさせると、そのループが終わるまでは呼び出し元に復帰しなくなりますが、代わりにUI自体が固まって「応答なし」になります。

そこで、UIスレッドでループを回して制御を足止めしつつ、画面上で起きたイベントの処理を自前で行うようにします。

```csharp
public void CustomShowDialog()
{
    // 前処理（例えばメッセージ表示用ViewのVisibilityを書き換えるなど）

    while (★)
    {
        // ここで★のフラグが変わるまでスレッドを足止めしつつUIが固まらないようにする
        Thread.Sleep(10);
        var frame = new DispatcherFrame();
        var callback = new DispatcherOperationCallback(obj =>
        {
            ((DispatcherFrame)obj).Continue = false;
            return null;
        });
        Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, callback, frame);
        Dispatcher.PushFrame(frame);
    }

    // 呼び出し元に復帰
}
```

「★」と書いた部分には処理の終了が分かるような判定式を書いてください（前述した例では、Viewに表示されたメッセージにユーザーが応答したときにフラグが書き換わるようにしておくとか）。

Sleepしてるのは普通にwhileループするとCPU使用率がめっちゃ高くなったからです。10って値は適当に入れたので各自で良い感じになるように調整してください。
displayプロパティの基本のキ

displayプロパティについての基本のまとめ。

#display プロパティの役割
displayプロパティは、ブッロクレベル・インライン・テーブル・ルビ・フレックスコンテナ等の、要素の表示形式を指定する場合に使用します。

#取ることの出来る値
1、block
2、inline
3、inline-block
4、none
他にもdisplayの値はあるが、基本のこの4つについて解説していこうと思う。

#display: blockについて
divタグやpタグ、h1~h6の見出しタグなどは、デフォルトでblockになっている。
#####特徴
要素の前後には改行が入り、縦に並ぶ。
幅と高さを指定できる。
paddingやmarginなどの余白も上下左右に指定できる。
text-alignやvertical-alignの指定はできない。

#display: inlineについて
spanタグやaタグ、imgタグなどはデフォルトでinlineになっている。

#####特徴

要素の間には改行が入らず横に並ぶ。
基本的にblockの中で用いられる。
widthとheightを指定できない。
左右のpadding,marginは指定できるが、上下の指定はできない。（paddingの上下は指定できるが、paddingを大きくすると、改行されたときに前後の行とかぶってしまいデザインが崩れるためあまり使用しないほうがいい。）
text-alignやvertical-alignが指定できる。

#display: inline-blockについて
inlineとblockの間を取ったようなもの。

#####特徴

改行が入らず横に並ぶ。
width、heightの指定ができる。
padding,marginの指定もできる。
text-alignやvertical-alignが指定できる。

使いどころはメニューバーなど。

#display: noneについて
この値を指定された要素は、ブラウザ上で非表示になります。
しかしあくまで非表示になるだけで、ウェブページが開かれるときには普通に読み込まれている。
Ruby on Railsでデータベースにカラムを追加する手順【マイグレーションファイル】

##はじめに 

ruby on rails 5.0でDBにカラムを追加する方法です。
progateをやっていて中々覚えられなかったので超簡潔にまとめました。

##手順

#####1. マイグレーションファイルの作成
#####2. マイグレーションファイルの編集
#####3. マイグレーションファイルのchangeメソッドの実行

###1.　まずはマイグレーションファイルの作成

マイグレーションファイルとは...DBのテーブルの設計書

```
$ rails g migration [ファイル名]
```

具体的には意図が分かる、かつ、_を入れて小文字のみでファイル名を決定する。

```
rails g migration add_password_to_users
```

###2.　次にマイグレーションファイルの編集

/db/migrate内に生成されたマイグレーションファイルのchangeメソッドに以下のように記述します。

```ruby:/db/migrate/migration_file.rb
class [自動生成されるクラス名] < ActiveRecord::Migration[5.0]
  def change
    add_column :[テーブル名], :[カラム名], :[データ型]
  end
end
```

具体的にはこんな感じ。

```ruby:/db/migrate/20190325~~~~~~add_password_to_users.rb
class AddPasswordToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :password, :string
  end
end
```
###3.　最後にマイグレーションファイルのchangeメソッドの実行

```
$ rails db:migrate
```

##終わりに
######参考にしたqiita記事
[マイグレーションファイルとスキーマファイルについて（migration, schema, rake）](https://qiita.com/ginokinh/items/837041594d72f8ed8da9)
[マイグレーションファイルの役割と生成](https://qiita.com/right1121/items/0a54ba76dc4261702d1e)
IOSTABCでアカウント作成～Chromeのウォレットにインポート

一番簡単に手早くさくっとIOSTのアカウント（＝銀行口座と捉えてください）を作る方法を記載します。

#IOSTABCにアクセス
こちらです👇
https://iostabc.com/

アクセスするとこんな画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/39453/e09fca8a-0077-5d03-415a-ab55b29e496e.png)
※もし中国語で表示されていたら、右上から英語にしましょう。残念ながら日本語は無いです(´・ω・`)
左メニューの「Create Account For Free」をクリックしてアカウント作成画面に移動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/39453/afcf4acd-6f53-7c2a-5ede-c09ab81cfeca.png)
まずは公開キー（公開鍵）の作成です。「Auto Generate」にチェックを入れると自動生成されるのでそれを使います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/39453/fbb8606e-1a23-037e-80e7-4f25c0788dae.png)
で「CREATE ACCOUNT」押したら晴れてアカウント作成…！のはずがエラーが出たらこちらをチェック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/39453/9bac64c2-d384-b6b0-a461-8afbb4fbaedb.png)
TwitterのIDと同じ仕組みで、同じアカウントID文字列は使えないのですね。チェックしたいときは画面上の検索フォームから好きなワードを入れてみましょう。もしこんな画面が出てきたらまだアカウントが存在していないということになります。チャンス！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/39453/851a7793-4631-ce9a-eb30-e3d3a8d3684b.png)

はい、ということで晴れて作成できたら次の画面に
・公開鍵
・アカウントID
・秘密鍵
・ネットワークID
などが表示されていると思います。必ずコピペしてローカルに保存してください。特に、秘密鍵無くすと二度とアカウント使えなくなりますので注意。もちろん他人に不用意に知られたら大変なことになりますので注意（これはビットコインも同じですね）

#Chromeのウォレットにインポート
さて、晴れてアカウント作成できたわけですが、その残高を確認したり、別の人に送金したりする時に必要なのがウォレットになります。
ウォレットは色々な会社がスマートフォン用に作ってたりしますが、今回はChromeの拡張機能のウォレットを使います。

こちらです👇
https://chrome.google.com/webstore/detail/iwallet/kncchdigobghenbbaddojjnnaogfppfj?utm_source=chrome-ntp-icon
通常の拡張機能と同じようにインストールすると、右上にIOSTのアイコンが出てきます。
クリックすると「IMPORT」というボタンが出てくるのでクリック。
![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/39453/699950a7-8aa3-88eb-be46-9ca6e1576065.png)
ここで先ほど発行したアカウントの秘密鍵を入力しましょう。これだけでウォレットのインポートは完了です！簡単ですね。
![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/39453/7f1cec6e-0b29-6a4e-1e0b-8e6469d02b9e.png)
こんな感じに表示されたら完了です。お疲れさまでした(´･ω･)つ旦

---

※秘密鍵をそのまま入力して～というのはセキュリティ的には本当はあまりよろしくないのは周知の通りです。
HuobiWalletなどではキーフレーズからの復元などにも対応しているので、そちらを使うのもオススメです。
Tensorflow Object Detection API : Google Colaboratory環境で学習を実行する（環境構築）

# はじめに
Google Colaboratory上でObject Detection APIを用いたモデルの学習を実行してみたので、環境構築から学習実行までの内容を共有します。今回は自宅で飼っている熱帯魚の検出を行ってみました。
今回は環境構築部分について共有します。

## Google Colaboratory
[Google Colaboratory](https://colab.research.google.com/)（以下Colab）は、機械学習の教育や研究用にGoogleから無償で提供されているJupyter Notebook環境です。GPU搭載環境も使用できます。
自宅には貧弱なPCしかないので、GPU搭載環境が無料で使用できてとてもありがたい！！

### GPUの有効化
[Colab](https://colab.research.google.com/)へアクセスして`「ランタイム」-> 「ランタイムタイプの変更」`を選択。
![runtime.png](https://qiita-image-store.s3.amazonaws.com/0/367744/f8d97b72-935e-3d29-06a8-0f4c1b06af58.png)

ハードウェアアクセラレータにGPUを選択して保存します。
![runtime2.png](https://qiita-image-store.s3.amazonaws.com/0/367744/ed4937fb-bc18-3333-f5ca-27108bc87644.png)


### 学習データの格納先
Colab環境では一定時間経つと自動で環境がシャットダウンされます。シャットダウンされるとColab環境上のファイルがリセットされてしまうため、学習データ等は別の場所に格納しておく必要があります。
格納先としては、Google Driveが便利です。
以下を実行すると簡単にGoogle DriveをColab環境上にマウントできます。
表示されたURLから認証キーを取得、入力フォームに認証キーを入力すればGoogle Driveのマイドライブが`/content/gdrive/My Drive/`にマウントされます。

```
from google.colab import drive
drive.mount('/content/gdrive')
```

今回は`/content/gdrive/My Drive/aqua`という作業ディレクトリで作業します。

## Object Detection APIの環境構築
一連の操作のJupyter Notebookを以下で公開してます。
https://gist.github.com/hirokikmr/3d73831beeec8e3342689ca6d9d329d3

基本的な流れは以下を参照しています。
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md
Colab上ではすでにインストール済みのものがあったりするので必要な操作のみ実施しています。


### Object Detection APIの取得
Google Driveがマウント済みの状態にしてください。
Google Drive上にObject Detection APIのソースを配置します。

```
%cd /content/gdrive/My\ Drive/aqua/
!git clone https://github.com/tensorflow/models.git
```

## COCO APIのインストール
COCO APIを使用しない場合は不要なようですがインストールしておきます。

```
%cd /content/gdrive/My\ Drive/aqua/
!git clone https://github.com/cocodataset/cocoapi.git
%cd cocoapi/PythonAPI
!make
!cp -r pycocotools /content/gdrive/My\ Drive/aqua/models/research/
```

## protoファイルのコンパイル

```
%cd /content/gdrive/My\ Drive/aqua/models/research/
!protoc object_detection/protos/*.proto --python_out=.
```

## テスト実行
以上でObject Detection APIの実行環境構築は完了です。テストプログラムが問題なく実行できるか確認してください。

```
%cd /content/gdrive/My\ Drive/aqua/models/research/
%env PYTHONPATH=/env/python:/content/gdrive/My Drive/aqua/models/research/:/content/gdrive/My Drive/aqua/models/research/slim
%env
!python object_detection/builders/model_builder_test.py
```

実行結果の最後に以下が表示されれば問題ありません。

```
----------------------------------------------------------------------
Ran 22 tests in 0.139s

OK (skipped=1)
```

これで環境構築は完了です。学習の実行については別記事で説明しようと思います。
Visual studio codeで.vscodeディレクトリをgit管理から外す

VisualStudiocodeのTips。

## 背景
visual studio codeは、workspace内全てのファイルをgit管理対象にする。
よってworkspace直下の.vscodeディレクトリの中に生成される設定ファイルも差分として扱われる。

環境弄ったりしてるとこの設定ファイル等が結構溜まってしまい、
本来管理したいファイルが見づらくなってしまうことがある。（↓）
<img src="https://qiita-image-store.s3.amazonaws.com/0/284450/94edeebb-57d5-1a8b-8137-f1fd06a236ff.png" width=60%>

一案として、
右クリック⇒「ファイルを.gitignoreに追加」から、管理したくないファイルのみgit管理から除外できるが、
一つ一つ外す作業が面倒＆任意の名前で新たに自動生成されると無意味、というデメリットがある。

**⇒.vscode内に生成されるフォルダ全部を管理対象外にしたい。**

## やりかた

前置きの割には超簡単。
**1: workspace直下で「新しいファイル」アイコンを押し、「.gitignore」を生成。**
**2: 「.gitignore」ファイルを編集し、.vscode/と記載。**

```text:.gitignore
.vscode/
```

**3: .vscode直下のファイルがgit管理対象から消える。スッキリ**
![gitignore2.png](https://qiita-image-store.s3.amazonaws.com/0/284450/d89c2726-cf7e-10c3-6260-808b78271da5.png)


**補足**
もちろん、gitignoreに下の階層のディレクトリやファイル単体を指定することも可能。

```text:.gitignore
.vscode/ipch/
abc105/abc105_d.cpp
```

(ファイル単体を無視したい場合は、gitのタブ上で右クリック⇒「ファイルを.gitignoreに追加」で、自動的に該当ファイルのパスがgitignoreに追加される。)


## 参考
[.gitignoreの仕様詳解](https://qiita.com/anqooqie/items/110957797b3d5280c44f)
アクセス修飾子について

java初学者です。
今回はアクセス修飾子についてアウトプットさせていただきます。
#Q1: アクセス修飾子とは？
・メソッドや変数に対してアクセスできる範囲を決めるものです
　[和訳] **access**(アクセス) : 立ち入り、接近、出入り
#具体的なアクセス修飾子(4つ)のアクセス有効範囲
①**public**：どこからでもアクセスできる

②**修飾子な**し：同じパッケージの中のみ

③**private**:同じクラス内のみ

④**protected**：同じパッケージのクラス内　又は　サブクラス

※サブクラスとは？: 継承によって親クラス（スーパークラス）のフィールドとメソッドを受け継いだクラスのこと。
[サブクラス詳細](https://qiita.com/BumpeiShimada/items/938cdee35d0a213434a3)
#アクセス修飾子を使うタイミング
publicや修飾子なしのパターンは自由なので特にありません。
**private**と**protected**は特徴があります。

`・private`: 外部からのアクセスを絶対に防がないといけない場所に使う
（個人情報を取得している場所など）
決められたメソッドからしかアクセスができなくなる。

`・protected`：　変数かメソッドにしか使えない


**[参考にさせていただいたサイト]**
https://www.sejuku.net/blog/22679

※間違い等ありましたら、恐れ入りますがコメント欄から教えていただけると幸いです。※
アリババクラウドのBaaS-Hyperledger Fabric(一)

## 概要
Hyperledger Fabricは、コンソーシアムチェーンの代表として、すでに広く認められています。しかし、プロジェクトの運用では、環境構築や配置、dockerコンテナ管理、組織の追加などの問題で大量な工数を掛かりました。最近、アリババクラウドの新しいサービス【BaaS(Blockchain as a Service)】が公開されたので、私たちは上記の課題が解決するとともに、業務の設計に集中に対応することができるようになります。

------

## 1.BaaSの全体
![图片1.jpg](https://qiita-image-store.s3.amazonaws.com/0/384991/88d0f7ea-c083-4ab5-7088-33f86c9dfe25.jpeg)

## 2.BaaSで構築した環境(Hyperledger Fabric)
#### 2.1.コンソーシアム(保険)と組織(保険001、保険002)
<img width="768" alt="1.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/b4c24b97-c96a-0488-92c0-5348aeff846d.jpeg">
#### 2.2.コンソーシアムの中身
<img width="784" alt="2.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/2ef47977-908a-c5bf-e2fa-1e44054d4a27.jpeg">
<img width="776" alt="3.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/801aec97-0e56-ef64-fe05-bd7b32077ecb.jpeg">
<img width="776" alt="4.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/aa4e878b-e868-9255-1e06-136ed20aa2ad.jpeg">
<img width="749" alt="5.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/0f8b8b73-8da2-b652-66b0-34f2ec108d02.jpeg">
#### 2.3 組織の中身
<img width="772" alt="6.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/54e156cb-75c2-9eef-a8b3-2943272c6141.jpeg">
<img width="782" alt="7.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/70f53cd4-6c25-b778-2f27-35e1f091ea0b.jpeg">
<img width="783" alt="8.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/fdd13c33-67c4-9461-c351-a750bc4bb1a1.jpeg">
<img width="775" alt="9.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/10ef218c-44a4-e8a1-9a8f-e15dfb176fcd.jpeg">
<img width="782" alt="10.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/77409eeb-4a1c-9aaf-0b2b-2c7787ab6331.jpeg">

#### 2.4.peerのログ
<img width="783" alt="11.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/1dda3d57-d0bd-1955-e547-eeb90839e439.jpeg">
#### 2.5.ordererのログ
<img width="780" alt="12.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/384991/3e0da546-ed4b-961e-7689-32e931dcc1f1.jpeg">

------
## 3.まとめ
大体1時間ぐらいに、簡単なビジネスレベルの環境が作ることができました。
具体的な操作は、以下のイベントで紹介致します。

https://internetchamp.connpass.com/event/123995/

以上
【Java】jaee j2ee ってなんだ

このページではJavaを触れていて、
私がしょっちゅうわからんくなった
ワードについて解説したいと思います。

具体的には下記

Java SE(J2SE）、Java EE(J2EE)、
Java ME(J2ME)、JRE、JDK(J2SDK)

###1.JavaSE（J2SE）って？

正式名称はJava Platform, Standard Edition　という名称とのことです。
（J2SEは過去の旧称らしいです）
Weblio辞書を見てみると
> Java仮想マシンやJava APIなどの集合体のことである。主要なJava言語に関するパッケージが一通り含まれており、正式名称である「Java Platform, Standard Edition」よりはJ2SEやJava SEと表記されることが多い


なるほどわからん。

調べてみると
StandardEditionということなので
基本的なセット、　Javaを使用する際には必要な標準的な「セット」
と考えると良いとのことでした。


よくよく調べてみますとJVM（Java　virtual　Machine）は
この中に同梱されているようですね。
なのでJavaを使用するときには基本的に必須になるというセットと認識されると良いでしょう。

###2.Java EE(J2EE)、って？

Java　Enterprise　Edition
エンタープライズ開発用(Enterprise Edition)
和訳するとこんな感じですね。

エンタープライズ＝法人用という意味らしいですが、
企業用ということもあり、大規模開発向けのセットということですね。
ServletなどのWeb開発等でも使用できる
等もこの中に含まれているので
JavaSEと比較して、**JavaSEはデスクトップ上で動かせるキット**に対し、
JavaEEは**Web上でも動かせるので、より動かせる範囲の広いキット**と思うと良いでしょう。

JavaSE＝Webを使わない小規模なシステム開発向け
JavaEE＝Webを使用しても開発が可能な大規模開発向け


###3.Java ME(J2ME)

公式ページより引用
>Java Platform, Micro Edition (Java ME) は、携帯電話、セットトップボックス、Blu-ray Disc プレーヤー、デジタルメディアデバイス、M2M モジュール、プリンタなど、モバイルおよび組み込みデバイス環境で実行するアプリケーションのための堅牢で柔軟な環境を提供します。
>Java ME テクノロジーは、元来、小型デバイス向けのアプリケーションの構築に付随する制約に対処するために作成されました。この目的で、Oracle は Java ME テクノロジーの基礎をそのような制限環境に合わせて定義し、メモリ、ディスプレイ、電源容量の限られた小型デバイスで実行する Java アプリケーションを作成できるようにしています。

なるほど（）

わかりやすくまとめると
・組み込みデバイス向けのEditionだよ
・小型デバイス向けのアプリケーションの構築に対処するために作ったよ
・組み込み系向けだよ。（大事なことなので二回）

要はC#、C++みたいな組み込み向けに作られたJavaということですね。
具体的に何が違うかはわかりません（）

###4.JRE、JDK(J2SDK)

はい。本題です。

JRE　　正式名称は(Java Runtime Environment) 
JVMと基本ライブラリーを主とした、Javaアプリケーションを実行するための環境です。  

JDK　正式名称(Java Development Kit)で、
JREに、コンパイラー(javac)やアプリケーション開発に必要なツール(javadoc,jarほか多数)を加えたものです。  

なるほど（）状態なので一つ一つ分解しましょう。

**「JREではJVMと基本ライブラリーを主としている」**
JVM＝先述したJava virtual machineですね。
これを動かすための基本的な実行環境ということになります。

じゃあ実行環境って？

プログラムの基本的な構造として、

**ソースコードを書く＞はい終わり！！！**

じゃなくて、そのソースコードをまとめて動かしてくれる環境があって
初めてソースコードが動くわけです。

JREはそのまとめて動かしてくれる環境がしっかり入った「環境」と思うと良いでしょう。


#####次、JDK

>JDK　正式名称(Java Development Kit)で、
JREに、コンパイラー(javac)やアプリケーション開発に必要なツール(javadoc,jarほか多数)を加えたものです。  

はい、上に書いてある通り、JREにさらに開発しやすくなるようにいろいろ詰め込んだキット
ということになります。
コンパイラー＝実はソースコードをPC（OS）でもわかるように翻訳して動かしてくれているのが
このコンパイラーになります。（コンパイル＝翻訳）

まとめるとこんな感じ
**ソースコード：人間語で書いたプログラムの元ネタ**
**バイナリコード：コンピュータさんが分かる言葉で書かれたプログラム**
**コンパイル：人間語（ソースコード）を機械語（バイナリコード）に変換する作業**

その他、アプリケーション開発やら、私たちが日常的に使っているかどうかわかりませんが
関数等もJarの中に先駆者達が作ってくれたものが詰め込んであります。

時には感謝しつつ、時にはなんでこの機能入ってねえんだよと憤りつつ
でも感謝しながら使うようにしましょう。

**まとめ**
結局どういうことだってばよ？って人に。
>Java SE(J2SE）Webを使わない小規模なシステム開発向けのエディションセット
Java EE(J2EE) Webを使用しても開発が可能な大規模開発向けエディションセット
Java ME(J2ME)　MP3プレイヤーとか組み込み向けのセット
JRE　　　　　　ソースコードを組んだ時に、まとめて動かしてくれる環境
JDK(J2SDK)　　開発する際に開発しやすくなるようにいろいろ詰めてくれてるキット

料理にたとえるなら
>Java SE(J2SE）　最低限の調理セット（包丁・まないた・フライパン）
Java EE(J2EE) 　見せるようにいろいろ準備した調理セット（食器とか設備も良いの使ってる）
Java ME(J2ME)　調理ばさみとか特殊な場合に便利な調理器具
　　　　　　　　（スクレイパーとか和菓子職人さんが使うはさみとか）
JRE　　　　　　具材を混ぜたらはいできあがり！！！ってしてくれるセット
JDK(J2SDK)　　調理をしやすくしてくれる細かな気配りができた設備・環境


急ぎ足件、ざっくりとしたまとめになってしまいますが、
以上となります。何らか参考になれば幸いです。
コンテナでPlay Frameworkの開発環境を構築する


掲題の件で、なかなか手ごろな情報が世の中になかったので、その共有

#### ホスト

- まずは、テンプレートリポジトリをclone

<pre><code>git clone https://github.com/playframework/play-scala-hello-world-tutorial.git</pre></code>

もちろんzipをダウンロードしてもよか
> https://www.playframework.com/getting-started

- プロジェクトルートに移動

<pre><code>cd play-scala-hello-world-tutorial</pre</code>

- コンテナを起動してアタッチ


<pre><code>docker run -it -v $PWD:/app -p 9000:9000 hseeberger/scala-sbt bash</pre></code>

> playはデフォルトで9000番ポートをlistenします
> hogehoge/play-frameworkみたいなイメージは全部うまくいきませんでした。w
> hseebergerさん。だんけしぇーん。※ hseebergerさんはほんとにドイツ人でした

#### コンテナ

- アプリルートへ移動

<pre><code>cd /app</pre></code>

- ビルドしてrun

<pre><code>sbt run</pre></code>

以下のようなログが出ればとりあえずビルドが始まっています

<pre><code>Getting org.scala-sbt sbt 1.2.8  (this may take some time)...</pre></code>

> アホみたいに時間がかかるので、ジョジョの７部でも読んで時間を潰して下さい。
> 追記：ほんまに時間がかかるので、昼飯でも食べに行って下さい。ここでめげないで。

<pre><code>[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0.0.0.0:9000

(Server started, use Enter to stop and go back to the console...)</pre></code>

っていうのが出たら、ブラウザからアクセス

http://localhost:9000

はい。こっからまたコンパイルが始まります...

グッとこらえて。

<pre><code>[info] p.a.h.EnabledFilters - Enabled Filters (see <https://www.playframework.com/documentation/latest/Filters>):
    play.filters.csrf.CSRFFilter
    play.filters.headers.SecurityHeadersFilter
    play.filters.hosts.AllowedHostsFilter
[info] play.api.Play - Application started (Dev) (no global state)
</pre></code>

と出れば成功です。

以下のような画面が表示されているはずです。

<img width="1280" alt="スクリーンショット 2019-03-25 23.07.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/258195/7849dd35-6a5b-6572-0fb7-66856fd37494.png">

なんとか開発環境をつくることができました。

#### 最後に

今後の投稿で、play frameworkの中身の話ができたらと思います。

ありがとうございました。

#### 参考
- https://www.playframework.com/getting-started
bash/条件式の例/[ , ] , test , [[ , ]] の違い

# なんとなく使っているけど、よくわかっていないこと, [ ] / test / [[ ]] の違い

## １．前提
　[      外部コマンド・・・実体は、/usr/bin/[
　test   外部コマンド・・・実体は、/usr/bin/test
　[[     bashの内部コマンド

### 結論から言えば、条件式は
　[[ ]] を使って、 == != < > <= >= とする
　[ ] は、文字列を対象に、== != か、
　整数を対象に　-eq -ne,,, だけ使うということだ。

## ２．[ (test)　と　[[ の違い
~~~
　　　　　　[ test 　[[ ]]
文字列　＝　　　○　　　　●
文字列　！＝　　○　　　　●
文字列　＜　　　▲　　　　●
文字列　＞　　　▲　　　　●

整数　　−ｅｑ　○　　　　△
整数　　−ｎｅ　○　　　　△
整数　　−ｌｔ　○　　　　△
整数　　−ｇｔ　○　　　　△
~~~
### [ test のハマリポイント
▲       [ “a” > “b” ]　とすると、[ コマンドを引数”a”で動かして、
その、リダイレクト出力が“ｂ”になる。
その結果、ファイル　ｂ　が作成される。

▲       [ “a” < “b” ]　とすると、[ コマンドを引数”a”で動かして、
その、リダイレクト入力が“ｂ”になる。
ファイル　ｂ　があれば、なんか動いてしまう。
ファイル　ｂ　がなければ、ファイルｂがないとエラーになる。

△        [[ -eq -ne -lt -get ]]は、整数に対してだけ正しく
文字列を評価した場合は、想定外動作をする（エラーＭＳＧもない）
　　　文字列１　−ｅｑ　文字列２　・・・　無条件にＴＲＵＥ
　　　文字列１　−以外　文字列２　・・・　無条件にＦＡＬＳＥ

●       [[ = == != < > ]]は、文字列・整数のいずれにも想定動作する

## ３．検証結果
### [ test ＃文字列
~~~
$ [ "a" = "a"  ] && echo "ok"
ok
$ [ "a" != "a" ] && echo "ok"
$ [ "a" = "b"  ] && echo "ok"
$ [ "a" != "b" ] && echo "ok"
ok
$ [ "a" < "b" ] && echo "ok"
-bash: b: そのようなファイルやディレクトリはありません
~~~

### [ test ＃整数
~~~
$ [ 1 = 1   ] && echo "ok"
ok
$ [ 1 != 1  ] && echo "ok"
$ [ 0 -lt 1 ] && echo "ok"
ok
$ [ 0 < 1 ] && echo "ok"
-bash: 1: そのようなファイルやディレクトリはありません
~~~

### [[ ]] #文字列
~~~
$ [[ "a" = "a"  ]] && echo "ok"
ok
$ [[ "a" != "a" ]] && echo "ok"
$ [[ "a" != "b" ]] && echo "ok"
ok
$ [[ "a" == "a" ]] && echo "ok"
ok
$ [[ "a" < "a"  ]] && echo "ok"
$ [[ "a" < "b"  ]] && echo "ok"
ok
~~~
eyed3 / mp3のtag情報をpythonで操作する

## mp3の情報を操作する
```python
import eyed3

audiofile = eyed3.load("song.mp3")
audiofile.tag.artist = u"Nobunny"
audiofile.tag.album = u"Love Visions"
audiofile.tag.title = u"I Am a Girlfriend"
audiofile.tag.track_num = 4
audiofile.tag.save()
```

## python自作プログラム
```python
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
import    os
import    sys
import    glob
import    eyed3


def    prtinfo( songfile, song ):
    print    "sonffile:", songfile
    print    "title   :", song.tag.title
    print    "artist  :", song.tag.artist
    print    "album   :", song.tag.album
    print    "a_artist:", song.tag.album_artist
    print    "track   :", song.tag.track_num
    # print song.tag.frame_set

def    prtinfo2( songfile, song ):
    frame=song.tag.frame_set[ 'TXXX' ]
    if frame is None:
        return
    else:
        for x in frame:
            print x.description, "=>", x.text

def delUserTextFrame( sonfgile, song ):
    frame=song.tag.frame_set[ 'TXXX' ]
    if frame is None:
        return
    else:
        del frame[:]
    pass



'''=====
main
'''

for argv in sys.argv[ 1: ] :
    songfile=argv
    song=eyed3.load( songfile )

    print "==== MP3 tags ===="
    prtinfo( songfile, song )
    print "==== User Text Frame ===="
    prtinfo2( songfile, song )
    delUserTextFrame( songfile, song )

    # prtinfo()
    # prtinfo2()
    song.tag.save()
```



## eyeD3 コマンド
```
eyeD3 hoge.mp3
eyeD3 --help
# タグの削除
eyeD3 --user-text-frame '93A74BEA-CE97-5571-A56A-C5084DBA9873:' *.mp3
eyeD3 --remove-all-comments *.mp3
```
denite.nvimのFloating Windowオプションを使おう

皆さんNeoVim v4.0から追加される予定のFloating Windowという機能はご存じでしょうか？
既存のウィンドウの上部に重ねて表示できるウィンドウです。
最近のモダンなエディタなんかだとなんかFunctionにカーソル合わせたときに表示されるアレです。アレ。

私は以下の記事で存在を知りました。

- [Neovim のフロートウィンドウ機能を使って git-messenger.vim をつくりなおした](https://rhysd.hatenablog.com/entry/2019/03/10/230119)

話は変わりますが、私はVimのインタラクティブフィルターとして、もっぱら[denite.nvim](https://github.com/Shougo/denite.nvim)推しです。
fzf.vimに浮気したりもしてますが、最終的にdeniteに戻ります。
がしかし、そんな私も少しだけdeniteに気になる点がありました。
deniteを起動したときに、既存のウィンドウがグイッと押し上げられるように見えるのです。
もっともこれはdeniteではなくVimの制約なので、どのインタラクティブフィルタでも同様の動きになりますが。

Floating Windowが気になって自分でVim scriptをいじいじして、ほえーこんなんなのかー。
と遊んでいたとき、Floating Windowがあればウィンドウグイッと問題が解決できるのではとひらめきました。

よーしPR作っちゃうぞと思ってdeniteのPRページに飛んでみると、
なんと。既に実装が完了していました。スバラシイ！

というわけでdeniteのFloating Windowを有効化するといい感じになります。

![denite-floating-window.gif](https://qiita-image-store.s3.amazonaws.com/0/24610/50ad8364-fe82-fd48-63c6-20210357ccb3.gif)

参考までに私の設定を以下にのっけておきます。デフォルトは少しウィンドウが狭いので広げてあります。@
Floating Windowが実装されたHEADのNeoVimでしか動かないので、あしからず。

```vim
let s:denite_win_width_percent = 0.85
let s:denite_win_height_percent = 0.7

" Change denite default options
call denite#custom#option('default', {
    \ 'split': 'floating',
    \ 'winwidth': float2nr(&columns * s:denite_win_width_percent),
    \ 'wincol': float2nr((&columns - (&columns * s:denite_win_width_percent)) / 2),
    \ 'winheight': float2nr(&lines * s:denite_win_height_percent),
    \ 'winrow': float2nr((&lines - (&lines * s:denite_win_height_percent)) / 2),
    \ })

```
ES Lint 使いたいけど VS Code が勝手にダブルクオートの置換をするのでうざい

# ES Lint 使いたいけど VS Code が勝手にダブルクオートの置換をするのでうざい

Vue CLI で AirBnB の ES Lint 設定をしたけど、VS Code が勝手に文法修正するので文法エラーのアラートが消えない

## 試したこと

### プラグイン

以下が有効になっていたのでワークスペース無効にした

- `Beautify`
- `Prettier`

### VS Code 設定

- `Vetur > Format > Default Formatter:JS -> none にする`
- `Pretter:Single Quote -> true にする`

VS Code で開いているファイルを開き直さないと反映されないことがある気がする
変更したらローカルサーバも再起動した方がいい気がする
CSS3のremについてのまとめ

CSS3のremについてまとめてみる。

#remとは？ 
font-sizeプロパティの値の単位に使用されるのが多いのはpxやemですが、CSS3から新しくremという単位が新しく追加された。「root + em」の略。

#emとの違いは？
emは親要素を1とした倍率を指定するが、remはルート要素（HTML文書ならhtml要素）のfont-sizeを1とした倍率を指定する。

```HTML:index.html
<div class="parent">
    親要素の文
  <div class="child">
　　子要素の文
  </div>
</div>
```

上記のhtmlのfont-sizeをemで指定した場合。

```css:style.css
html {
  font-size: 10px;
}
.parent {
  font-size: 1.2em;  /*10px(html)*1.2 = 12px*/
}
.child {
  font-size: 1.2em;  /*12px(.parent)*1.2 = 14.4px*/
}
```

emで指定した場合、それぞれの親要素を基準とするため、指定の仕方がやや複雑になる。

一方remで指定した場合は下記

```css:style.css
html {
  font-size: 10px;
}
.parent {
  font-size: 1.2rem;  /*10px(html)*1.2 = 12px*/
}
.child {
  font-size: 1.2rem;  /*10px(html)*1.2 = 12px*/
}
```

となる。
親要素のfont-sizeプロパティの値を意識せず、常にhtml要素を基準に倍率を指定すればいいため管理がemに比べて楽。

#remを使用する場合のポイント

remを使用する際、html要素のfont-sizeは%指定されることが一般的らしい。なぜかと言うと、px指定ではなく％指定にしておくことで、ユーザーがブラウザの設定でデフォルトの文字サイズを変更していた場合にもある程度その設定を反映することができる。
主要なブラウザのデフォルトフォントサイズは16pxなので、62.5%を指定して10px相当にします。そうするとremで指定するときに楽になる。

```css:style.css
html {
  font-size: 62.5%;  /*デフォルトが16pxなので　16px × 62.5% = 10px*/
}
.parent {
  font-size: 12rem;  /*htmlが62.5%の10pxなので　10px × 1.2 = 12pxとなる*/
 }
```
scp, wget,curlの違い

## 使用可能プロトコル
~~~
       Protocol            Recursive Symlink
==============================================================
scp    ssh                 o         
wget   ftp,http            o
curl   ftp,http,sftp,scp   x
rsync  ssh                 o         NotFollow
~~~

## scpはrecursive可能
~~~
scp -r -p  user@host://etc/*  /.../ToDdir
~~~

## ftpはhomedirを起点とするので、任意のディレクトリをコピーするコツ
### 絶対パスは、homedir起点
ユーザのhome-dirを起点にftpするので、ディレクトリがあわない

~~~
curl --user USER:PASS ftp://formhost/Fromdir
wget --ftp-user=USER --ftp-password=PASS ftp://fromhost/Fromdir
~~~

### home-dirから無理やり相対パス指定する
ユーザのhome-dirを起点にftpするので、相対指定する。

~~~
wget --ftp-user=USER --ftp-password=PASS ftp://fromhost/../../etc/hosts
curl --user USER:PASS ftp://fromhost/../../etc/hosts
~~~
Springの歴史と構成

# Spring Frameworkのバージョン遷移

| バージョン | 年度 | 内容 |
|:-:|:-:|:-:|
|1.0   | 2004  | DIコンテナ, AOP, XMLベースのBean定義等  |
|2.0   | 2006  | Spring Securityなどの周辺プロジェクト  |
|2.5   | 2007  | アノテーションベースのDI, MVC対応  |
|3.0   | 2009  | Javaベースコンフィグレーション BeanVaridetion |
|4.0   | 2013  | WebSocket, Webメッセージングのサポート  |

# 開発思想
・J2EEでの複雑な開発を避けるため、軽量フレームワークを目的として作られた。
・しかし、長い時が経ち規模が大きくなり「軽量」⇒「重厚」となった。

# 各プロジェクトの特徴
## Spring MVC
・MVCパターンを採用したWebアプリケーションフレームワーク
・MVCパターンのフレームワークは他にStrutsやJSFがある。
・MVCには二種類ある。
  1.アクションベースフレームワーク
　　・リクエストによって実行する処理を決定する。
　　・Spring MVCやStrutsが該当する。
  2.コンポーネントベースフレームワーク
　　・画面の構成部品をベースとする。
　　・JSFが該当する。
・様々なサードパーティライブラリと連携が可能
　（ex. Hibernate Varidator）


## Spring Security

・認証(Authentication)と認可(Authorization)を実現するためのフレームワーク
・多くの認証方式を提供し「サードパーティ製」「Spring提供」「独自実装」と
　様々な選択が可能。


## Spring Data

・DBへのアクセス処理を容易にするためのライブラリ。

・以下のように様々な機能で構成される。
　- Spring Data Commons
　　・データアクセスに必要な共通的なインターフェース(Repositoryインターフェース)を提供
　- Spring data JPA
　　・JPAを用いたデータアクセスを行うために、Repositoryインターフェースの実装を最小限にする
　　　仕組みを提供
　- etc

## Spring Batch
・バッチ処理を行うための共通部品を提供する軽量フレームワーク
・以下の処理を行う。
　- 大容量のデータ処理
　- ファイルやDBへの入出力処理
　- トランザクション管理
　- リソース管理
・類似したフレームワークに jBatch がある。

## Spring Integration

・システム間連携を行うために、非同期メッセージ駆動型アプリケーションの仕組みを提供

## Spring Cloud
・Cloudを利用した開発のためのフレームワーク？
・多くのサブプロジェクトで構成される。

## Spring Tool Suite
・Springアプリケーションの開発に特化したEclipseベースの統合開発環境
・MavenやGitなどの開発に必要なソフトウェアが同梱されている。

## Spring IO Platform
・Springやサードパーティの各ライブラリのバージョンを決定し依存関係を解決するためのプロジェクト。
・2014年にver1.0がリリースされている。

## Spring Boot
・Spring特有の煩わしいxmlによる様々な定義が不要になる。
・アプリケーションサーバへのデプロイが不要になる。
・簡単にSpringアプリケーションを開発することを目的に開発された。
・2014年にver1.0がリリースされている。