1. C++ / Говнокод #13208

    +16

    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
    // Lock the write mutex, to provide consistency of data                                                                                            
    #define LOCK                                                                   \                                                                   
        if (_ugb) {                                                                \                                                                   
            if (pthread_mutex_lock(&_write_mutex) == EINVAL)                       \                                                                   
                ASSERT(0);                                                         \                                                                   
        }                                                                                                                                              
    // Unlock write mutex when data sent                                                                                                               
    #define UNLOCK                                                                 \                                                                   
        if (_ugb) {                                                                \                                                                   
            if (pthread_mutex_unlock(&_write_mutex) == EINVAL)                     \                                                                   
                ASSERT(0);                                                         \                                                                   
        } 
    
    // Пример использования
    
    void socket::add_var(uint16_t code, const void *buffer, uint32_t length)                                                                          
    {                                                                                                                                                  
        LOCK
        try                                                                                                                                       
        {                                                                                                                                              
            DEBUG_I(Vblock, "Sending code 0x%X of size 0x%X\n", code, length);                                                                         
            send(&code, sizeof(code));                                                                                                                 
            send(&length, sizeof(length));                                                                                                             
            send(buffer, length);                                                                                                                      
        }                                                                                                                                              
        catch (const error & ve)                                                                                                                       
        {                                                                                                                                              
            UNLOCK                                                                                                                                     
            DEBUG_E(Vblock, "Caught an exception!\n");                                                                                                 
            throw;                                                                                                                                     
        }                                                                                                                                              
        catch (...)                                                                                                                                    
        {                                                                                                                                              
            UNLOCK                                                                                                                                     
        }                                                                                                                                              
        UNLOCK                                                                                                                                         
    }

    OK_BOOST_LOCK_A_MUTEX

    Запостил: roman-kashitsyn, 21 Июня 2013

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

    • Мне одному в глаза бросился двойной UNLOCK?
      Ответить
    • показать все, что скрытоЯ так понимаю это сокеты, а зачем тут нужны локи? В чём смысл?
      Ответить
      • Поясняю для людей, не отягощённых написанием реального кода: смысл в том, что этот сокет по пока непонятным мне причинам делают разделяемым между нескольких потоков. Чтобы не поломать состояние внутренних буферов, нужны мутексы.
        Ответить
        • да ну? сокеты имеют внутреннюю синхронизация и вообще могут использоваться для синхронизации
          Ответить
          • Это же не системный сокет. Тут свой буфер на запись есть, выделяемый через new.
            Ответить
            • питред не умеет в синхронизацию и приходится синхронизировать его вручную?
              Ответить
            • анскильный питредшок
              золотой гребешок
              маслена головка
              шелкова бородка
              Ответить
              • Что тут по твоему должен синхронизировать питредок? Работу со смещениями неведомых ему буферов?
                Я ещё не до конца вкурил назначение этого поделия в 2000 строк, наверняка тут ещё пара килограмм архитектурного говна.
                Ответить
              • Ух ты. А я раньше не замечал пенисуального контекста в этой детской сказке про петушка
                Ответить
              • Еще один долбоеб.
                Ответить
        • Поясняю для питушков, которые ничего не знают о перфомансе и устростве системы:

          Реально? Сокет? man socket.

          Питушня думает, что сокет в сотне нитей будет работать быстре, чем в одной? Не смеши мои тапки анскилябра. Читаешь сокет - фигачешь запросы в пулы - пулы исполняешь в воркерах. Шарят сокет только питухи, да и ведро умеет свои шарящиеся сокеты, которые работают лучше твоей анскильно питушни.


          lock_free - юзай хардварную атомарщину.
          Ответить
          • > мои тапки анскилябра

            Обычно у Вас царс^Wбольшие проблемы со знаками препинания, но здесь, на удивление, все правильно.
            Ответить
          • > твоей анскильно питушни
            Специально для тебя транслирую в пи-код:
            Лол, не я написал эту питушню. Привыкай, в реальном мире тебе редко придётся чинить свои царские высеры. Питушня много чего думает, разгребать поделия всегда приходится более квалифицированным людям. И ежу понятно, что быстрее и проще разгрызать протокол в отдельном потоке и складывать готовые команды в шуструю очередь, чем устраивать танцы с локами.
            Ответить
    • питушиный раии нужен только анскильным питухам
      Ответить
    • нарушу правила, пооффтоплю
      завела меня судьбинушка кривой дорогой к жабе зеленой
      нужен совет по литературе, типа "как стать дерзким и успешным за одну луну"
      Ответить
      • Вот это ничего себе поворот. Жаба большая, всё сильно зависит от задач, которые нужно решать. Думаю, для начала "Thinking in Java" Эккеля можно полистать: http://mindview.net/Books/TIJ4

        Честно говоря, Эккеля не читал, но отзывы уж больно хорошие. Моей первой книгой был Шилдт/Ноутон, потом Core Java Хорстмана в двух томах. Обе книжки весьма объёмные и, честно говоря, так себе.
        Если это не мимолётное увлечение земноводными, крайне рекомендую Effective Java Блоха. Мне она понравилась даже больше Effective C++ Майерса.

        Ну и в утешение могу сказать, что ты не одинок:
        http://stackoverflow.com/questions/595491/best-way-to-learn-java-for-someone-with-a-solid-c-background-books-etc


        Если будут конкретные вопросы по языку или инструментам, попробуем ответить. Если не хочется флудить тут, могу дать свой контакт, консультации бесплатно :)
        Ответить
        • спасибо, подро скачал :)
          Ответить
          • ну и для тех, кому некогда читать по 1000 страниц:
            http://refcardz.dzone.com/refcardz/core-java например
            Ответить
            • мля, супер убогая регистрация на сайте, не смог пройти этот квест
              может есть где скачать бесплатно без смс?
              Ответить
              • http://cdn.dzone.com/sites/all/files/refcardz/rc024-corejava_online.pdf

                а вообще ща себе на дропбокс подборку закину
                https://www.dropbox.com/sh/zifnfl9eienn75d/J6Qd5YPCL-
                Ответить
                • спасибо
                  разве это всё что надо настоящему индейцу? :)
                  Ответить
                  • Ну, если интересует многопоточность, можно полистать "java concurrency in practice".

                    Еще где-то тут проскакивал годный FAQ по шаблонам дженерикам. http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

                    P.S. А вообще я без образования жавоёба ;( Учился основам на J2ME, пилении клиента Haven & Hearth и ведроиде методом тыка, чтения джавадоков и какой-то матери. Вышеперечисленные книжки читал уже только в районе ведроида... Поэтому мне слишком верить не стоит.
                    Ответить
                    • думаю, пока до сложностей типа женериков или перформанс дело дойдет, я уже TiJ всю прочитаю
                      пока что мне нужны базовые знания, в обезьянем стиле, т.к. JavaEE во все поля
                      а многопоточностью будет заниматься томкат в меру своих ынтырпрайзных сил
                      Ответить
                      • Баланс крестоносцев в природе: при обращении одного жаболюба в крестоносца один крестоносец должен стать жаболюбом.

                        Как нелёгкая занесла от программирования термоядерных реакторов к возне с контейнерами сервлетов?
                        Ответить
                        • каких реакторов, господь с тобой :)
                          всё было гораздо приземлённей, в буквальном смысле этого слова :)

                          зовут управлять всем производством разработки в одной конторе, а там сейчас насущный прожект - на джаве допиливать в рамках проприетарной системы
                          как я смогу им заниматься, если не буду про джаву ничего знать
                          Ответить
                      • > а многопоточностью будет заниматься томкат в меру своих ынтырпрайзных сил
                        Дикий кот - это просто бажная копия httpd, фальшивый ынтрырпрайз. Стеклянная рыба - это настоящий ынтырпрайз. В Яве ынтырпрайзность определяется гигабайтами памяти которые сервер должен зохавать, чтобы запуститься. Дикий код слабоват еще.
                        Еще есть такой показатель ынтырпрайзности: количество Виндовз-шелл файлов в дистрибутиве Явовского сервера, если меньше сотни - это ложный ынтырпрайз, не нужно такой брать.
                        Ответить
                        • Если я не туплю, нормально написанный сервлет взлетит и на коте и на рыбе? Поэтому степень энтерпрайзности можно регулировать ;)
                          Ответить
                          • Если под взлетом имеется в виду рейтинг в $ top. То взлетит, куда же он денется...
                            Ответить
                            • У вас сервер на DDR2, раз такие комплексы по поводу пожираемой памяти?
                              Ответить
                              • Нет, я бы лучше в память ценные данные клал, чем надцать реализаций ХМЛ-парсера. Данных все равно больше чем памяти.
                                Ответить
                                • > надцать реализаций ХМЛ-парсера
                                  Либо пишете проект нормально, чтобы все модули в нем требовали одну версию парсера - и тогда будет загружена только одна.

                                  Либо радуетесь, что это хотя бы работает, несмотря на разношерстность.

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

                                  Я это испытал на своей жопе, когда старый кусок сайта баговал на старом пёрле, а новый - на новом. И поверьте, я бы тогда отдал эти сраные 100-200 метров, чтобы побыстрее запустить новый код, а потом в спокойной обстановке убрать косяки в старом...
                                  Ответить
                                  • > Либо пишете проект нормально, чтобы все модули в нем требовали одну версию парсера
                                    Мне такие просто не попадались, но я никогда не задавался целью найти. Чтобы писать проект нормально, нужно не использовать библиотеки третьих лиц. А без этих библиотек - Ява можно заменить чем угодно, и в любом случае с выгодой для себя.
                                    Ответить
                                    • > Чтобы писать проект нормально, нужно не использовать библиотеки третьих лиц
                                      Ну дык вам дали возможность хоть как-то юзать эти разношерстные библиотеки... тут радоваться надо, а не память жалеть... В тех же пыхе или перле это вообще не взлетит, если не прикручивать костыли для side-by-side запуска, которые точно так же сожрут память.

                                      Да те часы, пока вы будете переписывать все сами, или админ будет подбирать модули, на которых взлетят все куски проекта, или кто-то будет фиксить одни куски, чтобы они взлетали на библиотеках, используемых другими обойдутся намного дороже, нежели сраные несколько тысяч за ёбаную 16 гиговую планку памяти...
                                      Ответить
                                      • Помню, redmine поднимал рублёный... По сравнению с развёртыванием RoR, жаба с её WAR-архивами - просто сказка.
                                        Ответить
                                        • > Помню, redmine поднимал рублёный..
                                          Не напоминайте... Я тоже поднимал redmine с плагином для git. Это был настоящий ад...

                                          В руби, кстати, с совместимостью либ, судя по этому опыту вообще тяжко. Если бы не было тулза, позволяющая запускать каждую прогу/сайт в своем окружении со своим набором либ, было бы вообще неюзабельно.
                                          Ответить
                                          • Вообще возгласы "ruby - это просто" - полный булшит. Решил недавно попробовать. Разумеется, последнюю версию. Пришлось скачать кучу ненужных вещей. И ладно бы оно заработало, но ведь нет, надо накатить руками патч на SSL, пересобрать руби, и вообще заниматься какой-то хренью.

                                            Да и язычок так себе, ничего особо примечательного, куча сахара. Хотел поиграться с RoR, но так и забил по причине оверинжиниринга и магии.
                                            Ответить
                                • А что, парсер сам по себе, без данных дохуя прям таки жрет?
                                  Ответить
                          • tomcat это самый ништяк. Всё остальное - оплывшие жиром Джаббы со свистелками и перделками. Та же Jira, к примеру, прекрасно летает на томкате.

                            C WebSphere тоже приходилось работать: надёжный и стабильный, но шибко мудрёный и порой жутко тормозной. К JBoss у меня предубеждение, ибо он у меня ассоциируется с первым опытом JSF, которого я терпеть не могу, но с последними его версиями работать не приходилось. Говорят, юзабельно.

                            Сервлеты на томкате прекрасно взлетают, в основном там отсутствует всякая ынтерпрайзная шелуха JSR*.
                            Ответить
                            • По-моему, мы тут как раз не спорим: стеклянная рыба - это просто, извините за выражение мрачный пиздец любого сисадмина. Терабайты неуправляемой неведомой хуйни занимающей всю доступную память и место на жестком диске так, что даже просто терминал на том же компутере перестает реагировать на команды.
                              Единственное что, при выборе tomcat <-> httpd выбирать кота - глупо особенно для настоящих боевых задачь, а не для каких-то корпоративных спредшитов, которые никто больше одного раза в месяц не открывает. У этого сервера такой длинный послужной список уязвимостей, что только IIS может его обогнать, да и то не факт.
                              Ответить
                              • > при выборе tomcat <-> httpd

                                Когда это httpd научился сервлеты выполнять? Да и для боевых задач tomcat вполне годится: linkedin.com, например, на нём крутится. Ну и используется он в основном через реверс-прокси, ему особого ума и не надо.
                                Ответить
                                • > Когда это httpd научился сервлеты выполнять?
                                  Это, видимо, wvxvw тонко намекает на ненужность жабы в вебе ;)
                                  Ответить
                                • Именно по-этому у линктин полгода назад увели базу пользователей со всей информацией?
                                  Сервлет можно запустить локально, на каком-нибудь сервере закрытом от внешнего мира, сидящим за проксей httpd - это и будет луцшим решением. Особенно если сервер запускающий сервлет вообще в принципе, никогда не будет общаться по HTTP.
                                  Ответить
                                  • > Особенно если сервер запускающий сервлет вообще в принципе, никогда не будет общаться по HTTP.
                                    Ну собственно юзать кота в качестве фронтенда тут никто и не предлагал. И как это поможет в борьбе с пожиранием памяти, описанным вами выше?

                                    > сидящим за проксей httpd
                                    Тогда уж nginx. Он как балансировщик, имхо, получше.

                                    > Именно по-этому у линктин полгода назад увели базу пользователей со всей информацией?
                                    99%, что ошибка была в прикладном коде или мозгах человека протерявшего свой пароль, а не в HTTP демоне. Можно ссылку с подробностями взлома?
                                    Ответить
                                    • http://en.wikipedia.org/wiki/2012_LinkedIn_hack

                                      Я знаю не более, чем то, что тут написано. У меня там тоже акк есть, но мне как-то все равно, своруют его или нет :)
                                      Ответить
                                      • > http://en.wikipedia.org/wiki/2012_LinkedIn_hack
                                        Ну здесь про подробности взлома только одна фраза Internet-security experts said that the data breach had occurred because of the failure to use HyperText Transfer Protocol - Secure (or HTTPS). А судя по ней они просто не юзали HTTPS для аутентификации, и хеши паролей сперли пассивным прослушиваним или подменой DNS. А тут HTTP сервер вообще не при делах.
                                        Ответить
                                  • Врядли пароли увели из-за томката. Виновато наверняка чьё-то рас*****йство.

                                    > Сервлет можно запустить локально
                                    Так все и делают обычно, нафига его в качестве фронтэнда выставлять. nginx с балансировкой наружу, токаты в приватной сети без прямого доступа.

                                    ИМХО в RoR, обычно работающем в passenger под божественным httpd, уязвимостей в мильон раз больше нашли.
                                    Ответить
                                    • О как, ответили одновременно и почти одинаково ;)
                                      Ответить
                                    • Что до пользователей, то я не знаю, как все было на самом деле, но можно предположить, что в том же фейсбуке распиздяйства не меньше, и что вообще, с точки зрения максэнтропи, его должно быть более-менее одинаково в любом месте, о котором мы ничего не знаем :)
                                      Что до nginx - а они уже починили фишку с кукис? Долгое время отказывались. Смысл был в том, что если передавались кукис больше, чем предписывает стандарт, nginx падал. Т.е. не игнорировал, а просто завершал работу в аварийном режиме.
                                      Что интересно, Ханчентут долгое время считался самым надежным сервером. На нем (по слухам) рабоал НАСДАК и еще какие-то важные финансовые учреждения. Я случайно нахожусь в группе рассылки Ханчентута, и вижу как со временем любые альтернативы httpd превратились в кустарщину. У httpd просто на порядок больше тестов и реальной практики, и это ничем не заменить. Если вы сейчас спросите у разработчиков Ханчентута о надежности этого сервера, они просто скорее всего мечтательно улыбнутся...
                                      Кроме этого, мне как-то попадалось исследование о кеш-иньекциях какой-то то ли австралийской то ли польской девушки. Очень основательное, в котором описывались масса дурацких ошибок, которые делают серверы, изза того, что HTTP очень плохо реализован браузерами, и на сколько это сложная логистика учесть всяческие нестандартные варианты поведения... жаль, сейчас не могу найти документ.
                                      Ответить
                                      • > nginx падал
                                        Что-то не могу найти статьи про это. Попадаются только про ошибку 400, при больших куках. Но это вполне адекватное поведение. Да и фиксится в конфиге при желании.

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

                                          Нужно искать по ключу "nginx cookies 502 bad gateway" - гугл выдает несколько страниц результатов, хотя я так давно не интересовался - наверное что-то с этим сделали уже.
                                          Ответить
                                          • > как получается иньекция
                                            Когда я читал про кеш иньекции, мне попадались именно иньекции в браузер, путем подсовывания ему в кеш вредоносного js, который потом будет исполняться на настоящем сайте (т.к. браузер берет либу из кеша). Подобную атаку можно провести и на кеширующие прокси типа squid'а, которые потом радостно будут раздавать вредоносный код своим клиентам.

                                            Но с этим сервер мало что может поделать, кроме включения HTTPS, запрета HTTP, и надежды на сознательность юзера.

                                            > на кеширующий сервер заливается страница
                                            Т.е. этот сервер уже был скомпрометирован? Тогда чем тут виноват сервер, на котором крутился сам сайт?
                                            Ответить
                                          • > Когда факт наличия разницы удается установить
                                            А, понял о чем вы. О том, что один юзер отправляет специально сформированный запрос, основной сервер отвечает ему, кеширующий вносит страничку в свой кеш. А затем жертва, пытаясь выполнить свой запрос получает именно эту страничку из кеша, а не свежую, которую должен был ей сгенерить основной сервер...
                                            Ответить
                                            • Угу, именно так. Как правило это случается если продублировать заголовок Content-Length, или добавить там разных возвратов каретки, или обмануть, подсунув очень большое число в этом заголовке и т.п. Есть много некондиционных ситуаций, на которые серверы иногда реагируют так, как будто ошибки не было, и в таком случае можно просунуть дополнительную страницу на кеширующий сервер, о которой настоящий сервер не узнает.
                                              Ответить
                        • Tomcat вроде просто кот, а не дикий кот.
                          Ответить
                        • >Дикий кот - это просто бажная копия httpd

                          Это, конечно, полная безграмотна хуйня. Коммент 2013-го года, так что пишу как было тогда:

                          Есть спека на контейнер сервлетов, томкат ей удовлетвряет.
                          А стеклянна рыба удовлетворяет куда более широкой спеке в JavaEE.

                          Сервлет взлетит и в джетти, и в коте и в рыбе.
                          HTTPшной частью в томкате занимался Coyote, и вообще говоря был не обязателен: его можно было подключить вообще без ххтп.
                          Кстати, подсистема кота для сервлетов называется Каталина.

                          httpd это веб сервер Apache и к джаве и к сервлетам отношения не имеет
                          Ответить
      • А наоборот? Как с явы получить базовые знания си, как конпелировать сишкоговно, понимать сишный код и писать что-то относительно простое?
        Ответить
        • Читать "The C Programming Language" и "C Programming: A Modern Approach" (также как-то листал "Object-Oriented Programming in ANSI C", весьма ничего), курить исходники толковых проектов (у GNU есть неплохие, если не обращать внимание на паршивый индент-стайл). Неплохо бы также понять работу тулов вроде make.
          Ну и, естественно, решать какую-то реальную задачу, контрибьютить в проекты.

          Но я бы начинал сразу с C++.
          Ответить
          • Да мне не гуру стать, а чисто утилитарные задачи, описанные постом выше. На русском ничего нет, или что-то короткое/несложное на английском?

            make понимаю, но руками мейкфайлы вроде никто не пишет.

            На цпп гонят за сложность, это правда? В принципе, то, что можно написать на яве или питоне, я на них бы и написал.
            Ответить
            • > В принципе, то, что можно написать на яве или питоне, я на них бы и написал.
              Напиши ORM. Крестоблядские ORM'ы это море счастья и чорной магии...
              Ответить
            • > На цпп гонят за сложность, это правда?
              Кресты не сложные. Там просто дохуя подводных камней, которые проявляются не сразу и не всегда, и ты обязательно рано или поздно на них нарвешься в своей работе ;)

              Вот, в принципе, годный рисунок на тему обучения c++: http://lbrandy.com/assets/c++.png.

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

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

              Но если, ты пройдешь через эти тернии, и лет эдак через 5 разберешься с основными крестоблядствами, то ты поймешь, что с++ не так уж сложен ;)
              Ответить
              • Вопрос скорее, зачем оно мне нужно, если есть жава с питоном. Питон на си завязан. Уж лучше с сишарпом разобраться. Так что мне нужно см. выше.
                Ответить
                • Так тебе сишка нужна чтобы писать модули для питона и жабы?

                  Ну тогда почитай первую попавшуюся книжку по основам языка и вперед ;) Никакие особые фичи тебе не потребуются. По идее даже от препроцессора будешь юзать только include, ну максимум ifdef.
                  Ответить
              • Я просто никогда по-серьезному не писал на языках без исключений и GC.
                Ответить
    • Тоже из буста? Ох уж эти анскильные питушки!
      Ответить
    • RELEASE TEH MUTEX!!
      Ответить

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