Anacondaの仮想環境が作られる標準のディレクトリを変更する

Anacondaconda コマンドでは、いわゆる仮想環境を作成することで任意のバージョンの Python やパッケージの組み合わせを一つの計算機で共存させることができる。今日は、その仮想環境のファイル群を配置する標準のディレクトリを変更する方法について書いておく。

続きを読む

Windows 10、コマンドプロンプトのTabキーでの補完を有効化する

Windows 10を初期化して再セットアップしたところ、コマンドプロンプトで Tab キーでコマンドラインの補完が行われなくなっていた。そこで修復方法をネットで調べたところ、レジストリを編集すれば治せるらしいとのこと。

具体的な手順は以下の通り:

  1. レジストリエディタで以下のキーを開く HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
  2. REG_DWORD 型の CompletionChar9 (タブ文字の ASCII コード) を設定する

f:id:sgryjp:20181102124041p:plain

最近は PC 環境の大半をクラウドサービスに移行していて、OS の初期化も気軽に行えるようになった。それでも細々とした再設定などは無くならないものだね。

バッチファイルでの引数解析例

Windows バッチファイルは過去の遺物(レガシー)。決別したくとも決別できないし、依然として Windows での手軽なバッチ処理実現手段でもあるため、新しく「書き捨て」したりメンテが発生したりする。今日、少し前に書いたバッチにコマンドライン引数を解釈する処理を付ける機会があった。これを、ある程度汎用的にしたものを Gist 化しておいたので以下に引用。

続きを読む

コマンド出力をgrepでキーワードハイライトする

Linuxでターミナルに出力されるメッセージのうち特定のキーワードやパターンに色を付けて表示したいことがあると思う。例えばコマンドの長いヘルプメッセージのうち特定キーワードをハイライトしたい…など。こんな時に良い方法は無いものかと調べたところ、なんと、grep コマンドで実現できるらしい。

いわく、『ハイライトしたいパターン または $(行末)grepすれば良い』とのこと。行末にマッチさせるために正規表現指定は必須。なるほどだ。

たとえば Go 言語で失敗した単体テスト項目を見つけやすくするには:

go test -v | grep -e '(FAIL|$)'

他にも、エラーや警告に気付きやすい形でログの目視監視をしたければ:

tail -f log.txt | grep -e '(ERR|WARN|$)'

コンソール出力のハイライト専用ツールがあるのは知っていたけれど、なぜ標準的なLinux環境にどれも入っていないのかと思っていたら、grepで良かったんだな。灯台下暗し。

GolangのSSL/TLS機能は自前実装らしい

比較的新しい言語では当然のようにSSL/TLS通信の機能が標準ライブラリに含まれている。てっきり、それらの実装はOpenSSLなのだろうと思っていたのだけれど、驚いたことにGo言語のライブラリはOpenSSLを使わず自前実装しているらしい。

上記のスレッドでは自前実装の動機について質問されており、Rob Pikeからの回答には非常に重要な指摘が含まれている:

Moreover, Go is safer and cleaner and I would argue therefore a safer language for writing crypto code than C or C++.

そうだよなぁ、C/C++を10年以上使って苦労してきた自分の経験からしても、これは真だと思う。メモリー領域へのフリーダムなアクセスを、コンパイル時・ランタイム時に完全に防止できない処理系では、コーディングミスによって致命的な脆弱性問題を作り出してしまうリスクを負い続ける。熟練工でも気を使う問題なので生産性に悪影響を及ぼすし、未熟な技術者ならば詳細なコードレビューが必要になるし、このリスクは様々なデメリットを生み出しているように思う。もちろん脆弱性問題はメモリー不正アクセス以外のミスから作られることもあるけれど、もっともタチの悪いこの種のミスを未然防止できればC/C++での開発がどんなに良くなるか。…まあ、もうC/C++がこの点を改善する可能性は無いと思っているんだけれども。

sudo clushでUbuntuクラスターを管理する

Ubuntuなど最近のLinuxではroot(スーパーユーザー)でのログインを基本的に行わせず、かつrootのみ実行可能な管理コマンドはsudoを通して使わせる思想のものが多い。このrootユーザーを直接的に使わない思想を守りつつ、クラスターを構成する多数のノードを ClusterShell (clush) で管理する方法を調べてみた。その結果行き着いた自分なりのベストな解は「sudoclushで投げる代わりにclushsudoする」。たとえば次のように管理コマンドを投げられるようにする:

sudo clush -w worker[1-3] shutdown -r now
続きを読む