新潟の空は今日も灰色/東京の空は今日も青空

知識も技術も文章力もないので練習しています。新潟から東京へ移住しました。

道路趣味

最近、道路が趣味です。すみません、最近じゃなくて昔からでした。

物心ついたときには、すでに車が好きで、幼稚園バスを待つ間、自分の家の前の道を通る車の名前を全部言い当ててから登園していた記憶があります。 大学に入る直前の3月28日に免許をとって、入学後すぐから車に乗り始めて、今の車で4台目。 あるとき気づいたのは、車そのものよりも運転が好きで、さらに運転しているときに道路について考えているのが好きと言うことでした。

実家のすぐそばには、116号というごく平凡な国道*1と402号というそれなりに起伏に富んだ国道(海岸なのにね)が走り、大学の頃は404号という、なにやらなにもなさそうな番号*2の国道のすぐそばで暮らしていました。

道路が好き、と言ってもミクロな視点よりマクロな視点のほうが好きです。道路の組成アスファルトがどうとか、舗装がどうとかについても詳しくなりたいけど、なんでこの険峻なところに道路作ったのか、なんでこんな形の道路になったのかなど、そういう方に対して興味があります。

そんな折り、去年、書店で見かけた一冊の本に胸を躍らせることになりました。

すごく良かった。僕が知らない国道の世界がそこには広がっていました。もちろん知っている内容もたくさんあったんですけど。

読んでみて思ったのは、新潟県というのは道路にはやはり恵まれているということでした。昔から角栄の影響とかとはよく言われていますしね。

なにせ新潟市だけでこれだけの国道の話題があるのです。

  • 新潟市中央区の本町交差点は日本で一番重なっている国道が多い

    国道7号、8号、17号、113号、116号、289号、350号、402号の8国道。ほかに県道も重なってる。あと、高知市にも同数8国道重なっている交差点があるらしい。

  • 新潟市を走る国道7号・8号新潟バイパスのピーク時交通量は日本一

    なお、終日を通しての日本一は神奈川の保土ヶ谷バイパス

  • 国道350号と言えば、海上国道

    しかも、佐渡を経由して上越まで行くんだからね、すごいよね。

新潟市の道路に限らず、やっぱりそういう話題があったり行きたくなるし、走りたくなるしで、今は次どこへ走りにいこうかとか、会社の帰りはあそこの道路寄ってみようか、とかそういうことがナチュラルに行えるというのは素晴らしいと思っています。

そんな中で今一番気になっている道路は国道352号。栃木県から柏崎市までを結ぶそれなりに長い道路で、特に福島・新潟の県境の奥只見湖付近、通称樹海ラインは酷道の一つとして有名です。 この道路は現在もまだ長岡市内に不通区間があり、開通に向けて工事が行われています。

新潟県:一般国道352号 萱峠バイパス

この区間は学生時代からすごく気になっているところで、竹之高地トンネルは、偶然ドライブしているときに見つけて、「これいったいどこに繋がるんだろう」と不思議に思ったものです。 それまでにも反対側の萱峠トンネル側の近くにも行ったことがあったので、まさかこことあそこが繋がる計画とは、当時はよもや思いませんでした。 この竹之高地というところは、山古志の蓬平温泉のさらに奥で、本当に山の奥なのですが、どんな風な道になるのか、今から楽しみで仕方がありません。

上のページを見る限り、栖吉とか蜂伏には間違いなくたどり着かないルートだと思うのですが、これはどうなるのかとか、そのあたりを予想したり、調べてみたりするのも道路の楽しみの一つなんだと思います。

ほかには、国道289号八十里越も楽しみですが、開通は2020年代ということで、もうちょっと先になりそう。

そんなわけで、道路が好きなんだーということをただ書きたかったエントリでした。なんか、道路ネタ増やしたいね。

*1:今じゃ二階級降格で市道ですよ

*2:Not found. ちなみに長岡市小国地区の相野原交差点で403号に接続します。Forbidden!

(僕にとっては)OpenSSH for Windows がすごく良かったというお話し

概要

Windowsをホストマシンとして使うことを前提に、Linux/UNIX系のOSの管理をやろうとしたときに、僕にとってはPuTTYTeraTermよりも、OpenSSH for Windowsをいれた方が良かったというお話し。

背景

今、家(デスクトップ)でも外(ノート)でも、個人ではWindowsマシンを使っています。なお、会社ではMBAです。

Windows環境で、たとえばVirtualBox + Vagrant、たとえばAmazon EC2のような環境にログインしようと思ったらPuTTYなり、TeraTermなり、Poderosaなり、ChromeSSHクライアント使うなりといった選択肢になるんだと思います。

決まったホスト(IP)にしかログインしないのであれば、GUIで設定してそれらでも全然良いんですけど、たとえばコマンドラインvagrant sshコマンドは直接はたたけないですし、EC2をぼこぼこ建てたりつぶしたりしたときにIPが変わるときにはなかなか面倒です。EC2はまだ良いとして、vagrantでいくつかインスタンス作ったときにvagrant ssh appとかができないのは結構きつい…。

一方で、CygwinとかSUAはちょっと大げさすぎるし…。

そこで、一瞬思いついたのは、バッチファイルやGolangで、OpenSSHのsshコマンドと同様のものをパースして、PuTTYなどに渡してやるという案だったんですが、ただただ不毛であることに気づきまして。

根本的な話として、デスクトップのOSをLinuxにするとか、Linux仮想マシンを動かすという案もありましたが、仮想マシンでは結局どれか使わないと入れないし*1、そこそこゲームとかもしたいので、Windowsホストの方がうれしいのです。

「新しくMacでも買えば良いじゃん」と言うのは、お金くれるなら考えます。そこまでもらえてないです。辛い。

一番早い方法として、Windows版のOpenSSHを入れればそれだけで解決して、ちゃんと生産性があがったので紹介します。

これです。

mls-software.com

Windows用のSSH調べると、古いバージョンを配布してるのはすぐ引っかかるんですが、新しいのはここくらいしかなさそうです。やったらあたらしいです。ecdsa鍵だけじゃなくて、ed25519鍵もいけちゃうよ☆*2

もちろん、コマンドラインからvagrant sshもいけちゃいます。

ただし

自己責任でお願いしますね。

Linuxとか、最近だと、yumとかaptとかどこから落としてくるか大体分かるからいいけど、Win32だとそういう機構もないので、その辺りが辛いです*3。良い感じの認証機関とかないんですか。ないんでしょうね。

補足

ごめんなさい、生産性があがったのはSSHのおかげだけでは無いです。コマンドプロンプトをやめて、ConEmuを入れて、git-bash使うようになりました。とりあえず、今の手元の環境はこれでいいかなって思っています。

*1:VBoxとか、VMware Workstation Playerのコンソール使うとかってどうなんですかね?

*2:ただし、僕がログインしに行く環境はCentOSばっかりなのでログイン先が対応してない

*3:ストアアプリがんばれ。

携帯電話の料金を見直してみてる

Facebook あたりに書きまくってるんですが、今お金がないです。辛いです*1

節約するために、いろんな月額料金のものを解約していってます。見直してみると結構無駄遣いしてるもので(-_-;)

ところで、僕の docomo の携帯電話契約、まだ「学割2012」が効いています。学割は3年間有効なのですが、契約したのが修士2年の3月。つまり学生最後の月に契約してるので、まだ有効期間内なのです*2

こいつの学割が切れるとちょっと出費が大きくなるので、それまでに対応策を考えたいところ、というわけで検討してる内容の備忘録。

現状

今がどういったプランになっているかというところから。

1. docomoFOMA回線)

普段は電話用に F-09C に挿してるやつ。iモードと moperaU 契約してた(spモードは未契約)。

2. docomo(Xi回線、学割効いてる)

普段はデータ通信用に SO-02F に挿してるやつ。moperaU とspモード契約中。キャリアメールのメインを契約中。今の時点で6500円くらいかかっててて、半分は端末代金。残り10ヶ月。

3. docomo(Xi回線)

BF-01D 挿してたデータ通信専用のやつ。解約済。10260円払う必要が…。

4. docomoFOMA回線)

祖母の携帯(mova)から僕が受け継いだ番号。死蔵中。700円くらいかかってる。

4は一番古い番号。1もそこそこ古くて高校時代から。

使う頻度も落ちてきたとは言え、キャリアメールはとりあえず確保しておきたい。

考えた結果(現時点での決定事項)

  • 1の moperaU を解約。spモード契約。iモード続行(ここまでは実行済)。spモードに、2に紐付いているキャリアメールを移管する。
  • 2はしばらくはこのまま。プランがタイプXiにねんなので、通話し放題の恩恵がないから変更無し。タイミングを見て IIJmio かワイヤレスゲートに飛ばす。
  • 3は解約済だから関係ない。
  • 4はどうしようか…?続行させる? Fx0 にでも MNP させようかな。

結果を受けて

  • 1の料金は変わらない。ISP割の適用先が moperaU からspモードに変わるだけ。
  • 2の料金は安くなると思った。思ったけど、そういえば端末代金あるんだった。今は一括で払う余裕ないし結局10260円もなんとかしないと。とりあえず隙をみて、払いきりたい。
  • 4はしばらくは変わらないな。

んー、端末代金どうしようかな。工面できればなぁ…。

どっちにしても、しばらくは変わらないっぽいな。

*1:欲しかった車を買ったのです。その点はすごくうれしい。そのうち日記にも書きたいな

*2:つまり社会人3年目が終わると言うことですね。

CentOS 6.xとAmazon Linux(2014.09.1)でyumの戻り値が違う件

状況説明

たとえば、こういうコマンドを打った場合。

  • ちゃんと yum コマンドが発行出来る(権限が足りてる)
  • インストールするパッケージは、パッケージ名では無くURLでの指定である
    • rpm -Uvh http://hoge/fuga.rpm と同義のコマンド
    • レポジトリ登録のときに***-release.2.3.x86_64.rpm みたいなのを最初にインストールすることは結構ありますよね。

とりあえずこの状況では、最初は対象のパッケージはインストールされていない前提で、1回目のコマンド発行でインストールされ、もう一度同じコマンドを実行したときのお話です。

$ sudo yum -y install http://hoge/fuga.rpm
$ sudo yum -y install http://hoge/fuga.rpm # 上と同じコマンド
$ echo $?

CentOS6とAmazon Linuxで値が違います。

結果

CentOS6の場合

0

Amazon Linuxの場合

1

なにが困るか

たとえば、Ansibleとかを使っていると、Amazon Linuxの場合は、- ignore_errors: yes が必須になります。気をつけましょう。

ちょっとつらい…。

Mac のファイル名に使える文字列にびっくりした話

仕事中のこと

仕事では Mac を使っています。

ある日、エクセル*1でファイルを保存しようと思ったときに、なにを思ったか、こんな感じで保存したんです。まあ、Windows とかと同じ感覚で、どうせはじかれるだろうと思っていたんですが*2

f:id:hagane:20140605193242p:plain

ちょっとまって、保存出来てしまったけど、Mac って /(スラッシュ)を含むファイル名保存出来るの?!

ターミナルではどうなるのか

こうなると、よくわからないのは、ターミナルでの扱い。iTerm2 を立ち上げ保存したディレクトリに移動して、ls したらこうでした。

f:id:hagane:20140605193810p:plain

/ だったところが : になってる!二度びっくりです。

これは、本当にコロンなのか?

ファイル名の文字コードとか、ファイルシステムを直接いじれるならその方がいいんでしょうけど、そんな技量今の僕にはないので、とりあえずプログラムから触ったときに、この文字列がなんであるのかを確かめてみました。

Python 2.7.5 (default, Mar  9 2014, 22:15:05)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print os.listdir('.')[0]
2014:06:05.xlsx
>>> for i in os.listdir('.')[0]:
...     print i, ord(i)
...
2 50
0 48
1 49
4 52
: 58
0 48
6 54
: 58
0 48
5 53
. 46
x 120
l 108
s 115
x 120
>>>

ASCIIの58は確かに : ですね*3

ふーむ。

これが許されているのは歴史的経緯?

ちょっと調べてみると、BSD ベースになる前の Mac のディレクトリ区切り記号は : だったようですね*4。その当時は、スラッシュはファイル名を構成する文字列として許されていたのでしょう。つまりこれは後方互換性のための措置なんですね。

どうやら、システム内部では : として扱い、Finder で表示するときに / に置き換えている模様。保存した瞬間結構びっくりしたんですけど、すごい仕様ですね。

ですので、bash から / を含む文字列を作ることはできません。bash:をファイル名に含むファイルを作った場合は、Finder 上では、/ に置き換えられて表示されます。

このスラッシュ入り(コロン入り?)ファイル名、Mac 上では閲覧・確認・保存等出来ますが、他のファイルシステムではたぶんだめです。Windows でやったらたぶん怒られます。今のところ、Windows あんまり触れないので確かめられてないんですが、共有しようとしたらなんかしらのトラブルになると思います。というか、Windows で直接 : の入ったファイル名をつけようとしたら怒られました。

Linux: 入りは大丈夫でした(/ は当たり前だけどだめぽ)。GUI 環境のある Linux 環境が今手元にないので、そっちでの表示のされ方は不明ですが、普通に考えれば : のままで出てきて欲しいところです。

というわけで、出来る限りこういう文字列をファイル名を入れるのはやめましょうね、というお話でした。

... もしかして常識でしたか?!

*1:別にエクセルじゃなくてもいいです。

*2:ATOK で「今日」って打鍵して入力した次第。「今日」って打ったときに、「2014-06-05」とかに変換出来ればいいのに…と思って確かめてみたら出来るじゃん!便利!

*3:ASCII文字コード : IT用語辞典

*4:ファイル名のスラッシュとコロン - onumeraneの日記 - mdsg。内容的にも今回の内容とほぼ同じものを書かれている方がいたんですね。

bash を再起動

結論

$ exec $SHELL -l

背景

bash とかで、シェルだけで再起動したいとき、ウェブで検索すると、大概

$ source ~/.bashrc

とか出てきます。ただ、正確にはこれは再起動していないだろうと。すでにプロファイル情報などが読み込まれているシェルで、新たに~/.bashrc を読み直してるだけです。

たとえば、下のような形で .bashrcのなかで定義されていた変数を削除したあとに、上記コマンドを実行しても、その変数は残ったままになるわけです。上記コマンドで、下の代入を取り消したかったら、.bashrc内でexport HOGE=を書くか、プロンプトで同コマンドを実施する必要があるわけです*1

export HOGE="fuga"

一度まっさらな状態にして、再度シェルを起動したい場合には冒頭に示したコマンドを実行するか、もうターミナルごと再起動すればいいんじゃないかなと思います。

簡単な解説

execコマンドは、現在のプロセス番号のまま(=プロセスをforkせず)、第一引数で渡されたコマンドを新たなプロセスとして起動します。

execを付けずに以下のコマンドで起動すると、新たなシェルは別のプロセスとして立ち上がり、exitしたときには元のシェルに戻ってくるわけです。試しに以下のコマンドを実行して、すぐに exit すると、ログアウトしましたという表示がなされ、元のシェルに戻ってきたことがわかります。

$SHELL -l

第一引数で指定している $SHELL には、ログインシェル実行ファイルのフルパスが入ります。

$ echo $SHELL
/usr/local/bin/bash

また、-lbashの起動時にログイン時と同じプロファイル・設定を読んで起動するというオプションになります(個人的にbashしか使っていないため、他のシェルで同様のオプションが -l で起動するかは定かではないです。また、execコマンド自体、bashの組み込みコマンドだったりします)。

実際の挙動は以下の様になります。

$SHELL -l の時と、exec $SHELL -lのときで、bashのプロセス数が違うことがわかるはずです。

$ ps aux | grep bas[h]
npoi             52344   0.6  0.1  4306456  13072 s002  S    281218    0:05.39 /usr/local/bin/bash -l
npoi              3589   0.0  0.0  4305016   6004 s001  S+    9:40PM   0:00.44 -bash
npoi              3150   0.0  0.0  4304404   1156 s003  S+    8:12PM   0:00.49 -bash
npoi             50063   0.0  0.0  4304996   1112 s000  S+   281218    0:00.85 -bash
$ $SHELL -l
$ ps aux | grep bas[h]
npoi              3589   0.0  0.0  4305016   6004 s001  S+    9:40PM   0:00.44 -bash
npoi              3150   0.0  0.0  4304404   1156 s003  S+    8:12PM   0:00.49 -bash
npoi             52344   0.0  0.1  4306456  13072 s002  S    281218    0:05.42 /usr/local/bin/bash -l
npoi             50063   0.0  0.0  4304996   1112 s000  S+   281218    0:00.85 -bash
npoi              8954   0.0  0.1  4304408  12212 s002  S     3:51AM   0:00.37 /usr/local/bin/bash -l
$ exit
ログアウト
$ exec $SHELL -l
$ ps aux | grep bas[h]
npoi              3589   0.0  0.0  4305016   6004 s001  S+    9:40PM   0:00.44 -bash
npoi              3150   0.0  0.0  4304404   1156 s003  S+    8:12PM   0:00.49 -bash
npoi             52344   0.0  0.1  4304408  11812 s002  S    281218    0:05.79 /usr/local/bin/bash -l
npoi             50063   0.0  0.0  4304996   1112 s000  S+   281218    0:00.85 -bash
$

# 本エントリは、2019年1月7日に加筆・修正しました。

*1:当然ながら、これだと環境変数HOGEは消えてしまうので、/etc/.profileなどで設定されていた場合などは、その設定値も消えてしまいます。

Zabbix からチャットワークに投稿するためのスクリプト書いた

Zabbix からのアラートをチャットワークに投げつけるためのスクリプトを書きました。

npoi/zabbix2chatwork

ソースコードあんまり綺麗じゃないけど。README 書いてないけど。コミットメッセージ日本語だけど。

背景

今の会社はインフラが強固ではありません。インフラ担当の僕にスキルがあるというわけではないので、うまく立てないとセキュリティホールとなりがちなメールサーバは可能なら構築したくないという希望がありました。

でも、アグリノートのサービスになにかあったときのために Zabbix からアラート情報は飛ばしたい。外部にメールサーバ借りるというのも手なのですが、それよりも手っ取り早くスマホにプッシュ通知する方法がありました。そう、チャットワークです。

選んだ理由、社内のコミュニケーションツールがチャットワークだったというのが一番大きいんですけどね。ただ、これならば、複数人に同時にアラート飛ばすときにも使いやすいですしもってこいです。限定的ながらAPIも公開されて、プログラム側から使いやすくなりましたよね。

ついでに、どうせエンジニアなのだから、死ぬまでに1回くらいはなんか自分でもプログラム、もといスクリプトの一つでも書いて公開してみたいという欲求が湧いたので、久しぶりに Python を使ってスクリプトを書いてみた次第です。Python 選んだのは単に好きだからっていうのと、標準的な UNIX なら処理系乗っているはずだからです。

使い方

単体で使うとき(テストとか?)

Zabbix 使わなくても、コマンドラインから以下のコマンドで実行可能です。

./zabbix2chatwork.py [chatwork_api_token]:[チャットルームID or チャットルーム名] [表題] [メッセージ本文]

たとえば、あらかじめ "Zabbix" という部屋を用意して以下のコマンドで実行すると、

./zabbix2chatwork.py 7bb[中略]742:Zabbix hoge fuga

以下のようなこんな感じになります。

f:id:hagane:20140213001945p:plain

これだけではとくに使い道はないですね。

Zabbix から投稿するとき

まず、Zabbix の、AlertScripts ディレクトリにスクリプトをダウンロードして、実行権限を与えます。ディレクトリの場所は公式の CentOS 用のパッケージだと、/usr/lib/zabbix/alertscripts になってますね。/etc/zabbix/zabbix_server.conf 内に設定が書いて有るはずなので確認してください。

ファイルを設置したら、Zabbix にログインします。メニューの[管理]→[メディアタイプ]へ遷移して、[メディアタイプの作成]ボタンを押します。

f:id:hagane:20140213003143p:plain

f:id:hagane:20140213003739p:plain

[タイプ]を スクリプト に変更し、[スクリプト名]には zabbix2chatwork.py を指定します。[名前]は適当で良いと思います。[有効]のチェックボックスも忘れずにチェックします。

次に、ユーザー設定に移ります。

f:id:hagane:20140213004350p:plain

ユーザーリスト という表示のドロップダウンボックスを ユーザー に切り替え。

f:id:hagane:20140213004447p:plain

任意のユーザー名をクリックし、[メディア]タブを選択。[追加]リンクを押すと以下のダイアログが出るので、先ほど設定したメディアタイプを指定します。[送信先]には [chatwork_api_token]:[チャットルームID or チャットルーム名] を入力してください(例:7bb[中略]742:Zabbix)。[時間帯]等はお好みで。

f:id:hagane:20140213011157p:plain

あとは、トリガーとアクションの設定次第でメールの代わりにチャットワークにメッセージが飛んでいくはずです。実際に飛ばしてみた時の画像がこちら。

f:id:hagane:20140213010220p:plain

エ、エモーティコン…。(2/13 9:18変更…)

課題

プッシュ通知届くのを目的としているくせに、マイチャットあたりになげないと、スマホさんは通知してくれません。ちゃんと To つけて送れるようにしないと。

あと、複数の部屋名が重複しているとうまく使えないはずです。そういうときは、room_id で指定してあげてください。

最後に

久々だったせいもあって、プログラム書くの楽しかったです。これだけ短くて、クラスもなにもあったものではないですけど素直に楽しめました。なんか次はなに作ってやろうかっていうやる気出ますね。久々に物作りの感動を思い出した気がしました。うん、もっと、こいつも改善していきたいですけどね。改善ってなんだかわからないけど。

とはいえ、仕事でそろそろコード書かないといけない雰囲気が漂っていますけどね…。

これだけ短いスクリプトだけど、コーディング上まずい部分が有りそうな気がします。見つけられたら、直接指摘したり、Pull request いただけると幸いです。よろしくお願いします。

余談

なお、話は変わりますが、ウォーターセル株式会社では Ruby(on Rails)、PHPAndroid アプリ開発に関しての人材を募集中です。

職場は新潟というグンマーのさらに奥地ですが、農業ITというフィールドはそれなりに攻略しがいのあるエリアだと思います。今年あたりは一気に市場規模の拡大がありそうです(それだけ競争激化して辛い戦いも増えそうですが…)。

もし、ご興味があれば、人材募集に関わる内容じゃなくても、企業間のコラボなどでもご連絡いただけるとうれしいです。よろしくお願いします!

追記(2015/01/19)

ChatWork で code タグというものが出来たらしいです。

ついに「codeタグ機能」をリリース!ソースコード表示もより見やすくなりました! | ChatWorkブログ

今までのスクリプトだと、強制的にエモーティコン表示させられてたんですが、この対応によってエモーティコン排除できるようになりました。 早速コードに反映してあります。