标签或空间的压痕? 统计数据3.8万Perl文件创建了24年

一个永恒的问题在方案编制--其字使用的程序代码 缩进标签或空间。

有时别无选择。 例如,在 Makefile 确保使用标签。 在语言 编程 go 有一个正式的实用工具 gofmt 的格式和代码,这个工具 使用标签的缩进. B深奥的编程语言 Whitespace 片和空间不能取代每 其他。 但是,许多编程语言中不要强加一种选择,并允许的程序员 决定哪字的使用。

有相当受欢迎的意见的字符用于缩进. 该意见是以下几点:不论是否使用最重要的一致性。 如果您使用的标签,你总是需要使用它们。 如果 使用的空间,只能使用的空间,从来没有使用标签。

甚至还有漫画漫画漫画关于这个问题:

(两个人的完全不同意彼此是否使用的标签 或空格,但绝对同意,有必要使用唯一一个):

情况如何在现实世界? 什么是实际使用的?

它很容易找到。 需要采取的源代码的程序、计算 什么样的人物的使用和看待的结果。

这篇文章的结果是一个小小的研究,有关所使用的标签和空间 在世界上的Perl编程语言。 有一个巨大的储存库,其中存储Perl 图书馆求助. 我下载了所有的版本的所有库,它现在支持的 (有大约135万),并决定哪些字符用于压痕。

之前你读任何进一步,我建议你一分钟想想试试 假定受欢迎的压痕:

  • 塔巴
  • 差距
  • 或混合物的标签和空间

?

编写代码

因此,挑战是明确的。 你需要采取的所有库支持,并检查了用什么来 缩进。

首先你需要下载个整体的支持. 这样做是与一项命令:

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

3个小时和下载求助. 它占用大约27GB。

支持收集的文件组织了一定的结构。 这里有一个片段:

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 被释放。

现在,在支持有超过7万的作者下载的图书馆求助. 为了不存储所有7个成千上万的文件夹在同一个文件夹中,加入更多的几个 各级(版本控制系统 git 将其数据存储在一个类似的方式)。

在求助,可以下载的图书馆,充满不同的归档.

我开始有什么计数的不同文件的扩展 在文件夹 CPAN/authors/id/. 这里是剧本和他的工作的结果 . 顶部扩展的档案:

  • .tar.gz 135571
  • .解压缩软903
  • .zip652
  • .gz612
  • .bz2 243

.tar.gz 赢得这样的保证金,我决定,它将足以计数 什么样的字符用于缩只有图书馆都挤满了 中。tar.gz

然后我写了几脚本。 最初,我没有最终是明确的 什么我想要得到的数据有关的标签和空间,所以我决定做 一个系统,组成几个部分组成。 第一,预过程 所有135万文件的发布和把有关的信息的标签和空间变成一个数据库。 预计它将是长期的。 然后使用该数据库中的数据,以便迅速地获得数据在不同的 格式。

最后,脚本 fill_db . 这个脚本填写数据的基础一点五个多小时。 但是,这五点是当一切都已经调试。 不是第一次脚本的工作。 主要的问题是与Unicode。 首先是这个问题的释放 μ-0.01.tar.gz 提交人 APEIRON, 然后有问题的文件 t/words_with_ß.dat 释放 Lingua-DE-ASCII-0.06 提交人 BIGJ. 但最终所有问题都解决了和脚本中成功地通过它所有。tar.gz 释放。

脚本。tar.gz 文件在支持. 解开.tar.gz 临时文件夹。 发现 在这个临时文件夹的所有文件的扩展 .pm, .pl, .t.pod、读取 所有缩进和检查压痕空间或标签。 在释放还有其他的 文件,但是我决定将仅限制于文件清楚地涉及到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)

只有空间,只有标签、标签和空间,并且...

总数据库中关于各个文件中释放有2的标志:

  • 你用空间缩进
  • 你使用标签的压痕

分别两种标志可以4的组合:

  • 11使用的场所和标签
  • 10使用的只有空间
  • 01—仅用的标签
  • 00—不用空间或标签

第三种选择是完全预料的情况,我想找到和 找出是什么受欢迎的。 但选择 00 —"不要使用既不是片也没有的空间"—我也是这么想的 但事实证明,这种情况正在发生。 "如何?" —你将要求。 这里就是一个例子。

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. 关于所有这些文件在数据库中写入他们的项,没有空间,没有标签。 这怎么可能?

事实证明,所有小学。 如果你看到这些文件,他们只是简单的没有缩进。 例如,该文件的内容 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, 这是在他们所有的释放这是现在求助.

这里发生了什么事:

$ 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%,
  • 以及作者使用的唯一标签低于百分比。
  • 这些作者并不使用的填充几乎是该数相同的作者只使用标签。

完整的清单的所有人分列的职业队有在 该文件在想 .

jupyter笔记本电脑  通过这是建立在饼图。

但是这产生的数据在所有的版本,这是目前在支持. 这些版本 创建是在过去的24年。 可能是与时间的比率 不知怎么变化?

时间

每个文件释放上的支持,修改时间的时候,这种释放是上载到支持的. 这些数据加载到数据库中。 现在旧的支持释放被 Ioctl-0.5 —这是上载到支持 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

即为每个日期,开始与 1995-08-20 提供的信息多少已被释放的事实 什么样的字符用于缩进.

  • 00 —在压痕,没有空间,没有标签
  • 01 —在缩排仅用的标签
  • 10 —缩进使用只有空间
  • 11 —在热田使用的标签和空间

然后我写了 jupyter笔记本电脑  这画的图表。 上图I显示的绝对数量释放的种类型的压痕 和百分比总数的版本在这一天:

该图显示了几乎9万天。 显而易见的是,有一种趋势,但图是吵并不好你可以看到的一切。 因为不是天我是分布在几个月。:

但有一个令人吃惊的趋势。 数版本仅使用的标签,或者没有 缩排几乎没有变化,但比例的发布,这只能使用的空间 不断增长和这种增长是由于该比例的释放其使用的混合物的标签和空间。

为什么是"只是空间"。 假设1号

我看着的数据和我有一个假设的,为什么减少的数量的释放 其使用和问题的标签。 我想Perl库 模块:安装 . 如果当你的写作 图书馆使用模块:安装,支持释放包括文件从该图书馆。 和这些文件中使用的混合物的空间和标签。 这里是一个例子文件从一个模块:安装释放 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::米拉,Minilla),因此模块:安装停止给 失真。

这一假设需要进行检查。 首先,我决定看到,如果模块:安装在使用较少以及 少。 我建了一个时间表。 每个点的数量释放的月份 使用模块::安装。 你可以看到,一部分的假设是正确的—事实上,模块:安装钢铁 少。

但是,无论是使用的模块:安装的影响的利用空间或标签和空间 缩进。 为了找出来,我把两个图形。 是的数量不同类型的填充的版本 几个月。 第一个图表仅发布哪些采用模块:安装中,在第二个图表只 释放其是不使用的。

在这里你可以看到,事实上,如果您使用的图书馆模块:安装,最经常的图书馆使用 它是一种混合物的标签和空间。

和这里有一个图表,其中显示只有那些释放其中不使用模块::安装。 如果你比较这个 计划的安排适用于所有的版本中,则是有区别,但没有什么变化。

事实证明,这个假设是错误的。 如果释使用模块:安装,然后释放常常落入团 "标签和空间",但如果不考虑所有释放其使用模块:安装,你还有一个趋势 该比例的释放其使用的唯一标签作为压增加的费用所占比例的发布,这是用 一个混合物的标签和空间。

为什么是"只是空间"。 假设2号

为什么都是一样的,越来越多的版本仅使用的标签? 可能有一些多余的 一个活跃的作者,生产的许多稿和提交人有效的所有统计数据?

我试图检查出来。 画了一个图,显示了分享的版本在哪 只能使用的空间,但通过第一封信的作者的姓名。 如果确实有些 提交人作出了大的贡献总体统计数据,这种行非常急剧上升。 在图表中我看到,所有的线路被加上或减去。 所以确认这一假设,我做不 能够得到。

为什么是"只是空间"。 假设3号

图表显示,随着时间的推移变得更多和更多的版本是 只有空间缩进。 这一份额增长是以牺牲发布在它的混合物 空间和标签。

我的第一个假设是,发生这种情况由于这样的事实,在释放之前,包括积极 代码图书馆模块:安装使用混合物的场所和标签,这个图书馆 使用较小,因此,所占比例的发布,它使用混合物的标签 和差距的减少。 是的那一部分的道理,但即使如果我们删除 审查所有释放其使用模块::安装、总体趋势没有变化— 然而,分布在其中仅有的差距正在不断增长的费用分享的版本在哪 使用混合物中的空格和标签。

我的第二个假设是,影响的统计数据的一个非常小的一套非常积极的作者。 我不能找到确认这一假设。

我的第三个假设是,提交人出现更多的方便,文本编辑器 和IDE,是更容易使用的油脂只有空间,不混合的空间和标签。 但是,不幸的是,想法是如何来测试这个假设我有。 数据的谎言上的支持,没有什么信息 编辑被用来创建这释放。 我看了看发布日期的受欢迎的编辑/IDE:

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

数据2019

上图表明,随着时间的推移变成更多和更多的版本是 空间并不混合的标签空间。 所以我决定来看看分布的是什么类型的边缘 使用的作家只有在考虑他们的释放在2019年。

数据结果的运行 script :

$ 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 释放 这是在支持在编写本文时,除了释放 Perl编程语言。

支持可以删除该版本在数据所示,在这篇文章 远程释放没有参加。 目前还不清楚有多少会改变如果数据 考虑的人物的填补已经删除了释放。 这是可能的,数据会有太大变化。 有一个归档 backpan  其储存的所有稿, 谁曾经一直在支持. 因此在理论上有可能把所有 数字依据的版本不是在求助.

第二点,从而影响数据的准确性是,考虑到了符号 压痕只有释放装。tar.gz 存档。 其他类型 档案中没有被使用。 绝大多数的版本。tar.gz 所以 它提出这样一种假设。 如果计数据对于所有存档的数据 一定会改变。 假设的变化将超过百分之几。

源代码

整个脚本用于收集数据,该数据本身 和jupyter笔记本电脑所有可用的存储库中在想.

代码写的是—这只是很远非完美。 所有写着 书面意见尽快得到的结果,不要创造完美的码。

摘要

在编写本文时储存库的Perl支持的图书馆,有大约135万 释放。 的第一个版本作了24年前(1995-08-20). 在这些版本是近4万个文件 扩展 .pm, .pl, .t.pod.

如果我们考虑的数据对于所有的时间,事实证明,76.7%的作者在边缘混合使用的空间和标签, 21.9%用于压痕,只有空间,并0.7%的只标签。

但是,如果我们考虑的数据仅仅用于2019年,它变得越来越多的作者只能使用的空间 缩进,但仍然大多数使用一个混合的标签和空间(56.4%使用的标签和空间,空间 41.2%的只差距,1.0%只标签).

如果你看到图形的百分比变化采用不同类型的项,你可以看到分享的 只能使用的空间越来越大,这一份额越来越大的费用份额的那些人使用的混合物的标签和空间缩进。

它是不知道为什么这个百分比增加。 这是可能的,这是由于这一事实,提交人 使用更方便的文字编辑,使它更加容易和更加安全的安装 这符使用缩进.

其他文章