それでも明日はいい日になる

pvmがうまく動かないのでなんとかしたい

pvmとは

pvmはnvmの流れを踏襲したplay frameworkのバージョン管理を行うツールである。 使い方はいたってシンプルで pvmのリポジトリをhomeディレクトリでクローンしシェルスクリプトを実行するだけ。

その後pvm install <version>を叩くとzipファイルをとりにいって保存。 pvm use <version>を叩いて適宜使い分けをするといった加減で使えるものだ。

ここまではReadMeにかいてある通りでなんだけど、 ぼくの環境ではpvm installのあたりから思った挙動にならない。

以下、どうなったのかをまとめる。 まあ気にくわないならpull requestおくるのが一番なんだけど。。。

エラーまでの流れ

実現したい事

平時play2.5をつかって開発をしているのだが、play1.2.7が必要なので特定のディレクトリではplay1.2.7が動いて欲しい。 ちなみにjenvを使ってjavaのパッケージ管理はできている。

pvmインストールする

git clone git://github.com/kaiinkinen/pvm.git ~/utils/pvm

その後 . ~/utils/pvm/pvm.shを叩く

pvmでplayを落とす

pvm install 2.0 とするとダウンロードが始まり
~/utils/pvm/src配下に2.0.zipと2.0.https_headerが置かれる

ここからが問題なのだけど zipはダウンロードできたにもかかわらずdownload failと表示がでる。

ダメ元でpvm use 2.0を叩くと インストールされていないと出てくる。

fxxck!!

とりあえずの解決策

どうしてもplay1.2.7が必要だったのでdirenvを入れて管理する事にした。

お世話になった記事 https://qiita.com/kompiro/items/5fc46089247a56243a62 https://qiita.com/honyahonyagemomo/items/4504e209905777d8220b

今月中にpull request送るからまっとけpvm

direnvでエレガントな開発環境を

direnvとは

ディレクトリごとに環境変数を定義してカレントディレクトリになった時に環境変数を適用してくれるツール。

Githubはこちら
https://github.com/direnv/direnv

Goでできててなうい感じ。 ドキュメントも充実してます。

インストール

Mac上でHomeBrewをいれているときはbrew install direnv

そうじゃない人は

git clone https://github.com/direnv/direnv.git
cd direnv
sudo make install

これでインストールは完了

hookの追加

.zshrcや.bashrcにhookを追加する。

export EDITOR=vim(ここはお気に入りのエディタに読み替えてください)
eval "$(direnv hook zsh)"

bashの場合は

eval "$(direnv hook bash)"

pathを通して環境を作る

環境構築したいディレクトリに移動して

direnv edit .

とすると記載のためのエディタが立ち上がるので、そこに

export PATH=bin:$PATH

を追加する。

PATH_add bin

こっちでもできます。

保存が完了すると.envrcができているので追加があるときは編集してください。

エラーが発生する

.envrcが読まれると時たまエラーが出ます。そんなときは

direnv allow

として問題解決

direnvを使うメリット

pvmとかpyenvとか色々管理ツールはあるわけですが管理ツールの管理に追われるというジレンマに陥りがち。

あれ、何が原因で動かないんだ?ってなった時に.envrcを見に行ってごにょごにょするだけでいいなら楽チンです。 僕はplayFrameworkの管理がきっかけで使うようになりました。 play1.2.7を使う時にjava7使わないといけなかったり他ではscala使ったりjava8つかったりしてる関係でとても重宝しています。

これで余計な労力を使わずエレガントな環境構築と変更が可能です。

おまけ

alias

.direnvrcを開いて

export_function() {
local name=$1
local alias_dir=$PWD/.direnv/aliases
mkdir -p "$alias_dir"
PATH_add "$alias_dir"
local target="$alias_dir/$name"
if declare -f "$name" >/dev/null; then
echo "#!/usr/bin/env bash" > "$target"
declare -f "$name" >> "$target" 2>/dev/null
echo "$name" >> "$target"
chmod +x "$target"
fi
}

を書き込む。

hoge() {
 こまんど
}
export_function hoge

こちらで議論してます。参考にどうぞ https://github.com/direnv/direnv/issues/73

Macにfabricを入れてherokuへデプロイしたい時につまずいた。

やろうとした事

fablicを使ってherokuにある本番へデプロイをしたい

環境

OS: OS X El Capitan 10.11.6 python : 2.7.0

pipをインストール

まずこのPCにはpipが入っていなかったのでpipをダウンロード。

sudo easy_install pip

動作確認

pip -V
pip 9.0.1 from /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages (python 2.7)

fabricをインストール

pip install Fabric

インストールの確認

pip freeze

asn1crypto==0.24.0
bcrypt==3.1.4
cffi==1.11.2
cryptography==2.1.4
enum34==1.1.6
Fabric==1.14.0
idna==2.6
ipaddress==1.0.19
paramiko==2.4.0
pyasn1==0.4.2
pycparser==2.18
PyNaCl==1.2.1
six==1.11.0

無事にfabricが入ったのでfabfileをつくる

デプロイのためのfabfile.pyをつくる

# -*- coding: utf-8 -*-
from fabric.api import *
from fabric.decorators import runs_once
from datetime import datetime

env.hosts = ['00.000.000.0']
env.user = 'ec2-user'
env.key_filename = '~/.ssh/deploy_file.pem'
env.project_root = '../'
env.build_path = project_path
env.config_path = project_conf_path
env.branch = 'master'
env.archive = ''
env.server_api_dir = path

@task
@runs_once
def build_play():
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    env.archive = "api-%(timestamp)s.tar.gz" % {"timestamp":timestamp}
    with lcd(env.project_root):
         local("/usr/local/bin/activator clean stage")
         local("tar cvfz %(archive)s target" % {"archive":env.archive})
         put("%(archive)s" % {"archive":env.archive}, "%(dir)s/" % {"dir" : env.server_api_dir})
         local("rm %(archive)s" % {"archive":env.archive})
@task
@runs_once
def unck():
    run("sudo rm -Rf %(dir)s/target" % {"dir" : env.server_api_dir})
    run("tar zxvf %(dir)s/%(archive)s -C %(dir)s" % {"dir" : env.server_api_dir, "archive":env.archive})

@task
@runs_once
def deploy(branch=env.branch):
    execute(build_play)
    execute(unpack)

ここまでは順調

問題発生

fabricは問題なくお登勢てるにもかかわらずfabコマンドが動かない

deployディレクトリに移動してfab deployを叩くも失敗 どうしたもんか。。。 heroku側の設定も問題ないし、何より上のコマンドで先輩はdeployできている。

もうちょい調べる必要がありそうです。

scalaを勉強するにあたって使ったサイトとかをまとめる

基礎的な読み物

dowango新卒エンジニア向けの研修資料
対象/初学者

無料で読めてかつ基本的な概念や文法がよくまとまっているのでオススメです。 各章の最後に練習問題が付いているので理解度のチェックが簡単にできるのと難しい表現を使わないので読むのが億劫になりません。 基本の文法を覚えるなら日本語のドキュメントの中で一番いいかも。 2時間もあれば全部目を通せるのでなんども読み返す事ができていいです。

Scala公式サイト(※英語、一部日本語対応)
対象/javaからscalaに乗り換えの方、ある程度関数言語を知ってる方

本家のドキュメントです。 丁寧にガイドが書かれているのですが、個人的にちょっと読むのがしんどいです。 あと基礎的な言語に関する知識を必要とするので初めのうちのとりあえず動く感覚が欲しい時には向かない印象です。 メソッドや文法なんかは間違いないのでちょくちょく見に来ましょう。

scala school
対象/初心者、英語読むのが億劫でない人

割と実践的な内容を踏まえた包括的なサイトです。 twitterが自社での使い方を踏まえた上でカリキュラムを組んでいるので実践に近い感覚です。 ただほとんど英語なんで翻訳とかしながらやったりするにはちょっとしんどいかなとおもうのですが英語余裕な人はここから入門で十分ですね。

実践

paizaの無料のコンテンツをこなしたくらいです。 シンタックスとかツッコミをくれるのでいいですね。

僕は動かないと理解が深まらないんでguthubを徘徊してscalaのコードを手元で写経して動かすとかをしていました。 まだまだ勉強中なので続けます。

勉強に使った環境

動かしてなんぼだと思うので砂場を用意してサンプルの挙動を確認していました。

Mac OSX 
IDE :intellij idea
playFramework2.5 scala

playFrameworkのscala worksheetと呼ばれる機能があるのでそれを使います。 リアルタイムにコンパイルの結果を返してくれるので非常に学習がはかどりました。

おまけ

Effective scala
twitterがまとめたscalaシンタックスのルールや実践コードでこういう書き方をするといいよ的なものをまとめたものです。

これに沿って書けば概ねルールを踏襲したシンタックスになるので、 お行儀の悪いコードにならなくていいと思います。

今度scala worksheetの使い方とかをまとめます。