月別アーカイブ: 2015年3月

MonoでC#のコンパイル

C#で簡易的なツールを作ったとき、Xamarin Studioとかでコンパイルはできる。
できるが、ソリュージョンとして作るほどのものでもないしなぁ・・・ということが多い。

コマンドからMonoでコンパイルできないかな、と思ったら案の定できることがわかった。

ちなみに、参照追加が必要なコードの場合はオプションで追加できる。
例えば、僕はSystem.Xml.Linqをusingするコードをコンパイルしたかったので、以下のようにした。

何という内容の無さ。

「善意の半強制イベントが嫌い」という話から、よくわからない展開になってしまった実りのない雑記

何となく、心のなかで思っていたことを書き記してみる。
思考の言語化に近いので、支離滅裂な内容かもしれない。
思考自体、基本的に感情的で、非論理的なものだから、仕方ないと予防線を張っておく。

書き記したことに特にきっかけがあった訳ではない。
むしろ逆で、きっかけが無いからこそかける。
何かきっかけがあって書いたら、何だか自分を曝け出しすぎているようで、恥ずかしい。

さて、僕は送別会とか、誕生日パーティとか、そういうものがあまり好きではない。

こう言うと誤解を受けそうなので訂正しておく。
個人的な友人を祝ったりとか、そういうことは大好きだ、
ただ、学校のクラスとか、会社の部署とか、そういう単位で開かれるそれが嫌いなのだ。
こんな感覚自体は昔から持っていたが、具体的な思想押して持つようになったのは高校生ぐらいのときからだと思う。

クラスの女子の誰かが、「誕生日の人がいたら、昼休みに祝おう」なんてことを言い出した。
この時点でウエッと思った。どうせ思いつきで、すぐに面倒くさくなるだろう。
その予想は見事にあたって、6月ぐらいになることには無かったことになっていた。

そこで思った。
これ、祝われない人の気持ちを一切考えていないな、と。
6月以降の人はまだいい。実際は4,5月でも祝われていない人がいるかも知れない。
その気持を考えると少し憂鬱になる。
祝って欲しい訳ではない。
しかし、同じ立場の者が祝われて、自分が祝われない。これは気分のいいものではないだろう。

クラスという単位で祝う以上、そこに例外が生まれてはいけないのだ。
しかし、じゃあ仮に全員が祝われるようになったらどうだろう。

やっぱり嫌だ。祝われたい人ばかりではないだろう。
今で言えばFacebookに勝手にタグ付けされて自分の写真がアップロードされるようなものだ。
「写真アップロードされれば嬉しいじゃん」とかいう単純な精神構造の人ばかりではないのだ。

大体、クラスというのは仲良しグループが集まったものではない。別に関わりのない人も居る。
その事自体は問題ない。むしろ自然だ。
だからこそ、システム的には全員平等、最低限の繋がりのみで構成されるべきだと思う。
あまり知らない人のことを祝うことに苦痛を感じないのだろうか。
少なくとも、僕は苦痛に感じる。
そして、逆の立場で、関わりのない人に祝われるのも、いい気分ではないだろう。独裁者のサイコパスじゃあるまいし。
お互い、なんの利益もない。何だこの苦痛。

そんな風にある程度、昔から思っていた感情を言語化出来た。それが高校生のときだった。

ついでに言いすぎておくと、送別会とか、こういうイベントで、食事に行くことって、本当に楽しいのだろうか。
僕は捻くれているのか、「え?送別するのに何で飯行くの?酒飲むの?」とか思ってしまうのだ。
普通に見送ればいいじゃない。
或いは移動先の情報とか教えてあげるほうが、遥かにありがたいだろう。

「コミュニケーションとしての食事を全否定かよ」と言われると思う。
概ねその通りだ。
「話すこと実際無いんじゃね?だから簡単に挨拶するぐらいでいいと思うよ」という感じだ。

食事しながら話すことはお互いに分かり合うための基本(口実)らしいが、そもそもみんながみんなと分かり合うなんて、疲れないだろうか。
もっと、人はそれぞれが孤立していたほうがいいと思う。

よく「まずは一緒に食事に行って仲良くなる」と言うが、一緒に食事って、俺の中では相当ハードルが高いのだが、如何だろうか。
食事なんて仲の良い友達とぐらいしか行かないし、そうでなくてはとても楽しめない。
初対面の人となんて、絶対にできない。
「仲良くなってから一緒に食事に行く」という流れが自然だと思っている。
「まずは一緒に食事に行って仲良くなる」という発想は「一緒に食事に行く人とは仲の良い人のことだ。だから一緒に食事に行けば仲良く慣れる」という仮定と結論が逆転した一種の帰納的思考法から導き出された詭弁にしか、僕には思えないのだ。

合コンや街コンって本当に楽しいのだろうか。
この歳になっても、狂気の沙汰にしか感じられないのだけど。

ちなみに、こんな思想を持った結果、出会いがこの歳まで一切なく来てしまった。
そして、「出会いとかいらないな」という思想に至りつつある。
こうなりたくないなら、上記に似たような思想は捨てた方がいい。

一般的な幸せを目指すなら、一般的な感性と思想が大切だ。

Macでファイルを定期的にバックアップする設定

僕はiTunesのメディアファイルを始め、動画、画像ファイルを全て外付けのHDDに保存して管理している。
昔はNASだったんだけど、引っ越してから無線の速度が遅くなったので単純な外付けHDDに回帰した。

で、それはいいんだけど、最近ファイルが壊れていたりすることに気付いた。
古いHDDのせいだろうか。
幸か不幸か、大して重要じゃないファイルなのでよかったが、流石にこの大容量の資産にバックアップがないこの状況が少し怖くなってきた。
今までもたまに気が向いたときに別の外付けHDDにバックアップを取ったりしていたが、気が向いた時だけじゃ心もとなさ過ぎる。
バックアップを毎晩、自動実行しようと思うに至った。

で、Windowsのようにrobocopyコマンドを使おうとしたけど、当然Macにはrobocopyなんてコマンドは無い。
その上、定期実行しようにもWindowsで言うタスクスケジューラが無い。Windows脳の僕はこれで少しパニックになった。

そんな色んな障害を乗り越えた(乗り超えるほど大きい壁じゃない)作業メモを残そうかなと思う。
なお、前提として僕はシェルスクリプトなんて書いたこともない素人である。
cron?良くワカンネ」というレベルである。
実際、良くわからなくて今回使わなかった。今度また挑戦する。


1. バックアップを行うコマンド(シェルスクリプト)を書く

最悪手動でも、バックアップを1クリックで行えるコマンドファイルを作成できれば、
Macでバッチファイル的なものを作成する
のようにして1クリックバックアップシステムが作れるはず。
まずはバックアップを行えるようなコマンドを探した。

2秒で見つかった。

rsync

差分更新まで行ってくれるイカした奴。
僕の望む同期の形を考え、以下のようなオプションを設定した。

-a…元の権限を保持する
-t…元のタイムスタンプを保持する
-u…追加、更新されたファイルだけをコピーする
-v…処理中の経過ファイルを表示する(後述のログ出力のため)
–delete…コピー元にないファイルがコピー先にあった場合、削除する

要するに、バックアップ元と寸分たがわぬ構成をコピーする、という趣旨だ。
それで、最初は単純に以下のような1行コマンドで済ませていた。

だけど、あんまり好きじゃない点が一つあった。
Macで外付けHDDに接続した場合、”.”から始まる不可視ファイルが作成されるが、これらまでバックアップ先にコピーされてしまう。
なので、バックアップ元の外付けHDD内の通常フォルダのみに対してrsyncを行うようなコマンドに修正した。
ついでにrsyncの出力をログとしてファイルに残すようにした。

これでバックアップ元HDD直下のフォルダについて、全てバックアップ先にコピーされる。
ただ、上記スクリプトの欠点は、バックアップ元HDD直下にスペースを含むフォルダが有る場合、上手く動作しないことだ。
つまり、”test folder”というフォルダがあると、”test”と”folder”という2フォルダと認識されてしまう。
工夫すればどうにでもなると思うけど、スクリプトをシンプルにしたかったのでこのままにしておいた。
工夫する知識も気力も無いです。

2. シェルスクリプトを定期実行する

さて、スクリプトはできたが、定期実行はできるのか。
ちゃんとやるならcronやlaunchで設定するのが良いらしい。
でも、よくわからないので、原始的な方法を採った。
Macの標準カレンダー(旧iCal)とAutomatorを用いる方法だ。

MacのAutomatorで新規作成を行う。
書類の種類は「カレンダーアラーム」にする。(アプリケーションでも良い。その場合は後述の設定が必要)
アクションで、「ユーティリティ」→「シェルスクリプトを実行」を選択する。
上記のスクリプトを記述し、保存する。

以上により、Macの標準カレンダーにイベントが登録される。
時刻や繰り返しの設定を適宜変更すれば、定期タスクの設定が簡単に可能だ。

ちなみに、「カレンダーアラーム」でなく、「アプリケーション」を作成した場合、appファイルが作成される。
このappファイルを開くと、シェルスクリプトが実行されるので、後はこのappを定期的に実行するように、手動で標準カレンダーに登録すれば良い。
カレンダーで普通にイベントを追加し、
「通知」→「カスタム」を選択する。
初期状態では通知が「メッセージ」となっていると思うので、ここを「ファイルを開く」にする。
ファイルの種類がカレンダーになっているので、ここで「その他」を選択し、先程のappファイルを選択する。
2015-03-02 22.53.29
ちなみに、GoogleカレンダーやiCloudのカレンダー等、クラウド上のカレンダーではこの通知の設定が保存されなかった。
未検証だが、クラウド上と動機する過程で「ファイルを開く」通知が消えてしまうのだろう。
ローカルのMac上のイベントとして設定したほうが確実だ。

後は時刻や繰り返しを設定することで、定期的にスクリプトが実行できる環境が完成する。

基本的に「カレンダーアラーム」で設定したほうが簡単だと思う。
ちなみに「カレンダーアラーム」で作成した場合、そのappファイルは以下の場所に保存されている。
/Users/UserName/Library/Workflows/Applications/Calendar
appファイルを常に手元においておきたい場合は「アプリケーション」で作成するのもありだと思う。

・参考にしたページ
rsync – 高速なファイル同期(バックアップ) – Linuxコマンド
iCalで指定時刻にアプリを呼び出す
【Linux】bashで指定したディレクトリ内のファイルを取得する
lsでディレクトリのみ,ファイルのみ,表示する


追記(2015/05/30)

定期実行でカレンダーを使うのは負けた気がしてきたので結局launchdを使うことにしました。
MacでScriptを定期実行する方法