- 技術 💻
hogeとは|fuga・piyoの順番・由来の諸説と残ったhogeの探し方
結論
hoge(ほげ)は、プログラミングの説明やサンプルで「名前は何でもよい」ことを示すために使う、意味のない仮の名前(メタ構文変数)です。2つ目以降は fuga・piyo と続けるのが日本でよく見る順番で、英語圏の foo・bar・baz にあたります。由来は諸説あり、決め手になる記録は見つかっていません。
この記事でわかること
- hoge・fuga・piyo の順番と、由来の諸説を出典つきで整理
- Python・Go・Ruby の標準ライブラリで foo と hoge を数えた結果と、8言語での実行結果
- 本番に残った hoge を grep・git grep・rg で探し、コミット前に止める手順
hoge は、名前そのものに意味が無いことを読み手に伝えるための「穴埋め用の名前」です。説明の主役は文法や手順のほうで、名前は何に置き換えてもよい、という合図になります。
flowchart TD
A[名前を付ける] --> B{名前に意味が<br>要るか}
B -->|要らない<br>文法の説明・使い捨て| C[hoge・fuga・piyo]
B -->|要る<br>本番・共有するコード| D[役割が分かる名前]
C --> E{本番に<br>入るか}
E -->|入る| D
E -->|入らない| F[そのまま使う]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| hogeとは | 意味のない仮の名前(メタ構文変数)。読みは「ほげ」 | hogeとは(意味と読み方) |
| hoge fuga piyo の順番 | hoge→fuga→piyo→hogera。足りなければ hogehoge など重ねる | hoge・fuga・piyoの順番と続き |
| hoge の由来 | 諸説あり。1980年代前半には複数の場所で使われていたという証言が多い | hogeの由来は諸説ある |
| 英語では何と言うか | foo・bar・baz・qux・quux。Python の資料では spam・eggs も | 英語圏のfoo・bar・bazとの対応 |
| 本当によく使われるのか | 手元の標準ライブラリでは foo が数千回、hoge は Ruby に1回だけ | hogeはどれくらい使われているか |
| 仕事のコードで使ってよいか | 説明・使い捨ての試しなら使ってよい。本番に入るコードでは避ける | hogeを使ってよい場面・避ける場面 |
| 残った hoge の探し方 | rg -n -i -w hoge . か git grep -n -i -w hoge |
リポジトリ内のhogeを見つけるコマンド |
| hoge の代わりの名前 | ドメインは example.com、人は Alice・Bob、値は役割の名前 | hogeの代わりに使える名前 |
確認環境:Ubuntu 24.04.5 LTS の作業用ディレクトリに、hoge を意図的に残した小さな Git リポジトリを作り、GNU grep 3.11・git 2.43.0(git grep・git log -S)・ripgrep 14.1.0 で検索した結果をそのまま載せています。hoge・fuga・piyo を使ったサンプルは Python 3.13.18・Node.js 22.23.4・OpenJDK 21.0.12.1・Go 1.24.7・gcc 13.3.0・Ruby 3.3.6・PHP 8.3.6・bash 5.2.21 で実行しました。出現回数は、この環境に入っている Python 3.13 の標準ライブラリ(565ファイル)と追加パッケージ140個(29,230ファイル)、Go 1.24.7 の src(10,703ファイル)、Ruby 3.3.6 の標準ライブラリ(1,249ファイル)を ripgrep の単語単位検索で数えたものです。由来は、日本語版ウィキペディア「メタ構文変数」、吉田敦さんの「ほげを考えるページ」(前橋和弥さんのサイトに許可を得て転載された版)、fj.lang.lisp の1989年の投稿のアーカイブ、RFC 3092 などを読み、書かれている範囲だけを書いています。VS Code の検索は公式ドキュメントで確かめました。図は mermaid 11.16 で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「hogeとは|fuga・piyoの順番・由来の諸説と残ったhogeの探し方」
hogeとは(意味と読み方)
この節では、hoge という言葉の意味と、ふだんの言葉との違いが分かります。
hoge は「ほげ」と読み、プログラミングの説明で「ここには好きな名前を入れてよい」ことを表す仮の名前です。 こうした名前をメタ構文変数(metasyntactic variable)と呼びます。「変数」と付いていますが、変数名だけでなく、関数名・ファイル名・ディレクトリ名・ユーザー名・文字列の中身など、名前が要るところならどこにでも使われます。
IT 以外の人が検索すると戸惑う言葉なので、場面ごとの意味を1つの表に並べます。
| 場面 | hoge の意味 | 例 |
|---|---|---|
| ふだんの日本語 | 決まった意味は無い。地方の言葉「ほげる」は地域によって意味が違う | (辞書の見出し語としては一般的でない) |
| オランダ語 | 形容詞 hoog(高い)の変化した形 | de hoge toren(高い塔) |
| プログラミングの説明 | 何に置き換えてもよい名前 | def hoge(fuga): |
| テストデータ・設定の例 | 中身に意味のない仮の値 | hoge@example.com |
| 会話・チャット | 「何かがここに入る」の意味の伏せ字 | 「hoge.txt を開いて」「〇〇の代わりの hogehoge」 |
なぜ意味のない名前を使うのか
文法の説明で var price; と書くと、読む人は「price という決まった言葉が要るのか」「どこまでが言語のキーワードか」で迷います。IT用語辞典 e-Words も、意味のある単語を使うと言語上のキーワードと区別しにくくなる点を挙げています。誰が見ても意味が無いと分かる名前を置くと、「ここは自分で決める部分」と一目で伝わります。
同じ説明を2通りで書くと
for item in items: は、item や items という単語が決まりなのか、自分で付ける名前なのか、初めての人には分からないfor hoge in fuga: なら、for・in が言語の決まりで、hoge・fuga は自分で決める部分だとすぐ分かる見分ける問い:「この名前を別の言葉に替えても、説明の中身は変わらないか」
ダミーの文章(レイアウトを埋めるための本文)は、Lorem ipsum のようなダミーテキストの役割です。この記事は、コードや設定に置く名前としての hoge を扱います。ダミーテキストの出し方は、別の記事「Lorem ipsumとは|ダミーテキストの出し方と日本語版・折り返し実測」で扱います。
hoge・fuga・piyoの順番と続き(hogera・hogehoge)
この節では、hoge のあとにどの名前を続けるのが一般的かと、数が足りないときの増やし方が分かります。
日本でいちばん多い並びは hoge → fuga → piyo です。 日本語版ウィキペディアは、4つ目として hogera を挙げ、さらに足りないときは hogehoge・piyopiyo のように同じ語を重ねるのが中心で、hogepiyo のような組み合わせはあまり見られない、と説明しています。英語圏の foo と bar が foobar と組み合わされるのとは対照的です。
- 1hoge(ほげ)1つ目。1つだけ要るなら hoge
- 2fuga(ふが)2つ目。hoge を使わずに fuga だけ使うことはまず無い
- 3piyo(ぴよ)3つ目。ここまではほぼ決まった順番
- 4hogera(ほげら)4つ目。ここから先は人や組織で違う
- 5hogehoge・fugafuga・piyopiyo重ねて増やす。hogehogehoge と3回重ねる例もある
手元で作った確かめ用のリポジトリでは、次のように並びで使っています。2つ目の引数が fuga、3つ目が piyo です。
def hoge(fuga, piyo):
return fuga * (1 + piyo)
綴りの揺れ(huga・HOGE・ほげ)
- fuga と huga:ローマ字の書き方(ヘボン式か訓令式か)で揺れます。検索するときは両方を入れると取りこぼしません。
- HOGE・Hoge:定数やクラス名の書き方に合わせて大文字になります(Java のクラス名
Hogeなど)。検索は大文字小文字を区別しない-iを付けます。 - ほげ・ホゲ・hoge:画面の文言や資料の中では日本語や全角で書かれることもあります。ローマ字の検索では見つからないので、別に探します(後の節で実行結果を示します)。
hogeの由来は諸説ある(出典つき)
この節では、hoge の由来として挙がっている説と、それぞれの出典が分かります。
hoge の由来は、はっきりしていません。 日本語版ウィキペディアは、1970年代の終わりから遅くとも1980年代前半には、複数の人が別々に使い始めていたという証言がある、とだけ書き、1つの起源には決めていません。ここでは、出典のある説を並べます。どれかを正解と決めるものではありません。
| 説 | 中身 | 出典 |
|---|---|---|
| 同時多発説 | 1980年代前半、各地で別々に使われ始めた | 日本語版ウィキペディア「メタ構文変数」、ほげを考えるページ |
| 名古屋大学で1984年ごろ | 曽田さんが1984年ごろ使った hoge が、早い時期の記録の1つとされる | ほげを考えるページ(FAQ) |
| 村井純さんの口癖説 | 1980年代前半に口癖にしていたという説がある(同ページも出典は不明としている) | ほげを考えるページ |
| HOGE 基板説 | 1980年ごろ「HOGE」という名前の基板が作られ、その名前が広まったという話 | Neo's World「Foo Bar Baz・Hoge Fuga Piyo の起源を調べてみた」が紹介 |
| 漫画・アニメ説 | 「どろろ」の「ほげほげ」や、漫画の猫の鳴き声が元かもしれない | ほげを考えるページ(読者からの情報として紹介) |
| 方言との関係 | 熊本・新潟県長岡市の「ほげる」との関係は「調査中」 | ほげを考えるページ |
ほかに「英語の foo の音を日本語風にした」という説明も見かけますが、読んだ範囲では出典が示されていなかったため、表には入れていません。
記録で確かめられる早い例
公開されている記録で確かめられた例として、ネットニュース(fj)の fj.lang.lisp に1989年10月25日に京都大学から投稿された記事があります。C の関数名として hoge() を使い、Lisp から呼び出す例を示しています。最古であるとは言えませんが、1980年代末には大学の技術的なやり取りで普通に使われていたことが分かります。
%int hoge() %{
(defentry hoge () (int hoge))
また「ほげを考えるページ」には、雑誌「bit」の連載「Emacs 解剖学」(Vol.28)で hoge と piyo が使われていたことも記録されています。piyo について Neo's World は、曽田さんが1984年ごろから使い始めたと証言している、と紹介しています。fuga の由来は、読んだ資料のどれにも決め手になる記述がありませんでした。
言えること
1980年代には使われていた
複数の場所で別々に使われた証言がある
日本で主に使われる名前
言えないこと
誰が最初に使ったか
特定の作品・人物が起源だという決め手
fuga がどこから来たか
英語圏のfoo・bar・bazとの対応(ほかの国も)
この節では、hoge にあたる英語の名前と、その由来の説、ほかの言語圏の例が分かります。
英語圏では foo → bar → baz → qux → quux の順に使います。 2001年4月1日付の RFC 3092「Etymology of "Foo"」(エイプリルフールに出された Informational の RFC)は、foo の次に続く名前として bar・baz・qux・quux・corge・grault・garply・waldo・fred・plugh・xyzzy・thud を挙げています。
| 順番 | 日本 | 英語圏 | Python の資料 |
|---|---|---|---|
| 1つ目 | hoge | foo | spam |
| 2つ目 | fuga | bar | ham |
| 3つ目 | piyo | baz | eggs |
| 4つ目以降 | hogera・hogehoge | qux・quux・corge | (決まりは無い) |
| 組み合わせ | 重ねる(hogehoge) | つなげる(foobar) | spam_and_eggs など |
foo・bar の由来(RFC 3092 の説明)
- foo:1930年ごろから1952年ごろまで続いた Bill Holman の漫画「Smokey Stover」に繰り返し出てくるのが、記録に残る早い例とされています。第二次世界大戦中のレーダー担当者が使った「foo fighters」にも触れています。
- bar・foobar:第二次世界大戦中のアメリカ軍の俗語 FUBAR とのつながりが挙げられています。foobar は、1960年代から1970年代初めの DEC(Digital Equipment Corporation)のマニュアルで広まったとされ、1972年の使用例が確かめられている、と書かれています。
- RFC の中での使用:当時までに出た RFC のうち約7%にあたる212本が、foo・bar・foobar を例の名前として使っていたと数えています。
RFC 3092 自体もエイプリルフールの RFC なので、由来は「こういう説明がある」として読むのが適切です。
ほかの言語圏
日本語版ウィキペディアは、フランスの toto(続けて titi・tata など)、イタリアの pippo、ドイツの bla・blub、イギリス圏の wibble・wobble などを紹介しています。Python の公式チュートリアルには、言語名が BBC の番組「Monty Python's Flying Circus」から来ていること、ドキュメントでモンティ・パイソンのネタを使うのは許されるどころか推奨される、という一文があり、spam・eggs が使われる理由になっています。
hogeはどれくらい使われているか(標準ライブラリで数えた)
この節では、実際のソースコードに foo と hoge がどれくらい出てくるかを、手元で数えた結果が分かります。
海外で作られたソースコードには foo・bar が数千回出てきますが、hoge はほぼ出てきません。 手元の環境に入っているソースコードを、ripgrep の単語単位(-w)で数えました。数えた語は、前後が英数字でない独立した単語として出てきたものだけです。bar はふつうの英単語(progress bar など)も含むので、foo より多めに出る点に注意が要ります。
rg -w -o --no-filename -g '!__pycache__' foo /usr/local/go1.24.7/src </dev/null | wc -l
rg -w -l -g '!__pycache__' foo /usr/local/go1.24.7/src </dev/null | wc -l
| 語 | Python 追加パッケージ140個 | Go 1.24.7 の src | Ruby 3.3.6 の標準ライブラリ |
|---|---|---|---|
| foo | 5,949回(880ファイル) | 6,308回(744ファイル) | 1,339回(118ファイル) |
| bar | 4,256回(747ファイル) | 2,491回(377ファイル) | 840回(82ファイル) |
| baz | 803回(224ファイル) | 510回(105ファイル) | 457回(34ファイル) |
| spam/eggs | 393回/274回 | 13回/1回 | 0回/0回 |
| hoge/fuga/piyo | 0回/0回/0回 | 0回/0回/0回 | 1回/1回/0回 |
Python 3.13 の標準ライブラリ本体(565ファイル)だけでは、foo 215回・bar 90回・spam 113回・eggs 36回で、hoge は0回でした。spam が bar より多いのは、Python の資料らしい結果です。
1foo は言語を問わず多い
Python の追加パッケージでも Go でも、foo は6,000回前後出てきた。英語圏のコードの「仮の名前」は foo が標準。
2hoge は日本発の Ruby に1回だけ
Ruby の irb のソース(ruby-lex.rb)のコメントに、構文エラーの例として hoge と fuga が1回ずつ出てきた。
3spam・eggs は Python に集中
Go では spam 13回・eggs 1回、Ruby では0回。名前の文化が言語の由来と結びついている。
Ruby で見つかった hoge は、irb が「入力の途中か、本当のエラーか」を見分ける処理の説明コメントでした。
when /syntax error, unexpected end-of-input/
# "syntax error, unexpected end-of-input, expecting keyword_end"
#
# example:
# if true
# hoge
# if false
# fuga
# end
海外の人も読む OSS や英語のドキュメントでは、hoge は伝わりにくい名前です。英語で書く場面では foo・bar を選ぶと、読む人の負担が減ります。
各言語のサンプルコードでのhoge(8言語の実行結果)
この節では、hoge・fuga・piyo が各言語のサンプルでどう使われるかと、日本語の名前「ほげ」がどこまで使えるかが分かります。
hoge はどの言語でも予約語と重ならない、ふつうの名前として使えます。 8つの言語で、hoge・fuga・piyo を使った短いコードと、同じファイルで日本語の名前 ほげ を使う行を実行しました。
Python・JavaScript
hoge = "hoge"
fuga = 2
piyo = hoge * fuga
print(piyo)
ほげ = 1
print(ほげ + 1)
const hoge = { fuga: "piyo" };
console.log(hoge.fuga);
const ほげ = 1;
console.log(ほげ + 1);
Java・Go・C
public class Hoge {
static String fuga(String piyo) { return piyo + piyo; }
public static void main(String[] args) {
System.out.println(fuga("hoge"));
int ほげ = 1;
System.out.println(ほげ + 1);
}
}
package main
import "fmt"
func hoge(fuga int) int { return fuga * 2 }
func main() {
fmt.Println(hoge(21))
ほげ := 1
fmt.Println(ほげ + 1)
}
#include <stdio.h>
int hoge(int fuga) { return fuga * 2; }
int main(void) {
printf("%d\n", hoge(21));
int ほげ = 1;
printf("%d\n", ほげ + 1);
return 0;
}
Ruby・PHP・bash
hoge = %w[fuga piyo]
puts hoge.join(",")
ほげ = 1
puts ほげ + 1
<?php
$hoge = ["fuga" => "piyo"];
echo $hoge["fuga"], "\n";
$ほげ = 1;
echo $ほげ + 1, "\n";
hoge="fuga"
echo "$hoge"
ほげ=1
echo "$ほげ"
実行結果をまとめます。bash だけ、日本語の名前の行でエラーになりました。
== python
hogehoge
2
== node
piyo
2
== java
hogehoge
2
== go
42
2
== c
42
2
== ruby
fuga,piyo
2
== php
piyo
2
== bash
fuga
a.sh: line 3: $'\343\201\273\343\201\222=1': command not found
$ほげ
| 言語(版) | hoge・fuga・piyo | 日本語の名前「ほげ」 |
|---|---|---|
| Python 3.13.18 | 動いた | 動いた |
| Node.js 22.23.4 | 動いた | 動いた |
| Java(OpenJDK 21) | 動いた | 動いた |
| Go 1.24.7 | 動いた | 動いた |
| C(gcc 13.3.0) | 動いた | 動いた(UTF-8 のソース) |
| Ruby 3.3.6/PHP 8.3.6 | 動いた | 動いた |
| bash 5.2.21 | 動いた | command not found(変数名にならない) |
bash の変数名に使えるのは英字・数字・下線だけなので、ほげ=1 は「ほげ=1」という名前のコマンドとして実行されようとして失敗し、$ほげ もそのまま文字として出ました。日本語の名前は多くの言語で動きますが、シェルスクリプトや、入力のしにくさ・検索のしにくさを考えると、仮の名前もローマ字の hoge にそろえるのが無難です。
hogeを使ってよい場面・避ける場面(判断表)
この節では、hoge を使ってよい場面と、意味のある名前にしたほうがよい場面の見分け方が分かります。
「名前を替えても説明の中身が変わらない」「すぐ捨てる」ときは hoge が向いています。 逆に、他の人が読み続けるコードや、本番で動くコードに入る名前には向きません。
| 場面 | hoge | 理由 |
|---|---|---|
| 文法・書き方の説明(記事・研修資料) | 向く | どこが言語の決まりで、どこが自分で決める部分かが分かる |
| 使い捨ての動作確認(REPL・一時ファイル) | 向く | 名前を考える手間が要らない |
| 質問・不具合報告での最小の再現コード | 向く(ただし英語の場では foo) | 業務の名前を伏せられる |
| テストコードの中の変数 | 場合による | 値の役割が大事なテストは、役割の名前のほうが失敗時に読みやすい |
| 本番のコード・設定・画面の文言 | 避ける | 意味が伝わらず、仮の値が残った事故に見える |
| 英語圏の人も読む OSS・ドキュメント | 避ける | hoge は日本でしか通じにくい。foo・bar を使う |
| メールアドレス・ドメインの例 | example.com と組み合わせる | hoge.com など実在しうるドメインに届く心配がない |
意味のない名前が招く取り違え
次のコードは、同じ計算を hoge・fuga・piyo で書いたものと、役割の名前で書いたものです。hoge のほうは、引数の順番を逆にして呼んでも気づけませんでした。
def hoge(fuga, piyo):
return fuga * (1 + piyo)
def price_with_tax(price, tax_rate):
return price * (1 + tax_rate)
print(hoge(0.1, 1000)) # 引数の順番を取り違えた
print(price_with_tax(tax_rate=0.1, price=1000))
100.10000000000001
1100.0
役割の名前があれば、キーワード引数で呼べるので、順番を取り違える余地自体がなくなります。名前の付け方は、関連記事「変数名・関数名の付け方|命名規則と言語別のルール」で扱っています。
テスト・ドキュメントでhogeを使うときの注意(本番に残す事故)
この節では、hoge が本番に残るとどう見えるかと、残さないための決めごとが分かります。
hoge の事故で多いのは、仮に入れた値がそのまま画面・メール・ログ・設定に出てしまうことです。 利用者から見ると意味の分からない文字が表示され、作りかけのものが公開されたように見えます。確かめ用のリポジトリにも、よくある残り方を意図的に入れました。
| 残った場所 | 確かめ用に入れた例 | 起きること |
|---|---|---|
| API の接続先 | https://hoge.example.com/api |
本番で接続に失敗する |
| ログの文言 | logging.info("hogehoge %s", hoge) |
障害時にログを読んでも意味が分からない |
| 設定ファイル | admin_email: hoge@example.com |
通知が誰にも届かない |
| 画面の文言 | hoge ほげほげ ホゲ |
利用者の画面に表示される |
| テストの変数 | hoge = calc_total(100, 3) |
害は小さいが、失敗時に何の値か読み取りにくい |
チームで決めておくこと
- 1hoge を置いてよいフォルダーを決めるtests/ と docs/ の中だけ、など。それ以外で見つかったら直す対象にする
- 2仮の値はドメインに example.com を使うRFC 2606 が例示用に予約している。hoge.com のような実在しうるドメインは使わない
- 3コミット前とレビューで機械的に探す人の目だけに頼らず、フックや CI で hoge を見つけたら止める
- 4日本語・全角の「ほげ」も探す対象に入れる画面の文言はローマ字の検索では見つからない
- 5本物の個人情報を仮の値に使わないhoge の代わりに実在の名前やアドレスを入れるのは、さらに大きな事故になる
テストで使う名前・住所などの仮のデータの作り方は、関連記事「テストデータの作り方|生成SQLとマスキング手法一覧・匿名化の手順」で扱っています。
リポジトリ内のhogeを見つけるコマンド(grep・git grep・rg)
この節では、コードの中に残った hoge を、取りこぼしと誤検出を減らして探すコマンドが分かります。
迷ったら rg -n -i -w hoge .(ripgrep)か、Git の管理下なら git grep -n -i -w hoge を使います。 確かめ用のリポジトリ(src・tests・docs・config・templates・data・node_modules を含む)で、同じ hoge を各コマンドで探した結果を並べます。
grep -rn(部分一致)は「捕鯨」まで拾う
grep -rn hoge . --exclude-dir=.git
./src/whaling.py:1:# 捕鯨 (hogei) の統計を読み込む
./src/whaling.py:2:def load_hogei_stats():
./src/app.py:3:API_URL = "https://hoge.example.com/api"
./src/app.py:6: hoge = price * qty
./src/app.py:7: logging.info("hogehoge %s", hoge)
./src/app.py:8: return hoge
./config/settings.yaml:1:admin_email: hoge@example.com
./tests/test_app.py:4: hoge = calc_total(100, 3)
./tests/test_app.py:5: assert hoge == 300
grep: ./data/sample.bin: binary file matches
./node_modules/lib/index.js:1:var hoge = 1;
./docs/README.md:2:`calc_total(hoge, fuga)` のように呼び出します。
ローマ字の hogei(捕鯨)のように、hoge を含む別の言葉まで出ます。外から取り込んだ node_modules も、バイナリファイルも対象になりました。
-w(単語単位)と -i(大文字小文字を区別しない)
grep -rniw hoge . --exclude-dir=.git
./src/app.py:3:API_URL = "https://hoge.example.com/api"
./src/app.py:6: hoge = price * qty
./src/app.py:7: logging.info("hogehoge %s", hoge)
./src/app.py:8: return hoge
./config/settings.yaml:1:admin_email: hoge@example.com
./config/settings.yaml:2:title: HOGE
./tests/test_app.py:4: hoge = calc_total(100, 3)
./tests/test_app.py:5: assert hoge == 300
grep: ./data/sample.bin: binary file matches
./node_modules/lib/index.js:1:var hoge = 1;
./docs/README.md:2:`calc_total(hoge, fuga)` のように呼び出します。
hogei が消え、-i で HOGE が増えました。7行目が出たのは、同じ行に単独の hoge もあるためです。-w だけでは hogehoge 単独の行は見つからないので、重ねた形も探すなら次の正規表現を使います。
rg(ripgrep)は .gitignore とバイナリを自動で除く
rg -n -w -i hoge .
docs/README.md:2:`calc_total(hoge, fuga)` のように呼び出します。
tests/test_app.py:4: hoge = calc_total(100, 3)
tests/test_app.py:5: assert hoge == 300
config/settings.yaml:1:admin_email: hoge@example.com
config/settings.yaml:2:title: HOGE
src/app.py:3:API_URL = "https://hoge.example.com/api"
src/app.py:6: hoge = price * qty
src/app.py:7: logging.info("hogehoge %s", hoge)
src/app.py:8: return hoge
.gitignore に書いた node_modules と、バイナリの data/sample.bin が自動で外れました。-uu で無視されたファイルと隠しファイル(.git の中のフックやログも含む)、-uuu でバイナリまで対象になり、data/sample.bin: binary file matches (found "\0" byte around offset 3) と表示されました。rg は複数のファイルを並行して読むので、ファイルの出る順番は実行のたびに変わることがあります。
tests・docs を除き、hoge・fuga・piyo と重ねた形をまとめて探す
rg -n -w -i hoge -g '!tests/**' -g '!docs/**' .
rg -o -i -w '(hoge|fuga|piyo)+' --no-filename . | sort | uniq -c
src/app.py:3:API_URL = "https://hoge.example.com/api"
src/app.py:6: hoge = price * qty
src/app.py:7: logging.info("hogehoge %s", hoge)
src/app.py:8: return hoge
config/settings.yaml:1:admin_email: hoge@example.com
config/settings.yaml:2:title: HOGE
(hoge|fuga|piyo)+ は、hoge・fuga・piyo・hogehoge・hogefuga などを1つの単語として拾う書き方です。-o と uniq -c を組み合わせると、どの形が何回残っているかを数えられます(app.py を直したあとの実行結果)。
1 HOGE
1 fuga
4 hoge
日本語・全角の「ほげ」
rg -n 'hoge|ほげ|ホゲ' .
templates/index.html:1:<p>hoge ほげほげ ホゲ</p>
ここまでのどの検索にも出てこなかった画面の文言が、ここで初めて見つかりました。
git grep と、過去のコミットの hoge
git grep -n -w -i hoge
git log -S hoge --oneline
git grep -n -w hoge $(git rev-list --all) -- src/
config/settings.yaml:1:admin_email: hoge@example.com
config/settings.yaml:2:title: HOGE
Binary file data/sample.bin matches
docs/README.md:2:`calc_total(hoge, fuga)` のように呼び出します。
src/app.py:3:API_URL = "https://hoge.example.com/api"
...
git grep は Git が管理しているファイルだけを探すので node_modules は出ませんが、管理下のバイナリは「Binary file … matches」と表示されました。git log -S hoge は、hoge の数が変わったコミット(入れたコミットと消したコミット)を一覧にします。手元では「rename hoge to total」と「init」の2件が出ました。過去の全コミットから探すときは git rev-list --all を渡します。git grep の詳しいオプションは関連記事「git grepの使い方一覧|過去コミットの文字列検索はlog -S」、grep 全般は関連記事「grepコマンドの使い方|オプション早見表と実務の逆引き(実行結果つき)」で扱っています。
コマンドごとの違い(同じリポジトリでの結果)
| コマンド | hogei(捕鯨) | HOGE | node_modules | バイナリ |
|---|---|---|---|---|
grep -rn hoge |
出る | 出ない | 出る | 一致と表示 |
grep -rniw hoge |
出ない | 出る | 出る | 一致と表示 |
git grep -niw hoge |
出ない | 出る | 出ない | 一致と表示 |
rg -niw hoge . |
出ない | 出る | 出ない | 出ない |
rg -n -uuu -w hoge . |
出ない | 出ない(-i なし) | 出る | 一致と表示(.git の中も出る) |
速さ(約29,000ファイルで計測)
Python の追加パッケージのフォルダー(140パッケージ・29,230ファイル)で、存在しない hoge を探す時間を3回ずつ測りました。共有のマシン(2 CPU)で他の作業も動いていたため、ばらつきがあります。
| コマンド | 1回目 | 2回目 | 3回目 |
|---|---|---|---|
grep -rnw hoge |
6.05秒 | 10.75秒 | 7.52秒 |
rg -nw hoge |
0.40秒 | 0.37秒 | 0.28秒 |
grep -rniw hoge(LC_ALL=C) |
11.22秒 | 10.68秒 | 7.49秒 |
rg -niw hoge |
0.61秒 | 0.48秒 | 0.29秒 |
rg は並行して読むうえ、.gitignore の対象・隠しファイル・バイナリを読まないので、grep より大幅に速くなりました。大きなリポジトリで何度も探すなら rg が向いています。
VS Code で探す
VS Code の公式ドキュメントでは、ファイル全体の検索は Ctrl+Shift+F(Mac は ⇧⌘F)で開き、検索ボックスで正規表現も使えます。Ctrl+Shift+J(Mac は ⇧⌘J)で詳細を開くと、含める・除くファイルのパターンを入力でき、.gitignore や files.exclude・search.exclude の対象を外すかどうかも切り替えられます。
コミット前にhogeを止める(Git の pre-commit フック)
この節では、hoge を含むコードをコミットしようとしたときに、自動で止める仕組みの作り方と実行結果が分かります。
人の目で探すより、コミットの直前に機械で止めるほうが確実です。 Git のフック(決まった操作の前後に動くスクリプト)を使い、tests/ と docs/ 以外に hoge・fuga・piyo が入っていたらコミットを止めるようにしました。
フックのファイルを作る
リポジトリの .git/hooks/pre-commit に、次のスクリプトを置く。ファイル名に拡張子は付けない。
実行できるようにする
chmod +x .git/hooks/pre-commit で実行権限を付ける。付け忘れると、フックは何も言わずに動かない。
hoge を含むファイルでコミットしてみる
止まって、どのファイルの何行目かが表示されることを確かめる。
名前を直してコミットし直す
役割の名前に直すと通る。tests/ の中の hoge は通ることも確かめる。
#!/bin/sh
# tests/ と docs/ 以外に hoge・fuga・piyo が入っていたらコミットを止める
hits=$(git diff --cached --name-only --diff-filter=ACM -- . ':!tests/' ':!docs/' \
| xargs -r git grep --cached -n -i -w -E '(hoge|fuga|piyo)+' --)
if [ -n "$hits" ]; then
echo "仮の名前が残っています:" >&2
echo "$hits" >&2
exit 1
fi
--cached を付けているので、作業中のファイルではなく、コミットされる内容(ステージした内容)を調べます。実行した結果です。
$ printf 'def send(hoge):\n return hoge\n' > src/mail.py
$ git add src/mail.py; git commit -m "add mail"; echo "exit=$?"
仮の名前が残っています:
src/mail.py:1:def send(hoge):
src/mail.py:2: return hoge
exit=1
$ printf 'def send(message):\n return message\n' > src/mail.py
$ git add src/mail.py; git commit -qm "add mail"; echo "exit=$?"
exit=0
$ git add tests/test_x.py; git commit -qm "test"; echo "exit=$?" # tests/ の中の hoge
exit=0
.git/hooks の中身はリポジトリと一緒に共有されないため、チーム全員にそろえるなら pre-commit というツールの設定ファイルに書いて共有する方法があります。設定方法は関連記事「pre-commit設定|.pre-commit-config.yamlとフック一覧」で扱っています。同じ検索を CI でも動かしておくと、フックを入れていない人のコミットも止められます。
hogeを探すときのよくあるつまずき(エラー原文つき)
この節では、hoge を探す・使うときにつまずきやすい点と、実際に出たメッセージが分かります。
| 症状・原文 | 原因 | 直し方 |
|---|---|---|
パイプの中で rg -n hoge が終わらない(手元では timeout で打ち切り、exit=124) |
パスを省き、標準入力がパイプのとき、rg は標準入力を読もうとして待ち続ける | 探す場所を . のように必ず書く。書いたら exit=0 で終わった |
grep: ./data/sample.bin: binary file matches |
バイナリファイルの中に hoge があった | 行の中身は出ない。対象外にするなら -I を付ける |
捕鯨の hogei まで出る |
部分一致で探している | -w で単語単位にする |
-w にしたら hogehoge だけの行が消えた |
hogehoge は hoge とは別の単語として扱われる | -w '(hoge|fuga|piyo)+' のように重ねた形も書く |
| 画面に「ほげ」が出ているのに検索で出ない | 日本語・全角で書かれている | 'hoge|ほげ|ホゲ' も探す |
a.sh: line 3: $'\343\201\273\343\201\222=1': command not found |
bash の変数名に日本語は使えない | 変数名は英字・数字・下線にする |
grep: ./nothing: No such file or directory(exit=2) |
探す場所の綴りが違う | パスを直す。見つからないだけなら exit=1 |
終了コードで判定する
CI やスクリプトで使うときは、表示ではなく終了コードで判定します。手元の GNU grep では次のとおりでした。
| 状況 | 終了コード | CI での意味 |
|---|---|---|
| hoge が見つかった | 0 | 残っている(止める) |
| 見つからなかった(piyo で確認) | 1 | 残っていない(通す) |
| 探す場所が無いなどのエラー | 2 | 検査が壊れている(止めて直す) |
「見つかったら失敗」にしたいので、if grep -rqiw hoge src/; then exit 1; fi のように、0 と 1 の意味を逆に扱う点に注意します。2 を「見つからなかった」と同じに扱うと、パスの書き間違いで検査が素通りになります。
hogeの代わりに使える名前(example.com・Alice・意味のある名前)
この節では、hoge 以外に使える「仮の名前」の決まりごとと、用途ごとの選び方が分かります。
名前の種類によっては、hoge より適した決まりがあります。 とくにドメイン名とメールアドレスは、仮の値が本物の誰かに届かないよう、予約された名前を使います。
| 仮に置きたいもの | 使う名前 | 根拠・理由 |
|---|---|---|
| ドメイン名・URL | example.com・example.net・example.org | RFC 2606 が例示用に予約 |
| テスト用のドメイン | .test・.example・.invalid | RFC 2606 が予約したトップレベルドメイン |
| メールアドレス | hoge@example.com・user@example.com | hoge.com などは実在しうるので避ける |
| 人の名前(通信の説明) | Alice・Bob | 英語圏の暗号・通信の説明の定番 |
| 人の名前(日本語の資料) | 山田太郎・〇〇花子 | 日本語版ウィキペディアも例に挙げる |
| 架空の会社 | ACME | 英語圏の定番 |
| 本番に入る変数・関数 | total・send_message など役割の名前 | 読み手が意味を推測しなくて済む |
hoge を「直す」ときは、その値が何を表すか(金額か、件数か、宛先か)を一言で言える名前にします。名前が思いつかないときは、その値が何に使われているかを、呼び出し側から読み直すと決まりやすくなります。
よくある質問
この節では、hoge について検索されやすい疑問への答えが分かります。
Q. hoge は何の略ですか? A. 何かの略だという記録は見つかっていません。意味のない音として使われ始めたと考えられており、由来には複数の説があります(由来の節を参照)。
Q. hoge・fuga・piyo の順番は決まっていますか? A. 規格のような決まりはありませんが、hoge→fuga→piyo の順が広く使われています。4つ目は hogera、それ以上は hogehoge のように重ねる例が多いです。
Q. 英語で hoge にあたる言葉は何ですか? A. foo です。2つ目が bar、3つ目が baz で、foobar とつなげても使います。Python の資料では spam・eggs・ham もよく使われます。
Q. 海外の人に hoge は通じますか? A. 通じにくい名前です。手元で数えた Python の追加パッケージ140個と Go の標準ライブラリには、hoge が1回も出てきませんでした。英語で書く OSS や質問では foo・bar を使うと伝わります。
Q. 仕事のコードで hoge を使うのは失礼ですか? A. 失礼というより、伝わらないことが問題です。説明や使い捨ての確認では便利ですが、他の人が読み続けるコードでは、役割の分かる名前にしたほうが読み手の負担が減ります。
Q. hoge と Lorem ipsum の違いは何ですか? A. hoge は変数名・ファイル名などの名前に置く仮の言葉で、Lorem ipsum はレイアウトを確かめるための文章のダミーです。役割が違うので、名前には hoge、本文の穴埋めにはダミーテキストを使います。
Q. テストで hoge@hoge.com を使ってもよいですか? A. 避けます。hoge.com のようなドメインは誰かが持っている可能性があり、テストのメールが実際に届くおそれがあります。RFC 2606 で例示用に予約された example.com を使い、hoge@example.com とします。
Q. ほげ(日本語)を変数名にできますか?
A. 手元では Python・JavaScript・Java・Go・C(gcc)・Ruby・PHP で動きました。bash では command not found になり使えませんでした。入力や検索の手間を考えると、ローマ字の hoge が無難です。
Q. プロジェクトに残った hoge をいちばん早く見つける方法は?
A. rg -n -i -w '(hoge|fuga|piyo)+' . です。.gitignore の対象とバイナリを除いて探すので速く、手元の約29,000ファイルでも1秒かかりませんでした。日本語の「ほげ」は別に探します。
Q. 過去に消した hoge がいつ入ったか調べられますか?
A. git log -S hoge --oneline で、hoge の数が変わったコミットを一覧にできます。-p を付けると差分も出ます。
まとめ
- hoge(ほげ)は、名前に意味が無いことを示す仮の名前(メタ構文変数)。順番は hoge→fuga→piyo→hogera で、足りなければ hogehoge と重ねる。
- 由来は諸説あり、1980年代前半には複数の場所で使われていたという証言がある。記録で確かめられる例として1989年の fj.lang.lisp の投稿がある。fuga の由来は分かっていない。
- 英語圏では foo・bar・baz。手元の Python 追加パッケージと Go には foo が約6,000回ずつ出てきたが、hoge は0回。Ruby の irb のコメントに1回だけあった。
- 説明・使い捨ての確認には向くが、本番のコード・設定・画面の文言には残さない。ドメインは example.com を使う。
- 残った hoge は
rg -n -i -w '(hoge|fuga|piyo)+' .と、日本語の「ほげ」の検索で探し、pre-commit フックや CI で tests/・docs/ 以外を止める。
次に読むとよい記事です。コードを読む人の観点は、関連記事「変数名・関数名の付け方|命名規則と言語別のルール」が参考になります。
参考・出典
確認日はいずれも 2026年10月29日です。
- ウィキペディア日本語版「メタ構文変数」:https://ja.wikipedia.org/wiki/メタ構文変数
- 吉田敦「ほげを考えるページ」(前橋和弥さんのサイトに転載された版):http://kmaebashi.com/programmer/hoge.html
- fj.lang.lisp への投稿(1989年10月25日、アーカイブ):https://katsu.watanabe.name/ancientfj/article.php?mid=1299%40nagao4.kuee.kyoto-u.junet
- Neo's World「Foo Bar Baz・Hoge Fuga Piyo の起源を調べてみた」:https://neos21.net/blog/2022/09/06-01.html
- IT用語辞典 e-Words「メタ構文変数」:https://e-words.jp/w/メタ構文変数.html
- IETF「RFC 3092 Etymology of "Foo"」:https://www.rfc-editor.org/rfc/rfc3092
- IETF「RFC 2606 Reserved Top Level DNS Names」:https://www.rfc-editor.org/rfc/rfc2606
- Python ドキュメント「Whetting Your Appetite」:https://docs.python.org/3/tutorial/appetite.html
- Wiktionary「hoge」(オランダ語の項):https://en.wiktionary.org/wiki/hoge
- Visual Studio Code「Basic editing」(Search across files):https://code.visualstudio.com/docs/editing/codebasics
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「hogeとは|fuga・piyoの順番・由来の諸説と残ったhogeの探し方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。