pipenv 環境でのコマンドを直接実行する

これ自体は pipenv shell の引数として実行したいコマンドを指定すれば良いだけです。本ブログでは tinkerer を使っているので、 tinker コマンドを実行するには、

$ pipenv install Tinkerer
$ pipenv shell "tinker -p 'blog title'"

とすれば、 ブログの投稿用ファイルを生成 できます。

ただし、これには一つ問題がありpipenv shell の環境に入ったままになってしまうことです。 例えば、シェルスクリプトやMakefileで実行する場合、pipenv shell 環境に入ったままになるので、スクリプト実行時のシェル環境を想定していると期待通りの結果にならない可能性もあります。

で、これを解決するには単純に下記のようにすれば、コマンド実行後にpipenv shell 環境を抜けます。

pipenv shell "tinker -p 'blog title'; exit"

余談。久々にブログ書いたついでにタイトルも変更してみました。

2017年の振り返りと2018年の抱負

あけましておめでとうございます。今年もよろしくお願いします。

この年末年始は短かった 1 ので、振り返りと抱負をまとめることにしました。

昨年の振り返り

昨年のTry の状況は、下記の通りです。

  • 8時間睡眠および朝型生活の維持

    • 継続中。

  • 残業しない

    • 継続中。

    • 朝リモートワークしてから子どもたちを幼稚園バスの見送り後に出社したり、終日リモートワークして途中で所要で離席する場合は、適当に時間調整するとかあったので、7-16時ピッタリで働く、ということの方が少ないです。

    • 一点問題も。昨年の後半の体制変更でチームメンバーや、さらに他チームのタスクのレビュー(コードレビュー)の時間が増えてしまい、自分のタスクのスケジュール調整に失敗してしまったことです。先月はリリースを間に合わせるために、結局かなり超過して残業してしまいました。大失敗。

  • 英語の学習再開、継続

    • これは完全に失敗。使う機会ないと時間を割くモチベーションが出ないというのがどうもダメですね。

  • プライベートでのコーディングの時間確保のやり方を変える

    • これはやり方を変えることで時間を確保できるようになりました。

    • 前述の本業での体制変更により、プライベートだけでなく仕事も含めて全体的にコードを書く時間が減ってしまいました。

    • そんなときに前職の同僚 2 から空き時間でDjangoのコードを書くアルバイトをしないかという話があり、副業を始めました。

    • 月末に翌月に確保できそうな空き時間を予定として書き出して、実際に行った場合は実績として入力していく、という感じです。

    • 5-10分程度の短時間の場合も実績としては入力してみると、意外と時間は確保できるのだなと思いました。

  • Debian JP Projectのサーバー移行の残作業

    • これは結局ほとんどできなかったのですが、2017年度の理事会の監事に安井さんが就任されてから、Admin作業も安井さんが中心となって行われているようです。

今年の抱負

  • 8時間睡眠、朝型生活、残業なしの継続

    • とくに残業なしは、レビュー中心となるチームのタスクと、自分のタスクの進め方に気をつけなければ、というところで具体的な解決策はまだありません。

    • とりあえず、自分のタスクの時間を毎日(営業日)確保してみようかと。

  • トレーニングを継続し、体重を60kgにする

    • 11月末の定期健康診断で、当日の体重が68.5kg、その1,2週前には一時期70kgにもなってしまっていました。

    • それだけでなく、7,8年前からエコー検査で指摘されている脂肪肝が、エコーだけでなく、血液検査でもA判定ではなくなってしまいました。

    • 健康診断の当日に食事制限と適度な運動を行うように指導されてから、割と真面目に守って継続しています。

    • 年明け後の体重はようやく64Kg台で安定するようになってきたので、このまま60kgを目指そうと思います。 3

  • その他もろもろ

    • 書こうと思ったけど、子供のことや、その他ちょっと書きにくいことなので省略。

ということで無理せずできる範囲で、健康改善を第一にやっていこうと思います。健康なら他のことはなんとかなりますね。

Footnote

1

会社の最終営業日の翌朝の12/29に、自宅でVPN接続して移行作業 4 を行い一人仕事納めとし、大晦日までの3日間で大掃除と年賀状の作成でした。三が日は3日ともほぼ出ずっぱりでした。元日は妻の要望で初のお正月ディズニーランドに行き、2日は妻の実家に集まり新年の挨拶、3日は私の実家に新年の挨拶に行き、4,5日は在宅勤務ですが普通に仕事でした。年末年始は2〜3週間くらい休みたい。

2

年明けの営業日から適用したものの、結局諸事情でフォールバックすることになってしまいました。

3

その同僚も、私が転職した同じくらいの時期に、前職の会社を退職・起業しています。

4

28歳ごろまでは、どんなに食べても55kgから変わらなかったのですけどね。

再びpython-debianのお話

この記事は Debian/Ubuntu Advent Calendar 2017 12月14日の記事です。

昨日で投稿が止まってしまいそうだったので急遽書いてみました。

python-debianとは

python-debiandebian/control.changes などのフォーマットを扱うのに便利ならライブラリです。Debianパッケージとして提供されているので、 sudo apt install python-debian としてインストールすることができます。

使い方

オンラインマニュアルは無いのですが、Debian Sourcesのpython-debianのページ から任意のバージョンの README, README.deb822 や、 examples 以下のサンブルコードを参考にすることはできます。

でも結局Debianパッケージをインストールしないと使えないので、 /usr/share/doc/python-debian 以下を参照すれば良いだけですが。

なぜ「再び」かというと

I made debsign of Python libary that can be run without a TTY でもpython-debianのネタを書いていました。JenkinsでDebianパッケージのカスタムビルドパッケージをビルドして、GPGサインしてローカルアーカイブにアップロードするために:code:debsign コマンドの代わりに python-debianを使ったPythonパッケージを作った ときのネタでした。

changesファイルを読み取り、GPGで署名後のハッシュで上書きする

やっていることは上記の記事に書いてあるのですが、実際の処理は書いていなかったので抜き出してみると、下記のような感じです。

import deb822

with open('path/to/changes_file', 'rb') as fileobj:
    changes = deb822.Changes(fileobj)

return [changes['Files'],
        changes['Checksums-Sha1'],
        changes['Checksums-Sha256']]

ビルドしたdebianパッケージの .changes ファイルのmd5, sha1, sha256のチェックサムを読み取って、 .changes ファイルのエントリを書き換え、署名するのですが、python-debian パッケージに含まれる、 deb822.Changes クラスでバイナリモードで読み取った .changes を読み込むだけで、上記のように簡単に対象のエントリにアクセスできる便利なやつです。

python-debianに含まれるモジュール

deb822以外にも

  • arfile

  • changelog

  • copyright

  • debfile

  • debian_support

  • debtags

などが含まれるのでpython-debianパッケージをインスールしていれば、 pydoc コマンドでdocstringのドキュメントを読むことができます。実際に使うときはそちらを参照するのが良いでしょう。

まとめ

  • python-debianという便利なDebianパッケージがあるよ

  • 以前作ったPythonパッケージでは、 deb822.Changes だけでアクセスできて便利だったよ

  • ドキュメントはpython-debianパッケージ自体に含まれているよ

というお話でした。

VirtualBoxをPowerShellで操作する

これは Debian/Ubuntu Advent Calendar 2017 12月9日の記事です。 前回( ThinkPad T470sに乗り換え )、この内容を書くといいつつ放置していたのと、今日のアドベントカレンダーがまだ空いていたので書いてみました。

DebianそのものはVirtualBoxで動かしているだけのゆるい記事です。

私は開発環境にはプライベートも職場もSidにしているのですが、VirtualBoxを使っていると、systemdやgrub、XOrg周りのバグで起動しなくなった場合にも、スナップショットから簡単に戻せます。

macOSでの起動とスナップショット取得

私物のラップトップをThinkPadに切り替える前はMacBookProを使っており、職場はMacBookProを使っています。Vagrantは使わない派なので、シェルスクリプトを作成しこれらをターミナルから実行して起動やスナップショットを取得しています。

起動用スクリプト

#!/bin/sh -e
vmname='vmname'
VBoxManage showvminfo $vmname | grep State: | grep -q 'powered off' || ( echo "VM: $vmname is not powered off." ; exit 1 )
VBoxManage startvm $vmname --type gui

すでに起動していたら同じイメージからもう一台VMを起動しないようにしています。 VirtualBoxでCPUやメモリリソースの半分以上を割り当てて、フルスクリーンで使っているので、 --type gui で起動します。

スナップショット取得用スクリプト

#!/bin/sh -e
vmname='VMname'
VBoxManage showvminfo $vmname | grep State: | grep -q 'powered off' || ( echo "VM: $vmname is not powered off." ; exit 1 )
VBoxManage snapshot $vmname take $(date +%Y%m%d-%H%M)
if [ $(VBoxManage snapshot $vmname list | wc -l) -lt 4 ]; then
  exit 0
fi
VBoxManage snapshot $vmname delete $(VBoxManage snapshot $vmname list | head -1 | awk '{print $2}')

VirtualBoxでのスナップショット取得自体は、VMが起動していても可能ですが、取得までにえらい時間がかかるので、これも起動中は実行しないようにしています。 スナップショット名は、 YYYYmmdd-HHMM のフォーマットの日時とし、最大三回取得するようにしています。 4つめ以上は、一番古いスナップショットを削除します。

Windows10での起動・スナップショット取得方法

Windows10でもVagrantは使わず、PowerShellで行っています。 PowerShellのコマンドプロンプトからではなく、デスクトップ上にPowerShell実行用のショートカットを作成し、それをダブルクリックして実行してしていうことです。

起動用スクリプト

$vmname = "vmname"

function Show-VM-Info {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" showvminfo $vmname
}

function VM-Powered-off? {
    Show-VM-Info | Select-String State: | Select-String -quiet 'powered off'
}

function Start-VM {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm $vmname --type gui
}

function List-VM {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms
}

function VM-Exist? {
    return (List-VM | Select-String -quiet $vmname)
}

if (-Not (VM-Exist?)) {
    echo "[error] '$vmname' is not exists."
    exit 1
}

if (VM-Powered-off?) {
    Start-VM
} else {
    echo "VM: '$vmname' has been powered on."
    exit 1
}

シェルスクリプト版に比べるとえらい長ったらしいですね。やっていることはシェルスクリプト版と同じです。

スナップショット取得用スクリプト

$vmname = "vmname"

function Show-VM-Info {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" showvminfo $vmname
}

function VM-Powered-off? {
    Show-VM-Info | Select-String State: | Select-String -quiet 'powered off'
}

function List-VM {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms
}

function VM-Not-Exist? {
    return (List-VM | Select-String -quiet $vmname)
}

function Get-Timestamp {
    return (Get-Date -UFormat %Y%m%d-%H%M)
}

function Take-Snapshot {
    $timestamp = Get-Timestamp
    Start-Process "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" -ArgumentList "snapshot $vmname take $timestamp" -NoNewWindow -Wait
}

function List-Snapshot {
    & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" snapshot $vmname list
}

function Get-Oldest-Snapshot {
    return (-Split (List-Snapshot)[0])[1]
}

function Delete-Oldest-Snapshot {
    $oldest_name = Get-Oldest-Snapshot
    Start-Process "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" -ArgumentList "snapshot $vmname delete $oldest_name" -NoNewWindow -Wait
}

if (-Not (VM-Not-Exist?)) {
    echo "[error] '$vmname' is not exists."
    exit 1
}

if (VM-Powered-off?) {
    Take-Snapshot
    echo "[done] take snapshot."
    if ((List-Snapshot | Measure-Object).Count -lt 4) {
        exit 0
    }
    Delete-Oldest-Snapshot
    echo "[done] delete oldest snapshot."
    exit 0
} else {
    echo "VM: '$vmname' has been powered on."
    exit 1
}

スナップショット取得用は更に長くなってますが、これもシェルスクリプト版とやっていることは同じです。

実行用のショートカット

PowerShellの拡張子は ps1 なので startvm.ps1, snapshot.ps1という名前で作成していますが、これを作成してもダブルクリックすると、メモ帳で開くだけです。なんて面倒なことでしょうね。

ということで、デスクトップにこれらのショートカットをまず作成します。

次にショートカットのプロパティを開き、リンク先をそれぞれ次のように書き換えます。 -File で指定したパスが、実際のPowerShellのスクリプトファイルのパスです。

起動用スクリプトのショートカット

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File C:\Users\someuser\OneDrive\ドキュメント\startvm.ps1

スナップショット取得用スクリプトのショートカット

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File C:\Users\mkouh\OneDrive\ドキュメント\snapshot.ps1

これでデスクトップ上のショートカットをダブルクリックするだけで起動とスナップショットを取得できます。

まとめ

シェルスクリプトやPowerShellでVirtualBoxの起動やスナップショット取得はできますよ、というゆるいネタでした。

“unstable”という言葉のイメージだけでSidを使うのをためらっている人や、職場で利用するPCに自由にDebianをインストールできないにもVirtualBox等を使うことで自分の使いやすい環境を手に入れることができるので、今更なネタではありますが、まだの方は試してみると良いのではないでしょうか。

ThinkPad T470sに乗り換え

長らく愛用していた、MacBookPro 8,2 15”(2011年モデル)のビデオカードの故障で起動できなくなってしまったので、ThinkPad T470sに乗り換えました。

試行錯誤

利用していたら突然、ディスプレイがピンクがかって、横線のノイズが入って、OS Xが落ちるようになってしまったので、とりあえず自分で試せる方法を試してみました。 SMCのリセット、NVRAMのリセットも効かず。DVDやネットワーク経由でのOS Xの再インストールも起動せず。唯一実行可能なApple Hadware Testを実行しても異常なしで、どうにもならならず。という状況でしたので、Appleサポートに申し込んだらすぐ折り返しで電話がかかってきて試したことをすべて伝えた上で、念の為サポートから提案された方法も試した方法も結局ダメだったので、症状からすると、ビデオカードの故障でしょう、という結論に。サポートも終了してしまったモデルなので、有料でも修理対応はできない、ということで、修理を行っている業者を探してみてください、ということに。

ネットで検索して、いくつか聞いてみたところ、修理は可能でも見積もり金額が約8万円超えるので、これはちょっと割に合わないなぁということで、修理自体は断念しました。

ThinkPad T470sを購入

自分の小遣いで買い替えとなるとキツイので、家の予算から捻出できるようにするため、Microtsoft Officeのライセンスも購入し、妻との共用にするという条件でThinkPad T470sを購入しました。

おまめ一号が産まれる前から諸々の理由で専業主婦になった妻が、社会人復帰するのに、Officeを使いたいと言っていて、それだけのためにWindows PCを購入するのはもったいないなと思っていたので、それに乗っかりました。

久々のWindows PCを購入するにあたり、まぁもうThinkPad以外はないなぁと思っていたので、メモリ24GB、SSD 500GB、英語キーボードに変更し、ハードウェア保証を3年に延長し、Officeのライセンスをつけて18万5千円弱だったので、MacBook Proに比べるとかなりお得な感じでした。

VirtulBoxでSidを使うだけではあるものの

前述の通り妻との共用なのでWindowsを消せないので、今回もVirtualBoxでSidを使うようにしました。 といはいえ、Webブラウザ程度は使うので、いくつか設定を変更しています。

まずは英語キーボードですが、Windowsは日本語モードにしているので、キーマップが微妙に異なるため、キーボードのデバイスドライバを標準 PS 101/102キーボードに変更し、ハードウェアキーボードレイアウトも101/102キーに変更、IMEの切り替えはshift+spaceで切り替えられるようにしています。

もう一つは、VirtualBoxの起動、スナップショットを取得するために、シェルスクリプトを使っていましたが、これをPowerShellに書き換えました。これはまた後日。