1. Си / Говнокод #12708

    +102

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    if (sscanf(buf, "%d-%d-%d %d:%d:%d %d.%d.%d.%d %s %d.%d.%d.%d %llu %llu %llu %llu %d %d %d",
               &r->year,&r->month,&r->day,&r->hour,&t5,&t6,&s1,&s2,&s3,&s4,&r->iface,&d1,&d2,&d3,&d4,
               &r->packets_out,&r->bytes_out,&r->packets_in,&r->bytes_in,&r->proto,&r->sport,&r->dport)<22) {
        printf("Syntax error at line %u\n", t->count + 1);
        /* ... some cleanup ...*/
        return 0;
    }

    Вот так я читал строку из текстового файла в моем первом боевом проекте.

    Запостил: bormand, 08 Марта 2013

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

    • Неплохо)
      Регулярки - тоже вариант.
      Ответить
    • Я тоже так умею
      const char FMT[] = "%08lx-%04hx-%04hx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx";
      // ...
      int res = std::sscanf(src, FMT,
                                &_data1, &_data2, &_data3,
                                &_data4[0], &_data4[1],
                                &_data4[2], &_data4[3],
                                &_data4[4], &_data4[5],
                                &_data4[6], &_data4[7]);
          if (res != 11) {
              throw std::runtime_error("Input string is not in correct format");
          }
      Парсим GUID
      Ответить
      • Роман, как дела с альтернативным говнокодиком?
        Ответить
        • А он ещё кому-то нужен? :)
          А по сути... Идей много, времени мало. Я даже почти допилил чатик-мод для борманда, чтобы новые сообщения в треде всплывали сбоку и встраивались в страничку в реалтайме.
          Кстати, @rat4vier в проекте больше не заинтересован, а одному пилить как-то грустно...
          Ответить
          • Грустно. Хотя, just as planned.
            Лень заморила на корню множество хороших начинаний.
            Ответить
            • Линус, когда писал Линукс, столкнулся с таким моментом, когда его основной на тот момент с осью Миникс, был попорчен. Перед ним как бы встал вызов - снова поставить Миникс, или же довести Линукс до уровня повседневного использования...
              Так к чему я это... а, вот в очередной раз, когда уютненький, скажем, ляжет, надо завалиться всем на ГК2.0 (всё время теряю ссылку на него, надо забукмарчить), и всё чего не хватает пилить на ходу в ходе общения.
              Ответить
              • Ну, тогда можешь пока подучивать Scala
                Ответить
                • Да, это узкое место...
                  Ответить
                  • А если взять Node.js, сколько народу изъявит желание попилить годнокодик на жабоскриптах?
                    Ответить
                    • Имхо код на ноде смотрится как нечитаемая лапша из function'ов. Ну по крайней мере по примерам у меня такое впечатление, серьезный софт на ней не изучал, может быть там получше.
                      Ответить
                    • Честно говоря, не думаю, что JS - удачный выбор. Лучше уж тогда на PHP - хотя бы хоститься будет проще.

                      Я хотел поучаствовать в разработке того, что сейчас написано на Scala, но когда я открыл код, я быстро понял, что решения задачек для projecteuler недостаточно для освоения этого языка. Во всяком случае Lift мне кажется существенно сложнее того же Play.

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

                      Может быть целесообразно устроить голосование на предмет того, на чем писать и кто готов присоединиться?
                      Ответить
                      • Да, надо бы централизовать, если уж на то пойдёт. А что, не устроить ли нам грошовый банчик набежать ли нам снова на piratepad, господа?
                        Ответить
                        • Лучше обычный опрос на предмет выбора ЯП и степени участия каждого проголосовавшего.
                          Ответить
                          • Что ж, линкуйте.
                            Ответить
                            • Создал опрос, вынес в отдельный потс: http://govnokod.ru/12721
                              Ответить
                          • только fastcgi, только хардкор
                            лол нахер апач вообще нужен, http сервер нетрудно написать и самому
                            Ответить
                            • Ну что. Пишем гк 2.0 на крестахъ?
                              Ответить
                              • С брейнфак-API, для удобства.
                                Ответить
                              • Да, это же очевидно. ГК 1.0 написан на PHP(3217), ГК 2.0 должен быть написан на C++ (1152), а ГК 3.0 в далёком будущем наши потомки напишут на C#.
                                В принципе, мелкософт вроде продвигал идею облачных приложений на с++. Возьмём boost.asio и вперёд!
                                Ответить
                      • В Lift есть особая прелесть, он как кухонный комбайн, умеет всё.
                        Но вот кривая обучения похлеще, чем у Emacs. Но вещь крайне годная.
                        Ответить
                        • Как раз высокий порог вхождения и будет основным препятствием для участия в проекте для большинства потенциальных разработчиков.

                          P.S. Emacs мне кажется гораздо проще, чем Vim
                          Ответить
                          • > P.S. Emacs мне кажется гораздо проще, чем Vim

                            Это субъективно, но мне, к примеру, очень тяжело запоминать стандартные биндинги в Emacs. Я работаю с ним 3,5 года, и до сих пор не могу запомнить биндинги для работы с прямоугольными областями. А в виме руки сами всё делают даже ночью с бодуна, хоть я его гораздо меньше использую.
                            Ответить
                            • У вима хоткеи интуитивней и ортогональней чем в большинстве редакторов. Например знаю как удалить символ и как перейти к концу слова - я уже могу удалить слово целиком.

                              А в емаксе для каждого такого действия нужно задрачивать зубодробительные комбы. Ну хотя фанатам mortal combat и tekken наверное не привыкать ;)
                              Ответить
                              • В Emacs тоже есть своя логика, и в отсутствии необходимости переключаться между режимами есть своя прелесть, но как эргономичный трансформатор текста vim рвёт всех.
                                Ответить
                              • >нужно задрачивать зубодробительные комбы
                                >Ну хотя фанатам mortal combat и tekken наверное не привыкать
                                Думаю Бетховен был бы чемпионом и гуру.
                                Пианино кажется мне посложнее джойстика и клавы. Плюс там важна не только память на сочетания, но еще паузы и ритм.
                                Ответить
                                • Барабанщики гораздо координированнее пианистов. А насчёт пианино - у Рахманинова были партии, которые он писал чисто для себя, больше тогда никто так не мог сыграть. Так вот там для одной руки аккорды по семь клавиш, лол.
                                  Ответить
                                  • на клавиатуре хоткеи будешь палочками и карданом зажимать, координированный?

                                    у рахманинова растяжка была на терцдециму, но это не значит, что его аккорды в 7 нот и на 3 октавы надо играть в один заход ;)

                                    сколько барабанщиков нужно чтобы вкрутить лампочку?
                                    Ответить
                                    • > на клавиатуре хоткеи будешь палочками и карданом зажимать
                                      Специальная клава для барабанщиков. С достаточно крупными клавишами, по которым можно лупить палочками.
                                      Ответить
                                    • > го аккорды в 7 нот и на 3 октавы надо играть в один заход
                                      У него гармония сложная обычно, вполне возможно, что он большим пальцем секунды брал...
                                      Ответить
                                      • 2 @roman-kashitsyn:
                                        Об этом я и говорил.
                                        Ответить
                                      • несложная арифметика
                                        пальцев 5
                                        большим пальцем секунда +1
                                        =6
                                        это большим пальцем надо брать сразу 3, что ерунда
                                        ну или ладонью плашмя, из той же категории

                                        очевидно легенды про 7 нот в аккорде берутся из, например:
                                        https://dl.dropbox.com/u/4275844/rach-6k.png
                                        на картинке можно увидеть партитуры для правой и левой руки, никакой дабл-рахманинов не возьмет эти аккорды по 6 нот одновременно
                                        Ответить
                                • Лист и Рихтер тоже были бы в теме.
                                  Любой музыкальный инструмент сложнее клавы на порядоки. Ибо там головой нужно много думать, ритм держать, над звуком работать, голоса соединять...
                                  Ответить
                                  • Не любой. Калимба, например, не говоря уже о каком-нибудь бубне или маракасах.
                                    Ответить
                                    • >не говоря уже о каком-нибудь бубне
                                      ЛолШто?
                                      Бубен используют уже тогда, когда клавиатура бессильна.
                                      Ответить
                                      • http://youtu.be/f6zK_uysQSA?t=1m13s
                                        Ответить
                                        • >только что
                                          >http://youtu.be/f6zK_uysQSA?t=1m13
                                          >только что
                                          >http://www.youtube.com/watch?v=f6zK_uysQSA
                                          Праведный Страйкер! Хайвмайнд на говнокоде!
                                          Ответить
                                    • > не говоря уже о каком-нибудь бубне
                                      Что?
                                      http://www.youtube.com/watch?v=f6zK_uysQSA
                                      Ответить
                                  • >Любой музыкальный инструмент сложнее клавы на порядки.
                                    Верно.
                                    >Лист и Рихтер тоже были бы в теме
                                    Я только хотел сказать, будь жив сейчас Бетховен - был бы чемпионом по Мортал Комбату или какой-другой задротской игре.
                                    Ответить
                    • Не берите Ноде.ЖС :) это не для того, чтобы делать сайты. Вам нужен немощный и тормозной аппликешн сервер который все равно нужно будет ставить за Апач / Енджиеникс, только который с ними работать, вобщем не умеет? Весь смысл использования ПХП / рельсов / Джанго в том, что можно обойтись только НТТР сервером и пристроить сарайчик к нему. Если уже решаться на подвиг и запускать отдельной сервер приложений, то выбор жабоскрипта в качестве языка, мягко говоря странный.
                      Знаю не по наслыше, а от фаната, который все хочет наш проект перевести на Монгодб и Ноде.ЖС, и так больно на это смотреть...
                      Ответить
                      • Не хочу вас огорчать, но практически все неигрушечные проекты, что я видел, стоят за nginx как за реверсивным прокси, apach напрямую не так часто используется.
                        К node.js особой тяги не испытываю, разве что шумихи вокруг него много было, вот и спросил.
                        Ответить
                        • Так а я что говорю? Нет смысла использовать его как отдельных НТТР сервер, а в качестве сервера приложений - он просто игрушечный / беспомощный. Его можно, как, например, питоновский http использовать: для интранета, где безопасность и надежность не имеют значения.
                          Ответить
                          • >для интранета, где безопасность и надежность не имеют значения.
                            Вот так и нас внутренние веб-приложения написаны: дырявые, тормозят и падают.
                            Ответить
              • Почти бесполезно. Никто не даст гарантий, что новое будет лучше старого. Лучше уж олдфажить здесь.
                К тому же, начинания одного-единственного человека (ленивого человека - знаю по себе) приводят обычно ко вселенской тоске.
                Ответить
                • Не должно быть сразу лучше. Должно быть open source и постоянно допиливаться.
                  Ответить
      • > Я тоже так умею

        да это почти классика самого примитивного парсинга строк.

        может и не поверите, но жабщики и шарпщики (по крайней мере в моей конторе) завидуют.

        > const char FMT[] = "...

        зачем!!!!???
        Ответить
        • > > const char FMT[] = "...
          > зачем!!!!???

          Так я ещё и форматирую обратно в строку тем же форматом.
          Ответить
          • Он спрашивает зачем копировать строковой литерал, если вы его не меняете?
            То есть конструкция const char FMT[] = "..."; весьма бессмысленна. В то время как char FMT[] = "...";, char* FMT = "..."; и модификации последнего с const имеют смысл.
            Ответить
            • > char FMT[] = "..."
              Имеет смысл только если символы действительно будут менять. Или если сишная функция требует char* и нет гарантий того, что она ничего не правит.

              > char* FMT = "..."
              Нехороший прием. В сишке можно юзать разве что для совместимости со старым кодом, в котором не писали const, но есть гарантия того, что функция не будет модифицировать строку. В крестах - вообще никогда.

              > const char *FMT = "..."
              Все ок.
              Ответить
              • Соласен, так char* FMT; ещё имеет смысл, а вот так char* FMT="..."; уже нет.
                Ответить
            • Ну, не совсем бессмысленна. Так размер строки известен на этапе компиляции. В данном конкретном месте это не требуется и сделано на автомате: у меня десяток тест-сьюит, в которых мне удобнее знать размер (константных) тестовых данных на этапе компиляции.
              Поправлю на досуге на
              const char * const FMT = "...";
              Ответить
              • > const char * const FMT = "...";
                Нужно больше констов.
                Ответить
                • const const const is too const?
                  Ответить
                • Следит за const-корректностью. Правельный пацан. Хоть я и не помню почти ни одной ошибки, что обнаружил бы посредством const.
                  Ответить
                • typedef const char Char;
                  typedef char* pchar;
                  typedef Char* pChar;
                  typedef const pchar Pchar;
                  typedef const pChar PChar;
                  
                  PChar FMT = "...";
                  Ответить
              • Кстати в одинадцатых крестах можно вот так делать:
                constexpr const char *s = "dasds";
                constexpr int conststrlen(const char *s) {
                    return s[0] ? conststrlen(s+1) + 1 : 0;
                }
                А до этого да, только через шаблончик и const char FMT[] = "..." ;(
                Ответить
                • А sizeof для char[]?
                  P.s. Или тут копирование?
                  Ответить
                • а имея два фломастера, можно разрисовать вообще всё!
                  http://liveworkspace.org/code/LiJzg$0
                  Ответить
                  • > constexpr const char * const
                    const на conste и constom погоняет.
                    Ответить
                    • Кстати я тупанул: вместо constexpr const char *s достаточно было написать const char * const s.
                      Ответить
              • >Так размер строки известен на этапе компиляции.
                Вот блин кресты. Ты или знаешь размер строки на этапе компиляции и копируешь строку без нужды или не знаешь и считаешь вручную в рантайме если нужно и не копируешь.
                Ответить
                • > Ты или знаешь размер строки на этапе компиляции и копируешь строку без нужды или не знаешь и считаешь вручную в рантайме если нужно и не копируешь.
                  Или знаешь длину на этапе компиляции, не копируешь, но нужны 11 кресты ради constexpr ;)

                  Кстати const char FMT[] = "" и char FMT[] = "" в глобалках не должны вызывать задвоений и оверхеда. Сам литерал же нигде не используется, и любой достаточно умный компилятор выкинет его. А массив будет заполнен на этапе компиляции и помещен в секцию инициализированных данных. А вот если описать его локально - действительно будет копирование.
                  Ответить
                  • Он у меня в анонимном нэймспейсе объявлен, я тоже думал, что компилятор оптимизирует, но не проверял, ибо пофиг.
                    Ответить

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