Windows10 – Git Bashでシンボリックリンクをつくれるようにする

参考:Git for Windowsでシンボリックリンクを扱えるようにする

なんかややこしそうなことが書いてある。でもできるようでうれしい。

現状

下記を実行すると、シンボリックリンクではなく、コピーが作成される。

$ ln -s /hoge/hoge

解決策

下記2点を実施したらできるようになった。ちなみに、コマンドプロンプトでmklinkというのを使えばいいかなと思ったけど、mklinkも管理者権限が必要だった。

  • .bashrcに下記を追加する。
export MSYS=winsymlinks:nativestrict
  • git bashを管理者権限で開く

Go – Delveでデバッグしてみる

Delveを使ってみます。コマンドライン上で使えるデバッガです。インストール方法は、下記です。

インストール

$ go get github.com/derekparker/delve/cmd/dlv

使い方

ヘルプとかバージョンを確認

$ dlv help
$ dlv version

Debugする

dlv debugでデバッグ開始できます。下記のようにやると待ち受け状態になります。

$ dlv debug test.go
Type 'help' for list of commands.

breakか、bでブレークポイントを設定できます。

b test.go:8
b test.go:13
  • continueかcで次のブレークポイントに飛びます。
  • nextかnで次の行にいきます。
  • printかpで、ブレーク時点での変数を内容を出力できます。
  • qで終了します。
c
     8:         m := map[int][]int{
     9:                 1: {1},
    10:                 2: {1, 2},
    11:                 3: {1, 2, 3},
    12:         }
=>  13:         fmt.Println(m)
    14:         fmt.Println(m[3][2])
    15: }
p m
map[int][]int [
        1: [1],
        2: [1,2],
        3: [1,2,3],
]
n
map[1:[1] 2:[1 2] 3:[1 2 3]]
     9:                 1: {1},
    10:                 2: {1, 2},
    11:                 3: {1, 2, 3},
    12:         }
    13:         fmt.Println(m)
=>  14:         fmt.Println(m[3][2])
    15: }
q

リモートデバッグ

下記によるとリモートデバッグもできるらいし。
参考:Windows対応中のGo言語のデバッガーdelveを試してみる

Go言語 – godefがインストールできない

Goのバージョン

$ go version
go version go1.8 windows/amd64

godefインストールエラー

vimのプラグインとかvscodeとかで、godefをインストールするようにいわれるけど、失敗する。下記のようなエラーがでる。

Error: Command failed: D:\Go\bin\go.exe get -u -v github.com/rogpeppe/godef
github.com/rogpeppe/godef (download)
# cd C:\Users\hoge\go\src\github.com\rogpeppe\godef; git pull --ff-only
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> master

package github.com/rogpeppe/godef: exit status 1
github.com/rogpeppe/godef (download)
# cd C:\Users\hoge\go\src\github.com\rogpeppe\godef; git pull --ff-only
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> master

解決策

$GOPATH/src/github.com/rogpeppe/godefが存在して、その中には.gitフォルダだけある。中途半端で止まってしまったのだろうか。

下記をしたら、プルできて色んなファイルが出てきた。

$ git pull origin master

再度インストールしてみたら、エラーがなくなった。

$ go get github.com/rogpeppe/godef

Go – Vim-goがうごかない

参考:vim-goをインストールしてみた(所要時間:15分)

環境

  • windows10
  • go1.8

.vimrcの設定

deinでvim-goプラグインをインストール設定した。

call dein#add('fatih/vim-go')

vim内で:GoInstallBinariesを実行

.vimrc設定変更後にvimを起動すると、vim-goがインストールされた上でvimが起動される。起動後に、:GoInstallBinariesを実行すると、vim-goに必要なgoのパッケージ?がインストールされるはずなんだけど、うまくいかない。

全部インストールに失敗するし、そもそも$GOPATH/binにインストールされるはずだと思うんだど、c/binにインストールしようとしている。どうも$GOPATH関連の設定読み込みがおかしいっぽい。下記のようなエラーがでる。

vim-go: gometalinter not found. Installing github.com/alecthomas/gometalinter to folder C/bin/
Error installing github.com/alecthomas/gometalinter: github.com/alecthomas/gometalinter (download)
cannot install, GOBIN must be an absolute path
vim-go: errcheck not found. Installing github.com/kisielk/errcheck to folder C/bin/
...

同じようなのがずっと続いて、結局エラーで終わる。C/binというのが出来てるわけでもない。$GOPATHの設定も問題ない。

解決策

.vimrcに下記を設定したら出来た。

let g:go_bin_path = $GOPATH.'/bin'
filetype plugin indent on

参考:https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt

Windowsの場合の問題

上記解決策だと、Windowsの場合、:GoDefとかやると、$GOPATHの\をフォルダの区切り文字と認識せずおかしなフォルダパス設定になってうまく動作しなかった。かといって、パスをベタで書くのもいやだ。でもベタでとりあえず書いて一旦終了。
あと、:GoErrCheckとかやると、パス関連が変な表示になりエラーになる。まだいろいろ設定不備がありそうなので、あとで調べる。

追記:
.bashrcに下記を追加したら問題なく動作するようになった。

export GOPATH=$HOME/go
export GOROOT=/d/go
export GOBIN=$HOME/go/bin

bitcoinアドレスつくってお金もらってみる

テストネット用のビットコインアドレスを作成して、サイトでもらってみます。

アドレス作成

$ bitcoin-cli getnewaddress
mm8A1MfJU2LXRRetNHh7msA7ronrW8rodD

もらえるサイト

下記でもらえるらしいんだけど、エラーになる。。
TP’s TestNet Faucet

Teratailで質問したら、下記でももらえると教えてくれた。
やってみたらもらえました!

http://bitcoinfaucet.uo1.net/send.php

$ bitcoin-cli getbalance
0.05619000

bitcoindのブロック保存先ディレクトリを指定する

ここにbitcoindが作成するデータ構造が書いてある。ホームディレクトリに勝手につくって、そこにブロックのデータも入れるらしいので、勝手につくるディレクトリパスを変更できればいいのかなーと思ったけど、分からない。bitcoin.confで設定できるかもなので調べてみる。

こんなのを発見した。
Bitcoin Core Config Generator (compatible with Bitcoin Core 0.14+)

datadirを設定したらできるらしい。といっても、そもそもbitcoin.confがホームディレクトリ内の.bitcoinにある。

$ bitcoind --helpとやると、オプションの説明が沢山でてきて、confというのもあった。confで設定ファイルのパスを指定すれば良さそうなんだけど、ホームディレクトリ外にあると、どうもbitcoin-cliでgetinfoできないっぽいので、~/.bitcoin/bitcoin.confに設定ファイルを作って、そのファイルでdatadirを指定しておいて、普通に$ bitcoind -testnet -daemonとやったらdatadirに指定したディレクトリにtestnet3フォルダが作られてそこにブロックデータが蓄積されるようになった。あらかじめ、datadirで指定したパスにディレクトリをつくっておかないと、start bitcoind…とかいいながらスタートしない。

$ vim ~/.bitcoin/bitcoin.conf

bitcoin.conf

rpcuser=root
rpcpassword=bitroot

HOST=localhost

server=1
txindex=1

rpcport=18332
testnet=3

datadir=/mnt/mydisk/bitcoin
$ bitcoind -testnet -daemon
$ bitcoin-cli getinfo
{
  "version": 140100,
  "protocolversion": 70015,
  "walletversion": 130000,
  "balance": 0.00000000,
  "blocks": 520705,
  "timeoffset": 0,
  "connections": 8,
  "proxy": "",
  "difficulty": 1287.193631917138,
  "testnet": true,
  "keypoololdest": 1494747675,
  "keypoolsize": 100,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
  "errors": ""
}
$ la /mnt/mydisk/bitcoin/testnet3
total 133M
-rw------- 1 root root   37 May 14 16:41 banlist.dat
-rw------- 1 root root    6 May 14 16:41 bitcoind.pid
drwx------ 3 root root 4.0K May 14 17:04 blocks
drwx------ 2 root root 4.0K May 14 17:05 chainstate
drwx------ 2 root root 4.0K May 14 16:41 database
-rw------- 1 root root    0 May 14 16:41 db.log
-rw------- 1 root root 133M May 14 17:04 debug.log
-rw------- 1 root root    0 May 14 16:41 .lock
-rw------- 1 root root 333K May 14 16:56 peers.dat
-rw------- 1 root root  88K May 14 17:01 wallet.dat

GCPのUbuntuのハードディスクを増やす

Bitcoinのブロックがでかくて容量がなくなりました。さっきメモリ増やして容量もちょっと増やしたけど、もう容量が100%になりましたので、さらに増やしたいと思います。100%になったらBitcoindが動かなくなりました。今SSD永続ディスクというのを使っていますが、これをどんどん増やすとお金がかかりそうなので、調べたいと思います。

SSD Persistant Diskの50GBだと、1月$11くらい。普通のPersistant Diskの50GBだと、1月$2.6くらい。4倍位違う。普通のやつ50GBにしようと思ったら、200GB未満だと性能悪くなるかもといわれた。200GBにしといた。ここに永続ディスクを追加した後にUbuntuに反映させる方法がのってる。ディスクをつくって、インスタンスに紐づけた後で、フォーマットしてマウントすればいいらしい。

diskを見つける

インスタンスと紐づけたディスクは下記にあるらしい。

$ ll /dev/disk/by-id
scsi-0Google_PersistentDisk_disk-1

フォーマットする

$ mkfs.ext4 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/disk/by-id/scsi-0Google_PersistentDisk_disk-1

マウントする

$ mkdir /mnt/mydisk
$ mount -o discard,defaults /dev/disk/by-id/scsi-0Google_PersistentDisk_disk-1 /mnt/mydisk

再起動時の自動マウント設定

/etc/fstabに下記を追加する

/dev/disk/by-id/scsi-0Google_PersistentDisk_disk-1 /mnt/mydisk ext4 defaults 1 1

権限設定

デバイスの書き込みアクセスをすべてのユーザーに与えます。

chmod a+w /mnt/mydisk

これで出来たのかな?

認識されてるかチェック

$ df -h
/dev/sdb        196G   61M  186G   1% /mnt/mydisk

ちゃんといる。

再起動しても認識されるかチェック

いる。

Bitcoindを設定してみる

参考:bitcoin-cliを使ったBitcoinAPI入門

上記のサイトに詳しい説明がありましたので、これを見ながら設定してみます。

bitcoindのバージョン

$ bitcoind --version
Bitcoin Core Daemon version v0.14.1.0-f2a96e7d0

bitcoin.confの設定

bitcoin.confのサンプルがここにあります。testnetの最新バージョンは公式サイトで確認できるらしい。公式サイトってこれかなー?とりあえず3が現在のバージョンと書いてあるので3でいいっぽい。

bitcoin.confの中身

rpcuser=root
rpcpassword=bitroot

HOST=localhost

server=1
txindex=1

rpcport=18332
testnet=3

bitcoindを動かす

$ bitcoind -testnet -daemon
Bitcoin server starting

bitcoindの動作確認

参考サイトのとおりに、やってみる。

$ curl --data-binary '{"jsonrpc":"1.0","id":"curltext","method":"getinfo","params":[]}' -H 'content-type:text/plain;' http://root:bitroot@localhost:18332

{"result":{"version":140100,"protocolversion":70015,"walletversion":130000,"balance":0.00000000,"blocks":25340,"timeoffset":0,"connections":3,"proxy":"","difficulty":5.98565110032135,"testnet":true,"keypoololdest":1494738114,"keypoolsize":100,"paytxfee":0.00000000,"relayfee":0.00001000,"errors":""},"error":null,"id":"curltext"}

なんか返ってきた。

testnetのブロックのダウンロード

インターネットに接続された状態で、bitcoindを起動していると勝手にブロックを取ってくるらしい。つまり今頑張って取得している最中なはず。ブロックの取得状況は下記で確認できるらしい。

$ bitcoin-cli -testnet getinfo
{
  "version": 140100,
  "protocolversion": 70015,
  "walletversion": 130000,
  "balance": 0.00000000,
  "blocks": 178068,
  "timeoffset": 0,
  "connections": 8,
  "proxy": "",
  "difficulty": 256,
  "testnet": true,
  "keypoololdest": 1494738114,
  "keypoolsize": 100,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
  "errors": ""
}

今、178068番目を取得した状態ということかな。17万位。ここでテストネットのブロックの最新状況等が分かる。現在の最新ブロックは、1,122,954なので、まだまだ取得始まったばっかり。この短時間でどのくらい取得が進んだから一応見てみよう。

{
  "version": 140100,
  "protocolversion": 70015,
  "walletversion": 130000,
  "balance": 0.00000000,
  "blocks": 339132,
  "timeoffset": 0,
  "connections": 8,
  "proxy": "",
  "difficulty": 256,
  "testnet": true,
  "keypoololdest": 1494738114,
  "keypoolsize": 100,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
  "errors": ""
}

進んでる。

Bitcoinをソースコードからインストールする

Bitcoinをソースコードからインストールしてみます。

環境

  • Ubuntu17.04

インストール

$ git clone git@github.com:bitcoin/bitcoin.git

UNIX BUILD NOTESに書いてあるとおりインストールする。

$ sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils
$ sudo apt-get install libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-program-options-dev libboost-test-dev libboost-thread-dev
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:bitcoin/bitcoin
$ sudo apt-get update
$ sudo apt-get install libdb4.8-dev libdb4.8++-dev
$ sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler
$ sudo apt-get install libqrencode-dev
$ sudo apt-get install libminiupnpc-dev
$ sudo apt-get install libzmq3-dev

makeしてみる。

$ cd bitcoin
$ ./autogen.sh
$ ./configure
$ make
$ make install

インストールできた。

参考:Bitcoinプログラミングの入り口

ブログのソースコードに色つけるやつを変えた

WordPressのクレヨンとかいうやつから、ここに書いてあるHighlight.jsのやつに変えた。ついでにマークダウンも追加した。クレヨンはpreで囲まれた中身を自動で変換するが、highlight.jsはpre > codeで囲まれた中身を変換するので、シンプルな移管ができなそうな状況になった。ちょっと調べたけど、対応するタグをpre >
code
以外にも追加するようなことはできないっぽいので、データベースのprepre > codeに変換することにした。一応バックアップとった。

いいプラグインを発見した。正規表現も使えるので、これを使ったら一瞬で終わった。
Search Regexプラグインの使い方

Ubuntuの時間ずれの解消

Ubuntuの時間がずれてます。7時なのに前日の22時になります。9時間遅れています。

参考:Ubuntu インストールしたらやること:時刻を同期するNTPサーバーを変更する

systemd-timesyncdの状態確認

$ systemctl status systemd-timesyncd
$ systemctl status ntp

ntpが有効になっていました。

systemd-timesyncdを有効化

$ systemctl stop ntp
$ systemctl start systemd-timesyncd

timesyncd.confの設定

$ vim /etc/systemd/timesyncd.conf

timesyncd.confの中身

[Time]
NTP=ntp.ring.gr.jp

systemd-timesyncdを再起動

$ systemctl restart systemd-timesyncd

これで直った。

GCPのCompute EngineのUbuntuでvsftpdを使う

Ubuntu17.04にvsftpdを入れてみる。vsftpdはFTPサーバ。

インストール

$ apt-get install vsftpd

GCPのポートあける

参考:Google Compute Engineのファイヤーウォールを理解する #gcpja

vsftpd.confの設定

参考:
vsftpサーバ 設定ガイド
Ubuntu 12.04 サーバー再構築(10) FTPの導入

$ vim /etc/vsftpd.conf

設定ファイルの内容

listen=YES
#listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
write_enable=YES

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
allow_writeable_chroot=YES
#chown_uploads=YES

userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/vsftpd.user_list

secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd

FTP接続してみる

$ ftp localhost
$ ftp 123.123.123.123

Rails – 色々やってみる

$ rails new rails1
$ cd rails1
$ rails db:migrate

プロジェクト作っていきなりdb:migrateしたら、developement.sqlite3と、schema.rbが作成された。中身はからなはず。DataGrip使って見てみる。空だ。
とりあえず1つscaffoldする。

$ rails g scaffold user name:string email:string
      invoke  active_record
      create    db/migrate/20170411151003_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      create      app/views/users/_user.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.coffee
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

大量のものを作成している。
この状態で、rails sをすると下記エラーがでる。

Migrations are pending. To resolve this issue, run: bin/rails db:migrate RAILS_ENV=development

マイグレーションをDBに反映してないことが分かるようです。
マイグレーションファイルを見てみます。

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end

ではSQLiteを見てみます。DataGrip便利だな。usersテーブルができていて、created_at、updated_atもあります。idというプライマリーキーもあります。
scaffoldするとjsonにも対応している。

とりあえずViewにBootstrapを適用してみる。その前に、cssとかの読み込み状態を確認してみる。

<link rel="stylesheet" media="all" href="/assets/scaffolds.self-50415e02e26bd1d252d84df1b2baeea859ec7e1c4f26c45a801029454454bc62.css?body=1" data-turbolinks-track="reload" />
<link rel="stylesheet" media="all" href="/assets/users.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" />
<link rel="stylesheet" media="all" href="/assets/application.self-af04b226fd7202dfc532ce7aedb95a0128277937e90d3b3a3d35e1cce9e16886.css?body=1" data-turbolinks-track="reload" />
    <script src="/assets/jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/jquery_ujs.self-784a997f6726036b1993eb2217c9cb558e1cbb801c6da88105588c56f13b466a.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/turbolinks.self-c5acd7a204f5f25ce7a1d8a0e4d92e28d34c9e2df2c7371cd7af88e147e4ad82.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/action_cable.self-5454023407ffec0d29137c7110917e1e745525ae9afbc05f52104c4cd6597429.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/cable.self-6e0514260c1aa76eaf252412ce74e63f68819fd19bf740595f592c5ba4c36537.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/users.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/application.self-b89234cf2659d7fedea75bca0b8d231ad7dfc2f3f57fcbaf5f44ed9dc384137b.js?body=1" data-turbolinks-track="reload"></script>

なんか激しい感じだ。cakephpと違ってAssetまで融合させようとしている感じがひしひしと伝わってくる。
app/assets/javascrptsとapp/assets/styleshetsの中にあるものが全部読み込まれている。

<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

この設定を変えると変わるはず。Jsはjquery,jquery-uiとかも勝手にインストールされている。外す方法確認しないと。

下記のようにやると、assetが結合・圧縮されるらしい。処理内容は設定によるだろうけど。

$ rails assets:precompile RAILS_ENV=production

app/assets/javascripts/application.jsと、app/assets/stylesheets/application.cssには、下記のような記述がありここを変更すると読み込む内容を変更できるらしい。

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

assetが便利だけど複雑だな。rails sをやり直さないとエラーのままになることあるな。

$ rails assets:precompile RAILS_ENV=production

をやったら、確かにpublic/assetsに圧縮されたものが格納された。
js/css共に1つのファイルが出力された。あとはgzファイルもある。このコンパイルをしておけば、本場環境ではこれらを読み込むようになるはず。

Railsのコード短いなー。scaffoldだとバリデーションないので、モデルのバリデーション入れてみる。

class User < ApplicationRecord
  before_save { self.email = email.downcase }
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
            format: { with: VALID_EMAIL_REGEX },
            uniqueness: { case_sensitive: false }
end

入力画面で空状態で登録押すとエラーでる。cakephpみたいにformにまでvalidationが反映されるわけではないのかな。
英語のエラーだから日本語にしてみる。Djangoみたいに、設定ファイルで日本語ってやると日本語になるわけではないらしい。
やり方ここに書いてあった。

ja.ymlをconfig/locales/に追加
config/application.rbにconfig.i18n.default_locale = :jaを追加
サーバーを再起動
さらにモデルの属性名(nameなど)を日本語化する場合は、ja.ymlに次のように記載して下さい。

# config/locales/ja.yml
ja:
attributes:
name: 名前

3 error prohibited this user from being saved:というバリデーションエラーのメッセージは英語のままだな。

new.html.erbがすごい。3行しかない。でもrenderだからパーシャルを読み込んでるわけで、全自動でフォームが作られてるわけではない。

<h1>New User</h1>

<%= render 'form', user: @user %>

<%= link_to 'Back', users_path %>

パーシャルは、下記のように書く。これは_form.html.erbを読み込む。アンダーバーがパーシャルのしるしらしい。

<%= render 'form'%>

パーシャルの内容は下記。

<%= form_for(user) do |f| %>
  <% if user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
      <% user.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %>
    <%= f.text_field :name %>
  </div>

  <div class="field">
    <%= f.label :email %>
    <%= f.text_field :email %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

エラーメッセージがベタ打ちだから英語のままだったんだな。

エラーメッセージの表示方法はアプリケーションごとに異なるため、Railsではこれらのメッセージを直接生成するビューヘルパーは含まれていません。 しかし、Railsでは一般的なバリデーションメソッドが多数提供されているので、カスタムのメソッドを作成するのは比較的簡単です。また、scaffoldを使用して生成を行なうと、そのモデルのエラーメッセージをすべて表示するERBがRailsによって一部の_form.html.erbファイルに追加されます

bootstrapに対応して、エラーを日本語にしてみた。

<div class="row">
<%= form_for(user) do |f| %>
  <% if user.errors.any? %>
    <div id="error_explanation">
      <h2><%= user.errors.count %>件のエラーが発生しました</h2>
      <ul>
      <% user.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <div class="col-md-6">
    <%= form_for(@user, url: users_path) do |f| %>
        <div class="form-group">
          <%= f.label :name %>
          <%= f.text_field :name, class: 'form-control' %>
        </div>
        <div class="form-group">
          <%= f.label :email %>
          <%= f.email_field :email, class: 'form-control' %>
        </div>
        <%= f.submit "submit", class: "btn btn-primary" %>
    <% end %>
  </div>
<% end %>
</div>

エラー発生フィールドはエラークラスのdivで囲われるから、それにスタイルつければ、エラーここだよ、というのが示せる。

次は、モデル(アクティブレコードと呼ぶらしい)のクエリ系のやつ覚えて、セッション、キャッシュとか確認して、認証のやり方確認して、セキュリティに関して確認したら大体何でもできそう。

Dockerの使い方(2)

シンプルなWEBアプリを構築してローカルブラウザで確認する。

$ docker run -dP training/webapp python app.py
$ docker ps -l

PORTSに下記が書いてある。
0.0.0.0:32768->5000/tcp
コンテナの5000ポートがdockerホストの32768に割り当てられている

$ docker-machine ip
192.168.99.100

ブラウザで192.168.99.100:32768を見るとHello Worldが表示された。

割り当てるポートを明示する場合

$ docker run -d -p 8080:5000 training/webapp python app.py

docker portで割り当て確認できる

$ docker port loving_snyder
5000/tcp -> 0.0.0.0:8080

コンテナのログを見る

 $ docker logs -f loving_snyder
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.99.1 - - [28/Mar/2017 11:37:56] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:37:56] "GET /favicon.ico HTTP/1.1" 404 -
192.168.99.1 - - [28/Mar/2017 11:37:57] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:37:58] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:37:58] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:37:59] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:37:59] "GET / HTTP/1.1" 200 -
192.168.99.1 - - [28/Mar/2017 11:38:14] "GET /users HTTP/1.1" 404 -

Dockerfileからdocker imageを作り、リポジトリに上げる。

$ mkdir hoge
$ cd hoge
$ vim Dockerfile

FROM ubuntu:16.04
MAINTAINER hoge<hoge@gmail.com>
RUN apt-get update && apt-get install -y ruby ruby-dev

$ docker build -t hoge/ruby:v1 .
$ docker iamges

タグつける
$ docker tag  c36bf8d96a58 hoge/ruby:devel 

ダイジェスト値
$ docker images --digests

$ docker login --username=hoge --email=hoge@gmail.com
$ docker push hoge/ruby

不要なコンテナを全部削除する。

停止中コンテナの一括削除

$ docker rm `docker ps -a -q`

Docker – 基本的な使い方

Windows10でDocker Toolboxを使っています。

Dockerのアップデート

今のバージョンを確認します。

$ docker -v

Docker version 1.12.2, build bb80604

まずDocker Toolbox自体をアップデートさせます。ここからWin用をダウンロードして実行したらできると思います。

$ docker -v

Docker version 17.03.0-ce, build 60ccb22
なんだこれは全然違う。半年も経ってないのに。

$ docker version
Client:
 Version:      17.03.0-ce
 API version:  1.24 (downgraded from 1.26)
 Go version:   go1.7.5
 Git commit:   60ccb22
 Built:        Thu Mar  2 01:11:00 2017
 OS/Arch:      windows/amd64

Server:
 Version:      1.12.2
 API version:  1.24 (minimum version )
 Go version:   go1.6.3
 Git commit:   bb80604
 Built:        Tue Oct 11 17:00:50 2016
 OS/Arch:      linux/amd64
 Experimental: false

Client/Serverのバージョンのようです。ちょっと前までは、docker -vとやるとサーバのバージョンが出てたけど、今はクライアントのバージョンがでているようです。

Dockerの使い方概要

Docker Hubからdockerイメージを探して、docker pullでイメージをダウンロードして、docker runでコンテナを作成・実行します。

Docker Hub

ここにDocker Hubがあります。沢山イメージがあります。

dockerイメージを落とす

docker pullコマンドでイメージをローカルに落とせます。docker pull rubyとやるとrubyのイメージがダウンロードされます。このrubyは何かというと、ここにあります。ruby:2.4.1というように、[:]の後にタグをつけることもできます。タグは、基本バージョンになります。latestというタグを使うと、最新版をpullできます。

$ docker pull ruby:latest

dockerイメージ一覧を確認する

docker imagesコマンドで、ローカルのイメージ一覧が確認できます。

$ docker images
REPOSITORY  TAG     IMAGE ID      CREATED     SIZE
ruby        latest  d2cee8adb148  5 days ago  678 M

コンテナを作成・実行する

docker runコマンドでコンテナを作ります。コマンドの使い方は下記です。

$ docker run [オプション] [–name {コンテナー名}] {イメージ名}[:{タグ名}] [コンテナーで実行するコマンド] [引数]

コンテナ名rubyのrubyイメージのコンテナを作成する場合下記になります。

$ docker run --name ruby ruby:latest

-i オプションをつけると、標準入力が開きます。rubyコンテナの標準入力を開いたらirbが起動しました。一度docker runで作成・実行したコンテナは、処理が終わるとすぐに停止しますが、コンテナとしては停止中の状態で存在しています。よって、再度上記docker runコマンドを実行すると下記のようなエラーになります。docker runコマンドはコンテナが存在しない状態で新たに作成する際に使用するコマンドです。

Error response from daemon: Conflict. The name “/ruby” is already in use by container 8504a9a10098ff4a5f3b680adc74ba625a3b39dd6cc332485d96d9cbbdac951f. You have to remove (or rename) that container to be able to reuse that name.

停止中のコンテナを再実行する場合は、docker startコマンドを利用します。使い方は下記になります。コンテナIDは、次のdockerコンテナの一覧を表示させるとCONTAINER IDというのが確認できます。

$ docker start [-i] {コンテナー名}|{コンテナーID}

先程のrubyコンテナの標準入力を開く場合は、下記のようにします。

$ dcoker start -i ruby

dockerコンテナの一覧を確認する

docker psコマンドを使います。-a オプションを使うと停止中コンテナも表示されます。

$ docker ps -a
CONTAINER ID   IMAGE        COMMAND  CREATED        STATUS                     PORTS  NAMES
8504a9a10098   ruby:latest  "irb"    2 minutes ago  Exited (0) 50 seconds ago         ruby

dockerコンテナを削除する

docker rmコマンドを使います。削除対象を指定するには、コンテナ名かコンテナIDを使います。

$ dcoker rm ruby