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

    +158

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    this.startAdLoading = function(callback) {
    this.adCallback = callback;
    
    Array.prototype.remove = function(from, to) {
      var rest = this.slice((to || from) + 1 || this.length);
      this.length = from < 0 ? this.length + from : from;
      return this.push.apply(this, rest);
    };
    ...
    }

    Очень полезный метод добавили массивам. Все тот же источник.

    Запостил: wvxvw, 12 Августа 2013

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

    • if (this.bCombinedAd) {
      // remove any single overlays
      var nLen = this.requestsSequence.length;
      for (i = 0; i < nLen; i++) {
        for (var j = 0; j < this.requestsSequence.length; j++) {			
          if (this.requestsSequence[j].adPosition == 'overlay') {
        	// found so remove
        	this.requestsSequence.remove(j);
        	break;
          }
        }
      }

      Ох, слона то я и не заметил. Это использование вышеприведенного метода.
      Ответить
    • slice знает а splice не знает? Но это ещё ладно... А что по мнению автора логические or там делают? Или в JS всё bitwise? Да даже если побитовое - всё равно ведь хрень получается, а не позиция...
      Ответить
      • Тут еще фишка в том где они решили добавить эту функцию:
        загрузи рекламу и получи бонус-функцию в прототипе массива!
        Прям как в лоттерее.

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

        а || б => а если а == ложь иначе б. Т.е. если параметр to не передали, то использовать from.

        Но такие выкрутасы явно не соответствуют уровню окружающего кода, предполагаю, что автор не смог правильно сформулировать запрос к гуглу и выловил какой-то результат, который сам не понял, а использовал, как получилось.
        Ответить
        • http://ejohn.org/blog/javascript-array-remove/


          О, нашел источник вдохновения. Надо сказать, что на стопке-переборе варианты тоже не ахти, там предлагают восновном в цикле splice() вызывать.
          Ответить
          • > предлагают восновном в цикле splice()
            Так и тянутся руки пропущенный пробел вставить:)
            А как ещё? Я бы в зависимости от ожидаемого размера массива и количества вырезанных элементов тоже либо сплайсом резал бы по 1, либо делал отдельный массив из того, что должно остаться. Разве что цикл был бы один.
            Ответить
            • На ГК не хватает тега "дубликат". ТарасБ где-то давал ссылку с объяснением как удалять элементы из динамических и неизменяемых массивов с подробностями.
              Ответить
              • Нет, ну можно под конкретную ситуацию (удалять множество одиночных элементов) написать руками функцию с увеличивающимся сдвигом влево... Но не уверен что это будет быстрее нативной функции, если удалять всего 1-2 элемента из сотни.
                Ещё вариант придумывается с Array.filter(), но тут точно хреновая идея из-за колбэка на каждый элемент. А что ещё?
                Ответить
                • function arrayRemove(array, element) {
                      for (var result = [], i = 0, j = 0; i < array.length; i++)
                          if (array[i] != element) result[j++] = array[i];
                      return result;
                  }
                  
                  function arrayRemoveInPlace(array, element) {
                      for (var i = 0, j = 0; i < array.length; i++)
                          if (array[i] != element) array[j++] = array[i];
                      array.length = j;
                      return array;
                  }

                  Да простит меня Тарас, ссылку не нашел.
                  Ответить
                  • Это не отличается от того, что я предлагал выше. Первый вариант - копия массива, второй - сдвиг влево.
                    Второй ещё надо проверить (лень сейчас :) ) будет ли он реально быстрее сплайса - обычно скриптовая реализация проигрывает нативным функциям, даже при чуть меньшей сложности.
                    Ответить
                    • splice будет копировать пловину массива при каждом вызове. Хотя, конечно в ж.скрипте нет массивов, а вместо них гибрид хеш-таблицы с массивом, но тем не менее, обычные реализации такие, что если заполненые индексы начинаются с нуля и занимают непрерывный диапазон индексов, то это таки да будет массив, и splice таки да должен будет выделить память по-новой.
                      В случае выше память выделяется гарантировано всего один раз.
                      Ответить
                      • Потестил в хроме. Из 100000-элементного массива убрать 2 (взял индексы 20000 и 70000):
                        сплайсом 1 мс + 408 Кб
                        копированием элементов справа (вашу реализацию взял) 45 мс + 3,6 Мб.
                        Ответить
                        • jsperf is your friend
                          Ответить
                        • Ну да, а теперь удалите 5000 элементов из 10000 массива... какой-то странный тест.
                          Ответить
                        • http://jsperf.com/slice-remove-inplace
                          Мда... ну это только говорит о том, насколько сам по себе ж.скрипт херово реализован, т.как более правильный алгоритм не может работать достаточно хорошо по сравнению с говноалгоритмом только потому, что говноалгоритм использует вызовы штатных функций...
                          Ответить
                          • >потому что говноалгоритм использует вызовы штатных функций.
                            Вот потому и живут аномальные на первый взгляд вещи, типа тримов регулярками.
                            Ответить
                            • ...на говноязыках вроде lua, где кроме регулярок ничего нет, даже битовых операций. Это была реклама питона.
                              Ответить
                              • Вот, кстати, чего никогда не мог понять: нафига в ж.скрипте битовая арифметика? И еще под нее отвели специальные операторы. Т.е. очень короткие названия функций которые просто запомнить и быстро набирать.
                                Ну вот кому нафиг нужен ~? Я просто ни разу не видел случая требовавшего применения. В то же время в практически любой программе на ж.скрипте нужно делать замены в строках. Почему бы не использовать что-то типа "строка" ~ /регулярка/? Было бы в 100 раз удобнее. Ксор? - тоже офигенно полезная функция, да и вообще, все они, особенно в виду того, что все числа - флоаты...
                                Ответить
                                • Почта такая популярная была, lavabit, которая криптовала письма на стороне клиента, чтобы даже почтовый сервер не мог видеть содержимое. Так что криптоалгоритмы (следовательно, и битовые операции) на жабоскрыпте не такой уж и нонсенс...
                                  Ответить
                                  • Сравните как часто нужны криптография на ж.скрипте, и как часто нужно делать замены в строках. Я думаю, что примерно 1 к 1000000 получится.
                                    Все ту же криптографию можно сделать и обычной математикой, а особенно принимая во внимание тормозную сущность ж.скрипта / отстутсвие типов данных необходимых для криптографии - от того, что есть эти функции, что нету их - ничего не зависит.
                                    Ответить
                                    • > Все ту же криптографию можно сделать и обычной математикой
                                      Ага, нук запилите мне xor или not обычной математикой. Только чур без цикла. А то оно и так то лагает как говно, а побитовым циклом будет лагать минимум в 60 раз больше ;)
                                      Ответить
                                      • И че? Перечитайте внимательно первую строчку моего предыдущего ответа.
                                        1. Никому не нужно.
                                        2. Даже если нужно, то не из чего.
                                        3. Даже если делать из того, что есть, то циклы в ксоре - будет самой меньшей проблемой. Всю длинную математику нужно будет далать на строках, от того, что там цикл в ксоре будет вообще ничего не изменится.
                                        Ответить
                                    • >отстутсвие типов данных необходимых для криптографии
                                      Для криптографии "типы данных" важны только там, где нужен определенный размер регистра - это или циклический сдвиг, или сложение с переполнением (реализуется через один if).
                                      Ответить
                                      • В ж.скрипте нету целых чисел, о каких регистрах и сдвигах дальше говорить?
                                        Ответить
                                        • > В ж.скрипте нету целых чисел
                                          Нету, но тем не менее 32 бита целой части они вполне обеспечивают. Иначе вся эта порнокриптография тупо не работала бы.
                                          Ответить
                                          • Делаем xor-таблицу на 256 элементов для джвух 4-х битных чисел.
                                            И по 4 бита применяем к 64-разрядному. Ах забыл, без циклов? Тогда анроллинг.
                                            Ответить
                                            • > И по 4 бита применяем
                                              Эндов, оров и сдвигов то тоже нет в драфте жабоскрипта от wvxvw ;) Разбивать делением, клеить умножением? :)
                                              Ответить
                                              • >Эндов и оров то нет ;)
                                                Бля ;) Но массивы же есть?
                                                Вот будем складывать в импровизированную шестнадцатеричную систему.

                                                Короче что и требовалось доказать - полная жопа, когда нет битовых операций...
                                                Ответить
                                                • > Но массивы же есть?
                                                  Есть. Короче тогда хранить переменные в строках в хекс виде. А массивы для операций описывать примерно так:
                                                  xor_table = {
                                                      '00': '0',
                                                      ...
                                                      'FF': '0'
                                                  };
                                                  c = c + xor_table[a[i] + b[i]]
                                                  Ответить
                                                  • Ну можно таким макаром описать все арифметические действия, эффективная арифметика на длинных числах так и работает (ну помимо таблиц), только там основания 2^32 и выше.
                                                    Хотя вот с аппендом строк сомнительно. Может так

                                                    xor_table = {
                                                    '0':{ '0':'0', .... 'F':'F'}
                                                    ...
                                                    'F':{ '0':'F',....'F':'0'}
                                                    };
                                                    Ответить
                                                    • > Хотя вот со строками сомнительно. Может так
                                                      Вполне.
                                                      Ответить
                                              • >Эндов, оров и сдвигов то нет
                                                Что вы несете-то?
                                                http://crypto-js.googlecode.com/svn/branches/4.x/src/sha1.js
                                                Ответить
                                                • > Что вы несете-то?
                                                  Это не мы несем. Это wvxvw несет вот тут:
                                                  http://govnokod.ru/13597#comment191527

                                                  И вот тут: "все ту же криптографию можно сделать и обычной математикой".
                                                  Ответить
                                                  • Где я сказал, что нет? Я сказал, и уже раза три повоторился, что они никому не нужны, но тем не менее занимают полезные короткие имена.
                                                    Ответить
                                                    • > Я сказал, и уже раза три повоторился, что они никому не нужны, но тем не менее занимают полезные короткие имена.
                                                      Ну это я понял. И счел эту фразу призывающей к их удалению ;)
                                                      Ответить
                                        • Как нету? Ну значит есть плавающие с достаточной точностью (32 бита), чтобы через них все это эмулировать.
                                          Ответить
                                          • > с достаточной точностью (32 бита),
                                            64 наверное все-таки. В 32 битный флоат 32 битное целое не влезет.
                                            Ответить
                                  • а что даст клиентское шифрование без серверного? mitma
                                    Ответить
                                    • > а что даст клиентское шифрование без серверного?
                                      От MITM'а хватило бы банального HTTPS. А шифрование на клиенте как бы убирает излишнее доверие к серверу - никто кроме отправителя и получателя не знает, что именно было в сообщениях, даже сервер, через которых их передали.

                                      Но мы то знаем, что сервер может подсунуть кривой жабаскрипт, который сольет сообщение куда надо ;)
                                      Ответить
                                      • > сервер может подсунуть кривой жабаскрипт
                                        исходники же все равно доступны, пусть даже если обфусцированы
                                        Ответить
                                        • > исходники же все равно доступны, пусть даже если обфусцированы
                                          Т.е. я каждый раз, перед тем как туда что-то ввести должен перечитывать исходники? :)

                                          Одно дело, когда я собрал на своей машине клиента из исходников. В этом случае я уверен, что в нем ничего не поменяется (если, конечно, мою машину не поимели), и могу спокойно юзать его до следующего обновления.

                                          Совсем другое дело, когда исходник берется с сервера и этот сервер может в любой момент подсунуть мне новую версию...

                                          P.S. Паранойя она такая ;)
                                          Ответить
                                          • >>Т.е. я каждый раз, перед тем как туда что-то ввести должен перечитывать исходники? :)

                                            Это кстати очень большая проблема (Столлман и об этом предупреждал). Потому ненавижу автообновляющийся софт.

                                            Видится такой радикальный выход - ты апррувишь скрипт, и браузер юзает копию из кеша как 304.

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

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

                                              P.S. Может быть есть уже какой-нибудь PGPFox?
                                              Ответить
                                          • Сохранить страницу локально и проверить единожды? =)
                                            Ответить
                                      • > От MITM'а хватило бы банального HTTPS
                                        Это если сертификаты правильно настроены, не самодельные и ещё какие-то оговорки.
                                        Ответить
                                        • > Это если сертификаты правильно настроены
                                          Ну да. Но без HTTPS все это "шифрование в браузере" никакого смысла не имеет. Активным MITM'ом присунут переделанный скрипт да и все. А во всяких халявных вайфаях и интернет-кафе активный MITM устроить совсем несложно.

                                          P.S. Кстати самодельные и самоподписанные тоже можно юзать, с оговорками. Только придется один разок по побочному каналу сверить отпечатки. Например по телефону позвонить владельцу сервера.
                                          Ответить
                                        • Попытаюсь немного подвести итоги:

                                          0) Шифрование на сервере без HTTPS. Любой пассивный наблюдатель на канале видит сообщения. Админ сервера втихомолку сливает всю переписку PRISM'е.

                                          1) Шифрование на сервере с HTTPS. Пассивные наблюдатели в обломе, админ продолжает читать переписку. Активный MITM может попытаться подсунуть свой сертификат.

                                          2) Веб-шифровалка без HTTPS. Активный MITM или админ сервера (если он рисковый парень, или его кто-то прижал к стенке) могут присунуть свой скрипт. Пассивные наблюдатели в обломе.

                                          3) Веб-шифровалка с HTTPS. Аналогично предыдущему, но активный MITM не может подсунуть скрипт, не подсунув свой сертификат.

                                          4) "Толстый" клиент не имеющий ничего общего с браузером, аля PGP. Подвержен только терморектальному криптоанализу ;)

                                          P.S. Здесь не рассматривается способ получения публичного ключа получателя. Это совсем другая история ;) Машины отправителя и получателя считаются не скомпрометированными.

                                          P.P.S. Все что я хотел этим сказать - то, что юзать вебсервис для передачи конфиденциальной инфы можно только в случае необъяснимого доверия и любви к админу сервиса ;) Чего истинный параноик, которому действительно нужно передавать конфиденциальную инфу, себе никогда не позволит. И то, что веб-криптовалки без HTTPS это всего лишь иллюзия безопасности.
                                          Ответить
                                          • >P.P.S. Все что я хотел этим сказать - то, что юзать вебсервис для передачи конфиденциальной инфы можно только в случае необъяснимого доверия и любви к админу сервиса ;)
                                            Это именно так, т.к. каждый раз не полезешь проверять, что за js на самом деле выполняется в браузере. Поэтому, идея js crypto, по большому счету - хуйня.
                                            Ответить
                                          • > могут присунуть свой скрипт
                                            В моей практике был случай по поводу локального говнофорума. На вбуллетине клиентский код делал md5 от пароля, пароль "жертвы" был хитрый, просто так не сбрутфорсить. В итоге было предложено соломоново решение - по идшнику пользователя форум отдавал модифицированную версию скрипта, который не делал ничего.
                                            В тираж не пошло, поскольку нашёлся другой путь. Никто бы и не заметил подмены.
                                            Ответить
                                            • > который не делал ничего
                                              Ну да, в том то и суть, что скрипт может быть изменен очень хитрым образом, который в случае обнаружения можно списать на банальную ошибку/опечатку.

                                              Например, если не хочется палиться, можно немного попортить генератор простых чисел. Скажем, чтобы он вместо 2^256 вариантов выдавал всего 2^32. На глаз это заметить практически невозможно, а ключи, сгенеренные таким алгоритмом подбираются за считанные часы вместо дохреналионов лет ;)
                                              Ответить
                                • Подумай, почему javascript так называется.
                                  Ответить
                                  • > Подумай, почему javascript так называется.
                                    Емнип, всего лишь потому, что тогда java было модным словом, и авторы решили поюзать его в названии своего скрипта ;)
                                    Ответить
                                    • И содрали с нее бОльшую часть синкаксиса.
                                      Ответить
                                    • > Емнип, всего лишь потому, что тогда java было модным словом, и авторы решили поюзать его в названии своего скрипта ;)
                                      вначале он был LiveScript
                                      Ответить
                                  • В Яве их полезность тоже сомнительна. Никто бы не умер (а скорее всего даже бы и не заметил), если бы их всех переделали в какой-нибудь Boole.xor(), Boole.shr(), Boole.comp() и т.д. а, например, использовали ^, >>, ~ и т.д. для более полезных вещей, в Яве дофигища бойлерплейта который таким образом можно было бы сократить.
                                    Копировали тупо с Си, там где действительно много работы с памятью / эти операции часто бывают нужны. В языках, которые предназначены для прикалачивания кнопок к формам делать специальные короткие имена со специальным синтаксисом для таких операций - просто бред.
                                    Ответить
                                    • Ты в курсе, что int в яве - примитивный тип? И ничего бы ты не сократил, потому что один хрен в яве нельзя переопределять операторы.

                                      Почему никто не вспомнит классику - почему в яве == для обьектов сравнивает ссылки (операция в подавляющем большинстве случаев нахуй не нужная), а равенство обьектов вызывается по .equals()? Почему бы не сделать наоборот, как в питоне?
                                      Ответить
                                      • > Почему бы не сделать наоборот, как в питоне?
                                        Синтаксический сахар, транслирующий a == b в a.equals(b)?

                                        Х.з. на самом деле, надо авторов жабы спросить :) Скорее всего не стали делать по той же причине, по которой не перегружаются операторы - предсказуемость их работы. В яве всегда понятно, как работает каждый оператор. и программист на это никак не может повлиять. А тут == бы работало по-разному в зависимости от типов.
                                        Ответить
                                        • Так сделать бы оператор, который сравнивал бы ссылки, как is в питоне. Логика простая - то, что чаще используется, должно быть проще.
                                          Ответить
                                        • >>>Почему никто не вспомнит классику - почему в яве == для обьектов сравнивает ссылки

                                          Да там вообще всё говёно и перегруженное сравнение не спасет. Я уже где-то писал про длинный пост, про ==,=== и eq. И судя по тому как сделан equals, == мог бы стать NPE-опасным.
                                          Ответить
                                      • Да нет... ну вот как сделали встроенный в язык макрос для foreach с использованием :, точно так же можно было, например, использовать ^ так, как оно используется в Смолтоке. Можно было бы использовать эти значки, чтобы не писать паблик / приват и т.д. Можно найти много полезных применений, та же метадата, или хотя бы вместо throws в определении функций. Профит был бы ощутимым.
                                        Ответить
                                        • > вместо throws в определении функций
                                          Слово throws такое длинное? :) Имхо там список исключений занимает намноооого больше, чем это throws.

                                          Причем даже мне, как крестовику со стажем, extends и implements нравятся больше, чем сишное двоеточие перед предками класса.

                                          > чтобы не писать паблик / приват
                                          Ну оно только в описании членов мешает. А метод он и без того длинный, чтобы public/private занимали пренебрежимо малую его часть.

                                          > как оно используется в Смолтоке
                                          return что-ли?
                                          Ответить
                                          • Длина списка - проблема программиста который его таким длинным сделал, а вот сократить встроенный синтаксис - это уже программисту не под силу, поэтому я и говорю про ключевые слова / часто встречающиеся операции. throws, extends, implements, public и т.д. - все хорошие кандидаты.

                                            >return что-ли?
                                            Ну, практически, там это обозначает возвращаемое значение.
                                            Ответить
                                            • > поэтому я и говорю про ключевые слова / часто встречающиеся операции. throws, extends, implements, public и т.д. - все хорошие кандидаты.

                                              Ага. Давайте заменим if на =>, while на |<= и получим очередной аналог J, в котором черт ногу сломит :)

                                              Наэкономится на этом, на самом деле, не так и много. Ну вот сколько у вас в функции return'ов, даже если вы не сектант-одноретурнопоклонник? А implements и extends вообще 1 раз на класс. static'ов в кошерном коде не так много, чтобы задумываться об этом коротком слове.

                                              public, private и т.п. да, еще имело бы смысл. Например паблик +, приват -.
                                              Ответить
                                              • А с чем вы сравниваете? Ну возьмите произвольный большой проект на Яве и grep 'public' и сравните с grep '~', как думаете, чего больше окажется?
                                                Получится J? А чем плохо? У него вполне логичный и простой синтаксис. Простой в смысле количества синтаксических правил / возможностей интерпретации одной и той же фразы. Я более чем уверен, что если взять непредвзятых подопытных недопрограммистов, и дать одному выучить J, а другому, например, C, то уровень понимания языка приобретенный за одно и то же время у первого будет гораздо выше.
                                                Ответить
                                                • > grep 'public' и сравните с grep '~', как думаете, чего больше окажется
                                                  Естественно пабликов. Но сколько процентов кода занимают эти паблики? Мне кажется, что не более 5, если конечно код - не тупой враппер или сгенеренный эклипсом класс с пачкой полей и геттерами-сеттерами для них. Замерять лень.

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

                                                  > например, C
                                                  А что в синтаксисе си такого сложного? Ну кроме долбанутого описания указателей на функции, и незнания приоритетов, которое вполне парируется скобками. Все подводные камни си и крестов они дальше, на уровне семантики.
                                                  Ответить
                                                  • Сложного? В нем больше сущностей, больше правил, больше неопределенности. Просто у читателей есть предвзятое мнение сформированное методически использованием похожих грамматик. Т.е. с детсва люди учились записывать математические формулы неудачным способом, составлять выражения в языке на котором думают - тоже неудачным способом. Просто потому что так сложилась человеческая культура.
                                                    И на момент знакомства у знакомящихся было больше багажа знаний, которые лучше подходили под более сложную грамматику. Так и получилось, что изначально использовать ее было легче.
                                                    Ну и тут можно двояко оценить ситуацию: можно подходить с позиций, что а если не пытаться улучшить, или развить, то более эффективным решением будет задействовать имеющиеся знания / предыдущий опыт. Но если развивать, то более сложная грамматика - это плохая база, потому что сложности в ней не обладают большей выразительностью.
                                                    Есть много куда более выразительных и одновременно простых языков, но тем не менее в силу привычки изучающим тяжело их освоить не потому что они объективно тяжелые, а потому, что для того, чтобы добиться этой самой выразительности или универсальности авторам нужно было пожертвовать традициями.
                                                    Ответить
                                                • > уровень понимания языка приобретенный за одно и то же время у первого будет гораздо выше
                                                  Другой вопрос - пригодится ли ему потом это понимание J где-нибудь, если он не математик...
                                                  Ответить
                                          • >как крестовику со стажем, extends и implements нравятся больше, чем сишное двоеточие перед предками класса.

                                            А по мне наоборот вот много где крестосимволы неочевидны, а двоеточие при наследовании как раз няшное.

                                            Но раздражает, сцуко, другое - непоследовательность. Ну если так любите всё делать словами - так сделайте уж, And, Xor и Or. Там 10 символов не жалко, а тут 2 зажали.
                                            Ответить
                                            • > так сделайте уж, And, Xor и Or.
                                              Кстати в крестах они есть и словами ;)
                                              Ответить
                              • >Это была реклама питона.
                                Там всё: и нативное, и самописное, работает одинаково тормознуто?
                                Ответить
                                • К чему бы это?

                                  Нативное работает быстро, а нативного достаточно (криптография, распаковка gzip, парсеры xml, json). В lua, если с этим придется столкнуться, проще повеситься, т.к. бинарные операции на динамических языках медленнее на порядки. Вот в wireshakr поддержки питона под виндой какого-то хуя нету, есть только lua, в котором даже oop через жопу.
                                  Ответить
                                  • >нативное
                                    Имелось ввиду библиотечное.
                                    А если совсем уж нативное, то бишь сишное, то как тогда с портируемостью?
                                    Ответить
                                    • Так это сишное библиотечное и есть, искаропки :)
                                      Ответить
                                      • Есть джва типа библиотечного: на чистом питоне и сишное.

                                        Из коробки, но не в песочнице.
                                        Lua (да и практически любой другой язык) умеет вызывать нативный код. В итоге сравниваем языки, а нативные реализации.

                                        Вот в жабе нативного мало, gzip, парсеры итп - написаны на самом языке. И в итоге они сольют питонским. Это не мешает подключить мне JNI.
                                        Ответить
                                        • Все, что я написал - сишное, т.к. с распространением питоновксих модулей проблем нет. Вот оно там искаропки, а в луа его нет, а как распространять под все платформы - хуй его знает.
                                          Ответить
                                          • > а как распространять под все платформы - хуй его знает.

                                            Тут противоречие. Если zlib есть под данную платформу, то lua тоже может его использовать (не из коробки).
                                            Если же нет, то и питону оно не светит.
                                            Вот в чем загвоздка.

                                            Тут вопрос даже не распространенности, а принципа. Я не говорю что это плохо, но сишные ноги торчат.
                                            Ответить
                                            • Да-да, только пока фитонщики распространяют скрипты, луашникам нужно будет вместе с ними распространять библиотеки под все возможные платформы (винда, где нет компилятора и любят бинари; юнипсы, где не любят бинари; embedded, где вообще нихера нет) с обертками к ним (питоновские либы-то эксепты кидают вместо сегфолтов :)). Удобство несравнимое.

                                              Да и само по себе, там, где у меня в питоне есть os.path или urlparse, в lua будут пользоваться регекспами, которые читаются, как говно.

                                              Сишные ноги торчат у всех динамических языков, т.е. это уже срач статика vs динамика будет :)

                                              Мне лично эти ноги очень мешают. Зная яву, я могу понять почти 100% программ на яве. Зная питон, мне рано или поздно придется или учить сишку, или зависеть от сишников, а в опенсорсе нет ничего хуже, чем зависеть от человека, который тебе ничего не должен.

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

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

                                                  И да, Штульман - красноглазый ебанат с мозолетоксикозом. Вся вендовраждебная хуйня идет от него, трухвальц сравнительно адекватен. И в этом отношении прыщеблядки сами виноваты, пропагандируя вендекапец. Зарекомендовали себя как ебанаты? Теперь не плачьте.

                                                  Может, это два разных опенсорса - один допиленный до юзабельного уровня, второй - ебаный пиздец? :)
                                                  Ответить
                                                  • Да всё так. Но тут палка в джвух концах. С одной стороны ты можешь бравировать: ололо питон быстрее вашей жабы. И оно не тупит безбожно на zipах и прочих часто встречающихся задачах. А с другой enjoy your C.

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

                                                    >Вся вендовраждебная хуйня идет от него
                                                    Будто это что-то плохое.
                                                    Да и всегда оказывается что он был прав, поскольку основывается на логике. Просто в России с тем фактом что винду никто не покупает разница - невелика. А насчет утечек личных данных большинству похер. Сноуден, сноуден - это и так все знали. Посрались и успокоились - никто ж свои акки на фейсбуках с гуглами не стал тереть. И айфоны никто не выбрасывает. А между тем Столлман давно говорил за это.
                                                    Торвальдс вот проебал тивоизацию с GPL 2.
                                                    Ответить
                                                    • Опенсорс, управляемый людьми, которые тебе ничего не должны, гораздо лучше, чем закрытое говно, управляемое людьми, которым ты вечно что-то должен. Первый хотя бы можно поглядеть и допилить.
                                                      Ответить
                                                      • roman-kashitsyn, ты забыл сказать - в принципе можно. А на самом деле все может упереться в сишку, в неадекватность авторов, которые не могут хер знает сколько добавить патч или же порог вхождения в это прыщговно в 100 раз больше, чем затраты на фикс. Или прыщеговно писано какими-то школьникам-полуебками. Или формально это опинсорс, но фактически авторы сделают все, что угодно, чтобы сделать пользование патчем проблематичным. Или, два года после финальной версии плагина внезапно ломают api по какой-то абсолютно ебанутой внутренней причине - швабодка же, от ответственности. Все это риски, которые выявляются уже после того, как ты на это говно подписался.

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

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

                                                          Ну а сишку знать нужно любому уважающему себя программисту. Не так уж она и страшна, есть в ней что-то притягательное.
                                                          Ответить
                                                        • > швабодка же, от ответственности.
                                                          У проприетарщиков аналогичный отказ от ответственности ты подписываешь соглашаясь с эулой ;) Ну хотя да, согласен, они реже портят API и т.п., чтобы не подмочить себе репутацию.
                                                          Ответить
                                                          • @bormand там по крайней мере никто не разводит пропаганду о "за нефиг делать все взять и изменить". И API они документируют чаще и портят гораздо реже, т.к. нету "а нахуй нужна документация, если есть исходники, а если мы апи поменяем - так разрабы все бросят и побегут читать исходники и его фиксить, и нам похуй, что проект может быть уже 5 лет как заброшен".
                                                            Ответить
                                                    • >ололо питон быстрее вашей жабы.
                                                      Это только, если питон используется как интерфейс управления каким-то сишным модулем и больше ничего на нем не делают.

                                                      >Практическая (должно работать быстро) часть видимо взяла гору над религиозной (всё на питоне).
                                                      Лол, ты наверно питон никогда не видел. Работа с двоичными данными на чистом питоне (парсеры, битовые операции), если не найдется сишной функции, сразу просаживает скорость в разы. Так что альтернативы какбэ не было. PyPy не запускал.

                                                      То есть это здорово разбавляет радость от питона. Может быть, меня обманули, когда учили питону и не учили C. А может быть, надо заниматься тем, где сишные потроха знать не надо, скажем, веб девелопментом, и не ебать себе мозги?
                                                      Ответить
                                                      • >PyPy
                                                        Ещё Cython попробуй.
                                                        Ответить
                                                        • Cython есть транслятор из полупитона в си и кагбе подразумевает наличие компилятора си.
                                                          Ответить
                                                          • > подразумевает наличие компилятора си
                                                            Ну это ведь уже не так страшно, как написание кода на самом си? :) Правда питон в цитоне насколько помню сильно уж кастрированный.
                                                            Ответить
                                                            • Дык проблема именно с распространением. А так иногда проще написать на си, чем на цитоне. Сишка по крайней мере популярнее. Да и пользоваться цытоном можно, только просматривая код, который он генерирует.
                                                              Ответить
                                                    • Самый безопасный компьютер - который стоит в сейфе, выключенный из сети. Только за эту безопасность никто платить не будет. Нет особых проблем сохранить свою приватность, не создавая себе аккаунтов в социальных сетях, как Штульман, который даже js не пользуется. Только такой путь нужен немногим.
                                                      Логика "js может за мной следить - давай-ка я от него откажусь" уёбашна. Это как лечить насморк отрубанием головы - чтобы предложить, много ума не надо, и ясно, что никто этим пользоваться не будет.

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

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

                                                        Поэтому Сноуден - плохой пример. На его опыте ты большинство не убедишь. А тех, кого можно в чем-то убедить на примере Сноудена убедждать ни в чем не надо, они сами прекрасно понимают ситуацию ;)

                                                        Чтобы влиять на большинство нужен человек, похожий на них. И ситуация, более-менее напоминающая их поведение в сети. Например какая-нибудь Маша из Нижнего Тагила, которая выложила во вконтакте свой телефон, и этим воспользовались злоумышленники, сняв деньги с ее банковского счета.
                                                        Ответить
                                                        • Нет, скрывать инфу стоит всегда, когда ее не требуют с подписью прокурора. Это включает в себя и спецслужбы. Почему так? - потому, что такое действующее законодательство.
                                                          Ответить
                                                          • > Нет, скрывать инфу стоит всегда, когда ее не требуют с подписью прокурора
                                                            Что это тотальное скрытие инфы даст обычному человеку кроме неудобств? Представьте, что я представитель того самого большинства и объясните мне ;)

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

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

                                                            Поэтому большинству людей на эту ситуацию с "прослушкой" (особенно американской) насрать с высокой башни ;)
                                                            Ответить
                                                            • На разведку СШП большинству посрать, но мы говорим АНБ - подразумеваем всех от местных спецслужб до работодателя, если выходим в инет с работы. А в рашке спецслужбы занимаются крышеванием, за один пост в адрес ментов можно получить условку итд. Так что хороший повод переходить к шифрованию и приватности по умолчанию.
                                                              Ответить
                                                          • Т.е. если задать вопрос по-другому: кто будет виноват в случае если вы выдали вашу информацию сотруднику спец. служб (да или не важно кому, хоть дворнику из соседнего подъезда) без соответствующего вердикта - сам себе злой буратина. И в случае возникновения конфликтов суд не станет вас защищать.
                                                            Ответить
                                                            • > И в случае возникновения конфликтов суд не станет вас защищать.
                                                              А стал бы он, если бы я был тотальным анонимусом, и никогда никуда этой инфой не светил? :) Как раз это навело бы еще больше подозрений.

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

                                                                "Сегодня я ебал пони".
                                                                "Сегодня взорвали магазин, было весело! Фото во вложении".
                                                                "Пойдем свергнем Пу?"

                                                                Что-то в таком духе? :)
                                                                Ответить
                                                                • Даст или не даст - это уже не важно, так работает законодательство. Конкретно вы можете поступать как хотите, но в общем случае должно быть именно так. У милицонера нет никаких легальных преимуществ перед, скажем, дворником, или васей из соседней квартиры в плане получения личной информации.

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

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

                                                                        P.S. Разговор ушел немного в другую тему, но я всего лишь хочу сказать о том, что глупо думать, что народ будет задумываться о конфиденциальности глядя на пример Сноудена. Народу нужно показывать пример того самого Васи. Которого посадили из-за записи о нем в контакте. Такая новость действительно поднимет волну в народе. А Сноуден? А что Сноуден. Он с обывателем имеет мало общего, поговорят немного да забудут.
                                                                        Ответить
                                                                        • Ну в Европе шум подняли серьезный по теме шпионажа АНБ, а там уже чуть-чуть - и можно начать обсуждать местные спецслужбы / ментов. Главное - создать шум.
                                                                          Ответить
                                                                        • >Народу нужно показывать пример того самого Васи. Которого посадили из-за записи о нем в контакте.

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

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

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

                                                            P.S. Ну естественно, есть вероятность, что какой-нибудь Миша-мент окажется кем-то имеющим доступ к моей инфе, и поюзает ее в своих грязных целях ;)
                                                            Ответить
                      • > в ж.скрипте нет массивов, а вместо них гибрид хеш-таблицы с массивом
                        А зачем это сделано?
                        Ответить
                        • Чтобы не усложнять новичкам жизнь. Ошибки связанные с выходом за пределы массива - очень частое явление, ну и динамическими массивами объективно проще пользоваться с минимальным набором комманд.
                          Кроме того, это позволяет, например, сделать: array.length = 100500, и не потратить память при этом.
                          Но это делает их тормозными / традиционный подход для работы с массивмаи часто оказывается непригодным.

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

                            Надо развиваться в другую сторону - использовать структуры c меньшей алгоритмической сложностью, те же rope.

                            Практически во всех ЯВУ языках массивы оборачивают более высокими абстракциями.
                            Ответить
                            • > rope
                              Ничего про их балансировку (Чтоб от log n не уходили к n) никогда не слышал.
                              Ответить
                          • > array.length = 100500, и не потратить память при этом
                            А потом, емнип, на этой хуйне не работают foreach и map :)
                            Ответить
                            • На array foreach вроде бы вообще не работает.
                              Ответить
                              • Да работает. Просто очень неинтуитивно. Хотя казалось бы, а над чем еще работать foreach, кроме как над массивом? Ну не бегать же им в конце-концов по свойствам/методам объекта...

                                Но в жс всегда все кверху жопой ;( И foreach неюзабелен чуть менее чем полностью. А ради обхода городят всякие костыли типа _.each() в underscore.
                                Ответить
                                • foreach, который неинтуитивно работает над массивом/списком - это, конечно, жопа :)
                                  Ответить
                                  • В питоне, пыхе, жабе, да даже крестах есть способ адекватного обхода мапы - чтобы ключ и значение или только значение возвращались парой, без бесполезных лукапов.

                                    В жабаскрипте - увы, foreach изначально ущербен. Он возвращает только ключи, а значения потом приходится выдирать из "массива" самому. В итоге алгоритмы обходящие "массив" хоть и остаются в теории O(n) (если верить, что там хорошая хешмапа, и считать что у нее O(1) на выборке), но константа-то растет... тормозят то они больше...

                                    А трабла с обходом массива, емнип, заключается в том, что форич оббежит не только элементы массива, но и унаследованную херню из прототипа. Куда очень любят добавлять свои методы всякие либы.

                                    И вот так куда не копни в жс - везде костыли и сомнительные ходы проектировщика. Хуже крестов, честное слово ;(
                                    Ответить
                                    • есть метод forEach у объектов. Объекты(Object) через прототипы даже конченные дебилы не расширяют
                                      Ответить
                                  • Там еще бОльшая лажа.
                                    'a' in {'a':1,'b':2,'c':3}
                                    проверяет вхождение элемента в структуру
                                    for (a in ['a','b','c']) //цикл for each
                                    for (;'a' in {'a':1,'b':2,'c':3};) //тоже цикл
                                    while ('a' in {'a':1,'b':2}) //while each :)

                                    >>Хуже крестов, честное слово ;(
                                    Ну уж нет. Он минималистичен. Там правил во всем языке меньше чем контрисключений из исключений из правил в крестах.
                                    Ответить
                          • >Ошибки связанные с выходом за пределы массива - очень частое явление

                            А что там сделано? Создаются элементы за пределом, если вышло?
                            Ответить
                            • Ну хешмапа же обычная. На get'е возвращает undefined если нету элемента с нужным индексом, на set'е вставляет новый, если такого не было.
                              Ответить
              • >На ГК не хватает тега "дубликат"
                Да на ГК много чего не хватает. Как-то обходимся.
                Ответить
        • > Ну там как бы как раз единственное место, где нормально.
          Ну вопрос был больше про "что делает || ?" Я привык видеть на выхлопе этих операторов true/false (ну или 1/0, соответствующие константам TRUE/FALSE).
          Насколько понял из вашей реакции, || - не совсем logic or. Он возвращает либо false, либо то, что посчитал не-false? Так понятнее.

          ...Собственно, чего я спрашиваю, консоль же под рукой. :) Поэкспериментировал - || и && возвращают то значение, которое последним "посмотрели". Удобно, наверное... Но как-то руки не поворачиваются такое писать. :) Может просто с непривычки, какая-то логика в этом есть...
          Ответить
          • Зато можно писать вот такой говнокод ;)
            var b = a < 2 && 5 || a > 3 && 6 || 7
            Ответить
          • В питоне оно себя, кстати, так же ведет. a and b and c возвращает первый элемент с __bool__() = False или последний элемент, с or - то же самое с True
            Ответить

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