bufio

入出力をバイト単位や行単位で行いたいときには bufio パッケージの関数が便利。リーダーやライターを作ってから、入出力関数を呼び出す。
バイト単位には、ReadByteWriteByte がいい。

package main

import (
    "os"
    "io"
    "bufio"
)

func main() {
    r := bufio.NewReader(os.Stdin)
    w := bufio.NewWriter(os.Stdout)
    for {
        c, err := r.ReadByte()
        if err == io.EOF { break }
        w.WriteByte(c)
        if c == '\n' { w.Flush() }
    }
    w.Flush()
}

10行目と11行目でリーダーとライターを作って、それを使っている。

^o^ > go build echo1.go

^o^ > echo1.exe < echo1.go
package main

import (
        "os"
        "io"
        "bufio"
)

func main() {
        r := bufio.NewReader(os.Stdin)
        w := bufio.NewWriter(os.Stdout)
        for {
                c, err := r.ReadByte()
                if err == io.EOF { break }
                w.WriteByte(c)
                if c == '\n' { w.Flush() }
        }
        w.Flush()
}

もうひとつ、行単位で処理するには、同じリーダー、ライターの ReadStringWriteString が使える。

package main

import (
    "os"
    "io"
    "bufio"
)

func main() {
    r := bufio.NewReader(os.Stdin)
    w := bufio.NewWriter(os.Stdout)
    for {
        s, err := r.ReadString('\n')
        if err == io.EOF { break }
        w.WriteString(s)
        w.Flush()
    }
}
^o^ > go build echo2.go

^o^ > echo2.exe < echo2.go
package main

import (
        "os"
        "io"
        "bufio"
)

func main() {
        r := bufio.NewReader(os.Stdin)
        w := bufio.NewWriter(os.Stdout)
        for {
                s, err := r.ReadString('\n')
                if err == io.EOF { break }
                w.WriteString(s)
                w.Flush()
        }
}

pyenvとvirtualenvを使ってみる

Python は 2.7.12 を常用しているけど、Python3 系に対応する必要があったので、これを機会にやってみることにした。まあ、今時 Python2 系だけってものなんだと思うので、ちょうどいいといえばそのとおりではある。
で、複数のバージョンを共存させるには pyenv を使うのがいいらしい。virtualenv については、以前エントリを書いたこともあるけど、pyenv と合わせて使うには pyenv のプラグインである pyenv-virtualenv を使うといいらしいので、そうすることにする。

環境

  • Ubuntu 16.04 LTS
  • システムの Python : 2.7.12

インストール

pyenv のインストール。インストールというか github からクローンする。システムにインストールする方法と、ユーザーディレクトリにインストールする方法があるようだけど、今回は後者にした。

takatoh@envelopes $ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

pyenv-virtualenv のインストール

takatoh@envelopes $ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

.bachrcに設定を書き加える

以下を追記

export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

書いたらいったん端末を起動し直す。

Pythonのインストール

特定のバージョンをインストールするには pyenv install コマンド。-l オプションをつけると、インストール可能なバージョンの一覧が見られる。すげーいっぱい出てくるけど、今回は 3.6.3 をインストールしてみた。

takatoh@envelopes $ pyenv install 3.6.3
Downloading Python-3.6.3.tar.xz...
-> https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
Installing Python-3.6.3...
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
Installed Python-3.6.3 to /home/takatoh/.pyenv/versions/3.6.3

おっと、なんか WARNING がでたな。コンパイルするときにライブラリが足りないようだ。

takatoh@envelopes $ sudo apt install libbz2-dev libreadline6-dev

インストールした 3.6.3 をいったんアンインストールしてやり直し。

takatoh@envelopes $ pyenv uninstall 3.6.3
pyenv: remove /home/takatoh/.pyenv/versions/3.6.3? Y
takatoh@envelopes $ pyenv install 3.6.3
Downloading Python-3.6.3.tar.xz...
-> https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
Installing Python-3.6.3...
Installed Python-3.6.3 to /home/takatoh/.pyenv/versions/3.6.3

今度はうまくいった。
インストールしたバージョンは pyenv versions コマンドで見られる。

takatoh@envelopes $ pyenv versions
* system (set by /home/takatoh/.pyenv/version)
  3.6.3

* がついてるのがアクティブなバージョンだ。

バージョンの切り替え

上に書いたように、現状ではシステムにインストールされている Python が使われている。これを切り替えるには、pyenv global または pyenv local コマンドを使う。global は全体に、local はカレントディレクトリに適用される。

takatoh@envelopes $ pyenv local 3.6.3
takatoh@envelopes $ pyenv versions
  system
* 3.6.3 (set by /home/takatoh/.python-version)
takatoh@envelopes $ python -V
Python 3.6.3

つぎの作業に入る前にいったんシステムのバージョンに戻しておく。

virtualenvで新しい環境を作る

pyenv virtualenv [version] <virtualenv-name> とすることで新しい環境を作れる。

takatoh@envelopes $ pyenv virtualenv 3.6.3 brs-3.6.3
Requirement already satisfied: setuptools in /home/takatoh/.pyenv/versions/3.6.3/envs/brs-3.6.3/lib/python3.6/site-packages
Requirement already satisfied: pip in /home/takatoh/.pyenv/versions/3.6.3/envs/brs-3.6.3/lib/python3.6/site-packages
takatoh@envelopes $ pyenv local brs-3.6.3
(brs-3.6.3) takatoh@envelopes $

プロンプトのカッコ内に環境名が表示されている。この環境は保存されていて、以後、このディレクトリに戻ってくるたびに自動的に適用される。

(brs-3.6.3) takatoh@envelopes $ cd ..
takatoh@envelopes $ pyenv versions
* system (set by /home/takatoh/.python-version)
  3.6.3
  3.6.3/envs/brs-3.6.3
  brs-3.6.3
takatoh@envelopes $ cd brs
(brs-3.6.3) takatoh@envelopes $ pyenv versions
  system
  3.6.3
  3.6.3/envs/brs-3.6.3
* brs-3.6.3 (set by /home/takatoh/w/brs/.python-version)
(brs-3.6.3) takatoh@envelopes $

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

通常通り pip コマンドを使う。

(brs-3.6.3) takatoh@envelopes $ pip list --format=columns
Package    Version
---------- -------
pip        9.0.1  
setuptools 28.8.0 
(brs-3.6.3) takatoh@envelopes $ pip install click
Collecting click
  Using cached click-6.7-py2.py3-none-any.whl
Installing collected packages: click
Successfully installed click-6.7
(brs-3.6.3) takatoh@envelopes $ pip list --format=columns
Package    Version
---------- -------
click      6.7    
pip        9.0.1  
setuptools 28.8.0

とりあえずこんなもんかな。