Quantcast
Channel: もくもくブログ
Viewing all 216 articles
Browse latest View live

docker-composeでmysqlのデータ永続化したときのPermission Deniedの解決方法

$
0
0

vagrant+VirtualBox上(Ubuntu)で、公式のmysqlイメージを使って、コンテナを立ててデータを永続化(ホストにマウント(data volume))したときのマイナートラブルです。

$ docker --version
Docker version 1.9.1, build a34a1d5$ docker-compose --version
docker-compose version 1.5.2, build 7240ff3

TL;DR

Vagrant+VirtualBoxのVM上で動くDockerの話です。ホストでDocker動かしている場合は関係ないかもしれません。

docker-composeでMySQLのデータ永続化をホストにマウントして使うときは、vagrantユーザーをvboxsfグループに入れておく必要があります。

$ sudo gpasswd -a $USER vboxsf

そうしないと、Permissionの問題でエラーが起こることがあるようです。

IOError: [Errno 13] Permission denied: '/home/vagrant/Dev/data/mysql/auto.cnf'

MySQLコンテナのデータ永続化

Docker Hub

ドキュメントに書いてあるのはDockerの起動コマンド

$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

これを、docker-composeのyamlに書き直すと下のようになります。

mysql:restart:alwaysimage:mysqlvolumes:-/my/own/datadir:/var/lib/mysqlenvironment:-MYSQL_ROOT_PASSWORD=my-secret-pw

これでマウントできるので起動して、マウントしたディレクトリをtreeコマンドで見てみると以下のようになります。

|-- datadir
|   |-- auto.cnf
|   |-- ib_buffer_pool
|   |-- ibdata1
|   |-- ib_logfile0
|   |-- ib_logfile1
|   |-- ibtmp1
|   |-- mysql [error opening dir]
|   |-- performance_schema [error opening dir]
|   `-- sys [error opening dir]

「error opening dir」と不穏な空気です。

docker-compose buildするとエラー

この状態でdocker-compose.yml内にあるbuildが必要なコンテナをビルドするとエラーになります。

Traceback (most recent call last):
  File "/usr/local/bin/docker-compose", line 9, in <module>
    load_entry_point('docker-compose==1.5.2', 'console_scripts', 'docker-compose')()
  File "/usr/local/lib/python2.7/dist-packages/compose/cli/main.py", line 54, in main
    command.sys_dispatch()
  File "/usr/local/lib/python2.7/dist-packages/compose/cli/docopt_command.py", line 23, in sys_dispatch
    self.dispatch(sys.argv[1:], None)
  File "/usr/local/lib/python2.7/dist-packages/compose/cli/docopt_command.py", line 26, in dispatch
    self.perform_command(*self.parse(argv, global_options))
  File "/usr/local/lib/python2.7/dist-packages/compose/cli/main.py", line 171, in perform_command
    handler(project, command_options)
  File "/usr/local/lib/python2.7/dist-packages/compose/cli/main.py", line 192, in build
    force_rm=bool(options.get('--force-rm', False)))
  File "/usr/local/lib/python2.7/dist-packages/compose/project.py", line 235, in build
    service.build(no_cache, pull, force_rm)
  File "/usr/local/lib/python2.7/dist-packages/compose/service.py", line 683, in build
    dockerfile=self.options.get('dockerfile', None),
  File "/usr/local/lib/python2.7/dist-packages/docker/api/build.py", line 49, in build
    context = utils.tar(path, exclude=exclude, dockerfile=dockerfile)
  File "/usr/local/lib/python2.7/dist-packages/docker/utils/utils.py", line 85, in tar
    t.add(os.path.join(root, path), arcname=path, recursive=False)
  File "/usr/lib/python2.7/tarfile.py", line 1994, in add
    with bltn_open(name, "rb") as f:
IOError: [Errno 13] Permission denied: '/home/vagrant/Dev/data/mysql/auto.cnf'

やはりPermissionのエラーです。

ビルド以外の動作でも起こりそうですが確認してません。

マウントしたMySQLのディレクトリにアクセスできない

エラーメッセージからPermissionの問題だとわかったので、lsコマンドでdatadirの中を見てみます。

drwxrwxr-x 5 vboxadd vboxsf      4096 Jan  7 06:49 .
drwxrwxr-x 7 vagrant vagrant     4096 Jan  7 07:25 ..
-rw-r----- 1 vboxadd vboxsf        56 Jan  7 05:08 auto.cnf
-rw-r----- 1 vboxadd vboxsf       694 Jan  7 06:19 ib_buffer_pool
-rw-r----- 1 vboxadd vboxsf  50331648 Jan  7 06:49 ib_logfile0
-rw-r----- 1 vboxadd vboxsf  50331648 Jan  7 05:08 ib_logfile1
-rw-r----- 1 vboxadd vboxsf  79691776 Jan  7 06:49 ibdata1
-rw-r----- 1 vboxadd vboxsf  12582912 Jan  7 06:49 ibtmp1
drwxr-x--- 2 vboxadd vboxsf      4096 Jan  7 05:08 mysql
drwxr-x--- 2 vboxadd vboxsf      4096 Jan  7 05:08 performance_schema
drwxr-x--- 2 vboxadd vboxsf     12288 Jan  7 05:08 sys

vboxsfグループである必要がありそうだとわかりましたので、現行のユーザー(vagrant)をvboxsfグループに追加します。

$ sudo gpasswd -a $USER vboxsf

これで、中身も見えて、ビルドも通ります。

Vagrant+VirtualBox特有の問題な気がしますが、ホストで試した時もパーミッションの問題が起こった時はグループ足してあげれば治りそう。


docker-composeでデータベースコンテナを立てるときのTips

$
0
0

docker-composeを使うと連携する複数のコンテナを割と簡単に構築できます。

アプリケーションコンテナや開発用コンテナからデータベースコンテナを扱う際に気になったことをまとめてみます。


✗TOC

データベースの永続化

データベース内のデータは永続化しないと消えてしまうので、残したい場合は明示的に永続化させておく必要があります。

公式のイメージの設定例(redis, mysql, postgres, mongo)を書きます、ホストのディレクトリにマウントする方法(data volume)を採用しています。データコンテナを使う方法は書いていません。

redis

Docker Hub

/dataをマウントすると良いようです。docker-compose.ymlに以下のように記載します。

redis:restart:alwaysimage:redisvolumes:-/my/own/datadir:/datacommand:redis-server--appendonlyyes

commandでデフォルトの起動コマンドを書き換えているのがポイントです、--appendonly yesがないとデータが作られないので注意です。

マウントするホストのディレクトリは任意の場所にするのですが、相対パスが使えます。(Dockerのコマンドではダメだったような・・・)

例えば、

  volumes:
    - ./data/redis:/data

という指定も問題ないです。

GitLabで使っているsameersbn/redisでは、/var/lib/redisにデータがあり場所が違うのでそちらを使う場合はまた違う設定になるようです。

mysql

Docker Hub

/var/lib/mysqlをマウントします。

mysql:restart:alwaysimage:mysqlvolumes:-/my/own/datadir:/var/lib/mysqlenvironment:-MYSQL_ROOT_PASSWORD=root

環境変数にMYSQL_ROOT_PASSWORDを設定するのは必須で、MYSQL_USERやMYSQL_PASSWORDは必要な場合は設定します。

vagrant+virtualbox上のDockerでmysqlを永続化したときパーミッションの問題が起こったのでそれに関しては以下の記事にまとめてます。

docker-composeでmysqlのデータ永続化したときのPermission Deniedの解決方法

postgres

Docker Hub

/var/lib/postgresql/dataをマウントします。

postgres:restart:alwaysimage:postgresvolumes:-/my/own/datadir:/var/lib/postgresql/data

mongo

Docker Hub

/data/dbをマウントします。

mongo:restart:alwaysimage:mongovolumes:-/my/own/datadir:/data/db

データベースを参照する方法

参照したいコンテナのdocker-compose.ymlの設定にlinksを追加します。

application:restart:alwaysbuild:.links:-mysql-redis-postgres:postgresql-mongo:mongodb-mongo

linksはコンテナを他のサービスにリンクします、指定方法は2種類あって

  • "<サービス>:<エイリアス>"
  • "<サービス>"(エイリアスとしても使われる)

複数個指定することもできます。

linksを書くと、コンテナ内の/etc/hostsに指定したサービス名が追加されます。

172.17.0.6      mongodb
172.17.0.4      mysql
172.17.0.2      postgresql
172.17.0.3      redis
172.17.0.6      mongo

DBにアクセスする場合は、ここにある名前を使ってアクセスするか、IPを直接指定すればできます。

redis-cliで接続する例だと以下のようになります。

$ redis-cli -h redis
redis:6379>

特に指定がなければデフォルトポートが使用されています。

portの指定

公式のイメージでは、portsの記載がなくても勝手にデフォルトポートがポートフォワーディングされるので、書かなくてもいい。

公式のイメージ以外を使っている場合は明示的に指定する必要があるかもしれないです。

redisの例だと、docker-compose.yml

postgres:restart:alwaysimage:postgres

docker-compose psで確認すると

 Name                    Command               State   Ports
------------------------------------------------------------------
postgres_1    /docker-entrypoint.sh postgres   Up      5432/tcp

特に指定がなくてもポートフォワーディングされています。

docker-composeを使って最高の開発環境を手に入れた

$
0
0

開発環境を作ってるの楽しい人種なので定期的に開発環境を見直したくなります。

Dockerを使ってポータブルな開発環境を手に入れたので紹介します。

開発用コンテナと各種データベースコンテナをdocker-composeを使って構築します。


✗TOC

Dockerポータブルな開発環境

"docker-compose up -d"で開発環境が出来上がります、すごい。mysqlやredis他も使える、すごい。

ディレクトリ構成は以下のようになっています。

|-- data
|   |-- mongo
|   |-- mysql
|   |-- postgresql
|   |-- redis
|   `-- works
|-- docker-compose.yml
|-- Dockerfile
|-- id_rsa
`-- id_rsa.pub

dataにコンテナ上の永続化したいデータをマウントしています。各データベースのデータと、worksは開発コンテナの~/worksをマウントしており作業はここで行い、作業中のデータは保存されるようになっています。

動かすには、dockerとdocker-composeが入っている環境で以下のコマンドを打ちます。

$ docker-compose build$ docker-compose pull$ docker-compose up -d

新しい環境ではこのコマンドを実行して、二回目以降は最後のコマンドだけで立ち上がります。

sshできるようになっているのでホストからsshすればDockerfileに書いてある内容の開発環境が出迎えてくれます。

これで、どの開発機でもDockerとdocker-composeが入っていれば開発環境が立ち上がる体制が作れました。

以下に詳しい内容を書いていきます。

開発用コンテナ

Dockerfileにsshで接続できる開発環境を記述します。含まれている内容は以下になります。

ベース

  • Ubuntu 14.04
  • ssh
  • zsh
  • tmux
  • dotfiles
  • Vim

各言語

  • Ruby (rbenv)
  • Python (pyenv)
  • Node.js (nvm)
  • Golang (1.5)
  • Clang (3.5)

データベース

  • SQLite3
  • 各データベースのクライアントツール

普段の開発で雑多に使うため、複数言語+複数データベースの環境を富豪的に作っています。

Webアプリを開発することが多いので、開発で使うお好みのポートをdocker-compose.ymlでポートフォワーディングしておきます。

ev:restart:alwaysbuild:.ports:-"5000:5000"-"8080:8080"-"8888:8888"-"2222:22"volumes:-./data/works:/home/yymm/works

ベース

OSはUbuntu 14.04、シェルはzsh、ターミナルマルチプレクサはtmux、エディタはVimです。

基本的なパッケージもインストールしています。

普段からTerminal上で開発することが多いのでVimを使っていて、プラグインにまみれているので、Vimはソースコードからビルドします。

#vim
RUN apt-get install git mercurial gettext libncurses5-dev  libperl-dev python-dev python3-dev ruby-dev lua5.2 liblua5.2-dev luajit libluajit-5.1 -y
RUN cd /tmp \&& git clone https://github.com/vim/vim.git \&& cd /tmp/vim \&& ./configure --with-features=huge --enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp --with-luajit --enable-fail-if-missing \&& make \&& make install

dotfilesは、各環境ごとにブランチで分けているので、os/ubuntu-dockerに切り替えて、bootstrap.shでブートストラップしてます。dotfilesのエイリアスを貼って、Vimプラグインをインストールしてくれます。

# dotfiles
RUN git clone https://github.com/yymm/dotfiles.git ~/dotfiles \&& cd ~/dotfiles \&& git checkout os/ubuntu-docker \&& bash bootstrap.sh

sshできる環境を作るのにハマりどころがいくつかありますので以下の記事を参考にしました。

各言語

言語ごとのバージョンマネージャで使いそうなバージョンをドドっと入れておきます。

必要なバージョンが増えたらDockerfileに追記してビルドし直します。

Ruby (rbenv)

rbenvをインストールして、使うバージョンをインストールします。"rbenv install"するときはまだパスが通っていないので直接叩きます。

# Ruby (rbenv)RUN git clone https://github.com/rbenv/rbenv.git ~/.rbenvRUN cd ~/.rbenv && src/configure && make -C srcRUN echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrcRUN echo 'eval "$(rbenvinit-)"' >> ~/.zshrcRUN git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-buildRUN ~/.rbenv/bin/rbenv install 2.2.4RUN ~/.rbenv/bin/rbenv install 1.9.3-p551

Python (pyenv)

個人的な事情で2系ではvirtualenvを使いたいので、virtualenvもインストールしています。

pyenvをインストールして、使うバージョンをインストールします。"pyenv install"するときはまだパスが通っていないので直接叩きます。

# Python (virtualenv)USER rootRUN apt-get install python-pip -yRUN pip install virtualenvRUN pip install virtualenvwrapperUSER yymmRUN echo 'export WORKON_HOME=$HOME/.virtualenvs' >> ~/.zshrcRUN echo 'source `which virtualenvwrapper.sh`' >> ~/.zshrc# Python (pyenv)RUN git clone https://github.com/yyuu/pyenv.git ~/.pyenvRUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrcRUN echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrcRUN echo 'eval "$(pyenvinit-)"' >> ~/.zshrcUSER rootRUN apt-get install libssl-dev openssl -y # need to install python 3.4 laterUSER yymmRUN ~/.pyenv/bin/pyenv install 3.5.1RUN ~/.pyenv/bin/pyenv install 2.7.11

Golang (1.5)

gvmはDockerと相性が悪いらしく今のところ使えません。

しょうがないので、ほしいバージョンを自分で入れるのが今は良いみたいです。

golangはビルド済みのものをダウンロードすることができるので、ダウンロードして/usr/localに展開、環境変数を設定します。

# Golang (1.5)USER rootRUN wget https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gzRUN tar -C /usr/local -xzf go1.5.linux-amd64.tar.gzRUN rm -f go1.5.linux-amd64.tar.gzUSER yymmRUN echo 'export GOROOT="/usr/local/go"' >> ~/.zshrcRUN echo 'export PATH="$GOROOT/bin:$PATH"' >> ~/.zshrc

Node.js (nvm)

nvmをインストールして、使うバージョンをインストールします。

globalで使うnpmパッケージがあるときはここでインストールしておきます。

"nvm install"するときは、~/.nvm/nvm.shを実行する必要があるのでワンライナーにする必要があります。

# Node.js (nvm)RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bashENV NODE_VERSION 5.4.0ENV NVM_DIR /home/yymm/.nvmRUN . ~/.nvm/nvm.sh && nvm install $NODE_VERSION&& nvm alias default $NODE_VERSION&& npm install -g gulp yo hubot coffee-script browserify

データベース

SQLite3は開発コンテナにインストールして、その他のデータベースについてはクライアントを入れておきます。

# SQLite
RUN apt-get install sqlite3 libsqlite3-dev -y
# client
RUN apt-get install mysql-client redis-tools postgresql-client mongodb-clients -y

データベースコンテナ

docker-composeで開発サーバと連携したデータベースコンテナを立てます。

  • mysql
  • postgresql
  • redis
  • mongodb
  • memcached

を用意して、データはホストのdataディレクトリに永続化させます。

mysql:restart:alwaysimage:mysqlvolumes:-./data/mysql:/var/lib/mysqlenvironment:-MYSQL_ROOT_PASSWORD=rootpostgres:restart:alwaysimage:postgresvolumes:-./data/postgresql:/var/lib/postgresql/dataredis:restart:alwaysimage:redisvolumes:-./data/redis:/datacommand:redis-server--appendonlyyesmongo:restart:alwaysimage:mongovolumes:-./data/mongo:/data/dbmemcached:restart:alwaysimage:memcached

開発サーバからlinksでリンクすればよしなに使えます。

dev:restart:alwaysbuild:.ports:-"5000:5000"-"8080:8080"-"8888:8888"-"2222:22"links:-mysql-redis-postgres-mongo-memcachedvolumes:-./data/works:/home/yymm/works

データベースコンテナについては以前に別の記事にまとめてます。

docker-composeでデータベースコンテナを立てるときのTips

付録

実際に使ってるDockerfileとdocker-compose.ymlです。

Dockerfile

docker-compose.yml

VimでインデントのTabをプラグインを使わずそれなりに可視化する方法

$
0
0

ググるとプラグインを使う方法ばっかり出てきて、とりあえずプラグインを入れたけど、プラグインに依存しないでもそれなりにかっこよくできるのでそっちでいいやという話です。


タブなどの見えない文字の可視化はlistを使うとできます。

setlist

でひとまず見えますが、インデントは"^I"になって微妙です。インデント以外にもいろいろ可視化されて邪魔です。

書式設定をするには、listcharを使います。

setlistlistchars=tab:|_

"| ¦ ┆ │ » ▸ >"あたりが使えそうです。

色はSpecialKeyを設定することで変更できます。

hi SpecialKey ctremfg=darkmagenta

Ubuntu 14.04のgnome-terminalを使っていてあまり目立ちすぎても邪魔なのでdarkmagentaに設定して使っています。お好みの色で使うと良いです。

自分はvimrcに以下の設定を書いて使ってます。

hi SpecialKey ctermfg=darkmagentasetlistlistchars=tab:¦_

プラグイン入れるよりお手軽でいい感じです。

消したい時もあると思うのでトグルするときは

setlist!

でトグルできます、何かしらのキーにマッピングしておいてもいいかもです。

参考記事

ブイズ考察 ダブルバトル

$
0
0

※ORASレーティングダブル想定

http://seiga.nicovideo.jp/seiga/im4836994

ブイズパをつくろうと考えているので考察です。

随時更新。


ちなみに、ブースターが一番好きです。次点でブラッキー。グレイシアはかわいいけど冷たそう。


サンダース

メガネ奇襲型

10万/シャドボ/めざ氷/ボルチェン

メガネ/おくびょうorひかえめ/CS252/ちくでん

ダメージ計算(カッコ内は1.1倍威力)

10万

  • H252ギルガ 43.7%~52% (48.5%~57.4%)
  • 無振りメガリザY (133.3%~156.8%)

シャドボ

  • H252ギルガ 52.6%~62.2% (57.4%~68.2%)
  • 無振りメガゲンガー 94.8%~112.5% (103.7%~122.9%)

めざ氷

  • 無振りガブ 115.8%~137.7%
  • 無振りマンダ 120%~141.1%
  • 無振りランド 136.5%~160.9%
  • H252ランド 114.2%~134.6%
  • D252モロバレル 44.4%~52.9% (48.6%~58.2%)
  • 無振りボルト 72.7%~85.7% (79.2%~93.5%)

ボルチェン

  • 無振りメガリザY 94.1%~111.1% (101.9%~121.5%)

被ダメージ(カッコ内は1.1倍威力)

  • C252メガゲンガー シャドボ 62.1%~73.5% (68.5%~81.4%)
  • C252メガゲンガー ヘド爆 70.7%~83.5% (77.8%~92.1%)
  • C252ギルガ シャドボ 56.4%~67.1% (62.1%~73.5%)
  • C252メガリザードンY ねっぷう 77.8%~92.8%
  • A252ガブリアス ドラゴンクロー 73.5%~87.8%
  • A252ガブ げきりん 110%~130.7%

ひかえめ準速だと確二率が高く、無振りメガゲンガー確一がおいしい。意外と半端な威力の一致特殊くらいなら耐える。

ブースター

スカーフ

フレアドライブ/ばがぢから/捨て身タックル/オーバーヒート

スカーフ/ようきorいじっぱり/AS252/もらいび

フレアドライブ(1.0 : 1.1, カッコ内はてだすけ火力)

  • 無振りメガガルーラ 57.2%~68.3%(85.5%~101.6%) : 63.3%~75%(93.8%~111.6%)
  • 無振り霊獣ランドロス(威嚇なし) 68.2%~81%(103%~121.3%) : 75.6%~89.6%(113.4%~133.5%)
  • H252霊獣ランドロス(威嚇なし) 57.1%~67.8%(86.2%~101.5%) : 63.2%~75%(94.8%~111.7%)
  • 無振り化身ボルトロス 88.3%~105.1%(133.1%~157.7%) : 98%~115.5%(146.7%~173.3%)
  • H252化身ボルトロス 73.1%~87%(110.2%~130.6%) : 81.1%~95.6%(121.5%~143.5%)
  • HB252特化モロバレル 84.1%~98.6%(124.8%~147.5%) : 92.3%~108.5%(138.4%~162.8%)

ばかぢから

  • 無振りガルーラ 76.6%~91.1%(114.4%~135.5%) : 84.4%~100%(125.5%~148.8%)
  • 無振りゲッコウガ 129.2%~152.3% : 141.4%~167.3%

使った感じ手助けとかなり相性が良かった。意地っ張り手助け込みでS106以下のポケモンなら油断してるところ返り討ちにできる感じだった。

すばやさは意地っ張りで最速106族を抜ける程度。陽気なら123族抜き。

S106から123あたりには、ゲンガー、ゲッコウガ、メガメタグロス、マニューラなどがいるので、陽気にすると結構抜ける範囲は広くなる。

もともと絶妙な火力なので陽気にすると火力が乱数になる点が不安になってくる他のメンバーとの相性で選択するのが良さそう。

意地っ張りにすると、最速エーフィ、準速サンダースより遅いので本当にスカーフ?的な陽動作戦はできるかも。

根性

からげんぎ/フレアドライブ/ニトロチャージ/ばかぢから

毒々玉/いじっぱり/HA252/こんじょう

ロマン入ってるので計算はしないです。

受け

フレアドライブ/ねがいごと/みきり/鬼火

たべのこし/いじっぱり/HA252/もらいび

リフレクターと組む前提?

長生きできる可能性を秘めてるのでブースター好き的に使っていきたさ。

厄介なフェアリースキンハイパーボイスを半減で受けられるのを活かしたい。

被ダメージ

  • C252特化ニンフィアハイパーボイス 21.5%~25.5%
  • C252特化メガネニンフィアハイパーボイス 31.9%~38.3%

タイマンなら、C特化メガネハイパーボイスでも、後出しからたべのこし+みきり+鬼火を回して3耐えするので、願い事で受け勝つことはできる。

(後出し→食らう→みきり→食らう→鬼火→みきり→食らう(この時点でダメージ89.9%(最高乱数))→願い事→以下繰り返し)

エーフィ

ロマンアシパ

アシストパワーをキメていくスタイル

めいそう/アシストパワー/リフレクター/あさのひざし

候補: スキルスワップ/めざ格闘

?/おくびょう/HS252orCS252/マジックミラー(夢)

ダメージ計算(カッコ内はC252、基本無振り)

2瞑想アシパ

  • 無振りガブリアス 87.4%~103.8% (106.5%~126.2%)
  • 無振りメガガル 78.8%~93.3% (95%~112.2%)

3積みすれば威力が約2倍になるので必殺技になる。ただし悪無効。

補助技オンリー

変化技に非常に強いので徹底したいやがらせ

リフレクター/あさのひざし/あくびorでんじは/どくどく

ひかりのねんど/おくびょう/HS252/マジックミラー(夢)

壁係

リフレクター/ひかりのかべ/サイコキネシス/あくび

ひかりのねんど/おくびょう/HS252/マジックミラー(夢)

基本ぽい感じ。

リフレクターのみ

リフレクター/サイコキネシス/あさのひざし/あくび

ひかりのねんど/おくびょう/HS252/マジックミラー(夢)

アタッカー

サイコキネシス/マジカルシャイン/くさむすび/まもる

珠or帯/おくびょう/CS252/マジックミラー(夢)

珠か帯かで迷うので計算してみよう

ダメージ計算

サイコキネシス

  • モロバレルH252 109.5%~130.7% : 100.9%~120.3%

くさむすび

  • ミロカロスH252 (100) 61.8%~73.2% : 56.9%~67.8%
  • トリトドンH252 (60) 97.7%~116.9% : 90.3%~107.7%

マジカル社員

  • ガブリアス 55.1%~66.6% : 51.3%~61.7%
  • キリキザンH252 34.8%~41.2% : 26.7%~31.9%
  • メガミミロップ 67.1%~80% : 61.4%~73.5%

あとは、抜群に放っていくことが多いのか、等倍に放っていくことが多いのかで変わってきそう。

薄命なので珠でまんべんなく効果力狙っていくほうが向いてそうだった。

ブラッキー

バークアウト物理受け

バークアウト/にほんばれ/つきのひかり/イカサマ

ゴツメ/ずぶとい/HB252/シンクロ

ゴツメで引いいていく物理アタッカーのあとに出てくる可能性のある特殊アタッカーをバークアウトで牽制していく型。

被ダメージ

  • A252ガブ地震(ダブル) 20.7%~25.2%
  • A252ガルーラおんがえし 28.7%~34.1%+13.8%~16.8%
  • A252メガガルーラグロパン 15.8%~18.8%+10.8%~13.8%
  • C252ニンフィアハイパーボイス 80.1%~95% (87.1%~103.9%)

イカサマダメージ

  • A252メガガルーラ 43.8%~52.2% (グロパン受けで確一)
  • A252ガブ 45.9%~54%

おんがえし読みで出して、グロパン受けでも最大81%で耐えてイカサマで確一にできる。猫騙しを吸えば引くことが多そうなのでバークアウトを打っていく。

壁貼りと組めば良い感じでそう。

にほんばれは、自分の回復量upとブースター用に搭載。他の技でもいいかもしれない。

リーフィア

晴れ物理流し

あくび/はたき落とす/こうごうせい/にほんばれ

ゴツメ/わんぱく/HB252/ようりょくそ(夢)

B130を活かして物理を受けていく。特殊にめっぽう弱い+攻撃技に恵まれないのでブラッキーでやれになってしまう。ブラッキーと比べると速い+はたきおとすがあるくらい厳しい。。。

岩しぜんのめぐみ

しぜんのめぐみ/リーフブレード/はたきおとす/まもる

ゴスのみ/いじっぱり/HA252/ようりょくそ(夢)

メガリザYと強く見た型。

リザードンに対して、まもるでメガ進化させて、次のターンにようりょくそ+しぜんのめぐみ岩で確殺する。

補正あり全振りで威嚇込みでも確一。

すばやさは無振りでも晴れ下なら、最速250抜き、最速スカーフ87抜きまで速い。

リザを見たら積極的に出していく。Xだった場合は察し・・・(ダブルだとほとんどYだろう)

ニンフィア

物理壁係

リフレクター/ハイパーボイス/願い事/みきり

珠/ひかえめ/HB252/フェアリースキン(夢)

ダメージ計算(無振り補正あり珠ハイパーボイス)

  • 無振りガブリアス 95%~115.3%
  • 無振りメガマンダ 97.6%~116.4%
  • 無振りランド 55.4%~66.4%
  • H252ランド 46.4%~55.6%
  • H252ボルト 48.9%~58.6%
  • 無振りメガガルーラ 41.6%~50.5%

被ダメージ

  • A252ガブリアス地震 32.6%~38.6%
  • A252ランド地震 35.6%~42% (38.6%~46%)
  • A252ランドいわなだれ 19.3%~22.7%
  • A252メガガルーラおんがえし 43%~50.9%+20.7%~25.2%
  • C252ボルト10万 25.2%~29.7%

受け切れないこと多そうで辛い。

物理壁改

リフレクター/ハイパーボイス/めいそう/みきりorまもる

たべのこし/ずぶといorひかえめ/HB252/フェアリースキン(夢)

改良版

たべのこしで耐久up、正確はすぶといほうがいいかもしれない。

ただ殴るやつ

ハイパーボイス

メガネ/ひかえめ/CSorHC/フェアリースキン(夢)

多分いちばん強い。圧倒的暴力。

めざ炎

めざ炎/ハイパーボイス/

ブイズは炎技に乏しいので貴重な炎技を入れていく型。

目覚めるパワー炎の理想個体は以下の感じ。

  • 31-31-30-30-31-30
  • 31-30-31-30-31-30
  • 30-31-30-30-31-30
  • 30-30-31-30-31-30

Sは捨てるとして、CはUにしたいので31-x-31-30-31-xを狙うのが良さそう。

シャワーズ

シンプルアタッカー

ねっとう/れいビ/シャドーボール/ねがいごとorてだすけ

帯orオボン/ひかえめ/BC252/ちょすい

BとDどっちがおいしいのか(オボン込み確3はダメージが41.6666%以下であれば可能、それを超えると確2)

B252

  • A252ガブリアス地震 45.3%~53.1%
  • A252メガガルーラおんがえし 44.3%~52.6%+21.9%~26.3%

D252

  • C252特化メガネニンフィアハイパーボイス 58.5%~69.2%
  • C252メガリザードンYねっぷう 30.7%~36.5%
  • C252特化ギルガシャドボ 33.6%~40%

B特化しても確3耐えしないのでD252のほうが良い感じ。

ふうせん

ねっとう/れいビ/てだすけ/あくびorねがいごとor(他の変化技)

ふうせん/ひかえめ/CD252/ちょすい

ふうせんを持って、サンダースやブースターの後ろに控えさせる型。

サンダースとサイクルさせることで、洗濯機あたりは完封できる。スカーフランドロスに対して高い圧力をかけていける。

ダブルでは、シャワーズのてだすけが結構活躍したりしている。

グレイシア

かわいいけど厳しい。

H252グレイシアダメージ計算

  • C252メガリザYねっぷう(晴れ) 126.7%~151.1%
  • C252ヒードランねっぷう 74.4%~88.3%
  • A252ランドロスじしん 37.2%~44.1%
  • A252ランドロスいわなだれ 38.3%~45.3%
  • A252メガガルーラおんがえし 45.9%~54.6% (22.6%~26.7%)
  • C252特化ニンフィアハイパーボイス 44.1%~52.9%
  • A252特化ファイアローフレアドライブ 88.3%~105.8%
  • A252特化ファイアローブレバ 44.1%~52.9%
  • A252特化鉢巻ファイアローブレバ 66.2%~78.4%
  • A252メガミミロップドレパン 70.9%~84.8%

C252特化グレイシア吹雪

  • 無振メガガル 42.2%~50.5%

自発的あられ

あられ/ふぶき/(あくび/てだすけ/れいとうビーム/凍える風)

ひかえめ/HC252/ひかりのこな/ゆきがくれ

躱して吹雪。

BitTorrentSyncをUbuntuで使う

$
0
0

BitTorrentSyncは、クロスプラットフォームで使えて、しかもiOSやAndroidでも使えて便利なP2Pのデータ共有ツールです。

Linuxでも使えて、Ubuntuユーザーなので使おうとしてみると、なんとGUIがなくWebUIしかない。あきらかにElectronやNW.jsのようなアプリなのに何故?!

WebUIしかないけど使用感は同じなのでインストールして使ってみています。

インストール

$ sudo add-apt-repository ppa:tuxpoldo/btsync$ sudo apt-get update$ sudo apt-get install btsync

リポジトリを追加してインストールします。

apt-get install btsyncするとCUI上で色々尋ねられます。きちんと設定する必要があるので英語ですがちゃんと読んで設定を行うと良いと思います。

自分の場合は、以下のように設定しました。

  1. btsyncを扱うユーザー・グループは現在のユーザー(つまり自分)
  2. btsyncのディレクトリは、現在のユーザーの/home/以下に作成(例./home//BtSync)
  3. WebUIは0.0.0.0:8888でアクセス(デフォルトの設定)

全部yesにすると権限がない等の問題が発生することがあるかもしれません。

WebUIへの初回アクセス時に、ユーザー名とパスワードの設定を促されます。

WebUIへのアクセスがBasic認証になっているためなので適宜設定しておきます。

使い方は、WindowsやMacで使っているGUIのものと変わりないのでそのまま使えます。

ブイズパ考察 ダブルバトル

$
0
0

パーティ考察

メンバー、アイテム、技構成考察。

かっこかわいいブイズを見たい。いい感じに刺さってドヤ顔のブースター見たい。

http://seiga.nicovideo.jp/seiga/im4836994

個別はこっち => ブイズ考察 ダブルバトル

第1回

  • サンダースCS252ひかえめ@メガネ 10万/シャドボ/めざ氷/ボルチェン
  • ブースターHA252いじっぱり@たべのこし フレアドライブ/ねがいごと/みきり/鬼火
  • ブラッキーHB252ずぶとい@ゴツメ バークアウト/にほんばれ/つきのひかり/イカサマ
  • エーフィHS252おくびょう@ひかりのねんど リフレクター/あさのひざし/あくび/ひかりのかべ
  • シャワーズCD252ひかえめ@オボン ねっとう/れいビ/てだすけ/ねがいごと
  • ニンフィアHB252ひかえめ@珠 リフレクター/ハイパーボイス/願い事/みきり

先発向き => サンダース、エーフィ、ニンフィア

結果

3回やって1回勝てるかどうか・・・

  • サンダースの火力がいい感じ
  • スカーフランドに地震連打されるとあっさりやられる
  • 地震に弱い
  • エーフィを壁用にと先発でたくさん起用した
  • H252だけど、リフレクター貼っても物理技で押し負ける
  • 脆い
  • 殴りたい時が多かった
  • シャワーズとサンダースの組み合わせ良かった
  • 交代受け(ちくでん、ちょすい) -> 洗濯機受けできた
  • 手助けめざ氷でボルトやっつけた
  • ブラッキーが硬い
  • メガガルーラのグロパン受けでイカサマ確殺
  • グロパン後一回行動できるので、その隙にブラッキーじゃないほうを殺られるの辛かった(まもりたい)
  • そりゃそうだけどニンフィアが重い、バークアウト打っても全く止まらない
  • メガメタグロス、ゴツメイカサマで処理可能
  • もうちょっとブースター使えそう
  • まもるで攻撃をすかしつつ反撃の戦法じゃないときつそうだった
  • サンダースはもっとボルチェンしていったほうがいい(半分~7,8割持ってく)
  • ニンフィアは何も考えずぶん殴るのがやはり強い

第二回

  • サンダースCS252ひかえめ@メガネ 10万/シャドボ/めざ氷/ボルチェン
  • ブースターHA252いじっぱり@たべのこし フレアドライブ/ねがいごと/みきり/鬼火
  • ブラッキーHB252ずぶとい@ゴツメ バークアウト/まもる/つきのひかり/イカサマ
  • エーフィHS252おくびょう@オボン リフレクター/くさむすび/まもる/サイコキネシス
  • シャワーズCD252ひかえめ@ふうせん ねっとう/れいビ/てだすけ/あくび
  • ニンフィアHB252ひかえめ@珠 ひかりのかべ/ハイパーボイス/願い事/みきり

技構成を見直し。

結果

  • シャワーズにふうせんはいい感じだった、ふうせんあり時は水地面無効状態なので繰り出しやすい
  • てだすけ+サンダースは相当な火力かつ速いのでいい感じ
  • 実は、壁を張っている暇はあまりないのかもしれないと思い始めた
  • エーフィは殴ると強い
  • 雨メガラグラージよくいるので草技は貴重
  • 狙われやすいのでまもるが機能しやすかった
  • ブースターかわいいけど繰り出しがむずいのとサンダースと弱点がかぶってるのが痛い
  • リーフィアの可能性を感じた

第三回

  • サンダース CS252ひかえめ@メガネ 10万/シャドボ/めざ氷/ボルチェン
  • ブースター AS252いじっぱり@スカーフ フレアドライブ/捨て身タックル/ばかぢから/オーバーヒート
  • ブラッキー HB252ずぶとい@ゴツメ バークアウト/てだすけ/つきのひかり/イカサマ
  • エーフィ CS252おくびょう@メガネ サイコキネシス/くさむすび/マジカル社員/みきり
  • シャワーズ CD252ひかえめ@ふうせん ねっとう/れいビ/てだすけ/あくび
  • リーフィア HA252@のみ リーフブレード/はたきおとす/しぜんのめぐみ/みきり

まさかの固定砲台さん外し。

結果

  • 勝ち負け半々くらいの成績が出せそう
  • スカーフブースターの大活躍
  • てだすけを受けたブースターのフレアドライブは強い
  • 106族までしか抜けないのが微妙かも、ただし火力は出てる
  • ブースターは地震のついでに倒そう的な感じで油断しきってる雰囲気があったのでそこを刺していけた
  • リーフィアの立ち回りに慣れていきたい感じ
  • 地震、いわなだれを余裕で受けれるのでそのへん活かしていきたい
  • 結構引かせる性能があるので、はたきおとすを有効に使えそう
  • やはりメガリザXだったとき無理だった
  • エーフィは全力で殴ったほうが強かった
  • キノコ絶対に殺すマンだった
  • 珠社員の火力なかなかだった

第4回

反省

  • ブースターが準速スカーフ、サンダースが準速で起こる弊害
  • ゲッコウガが抜けない
  • リーフィアの出番がまだない
  • リザードン来た! -> X!!!! -> 敗北を2回経験したので運が悪い

ブースター、サンダースを最速に変更。

(育成中)


付録

ダブルバトル仮想敵

良くダブルで見る厨ぽけ

メガガルーラ/メガリザードンY/ランドロス(霊獣)/ボルトロス(化身)/ニンフィア/ガブリアス/ボーマンダ/ゲンガー/モロバレル/ヤミラミ/ミロカロス/キリキザン

この辺りのポケモンに対してダメージ計算をしてみると良さそう。

シナジー

特性やタイプ相性、技などでシナジー効果がありそうな組み合わせ。

晴れ

  • ブースターの炎技
  • エーフィのあさのひざし
  • ブラッキーのつきのひかり
  • リーフィアのこうごうせい
  • リーフィアのようりょくそ

あたりとシナジー効果がありそう。晴れていれば、ブースターにスカーフを持たせて上から殴るだけで強そうです。

難点は、セルフ晴れなところ。わざわざリーフィアに晴れさせなくてもいいかもしれません。昨今はメガリザードンも多いので相手の晴れを利用するのも運ゲーですが手かなと思います。

ブイズは壁はれる個体がいる。エーフィ、ニンフィアは両壁、サンダースは光の壁。

ブラッキーを除くブイズは物理特殊どっちかに特化した種族値をしている。

物理

  • (100超)リーフィア、グレイシア

特殊

  • (100超)ブースター、ニンフィア
  • (100以下)サンダース、シャワーズ、エーフィ

比率的にリフレクターのほうが需要がありそう。特殊受けする場合はひかりのかべもありな感じ。

交代受け

せっかく色んなタイプがあるので交代してシナジー効果を出していきたい。

サンダース、ブースター => (地震や物理技読み) => 物理受けリーフィア => (炎技読み) => もらいびブースター

状態異常弱い(ブラッキー→毒々、リーフィア→鬼火、ブースター→でんじは) => マジックミラーエーフィ or シンクロブラッキー

他にも型で受けたりできそう。

プログラマになって5年経った

$
0
0

都内のとある企業に入社して5年経ちました。

こういうプログラマもいるというサンプル提示と振り返りをしてみようと思います。

入社当時のスキル

  • 物理を学んでいた
  • 大学生のとき, FortranとC言語を使う授業の単位を取った
  • C言語はメモ帳かnotepad++で書いていた
  • 独習Cを挫折した
  • ポインタとは一体何なのか
  • どのコンパイラでコンパイルしてるかなんて考えたことなかった
  • C言語を使ったシミュレーションプログラムらしきものを作成して卒論を提出した(LaTex)
  • デバックという単語を知らない
  • 実数と浮動小数点数の違いを意識してない
  • 今となってわかったことだが、大学のPCでEmacsかVimかを起動してえらい目に遭った
  • 実家にPCがなかったので普段の生活でPCに触れるようになったのは大学から
  • インターネットし始めたのは大学から
  • タイピングがとても遅い
  • レポート提出はWordを使用していた
  • Excelは表計算ソフトとして実験レポートの資料に使用していた

プログラミングの能力は蚊程度ですね。大学でPCを使えるようになった感じです。

プログラミング自体は動くと嬉しくて楽しかったので、プログラマになりました。

入社1年目

前半(研修)

  • 新人教育で使用する言語はC言語とC++
  • ポインタについてわからないということがよくわかってきた
  • VisualStudioというものを知った
  • VisualStudioのブレークポイントが便利だったので感動していた
  • デバックという単語を知った
  • C言語とC++は違うというのを知った
  • 半年くらい新人教育を受けたあと実務になった
  • 割と年の近い技術力高そうな先輩社員の言ってることが意味不明でまともに会話できない

後半(実務)

  • 実務は、典型的なアルゴリズムのカスタム実装だったので楽しい
  • 一緒に仕事してる上司とはソースコードをUSBメモリでやりとり
  • 実務内容と最近の技術話の内容に乖離を感じ始めていた
  • 最近の技術について知っていくのは楽しい
  • 実務しながらPythonを始める
  • Python楽しい
  • 実務以外の技術的なことがかなり楽しい
  • Mercurialを導入
  • Bazaar, Gitを検討
  • Linuxに興味
  • おもむろにVimを練習しはじめる

入社2,3年目

  • 実務はC言語で数値計算系のアルゴリズムを実装することにだいたい固定
  • 実務に飽きてきたので空き時間を見つけていろいろ勉強するようになっていた
  • 途中でC#とかの仕事をやった気がしますが記憶が曖昧ですね

以下が入社2,3年目で触った技術に関するツリーです。

触れただけの技術もあります、触れたことをざっくり書いてます。

大半が趣味の勉強内容で埋め尽くされてる感じになりました。

~Javaは全くできません。~

趣味が高じて以下のような感じになっていきました。

  • VCSは結局Gitを使うのが無難
  • エディタはVimしか使わなくなっていった
  • 開発環境は仮想環境のLinuxになっていった
  • スクリプト言語はひとつ勉強しておくと仕事に役立つ
  • 開発機がWindowsからOSX、Ubuntuに移り変わった
  • Web界隈は情報を追っていて楽しいけど仕事にしたくないなぁ
  • レンタルサーバ借りて遊ぶ(さくらのVPS, DigitalOcean, Gehirn, IDCFクラウドあたり)
  • HerokuとかでWebアプリデプロイ遊び
  • 個人で使うWebサービスを立てて遊ぶ
  • 社外の勉強会に顔を出したりしてみた
  • Twitterという最新情報収集ツールを活用しだした

プログラミング楽しい最盛期だった気がします。

実務もLinuxで開発するようになりエディタはVimになり、Gitでソースコード管理をしていました。

あとは、社内にSlackを導入したりしました(若手の団欒件お仕事連絡の場所になってます)。

入社4,5年目

実務は非常にレガシーな感じで楽しくないので、実務に趣味勉強内容を反映して楽しく仕事できるように取り組みはじめました。

  • 数値計算系はテストを書くのが非常に有効なのでテストフレームワーク、TDDを実践し始める
  • Jenkins, Drone.ioなどのCIを試験的に運用
  • GitLabが社内に立って便利
  • GitLab CIが出たので使えそう
  • 仕様書ベースのTDDを始める
  • お客さんを巻き込んでテストを書くスタイルが完成
  • Electronを実務で使いたいので画策中
  • 他の仕事とかを本来の作業以外に並行で頼まれたりするようになってきた

あと他には

  • ブログとか書き始める
  • Dockerを触り始める(上記のCI検証の一環)
  • Node.jsで遊んでたら、NW.js、Electron(旧AtomShell)に出会う
  • PyPIにパッケージを登録したりしてみた
  • 社内勉強会を企画したりし始めた

現在

  • 入社2年目くらいから仕事に飽きてきているので、そろそろ真剣に飽きてきました。もう全部自動化したいです
  • 入社年数が深まると仕事の量が増えてきたりしたり負債が溜まってくるので今はそれに追われてる
  • いかに自由な時間を生成できるか日々考え中
  • 社内勉強会もりあげていきたい
  • Ergodoxが欲しい

入社2年目あたりに何に影響を受けたのか

会社の強い先輩の影響もありますが、けっこう本の影響も受けてます。

他にもあった気がしますが、考え方とかはこの辺りのプログラマ読み物的な書物の影響が大きいです。

今後

かつては使ってるツールとかで困ったときはソースコード読めばいいじゃんとか言われて、何言ってんの...ふざけてるの...と思っていましたが最近はソースコード読もうかなぁという感じになってきました。

そんなこんなでツールを使うことで精一杯な感じだったのは終わってきたと思うので、自分自身も何か作る側に行きたいという気持ちも出てきました(実務以外で)。

最近はRustやHaskellあたりに興味があるので勉強時間取りたいなぁという感じです。

あと、勉強した技術のツリー書くと何か楽しいです、興味があれば作ってみるといいかもです。

ちなみに自分はMindMeisterのテストで作成してスクリーンショットを取っただけです。

プログラマして5年経ちましたが、まだまだやりたいことはいっぱいあります。

がんばるぞい!


人生初GitHubでIssueをもらった話

$
0
0

embed.ly

hubot-dokkuを作っていた

軽い気持ちでslack上のhubotからdokkuをいじれないか試していました。

dokku appsとdokku lsの結果を知らせている犬の様子です。

何か犬がそれっぽく喋ってて楽しいし、DevHubとか動いたし大変便利そうでした。

Issueが来た

embed.ly

調べてみるとdokkuのメインコントリビュータさん...ワァォ...

ぼくのツイートを見たと言っています。多分このツイートだろうと思われます。

embed.ly

内容はすごい便利なことを言っていたので実際に試してみてわからないことを聞いてみました。

GitHubすごい

すごいびっくりして動揺しましたが、嬉しかったです。

大したこともしてないのでGitHubは便利なソースコード置き場件、なんかスゴイ人たちがすごいものを作ってるところ としか見てなかったのすが、こういうこともあるんだなぁとしみじみしました。

すごい緊張しながら返信しましたがいい経験になった気がします。

embed.ly

あーびっくりした。

hubot-dokkuについてはまた記事書く気がします。

Ubuntu 14.04で"The package system is broken"を解決したいとき

$
0
0

Ubuntuでこの赤いエラーが出たときの対処法です。


apt - How do I resolve unmet dependencies after adding a PPA? - Ask Ubuntu

(見出しがリンク先になってます)

いくつか書いてある手順のどれかで解決できる可能性が非常に高いと思われます。

libefl関係のエラー"The package system is broken"して困っていて、ググっても簡単に解決できなかったときに出会って無事に解決しました。

その際は、ppaを減らしたら解決しました。

"The package system is broken"解決策についてすごく良くまとまっているので参考に。

Ergodox買おうの会【買いました】

$
0
0

こんにちは、Ergodox買おうの会を身近な人と始めようと声をかけてみましたが、興味はあれど一緒に買ってくれる人がいなかったので、とりあえず買ってみました。

購入までのことについてはgistにまとめてあります(購入の詳細、届くまでのこともコメント欄に書いてあります)。

Ergodox買おうの会


※追記

Ergodoxを購入して1.5ヶ月経って社内勉強会で発表しました、使用感等についても書いてますので参考にどうぞ。

embed.ly

様子

キャップつけたErgodox

カイシャのErgdox

軸はGreetechの赤軸です。軽くて静かを望んでいたので満足しています。

下の写真はカイシャの様子ですが、真ん中のはどのキーボード買おうか悩んでいたときにHHKBを試してみようと思い買ったHHKB Lite2です。まだ慣れない感じなので置いてありますがそのうち撤去される予定です初日で撤去されました。

キー配置

key_map

なかなか慣れないのでまだ悩み中です。

設定方法

設定に関しては以下の記事を参考にしました。

ErgoDox買ったったった(そしてハウツーConfigurator) - Make 鮫 noise

Massdropのアカウントを作ればErgodoxの基本的なキーマップをWebから作成できるようです。

Ergodox Configurator - Massdrop

作成したキーマップを保存、読み込みもできて便利な感じです。目的のキーマップが完成したら.hexファイルを作成します。

.hexファイルはTeensy Loaderを使用してErgodoxに適用します。

Teensy Loader Application - available for Windows, Linux and Macintosh systems

OSXでは問題なく出来たのですが、Ubuntuではうまくいかなくて困っているので知ってる方がいれば教えていただきたいです。

改善したい点

FalbaTechで購入したケースは滑りやすいのと、セパレートのキーボードは中央が高くなるように傾斜がついていたほうがタイピングしやすいと少し使ってわかってきました。

漢(オトコ)のコンピュータ道: キーボードを新しくした話(ErgoDox)

この記事を参考にアクリル板を買ってもいいかもですし、四角いゴム角材的な何かを買ってもいいのでは...と言う感じです。

四角いゴム的な何かって...消しゴムなのでは...!!?となって今はいい感じの消しゴムを探しています。


Ergodoxを買おうと思った動機は、プログラマになってから肩こりするようになっていてセパレートのキーボードを見たときに、これを使えば姿勢が改善されそうので良いのでは!と思ったからです。

この記事もErgodoxで書いていますがのろのろです、まだまだ慣れないので積極的に使っていきたいです。

あと写真をよく見るとXキーの位置にVキーがあるということに気がつくと思います、VimmerにはVキーが2つ届くようです。

一般的な提督の2016年春イベ

$
0
0

※E-4攻略中

一般的な提督は情報戦が勝負だと思うので入念に情報収集しながらやります。

そしてすごい提督と違い戦力、装備、資材のリソースが限られています。この限られたリソースの中で如何に結果を最大化するか考えていきます。

札と出撃制限

制限

E-1, E-4 : 連合(高速?)
E-2, E-3 : 輸送(強い軽巡駆逐)
E-5 : 謎
E-6 : 機動艦隊(空母多め?)

報酬から考える難易度選択

E-1: 戦闘糧食x2、給糧艦「伊良湖」x2、大発動艇(八九式中戦車&陸戦隊)
E-2: 補強増設x2、九六式陸攻x1、一式陸攻
E-3: 改修資材x6、勲章、Bofors 40mm四連装機関砲
E-4: 一式陸攻、三式戦 飛燕、熟練搭乗員
E-5: 三式戦 飛燕(飛行第244戦隊)、雷電、改修資材x7
E-6: 一式陸攻(野中隊)、改修資材x8
E-7: 熟練搭乗員、勲章x2、甲種勲章x1

E-4までは敵艦隊的にも甲でいけそう報酬も欲しい。

E-5以降はヤバそうなので実際に突っ込んでみて考えたい。

編成考察

E-1, E-4

E-1: 高速統一駆逐艦5(雷巡1)

戦艦、軽空、軽空、重巡、重巡、駆逐:対空
軽巡、駆逐、駆逐、駆逐、駆逐、雷巡

E-4: 水上高速統一戦艦1以下雷巡1

戦艦、軽空、軽空、重巡、重巡、重巡
軽巡、雷巡、駆逐、駆逐、駆逐、重巡

戦艦1, 軽空2, 重巡or航巡4, 軽巡1, 雷巡1, 駆逐5

E-1: Zara(司令部施設), Italia, 千歳, 千代田, Roma, 初月

E-1: 球磨, 時津風, 雪風, 島風, 天津風, 大井

E-4: Zara(司令部施設), Italia, 千歳, 千代田, 摩耶, 熊野

E-4: 球磨, 時津風, 雪風, 初月, 鈴谷, 大井

E-2, E-3

E-2: ボスが陸上, 砲台

軽巡、駆逐、駆逐、駆逐、航巡、航巡

E-3: 輸送作戦, 駆逐艦8

航巡、水母、駆逐、駆逐、駆逐、駆逐
軽巡、駆逐、駆逐、駆逐、駆逐、航巡

航巡2, 駆逐8, 水母1

E-2: 阿武隈, 潮, 初霜, 時雨, 最上, 瑞鳳

E-3-1: 三隈、霞、皐月、朝潮、雷、電

E-3-2: 阿武隈、江風、潮、初霜、時雨、最上

E-5

ボスが陸上, 高レベル駆逐艦

航巡、航巡、駆逐、駆逐、駆逐、駆逐:対空

利根, 筑摩, 夕立, 暁, 綾波, 秋月

E-6

ボスが陸上(艦爆、瑞雲が有効), 空母の数でルートが変わる

航戦、航戦、空母、空母、航巡or軽空、あきつ丸
軽巡、駆逐、駆逐:対空、雷巡、航巡、重巡

1: 扶桑, 山城, Prinz, あきつ丸, 加賀, 翔鶴

2: 大淀, ベールヌイ, 照月, 北上, 羽黒, 鳥海

編成参考リンク

E-1

E-4

E-2

E-3

E-6

戦力

主な戦力です。

戦艦

扶桑改二(96), 山城改二(97), 大和改(85), 武蔵改(73), 長門改(75), 陸奥改(73), 金剛改二(79), 比叡改二(75), 榛名改二(90), 霧島改二(80), Bismarck drei(98), Roma(45), Italia(87)

空母

加賀改(87), 赤城改(57), 瑞鶴改(88), 翔鶴改二(90), 飛龍改二(86), 蒼龍改二(89), 天城改(53), Graf改(75), 大鳳改(86)

瑞鳳改(60), 千歳航改二(59), 千代田航改二(64), 龍驤改二(88), 隼鷹改二(84), 飛鷹改(37)

重巡/航巡

鈴谷改(48), 熊野改(55), 利根改二(93), 筑摩改二(81)

Prinz改(87), 鳥海改二(78), 摩耶改二(83), 羽黒改二(81)

軽巡/雷巡

大井改二(81), 北上改二(85), 木曽改二(70)

川内改二(69), 神通改二(83), 阿武隈改二(81), 球磨改(67), 矢矧改(58), 大淀改(79)

駆逐艦

時津風改(118), 雪風(87), 夕立改二(81), 時雨改二(89), ベールヌイ(81), 潮改二(80), 初霜改二(81), 暁改二(71), 天津風改(54), 秋月改(57), 照月改(66), 島風改(57), 綾波改二(82)

出撃の様子

E-1は上記の編成でストレート(司令部施設を4回使用), レアドロップはなし

E-2は艦爆の決戦航空支援を出して、ラストだけ道中支援。

E-3は高速水母がいなかったので駆逐9でトライ、道中に通常支援を出して、ラストのみ決戦通常支援

Ergodoxの良さを語ってきた

$
0
0

買って2ヶ月近く経ったのとErgodox使ってると最高感しかないので、社内勉強会でErgodoxの良さを語ってきました。

embed.ly

Ergodox購入検討者向けのスライドなので参考になれば嬉しいです。


こちらは自分のErgodoxについての紹介です。

実際に使ってみて改善してきた歴史やキーマップを紹介してます。

embed.ly

姿勢改善

ブコメでライザップ比較がほしいとあったので頑張って描きました(写真は恥ずかしいので...)。

横から見た感じがもっと偉そうにエビ反ってるときもある気がしますが、大体絵に書いた通りの感じです。

前かがみでタイピングすることは余りなくなりました。モニタとの距離も前より遠くなって目にも良さそうな感あります。

肩こりもHHKB Lite2を使用していた時と比較すると改善してます!

実は、Ergodox購入の目的はプログラマになってから悩んでいた肩こり改善がメインの目的だったので個人的に大満足しています。

キーマップ

特記事項を順不同箇条書きで紹介します。

  • Layer2はほとんど使っていません
  • 十字キーのある位置(4キー分)は押しづらい位置にあるので左右でほどんど使っていません
  • 十字キーはLayer1のHJKLを使っていてVimを愛用しているため非常に楽です
  • 親指Enter/Backspaceは慣れるまで違和感がありましたが今は最高です
  • Layer1を押しっぱなしにすることが多いので左親指の位置にしてます
  • 内側にしている左右括弧は最近慣れてきてます

massdropのサービスで設定しているのでコードベースに置き換えたい気持ちがあります。

最後に最近の僕の魂の声です。

embed.ly

RustでFibonacci数列を書いて学ぶ

$
0
0

プログラミング言語Rustを一通り読んだのでまずFibonacci数列書いてみたメモです。


Table Of Contents

準備

Fibonacci以外にも色々やっていく予定なので、Rustの勉強用リポジトリを作ります。

$ cargo new exercise --bin$ cd exercise

モジュール

mainにドバドバ書いても良いのですがRustにはモジュールがあるので使ってみます。

$ cd src$ touch lib.rs$ touch fibonacci.rs

lib.rsにモジュールについての情報を書き込みます。

pubmodfibonacci;

fibonacci.rsを書いていきます。外部から呼ぶ関数にはpubをつけて宣言します。

pubfnfib_match(n:i32)->i32{matchn{0=>0,1=>1,_=>fib_match(n-2)+fib_match(n-1),}}

main.rsから呼び出すときは

externcrateexercise;useexercise::fibonacci;fnmain(){assert_eq!(8,fibonacci::fib_match(5));}

のようにします。

テスト

fibonacci.rs内に続けてテストを書いていく方向でいきます。

// pub fn fib_match() ... の下#[cfg(test)]modtests_fibonacci{usesuper::*;#[test]fntest_fib_match(){assert_eq!(89,fib_match(10));}}
$ cargo testRunning target/debug/exercise-aedb186b5607382a

running 1testtest fibonacci::tests_fibonacci::test_fib_match ... oktest result: ok. 1 passed;0 failed;0 ignored;0 measured

     Running target/debug/exercise-d96eb056e1d4faff

running 0 teststest result: ok. 0 passed;0 failed;0 ignored;0 measured

   Doc-tests exercise

running 0 teststest result: ok. 0 passed;0 failed;0 ignored;0 measured

ベンチマークテスト

Fibonacci数列計算の時間を図りたさがあるのでベンチマークテストを使ってみます。

ベンチマークテスト

注意して欲しいのはRust 1.9時点ではベンチマークテストはnightly buildでしか使えないということです。

nightlyの入手方法は以下にあります。

Nightly Rust

$ curl -s https://static.rust-lang.org/rustup.sh | sh -s -- --channel=nightly

これでベンチマークテストができます。

テストはfibonacci.rsに書いていくことにしたのでベンチマークテストを追加します。その前に、testアトリビュートとtestクレートをlib.rsに追加します。

#![feature(test)]externcratetest;pubmodfibonacci;

fibonacci.rsにベンチマークテストを書きます。

#[cfg(test)]modtests_fibonacci{usesuper::*;usetest::Bencher;#[test]fntest_fib_match(){assert_eq!(89,fib_match(10));}#[bench]fnbench_fib_match(b:&mutBencher){b.iter(||fib_match(30));}}
$ cargo bench
   Compiling exercise v0.1.0 (file:///home/vagrant/works/exercise)
     Running target/release/exercise-aedb186b5607382a

running 2 teststest fibonacci::tests_fibonacci::test_fib_match ... ignoredtest fibonacci::tests_fibonacci::bench_fib_match ... bench:       1,207 ns/iter (+/- 768)test result: ok. 0 passed;0 failed;1 ignored;1 measured

     Running target/release/exercise-d96eb056e1d4faff

running 0 teststest result: ok. 0 passed;0 failed;0 ignored;0 measured

これは便利。

Fibonacci数列

パターンマッチを使った方法(O(2^n))はもう書いたのでそれ以外の方法でも書いてみます。

関数呼び出し1回

O(n)

Rustは関数内に関数を定義できます。

pubfnfib_one(n:i32)->i32{fnfunc(a:i32,b:i32,c:i32)->i32{ifc<2{returna;}func(a+b,a,c-1)}func(1,0,n)}

クロージャを使って再帰を書けたほう便利そうですが

rust-lang closures does not support recursive ,while python lambda expression does · Issue #17911 · rust-lang/rust

クロージャを使った再帰はできないみたいです。

動的計画法

O(n)

pubfnfib_dp_simple(n:i32)->i32{letmutf1=0;letmutf2=1;letmuttmp=0;for_in0..n-1{tmp=f1+f2;f1=f2;f2=tmp;}tmp}

配列を使って計算結果をメモ

一度計算した結果を配列にメモする方法。

プログラミングコンテストチャレンジブック [第2版]にあるC++のコード

intmemo[MAX_N+1];intfib(intn){if(n<=1)returnn;if(memo[n]!=0)returnmemo[n];returnmemo[n]=fib(n-1)+fib(n-2);}

これを素直に実装しようとすると、memoはstatic mut [i32; MAX_N]型の配列になると思うのですが、static mut型の値を変更するにはunsafeを使わざるを得ないのでアンチパターンな気がします。

embed.ly

という意見をもらったので実装してみました。

constMAX_N:usize=1000;structFibMemo{memo:[i32;MAX_N],}implFibMemo{fnnew()->Self{FibMemo{memo:[0;MAX_N]}}fncalc(&mutself,n:i32)->i32{ifn<2{returnn;}ifself.memo[nasusize]!=0{returnself.memo[nasusize];}self.memo[nasusize]=self.calc(n-2)+self.calc(n-1);self.memo[nasusize]}}pubfnfib_memo(n:i32)->i32{letmutf=FibMemo::new();f.calc(n)}

ベンチマークテストしてみるとあまり速度が出ておらず、もっと良い実装ありそうですが正解がわかってません。

繰り返し二乗法

O(log(n))

プログラミングコンテストチャレンジブック [第2版]にのってる方法です。

フィボナッチ数列の行列表現を利用した手法です。

fnmul(a:&[i32;4],b:&[i32;4])->[i32;4]{letmutc=[0;4];foriin0..2{forkin0..2{forjin0..2{c[i*2+j]=c[i*2+j]+a[i*2+k]*b[k*2+j];}}}c}fnpow(muta:[i32;4],mutn:i32)->[i32;4]{letmutb=[1,0,0,1];whilen>0{ifn&1!=0{b=mul(&b,&a);}a=mul(&a,&a);n>>=1;}b}pubfnfib_repeat(n:i32)->i32{// a[0] = A[0][0]// a[1] = A[0][1]// a[2] = A[1][0]// a[3] = A[1][1]letmuta=[1,1,1,0];a=pow(a,n);a[2]}

リファレンスやExampleを見るとビット演算やシフト演算もサポートされていました。

上のコードでは二次元配列ではなく一次元配列で処理してます。

一般項

O(1)

fibonacci

pubfnfib_formulas(n:i32)->i32{((((1f64+5f64.sqrt())/2f64).powi(n)-((1f64-5f64.sqrt())/2f64).powi(n))/5f64.sqrt()).round()asi32}

Rustはf64などのプリミティブ型にimplで数値計算系のメソッドが定義されているので、こういった処理を直感的に書けて便利感を感じました。

速度比較

matchの方法は遅すぎるのでのせてません。1000番目の計算時間です。

test fibonacci::bench_fib_one       ... bench:         317 ns/iter (+/- 55)
test fibonacci::bench_fib_dp_simple ... bench:         321 ns/iter (+/- 59)
test fibonacci::bench_fib_memo      ... bench:       8,525 ns/iter (+/- 1,039)
test fibonacci::bench_fib_repeat    ... bench:          24 ns/iter (+/- 5)
test fibonacci::bench_fib_formulas  ... bench:           0 ns/iter (+/- 0)

関数呼び出し1回と動的計画法はO(n)で同程度の時間、メモを使用した方法は結構時間かかっています。繰り返し二乗法はO(log(n))なので速いです。

一般項はO(1)なのでどんなnでも定数時間しかかからないので比較しても意味なさげです。

こういうアルゴリズム別に計算時間の比較とかしたいときにベンチマークテスト便利!便利!ってなりました。

まとめ

色々学びがありました。

テスト関係が標準であるのはいいことですね。ベンチマークテストも簡単に使えて便利でした。

Rustはコンパイラ先生がかなり厳しくつらいので、まだ慣れが必要感がすごいです。がんばるぞい。

ソースコードは以下にあります。自分のやる気次第ですが他のこともやってみたい予定です。

embed.ly

参考記事

Rustのturbofish

$
0
0

リファレンスやドキュメントで時々出会う turbofish とは、"::<>"のこと

embed.ly


型を明記するのとturbofishの両方が使えるときってどっち使うと良いのかな?

letv:Vec<i32>=(0..10).collect();
letv=(0..10).collect::<Vec<i32>>();

react-routerをCDNのみで使う

$
0
0

この記事は、npm非依存でReactを使ったWebフロントエンド開発をしたい方向けです。

GitHub - reactjs/react-router: A complete routing library for React

react-routerがCDNで使用できると聞いてやってみました。

ReactのチュートリアルでもCDNのみを使用した例を使っているのでこれを雛形として、react-routerのCDNを追加します。

<!-- index.html --><!DOCTYPE html><html><head><metacharset="utf-8"/><title>React Router CDN Sample</title><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/react/15.2.1/react.js"></script><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/react/15.2.1/react-dom.js"></script><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.min.js"></script><scripttype="text/javascript"src="https://cdnjs.cloudflare.com/ajax/libs/react-router/2.5.2/ReactRouter.js"></script></head><body><divid="content"></div><scripttype="text/babel"src="main.js"></script></body></html>

これでreact-routerが使えます。

CDNを使用した場合は、window.ReactRouterにライブラリが入っています。

let{Router,Route,Link,hashHistory}=window.ReactRouter;

このように変数として宣言しておくと良いです。

簡単なreact-routerの例です。

// main.jslet{Router,Route,Link,browserHistory}=window.ReactRouter;classIndexextendsReact.Component{render(){return(<div><h1>HelloReact!</h1><ul><li><Linkto='/about'>About</Link></li><li><Linkto='/article'>Article</Link></li></ul>{this.props.children}</div>);}}classAboutextendsReact.Component{render(){return(<div>About</div>);}}classArticleextendsReact.Component{render(){return(<div>Article</div>);}}ReactDOM.render((<Routerhistory={hashHistory}><Routepath='/'component={Index}><Routepath='about'component={About}/><Routepath='article'component={Article}/></Route></Router>),document.getElementById('content'));

index.htmlをブラウザで開くだけでreact-routerが動いているのを確認できます。

個人的にこれはすごく便利で、npmのあれこれを気にしなくて良いのはメリットです。あとはブラウザでimportが動くようになれば、依存関係を気軽にファイル分けできて良さそうな気がします。

historyにhashHistoryを使用していますが、サーバに乗せればbrowserHistoryも使えます。

Flaskと共に実装する場合

こういう場合は、react-routerで作成したルーティングテーブルにリロードでアクセスすると404エラーになってしまいます。

redditやstackoverflowで議論されていて、解決策が提示されています。

fromflaskimportFlask,render_templateapp=Flask(__name__)@app.route('/',defaults={'path':''})@app.route('/<path:path>')defindex(path):returnrender_template('index.html')if__name__=='__main__':app.run(debug=True)

FlaskでCDNのreact-routerを使用した例です。

embed.ly

サーバサイドをNodejs以外で書くとなると、2つのパッケージマネージャを使うことになり管理が大変になるのでnpm非依存になるように工夫してみました。


Nodejs界隈がビルドツールに強く依存していたりしてモダンなWebフロントエンド開発を始める際のハードルが高くなっているような気がしています、CDNでさっと始めるメリットもあると思いますので気軽にはじめたい方におすすめです。

CentOSにCppcheckをRPMでインストールする方法

$
0
0

Cppcheckはとても優れたツールですが、Windowsで使用する場合はSetupがありますが、Linuxで使用する場合は手動でのインストールになります。

ソースコードをダウンロードしてビルドすれば良いのですが、ビルドするツールをインストールできない場合などビルド困難な場合がありますので、RPMパッケージをインストールする方法を紹介します。

Note

1つ注意なのは、RPMパッケージでインストールするため必ずしも最新版のCppcheckを使えるわけではありません、新しいCppcheckがどうしても使いたい場合はソースコードからビルドしましょう。

紹介する方法はCentOS6を対象にしますが、別バージョンのCentOSに関しても目的のバージョンに置き換えればインストール可能だと思います。

How to Install

cppcheck Download (DEB, RPM, TXZ)

上記のリンクから目的のCppcheckのRPMパッケージを探します。

CentOS6のx86_64のCppcheckを選択するとパッケージの詳細ページに行きます、下の方にDownloadという項目があります。

DownloadアイコンをクリックするとRPMパッケージへのリンクがあるページに行きますので、"Binary package"のリンクをコピーして、CppcheckをインストールするCentOS上でwgetします。

$ wget http://dl.fedoraproject.org/pub/epel/6/x86_64/cppcheck-1.63-2.el6.x86_64.rpm

あとはrpmコマンドでインストールします。

$ sudo npm -ivh cppcheck-1.63-2.el6.x86_64.rpm

残念なことに自分の環境では以下のようなエラーが出ました。

warning:cppcheck-1.63-2.el6.x86_64.rpm:HeaderV3RSA/SHA256Signature,keyID0608b895:NOKEYerror:Faileddependencies:libtinyxml2.so.1()(64bit)isneededbycppcheck-1.63-2.el6.x86_64

libtinyxml2がないみたいです。

依存パッケージは最初に選択したパッケージのリンク先で確認できます。

cppcheck-1.63-2.el6.x86_64.rpm CentOS 6 Download

足りないパッケージは環境によって違うと思いますので適宜インストールします。今回のケースではlibtinyxml2が足りないので、Cppcheckと同じようにインストールしていきます。

DownloadからRPMパッケージへのリンクをコピーしてインストールします。

$ wget http://dl.fedoraproject.org/pub/epel/6/x86_64/tinyxml2-1.0.11-4.20130805git0323851.el6.x86_64.rpm$ sudo rpm -ivh tinyxml2-1.0.11-4.20130805git0323851.el6.x86_64.rpm

これでCppcheckをインストールする準備ができたので改めてインストールします。

$ sudo npm -ivh cppcheck-1.63-2.el6.x86_64.rpm

エラーがでなければインストール完了です。


新しいバージョンをビルドしてインストールしたいなどで、パッケージをアンインストールする際には以下のようにアンインストールします。

$ sudo npm -e cppcheck-1.63-2

まとめ

RPMパッケージを直接インストールすることで、リポジトリの追加やビルドツールのインストールなどが省けるメリットがあります。デメリットはバージョンが固定なことです。

状況に応じてインストール方法を選択していくことになると思いますが、RPMでのインストールは簡単だったので割りとおすすめです。

簡単にわかるGitLab CIの仕組み

$
0
0

GitLab CIのquick startを読んでもしっくり来なかった人向けにGitLab CIの仕組みをまとめました。

特に「Runnerって何?」ってなった人向けです。

(※GitLab CIの導入方法や使い方については触れていません)

GitLab CIの仕組み

GitLab Continuous Integration | GitLab

上のページのArchitectureの図がとてもわかり易いです。

GitLab CI is a part of GitLab, a web application with an API that stores its state in a database. It manages projects/builds and provides a nice user interface, besides all the features of GitLab.

GitLab CIはGitLabの中の一つの機能でありWebアプリケーションとして動いていてprojectsとbuildsを管理するための良い感じのインターフェースを提供しています。

GitLab Runner is an application which processes builds. It can be deployed separately and works with GitLab CI through an API.

GitLab Runnerはビルドのための一つのアプリケーションで、別々の場所で動かすことができ、APIを通してGitLab CIと連携できます。


図を見て分かるように、GitLab RunnerはGitLab本体とは分離して別マシンや別コンテナに配置して、GitLabとGitLab Runner間はAPIで通信する仕組みになっています。

とてもシンプル。

GitLab Runnerの詳細

GitLab RunnerについてはリポジトリのREADMEがわかりやすいです。

GitLab.org / gitlab-ci-multi-runner · GitLab

簡単にまとめると

  • 並列実行や分散実行ができる
  • ビルドはshellやDocker(over sshとコンテナ分散も可能)、sshが使える
  • Goで書かれたシングルバイナリ
  • Ubuntu, Debian, OS X, Windows対応

Windowsにも対応してるのにびっくりしました。心配になりがちな、Windowsへのインストール方法も配置はGoのシングルバイナリをダウンロードして配置するだけで良いので簡単です。Goで書かれてる強みを感じました。

OSXに関してもバイナリをcurlでダウンロードして配置、Linuxに関してはリポジトリと追加してパッケージマネージャでインストールできます。

Dockerの場合はgitlab/gitlab-runnerというイメージが配布されているのでそちらをインストールして利用できます、基本的にUbuntu14.04のようですが、Aplineも使えるようです(gitlab/gitlab-runner:alpine)

GitLab Runnerという名前についてですが、プロジェクトの名前はGitLab CI Multi Runnerで、GitLab CI Runnerと呼ばれていることが多いですが、今は"GitLab Runner"と呼んで欲しいみたいです。

まとめ

ArchitectureもシンプルでGitLab CI良いなぁとなりました。

Runnerについてのさらに詳しいことやわからないことは、GitLab Runnerの公式リポジトリを見てみると良いと思います。

個人的にはWindowsでのCIに悩んでいたので、Jenkinsに手を出さないでGitLab CIだけで全て収まりそうなのでテンション上がっています。

MacでVagrant上のVMを自動起動する方法

$
0
0

VM上にある開発サーバとかを自動起動したいのでやってみました。

~/Library/LaunchAgentsに好きな名前のplistファイルを作成します(ここではvagrant.startup.plist)

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plistversion="1.0"><dict><key>EnvironmentVariables</key><dict><key>PATH</key><string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string></dict><key>Label</key><string>vagrant.startup</string><key>ProgramArguments</key><array><string>sh</string><string>[Shell script名]</string></array><key>RunAtLoad</key><true/><key>StandardErrorPath</key><string>/tmp/vagrant.startup.agent.stderr</string><key>StandardOutPath</key><string>/tmp/vagrant.startup.agent.stdout</string><key>UserName</key><string>[ユーザー名]</string><key>WorkingDirectory</key><string>[Shell scriptを配置したディレクトリ]</string></dict></plist>

Shell script

cd[VMのディレクトリ]&& vagrant upcd[VMのディレクトリ]&& vagrant up# 必要な数だけ起動

ポイントは

  • PATHを明示的に指定
  • Shell Scriptを叩いてvagrantのVMを起動
  • ユーザーを指定

StandardErrorPathとStandardOutPathはデバック時に役に立ちますがなくても良いです。

Macを再起動すれば自動的にplistが読み込まれますので、VMが起動していればokです。


気になるのは、VM起動したまま再起動すると起動時にVMが中断の状態になってしまうことです。

shutdown時にVMを安全にshutdownさせたいので調べてみると

など幾つか情報がでてきますが、今のところうまくいっていません。

とりあえず、中断状態からでも正常に起動してるみたいなのでこれでいいかという感じです。

GitLab CIならWindowsでのCIも簡単

$
0
0

WindowsでビルドやテストをするようなCIがGitLab CIで簡単に構成できるので紹介します。


簡単にわかるGitLab CIの仕組みで書いたように

GitLab RunnerはGitLab本体とは分離して別マシンや別コンテナに配置して、GitLabとGitLab Runner間はAPIで通信する仕組みになっています。

ということなので、ビルド環境のある物理WindowsマシンにGitLab Runnerを設置することでWindows版CI用Runnerを構築できます。

Install

GitLab RunnerはGolangで書かれておりシングルバイナリとして配布されており、インストールはバイナリを配置するだけokです。

  • x86: https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-windows-386.exe
  • amd64: https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-windows-amd64.exe

使用しているWindowsに応じてダウンロードします。

配置する場所に制限はないので好きな場所に配置します。

この記事ではC:\GitLab-Runnerにamd64のバイナリを配置したとして進めていきます。

Setup

まず登録する際に入力する情報をGitLabで確認します。

「CIをするプロジェクトページ > Settings > Runners」を開くと"URL"と"token"が書いてあります。

URL & token

管理者権限でコマンドプロンプトを開き、先ほどバイナリを配置したフォルダに移動して登録していきます。

> cd C:\Gitlab-Runner> gitlab-ci-multi-runner-windows-amd64.exe registerPlease enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):{{確認したURL}}Please enter the gitlab-ci token for this runner:{{確認したtoken}}Please enter the gitlab-ci description for this runner:[<PC名>]: {{Runnerの説明}}Please enter the gitlab-ci tags for this runner (comma separated):{{Tag(任意)}}Registering runner... succeeded                     runner=XXXXXXPlease enter the executor: virtualbox, docker+machine, docker-ssh+machine, docker, docker-ssh, parallels, shell, ssh:shellRunner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

executerにはshellを選択してコマンドプロンプトでビルドするように指定しました。

次にユーザー名とパスワードを設定します。

この方のブログ記事にも書いてありますが、現状ユーザー名を指定するとうまく行きません。

パスワードの指定だけすると現在ログインしているユーザを自動で認識して設定するようなのでパスワードだけ指定します。

> gitlab-ci-multi-runner-windows-amd64.exe install --password ENTER-YOUR-PASSWORD> gitlab-ci-multi-runner-windows-amd64.exe start

パスワードが正しく設定されていればstartできます。

startに成功していればGitLabのSettings>Runnersに登録したRunnerが表示されているはずです。

Note

Windowsにgitがインストールされていないとビルド時にgitがないのが原因で失敗してしまいます。
gitがインストールされていない場合は以下の記事を参考にgitをインストールすると良いです。
コマンドラインからGitを使う(for Windows) - Qiita
gitをインストールしたあとはRunnerをrestartさせる必要があります。

gitlab-ci-multi-runner-windows-amd64.exe restart

あとは.gitlab-ci.ymlを書いてpushすればCIが走ります。

Build

実際に動かした様子です。

.gitlab-ci.ymlのtagsを使えば複数環境でCIさせることが可能です、マルチプラットフォームでのCIが必要な場面に便利。

scriptでバッチファイルを起動するようにすれば手の込んだビルドもできそうなので今後試していく予定です。

参考記事

Viewing all 216 articles
Browse latest View live