टैब या रिक्त स्थान के लिए खरोज? आंकड़ों पर 3.8 लाख पर्ल बनाई गई फ़ाइलों में 24 साल

एक शाश्वत प्रश्न में प्रोग्रामिंग — जो पात्रों में उपयोग करने के लिए प्रोग्राम कोड के लिए खरोज — टैब या रिक्त स्थान है.

कभी कभी वहाँ कोई विकल्प नहीं है. उदाहरण के लिए, Makefile करने के लिए सुनिश्चित करें टैब का उपयोग करें. भाषा में प्रोग्रामिंग go वहाँ है एक आधिकारिक उपयोगिता gofmt कोड है कि स्वरूपों और इस उपयोगिता का उपयोग टैब के लिए indenting. बी गूढ़ प्रोग्रामिंग भाषा Whitespace टैब और रिक्त स्थान की जगह नहीं कर सकते प्रत्येक अन्य. लेकिन कई प्रोग्रामिंग भाषाओं पर लागू नहीं है, एक विकल्प की अनुमति है और प्रोग्रामर तय करने के लिए जो पात्रों का उपयोग करने के लिए.

वहाँ काफी लोकप्रिय राय के जो अक्षर का उपयोग करने के लिए indenting. राय निम्नलिखित है: यह कोई फर्क नहीं पड़ता कि क्या उपयोग करने के लिए सबसे महत्वपूर्ण निरंतरता है । यदि आप टैब का उपयोग करना, आप हमेशा आप की जरूरत करने के लिए उन्हें का उपयोग करें. अगर रिक्त स्थान का उपयोग, का उपयोग केवल रिक्त स्थान है और कभी नहीं का उपयोग करें टैब.

वहाँ रहे हैं यहां तक कि हास्य हास्य हास्य इस विषय पर:

(दो लोगों को पूरी तरह से असहमत हैं एक दूसरे के साथ क्या करने के लिए टैब का उपयोग या रिक्त स्थान है, लेकिन पूरी तरह से सहमत हैं कि यह जरूरी है कि केवल एक का उपयोग करें):

कैसे बातें कर रहे हैं असली दुनिया में? क्या वास्तव में है का इस्तेमाल किया है?

यह काफी आसान करने के लिए बाहर का पता लगाएं. लेने की जरूरत है स्रोत कोड कार्यक्रमों की गणना करने के लिए, क्या अक्षर का इस्तेमाल कर रहे हैं और परिणाम को देखो.

इस लेख का परिणाम है एक छोटे से अनुसंधान के उपयोग के बारे में टैब और रिक्त स्थान की दुनिया में पर्ल प्रोग्रामिंग भाषा है । वहाँ है एक विशाल भंडार है, जो दुकानों पर्ल पुस्तकालयों CPAN. डाउनलोड और खेल के सभी संस्करणों के सभी पुस्तकालयों जो अब कर रहे हैं पर CPAN (वहाँ थे के बारे में 135 हजार के लिए) का फैसला किया है और जो पात्रों के लिए उपयोग किया जाता खरोज.

इससे पहले कि आप किसी भी आगे पढ़, मैं सुझाव है कि आप एक मिनट के लिए सोचने के लिए और प्रयास करें कि ग्रहण करने के लिए लोकप्रिय के लिए खरोज:

  • Taba
  • अंतराल
  • या एक मिश्रण के टैब और रिक्त स्थान

?

कोड लिखने

तो, चुनौती स्पष्ट है । आप की जरूरत है लेने के लिए सभी पुस्तकालयों से CPAN और क्या बाहर की जाँच करने के लिए इस्तेमाल किया इंडेंट.

सबसे पहले आप की जरूरत है डाउनलोड करने के लिए पूरी CPAN. इस के साथ किया जाता है एक कमांड:

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

3 घंटे और डाउनलोड CPAN. यह लेता है के बारे में 27 जीबी.

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.gz और Games-LogicPuzzle-0.12.tar.gz है विज्ञप्ति.

पर अब CPAN वहाँ रहे हैं अधिक से अधिक 7 लेखकों के हजारों डाउनलोड किया है, जो पुस्तकालयों पर CPAN. नहीं है, क्रम में सभी स्टोर करने के लिए 7 के हजारों के फ़ोल्डर में, एक ही फ़ोल्डर जोड़ा गया कुछ और स्तर (संस्करण नियंत्रण प्रणाली git में अपने डेटा स्टोर के लिए एक समान तरीके से).

पर CPAN, आप डाउनलोड कर सकते हैं कि पुस्तकालय के साथ पैक है विभिन्न संग्रहकर्ताओं.

मैं शुरू कर दिया क्या के साथ संख्या की गिनती के लिए अलग अलग फ़ाइल एक्सटेंशन फ़ोल्डर में CPAN/authors/id/. यहाँ स्क्रिप्ट है और अपने काम के परिणाम . शीर्ष एक्सटेंशन के अभिलेखागार:

  • .tar.gz 135571
  • .tgz 903
  • .ज़िप 652
  • .gz 612
  • .bz2 243

.tar.gz जीत के साथ इस तरह के एक मार्जिन है कि मैंने फैसला किया है कि यह पर्याप्त होगा गिनती करने के लिए क्या अक्षर का इस्तेमाल कर रहे हैं इंडेंट करने के लिए केवल पुस्तकालयों में पैक कर रहे हैं कि में .tar.gz

फिर मैं ने लिखा कुछ स्क्रिप्ट. प्रारंभ में, मैं नहीं था, अंत में स्पष्ट किया गया था मैं क्या चाहते हैं पाने के लिए के बारे में डेटा टैब और रिक्त स्थान है, तो मैं बनाने का फैसला किया एक प्रणाली कई घटकों से मिलकर. सबसे पहले, पूर्व-प्रक्रिया सभी 135 हजार फाइलें रिलीज में डाल दिया है और के बारे में जानकारी टैब और रिक्त स्थान में एक डेटाबेस है । उम्मीद यह लंबे समय तक किया जाएगा. और फिर उपयोग करने के लिए डेटाबेस से डेटा को करने के क्रम में जल्दी से प्राप्त डेटा में अलग प्रारूपों ।

अंत में, स्क्रिप्ट fill_db . इस स्क्रिप्ट भर में डेटा बेस के साथ एक छोटे से अधिक से अधिक पांच घंटे के लिए. लेकिन इन पांच बजे की है, जब सब कुछ किया गया है debugged. पहली बार नहीं स्क्रिप्ट में काम किया । मुख्य समस्या के साथ था यूनिकोड. पहली समस्या यह थी रिलीज के साथ μ-0.01.tar.gz लेखक APEIRON, तो फिर वहाँ के साथ समस्याओं रहे थे फ़ाइल t/words_with_ß.dat से रिलीज Lingua-DE-ASCII-0.06 लेखक BIGJ. लेकिन अंत में सभी समस्याओं को हल कर रहे थे और स्क्रिप्ट सफलतापूर्वक इसे बनाया के माध्यम से सभी .tar.gz विज्ञप्ति.

स्क्रिप्ट सब है .tar.gz फाइलों में CPAN. Unpacks .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, में है, जो अपने सभी विज्ञप्ति पर है, जो अब 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% के लेखकों का एक मिश्रण का उपयोग रिक्त स्थान है और टैब के लिए indenting.
  • केवल रिक्त स्थान में दूसरे स्थान पर, थोड़ा अधिक से अधिक 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

यानी प्रत्येक तिथि के लिए, के साथ शुरू करने 1995-08-20 के बारे में जानकारी प्रदान किया गया है कितना विज्ञप्ति इस तथ्य से क्या पात्रों के लिए इस्तेमाल किया गया indenting.

  • 00 — में खरोज, कोई रिक्त स्थान, कोई टैब
  • 01 — में खरोज प्रयोग किया जाता है, केवल टैब
  • 10 — इंडेंट करने के लिए उपयोग केवल रिक्त स्थान
  • 11 — में Atsuta इस्तेमाल किया टैब और रिक्त स्थान

फिर मैं ने लिखा jupyter नोटबुक  आकर्षित किया है जो ग्राफ. चार्ट पर मैंने प्रदर्शन की निरपेक्ष संख्या के रिलीज के प्रकार से खरोज, और प्रतिशत की कुल संख्या की रिलीज इस दिन पर:

ग्राफ से पता चलता है लगभग 9 हजार दिनों के लिए । यह स्पष्ट है कि वहाँ एक प्रवृत्ति है, लेकिन ग्राफ शोर है और यह बुरा है आप सब कुछ देख सकते हैं. क्योंकि के बजाय दिनों में मैं था समूहीकृत विज्ञप्ति में महीने.:

लेकिन वहाँ है एक गर्म प्रवृत्ति है । की संख्या विज्ञप्ति का उपयोग करें जो केवल टैब या कोई इंडेंट लगभग अपरिवर्तित है, लेकिन अनुपात की रिलीज का उपयोग करें जो केवल रिक्त स्थान लगातार बढ़ रही है और इस विकास के कारण के अनुपात विज्ञप्ति जो एक मिश्रण का उपयोग करें टैब और रिक्त स्थान.

क्यों है "केवल रिक्त स्थान". परिकल्पना नंबर 1

मैं पर देखा डेटा और मैं था एक परिकल्पना क्यों की कम संख्या की विज्ञप्ति जो का उपयोग करें और समस्याओं टैब. मेरे बारे में सोचा पर्ल पुस्तकालय मॉड्यूल::स्थापित करें . यदि लिखने के लिए जब अपने पुस्तकालय का उपयोग मॉड्यूल::स्थापित करें, 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)

मेरी परिकल्पना है कि डेवलपर्स के उपयोग के लिए रिक्त स्थान खरोज है, लेकिन इस तथ्य के कारण है कि रिलीज में मॉड्यूल::स्थापित कर रहे हैं कि आंकड़ों में दर्ज है, और रिक्त स्थान और टैब. मॉड्यूल: स्थापित करें:इस्पात में कम का उपयोग करने के लिए (के रूप में वहाँ थे के सभी प्रकार जिला::जिला, जिला::Milla, Minilla), और इसलिए मॉड्यूल::स्थापित देना बंद कर दिया विरूपण.

इस परिकल्पना के लिए की जरूरत हो सकता है की जाँच की । पहली बार में मैं का फैसला किया है, तो देखने के लिए मॉड्यूल::स्थापित किया जा रहा कम और कम है. मैं बनाया एक अनुसूची. प्रत्येक बिंदु की संख्या है के लिए विज्ञप्ति इस माह में जो इस्तेमाल किया मॉड्यूल::स्थापित करें । आप देख सकते हैं कि भाग की परिकल्पना सही है — वास्तव में, मॉड्यूल::स्थापित स्टील का उपयोग करें कम है.

लेकिन क्या का उपयोग मॉड्यूल::स्थापित को प्रभावित करता है के उपयोग के लिए रिक्त स्थान या टैब और रिक्त स्थान के लिए इंडेंट. आदेश में पता लगाने के लिए, मुझे आकर्षित किया है, दो ग्राफिक्स । की संख्या है, अलग अलग प्रकार की गद्दी विज्ञप्ति महीने. पहली चार्ट केवल विज्ञप्ति का उपयोग करें जो मॉड्यूल::स्थापित करने के लिए, दूसरे पर चार्ट केवल विज्ञप्ति जो उपयोग में नहीं हैं.

यहाँ आप देख सकते हैं कि वास्तव में, यदि आप का उपयोग एक पुस्तकालय मॉड्यूल::स्थापित करें, सबसे अक्सर पुस्तकालय प्रयोग किया जाता है यह का एक मिश्रण है टैब और रिक्त स्थान.

और यहाँ एक चार्ट प्रदर्शित करता है जो केवल उन विज्ञप्ति का उपयोग नहीं करते जो मॉड्यूल::स्थापित करें । अगर आप इस की तुलना करें अनुसूची के साथ जो कार्यक्रम लागू करने के लिए सभी रिलीज, तो वहाँ एक अंतर है, लेकिन कुछ भी नहीं बदलता.

यह पता चला है कि परिकल्पना गलत है. यदि रिलीज का उपयोग करता है मॉड्यूल::स्थापित करें, तो अक्सर रिलीज में गिर जाता है समूह "टैब और रिक्त स्थान", लेकिन अगर तुम नहीं खाते सभी के लिए विज्ञप्ति का उपयोग करें जो मॉड्यूल::स्थापित करें, तो आप अभी भी एक प्रवृत्ति अनुपात की रिलीज का उपयोग करें जो केवल टैब के रूप में खरोज में बढ़ जाती है की कीमत के अनुपात में रिलीज कर रहे हैं, जो इस्तेमाल किया का एक मिश्रण टैब और रिक्त स्थान.

क्यों है "केवल रिक्त स्थान". परिकल्पना संख्या 2

क्यों कर रहे हैं सभी एक ही, एक बढ़ती संख्या की विज्ञप्ति जो केवल का उपयोग करें टैब? वहाँ हो सकता है कुछ अतिरिक्त एक सक्रिय लेखक के उत्पादन, कई विज्ञप्ति और लेखक है कि प्रभाव पर सभी आंकड़े?

मैं कोशिश करने के लिए इसे बाहर की जाँच करें. आकर्षित किया एक ग्राफ से पता चलता है जो शेयर की विज्ञप्ति में जो उपयोग केवल रिक्त स्थान है, लेकिन पहले अक्षर के लेखक का नाम है. अगर वास्तव में कुछ लेखक बने एक बड़े योगदान करने के लिए समग्र आँकड़े, उस तरह की रेखा बहुत तेजी से ऊपर चला गया. चार्ट पर मैंने देखा, सभी लाइनों कर रहे हैं, प्लस या शून्य से भी. तो इस परिकल्पना की पुष्टि में, मैं नहीं प्राप्त करने में सक्षम था.

क्यों है "केवल रिक्त स्थान". परिकल्पना संख्या 3

रेखांकन दिखाने के लिए कि समय के साथ अधिक हो जाता है और अधिक विज्ञप्ति जो कर रहे हैं केवल रिक्त स्थान के लिए खरोज. और इस हिस्सेदारी बढ़ रही है की कीमत पर रिलीज है, जिसमें एक मिश्रण के रिक्त स्थान और टैब.

मेरी पहली धारणा थी कि इस तथ्य के कारण होता है कि रिलीज से पहले सक्रिय रूप से शामिल थे कोड पुस्तकालयों मॉड्यूल::स्थापित है, जो प्रयोग किया जाता का एक मिश्रण रिक्त स्थान है और टैब, इस पुस्तकालय उपयोग छोटा है, और इसलिए, अनुपात की विज्ञप्ति जो एक मिश्रण का उपयोग करें टैब और अंतराल कम हो जाता है । था का हिस्सा है कि इस में सच है, लेकिन यहां तक कि अगर हम से दूर सभी की समीक्षा विज्ञप्ति का उपयोग करें जो मॉड्यूल::स्थापित करें, समग्र प्रवृत्ति बदल नहीं करता है — फिर भी, शेयर की विज्ञप्ति में जो केवल अंतराल बढ़ रहे हैं की कीमत पर शेयर के रिलीज में है जो एक मिश्रण का उपयोग करता रिक्त स्थान है और टैब.

मेरी दूसरी धारणा यह है कि प्रभाव के आंकड़ों पर एक बहुत छोटे से सेट के साथ बहुत सक्रिय लेखक हैं । मैं नहीं मिल सकता है इस की पुष्टि परिकल्पना है.

मेरे तीसरे परिकल्पना है कि लेखकों दिखाई देते हैं और अधिक सुविधाजनक पाठ संपादकों और आईडीई है, जो उपयोग करने के लिए आसान तेल केवल रिक्त स्थान है, का एक मिश्रण नहीं रिक्त स्थान है और टैब. लेकिन, दुर्भाग्य से, कैसे विचारों का परीक्षण करने के लिए इस परिकल्पना का मैं है । डेटा जो झूठ पर CPAN कोई जानकारी नहीं है के बारे में क्या संपादक का इस्तेमाल किया गया था बनाने के लिए यह जारी है । मैं पर देखा रिलीज की तारीख के लिए लोकप्रिय संपादकों/आईडीई:

  • Emacs — 1985
  • vim — 1991
  • IntelliJ IDEA — januaray 2001
  • 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 पर इस लेखन के समय, इसके अलावा में करने के लिए विज्ञप्ति पर्ल प्रोग्रामिंग भाषा है ।

CPAN की अनुमति देता है आप को हटाने के लिए विज्ञप्ति डेटा में दिखाया गया है इस लेख में रिमोट रिलीज भाग नहीं लिया. यह स्पष्ट नहीं है कि कितना बदल जाएगा यदि डेटा पर विचार पात्रों की गद्दी पहले से ही हटा दिया है विज्ञप्ति. यह संभव है कि डेटा बदल जाएगा । वहाँ है एक संग्रह backpan  जो भंडार सभी रिलीज, जो कभी पर किया गया CPAN. सिद्धांत रूप में तो वहाँ एक संभावना है परिवर्तित करने के लिए सभी संख्या के आधार पर विज्ञप्ति नहीं है जो पर CPAN.

दूसरी बात, जो प्रभावित करता है डेटा की सटीकता के कुछ है कि खाते में ले लिया था प्रतीकों खरोज केवल विज्ञप्ति में थे कि में पैक .tar.gz आर्काइव. अन्य प्रकार अभिलेखागार इस्तेमाल नहीं किया गया. विशाल बहुमत के रिलीज कर रहे हैं .tar.gz तो इसे बनाया इस तरह के एक धारणा है. यदि गणना के लिए डेटा सभी डेटा अभिलेखागार निश्चित रूप से बदलें. मान लें कि परिवर्तन हो जाएगा, कुछ की तुलना में अधिक प्रतिशत.

स्रोत कोड

पूरे सेट स्क्रिप्ट का इस्तेमाल किया गया है कि डेटा एकत्र करने के लिए, डेटा ही और jupyter नोटबुक में सभी उपलब्ध भंडार GitHub पर.

जो कोड लिखा है — यह सिर्फ बहुत दूर से परिपूर्ण है. सब है कि लिखा गया था प्रश्न के लिखित विचारों के साथ के रूप में जल्दी संभव के रूप में परिणाम प्राप्त करने के लिए, नहीं करने के लिए बनाने के लिए एकदम सही कोड है.

सारांश

पर इस लेखन के समय का भंडार पर्ल CPAN पुस्तकालयों, वहाँ थे के बारे में 135 हजार विज्ञप्ति. पहले रिलीज किया गया था 24 साल पहले (1995-08-20). इन विज्ञप्ति लगभग 4 लाख फ़ाइलें एक्सटेंशन .pm, .pl, .t या .pod.

अगर हम पर विचार डेटा के लिए सभी समय में, यह पता चला है कि 76.7%% के लेखकों में मार्जिन का एक मिश्रण का उपयोग रिक्त स्थान है और टैब्स, 21.9% में इस्तेमाल किया खरोज, केवल रिक्त स्थान है, और 0.7% — केवल टैब.

लेकिन अगर हम पर विचार डेटा केवल 2019 के लिए, यह हो जाता है और अधिक से अधिक लेखकों, जो केवल उपयोग के लिए रिक्त स्थान खरोज है, लेकिन अभी भी बहुमत का उपयोग करता है एक मिश्रण के टैब और रिक्त स्थान (56.4% — टैब का उपयोग करें और रिक्त स्थान,रिक्त स्थान 41.2% — केवल अंतराल, 1.0% — केवल टैब).

और अगर आप को देखो ग्राफ के प्रतिशत के परिवर्तन के विभिन्न प्रकार के उपयोग इंडेंट, आप देख सकते हैं कि शेयर की उपयोग केवल रिक्त स्थान बढ़ रहा है और इस हिस्सेदारी बढ़ रही है की कीमत पर साझा करें, जो उन लोगों की एक मिश्रण का उपयोग करता टैब और रिक्त स्थान के लिए खरोज.

यह ज्ञात नहीं है क्यों यह प्रतिशत बढ़ रही है । यह संभव है कि इस तथ्य के कारण है कि लेखकों को उपयोग एक और अधिक सुविधाजनक पाठ संपादकों में से एक है कि इसे सुरक्षित और आसान स्थापित करने के लिए जो वर्ण का उपयोग करने के लिए indenting.

अन्य लेख