giter8とsbtでScalaを書く

最近Scalaを書くときはgiter8sbtを使ってて、便利なのでメモがてら軽く手順などを書いてみます。

giter8

GitHubに上がっているhogehoge.g8みたいなリポジトリをテンプレートとして、SBTなプロジェクトを生成してくれる便利なヤツです。

OSX & Homebrewを使っているなら、

$ brew install giter8

で入ります。

たとえば、https://github.com/rkmathi/basic-project.g8を使いたいなら、

$ g8 rkmathi/basic-project

で生成できます。

hogeブランチを使いたいなら、

$ g8 rkmathi/basic-project -b hoge

のように、-b <branch name>オプションを使うことができます。

手順

1. giter8、sbtをインストール

OSXならば上に書いたとおり、

$ brew install sbt
$ brew install giter8

でOKです。

2. giter8でSBTプロジェクトを作成する

自分がつくったrkmathi/basic-projectは、バージョンと組織名とプロジェクト名を指定するようにしています。

$ g8 rkmathi/basic-project
version [0.0.1-M1]:
organization [com.example]:
name [basic-project]:

Template applied in ./basic-project

$

3. 実行する

runで実行、testでScalaTest実行、assemblyでsbt-assemblyでのJAR出力ができます。

$ cd basic-project
$ sbt
...
$ run
$ test
$ assembly

giter8便利˙꒳˙

Gentooドキュメントの翻訳

Gentooドキュメント http://www.gentoo.org/doc/en/index.xml にはよくお世話になっているのですが、このドキュメントは 日本語版 もあります。

日本語版は英語版をもとに翻訳されているのですが、記事によっては4年前から更新されていないものもあります。

古くなってしまっている翻訳を更新するには、GitHubリポジトリ(https://github.com/gentoojp/gentoo-doc-ja)のIssueに登録して、プルリクエストを投げると処理してもらえます。


翻訳するには、xml/htdocs/doc/pofiles以下にある、*.poファイルを編集します。

msgidが原文で、msgstrへそれに対する翻訳を書くという流れのようです。

翻訳が一通りおわったら、ルートディレクトリで

$ make report

をすると、正しいフォーマットで翻訳できたかどうかをチェックしてくれます。

このチェックをしないと、プルリクエストを投げたとしてもTravisCIで落ちてしまいます。

チェックが通ったらプルリクエストを投げて、レビューしてもらうのを待ちます。

これが、Gentooドキュメントのおおまかな翻訳フローになります。

さくらのGentooにsystemdを導入する

みんな大好き さくらのVPS にGentooLinuxを入れているのですが、久しぶりにカーネルアップデートしようと思い、ついでにsystemdを導入してみました。

Gentoo Wiki

みんな大好き Gentoo WikiSystemd を見てカーネルコンフィグとかしたらすんなり起動しました。

ip

ただ、起動はしたもののssh接続ができず、なんでだろうなーと見ていたらインターネットに繋がらなくなってしまっていました。

dhcpcdを使っていないので、どうやらnetwork.serviceみたいなのを自分で書かないといけないようなので、 みんな大好きArch Forums をみて、同じように/etc/systemd/system/network.serviceに設定ファイルをかきました。

$ cat /etc/conf.d/network
interface=eth0
address=XXX.XXX.XXX.XXX (VPSのアドレス)
netmask=255.255.254.0 (VPSのネットマスクアドレス)
broadcast=XXX.XXX.XXX.XXX (VPSのブロードキャスト)
gateway=XXX.XXX.XXX.XXX (VPSのゲートウェイ)
$ cat /etc/systemd/system/network.service 
[Unit]
Description=Network Connectivity
Wants=network.target
Before=network.target
 
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/conf.d/network
ExecStart=/sbin/ip link set dev ${interface} up
ExecStart=/sbin/ip addr add ${address}/${netmask} broadcast ${broadcast} dev ${interface}
ExecStart=/sbin/ip route add default via ${gateway}
ExecStop=/sbin/ip addr flush dev ${interface}
ExecStop=/sbin/ip link set dev ${interface} down

[Install]
WantedBy=multi-user.target

「ipコマンドが無いよ」と言われてしまったので、sys-apps/iproute2をインストールしました。

# emerge -av sys-apps/iproute2

最後に、

# systemctl daemon-reload
# systemctl enable network.service
# systemctl start network.service
# systemctl enable sshd.service
# systemctl start sshd.service

これで無事sshログインもできるようになりました。

PyQt5を使ってOS X上で開発する準備

事前にMarvericks上に、pyenv+virtualenvwrapperでpython-3.4.0な環境を作成

…とおもったらhomebrew一発だった

$ brew intall pyqt5 --with-python

$ export PYTHONPATH=/usr/local/lib/python3.4/site-packages:$PYTHONPATH
(↑python3.4なので)

Gentoo Linuxにgollumを導入する

Portageでインストールしたruby-2.0なGentooLinuxにgollumをインストールします。

gollumに必要なcharlock_holmesというgemのインストールでエラーが出てしまいます。

$ gem install charlock_holmes
Building native extensions with: '--with-icu-dir=/usr/lib/icu'
This could take a while...
ERROR:  Error installing charlock_holmes:
        ERROR: Failed to build gem native extension.

    /usr/bin/ruby20 extconf.rb --with-icu-dir=/usr/lib/icu
checking for main() in -licui18n... yes
checking for main() in -licui18n... yes
checking for unicode/ucnv.h... yes
  -- tar zxvf file-5.08.tar.gz
  -- ./configure --prefix=/home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/dst/ --disable-
shared --enable-static --with-pic
  -- patch -p0 < ../file-soft-check.patch
  -- make -C src install
  -- make -C magic install
checking for main() in -lmagic_ext... yes
checking for magic.h... yes
creating Makefile

make "DESTDIR="
compiling converter.c
In file included from converter.c:2:0:
common.h:23:14: warning: ‘charlock_new_str’ defined but not used [-Wunused-function]
common.h:32:14: warning: ‘charlock_new_str2’ defined but not used [-Wunused-function]
compiling ext.c
In file included from ext.c:1:0:
common.h:14:14: warning: ‘charlock_new_enc_str’ defined but not used [-Wunused-function]
common.h:23:14: warning: ‘charlock_new_str’ defined but not used [-Wunused-function]
common.h:32:14: warning: ‘charlock_new_str2’ defined but not used [-Wunused-function]
compiling encoding_detector.c
In file included from encoding_detector.c:3:0:
common.h:14:14: warning: ‘charlock_new_enc_str’ defined but not used [-Wunused-function]
compiling transliterator.cpp
linking shared-object charlock_holmes/charlock_holmes.so
converter.o: In function `rb_converter_convert':
converter.c:(.text+0xb4): undefined reference to `ucnv_convert'
converter.c:(.text+0xf4): undefined reference to `ucnv_convert'
converter.c:(.text+0x18e): undefined reference to `u_errorName'
encoding_detector.o: In function `rb_get_supported_encodings':
encoding_detector.c:(.text+0xa0): undefined reference to `uenum_count'
encoding_detector.c:(.text+0xc1): undefined reference to `uenum_next'
encoding_detector.c:(.text+0x12a): undefined reference to `uenum_next'
encoding_detector.c:(.text+0x16c): undefined reference to `uenum_next'
encoding_detector.c:(.text+0x1aa): undefined reference to `uenum_next'
encoding_detector.c:(.text+0x1f1): undefined reference to `uenum_next'
encoding_detector.o:encoding_detector.c:(.text+0x22e): more undefined references to `uenum_next' follow
encoding_detector.c:(.text+0x1f1): undefined reference to `uenum_next'                                          [59/930]
encoding_detector.o:encoding_detector.c:(.text+0x22e): more undefined references to `uenum_next' follow
encoding_detector.o: In function `rb_encdec__alloc':
encoding_detector.c:(.text+0x73d): undefined reference to `u_errorName'
transliterator.o: In function `rb_transliterator_id_list':
transliterator.cpp:(.text+0x158): undefined reference to `u_errorName'
transliterator.o: In function `rb_transliterator_transliterate':
transliterator.cpp:(.text+0x2dd): undefined reference to `icu::UnicodeString::UnicodeString(char const*, int)'
transliterator.cpp:(.text+0x305): undefined reference to `icu::UnicodeString::~UnicodeString()'
transliterator.cpp:(.text+0x31b): undefined reference to `icu::UMemory::operator new(unsigned long)'
transliterator.cpp:(.text+0x331): undefined reference to `icu::UnicodeString::UnicodeString(char const*, int)'
transliterator.cpp:(.text+0x36a): undefined reference to `icu::UnicodeString::toUTF8(icu::ByteSink&) const'
transliterator.cpp:(.text+0x3b5): undefined reference to `icu::ByteSink::~ByteSink()'
transliterator.cpp:(.text+0x405): undefined reference to `u_errorName'
transliterator.cpp:(.text+0x46f): undefined reference to `icu::UMemory::operator delete(void*)'
transliterator.cpp:(.text+0x4a0): undefined reference to `icu::UnicodeString::~UnicodeString()'
transliterator.o: In function `icu::StringByteSink<std::string>::~StringByteSink()':
transliterator.cpp:(.text._ZN3icu14StringByteSinkISsED2Ev[_ZN3icu14StringByteSinkISsED5Ev]+0xf): undefined reference to
`icu::ByteSink::~ByteSink()'
transliterator.o: In function `icu::StringByteSink<std::string>::~StringByteSink()':
transliterator.cpp:(.text._ZN3icu14StringByteSinkISsED0Ev[_ZN3icu14StringByteSinkISsED0Ev]+0x13): undefined reference to
 `icu::ByteSink::~ByteSink()'
transliterator.cpp:(.text._ZN3icu14StringByteSinkISsED0Ev[_ZN3icu14StringByteSinkISsED0Ev]+0x1c): undefined reference to
 `icu::UMemory::operator delete(void*)'
transliterator.o:(.data.rel.ro._ZTVN3icu14StringByteSinkISsEE[_ZTVN3icu14StringByteSinkISsEE]+0x28): undefined reference
 to `icu::ByteSink::GetAppendBuffer(int, int, char*, int, int*)'
transliterator.o:(.data.rel.ro._ZTVN3icu14StringByteSinkISsEE[_ZTVN3icu14StringByteSinkISsEE]+0x30): undefined reference
 to `icu::ByteSink::Flush()'
transliterator.o:(.data.rel.ro._ZTIN3icu14StringByteSinkISsEE[_ZTIN3icu14StringByteSinkISsEE]+0x10): undefined reference
 to `typeinfo for icu::ByteSink'
./libmagic_ext.a(compress.o): In function `uncompressgzipped':
/home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/src/file-5.08/src/compress.c:357: undefin
ed reference to `inflateInit2_'
/home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/src/file-5.08/src/compress.c:363: undefin
ed reference to `inflate'
/home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/src/file-5.08/src/compress.c:370: undefin
ed reference to `inflateEnd'
collect2: error: ld returned 1 exit status
make: *** [charlock_holmes.so] Error 1


Gem files will remain installed in /home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4 for inspection.
Results logged to /home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/gem_make.out

/usr/lib/ruby/2.0.0/x86_64-linux/rbconfig.rbのLDFLAGSを編集したら通りました。

CONFIG["LDFLAGS"] = "-L. -Wl,-O1 -Wl,--as-needed -rdynamic -Wl,-export-dynamic -Wl,--no-undefined"

という行を、

CONFIG["LDFLAGS"] = "-L. -Wl,-O1 -Wl,--as-needed -rdynamic -Wl,-export-dynamic"

にすればインストールできました。