ナビゲーション

2914/12/31(月)ごあんない

開発で使えるテクニックとかライブラリの情報まとめです。

主に実務でアレコレやった備忘録とかガチャガチャ遊んでみたものを置いてます。
  • あの時ああすりゃ良かった!
  • こういうライブラリないん?
  • ベストプラクティス探してる
  • これ、PHPで書いたらこうなんだけどRubyだとどうなんだっけ?
みたいなのはもうやめたい。
そう思って書いてます。

開発のために色々インストールする事もありますが、特化した情報はテクニカル×マガジンの導入の手引きをご覧ください。
→運用は上記、使い方はこちらで述べます。
 エンジニアとして開発業務に携わるなら、運用のためにコマンドを使うことは良くないと考えるからです。
Sub modules: Gist Repositories for Github-Pages | gist

また、開発以外で必要な環境構築関連はLinux救急箱で扱っています。

ごあんない

ナビゲーション専門性が高い記事を扱います。
テクニカル×マガジンニュース系やどこに置けばいいか分からないものを置いてます
Linux救急箱UbuntuとCentOSがメイン。他にも色々さわるかも
開発日誌ここです
エンジニアのおもちゃばこツール沼ご用達のアイテムがいっぱい!
初心者AWS私が初心者!って言いたいだけのAmazon Web Service奮闘記
タグ探したい項目ごとに選びます
使い方このサイトの使い方です
テーマ言語ごとの話題。コマンド以外にもテーマに合うものは全部ここ
コマンド言語に依存するので、目的別に分けています。
専用コマンドコマンドで更にややこしいもの。linux(ssh)はヤバい
ツール機能別に分けます。Hello worldから運用の話まで
キーワードよく検索されるキーワードです
だいたいの場合、よくあるお困りごとを再検索する事が多いんでまとめておきます。

[pipenv] pip + virtualenvのハイブリッド

2019/01/07 テーマ別::python
pipenvはpipパッケージの一つです。
いわゆるrubyのgemfile(bundle)、JavaやnodejsでいうPackage.jsonにあたります。
用法としてはpip -tで明示的にパッケージのインストール先を指定する方法に似ていますが、プロジェクトをディレクトリで分類するならPipfileでバージョンごとに環境を制御する方法があります。

以下で使い方と、私なりのベストプラクティスを解説します。

pipenvのインストール

pip install pipenv

pipenvでパッケージをインストールする設定をPipfileに書く

pipenv install (package)
これは従来のpip installと同じです。
pip自体のバージョンが古い場合は一旦pip install --upgrade pipとしておきましょう。
pyenvでインストールした場合は再現しませんが、apt install pythonやプリインストールの場合は以下のようなエラーになります。
Traceback (most recent call last):
File "/usr/bin/pip3", line 9, in
from pip import main
ImportError: cannot import name 'main'

回復と対処

方法はいくつかあります。
一番よい方法を選択してください。
get-pip.pyを使う
純粋にpipコマンドを使いたい場合はget-pip.pyを使う必要があります。
pyenvを使う場合はpipコマンド自体を一旦削除しましょう。
pipはpython-pipをremoveすれば消せます。
apt install等で使えるpythonは古いので最新版を使う
python -m pipが使えるならそちらでも良いですが、私が試した感じだと問題はそこではない気がします。
python自体をpipが使えるようにするためには、pythonの公式のインストール方法に従って導入するのが適切です。
[Python] インストール
どうしてもうまくいかない場合
pyenvを使う事をおすすめします。
ただし、技術者がpyenvを使う場合は注意すべき点があります。
参考
pyenvを使うべきか、使わざるべきか

Pipfileに環境情報を追記する

pipenv install (package)
pip installと同じふるまいをしますが、グローバルのpythonのパッケージ環境を汚しません。
暗黙的にpip -tとpathが通されているような状態です。
この時、Pipfileが既に存在していればその内容に追記します。
存在しない場合はwhich pythonのPathが指しているバージョンに基づいてPipfileが作成され、packageが追記されます。

仮想環境とは

乱暴な表現ですが、bashなり子プロセスを一つ生成して、そのプロセス内で完結するようにpip install (package)を実施します。
この仮想環境はdockerコンテナのディレクトリに依存する版だと考えるとイメージがつかみやすいでしょうか。
dockerコンテナでなければVMWareでもWSLでも何でもいいです。

pipenv installで作成したpipパッケージをインストールした環境を削除する

pipenv --rm
作成していない場合は何もしません。

仮想環境に入る

pipenv shell
まるでdocker execでコンテナに入ったような感覚で操作ができます。
dockerを使えない人はbashなりzshなりでプロセスを作ってください。

コンソールに(ディレクトリ名)が追加されています。
この状態が仮想環境に入った状態になります。

実践

pip installで入れたパッケージをimportするだけのpyファイルを作って実施できるか検証します。
仮想環境からpythonを実施するとエラーにならず、exitで抜けた後にpythonを実施するとエラーになっている事が確認できれば、適切な設定がされています。

解説

PipfileはいわゆるGemfileと同じでただのテキストデータです。
それらに心得があればPipfileもただのiniっぽい、あるいはtomlっぽい何かの設定ファイルでしかないので何となく意味は察せると思います。

packageにpipenv installで入れたパッケージが書いてある事が分かればとりあえずは問題ないです。
ただし、pipenv installでpip install相当の振る舞いも行っているため、ただ書けば使えるというものでもない事は忘れないようにしましょう。

注意

pipenv shellで環境を作った時、暗黙的にbashの子プロセスを作ってそこに入った、というイメージを持っておかないと、仮想環境上でpipインストールしたり他のディレクトリに移動してpythonを実行する事も当然出来てしまいます。
その場合、想定した結果とは異なる可能性が考えられるため、基本的にcurrentより上位には行かないように気をつけましょう。

ヒント

pipenvでjupyterを入れてブラウザからアプローチするとイメージがしやすいと思います。
ブラウザから見える世界がpipenvで作った仮想環境です。
pipenvで作ったjupyterの環境はPipfileの環境に依存するため、anaconda等でjupyterを実施した時と違ってモジュールが足りないと怒られる事でしょう。
実際に手を動かしてみるとより理解が深まると思います。

備考

今まで名前空間を汚さないように【 pip 】 pythonのパッケージ管理の-tオプションで管理しましょう、という話をしていたんですが、pipのオプションを使って、あるいはpipに学習コストを費やすぐらいならpipenvを使った方が良い事に気づきました。
これは2018年アドベントカレンダー等でpythonの開発環境構築のベストプラクティスというか、モダンな方法として取り上げられている事にも起因します。*1

*1 : 私がpipにvirtualenvを活用する事に懐疑的だった事もあります。

dockerコンテナに対して一括でコマンドを実行したい

Hyper-VをWSLで使えるようにできればもうちょい話は早いんですが、ここではHyper-Vなどで作った環境にSSHで接続してからの話を想定します。
WSLでDockerコンテナを建ててもいいんですが、色々とアレな感じなので、Hyper-Vで構築した環境を使います。

なお、VagrantとかVMWareとか、環境は何でも良いです。

続きを読む

【ansible】いい感じの環境構築を自動でやってくれるPython製ツール[Chefのようなもの]

2018/12/05 テーマ別::python
全力で逃げていたら猛烈な勢いで追いかけてきたやつ。

Q. なぜAnsibleの入門は分かりにくいのか?

A. ステップアップタイプのチュートリアルがない割に、ベストプラクティスの記事が多いから。
これが私がpythonの環境もchef*1で作るとかいう意味わからんことに乗り出した大きな理由です。

*1 : AnsibleのRuby版、と思ってもらえばここでは大きな誤りはないです。

環境について

WSL Ubuntu 18.04
です。
こっちは色々なしがらみがあって手こずったので、メインはHyper-Vに同様の環境を構築して検証しています。

また、DockerやらVagrantとかVMWareとかBusyboxの機能を使う前提のサイトが多すぎて逆に分からなくなったので、そういった要素を除外しています。

所信表明

だから○○ってなんなのさ?っていうコンセプトで書いてるので、コマンドの意味をメインに解説しています。
やり方が知りたい人はQiitaなりでソースコードを直接コピペしてもらった方が早いかもしれません。
私はそれでAnsible挫折したのでオススメしませんが…

インストール

【 pip 】 pythonのパッケージ管理までは実施済みとします。
pip install ansible
これだけです。

[netaddr] IPアドレスの比較・判定を軽々実現できる魔法のパッケージ

IPアドレスを突き合せたりするお話がやってきたのでそれら用に。
確かに便利だった。
# pip show netaddr:  https://netaddr.readthedocs.io/en/latest/index.html
from netaddr import valid_ipv4, IPNetwork

ip = '192.168.1.1'
print(valid_ipv4(ip))

result = IPNetwork(ip)
print(ip.is_private())
# True
こんなんで値取れるなんてマジか~!
参考:Bad request.

IP CIDRとは

(今さら)CIDRアドレス計算ツール by yamagata21

とりあえず触ってみてからですね。
この辺が分かってないと使えないです。

比較用

オレオレですけど、こんなものを作ってみました。
# netaddr.IPNetwork.is_private() == True
ipv4 = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']
ipv6 = ['fc00::/7', 'fe80::/10']
is_privateが一番分かりやすかったから使ったんですが、なるほど確かに期待値通り。
むしろこのtomlの方が抜けているファイルがあると思うぐらいには。

[(access failed) https://code.i-harness.com/ja/q/34d680]
この辺を掘り下げると色々あるっぽいですね。
公式のリファレンスに勝るものなし、だと思いますが…。

[homebrew] インストール

linuxでもmacOSのインストールコマンドを使いたい人を想定しています。
Windowsでbrew使えるんかな…?
WSLでは使えるのは確認しています。

linuxbrewというユーザーを作って.linuxbrew以下に環境を作っているようです。

インストール

公式の手順を最適化してます。
apt install build-essential curl file git
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"

test -d ~/.linuxbrew && PATH="$HOME/.linuxbrew/bin:$HOME/.linuxbrew/sbin:$PATH"
test -d /home/linuxbrew/.linuxbrew && PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH"
test -r ~/.bash_profile && echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.bash_profile
echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.profile
. ~/.profile

brew update
Linuxbrew | The Homebrew package manager for Linux

注意

HomebrewがRubyを使っているので、shの内容をそのまま使うと既存部分に影響があるかも知れません。
rbenvを使っているなら大丈夫です。

ここまではいいけど、brewを使ったインストールをする時にめっちゃくちゃハマった…
解決までの経緯をまとめておきます。
OK キャンセル 確認 その他