From a219347775526a1882ead44e4da801b234669a1f Mon Sep 17 00:00:00 2001 From: "Yuga.K" Date: Mon, 11 May 2026 16:34:14 +0900 Subject: [PATCH] Add files via upload --- community_guides/GUIDE_ja.md | 351 +++++++++++++++++++++++++++++++++++ 1 file changed, 351 insertions(+) create mode 100644 community_guides/GUIDE_ja.md diff --git a/community_guides/GUIDE_ja.md b/community_guides/GUIDE_ja.md new file mode 100644 index 00000000000..1cf46cd06eb --- /dev/null +++ b/community_guides/GUIDE_ja.md @@ -0,0 +1,351 @@ +# GitHubコード-保管庫の説明 + +## 説明 + +このアーカイブ、「GitHubコード-保管庫」 +は次世代のために公開ソフトウェアを保存することを任務とする「GitHub アーカイブプログラム」によって設立されました。 +あなたがこれを読むのは1年後かもしれませんし、1000年後かもしれません。 +いずれにせよ、その内容・そして公開ソフトウェアという概念そのものが、あなた方にとって役立つものであることを願っています。 + +これは主にソフトウェアの保管庫です。 +ソフトウェアとは、機器の動作を制御するために使われる一連の命令のことです。 +機器は、我々の頭脳よりはるかに高速で計算を自動で実行できる装置であり、その能力は私たちの頭脳よりはるかに超越しています。 +私たちの機器は、宇宙の謎を探求し、全人類の全てを繋ぎ、音を伝え、電子的画面に精細な動画を映し出すのに十分な速さで信号を処理し、そして人間の労働の能力や精度をはるかに超える、極めて強力な機械を制御するために利用されています。 + +ソフトウェアのない機器では、先ほどのような処理は何もできません。 +機器は驚くほど素晴らしいものですが、ソフトウェアがなければその能力は全て無駄になってしまいます。 +この保管庫の目的は、私たちがソフトウェアについて現時点で知っていること皆さんに伝えることです。 + +ソフトウェアは、複雑でありながら人間が読み取れる一連の命令として記述されます。 +そのさまざまな形態は「プログラミング言語」と呼称されます。これはソフトウェアの制御に使われるソフトウェアがほとんどの場合「プログラム」と呼ばれるためです。 +これらのプログラムは、その後多くの機器が使用する「0」と「1」からなる「二進数」へと変換されます。この手順を「コンパイル」と呼びます。 + +コンパイルされたソフトウェアは、元のプログラムの形、すなわち「ソースコード」へ逆変換することが非常に難しいため、作成者はその元の形を秘密にして、そのソフトウェアの所有権を主張することができます。 +公開ソフトウェアはこの考え方とは全く違う考え方です。 +公開ソフトウェアの考え方は、秘密にしたり所有権を主張することなく、すべての人に無料でソフトウェアを提供されます。 +それによって他の利用者はそのプログラムを改良したり、それを元にして新しいより優れたものを作成することができます。 + +公開ソフトウェア計画とは、数千人・時には数万人にも及ぶことのある大規模な自律的な共同作業をするための計画です。 +そこに保存されているすべての公開ソフトウェアは、数百万にも及ぶ利用者が任意で投稿したソフトウェアの成果です。 +特定のソフトウェアにおいて、最新の公式ソースコードに対する変更提案を承認・却下する権利は一部の特別な人を除いて、誰もいません。すなわち、ここに保管されたソフトウェアは誰のものでもないのです。 +誰もがいつでも・無料で・なんの制約もなく、あらゆる個々に保管されたソフトウェアの完全な複製を取得し、使用する権利を有しています。これは「ソフトウェアの分岐」として知られています。誰もがこの元のソフトウェアを自由に改造し、分岐をさせることができるのです。 + +多くの人が同時にソースコードを編集する場合、すべての変更内容を把握し、統合することはとても困難です。そのため、この問題を解決するためにできた公開ソフトウェア計画が「Git(ギット)」です。 +このGitは、ソフトウェアへの全ての変更の履歴を、「Gitの保管庫」と呼ばれる1つのものに統合します。 + +この保管庫は、「GitHub」という企業によって作成されました。この企業は、世界中の人々が自作のソフトウェアを保存し、その変更履歴を見返して、他者と協力して改良・拡張が行えるサービスを提供しています。GitHubは、全ての利用者に対してサービスを無料で提供しています。 +GitHubには数千万人というユーザーが日々ソフトウェアを更新・改良し続けています。 + +この次は、このソフトウェアの保管庫を最大限に活用するために知っておくべきこと・用意するものについて説明します。もしその一部や全てがわからなくても、安心してください。これらの問題を解決できるガイドも載せています。万が一あなた方が対応できなかったとしても、あなたたちの子孫がいつか、やってくれることを祈っています。 + +## この保管庫を活用するために、必要なもの + +そもそも、この保管庫に保存されているものを活用するためには光と、なんらかの拡大鏡が必要です。しかし。その中に保存されている物の大部分は、特殊な形に変換されたり、圧縮された形でシートに非常に高密度で記録されています。 +これらを読み取り、我々が理解できる形に変換するためにはかなりの計算能力が必須になります。理論上は機器を使用せずに変換もできますが、それには非常にとても時間と手間がかかり、困難の極みでしょう。 + +おそらく、ソフトウェアや機器などの用語について、先ほどのような定義を見ることは必要なかったでしょう。皆さんはご自身の機器をお持ちであり、おそらくそれは現代よりはるかに高性能で我々の技術とは根本的に異なる基礎を採用しているでしょう。以下の説明をご理解いただければ、全てのデータを簡単に閲覧することができるでしょう。 + +しかし、皆様が持っている機器が私たちのものより性能が低かったり、そもそも機器をお持ちでない可能性もあります。 +そのようなことに備えて我々は「文明の歴史」 +と呼ばれる、圧縮も変換もされていない、人がそのまま読める形のものも用意しました。これらには現在の私たちの基礎の技術、機器、およびソフトウェアに関する情報が含まれています。いつか、皆様がこの知識を活用して、この記録の中の公開ソフトウェアを利用できる環境を再現できるようになることを願っています。 + +## 中に入っているもの + +この保管庫がこれほど巨大--およそ21兆バイトほど(詳しくは後ほど解説します。)--なのは、現在の技術の大部分をここに詰め込んでいるからです。 +GitHubの利用者が現在開発中の公開ソフトウェアの、ある特定の地点におけるコピーが含まれています。つまり、数百万もの記録がそのまま収められているのです。 +この広範囲かつ、民主的な方法が将来の人々の関心を引くことを、願っています。 + +この保管庫に含まれる記録は、最後に更新された日時の評価数に基づいて選定されました
GitHubの利用者は誰でも・誰にでも公開されているソフトウェアに対して評価をつけることができ、それは自分にとって興味深い、あるいは重要であることを意味しています。 +これは、西暦2020年2月2日、グレゴリオ歴による2020年2月2日に開始されました。 +この記録に含まれる条件は以下のとおりです: +過去80日以内に変更が保存されている全てのソフトウェア・過去365日以内に変更が保存されているかつ、評価が1つ以上ある全てのソフトウェア・最終更新日に関係なく評価が250個以上ある全てのソフトウェア + +もちろん、この記録全てが重要というわけではありません。「文明の歴史」には記録の中で最も重要なソフトウェアの索引と概要が記載されており、それぞれがどの場所にあるかも一覧表示されています。これによって、数百万の記録を全て1個づつ確認して必要なものを探し当てる手間なく、必要な記録を素早く閲覧することができます。 + +## 保管庫の概要 + +これに保存されているものは、188本のシートで作られています。その内訳は、人間が読み取れる情報と案内が記録されている「案内のための巻物」(我々はこれを「文明の歴史」と呼んでいます)が1本、そしてソフトウェアが記録されたシートが187本です。それぞれのシートには65,000コマもの記録が詰め込まれています。 +それぞれのシートの初めの部分と案内のための巻物には、人間が読み取れる文章や画像が入っています。それ以外の全てはQRコードと呼ばれる視覚的な形で保存された電子記録で作られています。 + +「デジタルデータ」とは、二進数で保存されているデータを意味しています。 +これは、機器自体が二進数で我々にとっての「0」が機器にとっての電気信号が「なし」になっていて、我々にとっての「1」が電気信号が「あり」で制御されています。そのため、機器にとって他のいかなる複雑な形よりも、デジタルデータである二進数がはるかにシンプルで、理解しやすいのです。 + +それぞれのシートの一番最初に記録されている人間が読み取れる形のものには、そのシートに関する情報・使用されているQRコードの記録するための決まりの案内・そしてそれを我々が読めるようにするためのソフトウェア、そして索引含まれています。索引には、そのシートに保存されているファイルの名前、そのファイルがどのコマから始まっているか、そして数値によってこのデータが合っているかを確認できるものが記載されています。これを「チェックサム」と呼んでいます。 + +「ファイル」とは、1つのまとまりのあるデータのことです。「チェックサム」とはファイルの内容の全てに対して、「ハッシュ関数」と呼ばれる計算を実行して手に入れられる1データ1つしかない数字です。これにより、データが1つでも変わるとこの数字が全て変わってしまい、元の数字と比べることでデータが変わっていないかを確認することができます。この記録で使われているハッシュ関数の種類は「SHA-1」というもので計算されています。 + +それぞれのQRコードは、シートのコマのほぼ全てを埋めるほどの大きさで、小さな白と黒の四角形を並べてある形で作られています。このQRコードが採用されているのは、人間の目で見える文章より小さく、より多くのデータを入れられて、多少の汚れでも読み取れるという点で優れているためです。このQRコードも0と1でできているデジタルデータです。 + +変換処理は、あくまでそのデジタルデータを意味のある情報に変換するための第一歩に過ぎません。これは圧縮されているデータであり、容量を節約するために圧縮されています。 +例えば、文字の「A」を128回書く代わりに。「128×A」などと書くことと同じようなものです。変換処理をした後は、この圧縮を復元する必要があります。 + +復元後は「アーカイブファイル」と呼ばれます。これは、1つのソフトウェアの記録の全てを1つに収めたファイルです。ほとんどの記録には多数のファイルが含まれているため、このアーカイブファイルは多くの章から成る本や、マトリョーシカ、箱の中の箱のようなものです。アーカイブファイルの中のファイルを閲覧する前に、それを構成しているファイルを1つづつ復元しておくことが一般的ですが、必須というわけでもありません。 + +最後に、それぞれの部品ファイルは、それ自体がデジタルデータ、つまり二進数の「0」と「1」の集まりです。データの決まりがわかっていれば、その内容を理解することができます。例えば、この記録で最も一般的な決まりであり「UTF-8」では、0と1を8ビットずつ(バイト)のグループに分けられ、バイトの「01000001」 +では文字の「A」を表します。3バイトの「01101001 01101110 01110100」は単語の「int」(整数)を表し、2バイトの「11000011 10000011」は文字「Ã」(上に波線がついたA)を表せます。 + +このデータを記録する処理--デジタルファイルをアーカイブファイルに詰め込み、まず圧縮してからQRコードの形にするという手順は、単に人間が読める形で書き出すのと比べれば、明らかに複雑です。また、この記録を復元する際に行う必要がある一連の処理--QRコードから圧縮されたデジタルデータに、圧縮されたデジタルデータから復元したデジタルデータへ、デジタルデータからファイルとして人が読めるようにする。という手順はとても複雑です。複雑な方法を採用している理由:この複雑さによって他の方法では不可能なほどの膨大なデータを機器が他と比べて容易に読み取れる形で保存できるからです。 + +この複雑さが皆様にとって負担となり、手間・コストがかかるものであれば申し訳ありませんが、このような場合には、この案内と人間が読みやすい形の文明の歴史が複雑さを少しでも軽減し、少なくとも皆様の機器がこの保存されたデータを容易に処理できるほどまでに高度に成るまでは、保存されたデータを無理に解読せず、この案内と文明の歴史を読んでいた方が役立つものになるのではないかと思います。 + +## ファイル・フォルダ・記録の保管庫・データの決まりについて + +この保存がどのような形で保存されているか、を理解するのは、きっと役に立つでしょう。特に、ファイルやフォルダ、データの決まりについての解説は皆様の復元作業をより高速に進める助けになるでしょう。 + +ファイルとは、一つの名前でまとめられたデータの集合体のことです。例えるなら、データが「砂」で、ファイルはその砂を詰めるための「袋」だと考えてください。そして、ディレクトリ(フォルダ)とはファイルの集まりです。これは「袋だけを入れられる大きな袋」のようなものだと思ってください。 +この例えで言えば、すべての保管庫には、一番外側に「ルートディレクトリ」と呼ばれる大元の袋があります。その中には、いくつかのファイル(砂の袋)や、いくつかのフォルダ(袋を入れる袋)が入っています。さらに、それぞれのフォルダの中にも、ファイルとフォルダを自由に入れることができるのです。 + +このようにデータをグループ分けして整理するのは、大量のファイルをバラバラに置いておくよりも、ずっと扱いやすくなるからです。 +特定のファイルがどこにあるかを示す「住所(識別子)」は、一番外側の「ルート」から始まり、そのファイルが入っているすべてのフォルダ名を /(スラッシュ)で繋いで書き表します。 +例えば、ルート(一番外側の袋)の直下にある README.md というファイルは、 /README.md と書きます。 +また、 /public/www/index.html と書かれていれば、それは「ルートの中にある『public』フォルダの中の、さらに『www』フォルダの中にある『index.html』というファイル」のことだとわかります。 + +README.mdは一番最初に読む、いわば説明書のようなものです。.mdの拡張子はMarkdown(マークダウン)という形の文章ファイルの決まりです。これは記号を使うことによって太字や波線などを表現できます。 + +それぞれの保管庫(リポジトリ)には、2つの名前が付けられています。その2つの名前は区切り文字で分けられており、このアーカイブでは _(アンダースコア)が使われています。 +(歴史的には / が使われていましたが、フォルダの区切りと混ざってややこしいため、ここでは分かりやすくするために _ を使っています。) +最初の名前は、その保管庫を所有している「所有者名」で、2番目の名前はその「保管庫自体の名前」です。 +「保管庫の名前」と「ファイルの住所」を組み合わせることで、アーカイブ内の膨大なデータの中からたった一つのファイルを特定することができます。 +例えば、rezendi という人の、 ykarma という保管庫の中にある、 web というフォルダ内の package.json というファイルを探したい場合。 +このアーカイブ内では、 rezendi_ykarma という場所にある /web/package.json として、世界に一つだけの住所が完成するのです + +.jsonは我々の時代で使われていた我々人間にも、機器にもどちらにも読みやすい情報を伝達する決まりのことです。 + +ファイルの種類によって、その用途は大きく異なります。GitHubの保管庫は、主に文章ファイルで作られています。文章ファイルはその名の通り、そのデータが文章を表すことを目的としたファイルです。ほとんどのソフトウェアは、ソースコードと呼ばれる厳しいルールで書かれた文章を含む文章ファイルで書かれています。コンパイラと呼ばれるソフトウェアが、人間が読めるソースコードを機器が理解できる命令に変換します。ソースコードから機器が理解できる命令に変換したことを「コンパイル」と呼びます。 + +画像やコンパイル済みコードを含むファイルなどの、文章ファイルではないファイルは時々「デジタルファイル」と呼ばれます。しかし、テキストファイルもデジタルデータと同じの0と1で構成されているため、究極的にはすべてのファイルがデジタルファイルと言えてしまうのです。そのため、誤解を防ぐためにここでは文章ファイルではないファイルを「非文章ファイル」と呼ぶことにします。 + +人間が人間と会話をする時の言語を0と1を使って表現する方法は数多くあります。現在では、歴史的な経緯からほとんどは「ラテン文字」と呼ばれるもので書かれていました。ラテン文字には発音が可能な単語を表す26個の基本的な文字があり、それぞれに大文字と小文字の2つの形があります。また、数字を表す10個の文字もあります。これらのラテン文字や構造を表す記号を0と1のデジタルデータに変換する決まりが「ASCII(アスキー)」です。 +ASCIIは128種類の文字を異なる0と1の配置で +表すことができ、歴史的な理由から長年にわたり、ほとんどのソフトウェアでASCIIが使われ続けてきました。 + +しかし、ラテン文字は人間の言語の数多くのうちごく一部でしかありません。他の言語にも対応しつつ、ASCIIの決まりで書かれたソフトウェアを引き続き動作させることができるようにするために、新しい決まりの「UTF-8」という別の決まりが導入されました。 +(新しい形でも古いものを動作させられるようにする工夫を「下位互換性」と呼びます。) + +ASCIIは現在でも一般的なソースコードの形です。この記録の各シートには、ASCII文字に関する案内が含まれています。ASCIIはUTF-8の拡張であり、ASCIIでの変換はUTF-8での変換でもあります。つまり、UTF-8にはASCIIの形も含まれています。案内シートには、すべてのUTF-8文字の仕様も記載されています。 +この記録の文章ファイルのほぼすべてはUTF-8で書かれているはずです。 + +非文章ファイルには、画像や文字の形を設定した文章を表すファイルが含まれます。一般的に、[ファイル名].[拡張子]という形で名前が保存されています。「.」はドットと読みます。 +例えば、「.」のあとがjpgで終わっている場合はJPEGという形の画像ファイル、pngで終わっている場合はまた別の画像ファイルの形で、pdfであれば太字や装飾の設定が保存されているファイルの形で保存されている可能性が高いです。(無理やり拡張子を変更した場合は必ずこの通りではない可能性もあります。) + +文章で書かれたファイルを示す特定の拡張子は存在しません。ソースコードの文章の場合、その拡張子はどの形で書かれたかを示すことが多いからです。プログラミング言語・マークアップ言語については、後ほど詳しく説明します。 + +## 記録の中身を閲覧する方法 + +ここでは、特定の保存された記録・それを構成するファイルを復元する方法の概要を説明します。繰り返しになりますが、復元プロセスは以下の手順で構成されます: + +1.閲覧したいデータが保存されているシートとコマを特定する。 + +2.QRコードからそれらのコマの白・黒・グレーの粒々を復元し、0と1の列からなるデジタルデータに変換する。(粒々は少なくとも数千、多くの場合は数百万) + +3.デジタルデータを復元し、より長い変換済のアーカイブファイルにする。 + +4.アーカイブファイルを復元し、その中に含まれているサブファイルを取り出す。 +(※この手順を省略しても、乱雑ではあるが一般的に理解可能ではある。) + +5.最後に、中にあるサブファイルが文章ファイルである場合、それを文字列に変換する。(それ自体が0と1の列であり) + +### 保管庫のデータが保存されている具体的な巻物とコマを特定する + +巻物の各シートの冒頭には、何も書かれていない部分があります。その次にあるのが「ゼロ基準コマ」です。これは、何も書かれていないコマの片隅に真っ黒な長方形が描かれており、これはデータを解読するときの基準となります。 +次に、人間が読み取れるコマとして、「制御コマ」があります。このコマにはこの巻物に関する情報が記録されています。その次に、「目次」が続きます。目次には、この巻物に含まれている利用者データファイルの一覧が記載されています。 + +この巻物に収められているそれぞれの保管庫は、先ほどの利用者データファイルのうちの1つです。この目次には、各ファイルの固有番号、ファイル番号、そしてファイル名が含まれています。例えば、Pythonという名前のアカウントのCPython保管庫の場合は、ファイル番号は「12345」、ファイル名は「python_cpython.tar」と記載されているかもしれません。 +「.tar」という拡張子は、バラバラのファイルを1つのまとまった塊として扱うための形です。これは中身を圧縮することなく、例えばバラバラの石を1つの糸で繋ぐようにして1つのまとまったものにするためのものです。 + +利用者データファイルの一覧の次には、デジタルデータの住所の一覧があります。この一覧表にはファイル番号・開始しているコマ・開始バイト・終了コマ・終了バイトが含まれています。例えば、先ほどのCPythonの例を使うと、この一覧内の番号:12345を持つ項目は、開始コマが「054321」開始バイトが「03210321」終了コマが「054545」終了バイトが「12321232」となる可能性があります。 +「バイト」とは、1つのコマの中に敷き詰められた膨大な0と1の列を数えるための単位です。例えば、コマを本のページだとすると、バイトはその本の何文字目かを指しているということです。 + +つまり、CPythonのデータを取得するには次のような手順で取得できます。 +1.この巻物のシートにあるコマ「54321」に移動します。 +2.開始コマである「54321」から終了コマの「54545」までのすべてのコマを以下で説明する方法を使って二進数のデジタルデータへと変換します。 +3.これにより、54321から54545までの番号が振られている合計225個のデータが得られます。 +4.これらのデータの始まりには、データが何も含まれていない部分が存在しています。そのため、最初にデータのうちの「3210320バイト」分は使わずに捨ててください。 +5.その次に続くデータをすべて順番通りに繋げます。 +6.最後に、一番最後にあるデータ(この例の場合は54545コマ)から「12321232バイト」分を繋合わせます。 +これでCPythonの保管庫、1つの圧縮されたアーカイブファイルが組み立てられました。おめでとうございます。 + +### QRコードから二進数ファイルへの変換方法 + +この巻物のコマを二進数のデジタルデータに変換する方法の詳細は、すべての巻物の冒頭 目次の次にある人間が読み取れる「データの解読方法(表現情報)」の中に記載されています。 +この情報はすべての巻き物に欠かさず記録されています。これは、例えば解読方法が記載されている巻物をなくしてしまっても、この巻物単体で中身を解読できるようにするためです。 +この「データの解読方法」は以下の手順が順番に記載されています。 + +1.GitHub-コード保存計画への案内(この文書) + +2.GitHub-目次:この巻き物に収められているすべての保管庫の一覧とその簡単な説明 + +3.表現情報の説明:データがどのような意味を持っているかの説明 + +4.デジタル保存とデータの取得方法:データ取得の詳細に関する概要 + +5.保存媒体の説明:このフィルムがどのような媒体でできているのか + +6.データ取得技術の説明:読み取りに必要な技術的な詳細 + +7.保存巻物の共通のつくり:巻物全てがどんなルールで構成されているか + +8.汎用4Kコマの形の説明:1つ1つのコマのサイズや形 + +9.解読するためのプログラムの解説:QRコードを読み解くための仕組みの解説 + +10.解読用プログラムのソースコード:QRコードを解読するためのプログラムの「設計書」 + +11.ASCIIデータ形式の仕様書:文字をデジタルデータにするための基本ルール + +12.C言語の仕様書:世界で最も基本的な機器に命令をするための言語「C」の決まり + +13.TAR保管ファイルソースコード:先ほど説明した「.tar」を扱うためのプログラムの設計図 + +14.PDFファイルのソースコード:文章を設計通りに表示するための拡張子のプログラムの設計図 + +15.XZファイル形式の仕様書:データを圧縮してデータ量を小さくしたり復元して元のデータにする「圧縮・復元」の決まり + +先ほどのものの6番目の「データ取得技術の説明」文書では読み取り機を使用して巻物のデジタル化されたコマ状のデータを撮影し、それを機器で分析しやすい形に変換するための要件と手順が記されています。また、8番目の「汎用4Kコマの形の説明」には、読み取られた画像を機器がデジタルデータに変換するために必要な技術的な情報を提供しています(ソースコードを含む) + +理論上では、機器を使わずにQRコード化されたデータを人が変換することは可能ではあります。ですが、それは極めて困難でありたとえどれだけ統制のとれている素晴らしい組織でも短くても数ヶ月、最長で数十年という膨大な時間と多大なる労力が必要となるでしょう。保管庫の内容は機器の上で動作することを目的としたソフトウェアであるため、苦労して中身を変換したとしてもそれを利用できる場面はほとんどないでしょう**。** +つまり、ソフトウェアがあっても動かすための機器がなければ使えませんし、機器があっても動かすためのソフトウェアがなければ、それはただの箱にすぎません。この両者は、互いがなくてはならない『共依存』の関係にあるのです。 + +もし、この記録を見つけた人々が機器を所有していない場合は、機器を入手できるまでこの記録をそのままの状況で安全に保管しておいてください。人間が読める形の「文明の歴史」を作った理由の1つは、このような事態に備えて技術や機器の開発を加速させることにあります。(もう1つの目的は、将来の歴史家のために現在での我々の技術とその発展の歴史を体系化することです。) + +### アーカイブファイルを、その中に含まれる個別のファイルへと展開する + +それぞれの保管庫のデジタルデータは、「TAR」(テープアーカイブ)と呼ばれる形で保存されています。TARファイルとは:複数のファイルを順番に、繋ぎ合わせたものです。1つのファイルの最後をまたある1つのファイルの最初に繋ぎ合わせることで1まとまりにするものです。例えば、バラバラの紙をテープで貼り合わせて1つの紙にするようなことです。 +TARの形を使うと、どんなに大きなファイルでも、どんなに複雑なフォルダになっていたとしてもすべて1まとまりに収めることができます。 + +TARの形でできているファイルの各ファイルの先頭には、512バイトの「ヘッダーレコード」というものがついています。これは、先ほどの例えで言うテープの役割を果たすものです。このヘッダー部分には、そのファイルの名前、ファイルの大きさといった情報が記録されています。アーカイブの終わりは、この512バイトの部分が2つ以上連続して続いていることで終了となります。 + +TARファイルは本質的にはファイル同士の間に、テキストによる記録を挟んだ詰め合わせにしかすぎません。そのため、もしTARファイルがすべて文章ファイルで作られている時はそれ自体が巨大な文章ファイルとして扱えます。ですが、さまざまな形のファイルが混ざり合っているTARファイルである場合、「構造化された意味のある文章」(中身の文章ファイル)と「意味不明な文字列」(非文章ファイル)が混ざりあった1つの文章ファイルとして見ることができるでしょう。 + +TARファイルは、別のTARファイルの中に詰め込む、いわば「入れ子」や「マトリョーシカ」のようにすることも可能です。実際、私たちが保管しているデータの多数はこの方法で保存されています。 +どの保管庫においても、外側のTARファイルには少なくとも以下のものが必ず含まれています。 + +・META:保管庫の名前・利用者名・説明文・使用されているプログラミング言語・評価数・枝分かれしたソフトウェアの総数などが記載された、圧縮されていない1つの情報ファイル + +・COMMITS:保管庫がこれまでにどのような変更がされてきたかの記録を収めた圧縮ファイル + +・repo.tar.xz:その保管庫の中身そのものを収めた、圧縮されたTARファイル + +それらに加えて、Wiki(解説ページ)・GitHub Pages(体験するためのページ)・やることの一覧・修正提案などの情報データも個別の圧縮ファイルとして含まれる場合もあります。 + +TARファイルの詳細やその圧縮・復元を行うソフトウェアについては、記録の各巻物に含まれる「表現情報」を閲覧してください。 + +### 圧縮ファイルを復元して、読み取れる非圧縮ファイルに変換する + +できるだけ多くの保管庫とデータを詰め込むために、データのほとんどは圧縮されています。圧縮とは、データの中に含まれている特定の列・または繰り返しを利用して少量のデータで大量のデータを表現することを指します。例えば、文字「a」を9回そのまま書く代わりに、「9a」とだけ書くようなものです。これは、読み手が「9a」のことを「aが9個ある」と正しく理解してくれると言う信頼と確信があって成り立つ方法です。 + +実際のより効率的な圧縮方法は先ほどの例よりはるかに複雑ですが、根本的な仕組みは同じです。この記録では「XZ」と呼ばれる圧縮プログラムを使用しており、これは「LZMA」と呼ばれる方法を採用しています。すべての巻物の2番目のデータファイルには、このXZのソースコードと説明書が圧縮されていない1つのTARファイルとして保存されています。(1番目のデータファイルには、現時点で存在しているあらゆる言語で書かれた 『世界人権宣言』と言う文章が収められています。) + +「LZMA」は「LZ77」と呼ばれる方法と「範囲符号化」と呼ばれる技術を組み合わせたものです。LZ77は繰り返し出てくる列の並びを「前に出てきた列の並びの参照」に置き換えます。とても簡単に説明すると、列の並び「⚫︎1234321」が2つ出てきていれば、2回目に出てきた時に『「⚫︎」を参照しろ』、というような指示をすることでデータを圧縮しているのです。 +一方の「範囲符号化」は、メッセージ全体を実質的に「1つの非常に長い数字」に変換して、さらに効率よく記録する手法です。 + +データの復元に使用する方法の具体的な手順は、各巻物の2番目のデータファイルに含まれるXZソースコードに記載されています。理論上は手作業で復元することも可能ですが、これは非常に膨大な時間と労力を要する作業となります。これは現実的な作業ではないため、実質的に動作する機器が必須になるでしょう。 + +### それぞれのデータを文字データへと変換する方法 + +我々人類は、数千年にわたりの非常に多くの文字を使用してきました。この記録において、これらの文字を「0」と「1」で表現するために採用された決まり(符号化方式)は「UTF-8」として知られています。UTF-8では、1つの文字を表現するのに、1から4バイトのデジタルデータを使用します。 + +歴史的な理由、すなわちソフトウェア開発が始まった時代や地域において最も広く多く使用されていたため、「ASCII」(アスキー)として知られている文字群(およびその概念)は、1文字あたり1バイトという最も効率的な形で符号化されます。ASCIIに含まれない文字はすべて、1文字あたり2バイト以上を使用して符号化されます。これに保存されている文章ファイルの多くはASCIIですが、かなりの数のファイルはASCII以外で書かれています。また、基本はASCIIですが、時々ASCII以外の文字が混ざっているというファイルも多く存在しています。 + +ASCIIの詳細な仕様は、保管庫の各巻物に含まれる「表現情報」に記載されています。また、UTF-8の詳細な仕様は「案内巻物」にまとめられています。保管庫の全ての巻物において、最初のデータファイルには現在使用されているあらゆる言語で「世界人権宣言」という文章が書かれています。これが、異なる言語の間の翻訳機として役立つと同時に、ASCIIおよびUTF-8の具体的な例としても機能します。 + +## ファイルの種類 + +文章ファイルは、作成された目的によって異なる形で作成されています。ここに保存されている主な形、そしてこの保管庫が存在する最大の理由は「ソースコード」です。ソースコードは非常に中身が詰まっており、厳密なルールで組み立てられている文章であり、「{」や「;」といった記号が極めて重要な役割を果たしています。 + +ソースコードで重要なのは、それがコンパイラに読んでもらえるように書かれているということです。コンパイラもソフトウェアであるため、言い換えればソースコードは機器に読ませるために人間が書いたもの。と言えます。優れたコードはその分野の知識が優れている人間にも理解できるように書かれていますが、最終的にコンパイラが正しく処理できなければ、それはプログラムとして成立しません。 + +そのコンパイラは、文明の歴史で説明されている複雑な手順を経て、ソースコードを0と1のデジタルデータに変換し、それによって機器が思った通りの動作を実行します。ごく簡単な例として、次のような1行のコードを見てみましょう。 + + _for (int i=0; i<5; i++) { }_ + +このコードはコンパイラによって二進数の命令形式に変換され、機器へと送られます。すると、機器の中にある「レジスタ」と呼ばれるとても小さい部品の数値が0にセットされ、次に1,2,3,4へと順番に増やされていきます。(これは役立つプログラムの例ではなく、ソースコードが実際に動くソフトウェアへと変わるまでのステップを説明するための例でしかありません。) + +JSON・XML・HTMLなどの他の種類の文章ファイルは、(命令ではない)機器のためのデータを保存するために使用されます。これらは人間が読むことも可能ですが、決まりに沿って構造化されているため、一般的な文章と比べると少し読みづらく感じるかもしれません。 + +他のほとんどの文章ファイルは、最終的に人間が読むことを想定して作られています。中には、今あなたが読んでいるこのファイルのように単純でほとんど構造化されていない文章ファイルもあります。この記録で頻繁に見かける形式の1つが「Markdown」です。これはファイルの拡張子が「.md」であるもので、人間がそのまま読める形でありつつ機器が太字や見出しなどの魅力的で実用的な設計を表現できるように構造化された、一種の中間形式です。この記録内のほとんどには、「README.md」という名前のMarkdownファイルが含まれています。このファイルは、一般的にこの保管庫の概要を紹介するものであり、その内容・作った理由・そして使用方法について説明しています。 + +最も一般的に使用されている非文章ファイルの種類について簡単に解説します。これは皆様にとっても役立つでしょう。コンパイル済みのコードは非文章ファイルです。JPGやPNGファイルは画像をデジタル形式で変換します。PDFファイルは正確かつ完璧に作成者の設定した通りの文書の装飾を変換します。また、前述の通りZIPやTARファイルはコンテナファイルの1つであり、1つまたは複数の他のファイルを含んでいる可能性のある、袋のような形式のファイルです。 + +## 人類の言語とプログラミング言語 + +### 人類の言語 + +現在人類が使用している文字言語は数千にも上り、話されている言語はさらに多くなっています。その大半は比較的少人数の集団でのみ使用されていますが、少なくとも6,000万人以上の人々が使用している第一言語、または第二言語として使用している言語は20ヶ国語以上存在しています。 + +世界で最も広く使われている言語は、「英語」と「中国語」です。歴史的な理由から、長年わたりソフトウェア開発の多くは英語を使用している国々で行われてきたため、一時期英語はソフトウェア開発の標準的な言語となりました。ほとんどのプログラミング言語は、構文に英語の単語を使用しています。この記録の案内も、当初は英語で書かれました。 + +この記録を見ている皆様が英語を理解できるとは限りませんが、英語は他と比較して永続する可能性が高い言語であると思われます。多言語の指針として役立つように、各巻物の最初、および文明の歴史内に500以上の言語に翻訳された『世界人権宣言』を非圧縮のUTF-8ファイルとして保存しています。この宣言は、現代における全ての人類の権利と自由を列挙したものであり、これは決して奪われてはならないものです。 + +### プログラミング言語 + +プログラミング言語とは、人間が機器に指示を伝えるために使用する言語のことです。これらはソフトウェアを作成するための言語です。他の人間もプログラミング言語で書かれたソフトウェアを読み取れるべきですが、それは二次的な目的です。 + +プログラミング言語とは、あらかじめ定義された要素(その要素の多数派単語である)の集合であり、それらを構造化された形で組み合わせることで機器に対し、指定された方法で指定された動作を実行するように指示することができます。こうした支持の集合体はプログラム・またはソースコードと呼ばれます。ソースコードとは、本質的に固定化された記述形式のソフトウェアのことを指します。 + +プログラムは通常、「文」と呼ばれる個別の段階に分割され、それがさらに「関数」と呼ばれる集合体にまとめられます。プログラム全体が1つのファイルに収まることもあれば、複数のファイルに分散していることもあります。その場合、多い時だと数千にも上ることもあります。 + +プログラミング言語には、現在数百種類もの種類があります。その形態・ 設計手法・そして考え方も多岐にわたります。コンパイルされて個別のデジタルデータとなり、その後に実行される言語もあれば、「インタプリタ型」言語と呼ばれるように、中間の段階を経ずに事実上一度コンパイルと実行が行われるものもあります。現代のプログラミング言語のほとんどには、あらかじめ作成された関数の集まりである「ライブラリ」が含まれており、そのライブラリは非常に大規模で精巧なものになることもあります。現在最も普及しているプログラミング言語には、次のようなものがあります + +* C:最も古く・高速で・汎用性が高く、強力な言語の一つ。ある面ではシンプルですが、またある面ではかなり制限があり、必ずしも直感的で・読みやすく、習得しやすいとは限りません。 + +* C++:C言語より複雑で、抽象的かつ強力な進化した言語。 + +* C#:さらに進化した言語で、バイナリ(0と1)の機器変換ではなく、インタプリタ型の「ランタイム」にコンパイルされる。 + +* Java:これは、C#と似ている言語であり、おそらく現在で最も広く使用されている言語です。(ただしC#よりも先に開発された言語です) + +* JavaScript:これは、名前が似ているにもかかわらずJavaとは全く異なり、「ECMAScript」としても知られています。開発当時はWebブラウザ内でのみ使用されていた言語であり、つまりインターネットサーバーと呼ばれる遠隔の機器からデータを取得し・解釈し・表示するためのプログラムでした。しかし、現在ではサーバー上でも広く使用されています。 + +* TypeScript:JavaScriptの一種であり、より厳しい決まりが設けられているためバグと呼ばれる不具合がプログラムに混入しにくくなっている言語です。 + +* Python:開発者の間で人気のある洗練された言語で、強力でありながらプログラミングの練習としても適している言語です。 + +* Ruby:直感的な言語で、この言語で書かれた文はしばしば英語の文章のように読めることがあり言語です。 + +* Go:シンプルかつ強力な言語で、特に同時に処理するプログラム、つまり複数の関数が同時に独立して実行されるように書かれたプログラムで、優れた性能を発揮します。 + +* Swift:現在では10億人以上が使用するスマートフォンやその他の機器向けのソフトウェア開発に使われている比較的新しい言語です。 + +* Rust:C言語の後継として開発された言語で、危険な不具合の発生を大幅に低減します。 + +* PHP:インターネットサーバーで使用されている、扱いやすい言語です。 + +* Lisp:非常に歴史の長い言語で、関数を第一に考えるという他の言語とは根本的に異なるプログラミングの考え方を採用しています。 + +* SQL:データベースと呼ばれる構造化された高効率なデータを格納する場所からデータを取得するために使用される、非常に独特な種類の言語です。 + +* アセンブラ (または「アセンブリ」):非常に難しく、機能は限定的だが、高速かつ強力な言語群。言語構文と対象となる機器のマシンコードとの間に直接的な関係があり、半分コンパイルされているコードと見なすこともできる。 + +## 開発・依存関係・および公開ソフトウェアに関して + +### 開発 + +1つの単純なソースコードを、機器内部の電気信号に変換する手順は極めて複雑です。私たちは「抽象化の階層」を用いることでこの複雑さを処理しています。例えば、「命令セット」と呼ばれる抽象化により、1つのコンパイラから出力されたマシンコードを多種多様な機器上で利用することが可能になります。ソースコードの作成者は通常、そのコードを実行するためにどのような機器、あるいはどのような命令セットが使用されるかを知る必要も、気にする必要もありません。これらはコンパイラによって抽象化されているからです。 + +現代のソフトウェアは、一人の作者が1つの機器のために1つのプログラムを作る。といった単純なレベルをはるかに超えて複雑になっています。1つのソフトウェアの中で、多くの作者が同時に、時には複数のプログラミング言語を使い分けながら、膨大な数のファイルを編集しています。 +さらに、あらゆるソフトウェアは他の独立したソフトウェアを開発環境や部品として利用し、それらに依存しています。それら依存先のソフトウェアもまた現在進行形で開発されており、さらに別のソフトウェアに依存しているのです。こうした「常に変化し続ける膨大な部品」を上品活効率的に連携させることこそが、現代のソフトウェア開発における最大の課題なのです。 + +ソフトウェア開発者として知られる複数のソースコード開発者が、1つのソフトウェアに取り組みとき、それぞれが自身の機器を持ちその中にプロジェクト全体のコピーを保持します。もし各自が変更を加えた場合、同じソフトウェア内に異なるバージョンが複数存在することになります。これら複数のバージョンを調整し、1つにまとめる工程を「バージョン管理」と呼びます。これはバージョン管理ソフトウェアによって管理されており、この記録においては「Git」というソフトウェアがその役割を担っています。GitHubという名称もこのGitというソフトウェアを使用しているため、この名称になりました。この記録に含まれる全ての保管庫はGit保管庫です。 + +Gitを利用すると人の介入を最小限に抑え、ソフトウェアの異なるバージョンを自動的に統合し、一貫性のある形にまとめることができます。また、Gitはすべての変更の履歴を保持しているため、必要に応じていつでも以前のバージョンに戻すことが可能です。ただし、容量を削減するためにこの保管庫の記録には通常Gitの履歴は含まれていません。 + +複数の開発者が、1つのソフトウェア開発を同時に異なる方向へと進めることを、「ソフトウェアのブランチ(分岐)」とよび、その進む経路を「ブランチ」と呼びます。合意の上でソフトウェア開発の主要な系統となるブランチは「トランク(幹)」あるいは「マスターブランチ」と呼ばれます。Gitには、2つのブランチ間の違いをまとめ、自分の成果を相手側に統合することを提案する機能があります。これが「プルリクエスト」として知られるものです。現代のソフトウェア開発は、主に「プロジェクトを分岐させ、自分の分岐先でソフトウェアを記述・編集し、完了したらその成果を幹に再統合してもらうためにプルリクエストを送る」という作業で構成されています。 + +### 依存関係 + + 基本的に、あらゆるプログラミング言語は他人の成果(ライブラリなど)を土台として新たな物を作ることを支援しています。他人の成果を再利用しなければ、あらゆるプロジェクトは0から作成されることとなり、それには途方もないほど困難で大量の時間を要し、現実世界で実際に使われるソフトウェアはごくわずかになっていたでしょう。 + +プロジェクトAが動作するためにプロジェクトBを必要とする場合、AはプロジェクトBに「依存」している。と言い、BはプロジェクトAと「依存関係を持っている」と呼ばれます。Aは多くの依存関係を持つことができ、さらにそれら一つひとつの依存関係がまた別の関係をいくつも持っている......というように連鎖していきます。さらに、それぞれの依存関係にはプロジェクトの特定のバージョン、あるいはバージョンの範囲が指定されます。あるプロジェクトにおけるこれら何層にもわたる依存関係の全てを詳細に書き出したものは「依存関係ツリー」と呼ばれます。 + +一般的に、依存関係はソースコードファイルの内部、通常はファイルの先頭の部分に列挙されています。コンパイラやインタプリタは、依存関係を見つけるためにあらかじめ決められたフォルダの中からその対象を探し出します。プロジェクトの依存関係ツリーは非常に複雑になることがあるため、それらを「パッケージリスト」と呼ばれる1つのファイルにまとめて記載することがあります。例えば、Rubyという言語のプロジェクトでは、Gemfile、JavaScriptではpackage.jsonというファイルがこの役割を担います。これにより、「パッケージ管理ソフトウェア」と呼ばれるツールを使ってインターネット上のサーバーからプロジェクトに必要な全ての依存関係を一括で取得することができるのです。 + +この記録の場合、あるプロジェクトに必要な依存関係はこの記録内の別の場所に存在している可能性が高いです。記録の中から依存関係を見つけ出すには、まずソースコードやパッケージリストの中から、その依存関係の具体的な名前を特定する必要があります(特定方法は言語などによって異なります)。名前がわかったら案内巻物にある目次を使用するか、各巻物にの先頭にある索引を使用して、目的の保管庫がどの巻物の、どのコマにあるかを確認してください。 + +### 公開ソフトウェア + +機器上でプログラムを実行するには、コンパイルされたマシンコードさえあれば良いのでソースコードを非公開にしたまま、マシンコードのみを配布することが可能です。これは「クローズドソースモデル」として知られています。機器技術の黎明期には、通常ソースコードはマシンコードとともに配布されていましたが、その後ソフトウェアが収益性の高い産業となるにつれて、クローズドソースモデルが一般的になっていきました。 + +その後、ソースコードを公開し誰もがコピー・分岐の作成・改良を行えるようにすることが、ソフトウェア開発においてはるかに効果的なやり方であるということが明らかになりました。プロジェクトのソースコードを読める人が増えれば、潜在的な需要や有用な新機能を見つけ出す人が増え、プロジェクトを十分に理解して貢献できる人が増え、不具合を発見して提出してくれる人が増え、新しいコードが正常に動作するかどうかを検証してくれる人も増えることになります。 + +一般的に、クローズドソースは規模が小さく・閉鎖的で・分断された集団を生み出し、そうした集団は新しく優れたアイデアを見つけ、そのアイデアを取り入れることに苦労することになります。一方、オープンソースは大規模で相互に繋がった集団を生み出します。各集団は、互いのプロジェクトが成長し・繁栄し・成功するように助け合い、互いの成果物を依存関係として利用したり、コードを再利用したりして互いに学び合います。オープンソースソフトウェアは、全人類が共同で利用できるツールキットであり、より多く・より優れたツールがあればあるほど、人類はより早く・より良く進歩することができるのです。