タブまたはスペースインデント? 統計3.8万Perlのファイルを作成24年

の永遠の問題プログラミング—文字用プログラムコード インデント—ブ-スペース.

があり、そこでは選択肢はありませんでした。 例えば、 Makefile を使うようにしてください機能です。 の言語 グ go が正式公 gofmtを コードする形式で、このユーティリティ 使用タブのための記述. B難解なプログラミング言語 Whitespace タブやスペースを取り替えできません ます。 多くのプログラミング言語よっても異なるが、ここで選択させることができるプログラマー 何かを考え,議論することで文字を利用します。

が人気なの意見を文字の使用のための記述. の意見は以下の問いませんを使用するかどうかとの一貫性を追求します。 ご利用の場合はタブでは、常に必要としています。 の場合 利用空間の使用だけの空間は、使用しな機能です。

もっとコミック漫画コミックはこの科目:

(お二人で全く同意できないとお互いを使用するか否かのタブ スペースが絶対に同意することが必要である使用のみ):

どのものでしょうか。 何が実際に使われるのか?

けで十分ですべてください。 が必要なソースコードのプログラムを計算 文字の使用などをご紹介します。

この記事では、この研究はほとんどの使用についてのタブを空間 世界のPerlプログラミング言語. あの巨大リポジトリが格納されているPerl 図書館CPAN. ダウンロードしたすべてのバージョンのすべてのライブラリーの今CPAN (あ約135千ことにした文字用インデント.

する前に読み取らせていただきたい自分の考えてみては することによる人気のインデント:

  • タバ
  • 隙間
  • または混合物のタブやスペース

?

書コード

も課題は明確です。 に必要なすべての図書館からCPANェックイン-チェックアウトのう indents.

初のダウンロードする必要があり、全体CPAN. これは一つのコマンド:

time /usr/bin/rsync -av --delete cpan-rsync.perl.org::CPAN /project/CPAN/

3時間のダウンロードCPAN. することが出来ます。約27GBにサンプルがあります。

CPANのファイルが主催する構造です。 このスニペット:

CPAN/authors/id
├── A
│   ├── AA
│   │   ├── AADLER
│   │   │   ├── CHECKSUMS
│   │   │   ├── Games-LogicPuzzle-0.10.readme
│   │   │   ├── Games-LogicPuzzle-0.10.tar.gz
│   │   │   ├── Games-LogicPuzzle-0.12.readme
│   │   │   ├── Games-LogicPuzzle-0.12.tar.gz

この例では、 AADLER はログインの著者、 Games-LogicPuzzle-0.10.tar.gzGames-LogicPuzzle-0.12.tar.gz がリリースなどで行っています。

今後はCPANが7千人の著者のダウンロードのライブラリCPAN. しないための店舗のすべての7つのフォルダに同じフォルダに、少し レベルバージョンコントロールシステム git 店舗データを同じ)となっていました。

にCPANダウンロードできるライブラリが満載の異なるarchivers.

私ど多数の異なるファイル拡張子 フォルダ CPAN/authors/id/. こちらはスクリプトを作 . トップのアーカイブ:

  • .tar.gz 135571
  • .tgz903
  • .zip652
  • .gz612
  • .bz2 243

.tar.gz 勝どの証拠金と思決定においてどのようにカウント 文字用インデントのみのライブラリが満載 ます。tar.gz

そして執筆した数のイントロダクションです。 当初はなかったので終わったか 私が取得したいデータタブ、空間とやりがいを感じていました作 システムからなる。 まず、前工程で使用される すべて135万ファイルのリリースや情報のタブおよび空間データベース化します。 期待できます。 そのデータを利用してデータベースからすればよいので、短時間でデータを取り異なる フォーマット

最終的には、スクリプト fill_db . このスクリプトのデータベースとなります。 これら五時の場合でもデバッグ. のいずれかのスクリプト。 の問題であったUnicodeで扱います。 始まりの問題をリリース μ-0.01.tar.gzAPEIRON, そのファイル t/words_with_ß.dat からのリリース Lingua-DE-ASCII-0.06BIGJ. しかし最終的にすべての問題を解決したのスクリプトに成功した。tar.gz リリースなどで行っています。

のスクリプトが全てです。tar.gz ファイルはCPAN. 開梱。tar.gz 一時フォルダにまとめた。 見 このフォルダすべてのファイルが拡張 .pm, .pl, .t または .podを読み込み、 すべてのindentsやかどうかを判定しますインデント空間、または機能です。 のリリースが ファイルがそれに限定ファイルが明確にわPerlです。

このスクリプトは2つのテーブルのデータベースです。 ここではデータの例:

mysql> select * from releases limit 1;
+------------+--------+---------------------------------------------------------------+------------+
| release_id | author | file_name                                                     | timestamp  |
+------------+--------+---------------------------------------------------------------+------------+
|          1 | RUFF   | /cpan/authors/id/R/RU/RUFF/DJabberd-Authen-Dovecot-0.1.tar.gz | 1359325895 |
+------------+--------+---------------------------------------------------------------+------------+
1 row in set (0.00 sec)

mysql> select * from files where release_id = 1;
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
| file_id | release_id | file_name                                              | size | has_space_beginning | has_tab_beginning |
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
|       1 |          1 | DJabberd-Authen-Dovecot/lib/DJabberd/Authen/Dovecot.pm | 2047 |                   1 |                 1 |
|       2 |          1 | DJabberd-Authen-Dovecot/t/compiles.t                   |   64 |                   0 |                 0 |
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
2 rows in set (0.02 sec)

mysql> mysql> selec(*) from releases;
+----------+
| count(*) |
+----------+
|   135343 |
+----------+
1 row in set (0.04 sec)

mysql> select count(*) from files;
+----------+
| count(*) |
+----------+
|  3828079 |
+----------+
1 row in set (5.71 sec)
mysql> select * from releases limit 1;
+------------+--------+---------------------------------------------------------------+------------+
| release_id | author | file_name                                                     | timestamp  |
+------------+--------+---------------------------------------------------------------+------------+
|          1 | RUFF   | /cpan/authors/id/R/RU/RUFF/DJabberd-Authen-Dovecot-0.1.tar.gz | 1359325895 |
+------------+--------+---------------------------------------------------------------+------------+
1 row in set (0.00 sec)

mysql> select * from files where release_id = 1;
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
| file_id | release_id | file_name                                              | size | has_space_beginning | has_tab_beginning |
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
|       1 |          1 | DJabberd-Authen-Dovecot/lib/DJabberd/Authen/Dovecot.pm | 2047 |                   1 |                 1 |
|       2 |          1 | DJabberd-Authen-Dovecot/t/compiles.t                   |   64 |                   0 |                 0 |
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
2 rows in set (0.02 sec)

mysql> mysql> selec(*) from releases;
+----------+
| count(*) |
+----------+
|   135343 |
+----------+
1 row in set (0.04 sec)

mysql> select count(*) from files;
+----------+
| count(*) |
+----------+
|  3828079 |
+----------+
1 row in set (5.71 sec)
mysql> select * from releases limit 1;
+------------+--------+---------------------------------------------------------------+------------+
| release_id | author | file_name                                                     | timestamp  |
+------------+--------+---------------------------------------------------------------+------------+
|          1 | RUFF   | /cpan/authors/id/R/RU/RUFF/DJabberd-Authen-Dovecot-0.1.tar.gz | 1359325895 |
+------------+--------+---------------------------------------------------------------+------------+
1 row in set (0.00 sec)

mysql> select * from files where release_id = 1;
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
| file_id | release_id | file_name                                              | size | has_space_beginning | has_tab_beginning |
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
|       1 |          1 | DJabberd-Authen-Dovecot/lib/DJabberd/Authen/Dovecot.pm | 2047 |                   1 |                 1 |
|       2 |          1 | DJabberd-Authen-Dovecot/t/compiles.t                   |   64 |                   0 |                 0 |
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
2 rows in set (0.02 sec)

mysql> mysql> selec(*) from releases;
+----------+
| count(*) |
+----------+
|   135343 |
+----------+
1 row in set (0.04 sec)

mysql> select count(*) from files;
+----------+
| count(*) |
+----------+
|  3828079 |
+----------+
1 row in set (5.71 sec)
mysql> select releases.release_id, files.file_name, files.size, has_space_beginning, has_tab_beginning from releases join files on releases.release_id = files.release_id and author = 'KOHA';
+------------+---------------------------------------------------+------+---------------------+-------------------+
| release_id | file_name                                         | size | has_space_beginning | has_tab_beginning |
+------------+---------------------------------------------------+------+---------------------+-------------------+
|     118147 | Bundle-KohaSupport-0.31/lib/Bundle/KohaSupport.pm | 2169 |                   0 |                 0 |
|     118147 | Bundle-KohaSupport-0.31/t/Bundle-KohaSupport.t    |  487 |                   0 |                 0 |
|     118147 | Bundle-KohaSupport-0.31/t/pod.t                   |  130 |                   0 |                 0 |
+------------+---------------------------------------------------+------+---------------------+-------------------+
3 rows in set (0.05 sec)

著者 KOHA がリリース Bundle-KohaSupport-0.31. このリリースが3ファイル拡張子をリストから .pm, .pl, .t または .pod. 約これらすべてのファイルをデータベースをindents、空間、機能です。 どこですか?

ここで示されているすべての小. 見ればこれらのファイルのものだけではありませんインデント. 例えば、ファイルの内容を t/Bundle-KohaSupport.t:

# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl Bundle-KohaSupport.t'

#########################

# change 'tests => 1' to 'tests => last_test_to_print';

use Test::More tests => 1;
BEGIN { use_ok('Bundle::KohaSupport') };

#########################

# Insert your test code below, the Test::More module is use()ed here so read
# its man page ( perldoc Test::More ) for help writing this test script.

いを取りまとめた想定外の状況:

  • 使用空間
  • 使用タブ
  • 使用スペース、タブ

また、状況:

  • 使用しないでください空間を使用していないタブ

データ著者

をして頂いた後に処理されたデータをデータベースと決めたのを見 各著作者そのためのパディングします。

そのための最も人気の使用だけの空間、場所による人気 するだけでタブの第三の場所に人気が同時に使用するタブ。

ものであったことが判明した私は完全に間違っています。

に書いた 、スクリプト . このスクリプトを確認す文字の使用は、著者らがすべてのファイル .pm, .pl, .t, .pod, にあるすべてのオリジナルサイトのリリースは今CPAN.

こちらは何が起こった:

$ cat app/data/users.log | perl -nalE 'say if /^##/'
## 00 (nothing) - 50 (0.7%)
## 01 (only tabs) - 51 (0.7%)
## 10 (only spaces) - 1543 (21.9%)
## 11 (both) - 5410 (76.7%)

データは絶対にしないなどの見!

  • 75%以上の著者名利用の混合スペース、タブのための記述.
  • みた空間が、若干20%以上
  • が、著者のみを使用タブ以%でした。
  • 数の作家を使わないパディングはほとんど同じ数の者のみ利用機会を模索します。

完全なリストのすべての著者の内訳はプロチームが そのファイルをGitHub .

jupyterノート  により建てられたパイのフです。

このデータが発生するすべてのスリリース、今後はCPAN. これらのリリース 作成された過去24年間です。 すると時間の比率 なんとかするのか変化するのか

時間

全てのファイルにリリースCPANの修正時間の時間のこのリリースに掲CPAN. これらのデータがロードされています。 現在のCPANスリリース Ioctl-0.5 でに掲CPAN 1995-08-20:

mysql> select author, file_name, from_unixtime(timestamp) from releases where timestamp = (select min(timestamp) from releases);
+--------+----------------------------------------------+--------------------------+
| author | file_name                                    | from_unixtime(timestamp) |
+--------+----------------------------------------------+--------------------------+
| KJALB  | /cpan/authors/id/K/KJ/KJALB/Ioctl-0.5.tar.gz | 1995-08-20 07:26:09      |
+--------+----------------------------------------------+--------------------------+
1 row in set (0.08 sec)

この日は、さすがのたから8のリリース:

mysql> select * from releases where from_unixtime(timestamp) < '1995-08-21' order by timestamp;
+------------+--------+--------------------------------------------------------------+-----------+
| release_id | author | file_name                                                    | timestamp |
+------------+--------+--------------------------------------------------------------+-----------+
|     112505 | KJALB  | /cpan/authors/id/K/KJ/KJALB/Ioctl-0.5.tar.gz                 | 808903569 |
|      23026 | TYEMQ  | /cpan/authors/id/T/TY/TYEMQ/FileKGlob.tar.gz                 | 808903636 |
|     134031 | WPS    | /cpan/authors/id/W/WP/WPS/Curses-a8.tar.gz                   | 808903647 |
|     112546 | KJALB  | /cpan/authors/id/K/KJ/KJALB/Term-Info-1.0.tar.gz             | 808903748 |
|      70278 | MICB   | /cpan/authors/id/M/MI/MICB/TclTk-b1.tar.gz                   | 808910379 |
|      70274 | MICB   | /cpan/authors/id/M/MI/MICB/Tcl-b1.tar.gz                     | 808910514 |
|      19408 | GBOSS  | /cpan/authors/id/G/GB/GBOSS/perl_archie.1.5.tar.gz           | 808930091 |
|      81551 | JKAST  | /cpan/authors/id/J/JK/JKAST/StatisticsDescriptive-1.1.tar.gz | 808950837 |
+------------+--------+--------------------------------------------------------------+-----------+
8 rows in set (0.06 sec)

その分布の異なる文字のインデント時です。 この書いた スクリプト .

このスニペットのデータファイルを作成したスクリプト:

$ cat app/data/releases_date.csv | head
date,00,01,10,11
1995-08-20,0,1,0,7
1995-08-21,0,0,0,0
1995-08-22,0,0,0,0
1995-08-23,0,0,0,0
1995-08-24,0,0,0,1
1995-08-25,0,0,0,0
1995-08-26,0,0,0,0
1995-08-27,0,0,0,0
1995-08-28,0,0,0,0

Ie毎日、 1995-08-20 の提供に関する情報などのリリースによるもの どの文字を使用した記述.

  • 00 のインデント、空白、タブ
  • 01 —インデントのみを使用タブ
  • 10 —データ利用のみの空間
  • 11 —加熱田使用タブやスペース

その後に書いた jupyterノート  たのグラフで表示します。 上の図でのディスプレイの絶対数スリリースによるタイプのインデント の割合の合計数リリース日:

このグラフはほとんど9万ます。 であることは明白である傾向がありますが、グラフのホテルの中では悪いものがあるんです。 ので代わりのあったグループ化でのリリース。:

があり驚きの傾向にあります。 のリリースを利用するだけでタブのない indents概ね横這いの動きとなっているが、割合のリリースを使用するのみ空間" 常に成長し、この成長によるものの割合がリリースを使用する混合物のタブ。

なぜ"のみである。 仮説1

私の場合の近似式は以下のようになデータをあったかについての仮説はなぜ減少のリリース を使用すると問題タブにするようにした 私たちの思考Perlについて図書館 モジュール::Install . る場合が 図書館利用モジュール::インストールはCPANリリースインクルードファイルから図書館があります。 およびこれらのファイルを使用し混合物の空間と機能です。 の例は以下のファイルからモジュール::イリリース Devel-PeekPoke-0.04:

mysql> select * from files where release_id = 284 and file_name like '%inc/Module/Install%';
+---------+------------+----------------------------------------------------+-------+---------------------+-------------------+
| file_id | release_id | file_name                                          | size  | has_space_beginning | has_tab_beginning |
+---------+------------+----------------------------------------------------+-------+---------------------+-------------------+
|   10328 |        284 | Devel-PeekPoke-0.04/inc/Module/Install.pm          | 12381 |                   1 |                 1 |
|   10329 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Metadata.pm | 18111 |                   1 |                 1 |
|   10330 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Fetch.pm    |  2455 |                   1 |                 1 |
|   10331 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Makefile.pm | 12063 |                   1 |                 1 |
|   10332 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Base.pm     |  1127 |                   0 |                 1 |
|   10333 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/WriteAll.pm |  1278 |                   0 |                 1 |
|   10334 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Win32.pm    |  1795 |                   1 |                 1 |
|   10335 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Can.pm      |  3183 |                   1 |                 1 |
+---------+------------+----------------------------------------------------+-------+---------------------+-------------------+
8 rows in set (0.03 sec)

私の仮説である開発者用スペースインデントがこのリリース あるモジュール::インストールを記録し、統計、空間機能です。 モジュール::ト鋼以下 使用(しろがDist::Zilla,Dist::ミラ=,Minillaの内容は、それぞれのモジュール::置停止を 歪をもたらします。

この仮説のニーズを確認する。 最初に私がモジュール::置の使用、 ます。 仕組みを構築した。 各ポイントの数のリソースは月 使用モジュール::インストールします。 いることがご確認いただける部分の仮説が正しい実際、モジュール::ト鋼を使用 ます。

かどうかのモジュール::置に影響を与え用スペースまたはタブでは、スペース indents. を見つけ出すためには、描いた二つのグラフィー。 では、数種類のパディングスリリース ヶ月です。 最初の図表のみのリリースを使用するモジュール::インストールし、第二の図表のみ リリースを使用していません。

できることを実際、ご利用の場合には、図書室モジュール::インストールし、多くの図書館利用 合することができるタブ。

この表示のみリリースを使用しないモジュール::インストールします。 の場合と比較すること scheduleスケジュールに適用されるすべてのスリリース、そして差がありますが、何も変わります。

この仮説が間違っている。 場合のリリース用モジュール::インストールし、その後のリリースしくはグループ "のタブを空間"がない場合はすべてのスリリースを使用するモジュール::インストールは、まだまだ動向 の割合がリリースするタブだけを使用してインデント増加の費用負担割合のリリースに使用される 混合物のタブ。

なぜ"のみである。 仮説2

なぜすべて同じ数のリリースを利用するだけでタブ? あの超過 活発な著者を産み出すとともに、多くのリリースの著しい影響の統計?

またチェックアウトしました。 描いたグラフのシェアをリリースする 使用だけの空間が最初の文字の著者の名前です。 場合もあ の著作以上に大きく貢献全体の統計では、そのようなラインも大幅にアップ。 上の図で見ました、すべてのラインプラスマイナスなのです。 で確認のこの仮説りません を得ることができた.

なぜ"のみである。 仮説数3

このグラフによる時間がリリースである みスペースインデント. このシェア拡大を続けているの費用でのリリースである混合物の 空間機能です。

私の最初の想定したことをここにリリース前にも積極的に含まれ コードの図書館のモジュール::置を用いて混合物のスペース、タブ、図書館 小型化のための割合はリリースを使用する混合物のタブ とギャップを縮小する。 したことの真実を、これまでもさまから削除 ニュースリリースを使用するモジュール::インストールし、全体の傾向は変わらない— まだ、シェアのリリースするだけのギャップの成長の費用負担でのシェアをリリースする 混空間機能です。

私の第二の前提に影響を与え、統計の非常に小さなセットでも活躍著作者にあります。 が見出せなかったので確認のこの仮説がある。

私の仮説では、著者がより便利にテキストエディタ を作成し、より使いやすいグリースのみの空間ではなく、混合物の空間と機能です。 が、残念ながら、アイデアをどこの仮説を検証しています。 データ群CPAN情報として記されていないか のエディタを作成するのに使用されたこのリリース。 ご本人の了解のもと、掲載していをクリックしたままマウスで人気の編集者/IDE:

  • Emacs —1985年
  • vim —1991年
  • IntelliJ IDEA —januaray2001年
  • Eclipse 月2001年
  • Sublime Text —2008年
  • Atom 月2014
  • VS Code 月2015

データ2019年

前のグラフはその時代がスリリースである 空間となミックスのタブ。 その分布をどのようなマージン 使用する作家だけのオリジナルサイトのリリース2019年.

データの結果から走行 にはスクリプト :

$ cat app/data/users_2019.log | perl -nalE 'say if /^##/'
## 00 (nothing) - 12 (1.4%)
## 01 (only tabs) - 9 (1.0%)
## 10 (only spaces) - 355 (41.2%)
## 11 (both) - 486 (56.4%)

比較した場合のデータを、2019年のデータ提供のためのすべてを見る の割合が著者とのみを使用してタブは変わらないものの割合 著者だけが空間を飛躍的に増加しました。

そこには、グ:

に影響する要因の有効性データ

形成のための数字とグラフはすべて使用します。tar.gz リリース この日はCPAN時にはこの文書のほか、スリリースの は、Perlプログラミング言語.

CPANでき削除のリリースのデータで示すこ リモートのリリースには参加しなかった. は不明ですがどのくらい変化した場合のデータ を考慮する文字のパディングで除去のリリースなどで行っています。 このデータが変わった。 あのアーカイブ backpan  が格納されているすべてのスリリース たってはCPAN. では理論的には可能性があるすべて 数に基づくリリースはCPAN.

第二点目に影響を与えるデータの精度になったことも明らかになっていを考慮記号 インデントのみリリースが満載です。tar.gz アーカイブを展開します。 その他の種類 のアーカイブが使用されません。 大多数のリリース。tar.gz なので こうすることが推定される。 の場合はカウントデータアーカイブデータ 確実に変化します。 このような変更を致しますよ。

ソースコード

このセットのスクリプトに使用されたデータを収集し、データそのもの とjupyterノで利用可能なすべてのリポジトリに関する知識

コードが書かれたもので少しわかりにくかったで。 すべての書かれた 書かれたアイデアをかけて、可能な限り迅速に結果を得ずにコードです。

概要

時にはこの文のリポジトリのPerl CPAN図書館がありました135万 リリースなどで行っています。 最初のリリースした24年(1995-08-20). これらのリリースはほぼ4百万円のファイル 拡張 .pm, .pl, .t.pod.

このデータをここで示されているデータ76.7%%者のマージンを使用混合物のスペース、タブ, 21.9%のインデント、空間、0.7%—only機能です。

も考えればデータのみを2019年になりの人のみ利用スペース インデントするものの、多用途のミックスのタブをスペース(56.4%使用タブ、空間空間 41.2%のみギャップ1.0%—タブのみ).

見れば、グラフの割合の変化を異なる種類のindentsることが確認できるシェア 使用空間での成長は、このシェア拡大を続けている費用の共有者の混のタブをスペースインデント.

に知られていないのはなぜこの割合が増加しています。 できることにより、その著者 利用に便利なテキストエディタとすることをより容易かつ安全な設置 文字の使用のための記述.

その他の記事