1. JavaScript / Говнокод #26472

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    var buf = Buffer.allocUnsafe(kexInitSize);
        var p = 17;
    
        buf[0] = MESSAGE.KEXINIT;
    
        if (myCookie !== false)
          myCookie.copy(buf, 1);
    
        writeUInt32BE(buf, kexBuf.length, p);
        p += 4;
        kexBuf.copy(buf, p);
        p += kexBuf.length;
    
        writeUInt32BE(buf, hostKeyBuf.length, p);
        p += 4;
        hostKeyBuf.copy(buf, p);
        p += hostKeyBuf.length;
    
        writeUInt32BE(buf, algos.cipherBuf.length, p);
        p += 4;
        algos.cipherBuf.copy(buf, p);
        p += algos.cipherBuf.length;
    
        writeUInt32BE(buf, algos.cipherBuf.length, p);
        p += 4;
        algos.cipherBuf.copy(buf, p);
        p += algos.cipherBuf.length;
    
        writeUInt32BE(buf, algos.hmacBuf.length, p);
        p += 4;
        algos.hmacBuf.copy(buf, p);
        p += algos.hmacBuf.length;
    
        writeUInt32BE(buf, algos.hmacBuf.length, p);
        p += 4;
        algos.hmacBuf.copy(buf, p);
        p += algos.hmacBuf.length;
    
        writeUInt32BE(buf, algos.compressBuf.length, p);
        p += 4;
        algos.compressBuf.copy(buf, p);
        p += algos.compressBuf.length;
    
        writeUInt32BE(buf, algos.compressBuf.length, p);
        p += 4;
        algos.compressBuf.copy(buf, p);
        p += algos.compressBuf.length;
    
        // Skip language lists, first_kex_packet_follows, and reserved bytes
        buf.fill(0, buf.length - 13);

    Мечтают ли скриптухи об Электросишке?

    https://github.com/mscdex/ssh2-streams/blob/master/lib/ssh.js

    Запостил: 3.14159265, 07 Марта 2020

    Комментарии (249) RSS

    • Спасибо guest8 за наводочку.

      Исходный тред:
      https://govnokod.ru/26463#comment531865
      Ответить
    • Блин, оказывается Сишка весьма удобный и ёмкий язык.
      >Buffer.allocUnsafe
      >malloc
      >writeUInt32BE (...)
      > p += 4;

      То ли дело инкрементить индекс в удобном сишном массиве/указателе с автовыводом размера типа:
      >uint32_t buf[]
      >buf[i++]=
      Ответить
      • > p += 4;
        *((p += 4) - 4) = ...;
        Ответить
      • > Buffer.allocUnsafe
        > Unsafe

        так падажжи мы же специальный язык написали чтобы мимо памяти не промазать
        Ответить
        • Это просто такая оптимизация.
          >>> This method differs from the Buffer.alloc() method because it creates a not-pre-filled buffer, and it may contain information from older buffers. That is why it is called unsafe.
          Без этого наверняка файл в тридцать семь мегабайт будет не три минуты загружаться, а три минуты и сто миллисекунд, что неприемлемо.
          Ответить
        • оказалось, что джаваскрипт плохо подходит для реализации двоичных протоколов точно так же, как си плохо подходит для реализации бизнес-логики интернет-магазина

          но мы будем жрать кактус
          Ответить
          • Питушня. Единственное отличие от сишки - размер индекса надо увеличивать на N, а не на 1.

            Если бы автор реализовал хелперы pushInt(buf, x), pushFloat(buf, x), pushString(buf, x), было бы даже лучше, чем в сишке, т.к. в сишке было бы pushInt(buf, x), pushFloat(buf, x), pushString(buf, x, dlina_stroki).
            Ответить
            • >Если бы автор реализовал хелперы pushInt(buf, x)
              А указатель p куда девать?

              Даже в сраной жабе нормальные апи есть.
              Гость подсказывает: https://govnokod.ru/26472#comment531961
              Ответить
    • Там во всём репе кромешный ад.
      https://github.com/mscdex/ssh2-streams/blob/master/lib/sftp.js#L2305
      var count = names.length;
        var namesLen = 0;
        var nameAttrs;
        var attrs = [];
        var name;
        var filename;
        var longname;
        var attr;
        var len;
        var len2;
        var buf;
        var p;
        var i;
        var j;
        var k;
      
        for (i = 0; i < count; ++i) {
          name = names[i];
          filename = (!name || !name.filename || typeof name.filename !== 'string'
                      ? ''
                      : name.filename);
          namesLen += 4 + Buffer.byteLength(filename);
          longname = (!name || !name.longname || typeof name.longname !== 'string'
                      ? ''
                      : name.longname);
          namesLen += 4 + Buffer.byteLength(longname);
      
          if (typeof name.attrs === 'object' && name.attrs !== null) {
            nameAttrs = attrsToBytes(name.attrs);
            namesLen += 4 + nameAttrs.nbytes;
            attrs.push(nameAttrs);
          } else {
            namesLen += 4;
            attrs.push(null);
          }
        }
      Ответить
      • А инфернальные undefined? Зачем? Зачем?

        Это походу ему никто никогда не писал ради прикола в глобал-скоупе
        undefined=42;
        incoming: {
                status: IN_INIT,
                expectedPacket: undefined,
                search: undefined,
                greeting: undefined,
                seqno: 0,
                pktLen: undefined,
                padLen: undefined,
                pktExtra: undefined,
                payload: undefined,
                packet: undefined,
                kexinit: undefined,
                identRaw: undefined,
                rekeyQueue: [],
                ignoreNext: false,
        
                expect: {
                  amount: undefined,
                  type: undefined,
                  ptr: 0,
                  buf: undefined
                },
        
                decrypt: {
                  instance: false,
                  info: undefined,
                  iv: undefined,
                  key: undefined,
                  buf: undefined,
                  type: undefined
                },
        Ответить
        • чем buf: undefined,
          отличаеца от отсутствия такого ключа??
          Ответить
          • Хз. Разве что только возможностью переопределить undefined.

            Ну видно как людям сильно не хватает сишного struct
            Ответить
            • Питушня олдфага фортранного.
              > const undefined = 0
              SyntaxError: Identifier 'undefined' has already been declared
              > let undefined = 0
              SyntaxError: Identifier 'undefined' has already been declared
              > this.undefined = 3
              3
              > this.undefined
              undefined
              > undefined = 8
              8
              > undefined
              undefined
              > global.undefined = 1
              1
              > global.undefined
              undefined
              > var undefined = 5
              undefined
              > undefined
              undefined
              >

              И это в не очень свежей версии "Node.pituz".

              Ну и вообще, переопределить unpituzed может только хацкер, который специально ломает код. Так же можно во все прототипы вставить function(){} или сделать for(char*p=NULL; p<LONG_MAX; p++) *p = 0; в сишке. От этого нет адекватной защиты, кроме отдубашивания хацкера стандартом C++ по башке.
              Ответить
              • >Питушня олдфага фортранного.
                Это был сарказм.

                Зачем на ровном месте создавать проблемы?
                Какой смысл в
                decrypt: {
                          info: undefined,
                          iv: undefined,
                          key: undefined,
                          buf: undefined,
                          type: undefined
                        },

                Зачем undefined? Зачем?
                void(0) короче и надёжнее.
                Ответить
                • null ещё короче
                  * работает in
                  * сравнивается по ==
                  Ответить
                  • Это понятно.
                    Я же не знаю. Вдруг это какая-то хитрая питумизация, чтобы не инициализировать их раньше времени.
                    Вот спрашиваю зачем именно undefined?

                    > сравнивается по ==
                    А undefined разве нет?
                    a={}
                    null==a.b //true
                    void(0)==a.b //true
                    Ответить
                    • >> сравнивается по ==
                      > А undefined разве нет?
                      Сравнивается. Я имел в виду, что null == undefined, и больше ничему не равны.
                      Ответить
                • void 0
                  Ответить
              • А мы переконпеляем твою ноду чтобы undefined имело значение 42.
                Ответить
    • Даа, вот что бывает, когда пытаешься работать с сетевыми бинарными протоколами из JavaScript:)

      Я серьезно не понимаю, почему нельзя npmом шипать статически собранный ssh и обертку к нему на JS, которая бы дергала ssh как внешний процесс, и писала бы ему в stdin.

      Питонисты конечно тоже навилосипедили paramiko, но есть и нормальное решение
      https://pypi.org/project/openssh-wrapper/

      А завтра OpenSSH поддержит ключи формата Foo и добавит новый вызов в протокол. Что они будут делать?

      А дебажить это всё как? Если у меня с командной строки работает ssh, то совсем не факт, что он будет работать из JS. Какой багор!
      Ответить
      • > которая бы дергала ssh как внешний процесс
        Огромная переголова. Адекватнее будет просто написать обёртку над libssh.
        Ответить
        • я не знаю хорош ли у JS интероп с нативным кодом, но конечно можно и так.
          Ответить
          • у них там даже npm какие-то gyp-модули умеет собирать на целевой машине, но это же во второй главе документации
            Ответить
        • > переголова

          Да оно, скорее всего, даже быстрее работать будет... Ну и без проёба кусков файла.
          Ответить
      • Да пайтух просто боги делали, в сравнении с этим гавнищем.

        >А дебажить это всё как?
        Элементарно!

        this.debug('DEBUG: Outgoing: Writing GLOBAL_REQUEST ([email protected])');
        
        this.debug('DEBUG: Outgoing: Writing CHANNEL_DATA (' + chan + ')');
        
        this.debug('DEBUG: Outgoing: Writing CHANNEL_WINDOW_ADJUST ('
                     + chan
                     + ', '
                     + amount
                     + ')');
        Ответить
    • function sigSSHToASN1(sig, type, self, callback) {
        var asnWriter;
        switch (type) {
          case 'ssh-dss':
            if (sig.length > 40)
              return sig;
            // Change bare signature r and s values to ASN.1 BER values for OpenSSL
            asnWriter = new Ber.Writer();
            asnWriter.startSequence();
            var r = sig.slice(0, 20);
            var s = sig.slice(20);
            if (r[0] & 0x80) {
              var rNew = Buffer.allocUnsafe(21);
              rNew[0] = 0x00;
              r.copy(rNew, 1);
              r = rNew;
            } else if (r[0] === 0x00 && !(r[1] & 0x80)) {
              r = r.slice(1);
            }
            if (s[0] & 0x80) {
              var sNew = Buffer.allocUnsafe(21);
              sNew[0] = 0x00;
              s.copy(sNew, 1);
              s = sNew;
            } else if (s[0] === 0x00 && !(s[1] & 0x80)) {
              s = s.slice(1);
            }
            asnWriter.writeBuffer(r, Ber.Integer);
            asnWriter.writeBuffer(s, Ber.Integer);
            asnWriter.endSequence();

      Из utils.js.
      Ответить
    • // Does not consume window space
        var buf = Buffer.allocUnsafe(1 + 4 + 4 + 13 + 1 + 4 + 4 + 4 + 4);
      
        buf[0] = MESSAGE.CHANNEL_REQUEST;
      
        writeUInt32BE(buf, chan, 1);
      
        writeUInt32BE(buf, 13, 5);
        buf.write('window-change', 9, 13, 'ascii');
      
        buf[22] = 0;
      
        writeUInt32BE(buf, cols, 23);
      
        writeUInt32BE(buf, rows, 27);
      
        writeUInt32BE(buf, width, 31);
      
        writeUInt32BE(buf, height, 35);
      Мне ещё дико доставляет обилие магической цифропитушни.
      Ответить
      • constants.js:
        'arcfour': makeCipherInfo(8, 16, 0, 0, 1536, true),
          'arcfour128': makeCipherInfo(8, 16, 0, 0, 1536, true),
          'arcfour256': makeCipherInfo(8, 32, 0, 0, 1536, true),
          'arcfour512': makeCipherInfo(8, 64, 0, 0, 1536, true),
        // ...
          'hmac-md5': makeHMACInfo(16, 16),
          'hmac-md5-96': makeHMACInfo(16, 12),
          'hmac-ripemd160': makeHMACInfo(20, 20),
          'hmac-sha1': makeHMACInfo(20, 20),
          'hmac-sha1-96': makeHMACInfo(20, 12),
          'hmac-sha2-256': makeHMACInfo(32, 32),
          'hmac-sha2-256-96': makeHMACInfo(32, 12),
          'hmac-sha2-512': makeHMACInfo(64, 64),
          'hmac-sha2-512-96': makeHMACInfo(64, 12),
        Ответить
      • window space? а на линухе?
        Ответить
        • Там еще есть writeUInt32BE
          А если у меня не BeOS?!
          Ответить
          • Я в шоке с того как люди борются за высокие материи ООП, прототипы, функцианальщину.

            А не могут высрать простейшую обёртку со счётчиком для buf.

            Не хочу, хочу жрать говнопетушиться с индексами
            writeUInt32BE(buf, cols, 23);
            p += 4;

            А не писать код как белый господин:
            buf
            .addInt32(chan)
            .addInt8(MESSAGE.CHANNEL_REQUEST)
            .addInts32(cols,rows,width,height)
            Ответить
            • Я правда, даже джава может
              ByteBuffer bb = ByteBuffer.allocate(200); 
                      bb.putInt(42);
                      bb.put((byte)1);
                      bb.putLong(200);


              Был такой пост от Елизарова, где он обращал внимание на то, что у байтбуффера по умолчанию сетевой порядок байт, который отличается от x86 (но вроде не отличается у спрков), так что надо всегда ByteOrder.nativeOrder()
              Ответить
            • Плюсую. Здесь можно было написать такую питушню самому автору.
              Не читал код, поэтому не знаю, там добавляется в конец, или просто так поверх буфера (во втором случае самописный код с изменением полуглобального счётчика будет более гибким).
              Ответить
              • А как тебе 1 + 4 + 4 + 13 + 1 + 4 + 4 + 4 + 4 бат зожатия + 4 + 11 + 1 + 1 вареций?
                Ответить
                • Пипец, конечно.

                  Меня печалит, что из-за подобного ГКвские анскиллябры, которые "JS" толком не видели, ругают "JS", как будто бы на "сишке" этот текст выглядел бы как-то иначе.
                  Ответить
                  • Меня больше печалит, что это дерьмо только за последнюю неделю триста тысяч раз скачали. И миллионы пользователей эту хуету используют, совершенно не подозревая о творящемся там пиздеце.
                    Могу поставить 64 вареции распулужения информации, что критических багов там дохуя и больше.
                    Ответить
                    • Я сам - счастливый пользователь этой питушни.
                      Единственное, что меня печалит - что она 0.5с входит. Не знаю, это криптопожатия хостов так долго работают, или жс питух тормозит. Но я просто наравне с SQL пулами держу наготове соединение и теку, когда мне надо несколько питушень запускать. Зато мой сервер может запускать разную питушню на хостах, где она доступна.
                      Ответить
                      • И это печально.
                        Надеяться на то, что один разраб (который там де-факто в одиночку проЭкт развивает) ни разу не ошибся в этих сотнях магических числах и не наделал кучи ошибок разной степени опасности — в высшей степени наивно.
                        И хорошо, если эта хуйня просто чанк из файла вырежет (как уже, заметь, бывало). А ведь она твои ключи парсит и по сетке что-то с ними связанное гоняет.
                        Мне вот страшно доверять своё бабло одному-единственному петуху, который даже именованные константы не осилил.
                        Ответить
                  • >Меня печалит, что из-за подобного ГКвские анскиллябры, которые "JS" толком не видели, ругают "JS"

                    Это кто тут JS не видел?
                    Ну коли там всё говнище лютое, чего б и не поругать?

                    «У нас архивчики не больше 128к» «У нас чанки херятся»
                    «Мы воруем исходники с сишки, а у нас по-прежнему всё дико тупит»
                    Ответить
                    • Говнище не в JS, не в скриптушне как таковой, а у отдельных программистов.

                      Больше говнища в мире скриптушни - не потому, что скриптушня - говно, а потому, что не-скриптушня просто не позволяет написать код человеку, не являющемуся пердоликом профессионального уровня.

                      И порицать нужно не-скриптушню, где простой человек не может написать программу, не может автоматизировать свою работу и не может иметь куч пользователей. Не-скриптушня превращает общество в закрытую секту программистов, хотя языки программирования в XXI веке должны быть доступны для всех, а не быть набором хипстерксих слов и концепций как C++.
                      Ответить
                      • >Говнище не в JS, не в скриптушне как таковой, а у отдельных программистов.

                        node.js-элиты, которая пишет сложнейший код ключевых модулей.

                        >быть набором хипстерксих слов и концепций как C++
                        Кмк, хипстерский набор слов и концепций — это Haskell и Node.js.
                        А С++ при всех его недостатках уже больше 30 лет как серьёзный промышленный язык.
                        Ответить
                        • Хипстерский набор слов - тот, который никому не известен и не понятен, кроме самого хипстера.

                          По правилам хипстерства хипстерам следует быть не как все и, в частности, придумывать слова, которые другие люди не понимают.

                          В кулхацкеле и ноде гиковский набор слов и концепций.
                          Ответить
                          • Хаскель кстати во многом нердовский. Что роднит его с С++.
                            >где простой человек не может написать программу

                            А вот node.js для гиков.
                            Но там давно уже нет никакого набора концепций.
                            Просто их свалка.
                            Ответить
                      • Так может пусть лучше сапоги точает сапожник, а не пирожник?

                        Казуальные программисты пусть на JS пишут макросы для фотошопа* , а ssh пусть на сях реализуют пердолики-задроты с царским мышлением?


                        *https://helpx.adobe.com/ru/photoshop/using/scripting.html
                        Ответить
                        • "Настоящих" программистов всегда будет мало, и их количество будет только убывать. Думаю, из таких ИТ-специалистов останутся только
                          * те, кто пишут компиляторы, ВМ и прочий царский код, где нужно мышление поехавшего на байтушне
                          * те, кто занимается архитектурой и проектированием систем
                          * те, кто занимается дизайном от общей сути до пользовательского интерфейса

                          Как показывает практика, простой человек не может размышлять как поехавший байтушок, не может продумать архитектуру и не может сделать что-то, чем удобно пользоваться (часто для него важнее сам факт автоматизации, а не взаимодействие программы и человека). Всё остальное он сделать может.

                          Обычному человеку вполне себе можно доверить не только лоховскую скриптушню, но и C++, только для этого надо сделать C++ адекватнее (сейчас сложность C++ - это не сложность концепций или сложность программирования как такового, а сложность налипшего на язык говна). Обычный человек вполне себе понимает, как работает компьютер, что там происходит в памяти, что такое класс, метод и процедура. И только большее количество людей будет это понимать.

                          Обычному человеку легче написать для себя программу, чем программисту. Ему точнее известно, что она должна делать, он лучше разбирается в предметной области. Если предметная область сложная, программист в неё будет въезжать долго и дорого за это возьмёт. А программирование - это всего лишь язык. Научиться говорить с компьютером даже легче, чем с людьми.

                          Вся питушня, которая изучается "программистами" - либо коньцепции, которые просто впитали в себя здравый смысл (если писать медленную программу, она будет долго выполняться; если разделить задачу на подзадачи, будет две простых задачи, за которые легче взяться), который есть не только в программировании, либо абстрактная математика, которую программисты сами не используют (например, лямбда-исчисление), либо алгоритмы, которые программисты сами не знают и реализуют по книжкам, как будет их реализовывать простой человек.
                          Ответить
                          • > Обычный человек вполне себе понимает, как работает компьютер, что там происходит в памяти, что такое класс, метод и процедура.
                            Нет. Это твой сдвиг восприятия как программиста.
                            Для обычного человека компьютер — это такая же коробка, как и холодильник. Она работает, она выполняет задачи пользователя, внутри неё какие-то байты, электроны и фреон. Всё.

                            И никаких предпосылок к увеличению людей, понимающих, как работают компьютеры, нет. Точно так же, как не увеличивается количество людей, знающих, как работает телевизор.
                            Ответить
                            • Покажите реальный пример, где Вам для работы понадобилось знать, как работает телевизор?
                              Скорее всего, в бухгалтерии наврали, что телевизоры у них у на каждый стол поставили.
                              Готов поспорить, что и премии не каждый получал за мастерское владение холодильником. Ну разве что некоторые: http://joyreactor.cc/post/3186277

                              В офисы и прочие помещения ставят не телевизоры, а компьютеры. Компьютер на рабочем месте теперь не диковинка, но обычное положение вещей. За знание телевизора больше зарплаты не получишь, а вот за знание компьютера - вполне. Больше знаешь о компьютере - меньше времени тратишь на пердолинг и возню с ленивым админом - работаешь лучше, имеешь больше предпосылок для повышения зарплаты, спаривания с более здоровыми особями и больше возможностей (финансовых и биологических) для выведения здорового потомства. Знание компьютеров даёт преимущество в эволюционном плане.

                              Может быть, не все, но технари точно начинают понимать, как и что в компьютере крутится, когда им приходится что-то автоматизировать, а программист слишком туп, чтобы написать программу для их предметной области.
                              Ответить
                              • > а вот за знание компьютера - вполне
                                Ты путаешь «знания о том, как работает компьютер» со «знаниями о том, как работать с программами». Какому-нибудь бухгалтеру никто не будет повышать зарплату за то, что он знает о байтиках, тактах, тредах, оперативной памяти, винде на флешке и NAS с SMB1. А вот за углублённые знания «Экселя», «1С:Предприятие» и прочих профессиональных пакетов — вполне.
                                Ответить
                                • Пока ещё не все программы написаны. Где-то нужно будет свою психозу создавать.
                                  Ответить
                          • А зачем обычному человеку С++? Если он хочет автоматизировать себе сортировку фотографий и выкладку их на свой сайт, то что мешает ему взять питон или джаваскрипт?

                            В целом я соглсен, что со временем уровни абстракции будут повышаться, и низкоуровневой питушни будет становиться всё меньше.

                            Уже сегодня миллионы программистов делают веб приложения нихуя не зная про устройство компьютеров, ос и компиляторов.
                            Ответить
                            • Мало ли, какие задачи у человека. Скрипт для обработки фотографий уже потребует C++, т.к. в JavaScript пока чуть хуже с байтушнёй.
                              Например, выломал человек байеровский фильтр ради фотографий с повышенными разрешением и чувствительностью и хочет сам сгенерировать картинку из RAW, т.к. не уверен, что демозаик алгоритм не перестанет смешивать субпиксели, поскольку этого без цветных стекляшек делать не нужно.
                              Ответить
                              • > Скрипт для обработки фотографий уже потребует C++, т.к. в JavaScript пока чуть хуже с байтушнёй.
                                Зачем? Зачем? Если человек это делает для себя — он спокойно подождёт пару минут (не настолько же там всё плохо с батушнёй). Если он пишет программу для других — он автоматически становится программистом и должен страдать.
                                Ответить
                                • > автоматически становится программистом и должен страдать
                                  Питушня же, даже если зелёная. Человек может сделать что-то уровня письма в редакцию о том, как правильно поливать фикусы (ака современные лайфхаки), поделиться с любителями любительской питушнёй.
                                  Его программа не обязана работать со всеми вариантами RAW файлов (даже LR так не умеет, если камера крайне нова), не обязана иметь удобный интерфейс, но она должна без пердолинга обрабатывать фотографии, для этого спецпрограммисты не нужны.
                                  Ответить
                      • Вот ты дзенский мастер скриптушни.

                        Расскажи мне, пожалуйста, как без боли, регистрации и смс мне сделать веб-страницу, которая выводит таблицу с картинками. Приветствуются все хипстерские решения.
                        Ответить
                        • Это же зависит от того, где она вообще будет (возможности хостинга, все дела), где хранятся данные и т.п.
                          * Можно сгенерировать страницу скриптом на python и т.п., положить в директорию со статикой и раздавать любой питушнёй, которая умеет раздавать файлы по HTTP.
                          * Можно взять хостинг с PHP и быстро нахреначить запрос в mysql и вывести в цикле.
                          * Можно написать очень простое приложение под Node, хотя PHP-питушня будет быстрее, т.к. в ней всё встроено, а под Node надо качать пакеты вроде mysql; если приложение будет сложнее странички - какой-нибудь express/impress, либо самому матчить request.url и писать заголовки.

                          Хоть я и забыл PHP, я бы выбрал второй вариант как наименее пердольный.

                          А если эта та задача со словарём с ворециями, то лучше всего написать простой скрипт на питоне, которым генерить страницу и заливать её как статику. Так даже можно использовать самый лоховской хостинг без БД и MySQL.

                          А хипстушнёй я не занимаюсь. Мне ближе ванильный ECMAScript5 без модного говна, чтобы добиваться цели, а не смаковать популярную питушню.
                          Ответить
                          • Это пока другая задача. Идея в том, чтобы разделить вебклиент и апи, как это сделано, например, на ngk.

                            Я посмотрел на последний ангуляр и ужаснулся. В этих дебрях можно ногу сломать. Сейчас ковыряю vue.js

                            Основной вопрос, как сделать адаптивную таблицу, которая автоматически меняла бы количество рядов и колонок в зависимости от ширины экрана (но это, конечно, совсем не js-вопрос, на самом деле)
                            Ответить
                            • Может быть, это тогда вовсе и не таблица?

                              Ну то есть, если у неё есть какие-то строки/колонки, которые можно не показывать без вреда для пользователя, может быть, их стоит не показывать совсем?

                              Или же это не таблица, а набор блоков, которые можно перенести как слова на другую строку?

                              У таблицы можно сделать полосы прокрутки (CSS overflow) или сменить размер текста (CSS font-size). Можно просто накинуть прямоугольных блоков (HTML div, CSS float left, м.б. flexbox), которые будут переноситься на следующую "строку" и из-за равных размеров собираться в "таблицу". Можно вручную прописать разные стили (CSS media queries). Если ширина меньше такой-то, скрыть стилями такие-то столбцы; если высота - такие-то строки. Если ещё меньше в таких-то пределах, то скрыть ещё те и те.

                              Можно слушать изменение размеров страницы (JS window resize event), считывать реальные размеры (JS что-то про rounding box) и решать, что скрывать, что удалять, что рисовать.

                              Вон тут напитушили какую-то питушню: https://github.com/svinkle/responsive-table - если становится узко, таблицу перепердоливают в список и т.п.
                              Ответить
                              • Я не совсем правильно выразился. Имелось в виду, что таблица на широком монике будет выглядеть как
                                X X X X X X X
                                ,
                                а на ноутбуке, к примеру
                                X X X X
                                X X X
                                Ответить
                                • А если больше одной строки, то как?
                                  X X X X
                                  X X X
                                  X X X X
                                  X X X

                                  или
                                  X X X X
                                  X X X X
                                  X X X X
                                  X X

                                  ?
                                  Ответить
                                  • А там не будет больше одной строки.
                                    Но вообще всё равно, оба варианта норм.
                                    Ответить
                                    • Если надо сохранять естествунную ширину колонки, можно
                                      1. отрисовать таблицу как есть
                                      2. измерить ширину колонок
                                      3. зафиксировать её и пустить питушню по кругу
                                      https://jsfiddle.net/b0rmtxLd/2/

                                      Если взять максимальный размер, будет вариант 1: https://jsfiddle.net/b0rmtxLd/3/

                                      Если убрать левость tr, tdшки пойдут в поток, будет вариант 2: https://jsfiddle.net/b0rmtxLd/4/

                                      * аналогично - с высотой.

                                      b0rmtxLd рекм0нду3т!

                                      Если длина/ширина ячейки известна, можно сверстать на divах.
                                      Ответить
                                • Если не нужно поддерживать браузеры 2010-го года и ИЕ, то проще всего flexbox.
                                  Ответить
                                  • Кстати да, плюсую.

                                    На эту тему есть статья https://css-tricks.com/snippets/css/a-guide-to-flexbox/
                                    Только писали сайт скриптухи, он у меня загрузился медленнее, чем Notepad++ с 20 открытыми файлами с говнокодом.
                                    Ответить
                                    • Забавная херня. Вот только одного. не могу понять. Если внутри флекбокса дивы с имиджами, то почему он игнорирует width=25% у картинки и отталкивается от её реального размера?
                                      Ответить
                                      • А, надо было выставить картинке max-width, max-height.
                                        Ответить
                                  • а если надо, то надо бутстрап брать
                                    Ответить
                      • > хотя языки программирования в XXI веке должны быть доступны для всех
                        [citation needed]
                        Программирование — это такая же профессиональная область деятельности, как вождение, ремонт/обслуживание техники, строительство или даже перевод (естественных языков).

                        Да, практически любой человек может, например, заменить у себя дома лампочку. Однако сколько могут поменять проводку и не сжечь дом впоследствии? Я вот не могу.
                        С программированием — всё абсолютно так же. Написать скрипт, который будет генерить какую-нибудь сводку в табличке, скачивать что-нибудь из интернета или генерировать вореции может практически любой опытный пользователь ПК™.
                        А доверять непрофессионалу реализацию сложного криптографического протокола или просто чего-то, от чего будут зависеть деньги — абсолютно то же самое, что и требовать от программиста починить лифт.
                        Ответить
                        • Когда человек приходит в магазин, скорее всего, от покупки профессионального оборудования его отговорит цена. В остальном же, кроме самых запутанных, инструменты вполне можно окинуть здравым смыслом.

                          Профессиональный молоток будет в несколько раз дороже и крепче, но функционировать будет так же, как и любительский. Профессиональный лом вовсе не отличишь от любительского. А профессиональный автомобиль таксиста - от любительского. Профессиональные фотокамеры даже проще, чем любительские (из них выпиливают вспышку, кучу ненужных режимов и добавляют интуитивно понятные аппаратные кнопки вместо запутанных программных меню).

                          Но инструменты профессионального программиста - какое-то сложное говно с кучей придуманных аббревиатур. Программисту надо долго учиться работать с банальным текстовым редактором (vim, msvs), учиться выводить в поток в C++.

                          Несколько столетий/тысячелетий назад тоже делали бронзовые стамески. Но это было не потому, что они предназначались для профессионалов, которыми могли быть единицы, а потому, что технологий изготовления банальной стали у людей тогда не было. Так и с ИТ-питушнёй: пока мы имеем сырое говно, которое ещё не успело обкататься хотя бы веков за пять. И мешает его использовать не анскильность людей, а говённость инструментов. В программировании намного меньше задач, для которых действительно нужны программисты.
                          Ответить
                          • > Но инструменты профессионального программиста - какое-то сложное говно с кучей придуманных аббревиатур.
                            В первую очередь инструменты программиста сложны из-за того, что программист работает с крайне сложным устройством — компьютером.
                            Можешь открыть какой-нибудь лётный мануал от самолёта — там вообще чуть ли не половина слов написана капсом, а понятны только предлоги.

                            > И мешает его использовать не анскильность людей, а говённость инструментов.
                            [источник?]
                            Наше сырое говно на транзисторах мы уже обкатали до физически возможно максимума, дальше можно только крохи вырывать. А квантовая питушня — мало того, что требует крайне специфических знаний, так ещё и с большой долей вероятности нереализуема.
                            Ответить
                            • > инструменты программиста сложны из-за того, что программист работает с крайне сложным устройством — компьютером.
                              Ну нет там уж такой большой сложности. Все идеи - простые и понятные, реализация не всегда оставляет их такими, но всё же.

                              То ли дело медики или физики. У них в предметной области принципиально сложная питушня, которые они не придумывали и не хотели бы придумывать. Они распутывают говнокод мироздания.

                              ИТ-специалисты же сами создали своё говно, сами его усложняют и сами с ним борются. Асинхронность в JS как пример. Что мешало так долго бороться с лапшой? Почему так долго не вводили async/await и пердолились? Что мешало сделать нормальный C++ заново, а не фиксить баги и размышлять об оптимизации C++ в терминах C++ в идеологии C++, хотя известно было, что они - говно?

                              Асинхронность в JS и язык C++ - какая-то принципиальная сложность программирования? Нет, это просто необкатанное говно.

                              > Наше сырое говно на транзисторах мы уже обкатали до физически возможно максимума
                              Это мелочи. Остаётся ещё ряд задач, которые надо решить, чтобы инструменты программиста перестали быть таким говном
                              * Тормознутая скорость света и большое энерговыделение вентилей
                              * Ортогональная система команд у процессора
                              * Отсутствие UB
                              * Продвинутая оптимизация и нетормозной декларативный SQL
                              * Понятный C++
                              * Уменьшение бойлерплейта, семантически понятный код
                              * Понимание компьютером намерений пользователя и адекватное выполнение автоматически выведенного и скорректированного ТЗ
                              Ответить
                              • > Ну нет там уж такой большой сложности.
                                Ну да, ну да. Чтобы понять работу современного компьютера в деталях (а не на уровне «это АЛУ, он считает, а это ЗУПВ, там данные хранятся») нужно иметь как минимум пару вышек.

                                > Все идеи - простые и понятные, реализация не всегда оставляет их такими, но всё же.
                                Идея самолёта — простая и понятная, но это не значит, что самолёт — простое устройство (хотя он проще компьютера, кстати).

                                > язык C++ - какая-то принципиальная сложность программирования?
                                Да. Это попытка выразить высокоуровневые концепции в низкоуровневых терминах. Получить максимальный пирфоманс можно только так.

                                > Остаётся ещё ряд задач, которые надо решить, чтобы инструменты программиста перестали быть таким говном
                                Пожалуй, соглашусь, что сложность каждого из пункта последующего списка примерно одинакова. [​/color]
                                Ответить
                                • > Чтобы понять работу современного компьютера в деталях, нужно иметь как минимум пару вышек.
                                  Понимать на таком уровне не нужно. Программа либо сразу работает как надо, либо гуглится и рассматривается каждый случай отдельно.

                                  Знание квантовых состояний атомов в полупроводниках программисту не нужно, так же как микроархитектура процессора. Программист работает на уровне абстракции повыше, где в двух-трёх сигмах случаев проблемы другие. То кто-то сел на флешку и долго читает, то пользователь поставил битый диск или какую-то питушню двадцатилетней давности, то UAC добавили. До того, как дело упрётся во внутренности ПК, программист уже может уйти на пенсию. Просто так рассматривать хвосты за тремя сигмами - питушня, которая не окупится.

                                  >> язык C++ - какая-то принципиальная сложность программирования?
                                  > Да. Это попытка выразить высокоуровневые концепции в низкоуровневых терминах. Получить максимальный пирфоманс можно только так.
                                  Ну вот Вы говорите, что это "попытка". Чуть менее, чем полностью эта сложность - несовершенства такой попытки, никак не связанная с принципиальной сложностью.

                                  Вот кто помешал разрешить описывать операторы с правым this внутри класса? Это можно сделать банальным препроцессором, который их выносит за класс, а внутри добавляет строчку дружеского доверия оператору.

                                  Кто помещал переиспользовать и инлайнить коньструкторы (вроде же это уже добавили в новую версию)?

                                  Кто помешал сделать режим без UB, но с подгоном кода и его ворнингов под конкретную архитектуру, где у меня, например, работает как надо интовый перекат, т.к. моя архитектура использует комплементарного питушка? Это бы и байтухам первым пригодилось.

                                  Много высокоуровневых терминов могут хорошо описывать низкоуровневую питушню, и это можно эффективно использовать.
                                  Ответить
                                  • > Понимать на таком уровне не нужно.
                                    И тем не менее, как я и сказал, программирование такое сложное потому, что оно построено на базе крайне сложного устройства. Да, постоянно придумываются абсракции, которые отдаляют программиста от компьютера. Но у абстракций в реальном мире есть неприятное свойство: они постоянно текут. Нетекущие абстракции бывают только в чистой математике (и то не факт).
                                    Собственно, поэтому для любого программиста крайне важно умение работать с протёкшими абстракциями.

                                    > Чуть менее, чем полностью эта сложность - несовершенства такой попытки, никак не связанная с принципиальной сложностью.
                                    Нет. Принципиальная сложность в том, что любая попытка выразить абстракции низкого уровня в терминах абстракций высокого уровня неизбежно будет (1) тормозить, (2) протекать и/или (3) выглядеть как переусложнённое говно (можно выбрать один или больше пунктов из списка, меньше нельзя). Происходит это из-за того, что при переходе на ступеньку «вверх» нам надо каким-то образом обработать потерянную при этом информацию. Разберём по пунктам:
                                    1) Тормозящие абстракции: мы потеряли информацию о железе и не можем эффективно его использовать. Сюда входит любое скрипто- и вмоговно.
                                    2) Протекающие абстракции: мы не потеряли информацию с нижнего уровня, а потащили её наверх. Реальный пример — «C». Вроде бы язык высокого уровня, но приходится пердолиться с памятью, ручными тредами и прочим железоговном.
                                    3) Переусложнённое говно: мы не потеряли информацию, вместо этого полностью выразив её в абстракциях верхнего уровня. В результате у нас в одном слое лежат абстракции и верхнего уровня, и нижнего. Идеальный пример — кресты с их «std::hardware_destructive_interference_ size».

                                    > операторы
                                    > коньструкторы
                                    > UB
                                    Всё это — мелочи, которые никак не влияют на общую картину. Исправим их — получим вылезшего из другой лунки крота. Потому что абстракции низкого уровня всегда будут ждать удобного момента, чтобы укусить нас за жопу.
                                    Ответить
                                    • > построено на базе крайне сложного устройства
                                      Это эффективная сложность, но не принципиальная. Если по литературе задали выучить пару строф из /dev/urandom, можно выучить ту кобенацию, которую выдаст генераторушня, а можно навернуть свой генератор, никто не заметит разницы!
                                      Так и с компьютерами: можно изучать принципы и связи, а можно - конкретное устройство с чипами определённых производителей и набором установленных программ и шрифтов. Второе будет намного сложнее, хотя объективную реальность будет описывать более бедно.

                                      > у абстракций в реальном мире есть неприятное свойство: они постоянно текут
                                      И их успешно затыкают. Мой printf или console.log отлично работает, я чуть менее, чем никогда заглядывал внутрь.
                                      Их затыкают настолько хорошо, что при их протечке программистом уже не обойдёшься, нужен будет эксперт по криптушне или внутреннему устройству процессоров отдельной серии.
                                      И компиляторы выдают ошибки и ворнинги.

                                      > Тормозящие абстракции
                                      JIT, директивы и параметры компилятора.
                                      В C++ есть "ссылки", которые позволяют не переписывать код, работающий со значением, и при этом добавить царски быстрое копирование аргументов в стек.

                                      > Переусложнённое говно
                                      Да. Но это уже проблемы реализации. С опытом у создателей языков вырабатывается статистика, вырабатывается опыт, популярный код начинает выглядеть проще и не тормозить.
                                      Ответить
                                      • > можно изучать принципы и связи, а можно - конкретное устройство с чипами определённых производителей и набором установленных программ и шрифтов
                                        Проблема в том, что этих самых принципов и связей в современном ПК вагон и маленькая тележка, и досконально их знают только хардкорные бородатые программеры с 20+ годами опыта. Остальным (включая меня, да) остаётся только жаловаться на несовершенство мира.

                                        > И их успешно затыкают.
                                        По большей части это «затыкание» сводится к банальному закидыванию дыры лишники гигагерцами и гигабайтами. Решение эффективное… Было до недавних пор, пока Мур работал. А теперь мы упёрлись в физику, дальше экспоненциально расти некуда (вернее, можно и нужно расти в мультиядерность, но там, во-первых, надо многопоточность, которую макаки не осилят, а во-вторых, к пределу энергопотребления мы тоже подползаем потихоньку).

                                        > JIT, директивы и параметры компилятора.
                                        Прах, тлен, эвристики и недетерминированная питушня. Ни жид, ни компилятор не знают, что от них хочет программист (он и сам это в большинстве случаев не знает).

                                        > Но это уже проблемы реализации.
                                        Это проблемы несоответствия гипотетической машины, под которую создаётся язык, и реальных компьютеров.
                                        Ответить
                                        • > этих самых принципов и связей в современном ПК вагон и маленькая тележка
                                          Но не все сразу нужны.
                                          Если имеется сложная глючащая программа, часто достаточно с помощью чтения кода и отладчика выяснить её особенности в отдельном месте и пофиксить.
                                          А можно у себя в голове смоделировать поведение программы, мысленно найти проблему и переписать код.
                                          Так и в ИТ в целом. Достаточно базовых принципов и изучения конкретно нужных особенностей, хотя можно стать бородатым опытоносцем.

                                          > По большей части это «затыкание» сводится к банальному закидыванию дыры лишники гигагерцами и гигабайтами.
                                          Однако, с этим можно бороться.
                                          Можно обучить компилятор упрощению стыков абстракций (самый простой пример - инлайн и анролл, когда тормозящие абстракции функций и циклов превращаются в царский код), можно вставить скукоживатель области оперделения (например, ворнинги на лишние касты наподобие ворнингов на касты из длиннуха в короткуха). Помню, дяденька Борманд рассказывал про программирование видеопитуха, где была абстракция цикла, но не было циклов с заранее неизвестным числом итераций. Аналогично - урезанная рекурсия в макросне C/C++.

                                          > Ни жид, ни компилятор не знают, что от них хочет программист (он и сам это в большинстве случаев не знает).
                                          > Это проблемы несоответствия гипотетической машины, под которую создаётся язык, и реальных компьютеров.
                                          А вот это - принципиальная проблема процесса программирования.
                                          Код надо перевести из желания клиента об автоматизации, выраженном в (недо)ТЗ, криво понятым программухом и изложенным на языке программирования, который настолько убог, что сочетает сложность (ради точного выражения царского кода) с описанием алгоритма под какую-то другую машину (ради попытки натянуть один царский код на несколько машин). Питушня, нафиг так жить.
                                          Ответить
                                          • > Достаточно базовых принципов и изучения конкретно нужных особенностей
                                            В любой области достаточно базовых принципов и изучения конкретных особенностей. Другое дело, что специалистом так стать не получится, только PHP-программистом, пишущим гостевухи за еду.

                                            > Однако, с этим можно бороться.
                                            Как я и сказал, это всё тлен и частные случаи. Вот этому товарищу, кстати, тоже частные случаи постоянно мешали: https://gamedev.ru/flame/forum/?id=169618.
                                            Нет, разумеется, это не значит, что я против развития оптимизаций, совсем наоборот. Просто фундаментальные проблемы эти затычки исправить в принципе не могут. Для этого надо как минимум изобретать другие, совершенно новые парадигмы программирования, включая языки (с нуля) и архитектуру компьютеров (с нуля). Убрать UB из крестов, добавить в жабаскрипт типизацию, реализовать агрессивный инлайн — это всё попытки починить «Титаник» синей изолентой.

                                            Но с другой стороны: а так ли плохо современное программирование, чтобы выкидывать его на помойку и изобретать что-то новое?
                                            Я вот думаю, что нет, не стоит это таких усилий. Над созданием современной IT-экосистемы целое человечество работало эдак лет сто. Сложность крестов — явно не то, из-за чего нужно повторять этот путь заново.
                                            Ответить
                                            • > специалистом так стать не получится
                                              Настолько ли нужно им быть? Век специалиста недолог: знания специалиста устаревают быстрее.
                                              Если можно на свою заплату покупать сёмгу, надо ли становиться пердоликом-специалистом?

                                              > попытки починить «Титаник» синей изолентой
                                              А мне кажется, это полезный опыт. Так можно выяснить направления движения, а не просто знать, что вон в тех точках нет ничего интересного.
                                              Тем более, что полная замена
                                              > не стоит таких усилий

                                              Но вообще надо кобенировать революционный подход с эволюционным. Новое говно может дать большой буст, а может влить тонны говна. Старое говно может вяло улучшаться или вяло загибаться.
                                              Новаторы пойдут строить реальные проекты на принципиальном новом говне (не стоило ругать менеджеров в соседнем треде. они дают индустрии полезные данные) и выносить их этого опыт. Консерваторы будут спокойно добавлять полезные фичи и улучшать старое говно.
                                              Ответить
                                              • > Настолько ли нужно им быть?
                                                С тем же успехом можно вообще не быть айтишником, а пойти в «Макдак» на кассу.

                                                Специалисту, обладающему обширными знаниями, попросту открыто больше перспектив.
                                                Можно быть пхп-макакой и всю жизнь писать гостевухи за три куска сёмги в день — но тогда надо быть морально готовым к тому, что ничего лучше уже не будет.
                                                А можно быть крутым специалистом, пройти собеседование в «Гугле» и уехать в силиконовую долину, с соответствующим повышением уровня жизни.
                                                И да, разумеется, я не утверждаю, что специальные знания автоматически дают +$100500 к зарплате. Они попросту увеличивают шансы получить +$100500 к зарплате. Стоит ли это затрат времени и сил на становление специалистом — тут уж каждому решать самостоятельно.

                                                > Но вообще надо кобенировать революционный подход с эволюционным
                                                Подтверждаю.
                                                Ответить
                                                • Знания - как капитал. Тебе открываются возможности по кредитам, в бизнес-зале аэропорта можно отдохнуть, но налогов приходится платить тоже больше (в некоторых местах - не только в абсолютной величине, но даже в относительной!), инфляция сожрёт больше, врагов будет больше и т.д.

                                                  Пока пхпшник ходит в кино, ты работаешь над знаниями.
                                                  Когда пхп выкинули и пхпшник сидит в кафе учит ноду, ты сидишь с ним в кафе и хлещешь водку, т.к. тебе не наверстать выкинутый x86 и перестроиться на арм за короткое время.
                                                  Ответить
                                                  • Человеку, который знает x86, перестроиться на arm так же просто, как пхпшнику выучить ноду.

                                                    У него есть фундаментальные знания того, как работает процесор, он знает ассемблер, понимает как работает MMU, кеш, знает фамилию Томасуло.

                                                    И приятный бонус еще в том, что в случае чего он сможет и под ноду что-то написать.

                                                    j[циферки] и Борманд могут писать на джаваскрипте (или научиться этому на 2 дня), а пыхапер на асме или даже сях не сможет.
                                                    Ответить

                                                    • Я всё понял! На самом деле ДОБРОЕ ИМЯ ДОБРАЯ СЛАВА В ЧЕСТИ 1024-- — матёрый бородатый низкоуровневый спец, с закрытыми глазами определяющий ISA процессора на ощупь. А за анскильных пхп-макак он агитирует специально, чтобы в его области было поменьше конкурентов и побольше зарплаты.
                                                      Ответить
                                                  • Правильно, поэтому, продолжая аналогию, инвестировать в единственную компанию и жить на дивиденды, полностью игнорируя внешний мир — пардон, идиотизм.

                                                    Любому тотальному выкидыванию технологии на мороз обязательно будут предшествовать долгие годы обсуждений, подготовительных этапов и переходных процессов. Идеальный пример — «IPv4», который «выкидывают» уже лет двадцать, или «x86», который в пользу «x64» выкидывают чуть поменьше, лет десять-пятнадцать.
                                                    Если «специалист» много лет подряд полностью игнорировал все новости из области своей специализации и в результате оказался у разбитого корыта (при этом умудрившись проебать даже время, в которое устаревшая технология была нужна как легаси, а-ля Кобол) — ну, значит, это какой-то очень странный специалист.

                                                    И да, я очень сильно сомневаюсь, что пхп-макака, в жизни кроме пхп ничего не видевшая, выучит «Ноду» быстрее, чем специалист по x86 ассемблеру выучит другой ассемблер, в архитектуре которого вообще нет каких-то совершенно революционных идей.

                                                    Наконец, область IT вообще крайне новая, бурная и быстро развивающаяся. Если хочется просто получить работу и ближайшие лет пятьдесят сидеть на жопе ровно, получая стабильный доход — в айти идти точно не следует.
                                                    Ответить
                                                    • > сомневаюсь, что пхп-макака, в жизни кроме пхп ничего не видевшая, выучит «Ноду» быстрее, чем специалист по x86 ассемблеру выучит другой ассемблер
                                                      Она её выучит быстрее в необходимом для получения той же зарплаты объёме, чем специалист по x86 ассемблеру выучит другой ассемблер в необходимом для получения той же зарплаты объёме.
                                                      Ответить
                                                      • И в этом я сомневаюсь.
                                                        Как я уже написал, в «ARM» нет каких-то идей, которые будут совершенно новыми для x86-спеца. Разумеется, если «x86-спец» — это действительно специалист, углублённо знающий архитектуру компьютеров, а не просто замаскированная пхп-макака, заучившая список команд.

                                                        С другой стороны, при переходе на «Ноду» пхп-макаку ждёт целый дивный новый мир концепций, которых в пхп либо нет вообще, либо о которых пхп-макака не догадывается.
                                                        Асинхронность, события, потоки, REST, пакетный менеджер и так далее, и тому подобное. Даже то, что надо за собой чистить занятые ресурсы, ведь память в пхп не шарится, и на каждый запрос заново запускается.
                                                        Ответить
                                                        • Тогда я вообще запутался, о чём идёт речь.

                                                          В некотором смысле выходит, пхп-макака - это узкий специалист в прикладном скриптовании, для которого даже нода будет новой; а "x86-спец" на самом деле генералист, который хорошо знает только основные идеи и готов использовать другие инструменты. И генералист в долгосрочной перспективе с большей вероятностью остаётся в деле.
                                                          Ответить
                                                          • Не совсем. Пхп-макака просто заучивает пхп, приучивается везде ставить доллар и течёт. Для макаки программа — это набор магических заклинаний, которые дают нужный макаке результат. На «Ноде» эти заклинания совершенно другие, поэтому макаке учиться придётся фактически с нуля.

                                                            А вот для «x86-спеца» жизненно важно обладать мощными фундаментальными знаниями о работе процессора, потому что иначе просто не получится писать эффективный код (а нужен «x86-спец», который не может написать эффективный код? Легче тогда уж пару джаваскриптеров нанять).

                                                            Собственно, если пхп-макака возьмётся за самообразование, освоит основы программирования (императушня, структурошня, ООПушня, функциотушня, питушина Питуринга, общие питуринципы работы ПК, математика, etc.), то она внезапно превратится в самого обычного PHP-программиста, который способен достаточно легко перейти на любую другую скриптушню.
                                                            Ответить
                                                            • -а нужен «x86-спец», который не может написать эффективный код?
                                                              +а кому нужен «x86-спец», который не может написать эффективный код?
                                                              Ответить
                                              • > Настолько ли нужно им быть?
                                                > Век специалиста недолог: знания
                                                > специалиста устаревают быстрее.


                                                Так и вижу, как устаревают знания Торвальдса, Кнута и Руссиновича.

                                                Сидят себе на пенсии, шьют носки, и думают: "лучше бы на джаваскрипт писали, ей богу"
                                                Ответить
                                                • Кнут математикушнёй занимается. Там делают на века, знания мало устаревают.
                                                  Но не уверен, что он реализует свои алгоритмы лучше, чем номерной j с ГК, который знает актуальную питушню в ПК и GCC.

                                                  Знания Торвальдса и Руссиновича постоянно устаревают. Не удивлюсь, если они тратят пару часов в день на самообразование.
                                                  Ответить
                                                  • > они тратят пару часов в день на самообразование


                                                    Разумеется, в этом вашем айти постоянно что-то нужно читать. Просто их знания позволяют им обновляться куда быстрее.

                                                    Знания макаки-питушка тоже устаревают, если на то пошло: он умел писать $foo в своем php, а вот уже стало надо $_GET['foo']
                                                    Ответить
                                                    • Общие принципы хуже устаревают. Можно быть специалистом и знать отличие ?: в пхп и сишке, а можно просто знать, что делает ?: и огораживать всё скобками. Когда пхп или сишку выкинут, не придётся переучивать детали.
                                                      Ответить
                                                      • ?: -- это вполне себе общий принцип (мухи)

                                                        Знание о том, какой там приоритет в конкретном языке можно почерпнуть из документации, подержать в памяти пока пишешь на языке, а потом забыть

                                                        Справочная информация на то и справочная, чтобы быть в справочнике. Это как опции команды ls. Я их всех наизусть не помню конечно, но есть хелп

                                                        Я не считаю, что специалист по *nix обязан знать все опции ls наизусть
                                                        Ответить
                                      • >затыкают

                                        Ну да, затыкают. А как только твои задачи чуть-чуть выходят за пределы того, на что расчитывали затыкатели -- так сразу всё ломается.

                                        И тут приходится звать чуваков, которые действительно понимают (например Brendan Gregg).

                                        Разумеется, на одного Грегга приходится 1999 макак, и разумеется Грегг обычно не нужен, но тем не менее, у него постоянно есть работа, и она куда лучше оплачивается, чем работа макак, и наверняка много интереснее. И если завтра он уйдет из своего нетфликса (или где он там работает), то к нему выстроится очередь из эйчаров айти гигантов с предложением у них поработать, а макака пойдет на ебаное айти ныть, какие все пидарасы кругом.

                                        Шипилёша кажется рассказывал, как на одной серьезной джаваконфе спросил зал "кто знает про фолс шаринг" (это как раз то, что гост принес -- hardware_destructive_interference_ size), и руку поднял практически никто. Шипилеша говорит: "и это тут архитекторы сидят, да?"

                                        Выбирай, как грица, хочешь ли ты быть Шипилевым и Греггом, или где-то вот тут
                                        https://phpclub.ru/talk/threads/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-smarty-%D0%B2-%D1%81%D0%B2%D0%BE%D0%B5%D0%BC-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B5.83677/
                                        Ответить
                                        • «Smarty» не нужен, потому что «PHP» per se –— лучший шоблонизатор.
                                          Ответить
                                        • У чувака на аватаре фото из поезда, сложно сказать, купе или плацкарт, но факт - макака не отрывается от пехапе даже в пути!
                                          Ответить
                                        • И архитекторы обычно нужны не для того, чтобы знать про какой-то там фолс шаринг (я тож не знаю, хотя я не архитектор, да и не жаваёб, впрочем), а чтобы добавить молодой динамично развивающейся компании солидности
                                          Ответить
                                          • фолс шаринг есть везде, где есть современный процессор, просто мобильные приложения редко от него страдают, потому что редко бывают супервысоконагруженными)

                                            А архитекторы нужны для солидности, да..
                                            Ответить
                                        • С каждым разом затыкают всё лучше. Вчера заткнула веб-макака, сегодня - грегги, завтра придётся вызывать богов.

                                          Специалисты, за которыми стоят в очереди - как айфоны. Их можно распродать, а можно получить очередь из 200 перекупщиков. Люди могут копить на них и залезать в кредиты, а могут взять что-то подешевле, даже если показатель "цена к качеству" будет ниже.
                                          Сегодня стоят очереди, а завтра возьмут того, кто за меньшие деньги выдаст результат получше и не будут просить накинуть соточку за сертификаты.

                                          > Выбирай, как грица
                                          Два стула
                                          Ответить
                                          • Конечно же люди будут стараться купить более дешевый вариант, потому Грегги будут работать только там, где действительно есть деньги.

                                            По мере заткыания дыр, растут и требования: 20 лет назад никому не нужно было оптимизировать доступ одного миллиарда пользователей к паре петабайт информации: просто не было таких размеров. Так что, имхо, Грегги будут нужны всегда, если конечно человечество не изобретет что-то принципиально новое, например такой ИИ, который заменит программиста.

                                            >Два стула
                                            Я не вижу тут двух стульев: во всяком случае, я не знаю реальных примеров когда хороший айтишник не смог бы поменять язык/технологию/ос/фреймворк вслед за рынок.

                                            Ноющих о невысокой зарплате макак я видел, безработных эникейщиков, жалующихся на то, что никто не платит больше за переутановку виндуос хорошие деньги, я тоже видел.
                                            А безработных "бормандов" -- нет.
                                            Ответить
                                            • > Я не вижу тут двух стульев: во всяком случае, я не знаю реальных примеров когда хороший айтишник не смог бы поменять язык/технологию/ос/фреймворк вслед за рынок.

                                              - дружище, а ты часто сам пробовал переключаться на новый язык/технологию/фреймворк?
                                              Ответить
                                              • Я переодически это делаю, и вокруг меня это тоже часто происходит.

                                                ps: имеется ввиду конечно схожие области: редко бывает так, чтоб 1Сник стал вдруг микрокоды писать. Но вот целая область перешла с ObjC на swift: поменяла язык, а!
                                                Ответить
                                                • Периодически это как часто? С каким успехом? Какая просадка по сёмге?

                                                  Типа ты писал на жабе серверные приложения, а потом рынок поменялся и ты начал писать на котлине под андроид, например?
                                                  Ответить
                                                • > Но вот целая область перешла с ObjC на swift: поменяла язык, а!
                                                  - чувак, ты бы слышал стоны моих сотрудников году в 2015, которые искали 100500 причин не переходить на свифт (например, он, видите ли, недостаточно динамический). Это при том, что да, платформа, парадигма и фреймворки остались по сути теми же, а сколько при этом попоболи.

                                                  Или вот переход с UIKit на SwiftUI, особенно, если до этого тебе "реактивное" погромирование было до пизды. Да, через неделю ты сможешь копипастить туториалы, через месяц юзать как серебряную пулю, но сколько времени пройдёт, прежде чем ты осилишь технологию по максимуму, чтобы выйти на свой уровень продуктивности до начала её использования?
                                                  Ответить
                                                  • Вполне верю в стоны: примерно так же стонут переходящие с Java на Kotlin, а уж как "oldtimers" ругаются на новые кресты это вообще.

                                                    Тем не менее, как-то переходят, когда прижмет.
                                                    Сколько времени пройдет зависит от обучаемости, мотивации, и всяких других факторов. У всех по разному
                                                    наверное.

                                                    Я не говорю, что менять инструменты можно за просто так: это всегда стресс, чтение док, пирдолинг, но они это делают.

                                                    Я не верю, что если Apple завтра уйдет с рынка, Mattt Thompson пойдет в макдональдс. Наверняка что-то другое выучит
                                                    Ответить
                                                    • А чо их прижмёт? Хочешь - пиши под iOS на обжективе, никто тебе не мешает.

                                                      Можно только представить, сколько Sun, MS, Apple потратили средств на раскрутку своих языков и платформ для разработчиков. Не было бы агрессивного маркетинга, была бы Джава с шарпом и котлином где-то в области обитания языка D.

                                                      У Мэттта прямо на сайте написано, что он worked as a technical writer, нерелевантно.
                                                      Ответить
                                                      • > была бы Джава с шарпом и котлином где-то в области обитания языка D.
                                                        А что бы в этом случае использовали для питушни, где C++ слишком сложен, а python слишком тормозит?
                                                        Ответить
                                                        • Изобрели бы другой йазык
                                                          Ответить
                                                        • Как и раньше - паскакаль.
                                                          Ответить
                                                          • Может быть не так уж это и плохо бы было.

                                                            * Везде был бы ОДИН язык. Думаю, очевидны плюсы этого?
                                                            * Довольно строгий, и статически типизированный.
                                                            * Менее хаотичный, и чуть более продуманный.

                                                            Конечно, паскаль образца 1970-го года бы устарел, но его бы развивали.
                                                            Ответить
                                                            • Откровенно говоря, даже на момент появления жабы нигде не было одного языка.

                                                              Паскаль и дельфин, кстати, умерли вместе с компанией Борманд. Оказалось некому их продвигать и макаки не стали на них больше пересаживаться.

                                                              Недавно упоминавшийся тут Дилан умер вместе с донекстстеповским ябблом. Джобс не стал его продвигать и макаки не стали на него больше пересаживаться.

                                                              Не всегда новый инструмент лучше старого. Именно поэтому няшная и кресты, несмотря на все свои UBы и местами старческие маразмы, живее всех живых.
                                                              Ответить
                                                      • >А чо их прижмёт?
                                                        Ну например смена коньюнкуры рынка. Что ты будешь делать, если Apple отправится туда же, куда отправилась Nokia? Уйдешь в кочегары, или bite the bullet, и начнешь писать под андроид?


                                                        Мэтт повернут на ябле (NSHipster, CFHipsterRef итд), я имел ввиду, что если с яблом что-то случится -- ему придется переучиваться.

                                                        Алсо, есть такие ебанутые хикки, котоыре изучают новые языки просто потому, что им нравится. Например, Нидлесс выучил свой J равно не ради работы, и думаю он любой другой язык так же выучит.

                                                        Правда, программисты на галёрах с женой, тремя детьми, и рыбалкой просто так учить язык не будут, конечно
                                                        Ответить
                                                        • > Что ты будешь делать, если Apple отправится туда же, куда отправилась Nokia?
                                                          - я так понимаю, под Nokia ты подразумеваешь рынок телефонов на j2me? Ябблу сложнее отправиться вслед за ним в обозримой перспективе, будем честны.

                                                          А так-то я несколько лет назад попробовал свитчнуться, поблевал, вернулся.

                                                          Плюс я говорил про сейчас: тебя никто (теоретически) не заставляет писать на свифте. Можно сидеть на обжективе до победного конца.

                                                          > Например, Нидлесс выучил свой J равно не ради работы, и думаю он любой другой язык так же выучит.
                                                          - выучит это для гыгыканья и ололоканья на говнокоде или же для того, чтобы писать на языке, занимая минимум сеньорскую должность?
                                                          Ответить
                                                          • Ну у нокии не только j2me были, еще симба и какая-то ось с Qt...

                                                            Но в итоге они продались майкам, а виндофоны не смогли пробиться на рынок и сдохли.
                                                            Ответить
                                                            • Симба с Qt вроде и была. Anna и Belle. Удобное и беззаботное создание мобильной прикладухи на крестах в говноIDE, которую ещё хрен настроишь с первого раза. Нет, речь не по Qt Creator.

                                                              WinPhone мс лично закопала своими бангалорскими жавлами, никогда блядям не прощу.
                                                              Ответить
                                                          • Кстати у эппла тоже есть шанс вылететь с рынка, имхо. Если затупят и не смогут выделяться на фоне андроидов...
                                                            Ответить
                                                            • Шанс всё просрать есть всегда, конечно. Достаточно посмотреть на RIM и Palm.

                                                              Пойду в таком случае писать задний конец на Рэкете или Стриже.
                                                              Ответить
                                            • > безработных "бормандов" -- нет
                                              А недооплачиваемых бормандов?
                                              Прирост эффективности профессионала (а вместе с ним - прирост зарплаты за единицу знаний) падает экспоненциально с поглощаемыми знаниями.
                                              Ответить
                                              • > Прирост эффективности профессионала (а вместе с ним - прирост зарплаты за единицу знаний) падает экспоненциально с поглощаемыми знаниями.
                                                Насчёт асимптотики падения я бы не был так уверен.
                                                В любом случае, вместе с поглощаемыми знаниями растёт количество подходящих мест работы, что позволяет
                                                1) Получать бо́льшую зарплату за счёт устройства на более выгодную работу;
                                                2) В целом быть более уверенным в своём будущем.

                                                Да, конечно, получить все знания мира и стать королём шаманов и невозможно, и бессмысленно. Но вот чрезмерно ограничивать свой кругозор и свою область специализации не менее вредно, чем тратить всё свободное время на получение лишних знаний.
                                                Во всём нужен баланс.
                                                Ответить
                                        • > фолс шаринг
                                          > пхп

                                          Но в пхп нет тредов, какой шаринг )))
                                          Ответить
                                          • https://www.php.net/manual/en/class.thread.php
                                            Ответить
                                            • Омг, таки завезли... Ну один хрен можно ещё лет 10 спать спокойно - пока пыхеры будут разбираться с гонками и дедлоками, им явно будет не до тормозов от ложного шаринга....
                                              Ответить
                                              • им с настоящим-то бы совладать
                                                Ответить
                                                • По теореме о бесконечных обезьянах они получат локфри алгоритмы раньше, чем разберутся с лочками.
                                                  Ответить
                                              • Именно поэтому я за «PHP».
                                                Ответить
                                              • Уже пытаются!!
                                                https://phpclub.ru/talk/threads/%D0%9A%D0%B0%D0%BA-%D0%B8%D0%B7-%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B5%D0%B3%D0%BE-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%D1%81%D1%8F-%D0%BA-%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC-%D1%81%D0%B0%D0%BC%D0%BE%D0%B3%D0%BE-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0.82382/
                                                Ответить
                                                • > phpclub.ru/talk/threads
                                                  Вижу, у них целый раздел, который посвящён обсуждению многопоточности.
                                                  Ответить
                                                • >>> У меня испытательный срок идет, а я вникаю в потоки и не могу получить переменные уже третий день подряд.
                                                  Какой позор (((

                                                  Блядь, за три дня битья головой об стену нормальный человек бы сто раз успел сообразить, что он делает какую-то хуйню, но, видно, для пхп-макак это не предел.
                                                  И ладно бы это был нуб, который только вчера книжку «ПХП за 2 часа» прочитал — так ведь нет, он, сука, на работу устраивается, испытательный срок проходит! Тьфу.

                                                  Концовка эпична, конечно:
                                                  Вроде разобрался, ведь оно работает...
                                                  Но работает еще дольше, чем вообще без использования потоков.
                                                  И ЕЩЕ вдвое дольше, если использовать вроде бы нужный $worker->join();
                                                  Ответить
                                                  • > вдвое дольше

                                                    Ну это норм. У меня сишный rand() работал в сотню раз медленнее, чем без потоков...
                                                    Ответить
                                                  • > еще дольше, чем вообще без использования потоков
                                                    Какая многопоточность )))
                                                    Ответить
                                                  • >вроде бы нужный $worker->join();

                                                    After the run method is executed the Thread will exit immediately, it will be joined with the creating Thread at the appropriate time.

                                                    Он бы всё равно умер сам. От старости. Когда-нибудь (c).

                                                    Однако ниже написано:
                                                    Relying on the engine to determine when a Thread should join may cause undesirable behaviour; the programmer should be explicit, where possible.

                                                    За три дня наш герой не смог даже в доку.
                                                    Ответить
                                                    • >>> Пхп-макака просто заучивает пхп, приучивается везде ставить доллар и течёт. Для макаки программа — это набор магических заклинаний, которые дают нужный макаке результат.
                                                      Ответить
                                          • Именно поэтому я за пхп
                                            Ответить
                                • Язык накладывает свою сложность, которая не относится к проблеме.

                                  Тормозящее сложное говно:
                                  void for_each (void*, size_t, size_t, void(*)(void*));
                                  
                                  void print(void* x) {
                                    printf("%d", *(int*)x);
                                  }
                                  
                                  int main() {
                                    int xs[] = {1,2,3,4,5};
                                    for_each(xs, sizeof(int), 5, print);
                                  }


                                  То же, но выглядит как цикл, без явной байтушни и ненужных кастов и царских умножений указателей, которые надо отдельно оптимизировать:
                                  int main() {
                                    int xs[] = {1,2,3,4,5};
                                    std::for_each(xs, xs + 5, [](int x){ printf("%d", x); });
                                  }


                                  И вообще, банальное описание типа всё усложняет:
                                  void for_each (void*, size_t, size_t, void(*)(void*));

                                  Тогда как можно было бы обойтись без всех этих значков, которые надо читать по спирали:
                                  for_each :: (ptr void, size_t, size_t, (ptr void -> void)) -> void

                                  Запись одна и та же, компилируется в то же, но для её прочтения не нужно быть профессиональным читателем сигнатур функций в "сишке".
                                  Ответить
                    • > чего б и не поругать

                      У хипстерков так не принято, вон даже "кодексы поведения" всякие начали выдумывать...
                      Ответить
    • var eddsaSupported = (function() {
        if (typeof crypto.sign === 'function'
            && typeof crypto.verify === 'function') {
          var key = '-----BEGIN PRIVATE KEY-----\r\nMC4CAQAwBQYDK2VwBCIEIHKj+sVa9WcD'
                    + '/q2DJUJaf43Kptc8xYuUQA4bOFj9vC8T\r\n-----END PRIVATE KEY-----';
          var data = Buffer.from('a');
          var sig;
          var verified;
          try {
            sig = crypto.sign(null, data, key);
            verified = crypto.verify(null, data, key, sig);
          } catch (ex) {}
          return (Buffer.isBuffer(sig) && sig.length === 64 && verified === true);
        }
      
        return false;
      })();
      Ответить
      • > '-----BEGIN PRIVATE KEY-----\r\nMC4CAQAwBQYDK2VwBCIEIHKj+sVa9WcD'
        Вишенка.
        Кто-то объяснит зачем? А то я туго понимаю в столь поздний час.
        Ответить
        • верифицирует ключ, и таким образом понимает есть ли поддердка edsa видимо
          Ответить
      • Ай бляяяяя.

        >Support Electron 5/6 for ed25519
        https://github.com/mscdex/ssh2-streams/issues/144
        Гениально просто.
        Ответить
    • У этой макаки целый гитхаб такого говна.
      Например: https://github.com/mscdex/pg2/blob/master/lib/Client.js
      >>> A PostgreSQL driver for node.js that focuses on performance
      function createRowBuilder(cols) {
        var fn = 'return {';
        for (var i = 0; i < cols.length; ++i)
          fn += '"' + escapeString(cols[i]) + '":v[' + i + '],';
        fn += '}';
        return new Function('v', fn);
      }
      Ответить
      • for (var i = 0; i < kv.length;)
            kvlen += Buffer.byteLength(kv[i++]) + Buffer.byteLength(kv[i++]) + 2;
          var buf = Buffer.allocUnsafe(4 + 4 + kvlen + 1);
          buf.writeInt32BE(buf.length, 0, true);
          buf.writeInt32BE(196608, 4, true);
          for (var i = 0, p = 8; i < kv.length;) {
            p += buf.write(kv[i++], p);
            buf[p++] = 0;
            p += buf.write(kv[i++], p);
            buf[p++] = 0;
          }
          buf[p] = 0;


        https://github.com/mscdex/pg2/blob/master/lib/Protocol.js

        Вконтакте просто


        А есть реализация TCP на JavaScript?\


        зы: обнаружен царский анрол в этом цикле и число Кармака 196608
        Ответить
        • К моему неописуемому удивлению, там даже реализации «TLS» нет.
          Ответить
          • для TLS есть свои чуваки
            https://github.com/digitalbazaar/forge/issues/735

            там тоже кодец что надо, правда циферек там меньше
            https://github.com/digitalbazaar/forge/blob/master/lib/ed25519.js
            var p = [gf(), gf(), gf(), gf()],
                  q = [gf(), gf(), gf(), gf()];
            
              mlen = -1;
              if(n < 64) {
                return -1;
              }
            Ответить
            • Я просто в шоке.

              Вместо того чтобы перегнать сишные либы в asm.js люди городят такой пиздец невообразимый.
              Ответить
              • Это когда llvmовый бекенд компилирует в asm.js? Интересная идея:) Но я все таки за запуск настоящего ssh или за обертку вокруг libssh
                Ответить
            • При этом неустанно воруя код из сишных либ.

              * Parts of this code are based on the OpenSSL implementation of AES:
               * http://www.openssl.org


              https://github.com/digitalbazaar/forge/blob/628b17fb5bc0bf22074b632432ffa535805a1b2b/lib/aes.js#L11
              Ответить
              • У openSSL тоже не очень приятный код (за это его проклял Тео, и начал libressl), а уж сворованный и переписанный на JS вообще страшно подумать как выглядит и работает
                Ответить
                • >У openSSL тоже не очень приятный код
                  Если не сказать больше.

                  Но после этих безумных p += 4 няшная с её типами, cstdint.h, c её массивами и указателями, с memcpy и realloc кажется мне лютой годнотой.
                  Ответить
                  • А ещё у сишки есть божественный «strtok()». Именно поэтому я за «C».
                    Ответить
                    • А ещё в сишке есть перегрузка инкрементов/декрементов не только для int8_t, int16_t, int32_t итд, но и для массивов.
                      int  arr[] = {1, 2, 3, 4, 5}; 
                      int size = *(&arr + 1) - arr;  //5

                      https://ideone.com/8lj4Ku
                      Ответить
                      • Красиво.
                        Ответить
                        • А мне кажется, что уродливо.
                          * Какая-то пидорская конструкция вместо явных sizeof, .size() или .length
                          *Работает только для массивов с известной длиной, выдаёт говно для int*

                          В итоге получается, что какая-то царушня
                          int arr[10][20][30][40];
                          int *arr2[20][30][40] = arr;
                          int *arr3[30][40] = arr[2];
                          int *arr4[30][40] = arr3 + 1

                          особо и не нужна, когда в C++ есть читаемая версия:
                          std::array<std::array<std::array<std::array<int, 40>, 30>, 20>, 10> arr;
                          std::array<std::array<std::array<std::array<int, 40>, 30>, 20>, 10> arr2 = arr;
                          std::array<std::array<std::array<int, 40>, 30>, 20> arr3 = arr2[2];
                          std::array<std::array<std::array<int, 40>, 30>, 20> arr4 = *(arr2.begin() + 3)

                          где точно известно, какой тип будет у элемента и на что ссылаться. Говна вида эквивалентности int [10][20][30][40] и int *[20][30][40] и типа int *[30][40] как элемента этого массива просто не будет. Либо массив как элемент, либо явный итератор.
                          Ответить
                          • Оно по-особому красиво, по-хакерски. Как битовая магия, ассемблер в ASCII-кодах или демки на 128 байт.

                            > int arr[10][20][30][40]
                            Говно.
                            > std::array<std::array<std::array<std::ar ray<int, 40>, 30>, 20>, 10>
                            Говно.

                            Ни в «C», ни в «C++» искаропки нормальных многомалостныхмерных массивов нет, есть только тормозящее и вылетающее за кеш нечто.
                            Ответить
                            • - Ни в «C», ни в «C++» искаропки нормальных многомалостныхмерных массивов нет, есть только тормозящее и вылетающее за кеш нечто.
                              + Ни в «C», ни в «C++» искаропки нормальных динамических многомалостныхмерных массивов нет, есть только тормозящее и вылетающее за кеш нечто.
                              Статические есть: «GCC» успешно оптимизирует пачку арраев до одного сложения с укококозателем.
                              Ответить
                      • Круто. Значит, настоящие массивы всё-таки в сишке бывают. Оказывается, можно создать указатель на массив ровно из пяти элементов.
                        Ответить
                      • лол, типа &arr это адрес массива, и потому увеличение его на 1 приводит к увеличению указателя на размер массива (по законам адресной арифметики указатель на FOO при увеличении увеличивается на sizeof(FOO)) ?
                        Ответить
                        • Да. Из-за такого инициализатора тип переменной arr - int[5].
                          Соответственно, размер элемента массива, включающего arr - 5 интов.
                          Ответить
              • https://github.com/digitalbazaar/forge/blob/628b17fb5bc0bf22074b632432ffa535805a1b2b/lib/aes.js#L187

                > } else if(forge.util.isArray(key) &&

                да сука
                и тут без кастомного isArray не обошлось
                Ответить
                • да, старый код на JS всегда имел много велосипедов: стандартной библиотеки-то не было
                  Ответить
                  • а можно-то было всего лишь разрешить использование только одного формата данных на входе, чтобы не ебаться с этим
                    Ответить
                    • ты что, за статическую типизацию?!
                      Ответить
                    • Осторожно, скриптухи за такое заклюют как еретика.
                      Ответить
                    • В таком случае надо просто делать такую архитектуру:
                      * инкапсулированная имплементация зависит от конькретного типа
                      * интерпейс принимает разные типы и
                          * конвертирует в поддерживаемые
                          * вызывает нужные имплементации
                          * бросает исключения

                      То есть то же самое, что делает хорошая программа с пользовательским интерфейсом
                      * инкапсулированная имплементация зависит от конькретного типа
                      * интерпейс принимает разные форматы ввода и
                          * парсит значения
                          * вызывает нужные имплементации
                          * бросает исключения

                      То есть в скриптушне можно скалировать MVC или business logic+interface с уровня приложения на уровень библиотеки и течь иметь хороший код.
                      Ответить
            • var p = [gf(), gf(), gf(), gf()],
                  q = [gf(), gf(), gf(), gf()];


              какое функциональное программирование )))
              Ответить
              • let p = (() => Array.from(Array(4), () => gf()))();

                Теперь точно функциональное.
                Ответить
                • я про то, что если gf вызывается восемь раз вместо одного с семью копированиями значений - там внутри явно стейт
                  Ответить
                  • function gf(init) {
                      var i, r = new Float64Array(16);
                      if(init) {
                        for(i = 0; i < init.length; ++i) {
                          r[i] = init[i];
                        }
                      }
                      return r;
                    }


                    а в JS можно скопировать моссив?
                    Ответить
                    • В «Python» можно:
                      p = [gf() for _ in range(4)]
                      Ответить
                      • На всякий случай напомню про прострел колена:
                        >>> a = [[1,2,3]] * 3
                        >>> a
                        [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
                        >>> a[1][1] = 42
                        >>> a
                        [[1, 42, 3], [1, 42, 3], [1, 42, 3]]
                        Ответить
                        • ну логично же
                          лист лежит в куче говна, а внутри других листов на него лежат ссылки

                          Вот правда, я за перл: там просто на уровне языка физически запрещено в массиве иметь что-либо кроме скаляра (то-есть или строки, или ссылки на другой массив), и сам синтаксис заставляет тебя понять, как это работает.

                          А в питоне это всё удобно спрятано, а потом люди стреляют себе в ногу
                          Ответить
                          • > ну логично же
                            Всё, что "логично" следует читать как "когда в системе 1 элемент, это логично; когда в системе N элементов, есть N! нелогичных кобенаций".
                            Ответить
                            • Отсутствие так любимой питоноблядями явности в подобных случаях — действительно багор.
                              >>> def f(x, out_list = []):
                              ...     out_list.append(x)
                              ...     return ''.join(out_list)
                              ...
                              >>> f('kakoy')
                              'kakoy'
                              >>> f(' bagor )))')
                              'kakoy bagor )))'
                              Ответить
                              • Это всё говно императивной питушни. Без ссылочной прозрачности так и придётся постоянно садиться на флешку.

                                Надо думать, где вставить явное копирование, чтобы твои данные не споганили.
                                Надо думать, где вставить ссылки, чтобы твои данные могли изменить без рассинхронизации.
                                Один раз забыл - сел на флешку.

                                Надо думать, где вставить const и как изменить всех пользователей по цепочке, чтобы код скомпилировался, и возможно ли это.
                                Нудо думать, где вставить копирование, а где - ссылки, и вообще возможно ли это, если ты убрал const.
                                Один раз забыл - сел на флешку.
                                А питушня растёт факториально кобенаторно, и думать приходится в несколько раз больше на каждом следующем шаге.
                                Ответить
                              • до сих пор охуеваю, кому в голову могу прийти вместо инициализатора аргумента реальное значение

                                в принципе, они не поленились и self пробрасывать во всех методах «объекта»
                                Ответить
                            • На самом деле нихуя не логично

                              Почему питухи вдруг какие-то типы данных стали считать ссылочными?

                              Почему класс и список не копируются, а булен копируется? (на самом деле в питоне все ссылка, но семантика именно такая)

                              Хочу язык где всё всегда копируеца по значению (включая массивы, слышите, сишники?!) и только явное указание от программиста приводит к передаче ссылки
                              Ответить
                              • > Почему питухи вдруг какие-то типы данных стали считать ссылочными?
                                Потому что какие-то типы данных нельзя эффективно скопировать. Инт можно, а список — нельзя.

                                > Почему класс и список не копируются, а булен копируется? (на самом деле в питоне все ссылка, но семантика именно такая)
                                Нет, семантика не такая. Просто в Питоне есть мутабельные ссылки (листы, дикты), а есть немутабельные (инты, строки). Поэтому передача инта от передачи листа не отличается ничем.
                                >>> def f(x):
                                ...     print(id(x) == id(42))
                                ...
                                >>> f(41), f(42)
                                False
                                True


                                > Хочу язык где всё всегда копируеца по значению
                                Питушня. Выстрел в ногу с испорченным массивом более заметен для непрофессионала, чем выстрел в то же место ноги, но с тормозами из-за копирования.
                                Ответить
                                • почему это нельзя эффективно скопировать класс из двух полей или массив из трех элементов?
                                  Ответить
                                  • Потому что это не будет* эффективной операцией на всех современных процессорах.

                                    *За исключением совсем малость количества исключений вроде джвух i32 на x64 процессоре.
                                    Ответить
                                    • А есть процессоры, где копирование гомогейного массива не есть суперэффективная операция?

                                      z80?
                                      Ответить
                                      • Если мы говорим об общем случае гомогейного массива (а не отдельных его видов, влезающих в машинное слово), то его копирование нигде не является эффективной операцией.
                                        Ответить
                                        • Почему массив из элементов, невлезающих в мышиную сливу нельзя представить как более длинный массив из более мелких элеметов, в эту сливу влазящих?

                                          или ты имееш ввиду, что всё равно будет O(N)?
                                          Ответить
                                          • > или ты имееш ввиду, что всё равно будет O(N)?
                                            Да. Поскольку математику изучают только в рашке, анскильные скриптухи про оценку сложности не слышали, просто пишут код и текут. Очень сложно будет объяснять анскильному питуху, что f(some_int) и f(some_1gb_array) — это совершенно разные (в языке с повальным копированием) вещи.
                                            Тут очень показателен подход «JavaScript», в котором, вместо объяснений скриптухам про Шлёмиэля и O(N^2), просто взяли и оптимизировали «for (x in arr) { str += x; }» до O(NlogN).
                                            Ответить
                                            • то-есть понять такие вещи может только маститая крестоблядь, которая там значок амперсанда втыкнет в сигнатуру функции с 1gb, а типичный программист в компьютерах разбираться не обязан?
                                              Ответить
                                              • Ты слишком хорошего мнения о квалификации среднестатистического программиста. Читай посты на эту тему от ДОБРОЕ ИМЯ ДОБРОЕ СЛАВА 1024-- до просветления.

                                                Кратко: да, язык должен упрощать разработку, в том числе и эффективного кода. Чем меньше нужно знать, чтобы писать эффективный код — тем язык лучше.
                                                Ответить
                                                • >меньше нужно знать
                                                  Угу, а потом нас ждут сюрпризы.

                                                  Знаешь, например, что будет если в качестве дефалтного значеия параметра в питоне указать лист, а потом в коде его потрогать?
                                                  Ответить
                                                  • Знаю, я это выше приводил.
                                                    Но причина конкретно этого багра, кстати, вовсе не в ссылках, а в том, что дефолтные параметры инициализируются один раз, на этапе «выполнения» объявления функции.

                                                    И опять же, я где-то выше писал, что лучше уж скриптух поломает голову попишет на SO про «неправильную» работу ссылок. Потому что в противном случае мы получим программы, которые у скриптуха работают, а у нас безбожно тормозят из-за O(N^2) (ещё больше, чем сейчас).
                                                    Ответить
                                • >> Хочу язык где всё всегда копируеца по значению
                                  > Питушня. Выстрел в ногу с испорченным массивом более заметен для непрофессионала, чем выстрел в то же место ноги, но с тормозами из-за копирования.
                                  Выстрел в ногу, которого можно было бы избежать - просчёт языка, поскольку
                                  > язык должен упрощать разработку

                                  Да, я согласен с тем, что
                                  > разработку, в том числе и эффективного кода. Чем меньше нужно знать, чтобы писать эффективный код — тем язык лучше.

                                  Но как по мне, лучше иметь медленный и корректный код, чем быстрый и некорректный. Тормозящей питушнёй даже можно пользоваться, а некорректную питушню можно только выкинуть.

                                  Если массив распитушился и не вызвал исключение, а также удаление пользовательской директории, то это никто не заметит. Добавят пару костыльков, чтобы исправить перезаписанные значения - и снова запустят.
                                  Даже программисты часто ловят исключения ради стабильной работы программы и игнорируют коды возврата, что уж говорить о простых людях, для которых важен эффект, а не призрачные красота, корректность и поддерживаемость кода.

                                  Даже у программистов в почёте подход "сначала реализуй логику, потом оптимизируй". В первую очередь думают о поддерживаемом коде, а потом переписывают его по-царски с битхаками, если он вызывает зуд кулера.

                                  Так и в языках для людей должен быть подход от простого и надёжного кода с копированием и GC до явно помеченных царских unsafe блоков с UB и ассемблерных вставок.
                                  Ответить
                                  • > чем выстрел в то же место ноги, но с тормозами из-за копирования.

                                    Я прочитал это как "чем если на ногу повесили гирю, и она от гири не болит как от пули". Может быть, изначальный комментарий был другой, я отвечал на придуманный мной тезис "лучше испортить массив, чем тормозить программу с неиспорченным массивом".
                                    Ответить
                                  • Не знаю, не знаю.

                                    Гуест8 топит за копирование всего и вся по-умолчанию и отказ от неявных ссылок; я указал, что для языков, ориентированных на массового потребителя, это не самый здравый подход.

                                    Но являются ли ссылки в действительности источником проблем?
                                    Ведь программист не только может испортить массив, переданный по ссылке: с тем же успехом он может не поменять тот массив, который надо — и таким образом выдать пользователю некорректные данные (реальный пример: https://govnokod.ru/26443#comment528066).
                                    А вот какой вид ошибок более распространён и вероятен — гораздо более сложный вопрос, требующий исследования. Эмпирикой тут не обойдёшься.
                                    Ответить
                                    • Если человек изучал в школе математику, то он ожидает, что
                                      int x = 0, y = 2*x;
                                      x = 1;
                                      printf("%d", y);

                                      Выведет 2.

                                      Мне кажется, императивное программирование и пошаговый интерпретатор в голове - профдеформация программушков.

                                      Да и C++-боги же вроде приходят к функциональной чистоте, т.к. обилие изменяемого состояния заставляют подвиснуть даже их могучие мозги.
                                      Ответить
                                      • Если ты хочешь свести программирование к математике — то тебе надо идти нахаскелль. Только, боюсь, программировать на языках, соответствующих математике до степени соответствия ожиданий, смогут только в рашке полтора человека на страну.
                                        Ответить
                                        • Простая математика более естественна для человека, чем императушня. Либо у тебя простые предположения y = 2*x, либо отслеживание каких-то там состояний ячейки памяти по коду.

                                          Однако, усложнённая что математика, что императушна - уже нет.
                                          Ответить
                                          • > Однако, усложнённая что математика, что императушна - уже нет.
                                            При этом усложнённая математика гораздо сложнее усложнённой императушни. Это наглядно демонстрирует, например, сравнение количества программистов на «JavaScript» и количества программистов на «Haskell».
                                            Ответить
                                            • Тут играет роль не только простота для людей, но и простота для компьютера. В XXI веке ещё находятся поехавшие, которые вместо простого "JavaScript" выбирают сложный "C++", только чтобы облегчить жизнь компьютеру.

                                              Мир подсел на императушню
                                              * Функциушня хуже ложится на выбранные идеи питушины Питуринга и питутиктуры фон Питуймана.
                                              * Простых людей больше учили и учат пирфомансной императушне.
                                              * Программистов учили и учат с упором на императушню, охват знаний функциушни часто слишком мал.

                                              Почитайте посты поехавших скриптухов. Они с удовольствием используют ФВП для массивов, начинают садиться на монады и тащат функциушню в свой скриптомирок.

                                              Функциушков пока маловато, в большой степени ещё и потому, что функциушня много раз пропускала день ног.
                                              Ответить
                                              • А есть реальный пример рахитектуры, заточенной под функциушню? Как вон раньше «лисп-машины» делали, не взлетевшие.
                                                Ответить
                                                • Я только про "лиспушины" и слышал, к сожалению.

                                                  P.S. А, ну ещё нейросети и мозгушня. Функционально бегут сигналы.

                                                  P.P.S. Тогда *HDL ещё. Функциушня как питуредство метапрограммирования.
                                                  Ответить
                                          • > y = 2 * x;
                                            assign y = 2 * x; // именно поэтому я за "verilog"
                                            Ответить
                      • Кроме шуток: в си я могу легко скопировать массив, в джаве есть arrayCopy, в скрипитушне надо изрващаца

                        petuhi = [1,2,3]
                        krestuhi = list.copy(petuhi)


                        JS
                        const a = [1,2,3];
                        const b = [...a];


                        Про Float64Array и bytearray в питоне не знаю, лоу левел питушней не занимался особо на скриптушне
                        Ответить
                        • Справедливости ради, копирование именно массивов в «Си» ничем не отличается от скриптушни:
                          memcpy(krestuhi, petuhi, sizeof(petuhi));
                          Ответить
                          • потому что массивы в сях богом обижены
                            а ты их в структуру заверни, и скопируй
                            Ответить
                            • Спасибо, помогло:
                              #include <stdio.h>
                              
                              typedef struct{int data[5];} takefive, *takefive_ptr;
                              
                              int main() {
                                int petuhi[] = {1, 2, 3, 4, 5};
                                int krestuhi[5];
                                *(takefive_ptr)&krestuhi = *(takefive_ptr)&petuhi;
                              
                                for(int i = 0; i < 5; ++i) {
                                  printf("%d, ", krestuhi[i]);
                                }
                                return 0;
                              }


                              https://ideone.com/gtrlOK

                              Просто *& не работало, «gcc» ругался: «assignment to expression with array type».

                              P.S. Я смотрел ассемблерный выхлоп. *(takefive_ptr)&krestuhi = *(takefive_ptr)&petuhi; именно копирует массив.
                              Ответить
                              • Перевёл на «C++», проверьте:
                                #include <iostream>
                                
                                template<int n>
                                struct mosiv{int data[n];};
                                
                                template<int n>
                                using mosiv_ptr = mosiv<n> *;
                                
                                
                                int main() {
                                  int petuhi[] = {1, 2, 3, 4, 5};
                                  int krestuhi[5];
                                  *(mosiv_ptr<5>)&krestuhi = *(mosiv_ptr<5>)&petuhi;
                                
                                  for(int i = 0; i < 5; ++i) {
                                    std::cout << krestuhi[i] << ", ";
                                  }
                                  return 0;
                                }


                                https://ideone.com/5SC190
                                Ответить
                                • Можно на этом сделать царское копирование динамушни
                                  while (N - i >= max_block) {
                                    *(pituz<max_block>)(&ys + i) = *(pituz<max_block>)(&xs + i);
                                    i += max_block;
                                  }
                                  switch (N-i) {
                                    case 1: *(pituz<1>)(&ys + i) = *(pituz<1>)(&xs + i); break;
                                    case 2: *(pituz<2>)(&ys + i) = *(pituz<2>)(&xs + i); break;
                                    case 3: *(pituz<3>)(&ys + i) = *(pituz<3>)(&xs + i); break;
                                    case 4: *(pituz<4>)(&ys + i) = *(pituz<4>)(&xs + i); break;
                                    case 5: *(pituz<5>)(&ys + i) = *(pituz<5>)(&xs + i); break;
                                    case 6: *(pituz<6>)(&ys + i) = *(pituz<6>)(&xs + i); break;
                                    case 7: *(pituz<7>)(&ys + i) = *(pituz<7>)(&xs + i); break;
                                    case 0: break;
                                    default: assert(0); // max_block != 8
                                  }

                                  А такой код можно легко сгенерировать скриптом для любых max_block.
                                  Ответить
                                  • Для царскости надо развернуть цикл в «устройство Даффа».
                                    Ответить
                    • ты еще попроси чтоб функция была которая память из одного места в другое копирует как есть

                      а вообще безусловно
                      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from
                      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of
                      Ответить
                  • Ни:
                    function gf(init) {
                      var i, r = new Float64Array(16);
                      if(init) {
                        for(i = 0; i < init.length; ++i) {
                          r[i] = init[i];
                        }
                      }
                      return r;
                    }
                    Ответить
                    • то есть им лень было написать new на месте или хотя бы сделать отдельную функцию fa64_16 чисто для создания массива
                      ну ладно
                      Ответить
                      • >или хотя бы сделать отдельную функцию fa64_16 чисто для создания массива

                        Опять мы приходим к тому о чём я уже говорилк удобству инициализаторов структур и массивов в сишке.
                        Ответить
                        • > удобству инициализаторов структур и массивов в сишке
                          Данные надо не только инициализировать, но и использовать.
                          // c
                          char* x = "pituz";
                          x[0] = 'l';
                          x[1] = 'i';
                          x[2] = 'n';
                          x[3] = 'u';
                          x[4] = 'x';
                          
                          // js
                          var x = "pituz";
                          x = "linux";
                          Ответить
                          • char* x = "pituz";
                            x = "linux";
                            Ответить
                            • Ещё в сишке можно идиоматично инициализировать неполный dense array.
                              int arr[] = {
                              	[0] = 2,
                              	[1] = 3,
                              	[3] = 4
                              };
                              
                              const arr=new Array(4)
                              arr[0] = 2;
                              arr[1] = 3;
                              arr[3] = 4;
                              Ответить
                            • Тьфу, я хотел сказать char[] x = "pituz";
                              Сложная сишка, два вида строк.
                              Ответить
                • p = sequence . replicate 4 . g $ ()
                  Ответить
                  • Фу, что это за старомодный кошмар!
                    А не бумер ли ты часом?!
                    Ответить
        • > 196608

          это для обратной связи с повершеллом
          https://imgur.com/j4zzglK
          Ответить
          • Если это HRESULT, то нету никакой ошибки
            >err 196608
            # as an HRESULT: Severity: SUCCESS (0), Facility: 0x19, Code 0x6608

            HResults with facility 0x19 are HTTP errors
            Ответить
            • Перевёл на «hex», проверь:
              $ err 0x30000
              # NOT FOUND: 0x30000
              Ответить
              • кстат, такая же тула есть в студии
                tools -> error lookup
                Ответить
        • > buf.write(kv[i++], p);
          Почти как мы с дяденькой ПИ предлагали.
          Ответить
      • > focuses on performance

        Золотые, бессмертные строки Царя как нельзя лучше подходят к моменту.
        Ответить
    • However, we still find ssh2-streams extremely slow compared to OpenSSH sftp transfer, so we have stopped using it.
      https://github.com/mscdex/ssh2-streams/issues/134

      хнык((((
      Ответить
      • Я первый коммент жирным выделю, потому что это хтонический пиздец:
        >>> I understand the file gets corrupted because it's a ZIP consisting of thousands of very small files, so the zip structure can be damaged easily...
        Ответить
        • да, зипом же обычно много файлов не зипуют, он первый

          там в комменте чувак пишет, что виноват сервер

          кстати, почему он не написал сервер ssh на JavaScript?
          Ответить
        • I would say that with Node10 the file size is correct with the default options but if I change the options to {concurrency: 32, chunkSize: 8192} , the file size is 37422445 instead of 37430637 (the difference is equals to chunkSize!!).

          Какое дожатие )))
          Ответить
          • >> the difference is equals to chunkSize!!

            Помнится, у Царя была какая-то проблема, когда размер файла делился на размер страницы без остатка.
            Ответить
        • Не показывайте ему директорию WinSxS, а то он умрёт от сердечного приступа.
          Ответить
        • это, блядь, лучший пост за последний месяц
          Ответить
        • Именно поэтому я за коды коррекции ошибок (не запиливать же корректный ssh).
          Ответить
      • >>> my file with size "37430637" [gost: 37 мегабат зожатия] takes nearly 3 minutes instead of some seconds
        Ко-ко-кой пирфоманс )))
        Ответить
        • это хуйня
          тут у чувака на слишком большом файле вообще всё упало
          https://github.com/mscdex/ssh2-streams/issues/94
          Ответить
          • Типично для скриптухи. Мы вот в соседнем треде про редакторы это обсуждали.
            Если бы n++ написали на ноде, он бы и мегабайта текста не вывез.

            А node-zlib честно написали: мы говно, ничего не умеем, архивчики в 128Кб, не больше.

            Note that node-zlib is only intended for small (< 128 KB) data that you already have buffered. It is not meant for input/output streams.
            Ответить
            • Саблайм писали на пистоне, вроде всё вывозит.
              Ответить
          • > Does sftp.fastPut() work better?

            блядь
            блядь
            блядь

            mysql_escape_string doesn't work, try mysql_real_escape_string
            Ответить
    • ну что я и говорил: Админ выставит mac [email protected] и putty его поймет, и openssh поймет, а эта хуита соснет болта
      https://github.com/mscdex/ssh2-streams/issues/45
      Ответить
      • >Is this issue being considered for implementation?
        >Possibly, but it's not really a priority at the moment

        В переводе: «возможно, но я анскильный лох и вообще мне похуй».
        Ответить
    • https://github.com/mscdex/node-imap/blob/master/lib/Parser.js
      Парень и за имап взялся

      Умеет ли оно SASL и TLS я не знаю, но зато протокол парсится регулярками

      RE_ENCWORD_BEGIN = /^[ \t]=\?([^?*]*?)(?:\*.*?)?\?([qb])\?(.*?)\?=/i,


      Хотя конечно текстовые простые проты типа imap, smtp и http еще можно реализовывать, все таки это не крипта, в которой дыру сделать может даже профи случайцно
      Ответить
    • // "[email protected]"
        0, 0, 0, 21,
          107, 101, 101, 112, 97, 108, 105, 118, 101, 64, 111, 112, 101, 110, 115,
          115, 104, 46, 99, 111, 109,


      золото.
      я даже специально на всякий проверил - да, это три нуль-байта, за которыми идет [email protected]
      Ответить
      • >это три нуль-байта
        А 21 зачем?
        new TextDecoder().decode(new Uint8Array([ 0, 0, 0, 21,
            107, 101, 101, 112, 97, 108, 105, 118, 101, 64, 111, 112, 101, 110, 115,
            115, 104, 46, 99, 111, 109]));

        "\u0000\u0000\u0000\[email protected]"
        Ответить
        • Не поверишь, длина строки, как в «Паскале».

          >> "[email protected]".length
          21
          Ответить
          • Спасибо, чёт сразу не догадался. 4 байта кодируют длину.
            Но зачем им e-mailы на 4 миллиарда символов? Зачем?
            Ответить
            • потому первые три пустые? макс длина 0xFFFFFFFF

              это не мейл, это экстеншен keep-alive
              собачка значит, что он проприетраный для Openssh, а не стандартизированый
              имхо
              Ответить
        • а его я проебал ( не увидел, что там на самом деле четыре непечатных символа, а не три
          Ответить
    • А куда parseB, parseF, parseG дел иродище анскильное?!

      switch (this._ptype) {
                case 49: this._handler(49, null); break;
                case 50: this._handler(50, null); break;
                case 51: this._handler(51, null); break;
                case 65: i = parseA(this, chunk, i, len); break;
                case 67: i = parseC(this, chunk, i, len); break;
                case 68: i = parseD(this, chunk, i, len); break;
                case 69: i = parseE(this, chunk, i, len); break;
                case 73: this._handler(73, null); break;
                case 75: i = parseK(this, chunk, i, len); break;
                case 78: i = parseN(this, chunk, i, len); break;
                case 82: i = parseR(this, chunk, i, len); break;
                case 83: i = parseS(this, chunk, i, len); break;
                case 84: i = parseT(this, chunk, i, len); break;
                case 90: i = parseZ(this, chunk, i, len); break;
                case 99: this._handler(99, null); break;
                case 110: this._handler(110, null); break;
                case 115: this._handler(115, null); break;
                default: var err = new Error('Unknown packet type:


      https://github.com/mscdex/pg2/blob/56049c528063548ed797a45dda6ca01fe0d409c2/lib/Protocol.js#L64
      Ответить

    Добавить комментарий