OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7.4に固定IPを設定

# はじめに

前回の[VirtualBoxにCentOS 7.4をインストール](https://qiita.com/tak_hos/items/aa273a18efde6a8ecfab "VirtualBoxにCentOS 7.4をインストール")からの続き
初期設定しようと思ったけど。。。
minimalでインストール直後だと、
ネットワーク設定されてないので、yumができない！
また、VirtualBoxのコンソールだと、使い勝手が悪い！

ということで、固定IPにしてターミナルソフトでssh接続してみる！！！

【構成】
Windows7 Pro(32bit)
VirtualBox 5.2.8
CentOS 7.4.1708

# CentOS7.4に固定IPを設定し、ssh接続
* VirtualBoxからCentOS7を通常起動
* rootユーザーでログイン
* ネットワーク・インターフェースの設定ファイルを確認

```
# cd /etc/sysconfig/network-scripts/
# ls
ifcfg-enp0s3  ifdown-Team      ifdown-ippp  ifdown-ppp     ifup           ifup-bnep  ifup-isdn   ifup-ppp     ifup-wireless
ifcfg-enp0s8  ifdown-TeamPort  ifdown-ipv6  ifdown-routes  ifup-Team      ifup-eth   ifup-plip   ifup-routes  init.ipv6-global
ifcfg-lo      ifdown-bnep      ifdown-isdn  ifdown-sit     ifup-TeamPort  ifup-ippp  ifup-plusb  ifup-sit     network-functions
ifdown        ifdown-eth       ifdown-post  ifdown-tunnel  ifup-aliases   ifup-ipv6  ifup-post   ifup-tunnel  network-functions-ipv6
```
ifcfg-enp0s3、ifcfg-enp0s8が修正対象

* ifcfg-enp0s3を修正

```bash:修正前
# cat ifcfg-enp0s3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=c81a569b-b6e4-4b67-88ee-5e36a0fcddcd
DEVICE=enp0s3
ONBOOT=no
```

```bash:修正
# vi ifcfg-enp0s3
ONBOOT=no
↓
ONBOOT=yes
```

```bash:修正後
# cat ifcfg-enp0s3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=c81a569b-b6e4-4b67-88ee-5e36a0fcddcd
DEVICE=enp0s3
ONBOOT=yes
```
* ifcfg-enp0s8を修正

```bash:修正前
# cat ifcfg-enp0s8
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s8
UUID=ed234458-6637-475f-9738-9da339e4a9a1
DEVICE=enp0s8
ONBOOT=no
```

```bash:修正
# vi ifcfg-enp0s8
BOOTPROTO=dhcp
↓
BOOTPROTO=none

IPV6INIT=yes
↓
IPV6INIT=no

ONBOOT=no
↓
ONBOOT=yes

最後尾に以下を追加（IPADDRは、適宜修正）
IPADDR=192.168.56.110
NETMASK=255.255.255.0
```

```bash:修正後
# cat ifcfg-enp0s8
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s8
UUID=ed234458-6637-475f-9738-9da339e4a9a1
DEVICE=enp0s8
ONBOOT=yes
IPADDR=192.168.56.110
NETMASK=255.255.255.0
```

* ネットワークの再起動

```
# systemctl restart network
```

* teratermなど、ターミナルソフトでssh接続
S3に置いたhtmlファイルがブラウザダウンロードされてしまう時

# 現象
静的サイトとして設定しているS3に置いたHTMLが、アクセスするとダウンロードコンソールが表示されるようになっていた。
# 調査
ブラウザでアクセスし、開発ツールでネットワーク等でファイルタイプを確認すると、octet-streamと認識されていた。
# オプションでファイルタイプを指定する
```
aws s3 cp --content-type text/html ~/foo s3://foo-bucket/var --recursive
```
# 感想
複数人で管理しているS3だったので、クライアントソフトによっては勝手にcontent-typeが付与されてしまうのかも。
コンテンツをアップロードするときは--content-typeオプションを付与し忘れないように気をつけよう。
PHP: TCPDF だけで日本語を表示

TCPDF だけで、日本語を含む PDF を作成する方法です。


使ったバージョンは、

```text
$ grep Version /usr/share/php/tcpdf/tcpdf.php 
// Version     : 6.3.2
```

次のフォントが
/usr/share/php/tcpdf/fonts/ に含まれています。
>小塚ゴシックPro M (kozgopromedium)
>小塚明朝Pro M (kozminproregular)



サンプルのプログラム

```php:japanese01.php
#! /usr/bin/php
<?php
// ------------------------------------------------------------------
require_once('/usr/share/php/tcpdf/tcpdf.php');

$pdf = new TCPDF("L", "mm", "A4", true, "UTF-8" );
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->AddPage();

$pdf->SetFont('kozminproregular', '', 24);

$pdf->Text(0, 0, "alphabetica ABCDEFG" );
//
$pdf->Text(0, 15, "日本語を表示" );


$pdf->SetFont('kozgopromedium', '', 24);
$pdf->Text(0, 50, "日本語を表示" );

$pdf->Output();

// ------------------------------------------------------------------
?>
```

実行コマンド

```bash
./japanese01.php > out01.pdf
```

次の PDF ファイルが作成されます。
![tcpdf_jun1101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/98ca41ed-60fe-d41c-ed68-abe1bb4ed142.png)
DockerFileにif文(条件分岐)

# Dockerfile に IF文を書く

まず最初に**これはするべきではないです。**
Dockerfile はシンプルな記述をモットーにしている(とどこかで見た気がする)ので、
if や switch の構文など無いのです！

- 本来の正規で用意されているコマンド一覧はこちら

http://docs.docker.jp/engine/reference/builder.html

- それでもそこをなんとか…というときの力技

Dockerfile


``` 
ARG USE_SVN="1"

RUN if [ "${USE_SVN}" = "1" ]; then \
        echo "ここに1だったときのコマンド"; \
        例)yum install svn; \
    else \
        echo "ここに1じゃなかったときのコマンド"; \
fi
```

やりすぎると読みづらい Dockerfile ができて本末転倒なので、
どうしても！というときにのみ。
Platform Cacheについて

案件で得られた情報も含めて、個人用にまとめました

# プラットフォームキャッシュとは?
　組織レベルまたはユーザセッションレベルで、Key-Value型で任意の値を保持することが出来る機能で、VisualforceとApexから利用できます

# 目的
- データをキャッシュすることでパフォーマンスを改善

# 使える用途
- ViewStateに保持されるような情報
    - セッション全体を通して再利用されるデータ
    - 静的データ（急速に変化しない）
    - 取得にコストがかかるデータ

## セッションキャッシュ
- 個々のユーザセッションのデータ
   
## 組織キャッシュ
- 組織のユーザが再使用するデータ

# 気を付ける点
- セッションキャッシュの最大有効期間は 8 時間
- 日をまたいで情報を保持しておくような用途には使えない
- 組織キャッシュは最大 48 時間
- 容量　ユーザ毎に利用されるのでユーザ数が多い場合は計算が必要
- 新規環境にリリースするときにPlatfformCacheの設定を忘れがち
- データ損失を考慮する
- 明示的に保持期間を設定しておく

### その他
- キャッシュ内のデータは暗号化されません
- 非同期Apexでセッションキャッシュを利用することができない
- オーバーヘッドが増加するため小さな項目より大きな項目でキャッシュする

# キャッシュの制限
- Enterprise:10 MB
- Unlimited および Performance:30 MB
- その他すべて:	0 MB

- 最小パーティションサイズ:5 MB

### セッションキャッシュ
- 1 つのキャッシュ項目の最大サイズ :100KB
- Time to Live の最小値:5分
- Time to Live の最大値:８時間

### 組織キャッシュ
- 1 つのキャッシュ項目の最大サイズ :100KB
- Time to Live の最小値:5分
- Time to Live の最大値:48 時間

例）Enterprise:組織のキャッシュ制限が10MBの場合、セッションキャッシュ＋組織セッション＝10MB

# キャッシュパーティション
- キャッシュ空間を割り当ててアプリケーション間で使用量とパフォーマンスのバランスを取ることができます

プラットフォームキャッシュの基礎
https://trailhead.salesforce.com/ja/modules/platform_cache/units/platform_cache_get_started

プラットフォームキャッシュの考慮事項
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_platform_cache_limitations.htm
dockerの掃除

dockerでいろいろ作業していると、コンテナやイメージがたまってくるので、掃除方法のまとめ。
※18.03で確認

# 停止しているコンテナも含めたコンテナの一覧
```shell
docker ps -a
```

# 停止コンテナを一括で削除
```shell
docker container prune
```

# 未利用ボリュームを一括削除
```shell
docker volume prune
```

# 未利用イメージを一括で削除
```shell
docker image prune
```

# 停止コンテナ・未利用イメージ・未利用ボリュームを一括で削除
```shell
docker system prune
```
Go言語はじめました　その２

#はじめに
[前回](https://qiita.com/thimi0412/items/687ec466465dcdba79c1)は環境構築的なことしか行ってなかったので、今回は文法的なことをやっていこうと思います

#環境
<img width="539" alt="スクリーンショット 2018-04-04 11.24.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/62fb53d1-e1a2-22c6-356b-929ec25ade2b.png">


#実行とビルド
```golang:hello_world.go
package main

import "fmt"

func main() {
	fmt.Println("HelloWorld")
}
```

###実行
```
go run hello_world.go
```
まぁ普通に```HelloWorld```と出力されます

###ビルド

```
go build hello_world.go
```
hello_worldというUNIX実行ファイルが同ディレクトリにできました
そして以下のコマンドで実行できます

```
./hello_world
```
実行するとHelloWorldと出力されます
なんかJavaの```javac```コマンドを思い出しました

ぶっちゃけ今のところ ```go run```で実行するのと```go build```でビルドしてから実行することの利点がイマイチわかっていません（追々理解していこうと思います）

#基本文法
```golang

package main

import "fmt"

func main() {
	//宣言
	var num int
	var str string

	num = 0
	str = "hoge"

	fmt.Println(num, str)

	//変数初期化
	var num2 = 1
        num3 := 2
	var str2 = "go"

	//定数初期化
	const num4 = 3

	fmt.Printf("num2:%d num3:%d num4:%d str2:%s\n", num2, num3, num4 ,str2)
}
```
```
0 hoge
num2:1  num3:2 num4:3str2:go
```
変数は　```var```で定数は```const```なんかjavascriptっぽい気がする
今までやってきた言語はC, Java, Pythonですがまあ少し違うくらいでしたですが```num3 := 2```は初めてみました
定数では　```:=```を使用することができません


###Why fmt?
出力するのは謎の```fmt```というパッケージからPrint関数を呼び出して出力します
公式ドキュメントより

```
Package fmt implements formatted I/O with functions analogous to C's
    printf and scanf. The format 'verbs' are derived from C's but are
    simpler.
```
ざっくり言うと
C言語に似た```printf```や```scanf```といった関数を持っていて、 C言語から派生しているが単純化されている

ちなみにドキュメントは```godoc```と言うドキュメント閲覧ツールを使用して見ました

```:godocのインストール
go get golang.org/x/tools/cmd/godoc
```

```:fmtのドキュメントを見るとき
godoc fmt
```

godocに続けてパッケージ名を入力するとそのドキュメントが閲覧できます

#型の種類
- 真偽値型　
- 数値型
- 文字列型
- 構造体型
- ポインタ型
- マップ型
- 関数型
- チャンネル型
- スライス型

C言語で挫折したポインタがあるだとΣ(￣ロ￣''lll)
構造体も懐かしいC言語でやった記憶がある（覚えているとはいっていない）
チャンネル型とスライス型はなんだ？とりあえず[公式チュートリアル](https://go-tour-jp.appspot.com/)の途中なので今回はパスします

#パッケージのインポートと関数
```go
package main

import (
	"fmt"
	"math"
)

func showPi() {
	fmt.Println(math.Pi)
}

func add(x int, y int) int {
	return x + y
}

func main() {
	showPi()
	fmt.Println(add(4, 12))
}
```

複数のパッケージをインポートする際は```import```後ろに```()```内に記述します

引数のない関数```showPi```は```main関数```とそんなにからわない印象でした
引数と戻り値のある関数　```add```はパッと見た感じC言語の戻り値の型を後ろに移動した感じかなと思いました

###複数の戻り値
```go
package main

import (
	"fmt"
)

func change(x, y string) (string, string) {
	return y, x
}

func main() {
	a, b := change("Hello", "World")
	fmt.Println(a, b)
}
```
関数の引数が2つ以上で型が同じなら　```(x, y string)```と省略できる
```(string string)```で戻り値も複数返せます

###naked return
```go

func hanbun(num int) (x, y int) {
	x = num / 2
	y = num % 2
	return
}

func main() {
	fmt.Println(hanbun(5))
	a, b := hanbun(8)
	fmt.Println(a, b)
}
```
```
2 1
4 0
```

戻り値に変数名をつけることで```return```の後にリターンステートメントを付けずに戻り値を返すことができます
これを```naked return```と呼ぶそうですnakedの意味が裸、ありのまま、露骨のような意味があるようなのですが```naked return```の意味はよくわかりません
Ubuntu 16.04LTSにROS Kineticをインストールする

# ROSのインストール時の情報まとめ

ROSを使う必要が出てきたので、勉強と備忘録をかねて、情報集約をしておく。
どこのまとめ情報をみても、同じような感じで、とくに問題なくインストールできた。

## 参考にした情報

[ROS Kinetic の Ubuntu へのインストール]
(http://wiki.ros.org/ja/kinetic/Installation/Ubuntu)

[ubuntu 16.04にROS kineticをインストールする]
(http://blog-sk.com/ubuntu/ubuntu-16-04-ros-kinetic/)

## ソースリストと鍵の設定
packages.ros.org からソフトウェアを受容するための設定

```
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
```

鍵の設定

```
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
```

## インストール

ubuntuのアップデート

```
$ sudo apt-get update 
```

ROSのインストール
4種類のパッケージがあるので、合ったものを選択できる。

- すべてのデスクトップ環境：ROS, rqt, rviz, ロボットの一般的なライブラリ、2D/3Dシミュレータ、ナビゲーション、2D/3D認識

```
$ sudo apt-get install ros-kinetic-desktop-full 
```

とりあえず全部入りでいいかな。インストールは3分くらいで終わった。

- デスクトップ環境：ROS, rqt, rviz, ロボットの一般的なライブラリ

```
$ sudo apt-get install ros-kinetic-desktop
```

- ROSベース（最小構成）：ROSパッケージ、ビルド、通信ライブラリ、GUIツールの付属なし

```
$ sudo apt-get install ros-kinetic-desktop
```

- 個別パッケージ：特定のROSパッケージのインストール

```
$ sudo apt-get install ros-kinetic-PACKAGE
```
利用可能なパッケージは、

```
$ apt-cache search ros-kinetic
```
で見つけることができる。例は、

```
$ sudo apt-get install ros-kinetic-slam-gmapping
```




## rosdepの初期化
ROSの使用前に、rosdepの初期化が必要らしい。

```
$ sudo rosdep init
$ rosdep update
```


## 環境設定

端末起動時に、/opt/ros/kinetic/setup.bashを呼び出すように追加

```
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
```

## rosinstallの準備
ROS中で頻繁に使用されるコマンドラインツールとのこと。
複数のソース・ツリーを一括して扱うためのコマンド

```
$ sudo apt-get install python-rosinstall
```




# ROSを使ってみる
## 動作確認
ターミナルで以下のコマンドをうってみる。

```
$ roscore
```

以下のようなのが出て入れば、インストールOK

```
... logging to /home/kondo/.ros/log/61a9fc32-28e5-11e8-860c-7085c252f15c/roslaunch-deepstation-22726.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://deepstation:32922/
ros_comm version 1.12.13


SUMMARY
========

PARAMETERS
 * /rosdistro: kinetic
 * /rosversion: 1.12.13

NODES

auto-starting new master
process[master]: started with pid [22738]
ROS_MASTER_URI=http://deepstation:11311/

setting /run_id to 61a9fc32-28e5-11e8-860c-7085c252f15c
process[rosout-1]: started with pid [22751]
started core service [/rosout]
```

[Ctrl+C]で終了。基本的にROSのプログラム終了時に使う。


## ROSのホームディレクトリの変更

```
$ roscd
```

とすると、ホームディレクトリに移動できるが、今は先ほど設定した、

```
/opt/ros/kinetic
```
に移動してしまう。


### ワークスペースの作成

~/catkin_ws/のところは任意のパスを設定可能。


```
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws
$ catkin_make
```
Ubuntu14.04にてGUIログインループしたので情報を調べて対応。


Linux初心者のため、スマートな正しい解決法だったかはわからない。

ネットで調べた以下のサイトの情報を参照に、なんとか問題は解決したので、実施内容を順番に、今後の備忘録、戒めとしてまとめておくことにした。

# 問題
Ubuntuのアップデートを適用後、再起動したところ、ログインループ(GUIでのログイン画面にて、パスワードを入力してログインしようとしても、一瞬画面が暗くなり、またログイン画面に戻ってしまう)にはまった。また、画面の解像度もおかしくなり、表示が非常に大きなままとなった。

## 問題発生時の環境設定、状況など
- Ubuntu14.04LTS
- GeForce GTX 1080Ti
- nvidia driver(バージョンは転載し忘れ)が数バージョンインストールされている状況
- cuda 8, cudnn 6.0

deeplearningの計算環境の設定に苦労したときに、様々なバージョン（の組み合わせ）を試したため、driverやcuda, cudnnが色々混在したまま残っている状況だった。解決した現在振り返ると、古いバージョンを消していなかった状況が原因と思われる。


# 対応
## ログイン
GUIでのログインはできないが、CUI経由のログインは可能。
CUIコンソールを出すため、Ctl+Alt+F1 (GUIに戻るにはAlt+F7とのこと)を押して、
ユーザー名、パスワードでログイン。

ホーム画面が表示されるが、解像度がおかしいため、本来表示されるはずの範囲の内、640x480がディスプレイに大画面に表示されてしまう。ディスプレイの設定からも、他のサイズを選択できないし、画面外にウィンドウが表示されてしまうため、調査できない状況だった。
また、CUI上の日本語の表示がすべて文字化けしていた。


## 1つ目の試行錯誤（結果関係なし）
ネットの情報を検索して、まずは、これを参考にした。
[UbuntuでGUIログインできなくなった時の対処法](http://blog.mamohacy.com/entry/2013/03/14/194027)

```
df
```

を実行して確認してみたが、領域仕様は１％以下だったので今回の事案に当たらなさそう。



## 2つ目の試行錯誤（こちらで解決）
[Ubuntuアップデートしたらログインできなくなった(nvidia GPU使用)](http://may46onez.hatenablog.com/entry/2016/02/26/020208)
つぎにこの情報を参考にした。

### 1. ファイルの削除

以下のファイルの削除を試してみたが、再起動したが直らず。

```
$ rm .Xauthority
$ rm .ICEauthority
$ sudo reboot
```

### 2. nvidiaのドライバのアンインストール・インストール
nvidiaのドライバ周りがおかしい可能性があったので、
[UbuntuにNvidia GPUのDriver + CUDAをInstallする(GTX1080対応版)](https://qiita.com/conta_/items/d639ef0068c9b7a0cd12)
を参考に。


まずは、現在の状況をチェック

```
$ dpkg -l | grep nvidia
$ dpkg -l | grep cuda
```

### 3. 古いドライバーの削除

```
$ sudo apt-get --purge remove nvidia-*
$ sudo apt-get --purge remove cuda-*
```

### 4.リポジトリの登録

```
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
```

### 5. ドライバのインストール
新しく入れるドライバを調べる。

```
$ sudo add-apt-repository ppa:xorg-edgers/ppa
$ sudo apt-get update
$ sudo apt-cache search 'nvidia-[0-9]+$'
```

(2018.2.26時点では)nvidia-384が最新だったので

```
$ sudo apt-get install nvidia-384
```

再度、再起動を試してみる。

```
$ sudo reboot
```


直りました。解像度も戻っていたので、一安心。

### 6. ドライバの起動確認
ログイン後、

```
$ nvidia-smi
```

を実行し、GPUの状況が表示されれていたのでひとまずOKそう。


# (新しい課題)ランチャーバーが消滅

こちらの情報も有用か？
nvidia関連全部、一掃している様子だけど、大丈夫だろうか？
[Ubuntu14.04にCaffeをインストールしたらCUIでしか起動しなくなったからどうにかした話](http://reiji1020.hatenablog.com/entry/2014/12/14/193219)

と思って実行してみると、ログインループ問題が解決はしたけど、この度は背景だけ、ランチャーバーが表示されない問題が現れた。
下の情報に従って、調整、再起動で、無事に解決。
[Ubuntu 14.04でログイン後ランチャーもツールバーも表示されない問題の復旧]http://m12i.hatenablog.com/entry/2014/05/24/100539()



## この後
cuda, cudnnなどの入れ直しなどをする予定。

deeplearningの環境（tensorflow, chainer, etc）は、
CUDA 6.0, cudnn 8.0の組み合わせが必要とのことだった（tensorflowのインストールの注意に書いてあった記憶）ので、その組み合わせでインストールを実行する予定（備忘録として、別投稿にて詳細を記載予定）。
【tutorial】Git For Windowsをインストール

2018/4/4に実施。

１．ダウンロード。
https://git-scm.com/download/win

２．インストーラを起動。（規約を読んで）「Next」をクリック。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/25e1b1fd-4fa1-822d-2299-16c1cf8e126a.jpeg)

３．何も考えずに「Next」をクリック。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/45abdcbf-9036-4e49-a5f3-66f770984a1e.jpeg)

４．何も考えずに「Next」をクリック。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/37d23f48-dfca-3fb0-d6fa-abb99b7a4447.jpeg)

５．何も考えずに「Next」をクリック。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/d44c7187-0aa2-96e4-a35d-dbde5ea1af1f.jpeg)

６．何も考えずに「Next」をクリック。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/0b1d99d8-ccf1-754f-3fc1-b4528c3a0240.jpeg)

７．「Use Git from Git Bash only」に変更して「Next」をクリック。
※「Use Git from Git Bash only」= GitBashからしかGitコマンドを使わない。
　「Use Git from the Windows Command Prompt」= コマンドプロンプトでもGitコマンドを使いたい。
![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/b75edcf3-1031-3f7c-77bc-58faef6ddf18.jpeg)

８．何も考えずに「Next」をクリック。
![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/0c6f5b99-d585-a16c-f3b7-f282ac7af9d2.jpeg)

９．何も考えずに「Next」をクリック。
![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/7538b6aa-93d6-6fe9-ac1a-47fcaaab97fd.jpeg)

１０．何も考えずに「Next」をクリック。
![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/557e2c66-e465-097f-41b6-7d2a4fca8a73.jpeg)

１１．何も考えずに「Next」をクリック。
![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/1027a222-415f-e61a-305d-9b291919756a.jpeg)

１２．GitBashを起動。↓のコマンドでコミット履歴に表示されるName、Emailを登録。

```
git config --global user.name 'Name'
git config --global user.email 'Email'
```

１３．↓のコマンドで日本語のファイル名を表示できるようにする。

```
git config --global core.quotepath false
```

終わり。
Gitbookのepub変換で使うebook-convertのインストール【自分メモ】

つまづいたのでメモ。

## 問題

Gitbookでepub変換コマンドを使うにはebook-convertをインストールする必要があるが、[公式ドキュメント](https://toolchain.gitbook.com/ebook.html)に書かれているコマンドだとうまくいかなかった。`Operation not permitted`エラーが発生してしまう。

```
$ sudo ln -s ~/Applications/calibre.app/Contents/MacOS/ebook-convert /usr/bin
ln: /usr/bin/ebook-convert: Operation not permitted
```

## 原因

### 1.　calibre.appが存在するディレクトリが違う

私の環境では、calibre.appが存在するディレクトリは`~/Applications`ではなく`/Applications`だった。

⇒正しいディレクトリを指定してあげればオッケー。

### 2. /usr/binは書き込みができない

macOSはElCapitan以降、`/usr/bin`への書き込みができなくなっている。

⇒公式ドキュメントに、`You can replace /usr/bin with any directory that is in your $PATH.`と書いてある。なので、私のPCに設定されてるPATH変数からぽいものを選択。

## 解決

これでうまくいった。

```
$ sudo ln -s /Applications/calibre.app/Contents/MacOS/ebook-convert /usr/local/bin
```
Docker(docker-compose)でCOPYできない

# DockerFile での COPY の書き方

docker-compose でイメージをビルドしたときに自分がハマったところを記載しておきます。
ちなみに「ADD」でも同様？らしいです。

※docker-compose を使わない場合だったり、
以下と異なるバージョンならこれらの問題も発生しないのかもしれません

- 試したバージョン

``` 
$ docker -v
Docker version 1.12.6, build 88a4867/1.12.6
$ docker-compose -v
docker-compose version 1.12.0, build b31ff33
```

## 絶対パスだとコピーできない

```Dockerfile
～
COPY /home/userA/test/hoge.txt /home/test/
～
```

→ failed to build


## 相対パスはどこから開始？

Dockerfile が置いてあるパス

## 相対パスなのにコピーできない

```Dockerfile
～
COPY ../test/hoge.txt /home/test/
～
```

→ failed to build
**※ 「../」がダメっぽい？**

## 【Dockerfile以下の】相対パスならコピー成功！

```Dockerfile
～
(Dockerfile が置いてあるパス以下の相対パス)
COPY test/hoge.txt /home/test/
～
```
→ OK

試行錯誤していたので、もし間違い(カンチガイ)があったらご指摘いただけると助かります。
RaspberryPiでpiユーザー名をSSHなしで変更する

#概略
　セキュリティーのためpiユーザーの名前を変えたいものです。今回SSHを使わないで、また一時的なユーザーの作成/消去もしないで行います。Raspberryではユーザー追加しても再起動時にログインできないのでこの方法を考えました。要はRaspberryの初期設定でpiユーザーとrootがあるのを利用します。

#確認
初期設定時のユーザIDとパスワード
User: pi Password: raspberry
User: root Password 未設定

#パスワードを設定する
###rootにパスワードを設定する
コマンドで入力左上の">"マークのアイコンをクリックします。
<img width="159" alt="スクリーンショット 2018-04-04 12.35.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/242968/7b2e2cbb-e09c-ebcf-cc26-681cc6f28ae5.png">
新しい窓に文字が打てるので

`sudo passwd root`
とパスワードを設定します。

rootは権限が強いので難しく長いパスワードを作ってください。
<img width="519" alt="スクリーンショット 2018-04-04 12.55.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/242968/57b6193b-c6d2-9800-6d0c-e36ec70dcc44.png">

新しいパスワードを確認を含め2回入力する
>新しい UNIX パスワードを入力してください:
>新しい UNIX パスワードを再入力してください:

入力したパスワードが合致していると成功したことを告げてくる。
>passwd: パスワードは正しく更新されました

###piにパスワードを設定する
同様にpiにもパスワードを設定します。
`sudo passwd pi`

こちらも入力したパスワードが合致していれば登録したことを表示する。
>新しい UNIX パスワードを入力してください:
>新しい UNIX パスワードを再入力してください
>passwd: パスワードは正しく更新されました

##自動ログインを解除する
「raspberry」のマーク->「設定」->「raspberry PIの設定」を選択します。
<img width="388" alt="スクリーンショット 2018-04-04 12.59.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/242968/b6c58c9e-5d7e-e6a1-9382-74d843e2b833.png">

自動ログインの「現在のユーザーとしてログインする」のチェックを外します。
<img width="650" alt="スクリーンショット 2018-03-27 21.59.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/242968/de5bd693-257c-fabe-80f0-01d087aad73c.png">

再起動します。
`sudo reboot`

#rootでログイン
再起動するとログイン画面が出ます。
<img width="363" alt="スクリーンショット 2018-03-27 22.01.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/242968/fe8eec25-ac4d-a888-1d87-aa1acff29403.png">

その他を選択して
<img width="334" alt="スクリーンショット 2018-03-27 22.01.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/242968/5653d6a4-281a-ec00-f870-b2b53d90850d.png">
ユーザ名にrootを入力し先程設定したパスワードを入力します。
<img width="338" alt="スクリーンショット 2018-03-27 22.02.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/242968/af0ef56e-916e-9b80-c646-e556af1313f8.png">

#ユーザ名を変更する
rootなので命令にsudoは使う必要はありません。
piユーザ名を変更します(例：newpi）
`usermod -l newpi pi`

#ホームディレクトリを変更
ホームディレクトリ名も変えましょう。newpiとしていますが、新しいユーザー名にしてください。
sudo usermod -d /home/newpi -m newpi

##自動ログインユーザの変更
ファイルをnanoエディターで変更します。
/etc/systemd/system/autologin@.service というファイルです。
`nano /etc/systemd/system/autologin@.service` 
>ExecStart=-/sbin/agetty --autologin pi --noclear %I $TERM
>↓　piをnewpiに変更
>ExecStart=-/sbin/agetty --autologin newpi --noclear %I $TERM
修正できたら「Control」+Oで上書き保存「Control」+xでnano エディターが終了します。

変更したら再起動します。
reboot
再びログインします。


###新しいユーザID(ここではnewpi)にパスワードを設定する
`sudo passwd newpi`
webOS Open Source Edition をビルドしてみた

ソースが公開されて、ラズパイ3があれば動かせるということだったので試してみました。

# webOS Open Source Edition
http://webosose.org/

# ビルド環境

Google Compute Engine (GCE)の仮想マシンのインスタンスを一個新たに作りました。

ビルド環境の要求条件はここに書いてあります。
http://webosose.org/discover/setting/requirements/

OS: Ubuntu 14.04
ディスク: 200GB

CPUとメモリは普段はCPU1個、メモリ1.7GBでいいのですが、後述するようにmakeを実行するときだけCPU8個、メモリ30GBに切り換えました。

# ビルド

最初にgitをインストール。

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

ここに書いてあることをなぞります。
http://webosose.org/discover/setting/building-webos-ose/

```
git clone https://github.com/webosose/build-webos.git
cd build-webos
sudo scripts/prerequisites.sh
./mcf -p 0 -b 0 raspberrypi3
```

仮想マシンの設定をCPU8個、メモリ30GBに切り換えてから以下を実行。

```
make webos-image
```

ビルドにはかなり時間がかかるので、代わりに以下のようにすればsshをログアウトしても大丈夫です。

```
nohup make webos-image &
```

途中でエラーで止まるかもしれません。
https://github.com/webosose/build-webos/issues/7
これと同じエラーならば、回避策があります。

```
rm -rf ~/.node-gyp/
make webos-image
```

これで最後までビルドが通りました。通算で4時間半くらいかかりました。
SDカードにイメージファイルは以下のところでできます。

```
cd BUILD/work/raspberrypi3-webos-linux-gnueabi/webos-image/1.0-r3/deploy-webos-image-image-complete
ls -lh webos-image-raspberrypi3.rootfs.rpi-sdimg 
-rw-r--r-- 3 koba koba 1.2G Apr  3 04:33 webos-image-raspberrypi3.rootfs.rpi-sdimg
```

確かにディスクの空き容量が100GBは必要でした。

```
 df -h .
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       197G   75G  115G  40% /
```

# 動作確認

## SDカードへの書き込み

SDカードへのイメージファイルの書き込み方は以下に書いてあります。
http://webosose.org/discover/setting/flashing-webos-ose/

ラズパイのいつもの方法でddで書き込みます。
イメージファイルのサイズが1.2GBなので、2GB以上のサイズのマイクロSDカードを用意すれば書き込むことができます。
ちなみに、イメージファイルはzip等で圧縮すると200MBくらいに小さくなるので、仮想マシンから転送するときは圧縮したほうがネットワークにやさしいです。

## 起動

Ethernetケーブルをつなぎ、HDMIにテレビを、USBにキーボードとマウスをつないで電源を入れます。

電源を入れてしばらく待つとHDMIでつないだ画面にマウスカーソルが表示されます。
メニューアイコンを出すには、キーボードからF1かWindowsキーを押下します。
( ... 実はこれがわからずに半日つぶしました ... )
YouTubeの動画が見られます。

### ネットワーク

ネットワークはDHCPでIPアドレスを取得します。
IPアドレスを知るには、シリアルコンソールからログインするか、一度RaspbianのSDカードで起動してそのIPアドレスをメモしておいて、webOSを立ち上げ直すとよいでしょう。(IPアドレスはMACアドレスにひもづくので短期間なら同じIPアドレスが割り当てられる。)

IPアドレスがわかれば、sshでログインできます。ユーザーはroot, パスワード無し。

## 画面の解像度を1920x1080から変更する方法

自宅のテレビが1280x720だったので、以下のところを見て変更しました。
http://forum.webosose.org/t/hd-tv-resolution-problem/211

# 関連
[webOS Open Source Edition の観察(1)](https://qiita.com/tetsu_koba/items/529612dfcc5fe077a0a9)
[webOS Open Source Edition の観察(2)](https://qiita.com/tetsu_koba/items/3442ce5af7dab48fa0d5)
[webOS Open Source Edition の観察(3)](https://qiita.com/tetsu_koba/items/3a7eddf59e66fdda1bd2)
[webOS Open Source Edition の観察(4)](https://qiita.com/tetsu_koba/items/6aec653971e197777676)
複数のEmbedded Framework同士が依存関係ある場合にメインターゲットのbuildが失敗する時

## 今回Buildが一発でできない壁にぶつかった
Embedded Frameworkをレイヤーごとに新設して、当該のページをリファクタしながらメインターゲットのボリュームを減らしていった。

なのだけれど、メインターゲットをBuildしようとしても新設したFrameworkがないよーと怒られて失敗する。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60892/de7ef09f-0346-374a-f80b-758fa1722fe5.png)

Schemeを各FrameworkのTargetに変更してBuildしておけば、メインターゲットのBuildは成功するが、**Build時間削減**と**名前空間の整理**がしたかったから導入したのに、逆にbuild作業が煩雑になる結果に。。。😇

## うまく一発でBuildするには？
最初、run scriptで各Frameworkをbuildさせてから..とか思って探したけどそれ系の情報が出てこなかった..

途方に暮れながら、なんとなくBuild Settingとか**Build Phases**辺りを見ていて、メインターゲットからはTarget DependenciesとかLink Binary With Librariesに使用するFrame workを設定していた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60892/b5117514-ffa4-f234-c574-8ae37c6a0496.png)

が、Embedded FrameworkではTarget Dependenciesの指定はブランクになっていた👀

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60892/15f8ba33-2578-b57d-774c-364d474b7379.png)

試しにEmbedded Framework同士の依存関係を元に各FrameworkのTarget DependenciesにEmbedded FrameworkのTargetを設定してみた。

その上で、メインターゲットを指定してBuildしたら…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60892/747ec511-01b5-5c3e-c4ca-4ecd65257642.png)

成功！🎉🎉🎉
(Buildなげーなは言わないの。途中なの。)

## まとめ
Embedded Frameworkを複数作成して利用する場合は、Framework同士の依存の関係も設定に反映させる必要があるということでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60892/37c3ec06-2ebf-bede-7a32-5f01924dc49b.png)

当然っぽいけど、気づけないとはまる。。信仰心が試されているっ🍎💪
AdonisJs で adonis-scheduler を使って cron を設定する

# 概要

表題の通り、AdonisJs で [adonis-scheduler](https://github.com/nrempel/adonis-scheduler) を使って cron を設定して、タスクを自動で実行する。
AdonisJs のバージョンは 4.1 を使う。

# 初期設定

[adonis-scheduler](https://github.com/nrempel/adonis-scheduler) をインストールする。

```
$ npm install --save adonis-scheduler
```

`start/app.js` で各種設定をする。

```start/app.js
const providers = [
  ...
  'adonis-scheduler/providers/SchedulerProvider'
]

const aliases = {
  ...
  Scheduler: 'Adonis/Addons/Scheduler'
}

const aceProviders = [
  ...
  'adonis-scheduler/providers/CommandsProvider'
]
```

# タスクをつくる

まずは、実行するタスクをつくる。
ここでは、試しに `Example` というタスクをつくって、実行してみる。

```
$ adonis make:task Example
```

もしくは

```
$ node ace make:task Example
``` 

を叩くと、`app/Tasks` に `Example.js` というファイルが生成される。

```app/Tasks/Example.js
'use strict'

const Task = use('Task')

class Example extends Task {
  static get schedule () {
    return '0 */1 * * * *'
  }

  async handle () {
    this.info('Task Example handle')
  }
}

module.exports = Example
```

あとは、`schedule` に実行条件、`handle` に実行内容を書けば良い。
実行条件は、[node-schedule](https://github.com/node-schedule/node-schedule) と同じ記法で書くことができる。

# 実行する

ここまでできれば、あとは実行すれば良いだけである。

```
$ adonis run:scheduler
```

もしくは

```
$ node ace run:scheduler
``` 

で起動するので、`package.json` で `scripts` を以下のように変えてあげると良い。

```package.json
{
  ...
  "scripts": {
    "start": "node server.js & node ace run:scheduler"
  }
}
```

実行して、ターミナルにこのようなログが流れればオッケー！（試しにやるときは、実行条件を毎秒とかにすると良い）

```
2018-04-04T05:39:40.007Z - info: { task: 'example' } 'Task Example handle'
```

# おまけ

個人的に `package.json` の `scripts` をゴチャゴチャさせたくないし、普通にサーバーが立ち上がるときに `scheduler` も立ち上がってくれていいよとなった。

そのような場合は、以下のようなファイルをつくって

```start/schedule.js
'use strict'

const Scheduler = use('Scheduler')
Scheduler.run()
```

`server.js` で呼び出すとうまく動く。

```server.js
'use strict'

const { Ignitor } = require('@adonisjs/ignitor')

new Ignitor(require('@adonisjs/fold'))
  .appRoot(__dirname)
  .preLoad('start/scheduler') // ここを足した
  .fireHttpServer()
  .catch(console.error)
```
【Android】ScrollViewの中でタップイベントを拾う

#はじめに
 スマホで文字入力する時キーボードが出てきますが、このキーボードは文字入力が完了しエンターキーを押したり背景をタップしてもキーボードは自分で閉じることはしません。そこで、文字入力するEditTextにはエンターキーが押された時にキーボードを隠す処理を追加する、また、ActivityにonTouchEventをオーバーライドし、背景がタップされた時に処理を追加することで、キーボードを残したままにすることを回避できます。しかし、ScrollViewの中で背景をタップしてもタッチイベントを取られてしまい、背景タップでキーボードを隠す事が実現できなくなります。
#対処方法
 ScrollViewの中でタッチイベント(ここではタップだけでいい)拾いたい時どうすればいいか？と調べたところ以下の記事が参考になりました。

https://qiita.com/garlicG/items/61ce76965a181b10d1aa

こちらでは親ビューのタッチイベントを取得しています。これなら実現できそうですが、今回はキーボードを隠したいので子ビューが複数あった時、すべての子ビューにgetParentする事になりそうです。もっと簡単にタップ検知をできないかと思ったところ、ScrollViewの中のボタンが正常に反応している事に気づきました。ScrollViewを一つのボタンとして機能させれば実現できそうなので調べたら以下のページに前例がありました。

https://stackoverflow.com/questions/16776687/onclicklistener-on-scrollview

一番簡単に実現できそうなのはScrollViewにLayoutを配置し、そのLayoutにOnClickListenerを付与する事になりそうです。
[イベントレポ]すくすく子育てエンジニア Meetup Vol.2


## はじめに
めったに外部セミナー類にいけないのですが、今回なんとか都合をつけて本Meetupに参加してきました。
私自身も、家事や日々のオペレーションにアプリや仕組みを取り入れることをしているつもりですが、何か少しでもヒントになればと思い参加しました。
※個人的なまとめなので、記載に間違いがあったらお知らせください

## セミナー概要
開催日時：4/3(火) 17:00-
すくすく！子育てエンジニア Meetup #2 - connpass
https://childcare.connpass.com/event/81567/

## 会場の雰囲気
![IMG_4970.JPG](https://qiita-image-store.s3.amazonaws.com/0/186166/517a3e6c-4a8e-cfc2-1a9b-4f589926c716.jpeg)

リクルートマーケティングパートナーズ様です。

![IMG_4971.JPG](https://qiita-image-store.s3.amazonaws.com/0/186166/39e77f3d-ae88-eb7a-e537-29781c496243.jpeg)

若干レトロな雰囲気。
(正直、うちの会社とは全然違う。)

![IMG_4972.JPG](https://qiita-image-store.s3.amazonaws.com/0/186166/87df7e33-72ab-2b7d-078d-0a0f78a19b8b.jpeg)

会場の様子。ざっと30人ぐらいの参加でしょうか。
後ろにスタッフさんもいました。

![IMG_4973.JPG](https://qiita-image-store.s3.amazonaws.com/0/186166/d9e0f7e2-9417-f2dc-ad2a-0eae4798a8aa.jpeg)

![IMG_4974.JPG](https://qiita-image-store.s3.amazonaws.com/0/186166/cb09cbaa-fca0-e27b-84f3-8953f84e3c3e.jpeg)

アルコールではなく、健康志向な飲料が並び
ありがたい、お菓子つき。
ごちそうさまでした。

## 発表資料とメモ(書きとった分だけ)
発表資料は下記。
すくすく！子育てエンジニア Meetup #2 - 資料一覧 - connpass
https://childcare.connpass.com/event/81567/presentation/
以下、タイトルは上記URLの抜粋です

1．[tebasaki](https://twitter.com/tebasakyu)さん：育児 × 在宅勤務のTips
<b>育休をとろう</b>。間取り大事、slackでメンバーに分報する

2．[tamadon](https://twitter.com/tamadon3776)さん：子育てエンジニアを支える技術
写真：prime photos、famm、ノハナ、みてね、レター
家事：ブラーバ、食洗機、人感センサー付きの電球、google home、nature remo
インプットアプリ：overcast、viocy(news picks 音声版)
自分の健康：Fitbit、health planet 、ヘルスケア

3．[tknzk](https://twitter.com/tknzk)さん：子育てをはじめて2.5年の振り返り ~ テクノロジーと創意工夫で家庭と子育てをハックしたい ~
ちょっとしたストレスは機械とお金で解決する
食洗機、ルンバ、洗濯乾燥機
<b>娘のソーシャルネームをつける</b> 
google home IFTTT 連携
google home を喋らせていろいろやりたい
ノンストップ映像コンテンツ super simple songs

4．[kohei_tabata](https://twitter.com/nerd0geek1)さん：動線改善で家庭内のストレスを軽減した話
開発されたアプリ：おうちタイマー リリースされました
ステータスが曖昧な家事がある
動線の無駄を省く
プロトタイプを作成し、動線変更の検証をする
→良さそうであれば、高級な家具を買う
小物は3Dプリンターで作る(共通のポイントカードなど)
店で試してから、良さそうであれば作る時間がかかる
→fusion360など
ステータス管理をアプリなどで外部委譲する

5．[Hikoharu06](https://twitter.com/hikoharu06)さん：保活問題についての取り組み紹介
kidsly、園児の登園状況を管理。保育士の負荷を軽減するアプリ
(→どんどん各園で導入してほしい！)

6．[shikichee](https://twitter.com/shikichee)さん：-技術的夫妻プレゼンツ- 家庭内タスクをスクラム的に考える方法
奥様はデザイナー
スクラムの３つの要素:透明性、検証、適応
定率おこづかい制。収入の7割を共通口座に(マネーフォワード)
個人のところは口を出さない
ホットクック、材料を入れてほっとくとできている、混ぜるのもできる
(→購入を検討します！(笑))
購入額 vs 耐用年数、一年の使用回数、一回の削減時間、時給　を天秤にかける
todo、doing、doneを明確化
trelloでbacklog→doing→done を動かして、家事をやる

## 感想
・子持ち子なし関係なく、家事を自動化&仕組化して日々の負担を減らそう、という取り組みは非常に共感できた。
・Google Home推しだった。(ちなみにうちにあるのはAmazon Echo。)
・Trello((カンバン方式)で家事を片づけるは、ここにも記事があった
>共働きの夫婦にはITのタスク管理術を導入するとうまくいく！話題だった逃げ恥でも導入？ - Togetter https://togetter.com/li/1088980

・男性が圧倒的に多く、女性は少なかった。
　(エンジニア人口比率の問題もあるだろうが、子供を見ているのは女性が圧倒的多数なんだろう)
 ・毎回毎回、なんでMac所持者ばかり、アプリもしくはフロントエンジニアばかりなんだろう。
 →そうじゃないエンジニアもこういうことに関心があることを示したい…
・会場(リクルートマーケティングパートナーズ様)が素敵だった
→会場から、オフィスエリアが見下ろせる場所があり、皆さままだ働いていた
その他…
（・お土産のお菓子+アンパンマンふりかけが、ドンピシャだった）

## ちなみに
うちでは
- 共通タスク：Wundurlist
- スケジュール管理：Google Calendar
- 財政管理：MoneyTree
- 写真：Prime photos、30days
- 動画：みてね
- 音声入力：Amazon Echo + IFTTTでごにょごにょ
となっています。
Trelloはまだ自分用のみ。

まあ、いつかどこかで書こう。
ではでは。
標準ユーザーのWindows PowerShellでコマンドを使えるようにパスを通す

会社のPCでインストールしたソフトのパスを通すのに苦戦したのでメモ
##環境##
Windows 10 Pro
アドミンユーザー：hoge\fuga
標準ユーザー：foo\bar　(普段使っているアカウント)
##困ったこと##
普段自宅で使っているPCでは、インストールしたソフトはコントロールパネル→システム→システムの詳細設定→環境変数でPathを追加するだけでPowerShellで使用することができていました。
しかし、会社のPCではアドミンと標準ユーザーで分かれているせいか、ユーザー環境変数を設定してもPowerShell内でコマンドが使えませんでした。
##解決策##
PowerShell起動時にパスを追加するスクリプトを実行するように設定する。
まずPowerShellを起動して今のユーザーのスクリプトのパスを確認をします。`$profile`と打つと以下のように起動時に実行されるスクリプトのパスが表示されます。

```
 PS Z:\> $profile
 D:\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
```

このパスにファイルを作成して、こんな感じに編集しました。

```Microsoft.PowerShell_profile.ps1
 $Env:Path+= ";C:\MinGW\bin"
 $Env:Path+= ";C:\Program Files\Git\usr\bin"
```

スクリプトを実行するためにはスクリプトの実行ポリシーを変更する必要がある場合があります。管理者権限でPowerShellを起動して以下のコマンドで実行ポリシーを"RemoteSigned"に変更します。

```
 PS Z:\> Set-ExecutionPolicy RemoteSigned
```

これでパスが通りコマンドが実行できるようになりました！

# ※追記
実はもっと簡単な方法がありました。
コントロールパネル->ユーザーアカウントのところにユーザーごとの環境変数を設定できるところがあり、そこを編集することで管理者権限がなくてもパスを通すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211445/b2ca664e-f9c2-f965-aaff-42718f01d007.png)


##参考##
* [PowerShellコンソール起動時にスクリプトを実行する方法](http://win.just4fun.biz/?PowerShell/PowerShell%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
* [Windowsの環境変数をPowerShellで書き換える](https://qiita.com/mmorita/items/4c44363faf74a7105199)
* [WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する](http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html)
Macをコマンドラインでアップデートする

#問題
macOS High Sierra バージョン10.13.4へのアップデートが来たが、Storeからアップデートできなくなってしまった。　
![スクリーンショット 2018-04-04 13.39.39.png](https://qiita-image-store.s3.amazonaws.com/0/131659/0b783e9f-baf8-fb39-40ac-af9839c8e3af.png)
上の画像のように、なにも表示されていない。。。。
#原因
Storeからのダウンロード中に再起動してしまったため（？）　
#解決策
`softwareupdate`コマンドを使えば良い。 
例として、
`user$ softwareupdate -i -a`
上記コマンドで適用可能なアップデートを一括でインストールできる。 
#結果
ダウンロードしてインストール、その後、再起動して、無事に`10.13.3`から`10.13.4`へとアップデートできた。
![スクリーンショット 2018-04-04 13.46.21.png](https://qiita-image-store.s3.amazonaws.com/0/131659/ec6f79d7-6802-612a-a77d-1cd1d6d7e1ac.png)
#参考
- [lifehacker.jp: イライラするMacのアップデートを高速化する方法](https://www.lifehacker.jp/2018/03/how-to-update-your-mac-faster.html)
- [Apple サポート: コマンドラインを使ってソフトウェアアップデートをリモートインストールする方法](https://support.apple.com/ja-jp/HT200113)
Swift4.1でUnWrap型の出力内容が変わる

Swift4.1からUnWrap型`Any!`で`print(Any!)`や`\(Any!)`で出力した場合の結果が変わるらしい

`String!` だと `some(VALUE)` で出力され、謎の`some(``)`が引っ付いてくる

- Swift4.1未満

```swift
let a: String! = "test"//test
let b: String? = "test"//Optional("test")
let c: String = "test"//test
```

- Swift4.1

```swift
let a: String! = "test"//some("test")
let b: String? = "test"//Optional("test")
let c: String = "test"//test
```


わかんないけどOptionalの[some](https://developer.apple.com/documentation/swift/optional/1641449-some)から来てるのか！？
【tutorial】GitHubにリポジトリを作成→ローカルにクローン→ファイルを追加してコミット→プッシュ（GitHub Desktop）

2018/4/4に実施。

１．GitHubにリポジトリを作成。
https://qiita.com/d778980/items/a81568d5fbfcfad784ce
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/97809563-abd0-7d27-b0d3-f3cf774c9a36.jpeg)

２．リポジトリをローカルにクローン。
https://qiita.com/d778980/items/eabeda74dce9720ea0a5

３．GitHub Desktopを起動し、「Current repository」をクリック。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/d9c3400f-af48-0dbb-25ac-002d0f6c23ea.jpeg)

４．対象のリポジトリ名を右クリック。（この場合はGitHub.com内「first」のところ）
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/59bacb87-28c1-d52f-76da-45af6bb0c822.jpeg)

５．「Show in Exploer」をクリック。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/96d0c0cc-3bbb-62cc-f0bf-192169ebc6ca.jpeg)

６．「５．」で開いたフォルダに適当なファイルを追加。
![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/e9b3c22b-f56d-2f47-527f-e3be5cdf77c5.jpeg)

７．GitHub Desktopに戻ると、追加したファイルが差分として表示されているので、
　　Summaryの欄にコメントを書いて、「Commit to master」をクリック。
![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/1690f408-04aa-cd17-f786-4606ba21ab8f.jpeg)

８．GitHubのリポジトリにはまだ追加されていない。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/97809563-abd0-7d27-b0d3-f3cf774c9a36.jpeg)

９．GitHub Desktopで「Repository」→「Push」をクリック。
![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/7683111c-89c6-5062-3ba5-d95e32d878b6.jpeg)

１０．GitHubのリポジトリにファイルが追加された。
![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/8d008a69-e7e1-c505-de77-bd083e573050.jpeg)

終わり。
GenymotionのAndroidにGoogle Playを入れる

# マシンの作成
![スクリーンショット_2018-04-04_14_22_38.png](https://qiita-image-store.s3.amazonaws.com/0/128374/fa20881e-48f2-5706-6c20-a0f896cd1ae1.png)
右上のGappsボタンで一発でした。

前は、zipとかをいろいろダウンロードしなきゃいけなかったのに。。。

簡単で申し訳ありません。
もしわからないことなどがありましたら、コメント欄からお願いします！
最後まで読んでいただきありがとうございます！
[MySQL] LaravelでのDBクエリ結果の並び順と、適当なDBクライアントアプリでのDBクエリ結果の並び順が、異なっていて悩んだ後なんとかした話

# はじめに

LaravelのクエリビルダーでDBアクセス楽チンライフを享受する日々。

あるとき、単にDBからテーブルの一覧情報を取得して表示する画面にて、
並び順が想定通りでないことがありました。
（「ひらがな、カタカナ、漢字...」が含まれるフィールドの５０音順表示）

常にログに出力するようにしていた「実行SQLのログ」をコピーして、
適当なDBクライアントで「まったく同じSQL」を貼り付けて実行してみたところ、
こちらは想定通りの並び順となっている結果が得られました。

```sql:SQL適当サンプル
SELECT * FROM some_table order by CAST(hoge as CHAR) asc;
```

結果の並び順 例

|No|Laravelから|DBクライアントアプリから|
|:--:|:--:|:--:|
|1|あいうえお|あいうえお|
|2|かきくけこ| かきくけこ |
|3|サシスセソ|なにぬねの|
|4|タチツテト| サシスセソ |
|5|なにぬねの| タチツテト |


なぜ異なるです！？


# 筆者環境

* macOS High Sierra
* Laravel 5.4
* MySQL 5.7.18
* Sequel Pro 1.1.2


# 結論

* MySQLでは、OrderBy句の並び替えなどで利用する際の **Collation(照合順序)** という概念が存在する。
     * 文字コードと同じレベルで設定される。
     * テーブル毎の設定もある。
     * カラム毎の設定もある。
        * 基本的に、SQL実行時はOrderBy対象カラムに設定されているCollationが使われる。 

↓

* Laravelは、`config/database.php` に `collation` の設定があり、Laravelからマイグレーションを実行した場合に、テーブルやカラムのデフォルトCollationとして設定される。（多分）
* テーブルにもカラムにもCollationの設定がない（≒OrderBy対象が計算結果だったり、CASTだったり）場合、それぞれのSQL実行環境上のデフォルト値が使われる？
    * Laravelでは、`config/database.php` の `collation`の設定がデフォルトになる。（なってた）
    * DBクライアントアプリなどは、何も指定しなければ基本的にMySQLに設定されているデフォルトのCOLLATE(`collation_connection`,`collation_server`など)が利用される？（多分）

↓

* よって、**同じSQLを実行しても、暗黙的に設定されている設定内容によって結果が変わってしまっていた。**
   * 今回でいうと、Laravelでは COLLATE=`utf8mb4_unicode_ci` で、    
     DBクライアントアプリでは COLLATE=`utf8mb4_general_ci` になっていた。


# 対処

COLLATEの設定をどうするかは、`utf8mb4` では以下のどれかを使うことになるかと思いますが、
「どうしたいか」は要件によりけりだと思いますので、それぞれの特性を知って設定してください。

* utf8_general_ci
* utf8mb4_unicode_ci
* utf8mb4_bin
* ...


## どうやってCollationを調整するかの案

* 案1) Laravel上の `config/database.php`の`collation`を変更する。
    * Laravel上のシステム全体に影響するので慎重に。
    * 既存のテーブルやカラム全体をなんとかしたい場合は、再マイグレーションが必要。
    * ここを変更したからといって、既存のSQLが全部その設定になるわけではない。
        * 既にカラムにCollationの設定がされている場合は、カラムの設定が優先される。

---
        
* 案2) MySQLのデフォルトcollation設定を、なんらか統一を図るように検討して調整する。
    * データベースを見てるところ全体に影響するので慎重に。
    * テーブルやカラムは、Laravelのマイグレーション設定と異なると混乱するので慎重に。

---

* 案3) Laravel上で、一部のSQLだけを調整する。
    * 気楽だけど、数が多いと大変になるので慎重に。


### 案3)の場合

今回は手っ取り早く一部で対応することにしました。
Laravelでは、以下の感じにすると、個別のSQLでorderBy句を調整できます。

```
SomeTable::where(〜〜)
//  ->orderBy('hoge', 'asc')
    ->orderByRaw('CAST(hoge as CHAR) COLLATE utf8mb4_general_ci asc')
    ->get();
```


おわり
将棋盤の上と右の数字をCSSだけで表現

# 完成形

<p data-height="353" data-theme-id="0" data-slug-hash="qoyyVr" data-default-tab="html,result" data-user="akicho8" data-embed-version="2" data-pen-title="CSS sample for Japanese chess board axis position" class="codepen">See the Pen <a href="https://codepen.io/akicho8/pen/qoyyVr/">CSS sample for Japanese chess board axis position</a> by Akira Ikeda (<a href="https://codepen.io/akicho8">@akicho8</a>) on <a href="https://codepen.io">CodePen</a>.</p><script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 要点

1. 最初の tr に属する td の **:before** に content: "9" などとして数字を埋める
1. td からの相対座標で上にずらして上側が完成
1. 同様に最後の td に対して content: "一" などとして漢数字を埋める
1. このとき :before を使うと "1" を埋めている右上地点の content を上書きしてしまうことになる
1. なので右側の漢数字を表すときは **:after** の content を使う
1. あとは同様に右にずらして完成

右上が干渉するので上と右でそれぞれ before と after を使い分けるというのがしっくりきませんが、とりあえず表示するだけならCSSだけでも可能ということがわかりました。
MobileNet-SSD~ssdkerasのその先２~

# 対象
Faaster-RCNN,SSD,Yoloなど物体検出手法についてある程度把握している方．
VGG16,VGG19,Resnetなどを組み込むときの参考が欲しい方．
自作のニューラルネットを作成している方．

# 1.MobileNetとは
チャンネル方向への畳み込みを行わないことで，計算量を削減したモバイルアプリケーション向けのニューラルネットワーク．従来の畳込みフィルターの代わりに空間方向への畳み込みを行うDepthwise畳み込みフィルターと1x1のPointwise畳み込みフィルターを組み合わせることで計算量を削減．


比較
Convolutuion：カーネルサイズxカーネルサイズxチャネル数(入力)
DepthwiseConv:カーネルサイズxカーネルサイズx1
PointwiseConv:1x1xチャネル数(入力)

MobileNetではDepthwiseな畳み込みとPointwiseな畳み込みを組み合わせることによって通常の畳み込みをパラメータを削減しながら行っている．
![dwconv.png](https://qiita-image-store.s3.amazonaws.com/0/246406/6fee877e-5082-2b5c-7f75-c3f6b3a03d8a.png)

また，バッチ正規化はどこでも使われ始めており，MobileNetも例外ではない，共変量シフトを抑え，感覚的には学習効率を14倍ほどに上げることができるらしい．
![MibileNetBatchNorm.jpg](https://qiita-image-store.s3.amazonaws.com/0/246406/097a356c-0d14-4789-09ae-d57db2389114.jpeg)



全体のフローは以下のようになっており，Xceptionのように
EntryFlow
MiddleFlow
ExitFlow
と分けるのであれば，（Depthwise+Pointwise)×5のMiddleFlowがボトルネックになりそうだ．

![MobileNetIndex.png](https://qiita-image-store.s3.amazonaws.com/0/246406/f692eb4c-d4ba-3d9f-9e2e-3303ec8ef615.png)




# 2.MobileNet-SSDを作成する
ざっくりと説明するとMobileNetのEntryFlow，MiddleFlowを残し，ExitFlowを取り換えた．
今回はcaffe版のSSDを参考にし，組み立て，ExitFlowを取っ払い，SSDのDetection層のFullyConvolutionnal版とGlobalAveragePoolling版とで迷ったが，GlobalAveragePooling版を入れることにした．

また，Caffe版のMobileNet-SSDはRelu6をReluにしたとあり，kernel正規化，バッチ正規化が入っているので，Reluを使用した．．．Relu6の実装は苦ではない．
フィルター数は速度と精度との兼ね合いになるのだが，filter数はデフォルトの数とした．


# 3.考察
理論と現実では少し齟齬があり，MobileNetのMultiAddはVGG16よりはるかに少なく（9分の1くらい）学習の高速化及び学習回数の削減に寄与してくれるらしい．CPUマシンでは学習速度の向上が見て取れるのだが，GPUマシンでは学習速度の向上があまり感じられない．(VGG16の1.3倍くらいかな)
また，conv11のレイヤーの大きさが19×19であるころから，もともとのVGG16－SSDよりも大きい物体の検出は苦手とする印象．

以下実験動画(GTX10801枚です)
![mobileNet.gif](https://qiita-image-store.s3.amazonaws.com/0/246406/ef810b91-ac66-e3ae-ee43-e162d535cfcb.gif)



# 4.終わりに
Keras版の自作ネットワークを作っている方がいたらアドバイスなどお願いします．
https://github.com/tanakataiki/ssd_kerasV2
SSDはガラス細工並みに繊細な構造で，職人技の数値設定が必要です．
上手くいった方はプルリク待ってます．
筆者の環境
CPU:Xenon　GPU：GTX1080Ti
今後は他のネットワークを載せていくつもりです．

参考
https://arxiv.org/abs/1704.04861
http://tensorflow.classcat.com/category/mobilenet/
https://qiita.com/namakemono/items/4fbc7758ffba4791e581
https://github.com/chuanqi305/MobileNet-SSD
会議室・備品の画像を変更する

## 会議室・備品の画像を変更する
会議室や備品を作成すると、画像が以下のようになり、一覧で見たときにどれがどの会議室かよくわかりません。
<img width="368" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/245365/bfebab7f-3fe6-d0de-fb4a-fe51375c1e1b.png">

## Azure Active Directoryから変更
ExchangeOnlineからだと変更できないので、Azure Active Directoryから変更します。
Azure Active Directoryに管理者でログインして[ユーザー]-[すべてのユーザー]を表示し、会議室を検索します。
![](https://qiita-image-store.s3.amazonaws.com/0/245365/dafe9bbf-59ab-666a-cedc-53a572e24e39.png)
会議室名のリンクをクリックして、左側メニューの[プロファイル]をクリックします。
![](https://qiita-image-store.s3.amazonaws.com/0/245365/bc017bd7-e439-7f22-b9ec-b1bb8be8530a.png)
写真のところので設定したい画像をアップロードして、画面上部の[保存]をクリックすればOKです。画像ファイルは100KB以下である必要があるようです。
Redshiftのストレージ容量のメンテナンス

Amazon(AWS) Redshiftはとてつもなく強力ですが
ストレージサイズが自由に選べないので、容量がなくなったときにはノードを追加するしかありません。

処理速度をあげたりする分にはノード追加はよいですが、
容量確保のためにはあまりバカスカ増やすのもいろいろ大変()・・

運用したまま極力ストレージ使用量を増やさない手段はあまり無いですが
（列の圧縮やRedshift SpectrumでテーブルをS3に移すなど、運用入ってるものには対応難しいですよね・・）
現状を知ることは重要ですし、そこから対策も打ちやすくなります。

今の状態をぱっとみるならCloudWatchがいいですね
常にメトリックスが送り続けられているので変化も含めてわかりやすいです。

AWS Webコンソール画面左上などからCloudWatchを選択
左メニューから「メトリクス」を選択
「すべてのメトリック」タブから「Redshift」を選択
「クラスター別の集計」を選択
ClusterIdentifier」から該当のRedshiftクラスタIDを探しメトリクス名「PercentageDiskSpaceUsed」の行のチェックをすると、上部にグラフが表示されます。
このままだとざっくりしたフラフが表示されるので
「グラフ化したメトリクス」タブから
　「統計」列を「最大」
　「期間」列を「1分」
にしてみましょう。
また、画面上部の「1時間　3時間」・・といった期間範囲を選べば過去の推移が分かります。

Cloudwatchは値が変化し、設定値になった・超えた・下回った場合、アラートメールを送ることができます。
先の「グラフ化したメトリクス」で表示されている行の右側に「ベル」アイコンがあるので

```
次の時:
PercentageDiskSpaceUsed (PercentageDiskSpaceUsed) 
が　>= 75 
```

と設定すれば、75％以上になったら場合メールを飛ばしてくれます。
（逆に75%を下回ったら「OKの状態になったよ」メールを送ってくれることも出来ます）


さて、クラスターの全体のストレージ容量の状態はわかったので、
次は個々のデータベースやテーブルの容量を確認してみましょう

まずは、psqlでRedshiftにログインしましょう

テーブルの状態やテーブルサイズの確認するには
「SVV_TABLE_INFOシステムビュー」が最短っぽいです。
[AWS Documentation » Amazon Redshift » データベース開発者ガイド » システムテーブルのリファレンス » システムビュー » SVV_TABLE_INFO
](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_SVV_TABLE_INFO.html)


```sql
select * from SVV_TABLE_INFO order by size desc;
```

でテーブルの使用容量が多い順に表示できます。
sizeが1Mブロックの使用数、tbl_rowsがレコード行数です。

```sql
select sum(size) from SVV_TABLE_INFO ;
```

でDB全体量もわかりますね。

で、例えばレコード削除してもいいよって事になったら、
Delete文を打ちますが、せっかく溜め込んだデータをサクサク消すのも少々能が無いので
S3に一旦退避させてから消すのも良いかと思います。
実際にはunload文を使います

```sql
unload (
    'select * from テーブル名 where キー between \'値\' and \'値\' '
) TO 's3://バケット名/保存名' credentials 'aws_access_key_id=AWSアクセスキー;aws_secret_access_key=AWSアクセスキーのシークレットキー' MANIFEST GZIP delimiter '\\t' ESCAPE ALLOWOVERWRITE PARALLEL ON ;
```

事前にバケットの用意と、バケットにアクセスできるAWSアクセスキーを用意しておいて下さい

退避させておけばいざという時はload文ですぐに戻せますし、
Redshift Spectrumで参照できるようにしておくだけでも安心感は違うと思います。


さてさて、もし消せるデータがあったのでdelete文を打ってもすぐにはストレージの空きが増えない可能性があります。
AWS Redshiftはpostgresqlをベースに開発されているようですし、postgresqlといえば、バキューム!

[AWS Documentation » Amazon Redshift » データベース開発者ガイド » SQL リファレンス » SQL コマンド » VACUUM
](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_VACUUM_command.html)

```sql
vacuum;
```

と打つだけです。
バキュームをしたらアナライズもしておきましょう。
[AWS Documentation » Amazon Redshift » データベース開発者ガイド » SQL リファレンス » SQL コマンド » ANALYZE
](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_ANALYZE.html)

これも

```sql
analyze;
```

と打つだけです。


これで随分空き容量が増えたんじゃないかと思います。
（もちろん、毎日バキュームしてるよってことだともう最適化されまくってるってことなのでなかなか難しいですが・・）

どんどん入れておきたいところですが、なんとかがんばってメンテナンスしておけば
いつの間にか使用量が100%行っちゃってたってのも防げると思う次第です。

(いい方法あったら追記していきます)
過去バージョンのJava(JDK10以前)をインストールする方法(Mac)

## はじめに

2018/11/07現在、Javaの最新バージョンはJava 11です。
Java 10以前はアーカイブのページからインストールします。

> 古いバージョンのJavaをダウンロードするにはどうすればよいですか。
> 
> Javaの他のバージョンを入手するには、Javaアーカイブのダウンロード・ページにアクセスしてください。Javaの最新バージョンをjava.comからインストールすることをお薦めしました。
> 
> https://www.java.com/ja/download/faq/other_jreversions.xml

この記事ではアーカイブのページからJava 7をインストールする方法を紹介します。

## 環境

- OS：macOS High Sierra 10.13.1

## Java 7のインストール

アーカイブのページを開き、「Java SE 7」をクリックします。
http://www.oracle.com/technetwork/java/archive-139210.html

<img width="235" alt="スクリーンショット_2018-04-04_12_11_39.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/138245/fdd04a15-4aa6-1ed1-2083-af6a200b8930.jpeg">

私は開発環境が欲しいので、「Java SE Development Kit(JDK)」にある「Accept License Agreement」をクリックし、ライセンスに同意します。
実行環境のみでしたら「Java SE Runtime Environment(JRE)」でOKです。

<img width="552" alt="スクリーンショット_2018-04-04_13_08_23.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/138245/42b15340-f825-a3b5-147a-a2cafee9ef67.jpeg">

「Mac OS X x64」の.dmgファイルをクリックします。

<img width="549" alt="スクリーンショット_2018-04-04_13_08_31.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/138245/14ca62d2-ac54-bea9-bb94-5343ad8b9205.jpeg">

サインイン画面が表示されるので、「プロファイルの作成」をクリックしてOracleのアカウントを作成します。
アカウントの作成は無料です。

<img width="457" alt="スクリーンショット 2018-04-04 12.14.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/138245/5d03ce90-6d1b-c35a-9fd3-f193474945d9.png">

すでにOracleのアカウントを持っている場合はサインインし、作成の手順を飛ばしてください。

個人の場合、勤務先電話番号や会社名には個人のものを入力すればいいようです。
http://itakanaya9.hatenablog.com/entry/2013/08/22/174357

作成後、登録したメールアドレス宛にメールが届くので、そこから確認を行ってサインインすれば.dmgファイルのダウンロードが始まります。
あとは実行してインストールすればOKです。

## おわりに

Java 7と8など複数のバージョンを切り替えて使いたい場合、「jEnv」というツールを使うと簡単に行えます。
詳細は[こちらの記事](https://qiita.com/uhooi/items/9a6747084bcfd4df07a6)をご参照ください。

## 参考リンク

- [java7はどうダウンロードすればいいのでしょう。マインクラフトで五つの... - Yahoo!知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10147993125)
pstreeコマンドがなかったのでインストールしてみました

```
# pstreeを入力
[root@ik1-305-12909 subNewDir3]# pstree
コマンドがないのでインストールする
-bash: pstree: command not found
[root@ik1-305-12909 subNewDir3]# yum install psmisc
実行結果は以下になります
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: mirror.dmmlabs.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package psmisc.x86_64 0:22.20-15.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================================================================
 Package                                Arch                                   Version                                       Repository                            Size
========================================================================================================================================================================
Installing:
 psmisc                                 x86_64                                 22.20-15.el7                                  base                                 141 k

Transaction Summary
========================================================================================================================================================================
Install  1 Package

Total download size: 141 k
Installed size: 475 k
Is this ok [y/d/N]: y
Downloading packages:
psmisc-22.20-15.el7.x86_64.rpm                                                                                                                   | 141 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : psmisc-22.20-15.el7.x86_64                                                                                                                           1/1
  Verifying  : psmisc-22.20-15.el7.x86_64                                                                                                                           1/1

Installed:
  psmisc.x86_64 0:22.20-15.el7

Complete!
# pstreeを再入力
[root@ik1-305-12909 subNewDir3]# pstree
実行結果は以下になります
systemd-+-NetworkManager---2*[{NetworkManager}]
        |-abrt-watch-log
        |-abrtd
        |-2*[agetty]
        |-atd
        |-auditd---{auditd}
        |-chronyd
        |-crond
        |-dbus-daemon
        |-fail2ban-server---2*[{fail2ban-server}]
        |-firewalld---{firewalld}
        |-lsmd
        |-lvmetad
        |-master-+-pickup
        |        `-qmgr
        |-polkitd---5*[{polkitd}]
        |-rsyslogd---2*[{rsyslogd}]
        |-smartd
        |-sshd---sshd---bash---pstree
        |-systemd-journal
        |-systemd-logind
        |-systemd-udevd
        |-tuned---4*[{tuned}]
        `-wpa_supplicant
        ```
参照元はこちらです。（ありがとうございます）
https://qiita.com/todanano/items/f421c237eaa2d9adff04
JDK8〜10のインストール方法(Mac)

2018/11/07現在、JDK 7以前と同様の方法でインストールできます。
https://qiita.com/uhooi/items/c9b694e3dafa2937d81b

複数のバージョンをインストールする場合、古いバージョンから行う必要があるのでご注意ください。