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);

日帰り温泉&養老山ツーリング

天気が良かったので近所のツーリング&温泉へ行ってきた。

庭田山頂公園(養老山頂)

山頂公園に行く途中で休憩所みたいになっていたところで撮った写真。下に見えるつづら折りになっている峠道をバイクで走りました。 f:id:hkou:20170604134948j:plain

山頂公園からの見晴らし。有名なヒルクライムスポットらしくロードをよく見かけた。 f:id:hkou:20170604140032j:plain

道の駅 池田温泉

池田温泉には入らなかったが、この道の駅で昼ごはんを食べた。

蒸し牡蠣。レモン汁をかけて食べた。もっと食べたい。 f:id:hkou:20170604153135j:plain

たこ焼き f:id:hkou:20170604154154j:plain

マンゴーソフト。安定のスジャータ f:id:hkou:20170604155303j:plain

久瀬温泉 白龍の湯

九州温泉巡りツーリングへ行ったときに最初に入った温泉。 hkou.hatenablog.com

露天風呂しかないけど、人が少なくてゆっくり入れた。

f:id:hkou:20170604163657j:plain

ScalaでSlack botを作った

某社のチャット上で動作する勤怠システムを見て、自分も欲しくなったので作ってみた。
ソースコードは以下に配置した。

github.com

とりあえず勤怠の記録、参照する部分を作成したがまだまだ全然できていない。
AWSかAzureで運用するつもり
以下備忘録

構成

SwaggerでAPI作って、Scala.jsでAPIにアクセスするまで

手順メモ

Swagger Editorインストー

dockerでも配布されていたのでdocker経由でインストー

Swagger Tools Docs

docker run -p 80:8080 --name swagger-editor swaggerapi/swagger-editor

http://localhost/にアクセスする。swagger-editorが表示された。
単純なAPIの疎通確認なので、プリセットで入っているこのサンプルコードをそのまま利用する。

f:id:hkou:20170528104916p:plain

node.js用のサーバーコードを生成

メニューの「Generate Server」から「nodejs-server」を選択する。node.js用のコード一式が詰め込まれたzipファイルがダウンロードされる。 f:id:hkou:20170528105050p:plain

サーバー立ち上げ

準備

nodejs-server-server\api\swagger.yamlを開いて、hostをlocalhost:8080に設定する。

package.jsonがあるディレクトリで以下のコマンドを実行して依存パッケージを落としてくる。

npm install

実行

>node index.js
Your server is listening on port 8080 (http://localhost:8080)
Swagger-ui is available on http://localhost:8080/docs

http://localhost:8080/docsにアクセスする

なんでも良いので適当なAPIを開き、実行してみる(Try it outを押下)。レスポンスが返ってくることを確認 f:id:hkou:20170528110334p:plain

Scala.jsでAPIアクセス側を実装

plugins.sbt

scala-jsプラグインとscalariformプラグインを追加する。

resolvers += Resolver.typesafeRepo("releases")
addSbtPlugin("org.scalariform" % "sbt-scalariform" % "1.6.0")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.16")

build.sbt

scala.jsプラグインを有効化

enablePlugins(ScalaJSPlugin)

mainを作成

scalaJSUseMainModuleInitializer := true

依存ライブラリにscala.js-dom, upickleを追加

libraryDependencies += "org.scala-js" %%% "scalajs-dom" % "0.9.1"
libraryDependencies += "com.lihaoyi" % "upickle_sjs0.6_2.12" % "0.4.4"

Code

GET http://localhost:8080/v2/pet/{id}にアクセスしてレスポンス取得、パースしてcase classにマッピングするコード

import org.scalajs.dom.ext._
import upickle.default._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.scalajs.js.JSApp
import scala.util.{ Failure, Success }

case class Category(
  id: Int,
  name: String
)
case class Pet(
  id: Int,
  category: Category,
  name: String,
  photoUrls: Seq[String],
  tags: Seq[String],
  status: String
)

object Main extends JSApp {
  def main(): Unit = {
    Ajax.get("http://localhost:8080/v2/pet/10").onComplete {
      case Success(r) => {
        println(r.responseText)
        val parse = read[Pet](r.responseText)
        println(parse.id)
      }
      case Failure(t) => println(t.getMessage)
    }
  }
}

js生成

sbt
fastOptJS

HTML

scala.jsで生成したjsを読み込むだけ

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>scala.js api test</title>
    <meta charset="utf-8">
    <meta name="description" content="">
    <meta name="author" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
    <script src="../target/scala-2.12/scalajspractice-fastopt.js"></script>
</body>
</html>

動作確認

Chrome起動

普通に起動するとクロスオリジンの制約で以下のようにエラーになるので、

XMLHttpRequest cannot load http://localhost:8080/v2/pet/10. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

セキュリティ設定無効で起動

chrome.exe --disable-web-security --user-data-dir

動いた f:id:hkou:20170528113304p:plain

三重県へ温泉掘りに行ってきた

引越しがやっと落ち着いたので前から行こう行こうと思って行けなかった三重の温泉へ行ってきました。

出発

東名阪を進んでいく。 f:id:hkou:20170520094852j:plain

途中事故渋滞があった。 f:id:hkou:20170520095548j:plain

車が停められて入れそうな海岸があったので休憩がてら見に行った。この日は雲一つない快晴だった。 f:id:hkou:20170520134640j:plain

昼ごはん

昼ごはんは高速降りて尾鷲市の「お魚市場 おとと」というところで食べた。
地魚丼に生しらすをつけました。 f:id:hkou:20170520123821j:plain

湯ノ口温泉

最初の目的地、湯ノ口温泉へ到着。 f:id:hkou:20170520144014j:plain

結構長湯したので冷たいものが食べたくなり、風呂上がりにアイス買って食べた f:id:hkou:20170520154439j:plain

川湯温泉 亀屋旅館

一泊目の宿は「亀屋旅館」というところに泊まりました。旅行行くときはテント泊かビジホ泊ぐらいしかしてないからこういう旅館は新鮮。

f:id:hkou:20170520165453j:plain

川沿いの宿なので、部屋から川が一望できる f:id:hkou:20170520165753j:plain

f:id:hkou:20170521083954j:plain

川湯温泉 露天風呂

ここの川は地下から60度の源泉が湧き出しているそうで、川のどこを掘っても温泉が出てくるそうだ。一応以下写真のようなでかい温泉もあるけど混浴水着着用必須な感じなので宿に水着を貸してもらい、また温泉も掘ってみたかったのでスコップも借りて行ってみた。

f:id:hkou:20170521084053j:plain

円形になっているところが温泉部分、入ってみるとめちゃくちゃ熱い。となりが川なんだけど川の水はすごく冷たい両極端だ。川の水が温泉へ入ってくる部分がちょうど良い感じの温度になっていたのでそこに入った。 f:id:hkou:20170520175745j:plain

ある程度身体が温まったので今度は借りてきたスコップで河原に穴掘ってみた。掘ってみると川底がかすかに温かく感じる。川の水が入らないようにせき止めてしばらくしたらちょっと温めだけど温泉っぽくなった。 f:id:hkou:20170520175724j:plain

川に入ったり、温泉掘ったりしてどろだらけになったので内湯に入り直すことにした。 f:id:hkou:20170520181938j:plain

翌日

昨日掘った温泉へ行ってみると、濁っていたお湯が澄んでいてしかも結構温かく(ちょっと熱い)ぐらいになってて本当に温泉っぽい感じになっていた。 f:id:hkou:20170521084209j:plain

湯の峰温泉

川湯温泉のすぐ近くに温泉郷があるとのことで行ってみることに。 f:id:hkou:20170521094854j:plain

湯の峰温泉 つぼ湯

日本最古の湯として有名な「つぼ湯」、他のブログとか見ると1時間待ちとかしてやっと入れたとか書いてあったので、あんまり期待せずにちょっと見てみるかぐらいで行ったらちょうど人が捌けた状態らしく待ち時間無しで即効入れた。 f:id:hkou:20170521095743j:plain

このときは知らなかったけど、あとで調べてみたら世界遺産だったらしい。大きさは大人2人も入れば窮屈になるぐらい。ちょっと熱めだったけどいい湯でした。 f:id:hkou:20170521095819j:plain