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

    +154

    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
    // Цитата №1: массив регулярных выражений из введённых пользователем строк
    var strings = what.filter(function(e){ return e.replace(/s+/g,'').length; }).map(function(e){ var re = new RegExp(e, 'g' + (ignoreCase ? 'i' : '')); return re; });
    
    // Цитата №2: проверяется наличие введённых строк в тексте и выводит результаты
    function processText(pid, cid, text){
      if(strings.every(function(re){
        return re.test(text);
      })){
      
        // совпало
        // тут выводится информация о совпадении для поста/комментария
        // кроме вывода в консоль побочных эффектов нет
        ....
        
      }
    }
    
    // Цитата №3: запуск поиска
    posts.forEach(function(post){
      processText(post.id, null, post.author.name + ' ' + post.text);
      processText(post.id, null, post.author.name + ' ' + post.description);
      post.comments.forEach(function(comment){
        processText(post.id, comment.id, comment.author.name + ' ' + comment.text);
      });
    });

    Цитаты из скрипта поиска по ГК.
    Казалось бы, write-only питушня, работает - не трогать. Но, прочитав, http://govnokod.ru/16577#comment246821, решил поискать упоминания доктора по званию. Открываю найденный пост X, а там не все упоминания найдены. Меняю список постов, в которых искать - для X меняется список найденных комментариев.
    Откуда такая питушня? processText почти чистая, strings, posts не меняется. Может, вывод на консоль как-то влияет?

    Все волосы на жопе вырвал пока нашел в чем ошибка.
    Внимание, вопрос. В чем гавно?
    (c) ursus

    Запостил: 1024--, 05 Сентября 2014

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

    • до открытия истины осталось меньше часа.

      >gcfind -i -links доктор Стертор
        * Загрузка базы данных...
        * Загрузка базы данных: 5011
      * Загрузка базы данных: 5046ms
      * http://govnokod.ru/15862#comment230543
      * http://govnokod.ru/15923#comment230981
      * http://govnokod.ru/15923#comment230999
      * http://govnokod.ru/15923#comment231046
      * http://govnokod.ru/15971#comment232447
      * http://govnokod.ru/16021#comment232697
      * http://govnokod.ru/16041#comment233354
      * http://govnokod.ru/16131#comment235063
      * http://govnokod.ru/16140#comment235317
      * http://govnokod.ru/16162#comment235842
      * http://govnokod.ru/16162#comment235957
      * http://govnokod.ru/16162#comment236015
      * http://govnokod.ru/16202#comment236960
      * http://govnokod.ru/16202#comment237028
      * http://govnokod.ru/16202#comment237038
      * http://govnokod.ru/16255#comment238682
      * http://govnokod.ru/16298#comment239291
      * http://govnokod.ru/16418#comment241779
      * http://govnokod.ru/16443#comment241787
      * http://govnokod.ru/16527#comment244142
      * Поиск: 306ms
      Ответить
      • На самом деле, ответ здесь известен. Для #15923 нашлись все варианты, т.е. это был вывод исправленного скрипта. Кто хочет подумать - не открывайте спойлер.


        Причина: UmVnRXhwLmxhc3RJbmRleA==
        Ответить
    • Строки в регулярки как-то подозрительно конвертятся...
      Ответить
      • Если Вы про отсутствие фильтрации и возможность ввести регулярку вместо строки, то это скорее фича.
        А здешнюю строку №2 можно отдельным постом выкладывать, это да...
        Ответить
        • да, она страшна.

          var re = new RegExp(e, 'g' + (ignoreCase ? 'i' : '')); return re;

          почему не просто

          return new RegExp(e, 'g' + (ignoreCase ? 'i' : ''));

          ?
          да еще и в каждой функции проверяешь условие, которое известно глобально
          Ответить
          • > почему не просто
            А кто знает... Может, там раньше что-то побольше было (и я неправильно исправил), может я о чём-то другом думал, пока писал.

            > да еще и в каждой функции проверяешь условие, которое известно глобально
            Говнецо. Но на перфоманс не влияет.
            А вот тут, вероятно, критичное место:
            if(strings.every(function(re){
                return re.test(text);
              }))

            Т.к. выполняется оно для каждого из 200+К комментариев.
            А с другой стороны, всё это считается за 300мс по сравнению с 5с загрузки JSON и расстановки связей и запускается крайне редко.
            Вот за эти 5с надо будет побороться, т.к. модуль загрузки используется почти всеми скриптами.
            Ответить
            • > 200+K
              Блин, их так мало?!
              Ответить
              • http://govnokod.ru/16651#comment246943
                У меня 237569 распарсено.
                Ответить
                • Мда, я идиот. Не додумался посмотреть в этом месте.
                  Ответить
              • Удвоим выработку! Пятилетку за три года! Создадим социалистическому государству больше комментариев к годовщине Октября!
                Ответить
                • Наш Советский Союз покоряет
                  Весь мир, от Европы к Неве, на восто-ок,
                  Над землёой везде будут петь:
                  «Столица, водка, советский медведь наш!»
                  Ответить
                  • >Над землёой везде
                    Лучше бота делай, вместо постинга редалертовской шизофазии.
                    Ответить
                    • да тут кто то C&C RA3 неосилятор
                      Ответить
                      • > вместо постинга редалертовской шизофазии.
                        Кегги, вы глупеете прямо на глазах.
                        Ответить
                        • И то верно. Прежде чем отвечать нужно подождать время отведенное на редактирование
                          Ответить
    • Недавно обновил данные (внизу http://gvforum.ru/viewtopic.php?pid=1839#p1839) и обнаружил, что хорошие, существующие посты, содержат чужую пометку об удалении (post.id != post.deleted.id)
      for(var id in tmpposts){
        var tmppost = tmpposts[id];
        var dInfo; // информация об удалении
        
        if(tmppost.error){
          dInfo = new DeleteInfo(id, tmppost.updated, tmppost.updated, tmppost.error);
          // <...>
          continue; // установили информацию об удалении и свалили
        }
        
        if(tmppost.deleted){
          dInfo = new DeleteInfo(id, tmppost.updated, tmppost.deleted.date, tmppost.deleted.error);
          // <...>
         if(!tmppost.uid){
            excludedPosts[id] = dInfo;
            continue;
          }
        } // установили информацию об удалении и свалили, если пост ничего не известно
          // и не свалили, если пост был скачан, а позже выпилен
        
        // <...>
        var post = posts[id] = new Post(postInfo, tmppost.id2,
          tmppost.updated, chapter, tmppost.descr, dInfo); // НЯ!
          // следующие посты, хоть и не были удалены, получат
          // информацию об удалении :)
          // <...>
      }
      Ответить

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