Monthly Archives: 6月 2014

[Python] 二つのタイムスタンプの差分を計算するには

Pocket

datetimeを使うのが教科書的な回答になるわけだが、ただタイムスタンプってえのは大抵2014/06/20 23:03:58.455118というような書式になっていて、これをどう扱うかがキモ。

そうそう、二つのタイムスタンプの差、というと何かのターンアラウンドタイムとか、もっというと先方からの応答を測るためですね。
諸賢には自明のことであろー。

結論: datetime.strptime()を使う。

datetime.strptimeは与えられたフォーマットにしたがって時刻を構文解析し、datetime型に変換してくれる。
さらにdatetime型どうしで減算すると、timedelta型のオブジェクトが返る。
timedeltaオブジェクトから読み出し専用のインスタンスで日、秒、マイクロセコンドを取り出せばよい(なお時間(Hour)はない)。

 

スクリプト例

お目汚しではありますが例を示す。
Python2.7な。

from datetime import datetime

FMT = '%Y/%m/%d %H:%M:%S.%f'

timestampA = "2014/06/20 23:03:58.455118"
timestampB = "2014/06/30 02:55:23.196501"

tdelta = datetime.strptime(timestampB, FMT) - datetime.strptime(timestampA, FMT) 

print "time difference is %i day(s) %i.%i sec." % (tdelta.days, tdelta.seconds, tdelta.microseconds)

 

実行結果

上記のスクリプトを実行すると以下のように。

time difference is 9 day(s) 13884.741383 sec.

以上。

[FreeBSD] あるマシンのpkgをごっそり他のマシンに持っていくには

Pocket

インターネットに接続されていないなどの理由で、公式のpkgレポジトリからpkgをダウンロードできないマシンのpkgをどのように世話するか。

インターネットに接続できるマシンでpkgをインストールしておき、そのマシンからpkgを取得する。

手順

・ターゲットとなるマシン(以下、ターゲット)と同じ構成でVM(以下、コピーマシン)を作る。
・コピーマシンに必要なpkgをインストールする。
・コピーマシン上のどこかでインストール済みpkgを作る。
・同じ場所にrepoカタログを作成する。
・ターゲットと同じLANに繋ぎかえる。
・pkgのあるディレクトリをwebサーバで公開し、pkgをインストールする。

以下、詳細手順

ターゲットと同じ構成でVMを作る

RELEASEバージョンを合わせておけばよいでしょう。
割愛。

コピーマシンに必要なpkgをインストールする

タイトルの通り。
なにもわざわざインストールしなくても、という意見もあるだろうが、動作確認も必要だし。
割愛。

pkgを作る

適当な場所にディレクトリを掘り、以下のコマンドを叩く。

pkg create -a -f tgz -o ./ -n

-aは、インストール済みのすべてのpkgを指定、という意味。all。
-fは、圧縮フォーマットの指定。右から左へ移すだけだからtgzでよい。tbzだと時間がかかる。
-o ./は、作成したpkgを置く場所。
-nは、作成済みのpkgを作らない、という意味。付けると処理のスピードアップが望めるが、逆に更新のあったpkgを作り忘れる、という危険性もあるかも。
以下の例では-nを使っていない。

$ cd /usr/home/vanilla/pkgrepo/
$ sudo pkg create -f tgz -o ./ -a
Loading the package list...
Creating package for GentiumBasic-110_1
Creating package for ImageMagick-6.8.9.3,1
Creating package for ORBit2-2.14.19_1
(略)

repoカタログを作成する

pkg repoにディレクトリを指定すればよい。

$ cd /usr/home/vanilla/pkgrepo/
$ sudo pkg repo /usr/home/vanilla/pkgrepo/
Generating repository catalog in /usr/home/vanilla/pkgrepo/: done!
$

そうすると以下の二つのファイルができる。

digests.txz     packagesite.txz

つまり今回の例でいえば、/usr/home/vanilla/pkgrepo/に作成したpkgと二つのファイルが格納されているわけ。

以上でコピーマシンでの作業は完了。

ターゲットでの準備

ターゲットにpkg一式をコピーし、webサーバを立ち上げる。
そのまえに、ターゲットでレポジトリの設定ファイルを修正しておくこと。
具体的には、①公式のpkgレポジトリを無効にし、②自前のpkgレポジトリの設定を加えることである。

①公式pkgレポジトリの無効化

/etc/pkg/pkg/FreeBSD.confでenabledをnoにする。

# $FreeBSD: release/10.0.0/etc/pkg/FreeBSD.conf 258710 2013-11-28 14:24:26Z gjb
$
FreeBSD: {
  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
  mirror_type: "srv",
  signature_type: "fingerprints",
  fingerprints: "/usr/share/keys/pkg",
  enabled: no
}

②自前レポジトリの設定
/usr/local/etc/pkg/repos/localpkg.confとして以下のようなファイルを作る。
urlは、後ほど設定するwebサーバと合わせる事。

localpkg: {
  url: "http://localhost:8000/",
  mirror_type: "http",
  enabled: yes
}

pkg -vvとしてみる。
repo FreeBSDのenabledがno, repo localpkgのenabledがyesになっていることを確認。

Repositories:
  FreeBSD: {
    url             : "pkg+http://pkg.FreeBSD.org/freebsd:10:x86:32/latest",
    enabled         : no,
    mirror_type     : "SRV",
    signature_type  : "FINGERPRINTS",
    fingerprints    : "/usr/share/keys/pkg"
  }
  localpkg: {
    url             : "http://localhost:8000/",
    enabled         : yes,
    mirror_type     : "HTTP"
  }

 

webサーバでpkgを公開、インストールする。

rsyncでもなんでも使って、ターゲットにpkg一式をコピーする。
/home/vanilla/10.0/pkgにコピーしたとして、webサーバでこのディレクトリを公開すればよい。
ここでは手早くpythonで公開する。
以下のようにするとカレントディレクトリをルートとするwebサーバが立ちあがる。ポートは8000である。

$ cd /home/vanilla/10.0/pkg
$ python -m SimpleHTTPServer

同じくターゲットでpkg udpate。
pkg repoで作成したdigests.txz, packagesite.txzを参照できていることを確認したら、pkg upgradeすればよい。

$ sudo pkg update
Updating repository catalogue
digests.txz                         100%   29KB  29.3KB/s  29.3KB/s   00:00    
packagesite.txz                     100%  136KB 135.9KB/s 135.9KB/s   00:00    
Incremental update completed, 613 packages processed:
0 packages updated, 0 removed and 613 added.

以上です。

[メモ][Windows] コマンドラインでIPアドレスを変更する

Pocket

Windowsを複数ネットワークに繋ぎかえるとき、しかも片方がDHCPでの自動割り振りで、もう片方が固定でIPアドレスを指定しないいけない場合。
いちいちネットワークインターフェースのプロパティからIPアドレスを変更するのは大変に面倒な作業である。

調べてみたらコマンドラインでも変更はできるとか。

netshコマンドでTCP/IPのパラメータを設定する

ならばバッチファイルで手軽に変えられる。
その経緯を示す。
対象OSはWindows 7。xpだと動かないかも。

結論

バッチファイル例を示す。
拡張子.batの適当な名前で保存し、必要なときに実行すればよい。

固定IPアドレスを設定するとき

IPアドレスを固定で指定したい場合。
インターフェース名: “ローカル エリア接続”
IPアドレス: 192.168.0.100
ネットマスク: 255.255.255.0
デフォルトゲートウェイ: 192.168.0.1
DNS: 192.168.0.1

@echo off
netsh interface ip set address "ローカル エリア接続" static 192.168.0.100 255.255.255.0 192.168.0.1
netsh interface ip set dns "ローカル エリア接続" static 172.16.1.11 primary
ipconfig
pause

 

DHCPで設定するとき。

インターフェース名: “ローカル エリア接続”

@echo off
netsh interface ip set address "ローカル エリア接続" dhcp
netsh interface ip set dns "ローカル エリア接続" dhcp
ipconfig
pause

 

書式

netsh interface ip setで設定する。
オプションは以下の通り、netsh interface ip setだけで実行すればずらずらと表示される。

C:¥>netsh interface ip set

使用できるコマンドは次のとおりです:

このコンテキストのコマンド:
set address    - インターフェイスに IP アドレスまたはデフォルト ゲートウェイを設
定します。
set compartment - コンパートメント構成パラメーターを変更します。
set dnsservers - DNS サーバーのモードおよびアドレスを設定します。
set dynamicportrange - 動的ポート割り当てに使用するポートの範囲を変更します。
set global     - グローバル構成一般パラメーターを変更します。
set interface  - IP のインターフェイス構成パラメーターを変更します。
set neighbors  - 近隣アドレスを設定します。
set route      - ルートのパラメーターを変更します。
set subinterface - サブインターフェイス構成パラメーターを変更します。
set winsservers - WINS サーバーのモードおよびアドレスを設定します。

このうち、よく使うのはaddress, dnsserverだろう。
なおdnsserverはdnsでも大丈夫のようだ。

address設定方法については;

使用法: set address [name=]<文字列>
              [[source=]dhcp|static]
              [[address=][/<整数>] [[mask=]]
              [[gateway=]|none [gwmetric=]<整数>]
              [[type=]unicast|anycast]
              [[subinterface=]<文字列>]
              [[store=]active|persistent]

パラメーター:

       タグ           値
       name         - インターフェイス名またはインデックスです。
       source       - 次のいずれかの値を指定します:
                      dhcp: 指定したインターフェイスの IP アドレスの構成で
                            DHCP を使用できるようにします。
                      static: 指定したインターフェイスの IP アドレスの構成で
                            DHCP を使用できないようにします。アドレスまたは
                            ゲートウェイが構成されている場合、この値を指定
                            する必要があります。
       address      - 追加または変更する IPv4 アドレスです。
                      サブネット プレフィックス長を後に指定することもできます。
       mask         - 指定した IP アドレスの IP サブネット マスクです。
       gateway      - 次のいずれかの値を指定します:
                      : 設定している静的 IP アドレスに対する特定
                                       のデフォルト ゲートウェイです。
                      none: デフォルト ゲートウェイは設定されません。
                            これは既定値です。

以上

[メモ]WindowsにVagrantを入れてみた

Pocket

タイトルの通り。
たかがインストールして使える状態にするまでだけで苦労したからだよ!
インストールした後はVagrantの使い方はこのあたり見たらいいわけですよ。

Vagrant超入門:Vagrant初心者向けの解説だよ!
https://github.com/tmknom/study-vagrant

インストール

手順はここ http://docs.vagrantup.com/v2/getting-started/index.html 参照。
http://www.vagrantup.com/ からインストーラをダウンロードしてとっととインストール
2014/6/7現在、ヴァージョンは1.6.3。

初期設定

コマンドプロンプトを起動してinit。

C:\Users\nobwak>vagrant init hashicorp/precise32
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

C:\Users\nobwak>

そして起動…だが。

C:\Users\nobwak>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hashicorp/precise32' could not be found. Attempting to find an
d install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'hashicorp/precise32'
    default: URL: https://vagrantcloud.com/hashicorp/precise32
==> default: Adding box 'hashicorp/precise32' (v1.0.0) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/hashicorp/precise32/version/1
/provider/virtualbox.box
    default: Progress: 39% (Rate: 4070k/s, Estimated time remaining: 0:01:01)
The executable 'bsdtar' Vagrant is trying to run was not
found in the %PATH% variable. This is an error. Please verify
this software is installed and on the path.

bsdtarがpathに入ってないとか文句を言うわけですよ。

解決法..再インストール

なんと解決法は再インストールだそうです。
嘘だろと思ったら本当に解決した。

C:\Users\nobwak>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hashicorp/precise32' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'hashicorp/precise32'
    default: URL: https://vagrantcloud.com/hashicorp/precise32
==> default: Adding box 'hashicorp/precise32' (v1.0.0) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/hashicorp/precise32/version/1
/provider/virtualbox.box
    default: Progress: 100% (Rate: 3345k/s, Estimated time remaining: --:--:--)
==> default: Successfully added box 'hashicorp/precise32' (v1.0.0) for 'virtualbox'!
==> default: Importing base box 'hashicorp/precise32'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise32' is up to date...
==> default: Setting the name of the VM: nobwak_default_1402067362695_84951
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 4.2.0
    default: VirtualBox Version: 4.3
==> default: Mounting shared folders...
    default: /vagrant => C:/Users/nobwak

C:\Users\nobwak>

このとき、Virtualboxに勝手に登録される。
vagrantvbox01

さっそく繋いでみよう。

ssh接続…ダメ。

vagrant sshで動かしたマシンにログインできるはずだが。

C:\Users\nobwak>vagrant ssh
`ssh` executable not found in any directories in the %PATH% variable. Is an
SSH client installed? Try installing Cygwin, MinGW or Git, all of which
contain an SSH client. Or use your favorite SSH client with the following
authentication information shown below:

Host: 127.0.0.1
Port: 2222
Username: vagrant
Private key: C:/Users/nobwak/.vagrant.d/insecure_private_key

C:\Users\nobwak>

sshがないからダメ。
だから適当なsshクライアントで繋ぐ。
上記のメッセージの通り、IPアドレスは127.0.0.1, ポートは2222。

login as: vagrant
vagrant@127.0.0.1's password:
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686)

 * Documentation:  https://help.ubuntu.com/
Welcome to your Vagrant-built virtual machine.
Last login: Fri Sep 14 06:22:31 2012 from 10.0.2.2
vagrant@precise32:~$

繋げましたな。
あとは消して終了。

C:\Users\nobwak>vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...

C:\Users\nobwak>

 

[メモ] MacにhomebrewでPythonをインストール(virtualenvまで)

Pocket

brewでpythonをインストールする
10.9.3にはPython 2.7.5が入っている。
brewでこれを新しいものに。
またvirtualenvも入れてしまう。

$ python --version
Python 2.7.5

brewでインストール

$ brew install python --framework --universal
==> Installing dependencies for python: pkg-config, readline, sqlite, gdb
==> Installing python dependency: pkg-config
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/pkg-config-
(略)
See: https://github.com/Homebrew/homebrew/wiki/Homebrew-and-Python

.app bundles were installed.
Run `brew linkapps` to symlink these to /Applications.
==> /usr/local/Cellar/python/2.7.6_1/bin/python -s setup.py --no-user-cfg instal
==> /usr/local/Cellar/python/2.7.6_1/bin/python -s setup.py --no-user-cfg instal
==> Summary
/usr/local/Cellar/python/2.7.6_1: 5945 files, 101M, built in 3.5 minutes
$

すっ飛ばした途中にいろいろと重要なことが表示されている。
すなわち、Pythonのインストールに必要なソフトウェアはOS Xにもあるけど、いろいろと問題もあるから新しいの入れとくわなどなど。
また、pipとsetuptoolsもインストールされている。

Setuptools and Pip have been installed. To update them
  pip install --upgrade setuptools
  pip install --upgrade pip

いずれにせよpythonのインストールはできた。
ターミナルで調べてみると2.7.6に変化していますね。

$ python --version
Python 2.7.6
$ which python
/usr/local/bin/python
$

そのままvirtualenvなどのツールをインストール。

virtualenvのインストール

pipでインストールするだけ。

$ pip install virtualenv
(略)
Successfully installed virtualenv
Cleaning up...
$ pip install virtualenvwrapper
(略)
Successfully installed virtualenvwrapper virtualenv-clone stevedore
Cleaning up...