いつでもご用意いたします。修正や整形したい文書がございましたら、ぜひテキストを貼り付けてくださいませ。

2026/02/05 4:59

いつでもご用意いたします。修正や整形したい文書がございましたら、ぜひテキストを貼り付けてくださいませ。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Summary

著者は個人用の

~/bin
ディレクトリを作成し、
$PATH
に追加してそこにシェルスクリプトを配置し始めました。システムバイナリが多くの共通小文字名(Debian/Ubuntu では約 21,733 個)を占有するため、名前衝突が頻繁に発生しました。角括弧・バックスラッシュ・コロン・バッククオート・シングルクォート・スラッシュ・ドットなどの特殊ファイル名文字はシェルで意味を持つか禁止されており、ファイル名として未使用なのはコンマだけでした。
著者はすべての個人用スクリプトにコンマをプレフィックス(例:
,complete-scp
,go-thpgp
,svn-store-password
)することで、自身のコマンドがシステムバイナリと衝突しないようにし、すべてのシェルでそれらを普通のファイルとして扱うようにしています。タブ補完は引き続き機能します;先頭にコンマを入力して
<TAB>
を押すと、カスタムスクリプト全体がリスト表示されます。この慣習は約十年にわたり使用されており、
~/bin
ディレクトリを管理する人には推奨されています。

本文

日付: 2009年8月18日
タグ: コンピューティング


多くの Unix ユーザーと同様に、私はずっと前から自分のホームディレクトリに

~/bin/
ディレクトリを作り、そこに置いたスクリプトや便利ツールを
$PATH
に追加しておりました。これにより、Unix の基本コマンド群を補完する形で、自作のシェルスクリプトやユーティリティを簡単に呼び出せるようになっています。

しかし問題は衝突の可能性でした。私が作成したスクリプト名は短く、低い文字だけのコンパクトなもの(例:

foo
,
bar
など)であるため、Linux が新しいコマンドを追加した際に同じ名前になってしまう恐れがあります。当時の System V Revision 3 ワークステーションではその可能性は低かったものの、Debian の世界に移行すると問題は大きく増しました。Red Hat は比較的少数のパッケージしか提供しないためあまり気になりませんでしたが、Debian では膨大な数のコマンドが存在します。私の Ubuntu ラップトップでも数千ものコマンドが利用可能です。

$ apt-file search -x '^/usr/bin/[^/]*$' | wc -l
21733

解決策は、システムコマンドと衝突しないように自分のコマンド名を調整することでした。私にとって「入力しやすい」とは Shift キーを使わずにタイプできることです。現代のキーボードで未修飾(unshifted)状態で利用可能な文字は非常に限られます。小文字はシステムコマンドに既に使用されているため、括弧・バックスラッシュ・コロン・バッククォート・単一引用符などの特殊文字もシェル上では意味を持ちます。またスラッシュとドットはファイル名で特別な役割(ディレクトリ区切りや隠しファイル、拡張子区切り)があります。

残された唯一の文字が カンマ でした。

簡単に試してみると、カンマはまさに求めていた文字でした。ほぼすべてのツールやシェルで、カンマはファイル名内で完全に普通の文字として扱われます。各自作コマンドの先頭にカンマを付けるだけで、システムコマンドとは明確に区別され、衝突のリスクが消えるのです。

さらに、タブ補完のおかげで自分のコマンド全体を簡単に閲覧できます。あるシステム上で

~/bin/
にどんなコマンドがあるか思い出したり、名前を確認したいときは「カンマ+Tab」を入力するとリストが表示されます。

$ ,<Tab>
,complete-scp        ,go-thpgp            ,range
,complete-ssh        ,gr                  ,svn-store-password
,coreoff             ,hss                 ,umount
,coreon              ,mount-thpgp
,find                ,mount-twt

自分の

~/bin/
ディレクトリを持ち、将来システムに追加される可能性のあるコマンドと衝突しないようにしたい方には、このテクニックを心からおすすめします。私は約10年間この方法で問題なく運用できており、非常に頑丈です。そして何より、単純に楽しいので試してみる価値があります。

©2021

同じ日のほかのニュース

一覧に戻る →

2026/02/08 6:45

小型 C コンパイラ

## Japanese Translation: Tiny C Compiler(TCC)は、非常に小さな(約100 KBのx86実行ファイル)Cコンパイラであり、1回のステップでコンパイル・アセンブル・リンクを行い、バイトコード層なしでネイティブx86マシンコードを生成します。2.4 GHz Pentium IV上では、Links BrowserテストをGCC(20.0 秒)より約10倍速く実行できます(2.27 秒)。これは別のコンパイルステージが不要であるためです。 TCCはISO C99を完全にサポートし、自身をコンパイルでき、任意のC動的ライブラリを直接リンクすることも可能です。完全なプリプロセッサ、GNUスタイルのアセンブラー構文、オプションのメモリと境界チェック機能、さらにはシェバンベースの「Cスクリプト」まで含まれ、コマンドラインから実行できます。libtccライブラリにより、他のプログラムがTCCをランタイムコード生成のバックエンドとして使用できるようになります。 性能テストはPentium IV上で行われました。新しい測定値(参照1–4)では、モダンハードウェアでも速度向上が継続しています。ドキュメント、メールリストサポート、およびSavannah/GitHubリポジトリは最新情報を提供します。 TCCはGNU Lesser General Public License(LGPL)の下で配布されており、商用利用も許可されています。

2026/02/08 8:23

**良質なコードの静かな終焉**

## Japanese Translation: 著者は中学時代から「Good Code™」―読みやすく、保守しやすく、特定の目的を持って存在するコード――を書き続けることに情熱を注いできました。機能提供に重点を置くソフトウェアエンジニアとして、彼は今日の高速開発環境で良いコードがますます希少になっていると感じています。 同僚の経験はこの状況をよく示しています。外部Linuxカーネル統合システムをCからRustへ書き換えた後、最初のバージョンは機能していたものの読みづらく保守が困難でした。原始的なCロジックを学習した上で再度書き直すと、コードはクリーンになり、自明であり、元のCよりも優れていると言えるようになりました。この経験が著者に品質コードへの熱意を再燃させました。 現在、彼はほとんどの場合初期バージョンを書かず、代わりに「Good Code™」ではなく許容できるものを生成するコーディングエージェントに頼っています。このようなツールへの継続的な依存が個々の行レベルでの品質への注意を薄め、業界実務におけるGood Codeの静かな消滅を招くと彼は恐れています。コード品質が低下すると保守コストや技術的負債が増大し、開発者の生産性、製品の信頼性、そして最終的には企業から提供されるソフトウェアへのユーザーの信頼まで損なわれます。

2026/02/08 2:39

**セクターC:512バイトで実装されたCコンパイラ**

## Japanese Translation: SectorCは、x86‑16アセンブリで完全に書かれたCコンパイラで、単一の512バイトのブートセクタに収まります。Ultra‑compactなトークン化スキーム「Barely C」を使用しており、各スペース区切り語を「メガトークン」とみなし、`atoi()`で識別子をハッシュし64Kテーブルに格納します。変数はこのハッシュを通じてセグメント0x3000に保存されます。最初のBarely C実装は468バイトで、シンボルテーブルなしの再帰下降パーサーでした。バイトスレッド化されたForth風の変種も試みられましたが、サイズをさらに削減することはできませんでした。 最終的なコンパイラはわずか **303 バイト** です。サイズは、フォールスルーロジック、テイルコール、コールフュージョン、`lodsw/stosw`の広範な使用、およびすべてのジャンプオフセットを1バイト内に収めるなどの手法で削減されました。残り約200バイトでBarely Cは完全なCサポートへと拡張されました:ネストされたif/whileブロック、包括的な演算子集合(+, −, *, &, |, ^, <<, >>, ==, !=, <, >, <=, >=)、ハッシュテーブルを介した関数定義と再帰、インライン`asm`ステートメント、および単一行(`//`)と複数行(`/* */`)コメントの両方が実装されました。 コンパイラのランタイムは `rt/` ディレクトリ内の2つのCファイルに分かれています:ライブラリルーチン(多くの場合インラインasmを含む)を持つ `lib.c` とエントリポイントとして機能する `_start.c` です。これらはプログラムソースと結合してからコンパイルされます。記事には、全ブートセクタのBase64文字列、VGAモード0x13hで動くサイン波を描画するデモ、および追加例(`hello.c` はビデオメモリ0xB8000に書き込み、`twinkle.c` はPCスピーカーで「Twinkle Twinkle Little Star」を再生)が含まれています。この作業は、512バイトという一見不可能な目標—完全機能のCコンパイラを実現すること—が、創造的なトークン化、ハッシュ化、および積極的なコードサイズ最適化によって達成できることを示しています。