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, 実行)方式だったのですが、少しでも楽に環境の再構築がしたい私は、ワンコマンドでセットアップを行なっています(やっていることは同じです)。

セットアッププロセス

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

  • OSのチェック

    • macOSなら続行

    • macOS以外ならexit 1

  • dotfilesのダウンロード:

    • Gitが使える -> git clone

    • Gitが使えない -> curl

  • シンボリックリンクの作成

  • Homebrewのインストール

    -> インストール済みならSKIP

  • Homebrewのアップデート

  • Homebrewの問題をチェック

  • パッケージのインストール

    -> インストール済みならSKIP

  • Vimプラグインのインストール

  • Vimプラグインのアップデート

  • ログインシェルの変更

    -> 既にログインシェルが$(which zsh)ならSKIP

  • シェルのリロード

コード構成

プロセス毎に関数を作り、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

終わりに

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

(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に関する記事もいつか書こうと思っています。

Rustでパスワード生成ツールを作った話

Rustでランダムパスワードを生成するCLIツールを作りました。

command line parserにclap、ランダムな文字列を生成するためにrandを使用。

https://github.com/n2kia4/rpwg

経緯

clapいい感じだし、Rustで何かCLIツール作ってみよう ⇨ 普段からよくお世話になっているHomebrewでインストールしたpwgenをRustで書いてみよう、という雑な感じです。

インストール

cargo installでローカルにインストールすることが出来ます。

$ cargo install rpwg

使い方

使い方は以下の通り。

$ rpwg [FLAGS] [OPTIONS]

rpwgで実行すると、a-z, A-Z, 0-9, 特殊記号の中からランダムで8文字取り出し、パスワードを生成します。 (a-z, A-Z, 0-9, 特殊記号はそれぞれ少なくとも1文字はパスワードに含まれます)

FLAGS

$ rpwg -0

数字を除く。

$ rpwg -A

アルファベットの大文字を除く。

$ rpwg -S

特殊記号を除く。

OPTIONS

$ rpwg -l <LENGTH>

パスワードの長さを指定。

$ rpwg -q <QUANTITY>

生成する数量を指定。

$ rpwg -n <NUMBER_COUNT>

パスワードに含める数字の文字数を指定します。

$ rpwg -u <UPPER_COUNT>

パスワードに含めるアルファベット大文字の文字数を指定します。

$ rpwg -c <LOWER_COUNT>

パスワードに含めるアルファベット小文字の文字数を指定します。

$ rpwg -s <SYMBOL_COUNT>

パスワードに含める特殊記号の文字数を指定します。

終わりに

初めてRustでCLIツールを作ったのですが、無事にv0.1.0としてcrates.ioに公開出来ました。

必要最低限の機能しか実装出来ていないので、ここから改良重ねていきます。

追記

コマンドが増え次第、説明分を随時追加更新致します。

Versionを上げる際はcargo install rpwg -fでよろしいかと(現在v0.3.0が最新版)。

Rustを学び始めた

タイトル通りRustを学び始めました。

ので、とりあえずRustの概要 + インストール + Hello, world! に関する記事でも書くとします。

Rustとは

Mozillaが中心となってオープンソースで開発されている言語。

ある調査において開発者に愛されている言語ランキングで1位を獲得したそうで、fork数(12月18日現在:3721)を見ても愛され言語だなぁと実感しますね。

安全性、速度、並行性にフォーカスし、C++にも匹敵する性能、開発が活発、言語仕様が素晴らしいといった点が特徴ですかね。

Install

公式サイト: The Rust Programming Language

$ curl https://sh.rustup.rs -sSf | sh

Hello, world!

こちらを参考に実装します。(日本語Verはこちら)

$ mkdir hello_world && cd hello_world

main.rsを作成し、コードを書いていきます。

fn main() {
    println!("Hello, world!");
}

次はコンパイルと実行。

$ rustc main.rs
$ ./main

完了ですね。 ですが、Rustにはビルドシステム、パッケージマネージャ、プロジェクト管理を備えたCargoがあります。

Cargoを使ったHello, world!

実行可能アプリケーションを作る際は–binを、ライブラリを作る際は必要ありません。

$ cargo new hello_world --bin && cd hello_world

生成されるファイルはsrc/main.rs, Cargo.toml, .gitignoreの3つ。Cargo.tomlは設定ファイルで、Authorsの値はgit configを基に生成されます。

src/main.rsを覗くと、先ほどのmain.rsと同様のコードが既に用意されています。ではビルドと実行を。

$ cargo build
$ cargo run

完了ですね。ちなみに最適化を掛ける際はbuild, run共に–releaseをつけましょう。

とまぁこんな感じで、

最近はRustしか書いていない。