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

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

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ブログ

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

とある蕎麦屋での話

前職の営業研修の折、外回りのさなか、とある駅の近くの蕎麦屋でお昼を食べたことがあった。蕎麦自体はあまり美味くなかった記憶があるが、昼間の住宅地の中で傍目にも着なれていないリクルートスーツ姿の自分が入ってきたのが珍しかったのか、気さくな店主が声をかけてくれた。

聞けば、七十過ぎのその店主は、大学は東京六大学の一角を出たものの、家族の事情で蕎麦屋を継がざるを得なかったのだという。 本当ならば、銀行などで働きたかったが、気付けばこうして蕎麦屋をやっている。それでも、なかなか周りが大学にいけなかった時代に大学まで通わせてくれた親に報いたく必死に学は積んだつもりで、それは忘れたくはなく、故に今に至るまで日々読書を欠かしたことはないという。 仕事の合間、時間があるときにはさまざまな本を読み、気になる語句や漢字があれば、メモをとってあとでまた調べるという生活をしてきた。そして、たまに来る友人や蕎麦屋の客と、たとえば自分のような客といろんな話で盛り上がりたいのだそうだ。

私が新潟は長岡の大学の出身だということを言うと、ああ、あそこには西と東に山があってその上の大学だね、長岡には行ったことはないがよく話してくれるやつがいたり、地図を見たりして知っているよ、と嬉しそうに話してくれた。

ひとしきり蕎麦を食べ終え、店を出るときに、店主が今日話してくれたお前さんにぴったりの言葉を送るよと、胸ポケットから取り出した紙に「魭断」の二文字を書いて渡してくれた。 意味も出典も明かさないから、時間があれば自分で調べてみなさいという。今ならインターネットとかもあるだろうし、すぐ見つかるだろうとのことだった。

店を出た後、さっそくネットで調べたものの全く日本のページはヒットしない。中国語のサイトはかろうじて引っかかるものの、機械翻訳をかけてみても意味がよく分からない。しかし、よく読むと "庄子・天下" というものがちらほら見える。 さらに調べると、これは日本の漢字で言うところの「荘子・天下」ということであった。

家に帰った僕は"荘子 天下篇"の納められた、岩波文庫の「荘子 第四冊 雑篇」を購入し読んでみた。以下の一節に目的の言葉は記されていた。

常に人に反し、観を聚めず、而して魭断を免れず。

文章として意味としてはそんなによくはない。「魭断」という言葉単体の意味とすれば、「丸くする。摩擦を減らす」といった意味になるようだ。果たして、僕は丸いのだろうか。自分では判断がつかないが、店主はそう思ったのだろうか。そのときはそれで終わりだった。荘子も買っただけ。結局は持っているのは第四冊だけだし(他に第一冊から第三冊まである)。

その後しばらくして、僕は新潟にもどってきた。その転職・引っ越しのころ、さまざまなことが重なって、悲しく辛い気持ちになったことがあった。自分がどうすればいいのかもよくわからない状態で正直苦しかった時期であった。「なにすべきなのか、あのとき自分はどうすべきであったのか」そんなことばかりが頭に浮かび、悔いても悔やみきれない日々が続いた。そして、僕がそうなった原因の一つとしては、冒頭に出てきたとある駅とも絡む、ある事情によるところが大きいのであった*1

そんな折に、老荘思想というものを知った。いや、以前から名前は知ってはいたが、概要を知って少しだけ今までよりも調べてみることにしたのであった*2。そこには、もっと力抜いて生きろよ的なことが書いてあった(と思う。すごく乱暴な解釈だ。厳密には老子の方はよくわからない。深いのか、ただあまのじゃくなのか、僕には判断がつかない)。 それは、僕が悩んでいることの小ささというか、そういったことを気付かせてくれる一因になったと思っている。結果として(他の要因も絡むものの)だいぶ心は楽にすることができたのである。

とある駅の蕎麦屋がきっかけで知った荘子が、同じ駅を舞台にどうしようもない気持ちになった僕を救う一因となったのは、ただの偶然なのだろうと思う。しかしながら、たった、1年5ヶ月という短い東京生活のなかで、こういったことを経験できたのは、僕自身は非常に不思議だなと感じた次第である。

おそらくその駅へは、しばらく、いや、ともすればもう二度と行くことはないのだろうが、もし、この先、降り立つことがあったとき、僕はもっと”丸くなれている”のだろうか、とふと思ったりした。

急に思い出してどこかに書きたくなった、そんな東京での思い出。

*1:なお、蕎麦屋とは全く関係ない

*2:もともと兵法書とか、諸子百家の書物なんかには興味があった。

ファンクションポイント法でシステムの見積もりをしてみた

必要に迫られて、会社のシステムの一部の規模をファンクションポイントで見積もりしてみた。

もちろん、内容は明かせないのだけど備忘録的にちょっとだけ書いてみる。

参考にしたのは下の本。

失敗のないファンクションポイント法

失敗のないファンクションポイント法

  • 機能を分解するための視点はユーザ視点
    • 一時データなど、ユーザから見て意識できないファイルのやりとりは機能としてカウントしない
    • これ一時データ?っていう時がよくある。Cookieは一時データ。
  • ファンクションポイントにおける「ファイル」とは、データのやりとりをするためにつかわれるもの全部

    • システム上DBもファイルに含まれる
  • 実際の計測時には、エクセルあたりでテンプレート作った方が良さそう

  • 単なるログイン機能でも、入力内容とユーザ情報が一致するかの照合時に暗号化/複合化とか含んでたら EQ ではなく EO になるのだろうかね。

  • アジャイル開発するときの事前見積もりでは絶対適用できない

    • 詳細設計書レベルの詳しい資料か、実際に動いてるものが無い限り無理だと思う
  • いくら UI とか UX などにこだわりがあっても―それがたとえ開発の9割の時間を占めていたとしても―、機能としてカウントされない以上、規模として見積もれないのはなんか不条理な気がする

自分が作ろうとしてるもの、詳細にやりたいことが決まっているのなら、力試し程度で見積もってから開発してみてもいいかなと思いました。

適宜時間があるときに追記していきます。

LuaSocketからはHTTPSでの通信ができない件

タイトル読んで字の如くなのですが、LuaSocket からは直接 HTTPS はたたけません。LuaSec を入れてからたたいてください。

なんでこんなことを書いているのかというと、YAMAHA のルータから HTTPS を叩きたかったから。YAMAHA のルータで Lua が動くのは有名ですが、LuaSec が入ってないので、直接 HTTPS を叩くのは厳しいんじゃないかなと考えてます。仕方ないので、適当な HTTPS プロキシを経由して HTTP 経由で叩けるようにするのが一番無難かな。

実際の YAMAHA ルータでの実証はしてないので、これからやるけどね。

前職を退職して、また現職に転職して3ヶ月が経ちました

師走ですね。新潟は寒いです。

前職を退職して、そして今の職場に移って3ヶ月が経ちました。本当なら9月の辞めた直後、または転職した直後に書こうと思っていたのですがタイミングを逸してしまい、次は普通の会社なら試用期間が終わるころの3ヶ月後かな、ということでこの時期になりました*1

まずは端的にご報告

8月末でインフラ系のエンジニアとして働いていた品川にあるN社を退職し、9月から地元・新潟のITベンチャー・ウォーターセル株式会社システムエンジニアとして働き始めました。

東京でお世話になった方々、本当にありがとうございました。新潟の方、ふたたびよろしくお願いします。また、こんなに報告が遅くなりまして、申し訳ございません。

端的な報告としては以上です。

*1:ちなみに今の職場で試用期間は?という質問をしたら、「それなら入社前に終わってるよ」( @Nkzn談)。どういうことなの…

続きを読む