雑録

目次

キーボード割り当て変更

プログラマにとって、キーボードは主要な入力方法です。コンピュータについて様々なカスタマイズができるように、キーボードについても様々な設定ができます。(そして、それには設定する価値があります。)

最も基本的な変更は、キーボードのキー割り当てを変更することです。 この変更は、通常、あるキーが押されるたびに、このイベントに割り込み、別のキーに対応する別のイベントに置き換えます。例を以下に示します。

また、キーを任意のコマンドに対応付けることもできます。これは、頻繁に行うタスクを実行させたい時に便利です。ここでは、何らかのソフトウェアが特定のキーの組み合わせを待ち受け、その入力イベントが検出されるたびに何らかのスクリプトを実行します。

さらに複雑な割り当て変更も可能です。

このトピックを開始するためのいくつかのソフトウェアリソースを紹介します。

デーモン

デーモンという言葉は新しい言葉のように感じるかもしれませんが、あなたはすでにデーモンという概念になじんでいるでしょう。 ほとんどのコンピュータには、ユーザが起動して操作するのを待つのではなく、常にバックグラウンドで実行されている一連のプロセスがあります。 これらのプロセスはデーモンと呼ばれ、デーモンとして実行されるプログラムは、そのことを示すために d で終わることが多いです。 例えば、SSHデーモンである sshd は SSHのリクエストを待ち受けて、リモートユーザがログインに必要な資格を持っているかどうかを確認するプログラムです。

Linuxでは、systemd(システムデーモン)がデーモンプロセスを実行、設定するための最も一般的な方法です。 現在実行中のデーモンを一覧表示するために systemctl status を実行することができます。 ほとんどのデーモンはなじみがないように感じるかもしれませんが、ネットワークの管理、DNSクエリの解決、GUIの表示など、システムのコア部分を担当しています。 Systemd は enable, disable, start, stop, restart, あるいはサービスの status をチェックするために systemctl コマンドとやりとりをすることができます(これらは systemctl コマンドです)。

さらに興味深いことに、systemd は新しいデーモン(またはサービス)を設定し、有効にするための、とても扱いやすいインタフェースを持っています。 以下はシンプルなPythonアプリケーションを実行するためのデーモンの例です。 詳細は省略しますが、ほとんどのフィールドは自己説明的なものです。

# /etc/systemd/system/myapp.service
[Unit]
Description=My Custom App
After=network.target

[Service]
User=foo
Group=foo
WorkingDirectory=/home/foo/projects/mydaemon
ExecStart=/usr/bin/local/python3.7 app.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

また、特定の頻度でプログラムを実行したいだけならば、独自にデーモンを構築する必要はなく、システムがすでに実行しているデーモンである cron を使うことで、スケジューリングされたタスクを実行することができます。

FUSE

現代のソフトウェアシステムは通常、小さなブロック構造を組み合わせて構成されています。 オペレーティングシステムには、ファイルシステムがどのような操作をサポートするかという共通規格があるため、異なるファイルシステムのバックエンドの使用がサポートされます。 例えば、ファイルを作成するために touch を実行すると、touch はそのファイルの作成のためにカーネルにシステムコールを発行し、カーネルは適切なファイルシステムコールを発行して指定されたファイルを作成します。 注意点として、UNIXファイルシステムは伝統的にカーネルモジュールとして実装されており、カーネルのみがファイルシステムコールの発行を許されているということです。

FUSE (Filesystem in User Space) を使うと、ファイルシステムをユーザプログラムで実装することができます。 ユーザはファイルシステムコールのためにユーザ空間のコードを実行し、FUSEは必要なシステムコールをカーネルインタフェースへと「橋渡し」します。 これは事実上、ユーザがファイルシステムコールに対して任意の機能を実装できることを意味します。

例えば、FUSEを使うと、仮想ファイルシステムで操作を実行するときはいつでも、その操作をSSH経由でリモートマシンに転送し、そこで実行し、その出力を自分に返すことができます。 このようにして、ローカルのプログラムは、実際にはリモートサーバにあるファイルを、あたかも自分のコンピュータにあるかのように扱えます。 これは実質的に sshfs が行っていることです。

FUSEファイルシステムの興味深い例をいくつか紹介します。

バックアップ

バックアップされていないデータは、いつか永遠に消えてしまうかもしれません。 データをコピーするのは簡単ですが、データを確実にバックアップするのは難しいものです。 ここでは、バックアップの基本的な方法と、いくつかのアプローチの落とし穴について説明します。

まず、同じディスク内でデータをコピーすることはバックアップとは言えません。なぜなら、ディスクはすべてのデータの単一障害点だからです。 同様に、自宅の外付けドライブも、火事や強盗などで失われる可能性があるため、バックアップ手段としては不十分です。むしろ、オフサイトでバックアップをとることをお勧めします。

オンラインストレージでの同期もバックアップではありません。例えば、DropboxやGDriveは便利な手段ですが、データが消去されたり破損したりすると、その変更が伝播してしまいます。 同じ理由で、RAIDのようなディスクのミラーリングもバックアップではありません。データが削除されたり、破損したり、ランサムウェアで暗号化されたりした時に役に立たないからです。

優れたバックアップ手段の中核となる機能は、バージョン管理、重複排除、セキュリティです。 バージョン管理されたバックアップでは、変更履歴にアクセスして効率的にファイルを復元することができます。 効率的なバックアップ手段は、データの重複排除を使用することで増分の変更のみを保存し、ストレージのオーバーヘッドを削減します。 セキュリティに関しては、データを読み取ったり、さらに重要なこととして、すべてのデータや関連するバックアップを削除したりするために、他人が何を知っていたり持っていたりする必要があるのかを点検すべきです。 最後に、バックアップを盲目的に信用するのはよくない考えで、バックアップを使ってデータを復旧できるかどうかを定期的に確認する必要があります。

バックアップは、コンピュータ内のローカルファイルだけに留まりません。 ウェブアプリケーションの大幅な増加に伴い、大量のデータがクラウドに保存されるようになりました。 例えば、ウェブメール、ソーシャルメディアの写真、ストリーミングサービスの音楽プレイリスト、オンラインドキュメントなどは、対応するアカウントにアクセスできなくなると消えてしまいます。 このような情報のオフラインコピーを持つことが望ましく、これらのデータを取得して保存するために有志が作ったオンラインツールが提供されています。

より詳しい説明は、2019年の講義ノート バックアップ を見てみてください。

API

この授業では、コンピュータをより効率的に使って ローカル なタスクをこなすことについて多くのことを説明してきましたが、これらの学びの多くは、より広いインターネットにも当てはまることがわかります。 インターネット上のほとんどのサービスは、そのデータにプログラムでアクセスできる「API」を持っています。 例えば、アメリカ政府は天気予報を取得するためのAPIを持っており、これを使えば自分のシェルで簡単に天気予報を取得することができます。

これらのAPIのほとんどは、似たフォーマットを持っています。 APIは構造化されたURLであり、多くの場合、api.service.comをルートとしており、パスとクエリパラメータは、読みたいデータや実行したいアクションを示します。 例えば、米国の気象データの場合、特定の場所の予報を取得するには、https://api.weather.gov/points/42.3604,-71.094 に GET リクエスト(例えば curlを使用)を発行します。 レスポンス自体には、その地域の特定の予報を得ることができる他のURLのまとまりが含まれています。 通常、レスポンスはJSONとしてフォーマットされており、これをjqのようなツールに通すことで、関心のある情報に変換することができます。

APIによっては認証が必要なものがありますが、この認証は通常ある種の秘密の トークン が用いられ、これをリクエストに含める必要があります。 APIのドキュメントを読んで、探している特定のサービスが何を使用しているかを確認する必要がありますが、「OAuth」はよく使われるプロトコルです。 本質的には、OAuthは特定のサービスで「自分のように振る舞う」ことができるトークンを与え、特定の目的のためにのみ使用できるようにする方法です。 このトークンは 秘密 のものであり、あなたのトークンにアクセスした人は、 あなたの アカウントでトークンが許可したことは何でもできるということを覚えておいてください。

IFTTTは、APIのアイデアを中心としたウェブサイトとサービスです。膨大な数のサービスとの統合を提供し、それらのサービスからほぼ任意の方法でイベントを連鎖させることができます。 ぜひ一度見てみてください。

一般的なコマンドラインのフラグとパターン

コマンドラインツールには様々な種類があるため、使用する前にそれぞれの man ページを確認することを推奨します。 しかし、これらのツールには共通の機能がありますので、知っておくとよいでしょう。

ウィンドウマネージャ

多くの人は、WindowsやmacOS、Ubuntuにデフォルトで搭載されているような「ドラッグ&ドロップ」式のウィンドウマネージャを使い慣れているでしょう。 ウィンドウは画面上にただ単に散らばっており、それらをドラッグしてサイズを変えたり、重ね合わせたりすることができます。 しかし、これは「フローティング」ウィンドウマネージャと呼ばれるウィンドウマネージャの1つの 種類 に過ぎません。 特にLinuxでは、他にもたくさんの種類があります。 特によく使われるのは、「タイリング」ウィンドウマネージャです。 タイリングウィンドウマネージャでは、ウィンドウは決して重ならず、tmuxのペインのように画面上にタイル状に配置されます。 タイリングウィンドウマネージャでは、画面は常に開いているウィンドウで埋め尽くされ、何らかの レイアウト に従って配置されます。 1つのウィンドウを開くと、それが画面全体を占めます。 次に別のウィンドウを開くと、元のウィンドウはそれに合わせて縮小されます(多くの場合、2/3と1/3のように)。 3つ目のウィンドウを開くと、他のウィンドウは新しいウィンドウに合わせて再び縮小します。 tmuxのペインと同じように、キーボードでこれらのタイル状のウィンドウを操作することができ、マウスを使わずにウィンドウのサイズを変更したり、移動させたりすることができます。 使ってみる価値はありそうですね!

VPN

最近、VPNが流行していますが、それが正当な理由であるかどうかは明らかではありません。 VPNが何をしてくれて、何をしてくれないのかを知っておく必要があります。 VPNは最良の場合では、インターネットに関する限り、 実際のところ インターネットサービスプロバイダー (ISP) を変更する方法に過ぎません。 すべてのトラフィックは、あなたの「実際の」場所ではなく、VPNプロバイダーから来ているように見え、あなたが接続しているネットワークは、暗号化されたトラフィックだけを見ることができます。

これは魅力的に見えるかもしれませんが、VPNを使用する際に実際に行っていることは、あなたの信頼を現在のISPからVPNホスティング会社に移しているだけだということを覚えておいてください。 あなたのISPが見ることが できた ものは、VPNプロバイダーが 代わりに 見ることになります。 もし、あなたがISP よりも VPNプロバイダーを信頼しているのであればそれは成果ですが、そうでなければ、あなたが得たものは明らかではありません。 空港で暗号化されていない危険な公衆無線LANを利用している場合は、その接続をあまり信用していないかもしれませんが、自宅ではそのトレードオフはそれほど明確ではありません。

また、最近では、少なくとも機密性の高いトラフィックの多くは、HTTPSやTLSを通じて既に暗号化されていることを知っておくべきでしょう。 この場合、あなたが「悪い」ネットワークを利用しているかどうかは、通常はほとんど問題になりません。– ネットワーク事業者は、あなたがどのサーバーと通信しているかを知るだけで、やり取りされているデータについては何も知りません。

前述の「最良の場合」という言葉に注目してください。 VPNプロバイダーがソフトウェアの設定を誤って、暗号化が弱くなったり、完全に無効になったりすることは、決して珍しいことではありません。 また、VPNプロバイダーの中には、悪意のある(あるいは、少なくともご都合主義の)会社もあり、あなたのトラフィックをすべて記録し、その情報を第三者に販売する可能性もあります。 悪いVPNプロバイダーを選ぶことは、そもそもVPNを使わないことよりも悪いことが多いのです。

ピンチの時には、MITが学生向けにVPNを運営しているので、見てみる価値はあるかもしれません。 また、自分で構築するのであれば、WireGuardを検討してみてください。

Markdown

キャリアの中で何らかの文章を書く機会は多いでしょう。 そして、そのテキストを簡単な方法でマークアップしたいと思うことがよくあります。 例えば、テキストを太字や斜体にしたり、ヘッダーやリンク、コードフラグメントを追加したいことがあります。 WordやLaTeXのような重いツールを持ち出す代わりに、軽量マークアップ言語Markdownの使用を検討してみてはいかがでしょう。 Markdownはすでに見たことがあるでしょうし、少なくともそのいくつかのバリエーションは見たことがあるでしょう。 そのサブセットは、Markdownという名前でなくても、ほとんどどこでも使用され、サポートされています。 Markdownの核心は、人々がプレーンテキスト文書を書くときにテキストをマークアップする方法をコード化しようとするものです。 強調 (italics) は、単語を * で囲むことで追加されます。 強い強調(ボールド)は ** を使って加えられます。 # で始まる行は見出しです(#の数が小見出しのレベルです)。 - で始まる行は箇条書きリストの項目で、数字 + .で始まる行は番号付きリストの項目です。 バッククォートは、コードフォントで単語を表示するために使われ、コードブロックは、行を4つのスペースでインデントするか、3つのバッククォートで囲むことで入力できます。

```
コードをここに書く
```

リンクを貼る場合は、[name](url) のように角括弧の中にリンク先の テキスト を入れ、その直後にURLを括弧で囲みます。 Markdownは簡単に使い始めることができ、ほとんどどこでも使用することができます。 実際、この講義のレクチャーノートや他のすべての講義はMarkdownで書かれており、生のMarkdownをここで見ることができます。

Hammerspoon (macOS用のデスクトップ操作自動化ツール)

Hammerspoonは、macOS用のデスクトップ操作自動化フレームワークです。 OSに機能的につながるLuaスクリプトを書くことができ、キーボード/マウス、ウィンドウ、ディスプレイ、ファイルシステムなどを操作することができます。

Hammerspoonでできることの例をいくつか挙げます。

高いレベルでは、Hammerspoonはメニューボタンやキープレス、イベントに紐付けられた任意のLuaコードを実行することができ、Hammerspoonはシステムと対話するための広範なライブラリを提供しているので、基本的には何をするにも制限はありません。 多くの人がHammerspoonの設定を公開しているので、インターネットで検索すれば必要なものは大体見つかりますが、自分でゼロからコードを書くこともできます。

参考資料

ブート + Live USB

マシンが起動すると、OSがロードされる前に、BIOS/UEFIがシステムを初期化します。 このプロセスでは、特定のキーの組み合わせを押すことで、このレイヤーのソフトウェアを設定することができます。 例えば、コンピュータは起動中に「Press F9 to configure BIOS. Press F12 to enter boot menu.」のようなことを出力するでしょう。 BIOSメニューでは、あらゆる種類のハードウェア関連設定を変更することができます。 また、ブートメニューに入ると、ハードディスクの代わりに代替デバイスから起動することができます。

Live USBとは、OSが入ったUSBメモリのことです。 OS(例:Linuxディストリビューション)をダウンロードして、フラッシュドライブに書き込むことで作成できます。 このプロセスは、単に .iso ファイルをディスクにコピーするよりも少し複雑です。 UNetbootinのような、Live USBの作成に役立つツールもあります。 Live USBは様々な目的に役立ちます。 とりわけ、既存のOSの構造が壊れて起動しなくなった場合、Live USBを使ってデータを回復したり、OSを修正したりすることができます。

Docker, Vagrant, 仮想マシン, クラウド, OpenStack

仮想マシンやコンテナのようなそれと似たツールを使うと、OSを含むコンピュータシステム全体をエミュレートすることができます。 これは、テスト、開発、または実験(悪意のあるコードを実行するなど)のために隔離された環境を構築するのに便利です。

Vagrantは、マシンの構成(OS、サービス、パッケージなど)をコードで記述し、単純な vagrant up で仮想マシンをインスタンス化することができるツールです。 Dockerはコンセプト的には似ていますが、代わりにコンテナを使用します。

また、クラウド上で仮想マシンをレンタルすることもでき、これはすぐに利用できる良い方法です。

人気のあるサービスとしては、Amazon AWSGoogle CloudMicrosoft AzureDigitalOceanなどがあります。

MIT CSAILのメンバーであれば、CSAIL OpenStack instanceを通じて、研究用の仮想マシンを無料で手に入れることができます。

ノートブック型プログラミング環境

ノートブック型プログラミング環境は、ある種のインタラクティブな開発や実験的な開発を行うのにとても便利です。 おそらく現在最も人気のあるノートブックプログラミング環境は、Python(および他のいくつかの言語)用のJupyterでしょう。 また、Wolfram Mathematicaは、数学指向のプログラミングを行うのに適したノートブック型プログラミング環境です。

GitHub

GitHubは、オープンソースソフトウェア開発のための最も人気のあるプラットフォームの1つです。 vimHammerspoonなど、このクラスで紹介したツールの多くはGitHubでホストされています。 毎日使うツールをより良くするために、オープンソースへの貢献を始めるのは簡単です。

GitHubでプロジェクトに貢献するには、主に2つの方法があります。


このページを編集する

Licensed under CC BY-NC-SA.