深セン行ってきた(準備編)

準備編

出発する前にやったことまとめ。

航空券を購入する

他の「深セン行ってきた」系の記事やブログを見て香港→深センルートが安く済むと書いてあったのでとりあえず名古屋⇔香港の航空券を購入した。
航空券はGoogleFlightで検索してCtrip経由で購入。

GoogleFlight
https://www.google.co.jp/flights/?f=0&gl=jp

Ctripは初めて使うけど、チケット購入したらすぐにeチケット控えがメールで届いた。

f:id:hkou:20170814070635p:plain

細かい日程を決める

とりあえず航空券を先に確保したかったので大まかな日程(8月10日~8月13日)は決めておいたが、細かい内訳は後になって考えた。
深センに3日間ずっと居るのもアレなので、最初の1泊は香港観光して最後の2泊は深センに決めた。
これでホテルが予約できる。

ホテルを予約する

ホテルはagodaで予約した。
出発直前で急な予定が入り行けなくなりそうな雰囲気があったので、行けなくなったときにホテルの料金が無駄になる可能性があったのでギリギリまで予約しなかったが、結局大丈夫になったのでホテルの予約は出発の2日前になってしまった。だけど意外と部屋は空いてるっぽくてすんなり予約できた。

www.agoda.com

香港SIMを購入する

香港SIMをAmazonで購入しておいた。
香港でアクティベーションして、中国ではデータローミングで利用した。
一番不安だった中国でデータローミングしたときに中国が規制しているネットサービスにアクセスできるかどうかについては、後述するが問題なくアクセスすることが出来た。

https://www.amazon.co.jp/dp/B01LYBE3IE/

海外旅行保険に入る

クレジットカード付帯の海外旅行保険もあるが、それとはまた別途で海外旅行保険に入った。
海外旅行行くときはいつも入るこれ↓、もはや慣例になっている。

新・海外旅行保険【off!(オフ)】 www.sjnk.co.jp

アプリのインストール

出発してからインストールすると通信料無駄になるし設定等しなきゃいけなくなるので事前に日本で以下のアプリをインストールしておいた。

Baidu Map

香港はGoogleMapでも大丈夫だけど、深センは中国国内なのでGoogleMapが使えない、もしくは使えたとしても情報が古いと聞いたので一応インストールしておいた。
中国語オンリーなので最初はよく分からなかったけど、深センでは結構利用したアプリの一つ。 play.google.com

WeChat

WeChatPayを試してみたくてインストールした。
WeChatPay機能を有効にするためには入金とクレジットカードの登録が事前に必要なので、出発前にやっておいたほうが良い。

play.google.com

Octopus

オクトパスカード八達通)のチャージ金額を確認するためにインストールしておいた。 play.google.com

WeChatPayの入金

事前に調べた感じだとWeChatPayに入金する方法としては、以下の方法があるらしい。

  • 中国の銀行口座を作りそこからチャージする
  • WeChatPay使える友人とかに頼んでチャージしてもらう
  • 現地のホテルの人に頼んでチャージしてもらう(もしくは現地人)

中国の銀行口座作るなんて難易度高すぎだし(中国語喋れない)、WeChatPay使える友人おらんし、現地のホテルの人に頼むかなぁとぼんやりと考えていた。

だけど色々調べていくと最近になって、WeChatPayにチャージ代行してくれるサービスが出来たらしい。 入力フォーム画面がTLS通信になってなかったり、あんまり知名度無くて正直不安だったけど、お金捨てる覚悟で試しに使ってみたら普通にチャージしてくれた。

d.toripay.asia

ちなみに
この時はお試しだったので200元程度しかチャージしてなくて、「もし無くなったら、現地ホテルの人に頼めばいいや」と考えていたけど、今やり直せるならもっとチャージしておくべきだった。
というのも現地ホテルの人に100元紙幣を渡して、この金渡すから、WeChatPayに入金してくれない?と頼んだのだが「紙幣は偽札の可能性があるから使えない」と言われて拒否されてしまった。
あとあと調べてみると100元紙幣が一番偽札が多いらしい(自分はそのとき100元紙幣しか持ってなかった)

チケット控えなどを印刷しておく

以下を印刷した。

  • 新・海外旅行保険【off!(オフ)】の控え
  • 航空券(eチケット)控え
  • ホテルのBooking Voucher

万が一スマホが壊れたり、電池切れになった場合の保険。
ちなみに自宅にはプリンターが無いのでネットプリントを利用してセブンイレブンで印刷した。

www.printing.ne.jp

次の記事 hkou.hatenablog.com

Ubuntu 16.04LTSマシンに機械学習環境(docker, Nvidia-Docker, DIGITS等)を揃える

環境

PC(Ubuntu 16.04LTS)

こちらのPCに機械学習環境をインストールする。

hkou.hatenablog.com

hkou.hatenablog.com

インストールしたソフト

docker

公式の手順を参考にしてインストールした。

docs.docker.com

sudo apt-get update

sudo apt-get install \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo apt-key fingerprint 0EBFCD88

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt-get update
sudo apt-get install docker-ce

インストールできたか確認

$ sudo docker -v
Docker version 17.06.0-ce, build 02c1d87

Hello Worldしてみる

$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

sudo無しでdockerを使う設定は特に必要無いと思ったのでやっていない。

Nvidia Docker

リポジトリのReadme.mdの「Quick start」に従いインストールした。

github.com

wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb

sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb

インストールできたか確認。dockerコンテナ上からGPUにアクセスできている。

$ sudo nvidia-docker run --rm nvidia/cuda nvidia-smi

Mon Jul 31 12:00:23 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.82                 Driver Version: 375.82                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 0000:65:00.0     Off |                  N/A |
|  0%   40C    P8    21W / 275W |      0MiB / 11170MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Nvidia Digits

公式を参考。nvidia-dockerでdigitsのイメージ落としてくるだけなので楽です。

github.com

$ sudo nvidia-docker run --name digits -d -p 5000:5000 nvidia/digits

起動したら「ホスト:5000」にブラウザでアクセスする

f:id:hkou:20170731210546p:plain

Ubuntu マシンの状態確認系コマンドメモ

いつものこのあたりのコマンドを忘れていちいちググることになるのでメモしておく。

OSのバージョンを確認したい

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

ストレージの使用量を確認したい

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             16G     0   16G   0% /dev
tmpfs           3.2G  9.7M  3.2G   1% /run
/dev/nvme0n1p2  438G   12G  405G   3% /
tmpfs            16G  1.4M   16G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs            16G     0   16G   0% /sys/fs/cgroup
/dev/nvme0n1p1  511M  3.4M  508M   1% /boot/efi
tmpfs           3.2G   92K  3.2G   1% /run/user/1000

メモリの使用量を確認したい

$ free -h
              total        used        free      shared  buff/cache   available
Mem:            31G        1.7G         27G         41M        2.0G         28G
Swap:           31G          0B         31G

CPUの使用率を確認したい

TODO

GPUの使用率を確認したい

TODO

自作PC UnixBench結果

この↓自作PCでUnixBench動かした結果

hkou.hatenablog.com

~/program$ mkdir unixbench
~/program$ cd unixbench/
~/program/unixbench$ git clone https://github.com/kdlucas/byte-unixbench.git
Cloning into 'byte-unixbench'...
remote: Counting objects: 165, done.
remote: Total 165 (delta 0), reused 0 (delta 0), pack-reused 165
Receiving objects: 100% (165/165), 184.98 KiB | 196.00 KiB/s, done.
Resolving deltas: 100% (77/77), done.
Checking connectivity... done.


~/program/unixbench$ cd byte-unixbench/UnixBench
~/program/unixbench/byte-unixbench/UnixBench$ ./Run 


   #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
   #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
   #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
   #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
   #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
    ####   #    #  #  #    #          #####   ######  #    #   ####   #    #

   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark

   Multi-CPU version                  Version 5 revisions by Ian Smith,
                                      Sunnyvale, CA, USA
   January 13, 2011                   johantheghost at yahoo period com

Wide character in print at ./Run line 1577.
Wide character in printf at ./Run line 1608.

1 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

1 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

1 x Execl Throughput  1 2 3

1 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

1 x File Copy 256 bufsize 500 maxblocks  1 2 3

1 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

1 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

1 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

1 x Process Creation  1 2 3

1 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

1 x Shell Scripts (1 concurrent)  1 2 3

1 x Shell Scripts (8 concurrent)  1 2 3
Wide character in printf at ./Run line 1550.

12 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

12 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

12 x Execl Throughput  1 2 3

12 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

12 x File Copy 256 bufsize 500 maxblocks  1 2 3

12 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

12 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

12 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

12 x Process Creation  1 2 3

12 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

12 x Shell Scripts (1 concurrent)  1 2 3

12 x Shell Scripts (8 concurrent)  1 2 3
Wide character in printf at ./Run line 1550.

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: : GNU/Linux
   OS: GNU/Linux -- 4.4.0-87-generic -- #110-Ubuntu SMP Tue Jul 18 12:55:35 UTC 2017
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 1: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 2: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 3: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 4: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 5: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 6: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 7: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 8: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 9: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 10: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 11: Intel(R) Core(TM) i7-7800X CPU @ 3.50GHz (7007.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   22:47:10 up 58 min,  1 user,  load average: 0.64, 0.44, 0.29; runlevel 2017-07-28

------------------------------------------------------------------------
Benchmark Run: 金  728 2017 22:47:10 - 23:15:45
12 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       43680549.5 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     4047.2 MWIPS (13.0 s, 7 samples)
Execl Throughput                               1625.7 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1440146.6 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          400120.6 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2858191.9 KBps  (30.0 s, 2 samples)
Pipe Throughput                             2768809.9 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  13225.7 lps   (10.0 s, 7 samples)
Process Creation                               5428.8 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   5830.1 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   5198.0 lpm   (60.0 s, 2 samples)
System Call Overhead                        5281593.0 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   43680549.5   3743.0
Double-Precision Whetstone                       55.0       4047.2    735.9
Execl Throughput                                 43.0       1625.7    378.1
File Copy 1024 bufsize 2000 maxblocks          3960.0    1440146.6   3636.7
File Copy 256 bufsize 500 maxblocks            1655.0     400120.6   2417.6
File Copy 4096 bufsize 8000 maxblocks          5800.0    2858191.9   4927.9
Pipe Throughput                               12440.0    2768809.9   2225.7
Pipe-based Context Switching                   4000.0      13225.7     33.1
Process Creation                                126.0       5428.8    430.9
Shell Scripts (1 concurrent)                     42.4       5830.1   1375.0
Shell Scripts (8 concurrent)                      6.0       5198.0   8663.3
System Call Overhead                          15000.0    5281593.0   3521.1
                                                                   ========
System Benchmarks Index Score                                        1406.6

------------------------------------------------------------------------
Benchmark Run: 金  728 2017 23:15:45 - 23:43:58
12 CPUs in system; running 12 parallel copies of tests

Dhrystone 2 using register variables      339375066.4 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    54080.0 MWIPS (10.0 s, 7 samples)
Execl Throughput                              30202.4 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        985493.9 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          270066.8 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2958739.9 KBps  (30.0 s, 2 samples)
Pipe Throughput                            20674889.6 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                3119310.6 lps   (10.0 s, 7 samples)
Process Creation                              26741.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  73719.0 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                  10632.5 lpm   (60.0 s, 2 samples)
System Call Overhead                        8462103.8 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0  339375066.4  29081.0
Double-Precision Whetstone                       55.0      54080.0   9832.7
Execl Throughput                                 43.0      30202.4   7023.8
File Copy 1024 bufsize 2000 maxblocks          3960.0     985493.9   2488.6
File Copy 256 bufsize 500 maxblocks            1655.0     270066.8   1631.8
File Copy 4096 bufsize 8000 maxblocks          5800.0    2958739.9   5101.3
Pipe Throughput                               12440.0   20674889.6  16619.7
Pipe-based Context Switching                   4000.0    3119310.6   7798.3
Process Creation                                126.0      26741.0   2122.3
Shell Scripts (1 concurrent)                     42.4      73719.0  17386.6
Shell Scripts (8 concurrent)                      6.0      10632.5  17720.9
System Call Overhead                          15000.0    8462103.8   5641.4
                                                                   ========
System Benchmarks Index Score                                        7214.8

Ubuntu16.04 LTS環境構築 備忘録

以下のページで組んだPCの環境構築手順まとめ

hkou.hatenablog.com

アップデート

sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y dist-upgrade

ディスプレイドライバのインストー

Nouveauドライバ無効化

sudo vi /etc/modprobe.d/blacklist-nouveau.conf

↓以下を記述
blacklist nouveau
options nouveau modeset=0

再読込

sudo update-initramfs -u

GTX1080Tiのドライバインストー

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-381

機械学習系ライブラリのインストー

CUDAのインストー

Nvidia Developperのサイトからdebファイルをダウンロードする CUDA Toolkit Download | NVIDIA Developer

f:id:hkou:20170729080226p:plain

sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda

cuDNNのインストー

次はcuDNNをインストールする。ダウンロードするにはデベロッパー登録が必要だが、以前Windows10上にtensorflowを環境構築したときに作ったアカウントがあるのでそれを利用した。

https://developer.nvidia.com/rdp/cudnn-download

hkou.hatenablog.com

sudo tar xvf cudnn-8.0-linux-x64-v5.1.tgz -C /usr/local
sudo apt-get -y install libcupti-dev
sudo shutdown -r now

libcupti-devのインストー

sudo apt-get -y install libcupti-dev

Gitのインストー

sudo apt-get install git

gitをインストールしたら各種confiを設定

git config --global user.name "******"
git config --global user.email "******"
git config --global core.quotepath false

vimのインストー

最初から入っているvimは使い物にならなかったのでインストー

sudo apt-get install vim

SSH

Server(Ubuntu側)

SSH Serverは標準では入ってないっぽいのでインストー

sudo apt-get install openssh-server

設定をセキュアにする

sudo vi /etc/ssh/sshd_config

ポート番号を変更する(↓は例、別の値にした)

# What ports, IPs and protocols we listen for
Port 1000

rootログインの禁止

PermitRootLogin no

パスワードログインの禁止

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

鍵認証できる設定になっているか確認

RSAAuthentication yes
PubkeyAuthentication yes

認証用の鍵を作成する(クライアント(Windows10側))

git-bashssh-keygenを利用する。
RSAの4096bitのキーを作成
パスフレーズを聞かれるので設定する。

$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/user/.ssh/id_rsa.
Your public key has been saved in /c/Users/user/.ssh/id_rsa.pub.

作成した公開鍵(id_rsa.pub)をサーバー側へ転送

dropbox経由した。

公開鍵を登録

mv id_rsa.pub ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

SSHしてみる

Windows側のSSH ClientはRLoginを使用している。

  • Server Address
  • Socket Port
    • sshd_configで書き換えたポート番号を指定
  • User Name

f:id:hkou:20170729093717p:plain

左側ツリーの「サーバー」→プロトコルから認証キーを押下

f:id:hkou:20170729093916p:plain

ファイル/インポートから先程作成した秘密鍵を選択してOK

f:id:hkou:20170729094001p:plain

これでSSHで接続ができた

Java8のインストー

sudo add-apt-repository ppa:webupd8team/java
sudo apt update
sudo apt install oracle-java8-installer

インストールできたことを確認

$ javac -version
javac 1.8.0_131
$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

SBTのインストー

sbt Reference Manual — Installing sbt on Linux

echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
sudo apt-get update
sudo apt-get install sbt

自作PCを組んだ

以前、わりとスペックの良いノートPCを購入して、「これで何でも出来る」と思ってたけど、意外とマシンスペックが足りなく感じたり、機械学習みたいな重いプログラムをノートPCで動かしてると壊れるんじゃないかという不安を感じてきたので自作PCを組むことにした。 hkou.hatenablog.com

構成

  • CPU
    • Core™ i7-7800X(8.25M キャッシュ, 最大 4.30 GHz, 6Core 12Thread)
  • マザーボード
    • ASUS TUF X299 MARK 2
  • GPU
  • メモリ
    • CMK32GX4M2A2666C16 (16GB * 2 = 32GB)
  • SSD
    • WD WDS512G1X0C (PCIe Gen3 NVMe 8Gbs)
  • CPUクーラー
    • 虎徹 MarkII  SCKTT-2000
  • 電源
    • RM650x (CP-9020091-JP)

組み立て

購入したパーツ達

f:id:hkou:20170727120959j:plain

マザーボード開封

f:id:hkou:20170727212815j:plain

GPU開封

パーツの中で一番金をかけたのがこの部分。歴代GPUで一番良いものを購入している。
中箱 f:id:hkou:20170727212952j:plain

中箱を開封するとドライバのCDが入っていた f:id:hkou:20170727213005j:plain

GTX1080Ti。ずっしりと重い f:id:hkou:20170727213052j:plain

前自作マシンで使っていたGTS250との比較。長さが1.5倍ぐらい違う f:id:hkou:20170727213914j:plain

電源開封

650Wにした。新しいパーツを増設していくには少し物足りないかもしれない。 f:id:hkou:20170727215934j:plain

f:id:hkou:20170727220117j:plain

マザーボードGPUを指した

平置きにして刺さないとGPUの重みでPCIEスロットが折れそうな感じがする。 f:id:hkou:20170727222404j:plain

メモリ

人権(32GB) f:id:hkou:20170727222531j:plain

f:id:hkou:20170727222721j:plain

SSD

SSDはそこまでスピード必要無さそうなのでM.2 SSDで安めのものを購入

f:id:hkou:20170727222552j:plain

CPU

LGA2066のCorei Xシリーズでそれなりにスペックもあって、安めのものを購入 f:id:hkou:20170727223014j:plain

CPUクーラー

LGA2066が出たばっかりなので、この規格に合うCPUクーラーの情報が全然見つからなかった。とりあえずこれは使えるという情報があったので購入。情報どおりちゃんと使えた。

f:id:hkou:20170727223846j:plain

f:id:hkou:20170727223928j:plain

組み上がった

2,3時間かけて組み上げた。久しぶりに自作PC組んだので時間がかかった。後から外したりするかもしれないと思って電源はわざと外してある。

f:id:hkou:20170727233901j:plain

UEFI起動画面

PCを立ち上げるとUEFIが立ち上がった。メモリやCPUなどもちゃんと認識できているっぽい。 f:id:hkou:20170727234924j:plain

Ubuntuインストー

OSはUbuntu 16.04 LTSをインストールする。
Ubuntu 16.04 LTS 日本語 Remix のisoをダウンロードしておく。

Ubuntu 16.04 LTS 日本語 Remix リリース | Ubuntu Japanese Team

Live USBを作成する(失敗したパターン)

Universal USB Installerを使って上記でダウンロードしてきたiso をもとにLive USBを作成。
そのままUbuntuをインストールしようとしたが、OSインストール途中で以下のエラーが発生して失敗

GRUB を/dev/nvme0n にインストールできません。」

Live USBを作成する(成功したパターン)

今度はRufusを元にインストールUSBを作成。これを使ったらうまくインストールが成功した forest.watch.impress.co.jp f:id:hkou:20170728073042j:plain

DOMで遊んでみる

DOMについて

  • DOM(Document Object Model
    • プラットフォームに中立的なイベント・ノードツリーのモデル

DOMの仕様

DOMとHTML

HTMLはツリー構造でありDOMで表現できる。例えば以下のHTMLは以下のような構成(図)になる。

<html>
    <head></head>
    <body>
        <h1>HelloWorld</h1>
    </body>
</html>

f:id:hkou:20170702074735p:plain

ChromeでDOMを確認する

空のHTMLファイル

空のHTMLファイルを作成する。(empty.html
Chromeで開き、デベロッパーツール(Ctrl+Shft+I)で確認してみる。

f:id:hkou:20170702075511p:plain

ファイルの中身は空のはずなのにElementが作成されている。HTMLの最小構成ということだろうか。

閉じたツリー

以下のような閉じたツリーは作れるだろうか

f:id:hkou:20170702080153p:plain

bodyの下にbodyを付けてみたがDOMExceptionがthrowされてしまった。 f:id:hkou:20170702080353p:plain

DOMを操作するAPI

ルートノード取得

document.getRootNode()

IDを指定してノード取得

var elm = document.createElement("div");
elm.id = 'elm_id';
document.body.append(elm);

document.getElementById('elm_id');

クラスを指定してノード取得

var div = document.createElement("div");
div.classList.add("test_class");

document.body.appendChild(div);
document.getElementsByClassName("test_class");

CSSセレクタを指定してノード取得

// 1件取得
document.querySelector(".test_class");

// 全件取得
document.querySelectorAll(".test_class")

ノードの作成

var elm = document.createElement("div");

子ノードに追加

var elm = document.createElement("div");
document.body.appendChild(elm);

ノードの削除

var div = document.createElement("div");
document.body.appendChild(div);

// 子要素の削除
document.body.removeChild(div);

DOMとイベント

  • TODO

  • キャプチャフェーズ

  • ターゲットフェーズ
  • バブリングフェーズ

DOMとCSS

HTMLElement.styleプロパティにCSSStyleDeclarationオブジェクトとして格納されている。
ただしstyleプロパティはインラインstyle属性で設定されたCSS宣言のみしか取得できない。

document.body.style.cssText = "color: red";

document.body.style.color = "red"

外部のCSSファイルから適用されたCSSプロパティも含めた値を取得する場合は以下

window.getComputedStyle(document.body, null);