かーくがかーくよ

色々書くよ プログラミングとか漫画とかゲームとかが主

去年も考えていたことを今年も考え続けますという話

あけましておめでとうございます。かーくです。

去年がどういう年だったかというと、なんか色々やったようでいて、結局ずっと右往左往していたなあって感じの年でした。
一昨年(2018年ですね)の12月に今の会社に入社して、それから一年と一ヶ月経ったわけですけど、まあ馴染めたことは馴染めたしそれなりに自分なりのポジションみたいなものは確立できたんかなあと思っていて、それはそれなりに成果と言えなくもないんですが、それ以上のものってなんかある? って聞かれると、うーんみたいな。

新しく始めたこととしてはスクラムマスターになったんですけど(やりたいですって言い続けてたら入社して一年経たないうちにやらせてもらえることになったんでそれはほんとスゲーってなった)、スクラムマスターってめちゃめちゃ難しいというか、難しいっていうのもちょっと違うんですけど、ずっと「これでいいのか?」って悩み続けてて、楽しいっちゃ楽しいんですけど結構苦しい。去年の10月からこっちはずっとそれでしんどいなあしんどいなあってなっていたしこれからもそれは続くんだろうなという見通し。それで嫌になるってことは今のところないけどなんとか打開したいですね。
元々自分は「みんなに楽しく仕事をしてほしい」というモチベーションからスクラムマスターとかをやりたいなあって思い始めたんですけど、なんかそれって間違ってはないけどそれだけじゃ駄目じゃないか? ってなってる。つまり、組織とか会社とか顧客とかにとっての成果みたいなのになってないといけないんじゃねーの? 的な。そんなん今までちゃんと考えたことなかったんですけど、なんかみんなめっちゃ考えてるんですよね。それはなんかこう「会社のためにー!」みたいなアレっていうより、自分たちがやってることが何か目に見える形で役に立っていてほしいっていう欲望なんだと思うんですけど。
そういうマインドが自分にはかなり足りてなくて、なんかこう、周りの人に楽しくしててほしいなー、っていうほんわかふわふわした欲望に基づいて仕事をしている。もちろん自分も楽しくやりたいし、まあできればお金もいっぱいほしいよねって感じで。それってどうなんだ? いや、決してそれが悪いことではないと思うんだけど、どこかで頭打ちになるというか、出せる成果に限界が来ちゃう考え方なんだろうなって思ったり。いやそもそもその限界まで今やってないけどね多分。
正直マインドを変えるとかよりはとりあえず「みんなに楽しく仕事をしてほしい」の方向で全力投球してそのあと足りないもの補っていくほうがいいのかもしれない。と書いてて思いました。具体的にどうすればいいのかまだ決まってない。とにかくチーム全員で話す場をしつこいぐらい作ったほうがいいんじゃないか? というのが今ある直感。ゴーストが囁いている。これもう古いね。

んであと、技術をもっとちゃんとやりたい。もうずっと「文系にしては頑張ってる」というのを自分の中の言い訳みたいにしてきたんだけどそれなんか意味あんの? っていう声を誤魔化しきれなくなってきた。
まずネスペとデスペは本当にいい加減ちゃんと取ります。朝起きられないとか言うてる場合かと。あとCSを本当にちゃんとやりたくて、今気になってるのはUoPeopleかな。本当にCSとか情報工学とかの学士号が欲しい。なんかITとかエンジニアとかそういうのを名乗るのには必要な知識みたいなものが根本的に足りてない気がする。あと、ぶっちゃけ理系の学士に対するコンプレックスが年々強くなっているっていうのもある。やっぱ上の方を見るとみんな当然のように情報の院を出てて論文とか読めますみたいな感じで、いやまあ、それは上を見すぎなのかもしれないし研究者になりたいとかなれるとかも思ってはいないんですけど、でもやっぱり最初から「いやー住む世界が違うんで」みたいにはなりたくないなっていう。
ただほんとに一人だと勉強しないんですよね。Courseraも途中で止まっちゃってるし……誰か一緒にやってくれませんか?

今考えてるのはそんな感じのことで、今年から心機一転みたいにはならないんですけど、引き続きやっていきたいと思います。
あ、あと、できるだけ毎日……は無理だな、毎週ブログ書きます。おわり

XonshをWindowsで(比較的)お手軽に使ってみる

はじめに

これはXonsh Advent Calendar 2018の23日目の記事です。

概要

同カレンダー3日目の記事の終わりでも書いたように、できるだけストレスなくWindowsにXonshを導入する方法について考えてみました。

考えてみた結果、「Git for Windows(GitBash)の上で起動するのが一番カジュアルじゃね?」という結論に達しました。

以下、具体的な準備について書いていきます。

1. Git for Windowsをインストールする

とりあえず、コマンドプロンプトよりはシェルの上で使いたいので、シェル環境を導入したいところです。

Windows上で動くシェルについては下記の記事が大変参考になります。

Windowsで使えるターミナルとシェルのまとめ - Qiita

記事中にもあるように色々な選択肢があるとは思うのですが、個人的には、Windows上でのちょっとした作業をLinuxライクなシェルでこなしたい場合はGit for Windowsが結局一番ミニマムかつお手軽なのではと思っています。

ターミナルエミュレータについては私はConEmuを愛用してますが(どうしてもコマンドプロンプト使わないといけないときはあるし、そういうときにシェルとタブ切り替えで使えるのは楽)、デフォルトでGit for Windowsに付属しているminttyでも全然いいと思います。

具体的な手順については流石に書くほどのこともないとは思うのですが…ここからダウンロードして、ウィザードに従ってインストールするだけです。

2. Pythonをインストールする

3.7系はsubprocess.run()がサイコーなので導入したいのですが、Xonshのコードに3,7以降ではdeprecatedな書き方をしてる部分があるらしくてWarningが出ることがあるのがちょっと鬱陶しい…近い内に対応されると思うのでまあいいのですが。

まあ3系ならなんでもいいのではないのでしょうか。既に環境がある場合は、py launcherとかでうまく共存させるといいと思います。py launcherについては下記の記事が参考になります。

Pythonの複数バージョンの扱い方(Windowsの場合) | ガンマソフト株式会社

こちらのインストール方法もそれほど複雑なものではないです。こちらからお好みのものを。

3. Xonshをインストールする

さて、ここからがいよいよ本番です。前回もこういう流れだったな。

とはいえインストールそのものはさほど難しくありません。例えば、2の手順でインストールしたPythonが3.7系である場合は、

$ py -3.7 -m pip install xonsh
$ py -3.7 -m pip install prompt-toolkit

でインストール可能です。もちろん、Python環境が一つしか入っていない場合などは、単に

$ pip install xonsh
$ pip install prompt-toolkit

でもOKです。

これで、下記のコマンドを実行するとXonshが立ち上がります。

$ py -3.7 -m xonsh

4. 起動設定(.bashrc)

Git for Windowsbash起動時に、自動的にXonshも立ち上がるようにしたいところです。.bashrcに仕込んでおきましょう。

~/.bashrcを作成し、(必要であればお好みのエイリアス設定などを行った上で、)末尾にXonshの起動コマンドを記述しておきます。

# .bashrc
# ...中略...
py -3.7 -m xonsh  # 末尾に追記

これでGit for WindowsのシェルがXonshになりました!

ちなみに、.bashrcを新規に作成した直後にGit for Windowsを起動すると、下記のようなWarningが出るようです。ちょっと言い草が恩着せがましくてイラッとしなくもないですが、要するに「起動時にちゃんと.bashrc実行するようにしといたよ」ということなので、ありがたく受け取っておきましょう。

WARNING: Found ~/.bashrc but no ~/.bash_profile, ~/.bash_login or ~/.profile.
 
This looks like an incorrect setup.
A ~/.bash_profile that loads ~/.bashrc will be created for you.

5. その他設定(.xonshrc)

Xonsh側の設定ファイルである~/.xonshrcを作成します。

.xonshrcの内容については下記の記事を参考にしています。

xonshrcを書く - Stimulator

import _locale
_locale._getdefaultlocale = (lambda *args: ['ja_JP', 'utf_8'])

$VI_MODE = False
$COMPLETIONS_CONFIRM = True
$IGNOREEOF = True
$INDENT = "    "
$CASE_SENSITIVE_COMPLETIONS = False
$HISTCONTROL = "ignoredups"
$XONSH_AUTOPAIR = True
$AUTO_CD = True
$XONSH_SHOW_TRACEBACK = True
$SUPPRESS_BRANCH_TIMEOUT_MESSAGE = True
$UPDATE_COMPLETIONS_ON_KEYPRESS = True
$PROMPT = "{INTENSE_GREEN}{user}@{hostname}{INTENSE_YELLOW} [ {cwd} ]\n{INTENSE_CYAN}$ "
    # 参照;https://xon.sh/tutorial.html?highlight=prompt_end#customizing-the-prompt
$LS_COLORS="di=34:ln=36:so=34:pi=33:ex=31:bd=46;34:cd=43;32:su=41;30:sg=46;30:tw=42;30:ow=43;30"
    # 参照:https://qiita.com/aosho235/items/6e4737a1eca11c41da9b

from xonsh.lazyasd import lazyobject
import importlib
lazy_module_dict = {
    'sys': 'sys',
    'random': 'random',
    'shutil': 'shutil',
    'requests': 'requests',
    'os': 'os',
}
for k,v in lazy_module_dict.items():
    t = "@lazyobject\ndef {}():\n    return importlib.import_module('{}')".format(k, v)
    exec(t)

aliases['ls'] = "ls.exe --color=auto"
aliases["l"] = "ls -l"
aliases["lf"] = "ls -f"
aliases["ld"] = "ls -d"
aliases["la"] = "ls -la"
aliases["ll"] = "ls -l"
aliases["vx"] = "vim ~/.xonshrc"
aliases["pwd"] = "pwd.exe"

…ほとんど前回記事と変わらないのですが、一部注意点があるので補足しておきます。

(1) コメントなどを日本語(ascii文字以外)で書く場合、SJISで保存すること

UTF-8だとUnicodeDecodeErrorが発生します。

多分、chcp 65001コマンドプロンプト文字コードUTF-8にすれば解消されるのですが、これはこれで副作用がありそうなのでやめたほうが無難じゃないかと。

(2) encodingの文字コードを変更しておくこと

この部分ですね。

import _locale
_locale._getdefaultlocale = (lambda *args: ['ja_JP', 'utf_8'])

下記の記事参照。

xonshのタブ補完でなんかエラーになる件 - Qiita

(3) エイリアス設定でGit for Windowsのコマンド実行ファイルを明示する

この部分。

aliases['ls'] = "ls.exe --color=auto"

何故か単にlsとか実行するとPermission Deniedを食らうのですが、こうしてls.exeを指しておくと大丈夫みたいです。

grepとかviとかは別にこんなことなしなくてもいいのでちょっと釈然としないのですが…MinGWに何かあるのかな?ちょっと原因までは突き止められていないので、単に対症療法ということで。

以上で設定は完了です。

おわりに

とりあえず、WindowsだけどXonsh触ってみっかーと思った人があまり悩みすぎずに導入できるように…というあたりがこの記事の目的です。果たすことができれば嬉しいです。

まあ正直なところ最近仕事でMacを使い始めてそこにXonshを導入したらWindowsで引っかかったポイントで全然引っかからないしそもそもUNIXネイティブだからもっさりしないし変なエイリアス噛ませなくていいしパス分かりやすいし結局Xonsh使いたいならMacのほうが100000倍いいよね…やっぱり…という気持ちになったりもしたんですがそれでもWindowsだってXonsh使いたいんだから仕方ないじゃんね、MacBookほしい…

以上、読んでくださりありがとうございました!

高梨太郎のここが好き

はじめに

これはSHIROBAKO Advent Calendar 2018の13日目の記事です。

高梨太郎のここが駄目

タイトルに反することをいきなり書くのですが、(特に1期の)高梨太郎にはとにかくイライラさせられますよね。

5話付近の、遠藤さんと下柳さんの間に無用な確執を招いた挙げ句、本来無関係の宮森を巻き込んで、あたかも自分に責任がないかのように振る舞う…こんなやつが職場にいたら刺しそうです。

それ以外のシーンでも、切羽詰まった状況でも軽佻浮薄、いいところを見せるのかと思ったら「無理っす」とヘラヘラ、ややこしいことは後輩の宮森に丸投げしながらも先輩風を吹かす…いいところなくないか? と。いいとこなし太郎かと。

いいとこあります

でもいいところあるんですねー。

言うまでもありませんが、2期・第三飛行少女隊編のトラブルメーカーの1人となる平岡くんに関して最も重要な役割を果たすのが高梨太郎です。その象徴的シーンが、22話「ノアは下着です。」の以下の会話。

平岡「…アニメなんて上がりゃいいんだよ。んなことも分かんねえで、あんときの俺はバカか! …バカか俺は…」

高梨「大ちゃんはバカじゃないよぉ。つらかったねぇ。えらかったねぇ~大ちゃん、頑張ったねぇ~」

ここで泣いた人は多いのではないか。不真面目男の高梨太郎は、だからこそ、真面目さ故に折れてしまった平岡くんを真っ直ぐに労い、慰め、励ますことができるわけです。

ここが高梨太郎最大の見せ場の一つであることは、おそらく論を俟たないでしょう。

でももっと好きなところがある!

あります。私が最も好きな高梨太郎は、他にいます。

17話「私どこにいるんでしょうか…」より、長距離の車移動で迷子になった佐藤さんと宮森が電話で会話し、それを高梨太郎が隣で聞いているこのくだり。

佐藤「嵐山って書いてあります…」

宮森「あらしやま…」

高梨「京都っすか?」

佐藤「あ、らんざんって読むみたいです」

宮森「らんざん…」

高梨「あ、関越道だな」

ここ!!!!!!!!

ここです。

高梨太郎は、入社試験で運転試験を担当したり、矢野さんのピンチに深夜車を出したりと、運転に関してはおそらくムサニで一定の地位というか、信頼を築いているのではないかと思われます。

運転慣れした高梨太郎は、ぱっと地図を見ただけで、佐藤さんが何をどう間違って嵐山にたどり着いたのか、だいたい理解したのではないかと思われます(想像ですが)。

だから彼にとって、この迷子は大したことではありません。把握できる範囲内で迷っているだけです。高梨太郎にとって、佐藤さんの慌てぶりはむしろ微笑ましくもあるのではないでしょうか? 公園の中でさまよっている子どもを遠目に見ているような。

「京都っすか?」「あ、関越道だな」の落ち着いた、こともなげな、ちょっとそっけないくらいのその口ぶりには、そんな余裕が見て取れます。もしかしたら、「いざとなったらキャリーしに行ってやるかー」ぐらいのことは思っているかもしれません(想像ですが)。

それもこれも、運転が高梨太郎の得意分野だから。どんな無責任男でも、その得意分野、プロフェッショナルの片鱗を見せる瞬間は格好いいものです。

そう、このシーンの高梨太郎は格好いい!!

だから好き!!!!!!

おわりに

オチとかは特になく、高梨太郎が格好いいという話しかしていないので少しいい話を。

SHIROBAKOは本当に私にとって大切なアニメです。働き始めて間もない頃にこのアニメを知ったことは、大袈裟な言い方になりますが大きな財産になっていると思っています。

働くということ。大人になること。チームで何かを作り上げること。夢を見ること。それを叶えること。それらについて見つめ直す機会をくれる素晴らしい作品です。

また頭から見返したくなってきましたので、今年中にもう一度通して見ておきたいと思います。

CentOS7(さくらのVPS)のターミナルをXonshにする

はじめに

これはXonsh Advent Calendar 2018の3日目の記事です。

やること

タイトル通りで、VPSに立てたCentOS7のターミナルをXonshに変更します。 大まかなステップは下記の通りです。

  1. CentOSサーバの立ち上げ
  2. Python3のインストール
  3. Xonshのインストール
  4. 起動設定(.bashrc)
  5. その他設定(.xonshrc)

あまり高度なことはせず、あくまでVPS上で使いたい場合の簡単な導入とお考えください。

1. CentOSサーバの立ち上げ

  1. さくらのVPSのコントロールパネルにログインする。
  2. 各種設定>OSインストールに遷移する。
  3. CentOS7 x86_64を選択し、パスワード設定をしてインストールを実行する。
  4. SSH接続設定など、初期設定を行う。(参照:https://vps-news.sakura.ad.jp/tutorials/centos7-initial-settings/

※OSインストール時、特にスタートアップスクリプトは設定しなかったのですが、yum-updateぐらいは設定してもよかったかもしれないです。

2. python3のインストール

CentOS7に標準で入っているPythonは2.7系のかなり古いものなので、3系を入れてやる必要があります。 標準のパッケージリストではPython3系を指定できないので、直接RPMを指定します。

sudo yum update  # この後の作業で必要なわけではないが、どうせやっておく必要がある
sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
sudo yum install python36u python36u-libs python36u-devel python36u-pip

3. Xonshのインストール

いよいよ本命のXonshのインストールです。 CentOSにもともと入っているPython2.7系ではなく3系を使うので、pip時も3系を指定します。

sudo python3 -m pip install xonsh
sudo python3 -m pip install gnureadline
xonsh  # Xonshが起動する

4. 起動設定(.bashrc)

起動時にxonshが自動的に立ち上がるよう、~/.bashrcの末尾にxonsh起動コマンドを追記します。

# .bashrc
# ...中略...
xonsh  # 末尾に追記

5. その他設定(.xonshrc)

Xonsh側の設定ファイルである~/.xonshrcを作成します。

.xonshrcの内容については下記の記事を参考にしています。 xonshrcを書く - Stimulator

$VI_MODE = False
$COMPLETIONS_CONFIRM = True
$INDENT = "    "
$CASE_SENSITIVE_COMPLETIONS = False
$HISTCONTROL = "ignoredups"
$XONSH_AUTOPAIR = True
$AUTO_CD = True
$XONSH_SHOW_TRACEBACK = True
$SUPPRESS_BRANCH_TIMEOUT_MESSAGE = True
$UPDATE_COMPLETIONS_ON_KEYPRESS = True
$PROMPT = "{env_name:{} }{BLUE}{user}@{hostname}{YELLOW} [ {cwd} ]\n{CYAN}{prompt_end} {NO_COLOR}"
    # 参照;https://xon.sh/tutorial.html?highlight=prompt_end#customizing-the-prompt
$LS_COLORS="di=32:ln=36:so=32:pi=33:ex=31:bd=46;32:cd=43;32:su=41;30:sg=46;30:tw=42;30:ow=43;30"
    # 参照:https://qiita.com/aosho235/items/6e4737a1eca11c41da9b

from xonsh.lazyasd import lazyobject
import importlib
lazy_module_dict = {
    'sys': 'sys',
    'random': 'random',
    'shutil': 'shutil',
    'requests': 'requests',
    'os': 'os',
}
for k,v in lazy_module_dict.items():
    t = "@lazyobject\ndef {}():\n    return importlib.import_module('{}')".format(k, v)
    exec(t)

aliases['ls'] = "ls --color=auto"
aliases["l"] = "ls -l"
aliases["lf"] = "ls -f"
aliases["ld"] = "ls -d"
aliases["la"] = "ls -la"
aliases["ll"] = "ls -l"
aliases["vx"] = "vim ~/.xonshrc"

以上で、設定は完了です。 SSH接続でVPSに接続すると、いい感じのxonshが立ち上がります。

おわりに

Linuxサーバに慣れている人にとってはそれほど引っかかるところもないとは思うのですが、気軽にXonshを試す導線になればいいなと思い記事にしてみました。

Windowsでも快適に使えないか格闘中なので、自分なりのベストプラクティスが見つかったら記事にしてみたいです。(既に見つけている方がいたらぜひ教えてください…)

転職しました

しました

11月16日、先週金曜日を最終出社日として、新卒*1から3年1ヶ月ほど勤めた会社を退職しました。

12月1日付け(出勤は12月3日月曜ですが)から新しい会社で働きます。

ということで転職エントリというものを書いてみます。

どこから?

新卒以来働いていたのはいわゆるメーカー系(ユーザー系/メーカー系/独立系の三分類のアレ)のIT企業です。

とはいえメーカー系っぽい仕事をすることはあんまりなく、SIっぽい仕事をやる部署に所属していました。

主に触っていたのは自然言語処理とか検索システムとか機械学習(の端っこらへん)とかそのあたりで、言語的にはPythonとかJavaとかC#(.NET)とか。あとインフラ周りもちょっとやりました(主にDockerと戦ってた)。

役割的には開発メンバとしての他に、ファシリテーターとか、新入社員教育とか、お客様サポートとか。人の間に入って色々やるマンをやりたくて色々やっていた感じ。

どこへ?

Web系企業?にエンジニアとして転職します。サーバーサイドでJavaとかやるみたいです。

大阪のど真ん中にある高いビルの高い階で仕事ができるっぽくて、今のところそれがドチャクソ楽しみです。

なんで?

転職そのものを考えた理由

SIの仕事もそれはそれで楽しいところあったんですけど(お客様とやりとりするのとかもそんなに嫌いじゃなかったし)、やっぱり自社サービス持ってて開発側に主導権のあるところで仕事してみたいなーと思ったのが大きかったです。

あと、規模がそれほど大きくないチームの中で良い具合に必要とされてしまっていて、逆に圧倒的成長する機会が減ってきちゃってるのでは…? という不安も少し。

人生のフェーズ的にも、今を逃すとタイミングなさそうだなーとも思い、転職を考え始めました。

転職先を決めた理由

とりあえず絶対条件として「自社サービスをやってる」というのがあって、あとは「チーム開発ちゃんとやってそう」「技術に投資してそう」「関西圏で通勤しんどくない」「オフィスきれい」あたりを基準に、何社か面接を受けてみました。

うち数社から内定をいただいて、かなり悩んだのですが、「エンジニアの研鑽への支援がめちゃくちゃ手厚い」「アクセス数すごいから通信周りのノウハウについて圧倒的成長できそう」「オフィスめっちゃきれい」「お給料が」などで最終的に決めました。

今どんな気持ち?

正直めっちゃ寂しい!!!!!!

いや、転職活動したり事務的な手続きしてる間はこんなに退職が寂しくなると思ってなかったんですけど、とんでもなくしんみりする…

最終出社日の夕方、先に帰られる社員の方何人もから声をかけていただいたり、送別会でいろんな方からプレゼントをもらったりして、あーこの会社に入ってよかったな…と思ったものです。

同期のお母さんに週一でお弁当作ってもらったり(そんなことある?)、TRPGや麻雀やスプラトゥーンに誘ってもらったり、昼休みにボドゲやったり(これはちょっと怒られたけど)、なんというか人に恵まれて楽しく過ごせたなーと感謝でいっぱい。

温かい励ましの言葉をかけていただいたので、いやマジで頑張らんとなーと決意を新たにしています。

何頑張る?

なんか正直、体系立った知識が欠けてる気がするので、IPAの試験の勉強とかをやっていくのが良いのかもなと思ってます。データベーススペシャリストとかネットワークスペシャリストとか。

あと個人開発でなにか1つは完成したもの(サービスなりアプリなり)を世に出したいなー。あんまり0から1を考えるの得意じゃないんですけど…手を動かさないと身につかないものあるよねー。

入社してからはちょっと具体的にどんな生活になるかまだ分かんないんですけど、今までやったことないことがいっぱいあるはずなので、ハングリーかつグリーディーにやっていきたい。もぐもぐ。

それ以外にも気になったものはいっぱい触っていきたい。Nimちょっと気になるな。明日やってみよう(今日はやらない、眠いので)。

全然関係ないけど

うたよみんというサービスで短歌を始めてみました。結構楽しいです。飽きるまでやります。

www.utayom.in

*1:厳密には新卒ではなく、既卒後半年時点で中途枠採用だったのですが、新入社員研修から受けたのでまあほぼほぼ新卒です

Windowsに入れたXonshをSVNの更新通知取得に使ってみたけど課題が多すぎる

はじめに

この記事はXonsh Advent Calendar 2017 19日目の記事です。

Python2系メインで使っている社内PCにXonshを導入してみた - かーくがかーくよの続き?です。

環境

やりたいこと

前回の記事ではとりあえず機械学習スクリプトの評価をXonshでやってみたんですがいくらなんでもそんなことXonshでやる必要ないし書き捨てのスクリプトでやることでもないだろ…普通にPythonでちゃんと書けよ…となったので、もう少し日頃から使いそうで、かつチャラっと書いても支障なさそうなことをやってみようと思いました。

さて、弊プロジェクトのソースコードSVNで管理されているのですが、ホストが社内になく、また私にはリポジトリの管理権限もありません。そのため、コミット通知をWebhook的に受け取ることができず、若干不便を感じています。

そこで、ログを上手いこと定期的に取得することで、擬似的にコミット通知を出すことができないか? と考えました。

作ってみる

下記のようなものを作ってみました。

import re
import time

re_svninfo = re.compile('^r(?P<rev>[0-9]+) \| (?P<name>.+) \| (?P<datetime>20\d\d-\d\d-\d\d \d\d:\d\d:\d\d) .* \(.*\) \| \d+ lines?$')

target_dir = $ARG1

last_log = $(svn log @(target_dir) -l 1).split('\n')
checked_rev = re_svninfo.match(last_log[1]).group('rev')

while(True):
    infos = []
    for line in $(svn log @(target_dir) -r @(checked_rev+':HEAD')).split('\n'):
        matcher = re_svninfo.match(line)
        if matcher:
            infos.append((matcher.group('rev'), matcher.group('name'), matcher.group('datetime')))

    for rev, name, datetime in infos:
        comment= $(svn log @(target_dir) -r @(rev)).split('\n')[2:-2]
        comment= '\n'.join([line for line in comment if line])
        print(rev, name, datetime, comment) 

    checked_rev = rev
    time.sleep(3000)

print(rev, name, datetime, comment)しているところでなんかこう、json投げたり、引数にして他のコマンド叩いたりとかできるといいな…といったところで。

なんか強引なループを書いていますね。cronで実行とも思ったのですが、社内のサーバに勝手に設置するのも憚られ、どうせデスクトップで実行するならこういうのでいいや、中断するときはKeyboardInterruptすればいいだろ、みたいな判断でした。

とりあえずここまでは動きます。動きますが…

問題点

日本語を扱えない(?)

日本語のコミットコメントをprintしようとするとUnicodeEncodeErrorを吐きます。正直これが一番痛いです。

サロゲートペアが含まれているのが駄目っぽいと見て、message.encode('utf-16', 'surrogatepass').encode('utf-16')なども試してみたのですがどうも上手くいきません。

stdoutには出せてるわけだからリダイレクトでtxtに吐き出せばもうちょっと使えるんじゃないか?と思ったのですが、今度は何故か[WinError 87] The parameter is incorrectを吐いてしまいます。

Xonshの標準出力の問題なのかCygwinと組み合わせていることによる問題なのかがいまいち分からない…

重い

何回もsvn logを呼んでいるせいか、やりたいことの単純さに対して随分レスポンスが遅い感じがします。

ただこれは単にロジックの手を抜いていることによる問題ですね。最後にチェックしたリビジョンからHEADまでのログを取得する際に、もっと上手くマッチングを取れば、リビジョン1つずつについてsvn logしなくても良くなるわけですから。

コミットコメントの行数まで与えられてるので、ここは今後いくらでも手の入れようがある気がします。しますが…

Pythonでよくない?

というか既にほぼPythonスクリプトじゃない?svn logコマンドしか呼んでないなら普通にPythonでsubprocess実行しても大差なくない?という気持ちになります。

なんか最初は正規表現の部分をシェルっぽく書けないかなあと思っていたのですが、~=による正規表現マッチングはどうやらXonshでは使えない?っぽいのですよね…

まとめ

Xonsh、面白そうなのですが、使いこなすには私の力量が不足しているような気がします。うーん。

日本語出力周りの問題がどうにかなれば、少なくとも今回の課題については一定の成果が上げられるような気がするのですが。

とりあえず今後もConEmuには残しておいて、気が向いたときにちまちま触ってみようかと思います。

面白いものに出会わせてくれたばんくし (@vaaaaanquish) | Twitterさんに感謝!

Python2系メインで使っている社内PCにXonshを導入してみた

はじめに

この記事はXonsh Advent Calendar 2017 8日目の記事です。

社内PCにxonshを導入してみた話を書きます。

環境

おっと、体調が少し悪くなってきました。

導入手順

Python3インストール

導入しようとしてびっくりしたんですがそもそもPython3入ってなかったですね。

  1. 普通にDLしてきて、C:\Python36-32\あたりにインストール

  2. C:\Python36-32\python.exeC:\Python36-32\python3.exeにリネーム

  3. C:\Python36-32にPathを通す

これでとりあえずpython3コマンドが通るようになります。

これだとpipコマンドが使えないんですが、メインで使うのは今後もしばらく2系になりそうなのでとりあえずこういう感じにしておきます。

pipでxonshインストール

基本的な手順はここに書いてあるとおり。

$ python3 -m pip install xonsh
$ python3 -m pip install prompt-toolkit

win_unicode_consoleもインストールしたほうがよさそうなこと書いてありますが、Cygwinで実行するぶんには特に必要なさそうな感じです。

ConEmuのタスクに登録

f:id:kirk3110:20171204151102p:plain

set CHERE_INVOKING=1 & %ConEmuDrive%\cygwin64\bin\bash.exe --login -i -new_console:C:${アイコンのパス} -c python3 -m xonsh

こんな感じで登録しておくと、ConEmuのタスクからXonshを選択して起動できます。

f:id:kirk3110:20171207201118p:plain

.xonshrcを作成

import _locale
_locale._getdefaultlocale = (lambda *args: ['ja_JP', 'utf_8'])

とりあえずこれを追加しておかないと、Tabキーで補完しようとするたびにErrorを吐かれてしまいます。(参考:xonshのタブ補完でなんかエラーになる件 - Qiita

あとは.bashrcと同様に何かしら登録しておくとよさそう。Pythonで書けるみたいで便利ですね。

やっていき

とりあえず思いついたことをやっていきます。

材料

何をしたいのか

  • train_script_py2.pyの学習時に与える最適なパラメータを考えたいので、とりあえず何パターンか試してみたい。
  • 結果をCSVに出力したい。
  • そのためにまたPython2系のスクリプトを増やしたくない。
    • 大人の事情などがありscipyのバージョンを軽率に上げられないため(????)、最新のpandasやscikit-learnが使えず残念な感じという問題もある。

動かしてみた

$ import pandas as pd
$ from sklearn.metrics import accuracy_score
$ params = pd.read_csv('params.csv')  # vecsize, threshold, window
$ scores = []
$ for i, (v, t, w) in params.iterrows():
      python train_script_py2.py -i 'train_dataset.csv' -o 'tmp.model' \
          --vecsize @(v) --threshold @(t) --window @(w) 
      pred = [int(cls) for cls in $(python pred_script_py2.py \
              -m @(model_path) -i 'test_dataset.csv').split('\n') if cls]
      scores.append(accuracy_score([0,1,2,3,4,5,6,7,8,9], pred))
$ params[score] = scores
$ params.to_csv('result.csv', index=False)

動いた

動いたから何だという感じもあります。

所感

  • ちょっとしたファイル操作等をするときにPythonも一緒に使えるbashだと思うとまあ結構アリかもしれない。
  • しかし上でやってみたぐらいのことをやるならPython2でも良い気はします。
  • シェル芸力が足りないのであんまり気の利いたことができなかったです。
  • 様々な事情がありJavaのモジュールを使用することを余儀なくされたりなどするため、そういったときには便利なのかもしれません。
  • SVN(Gitではない)のコマンドライン操作を絡めてモニョモニョできたりすると楽しいかもしれません。
  • はやく3系*1になりたい

*1:にんげん