コマンド出力を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
続きを読む

高速なSQLでのデータ分析を目指す場合、Hadoop系の技術を使ってHDFSにORCやParquet形式でテーブルを格納してHive、Presto、Spark SQLでクエリーする方向と、ある意味素直にPostgresSQLで分析 (analytic use case) 向けの構成でクラスターを組む方向があるようなのだけれど、どっちが良いのかよく分からない。

何となく、それぞれの説明で出てくるクラスターノード数から憶測するに、性能のスケール具合は前者が、構築容易性は後者が優れていそうな印象ではある。確かめるのは、なかなか難しいね。さてはて、どうしたものか。

Ubuntu Server 16.04でNFSを設定する

NFS (Network File System) を設定する手順を調べたので備忘録。Ubuntu Server と題には書いているけれど、他の Linux でも同じだと思う。

要点

  • サーバー側は
    • nfs-kernel-server パッケージをインストールし、
    • /etc/exportfs で公開するディレクトリをオプションとともに宣言した後、
    • sudo exportfs -ra で設定を有効化する
  • クライアント側は
    • nfs-common パッケージをインストールし、
    • mount コマンドの -t (--type) オプションに nfs を指定しつつ、
    • マウント元として server_addr:/path/to/the/dir と指定してマウントする

設定手順例

サーバー earth/srv/nfs を、クライアントマシンの /mnt/earth にマウントする場合、次のような手順となる:

サーバー側

sudo apt install nfs-kernel-server
echo '/srv/nfs (rw,sync,no_subtree_check)' | sudo tee -a /etc/exportfs
sudo exportfs -ra

クライアント側

sudo apt install nfs-common
sudo mount -t nfs earth:/path/to/the/dir /mnt/earth

/etc/exportfs に指定するオプション(上の例でいう syncno_subtree_check など)については man exports で詳細を確認できる。

Ubuntu Server 16.04でCUIの解像度を変更する

VirtualBox + Ubuntu Server 16.04 で、X (GUI) を使わない CUI 状態での解像度を変更する方法を調べたので備忘録。

続きを読む

HDD 2台を搭載するLinux機でOSが起動せず困った話

久しぶりに Linux サーバーの構築をやることになり、ローレベルなところでハマってしまったので備忘録。

続きを読む