vagrant-digitalocean provider の簡単な使い方

次のような Vagrantfile を用意します。

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure('2') do |config|
config.vm.provider :digital_ocean do |provider, override|
override.ssh.private_key_path = '~/.ssh/digitalocean-vagrant'
override.vm.box = 'digital_ocean'
override.vm.box_url = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"
provider.token = ''
provider.image = 'CentOS 6.5 x64'
# San Francisco 1
provider.region = 'sfo1'
provider.size = '512mb'
end
end

前提条件としては

  • Apps & API メニューで Personal Access Tokens を生成すること。Read, Write アクセス付与。
  • Vagrant という名前の秘密鍵が登録されていること。
  • ~/.ssh/digitalocean-vagrant と対になる公開鍵 ~/.ssh/digitalocean-vagrant.pub が存在すること。
  • 選択されているリージョンは San Francisco 1 (slug名になっている)。

ちなみに現在のリージョンとslug名の対応は以下のようになっている。

slug Region Name
nyc1 New York 1
ams1 Amsterdam 1
sfo1 San Francisco 1
nyc2 New York 2
ams2 Amsterdam 2
sgp1 Singapore 1
lon1 London 1
nyc3 New York 3

調べ方はさっきのパーソナルトークンを指定して以下の様な curl コマンドを発行すればいいです。
jq でフィルタリングしてます。

curl -X GET "https://api.digitalocean.com/v2/regions" \
-H "Authorization: Bearer $DIGITAL_OCEAN_TOKEN" \
2>/dev/null | jq '.regions [] | .slug,.name'

EC2 と違って Droplet が存在しているだけで課金対象になるので用が済んだらすぐに

vagrant destroy -f

References

  1. VagrantとSSDなVPS(Digital Ocean)で1時間1円の使い捨て高速サーバ環境を構築する – Glide Note – グライドノート
  2. jq コマンドが強力すぎてヤバい件 | CUBE SUGAR STORAGE
  3. DigitalOcean API

vagrant-digitalocean で vagrant up すると NoMethodError となる件

以下の様なエラーとなります。

% vagrant up --provider=digital_ocean
Bringing machine 'default' up with 'digital_ocean' provider...
==> default: Using existing SSH key: Vagrant
==> default: Creating a new droplet...
/Users/wnoguchi/.vagrant.d/gems/gems/vagrant-digitalocean-0.6.2/lib/vagrant-digitalocean/actions/create.rb:37:in `call': undefined method `first' for nil:NilClass (NoMethodError)
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/warden.rb:34:in `call'
from /Users/wnoguchi/.vagrant.d/gems/gems/vagrant-digitalocean-0.6.2/lib/vagrant-digitalocean/actions/setup_key.rb:33:in `call'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/warden.rb:34:in `call'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/warden.rb:95:in `block in finalize_action'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/warden.rb:34:in `call'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/warden.rb:34:in `call'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/builder.rb:116:in `call'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/runner.rb:66:in `block in run'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/util/busy.rb:19:in `busy'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/runner.rb:66:in `run'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/builtin/call.rb:53:in `call'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/warden.rb:34:in `call'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/builtin/config_validate.rb:25:in `call'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/warden.rb:34:in `call'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/builder.rb:116:in `call'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/runner.rb:66:in `block in run'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/util/busy.rb:19:in `busy'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/runner.rb:66:in `run'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/machine.rb:196:in `action_raw'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/machine.rb:173:in `block in action'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/environment.rb:434:in `lock'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/machine.rb:161:in `call'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/machine.rb:161:in `action'
from /Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/batch_action.rb:82:in `block (2 levels) in run'

DigitalOcean API V2 は Public Beta なので仕様が変わったためのようです。

Public Beta
Due to the large number of changes to API v2 we have decided to release it as a beta to collect user feedback. Please note that >during this period based on user feedback we may make some large changes which may break compatibility.

DigitalOcean API

このあたりは以下の Issue とプルリクで修正方法が確立されているので早く本家にマージされてほしいです。

とりあえずなんとかしたい方は対処療法的には

~/.vagrant.d/gems/gems/vagrant-digitalocean-0.6.2/lib/vagrant-digitalocean/actions/create.rb

の 37 行目を

          @client.wait_for_event(env, result['droplet']['action_ids'].first)
# ↓
@client.wait_for_event(env, result['links']['actions'].first['id'])

とすればいいです。

Vagrant AWS Provider を使ってみた

まずはダミーの box イメージをインポートする。

vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box

そして次のような Vagrantfile を書く。
前提条件は以下。

  • IAMで予めEC2にアクセスを制限したユーザのクレデンシャルを払いだしておくこと
  • 使用するキーペアの名前は vagrant
  • 起動するインスタンスタイプは t2.micro (デフォルトだと m3.medium で起動してしまう)
  • Vagrant 用のセキュリティグループを定義してそれを使用
  • 東京リージョンを指定(ap-northeast-1)
  • 起動する AMI は Amazon Linux AMI 2014.03.2 (HVM) (ami-29dc9228)
  • SSH ユーザ名は ec2-user
  • 対応する秘密鍵の場所を指定する。
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "dummy"
config.vm.provider :aws do |aws, override|
aws.access_key_id = ""
aws.secret_access_key = ""
aws.keypair_name = "vagrant"
aws.instance_type = "t2.micro"
aws.security_groups = [ "vagrant" ]
aws.region = "ap-northeast-1"
# Amazon Linux AMI 2014.03.2 (HVM)
aws.ami = "ami-29dc9228"
override.ssh.username = "ec2-user"
override.ssh.private_key_path = "~/.ssh/aws-ec2-vagrant.pem"
end
end

そして

vagrant up --provider=aws

以下の様なエラーが出るが、ここでは気にしない。

==> default: Rsyncing folder: /Users/wnoguchi/Documents/tmp/vagrant-ec2/ => /vagrant
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
mkdir -p '/vagrant'
Stdout from the command:
Stderr from the command:
sudo: sorry, you must have a tty to run sudo

IPアドレス知らなくてもSSHできる。

vagrant ssh

グローバルIPが知りたければインスタンスメタデータcurl で取得する。

[ec2-user@ip-172-31-25-90 ~]$ curl -w "\n" http://169.254.169.254/latest/meta-data/public-hostname
ec2-54-64-60-151.ap-northeast-1.compute.amazonaws.com
[ec2-user@ip-172-31-25-90 ~]$ curl -w "\n" http://169.254.169.254/latest/meta-data/public-ipv4
54.64.60.151

あとは nginx 入れるなりなんなりして実験して、用が済んだら

vagrant halt

か潔く

vagrant destroy -f

References

  1. mitchellh/vagrant-aws
  2. インスタンスメタデータとユーザーデータ – Amazon Elastic Compute Cloud

CentOS 6.5 に MySQL 5.6 をインストールする

けっこう雑です。

sudo rpm -ivh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
sudo yum -y install mysql-community-server
sudo service mysqld start
sudo chkconfig mysqld on

以下、開発用の設定。

$ sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n]
New password: ← rootパスワードをキーイン
Re-enter new password: ← rootパスワードをキーイン
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n]
... Success!
Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] n ← リモートからの root ログインを許可しないようにしない
... skipping.
By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n]
- Dropping test database...
ERROR 1008 (HY000) at line 1: Can't drop database 'test'; database doesn't exist
... Failed!  Not critical, keep moving...
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n]
... Success!
All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!
Cleaning up...

あとは Vagrant で立ち上げた時にホストマシンからアクセスできるように権限設定する。

mysql -u root -pvagrant -e "grant all privileges on *.* to 'root'@'127.0.0.1' identified by 'vagrant' with grant option"
mysql -u root -pvagrant -e "grant all privileges on *.* to 'root'@'%' identified by 'vagrant' with grant option"
mysql -u root -pvagrant -e "flush privileges"

おわり。

References

  1. MySQL :: Download MySQL Yum Repository
  2. MySQL :: A Quick Guide to Using the MySQL Yum Repository

Mac OS X の tmux でクリップボードを使えるようにした(pbcopyとか)

いい加減 tmux でクリップボード使えないのはつらくなってきた。
gist コマンドでも -c オプションでクリップボードにコピーできないし。

% gist -c -u d3a3efa1a45eca669574 ~/.tmux.conf
Error: Copying to clipboard failed.
If you're running tmux on a mac, try http://robots.thoughtbot.com/post/19398560514/how-to-copy-and-paste-with-tmux-on-mac-os-x
Attempted to copy: https://gist.github.com/d3a3efa1a45eca669574

pbcopy も使えないしホント困る。
Homebrew でインストールできるらしい。

% brew info reattach-to-user-namespace
reattach-to-user-namespace: stable 2.3, HEAD
https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard
Not installed
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/reattach-to-user-namespace.rb
==> Options
--wrap-launchctl
Include wrapper for launchctl with this fix
--wrap-pbcopy-and-pbpaste
Include wrappers for pbcopy/pbpaste that shim in this fix
--HEAD
install HEAD version

なんかオプションはいらない気がする。
気軽にインストール。

brew install reattach-to-user-namespace

~/.tmux.conf の最後に以下を記述した。
zsh じゃない人は適宜読み替えてね。

# Mac Specific Settings:
#-------------------------------------------------------------------
set-option -g default-command "reattach-to-user-namespace -l zsh"
# Use vim keybindings in copy mode
setw -g mode-keys vi
# Setup 'v' to begin selection as in Vim
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
# Update default binding of `Enter` to also use copy-pipe
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
#-------------------------------------------------------------------

pbcopyはもちろんのこと、キーバインディングも vi になったし、tmux の copy モードでクリップボードにコピーできて、脳みそとけちゃいそうです。

.tmux.conf の Gist 更新しとこ。

% gist -c -u d3a3efa1a45eca669574 ~/.tmux.conf

References

  1. tmux Copy & Paste on OS X: A Better Future
  2. ChrisJohnsen/tmux-MacOSX-pasteboard
  3. tmuxとMacのクリップボードを共有する(copy-mode, vim) – Qiita
  4. tmux のコピーモードを使ってみる〜 Mac 編 〜 – ようへいの日々精進 XP

Mac に Homebrew でクリップボード共有機能搭載版の vim をインストールする

Mac 標準搭載の現行のバージョンはこう。

% vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Dec 19 2013 15:19:49)
Compiled by root@apple.com
Normal version without GUI.  Features included (+) or not (-):

そして有効になっていない。

% /usr/bin/vim --version | grep clipboard
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
-xterm_clipboard -xterm_save

Homebrew で入れよう。

brew update
brew install vim

ついでに gist コマンドが更新されていたので brew upgrade gist しといた。 gist -l 便利。

端末を立ち上げ直す。
ただし /etc/paths をいじってあるのが前提。

% vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 22 2014 07:37:47)
MacOS X (unix) version
Included patches: 1-335
Compiled by Homebrew
Huge version without GUI.  Features included (+) or not (-):

有効になってるか確認。

% vim --version | grep clipboard
+clipboard       +iconv           +path_extra      -toolbar
+eval            +mouse_dec       +startuptime     -xterm_clipboard

~/.vimrc に以下の記述を追加。

set clipboard+=unnamed

OK!

後日談(重要)

いつのまにか delete キーが効かなくなってたことに気づいた・・・。
すげー焦った。自前で set backspace しないといけないらしい。

set backspace=indent,eol,start

References

  1. MacのVimでHomebrewを使ってクリップボード連携を有効にする – Qiita
  2. インサートモード時にバックスペースが効かないのに気づいた – TrashSUITE

非常に今更ながらGitHubでSVNHubを使ってみた

GitHub があるぐらいだから SVNHub なんてのもあるんじゃないかと思って探してみたら、ありました。

SVNHub

f:id:wnoguchi0727:20140820233110p:plain

2013年ぐらいに最初ここを見た時はジョークサイトで、SVNHubなんてものがないか探してきた人に対して「そんなことよりGit使おうぜ!!」って言ってるだけかと思ったんだけど、今になって何を思ったか、またSVNHubでぐぐって再度ここに訪れてみてよくよく見ると違った。
リンク先のエントリを見ると意外とまじめにSVNHubとしての機能が実装されているようで、GitHubSVNクライアントのプロトコルをうまい具合にハンドリングしてくれるようだ。
しかも記事の書かれた時期が2010年とか書いてあるから4年も前から実装されてるのね、これ。

  1. Announcing SVN Support
  2. Improved Subversion Client Support

暇なやつだなって思われるかもしれないですが、実際にリポジトリ作ってやってみました。

もろもろの情報

使った SVN のクライアントのバージョンは

% svn --version
svn, version 1.7.14 (r1542130)
compiled Aug 19 2014, 23:56:41

です。

使ったリポジトリは以下。

wnoguchi/svnhub_test

SVNでチェックアウトするときのURL

GitではリポジトリをクローンするURLは

https://github.com/wnoguchi/svnhub_test.git
git@github.com:wnoguchi/svnhub_test.git

な感じになるけど、SVNでは

svn co https://github.com/wnoguchi/svnhub_test/trunk svnhub_test

な感じになる。

svn+ssh秘密鍵で認証してコミットできたほうが僕は好きなんだけど、これはサポートされていないみたいだ。

svn co svn+ssh://git@github.com/wnoguchi/svnhub_test

使ってみた

チェックアウト

% svn co https://github.com/wnoguchi/svnhub_test/trunk svnhub_test
A    svnhub_test/LICENSE
A    svnhub_test/README.md
Checked out revision 1.

コミット

次の内容で変更したとする。

% svn diff
Index: README.md
===================================================================
--- README.md (revision 1)
+++ README.md (working copy)
@@ -1,4 +1,13 @@
-svnhub_test
-===========
+SVNHub Test
+===============
-SVNHub Test Repository.
+SVNHub Test Repository.
+SVNHub のテストです。
+aaaaaaaaaaaaaaaaaaaaaa.
+bbbbbbbbbbbbbbbbbbbbbb.
+cccccccccccccccccccccc.
+dddddddddddddddddddddd.
+eeeeeeeeeeeeeeeeeeeeee.
+ffffffffffffffffffffff.
+gggggggggggggggggggggg.
+

ここで2段階認証等を設定している場合は設定であらかじめSVNクライアント用に認証トークンを払いだしてそれをパスワードとして与えないといけないので注意。

% svn commit
Authentication realm: <https://github.com:443> GitHub
Username: wnoguchi
Password for 'wnoguchi':
Sending        README.md
Transmitting file data .
Committed revision 2.

コミットできてるか確認する。

% svn update
Updating '.':
At revision 2.
% svn log
------------------------------------------------------------------------
r2 | wataru.noguchi | 2014-08-20 22:20:52 +0900 (水, 20  8 2014) | 2 lines
Update README.
------------------------------------------------------------------------
r1 | wataru.noguchi | 2014-08-20 22:15:42 +0900 (水, 20  8 2014) | 2 lines
Initial commit
------------------------------------------------------------------------

GitHub上で確認するとちゃんとコミットが送信されていることがわかる。

f:id:wnoguchi0727:20140820233111p:plain

空ディレクトリを追加しようとしたらどうなるか

% mkdir testdir
% svn add testdir
A         testdir
% svn commit
Adding         testdir
svn: E160024: Commit failed (details follow):
svn: E160024: Empty directories are not supported: trunk/testdir
svn: E160024: Your commit message was left in a temporary file:
svn: E160024:    '/Users/wnoguchi/Documents/tmp/svnhub_test/svn-commit.tmp'

そんなものはサポートされてねーって怒られました。
ですよねー。

じゃあGitの定石にしたがって .gitkeep を作成して追加してみる。

% touch testdir/.gitkeep
% svn add testdir/.gitkeep
A         testdir/.gitkeep
% svn commit -F svn-commit.tmp
Adding         testdir
Adding         testdir/.gitkeep
Transmitting file data .
Committed revision 3.

いけたいけた。
ログ確認。

% svn log
------------------------------------------------------------------------
r3 | wataru.noguchi | 2014-08-20 22:25:53 +0900 (水, 20  8 2014) | 2 lines
Add blank directory.
------------------------------------------------------------------------
r2 | wataru.noguchi | 2014-08-20 22:20:52 +0900 (水, 20  8 2014) | 2 lines
Update README.
------------------------------------------------------------------------
r1 | wataru.noguchi | 2014-08-20 22:15:42 +0900 (水, 20  8 2014) | 2 lines
Initial commit
------------------------------------------------------------------------

ほんとにできてんの?

これほんとにGitHubを中央リポジトリとして見て毎回ちゃんとデータ見に行ってるの?って疑問がわいたのでネットワーク接続を切ってみました。
これでログを確認してみます。

% svn log
svn: E175002: Unable to connect to a repository at URL 'https://github.com/wnoguchi/svnhub_test/trunk'
svn: E175002: OPTIONS of 'https://github.com/wnoguchi/svnhub_test/trunk': Could not resolve hostname `github.com': Host not found (https://github.com)

失敗した。想定通り。

ブランチを切る

GitHubではSVNHubとしての機能を実装するにあたってSVNの標準的なリポジトリレイアウトを採用しているようです。
つまり

  • trunk: origin/master相当
  • branches: ブランチはここに格納される
  • tags: タグはここに格納される

という対応となっている。

ということでブランチを作成してみる。ここでは test というブランチを作成。

% svn cp https://github.com/wnoguchi/svnhub_test/trunk https://github.com/wnoguchi/svnhub_test/branches/test
Committed revision 5.

ただSVNでブランチを切るにはコミットメッセージの入力が必要です。
適当にコミットメッセージを入力してコミット。
GitHub上で見るとブランチが作成されています。

f:id:wnoguchi0727:20140820233112p:plain

そしてさっきのコミットメッセージを入れた空コミットが作成されているようでした。
こんなコミット作れるのか・・・。

f:id:wnoguchi0727:20140820233113p:plain

マージしてみる

今度はマージを試してみます。

まずはtrunk上でコミット。

% svn diff
Index: README.md
===================================================================
--- README.md (revision 3)
+++ README.md (working copy)
@@ -9,5 +9,6 @@
dddddddddddddddddddddd.
eeeeeeeeeeeeeeeeeeeeee.
ffffffffffffffffffffff.
+chage of trunk.
gggggggggggggggggggggg.
% svn commit
Sending        README.md
Transmitting file data .
Committed revision 6.

次は先ほどの test ブランチに切り替えてコミットします。

% svn sw https://github.com/wnoguchi/svnhub_test/branches/test
U    LICENSE
U    README.md
U    testdir/.gitkeep
Updated to revision 6.
% svn log
------------------------------------------------------------------------
r5 | wataru.noguchi | 2014-08-20 22:27:16 +0900 (水, 20  8 2014) | 2 lines
Create branch: test
------------------------------------------------------------------------
r4 | wataru.noguchi | 2014-08-20 22:25:53 +0900 (水, 20  8 2014) | 2 lines
Add blank directory.
------------------------------------------------------------------------

次のような変更を加えました。

% svn diff
Index: README.md
===================================================================
--- README.md   (revision 6)
+++ README.md   (working copy)
@@ -3,6 +3,8 @@
SVNHub Test Repository.
SVNHub のテストです。
+ああああああ
+いいいいいい
aaaaaaaaaaaaaaaaaaaaaa.
bbbbbbbbbbbbbbbbbbbbbb.
cccccccccccccccccccccc.

コミット。

% svn commit
Sending        README.md
Transmitting file data .
Committed revision 7.

ログを見る。

% svn log --stop-on-copy
------------------------------------------------------------------------
r7 | wataru.noguchi | 2014-08-20 22:35:28 +0900 (水, 20  8 2014) | 2 lines
Update README on test branch.
------------------------------------------------------------------------
r5 | wataru.noguchi | 2014-08-20 22:27:16 +0900 (水, 20  8 2014) | 2 lines
Create branch: test
------------------------------------------------------------------------
r4 | wataru.noguchi | 2014-08-20 22:25:53 +0900 (水, 20  8 2014) | 2 lines
Add blank directory.
------------------------------------------------------------------------

ここでGitHub上のそれぞれのブランチの様子を見てみる。

  • trunk の様子

f:id:wnoguchi0727:20140820233114p:plain

  • test ブランチの様子

f:id:wnoguchi0727:20140820234459p:plain

これをマージする。
まずは trunk に切り替え。

% svn sw https://github.com/wnoguchi/svnhub_test/trunk
U    LICENSE
U    README.md
U    testdir/.gitkeep
Updated to revision 7.

マージする。

% svn merge -r 4:HEAD https://github.com/wnoguchi/svnhub_test/branches/test
--- Merging r5 through r7 into '.':
U    README.md

マージに成功したのでコミット。

% svn status
M       README.md
% svn commit
Sending        README.md
Transmitting file data .
Committed revision 8.

タグ付けする

最後にタグ付けして完了だ。

svn copy https://github.com/wnoguchi/svnhub_test/trunk https://github.com/wnoguchi/svnhub_test/tags/v1.0

f:id:wnoguchi0727:20140820233116p:plain

できた。
どうやらタグ付けの際にコミットメッセージを入力するけど、このメッセージは無視されるみたいだ。

まとめ

とりあえずGitHub上でもひととおりのSVN操作はできることがわかりました。
すごいね・・・。
ただ、試してないけどさすがに svn propedit とかで svn:ignore をセットするのとかはSVNメタデータレベルの処理なので無理なんじゃないかな・・・。

当然だけど Git リポジトリとしてクローンすることは普通にできる。

% git clone git@github.com:wnoguchi/svnhub_test.git svnhub_test_git
Cloning into 'svnhub_test_git'...
remote: Counting objects: 24, done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 24 (delta 6), reused 16 (delta 2)
Receiving objects: 100% (24/24), done.
Resolving deltas: 100% (6/6), done.
Checking connectivity... done.
% git log
commit 808c1703ac1af2eee14152817f569a27c5b872e0
Author: Wataru Noguchi <wnoguchi.0727@gmail.com>
Date:   Wed Aug 20 22:50:42 2014 +0900
Add Scala sample.
commit c70b6295ce45f4b822455a01a447c9a112794ecb
Author: Wataru Noguchi <wnoguchi.0727@gmail.com>
Date:   Wed Aug 20 22:38:49 2014 +0900
Merge test branch.
commit 37587c2e9e166dcb751f91db6a45cca86ffe8f55
Author: Wataru Noguchi <wnoguchi.0727@gmail.com>
Date:   Wed Aug 20 22:32:18 2014 +0900
Update README on trunk.
commit 52d1556cdd28c52efbdd7d5f341980678870dbba
Author: Wataru Noguchi <wnoguchi.0727@gmail.com>
Date:   Wed Aug 20 22:25:53 2014 +0900
Add blank directory.
commit cc0240711aeae832546b8d4fdd2d5545976ad723
Author: Wataru Noguchi <wnoguchi.0727@gmail.com>
Date:   Wed Aug 20 22:20:52 2014 +0900
Update README.
commit a349debc3aba2374c8cdd37ea6901fa02e93ab39
Author: Wataru Noguchi <wnoguchi.0727@gmail.com>
Date:   Wed Aug 20 22:15:42 2014 +0900
Initial commit
% git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/test
% git tag
v1.0

まあ、特に理由がなければ Git 使いましょう。
いじょ。

入門者の本

入門git

入門git

Subversion実践入門:達人プログラマに学ぶバージョン管理(第2版)

Subversion実践入門:達人プログラマに学ぶバージョン管理(第2版)

References

  1. SVNHub
  2. Improved Subversion Client Support
  3. Announcing SVN Support

HomebrewでUTF-8-MAC問題を解決したSubversionをインストールする(1.7系、非1.8系)

現時点でHomebrewで提供されている最新バージョンのSubversion 1.8.10はUTF-8MAC問題を解決する --unicode オプションに対応していない。
なので 1.7 系をインストールする。

% brew info svn
subversion: stable 1.8.10 (bottled)
https://subversion.apache.org/
Not installed
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/subversion.rb
==> Dependencies
Build: pkg-config ✔, autoconf ✔, automake ✔, libtool ✘, scons ✘
Required: sqlite ✘, openssl ✘
==> Options
--java
Build Java bindings
--perl
Build Perl bindings
--ruby
Build Ruby bindings
--universal
Build a universal binary
--with-python
Build with python support
==> Caveats
svntools have been installed to:
/usr/local/opt/subversion/libexec
  • まずはsvnコマンドのロケーションを確認する。
    また、事前に /etc/paths/usr/local/bin が優先的に設定されていることを確認しておく。
% which svn
/usr/bin/svn
brew tap homebrew/versions
  • インストールするものが --unicode-path オプションが有効であることを確認する。
% brew info subversion17
subversion17: stable 1.7.14
http://subversion.apache.org/
Not installed
From: https://github.com/homebrew/homebrew-versions/blob/master/subversion17.rb
==> Dependencies
Build: pkg-config ✔, scons ✘
Required: neon ✘, sqlite ✘, openssl ✘
==> Options
--java
Build Java bindings
--perl
Build Perl bindings
--ruby
Build Ruby bindings
--unicode-path
Include support for OS X UTF-8-MAC filename
--universal
Build a universal binary
--with-python
Build with python support
  • よしインストール。
brew install subversion17 --unicode-path
  • 端末を立ち上げ直す。できたかな?
[wnoguchi@noguchiwataru-no-MacBook-Pro] ~
% which svn
/usr/local/bin/svn
[wnoguchi@noguchiwataru-no-MacBook-Pro] ~
% svn --version
svn, version 1.7.14 (r1542130)
compiled Aug 19 2014, 23:56:41
Copyright (C) 2013 The Apache Software Foundation.
This software consists of contributions made by many people; see the NOTICE
file for more information.
Subversion is open source software, see http://subversion.apache.org/
The following repository access (RA) modules are available:
* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
- handles 'http' scheme
- handles 'https' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
- with Cyrus SASL authentication
- handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
- handles 'file' scheme
* ra_serf : Module for accessing a repository via WebDAV protocol using serf.
- handles 'http' scheme
- handles 'https' scheme

References

  1. homebrewでのutf-8-mac対応svnインストール – namutakaの日記
  2. HomebrewでSubversion17をインストールする際のunicode-pathオプションでのエラー対処 – BEFOOL blog
  3. Homebrewで日本語ファイル名問題(UTF-8-MAC)にパッチをあてたSubversionをインストールする – 豆無日記

vimでScalaのシンタックスハイライトしたい

syntax on

でなるのかと思ってたけど、甘かった。世の中そんなに甘くない。

この前インストールしたNeoBundleの出番ではないか。

derekwyatt/vim-scala

VundleだけどNeoBundleもいけるはず。

~/.vimrc に以下を追記。

"NeoBundle Scripts-----------------------------
"(snip)
NeoBundle 'derekwyatt/vim-scala'
"(snip)
"End NeoBundle Scripts-------------------------

で、インストール。

:source ~/.vimrc
:NeoBundleInstall

そしてすでにScalaのファイルを開いていたら

:e!

で再読込するときれいにハイライト表示されました。

f:id:wnoguchi0727:20140813120323p:plain