読者です 読者をやめる 読者になる 読者になる

TimeCapsule💊

やったこと,やること,やってみたいこと

dotfilesのセットアップスクリプトを改良した

少し前まではシンボリックリンクの作成しかしてくれないセットアップする気のないsetup.shでした。

しかしそれでは、「OSのクリーンインストール」、「PCの買い替え」などで環境の再構築をしなければならない時、非常に時間が掛かってしまいますし、「前の環境と全然違う。。。」といった状況に陥ってしまいます。

なので、自動化出来そうな所は自動化してみよう!! ということで、セットアップスクリプトの改良に没頭しました。

デモ

f:id:n2kia4:20170319130924g:plain

リポジトリ

github.com

実行方法

よく見かけるワンコマンド方式です。

bash -c "$(curl -LSs https://raw.github.com/n2kia4/dotfiles/master/setup.sh)"

少し前までは、お決まりのスリーコマンド(clone, cd, 実行)方式だったのですが、少しでも楽に環境の再構築がしたい私は、ワンコマンドでセットアップを行なっています(やっていることは同じです)。

セットアッププロセス

セットアッププロセスはこんな感じです。

コード構成

プロセス毎に関数を作り、main関数でまとめています。

#!/bin/bash

check_os() {
    os_name="$(uname)"
    if [ "$os_name" != "Darwin" ]; then
        print_error "Sorry, this script is intended only for macOS"
        exit 1
    fi
}

download_dotfiles() {
    #...
}
#...
main() {
    check_os
    download_dotfiles
    symbolic_links
    install_homebrew
    install_packages
    install_vim_plugins
    update_vim_plugins
    change_login_shell
    reload_shell
}

main

今は1ファイル(setup.sh)で管理している状態なので、最強の dotfiles 駆動開発と GitHub で管理する運用方法 - Qiita こちらの記事を参考に「デプロイ」と「イニシャライズ」を切り分けることで、綺麗にしていこうと思います。

終わりに

だいぶ環境の再構築が楽になりました。今後も改良を続けていこうと思います。

zshのプロンプトにGitステータスを表示

毎度git statusと打つのは非常に面倒です。

なのでGit管理下に居る状態なら、プロンプトにGitステータスを表示させましょう。

どんな感じ?

こんな感じです。GitHub - n2kia4/dotfiles: dotfiles

f:id:n2kia4:20170306233453p:plain

  • Git管理下:
    • 変更なしの場合:[git:ブランチ名 ()]
    • 変更あり、addしていない場合:[git:ブランチ名 (-)]
    • 変更あり、add済みの場合:[git:ブランチ名 (+)]
  • Git管理下ではない:
    • 何も表示されない

コード

.zshrcに以下のコードを。

autoload -Uz add-zsh-hook
autoload -Uz vcs_info

setopt prompt_subst

zstyle ':vcs_info:*' enable git svn
zstyle ":vcs_info:*" check-for-changes true
zstyle ':vcs_info:*' stagedstr "+"
zstyle ':vcs_info:*' unstagedstr "-"
zstyle ':vcs_info:*' formats '[%s:%b (%c%u)]'
zstyle ':vcs_info:*' actionformats '[%s:%b|%a (%c%u)]'

function _vcs_info_msg() {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
}
add-zsh-hook precmd _vcs_info_msg

# 私の場合右プロンプトにGitステータス+日時を表示しています。
RPROMPT="%{$fg[yellow]%}%1(v|%1v|)[%D{%m/%d %H:%M}]%{$reset_color%}"

表示位置や色などはお好みでどうぞ。

終わりに

(), (-), (+)で判別し易いし、とりあえずこれで満足。

zshログイン時にtmuxを自動起動させる

今回はdotfilesのお話です。

ターミナル起動後に毎度tmux aと入力するのが面倒なので自動化しました。

環境

zsh: 5.3.1

tmux: 2.3

コード

参考記事: ターミナルマルチプレクサ tmux をカスタマイズする - Qiita

参考記事のコードをいじり、.zshrcに書きました。

# Tmux
if [ -z "$TMUX" ]; then
    if tmux has-session &>/dev/null && tmux list-sessions | grep -qE '.*]$'; then
        tmux list-sessions | perl -pe 's/(^.*?):/\033[31m$1:\033[m/'
        printf "\x1b[37mTmux: attach? (y/N/num)\x1b[0m "
        read
        if [[ $REPLY =~ ^[Yy]$ || $REPLY == '' ]]; then
            if tmux attach-session; then
                echo "$(tmux -V) attached session"
                return 0
            fi
        elif tmux list-sessions | grep -q "^$REPLY:"; then
            if tmux attach -t "$REPLY"; then
                echo "$(tmux -V) attached session"
                return 0
            fi
        fi
    else
        tmux new-session && echo "$(tmux -V) created new session"
    fi
fi

これでzshログイン時に、デタッチされたセッションがあれば y / enterを入力で最後に居たセッションにアタッチ、数字を入力で指定したセッションにアタッチ。

デタッチされたセッションが無ければセッションを作ることが出来ました。

(Python3)venvのactivateとdeactivateを自動化する

私はpyenv + pyenv-virtualenvを使わず、Homebrewで入れたPython3 + 標準ライブラリのvenvを使っているのですが、activateとdeactivateのコマンドを打つのが面倒臭いので自動化しました。

環境

macOS Sierra 10.12.3

自動化

コード例を置きますので、.zshrc(.bashrc)をいじってください。

chpwd() {
  if [ -d venv ]; then
    source venv/bin/activate
  elif [ "$VIRTUAL_ENV" != "" ]; then
    deactivate
  fi
}

これでcd先にvenv/があればsource venv/bin/activate、venv/がない+仮想環境を有効にしていればdeactivateを自動で行ってくれます。

終わりに

仮想環境を作成する際には、非推奨になったpyvenvではなくpython3 -m venvを使いましょう。

Play framework 2.5でBootstrap

最近はScalaを書いているので、Play framework2.5について書こうと思います。

手始めにBootstrapの導入方法から。

開発環境

Play framework 2.5.10

Bootstrapの導入

build.sbtに依存性を定義します。

libraryDependencies ++= Seq(
  ...
  ...
  "org.webjars" % "bootstrap" % "3.3.7"
)

IntelliJ IDEAをご使用の場合は、Auto importを有効にしておくと自動で依存関係を更新してくれるので非常に便利。

今回の例では3.3.7を使用しますが、WebJarsでの最新版は4.0.0-alpha.5です(2017/1/30)。

main.scala.htmlにて利用する。

<head>
...
...
    <link rel="stylesheet" href="@routes.Assets.versioned("lib/bootstrap/css/bootstrap.css")">
...
...
</head>

終わりに

破壊的な変更が多いからかPlay2.5系の人口は少ないのかな。情報が少ない。。。

lsの色付け + cdしたらls

zshのlsコマンドを便利にしてみました。

参考記事: LS_COLORSを設定しよう - Qiita

lsに色を付けて見やすく

まずMacにはBSD版のlsしか入っていないので、 GNU版のlsを使えるようにします。

Homebrew経由でcoreutils(Unix系のOSで中心的なcat、ls、rmなどのユーティリティ群のパッケージ)をインストールします。

$ brew install coreutils

僕はTerminal, Vimのカラースキームをsolarizedにしているので、今回読み込むカラー設定もdircolors-solarizedにします。

$ git clone https://github.com/seebi/dircolors-solarized.git

.zshrcにてdircolors.ansi-universalを読み込んでみます。

eval $(gdircolors ~/dircolors-solarized/dircolors.ansi-universal)

zshの補完機能にも色を付けて見やすく

こちらも.zshrcに書き込みます。

if [ -n "$LS_COLORS" ]; then
  zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
fi

cdしたらls

cdでディレクトリを移動してから中身を確認するためにlsをすることってかなり多い。

毎度面倒なので、ディレクトリを移動したと同時にgls -AF --color=autoを実行させます。

chpwd() {
  gls -AF --color=auto
}

終わりに

上記に加えてlsをglsに置き換えるエイリアス、cdなしでディレクトリ移動が出来るauto_cdの設定をしておくと便利かと。

これでまた少しTerminalライフが快適になりました。

rpwgのアルゴリズムを改善した話

今年もあと数時間で終わってしまいますね。

そんな中いつも通りRustを書いている僕でして、rpwgのアルゴリズムを良い感じに改善出来たので、2016年最後になるであろう記事を書こうと思います。

改善前

まず改善前のアルゴリズムから書いておきますか。

デフォルト(rpwg)で実行するとa-z, A-Z, 0-9の中からランダムに8文字取り出し、文字列に変えて出力するって仕組みでした。

ですがこれだと色々と問題があって、a-z, A-Zだったり、a-z, 0-9だったり、最悪の場合0-9のみで構成されたパスワードになってしまうんですよね。

それにrpwg -Sで特殊記号を含める-Sオプションを付けても、生成されたパスワードに特殊記号が含まれていないなんてことにも。

それだと安全性の保証がないので改善することにしました。

改善後

次に改善後のアルゴリズムで、こちらもrpwgで実行した場合で話を進めていきます。

①a-zから1文字、A-Zから1文字、0-9から1文字をランダムに取り出しVecに格納。

②a-z, A-Z, 0-9から5文字(指定の長さ:8 - ①での文字数:3)をランダムに取り出し①のVecに格納。

③配列の中身をシャッフルし、文字列に変えて出力する。

これにより少なくとも1文字以上はアルファベット小文字、大文字、数字をパスワードに含めることができました。

rpwg -Sで特殊記号を含める-Sオプションを付けた場合でも、アルファベット小文字、大文字、数字、特殊記号のから最低1文字ずつをパスワードの中に含めることができます。

これがベストプラクティスかどうかは分かりませんが、改善前より確実に安全性を上げることができました。

終わりに

年明けからはまた少しずつrpwgの改善をしながら、いろいろと学んでいこうかなと。

あとClapに関する記事もいつか書こうと思っています。