Заглянем в CMS NetCat?

    Вам нравится NetCat? Нам с NickMitin тоже — его реализация достойна призовых мест в шитпараде.

    Посмотрим что внутри?
    if ($f_Checked && $admin_mode)
    {
    $IsChecked = $f_Checked + 0;
    }

    WTF?!..



    Парой строчек ниже:
    $f_Parent_Message_ID += 0;
    $f_DaysToHold += 0;
    $f_DaysToShow += 0;


    Со слэшами в мессаджах NetCat борется брутальными методами:
    for ($a=0; $a<count($line[1]); $a++){
    $tag=trim($line[1][$a]);
    $val=trim($line[2][$a]);
    $val=stripslashes($val);
    $val=stripslashes($val);
    $val=stripslashes($val);
    $val=stripslashes($val);


    Групповая обработка УРЛов:
    for ($www=0; $www<count($vals); $www++){
    $vals[$www]=($vals[$www]=='') ? "\"\"" : "\"".$vals[$www]."\"";
    }


    Все никак слэши не одолеют:
    $line=stripslashes($line);
    $line=stripslashes($line);
    $line=addslashes($line);


    Интересное решение…
    printf(NETCAT_MODERATION_WARN_COMMITDELETIONINCLASS."<br><br>", $cc);

    «Шаблонизатор»
    eval("echo \"$template_footer\";");
    exit;


    Продолжать можно долго…

    Комментарии 176

      +1
      гы, а внешне и не скажешь)
        +3
        Я тоже очень удивился. От нетката как-то веяло качеством.
          +38
          Качеством веяло благодаря брутальной обработке слэшей в мессэджах)
            0
            Вообще, такие брутальные фишки могут быть из-за кривого мержа, т.е. может быть это все дьявольские проделки CVS-а или SVN-а :) Знаком с такими штуками.
            • НЛО прилетело и опубликовало эту надпись здесь
            0
            Это «качество» — это реклама, красивые дизайны, но это все внешне :)
            А внутрях там действительно местами вполне себе говнокод :))) Очень много приходилось его переписывать именно внутри — иногда такая жесть попадается )
            Нет, оно все работает, но все-таки как-то все это некрасиво :)
              +4
              Конечному пользователю действительно все равно что внутри. Работает? Работает. Удобно? Удобно. Остальное — не их головная боль и за это они платят. Но в моем представлении эта схема была бы красивой, если бы качество соответствовало цене (которая > 0). В данном случае это не так.

              Если на Хабрахабр есть представители NetCat, то, надеюсь, этот топик сподвигнет их на внеплановый аудит когда. В этом есть острая необходимость.
                +3
                думаю простым аудит тут не отделаешься… все ( большую часть ) переписывать нужно
              0
              Приходилось работать с ним. Ничем хорошим от него уж точно не веяло.
                –2
                Видимо Вы им не пользовались. Я сертифицированный разработчик на цмс НетКат и знаю, что половина модулей не работает, после каждого обновления система «ложится» и приобретает кучу багов.

                За все время работы переписал половину модулей, стало немного лучше.
                  +1
                  Наверное имели в виду, что Вы — сертифицированный переработчик?: D
                    +1
                    Интересные новости. А можно подробности и примерами?
                      –2
                      На 3.0 изначально не работает голосование, в форум нельзя поставить дизайн, глючит выбор цвета и т.д.
                        +1
                        Голосование — да, в первой 3-й версии (сборка 300) оно глючило, в одном из следующих патчей исправлено. Форум — нет, просто макет подключается чуть сложнее, чем к обычному разделу, см. ртфм по модулям, 65 страница. Глючит цвет — как глючит? Саппорт по данной формулировке мне ничего путного не сказал.

                        В прошлом мессаге вы писали «половина модулей не работает, после каждого обновления система «ложится» и приобретает кучу багов» — можно ли поподробнее об этом? Какая именно половина модулей не работает и как они это (не) делают, как после каждого обновления система ложится и какие баги после каких обновлений приобретаются? Описанные вами проблемы — дикий ахтунг, тысячи пользователей о них не подозревают, хотя и обновляются, и модулями пользуются. Надо же народ предупредить.
                +17
                Вы еще в код модулей не заглядывали, там иногда встречается ТАКООООЕЕЕЕ :)

                А вот неприятия конструкции $var += 0; я если честно не понимаю. Имхо это довольно элегантный метод приведения переменной к числовому типу в языках с нестрогой типизацией. Я правда раньше умничал используя $var = (int)$var позабыв о максимальной длине переменной типа int, которая может быть в PHP… пока не нажёгся на это ограничение длинны.
                  +1
                  нет, вы что… вы не поняли… там модули для того, чтобы их купить, посмотреть и написать заново ;) В итоге получается полнофункциональный для двоих нужд модуль ;)

                  p.s. а багтраки игнорировать это их любимое занятие.
                    +1
                    Про модули вообще странная риторика, всегда. Ну можешь написать для своих нужд сам и круто — дык, доку в зубы и пиши, зачем покупаешь?
                    +8
                    > Вы еще в код модулей не заглядывали

                    Я еще после этого психику не восстановил… )
                      0
                      а как теперь проверяете?
                      сейчас сам пользуюсь $var = (int)$var
                        0
                        так же как NetCat-овцы или $var *= 1
                        • НЛО прилетело и опубликовало эту надпись здесь
                          +4
                          $var = intval($var);
                            +2
                            дащаз )
                            $var = doubleval($var);

                            екзампл

                            i: 2147516371
                            intval(i): — 2147450925
                            doubleval(i): 2147516371
                            0
                            Ruby способ: var = var.to_i
                          –3
                          Толи хабрапарсер лох, толи автор топика не знает что с ним нужно делать.

                          += 0; отличный способ, кстати, вдвое короче ближайших аналогов.
                            +2
                            «Ближайшие аналоги» — это *=1 и /=1? :))
                              0
                              не, он наверное хочет чтоб короче было, и код не выполнялся ваще сделать /=0; зачем писать код когда можно изящно обломать все на корню: D
                              0
                              а вы не передаете клиентской стороне код, он на сервере исполняется…
                                +7
                                Да, ребята… Одним постом в котором я не стал кричать вместо с толпой, эта самая толпа втоптала меня по самое не балуйся :)

                                Не писать мне статей на хабре.

                                Пока, хабрахабр.
                                  +4
                                  Согласен, не справедливо. Держи + в карму.
                                    +4
                                    Начинается, блин… Уже сколько раз было, коллективный разум одумывался и менял свое решение. Может хватит уже, если решили что за то, что я приврожу переменные к цифре +=0 мне здесь не место, то может не стоит уже это решение менять? Заколебали эти холивары.
                                      +4
                                      Что за истерия? Просто ваше сообщение привлекло внимание тех, кто не опускал Вашу карму. И все го-то.
                                    0
                                    Не самое лучшее достижение)) Тоесть обычно вы кричите вместе с толпой?
                                    Не писать мне статей на хабре тоже))
                                      0
                                      А мне не нравится такой способ. Код должен быть читаем, тем кто с данной уловкой незнаком придется вдумываться. Или вам придется писать комментарий. Проще и элегантнее сделать функцию с коротким, но внятным названием (to_i например). Я не минусовал, если что.
                                    0
                                    Первые два куска кода сразу видно делали аутсорсеры из Индии =P Народ очень религиозен, что оставляют мольбы богу через непонятные для простых людей операции над переменными.

                                    ЗЫ: Эвалить шаблоны это нечто.
                                      0
                                      На самом деле эвалить шаблоны не так уж и плохо. Это медленнее str_replace, но гораздо удобнее и при массовом использовании жрет меньше памяти.

                                      Я сюда код вставил потому что мне показалось, что где-то в коде я встретил такой эвалопринт по отношению к самой простой текстовой/числовой переменной, а не шаблону. Теперь найти не могу, может мне причудилось :)
                                        0
                                        Возможно, просто у меня сработало ассоциативное мышление — давно был один работодатель из одной студии, который хвалился наработанным чудо-шаблонизатором, который эвалил HTML и базы. После этого когда вижу функцию eval, меня трясет.
                                          0
                                          О, да это подход авторов vB 2 ;-)
                                            0
                                            Это был vBulletin? Если, нет, то они стырили его у них, мы, кстати, тоже используем их идею.
                                              +1
                                              Нет, они сами писали код. Но идею могли позаимствовать, — меня особо не посвящали =)) Заказы той студии я делал своими руками, не используя их «чудо-код».

                                              А в vB достаточно удобно эти шаблоны править через админку, правда я сторонник чтобы в базе были данные, а шаблоны на сервере в отведенной для них директории.
                                                +2
                                                Мне удобнее править шаблоны не в базе, а непосредственно на сервере, используя редактор поддерживающий работу с FTP. Пропагандирую этот подход :)
                                                  0
                                                  Я с вами согласен, — администратор должен администрировать информацию, разработчик разрабатывать, технолог делать шаблоны.
                                                    0
                                                    когда вы дорастете до использования SCM, то поймете, что не нужно его пропагандировать.
                                                    0
                                                    Заглянув глубже в архитектуру vBulletin понимаешь, что решение с хранением шаблонов в базе выглядит красивее. В начале каждого модуля есть массив, который заполняется в зависимости от того, какие шаблоны необходимы для генерации страницы в зависимости от get-параметров и потом одним SQL-запросом из базы выбираются все необходимые шаблоны. Если грамотно использовать кэширование запросов mySQL, то вся пачка шаблонов отдается практически мгновенно. Нет, конечно же можно кэшировать в shared memory сервера и код файлов шаблонов, но мне такое решение нравится больше (хотя-бы тем, что оно не требует установки акселлераторов, а строится на стандартном фнкционале сервера).
                                                      –2
                                                      +стопяцот
                                                      Кроме того это офигенно снижает файловые операции против способа хранения шаблонов в файлах
                                                      Когда форум рефрешат по 10 милионов страниц в день — это сказывается (из собственного опыта использования vB).
                                                      Ну и дает спойоно обновлять сам форум, хранить разные версии одних шаблонов и т.п.
                                                0
                                                да, но зато удобство — никакое и код тяжелочитаем. Гораздо привычнее include.

                                                А еще в неткате где-то один шаблон либо через str_replase прогоняется, либо через eval… и попробуйте вставить сюда php код без ошибок и плясок с бубном
                                                  0
                                                  Используем eval-based шаблонизатор, вполне себе ничего работает. И удобно даже. Просто все надо к общей архитектуре приводить. Абстрактно evalить не айс, а вот если весь механизм проработать, очень даже айс.
                                                    0
                                                    php код вставить без проблем :)

                                                    «;
                                                    здесь пишем все что угодно

                                                    echo „

                                                    есть конечно свои минусы, например если все же ошибка случилась. то тяжелее найти строку где это произошло.
                                                  +2
                                                  какая Индия упаси вас?! Индия это если софт делают в USA или UK — у нас аутсорс это шараги при ВУЗах (или просто шараги со студентами) — там зарплаты на которые даже индусы не согласятся
                                                  +1
                                                  Какая забота об уникальности сессии
                                                  srand((double)microtime()*1000000); $randval = rand(); $session_id=md5(uniqid($randval)); session_id($session_id);

                                                  Красивые имена констант:
                                                  NETCAT_MODULE_AUTH_MSG_INVALID_LOGIN_FORMAT
                                                    0
                                                    По поводу констант:
                                                      +3
                                                      NETCAT_MODERATION_ERROR_NOOBJADD
                                                      я здесь вижу:
                                                      NETCAT_MODERATION_ERROR_NOOB
                                                    +18
                                                    Они, кстати, сами свой код плохо знают…

                                                    Вот код из функции для работы спользователями и т.д.

                                                    /* Нужно будет добавить 4-й параметр или передавать на вход массив или объект, 
                                                     * который будет содержать данные о пользователе и его правах */
                                                        function Permission ($UserID, $PermissionGroupID=0, $CountPermissionGroupID=1)
                                                        {
                                                            global $db;
                                                    
                                                            $this->UserID = $UserID;
                                                            /* Непонятно зачем происходит эта проверка, если пользователь не найден или 
                                                    		 * не найденна его группа. $PermissionGroupID не может быть 0, так как 
                                                    		 * идентификатора группы == 0 быть не может. Думаю вообще вся проверка лишняя
                                                    		 * нужно оставить только присвоение:
                                                    		 *   $this->PermissionGroupID = $PermissionGroupID; */
                                                            if ($PermissionGroupID == 0) {
                                                                if ($CountPermissionGroupID == 1)
                                                                $this->PermissionGroupID = GetPermissionGroupID ($UserID);
                                                            } else {
                                                                $this->PermissionGroupID = $PermissionGroupID;
                                                            }
                                                    

                                                      0
                                                      ToDo в коде системы можно рассматривать как анонс новых фич ;)
                                                        +12
                                                        даже такое?

                                                          * @todo УДАЛИТЬ ЭТУ ФУНКЦИЮ, ОНА НИГДЕ НЕ ИСПОЛЬЗУЕТСЯ
                                                          */
                                                        function listLoop($from, $to, $step, $template)
                                                        
                                                        
                                                        ...
                                                         * @todo ПРОТЕСТИРОВАТЬ!!!
                                                         */
                                                        function nc_csc_permission($permission_check = 63, $catalogue = 0, $sub = 0, $cc = 0, $Catalogue_Access = 4, $Subdivision_Access = 4, $Sub_Class_Access = 4) 
                                                        

                                                          +64
                                                          Ого, вот это супер! :) Вместо того, что бы замочить неиспользуемую функцию они устроят чат в ее дискрипшине:
                                                          * @todo УДАЛИТЬ ЭТУ ФУНКЦИЮ, ОНА НИГДЕ НЕ ИСПОЛЬЗУЕТСЯ * @ask УВЕРЕНЫ? МОЖЕТ ГДЕ-ТО ИСПОЛЬЗУЕТСЯ... * @todo УВЕРЕН, НО ПРОВЕРЮ ЕЩЕ РАЗ (3 релиза спустя) * @todo ВСЕ, МОЖНО УДАЛЯТЬ * @ask КТО УДАЛИТ? Я ЛИЧНО ЗАНЯТ * @chief МУТЬ ВАШУ, УДАЛИТЕ КТО-НИБУДЬ ФУНКЦИЮ!
                                                            0
                                                            блин, хабрапарсер зарубил переносы строк и читаемость скатилась до уровня -1
                                                              +4
                                                              p.s. а мне после этих комметариев, судя повсему, кто-то из неткатовцев карму понизил… и топику оценку тоже.

                                                              p.s. аккуратней
                                                                +5
                                                                Мне тоже в карму наплевали :) Наверное программисты NetCat пришли ;)
                                                                  +3
                                                                  Лучше бы они сказали спасибо что кто-то бесплатно занимается аудитом их кода, а также за то, что их имя висит на главной странице Хабра совершенно бесплатно, а не минусовали нас за это =)
                                                                    0
                                                                    После попадания топика на главную Хабры информация до них дойдет. Будем ждать качественного нового релиза продукта? :)
                                                                    +1
                                                                    Это скорее NetCat-дрочеры ;)
                                                                    Есть такой подвид людей, которые пользуются продуктом, а когда им доказывают, что продукт говно, они очень сильно обижаются и начинают гадить. Говнокоду говнопользователи.
                                                                      0
                                                                      Урок практический философии :)
                                                                        0
                                                                        Гадят непрестанно )))
                                                                        Я столько минусов не получал даже от поклонников Python ))) На удивление ранимые люди )))
                                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                                        0
                                                                        Не смотря на то, что я прекрасно понимаю все недостатки нетката, и не минусовал ни iBear ни тем более NeXу, который в пяти метрах от меня в офисе сидит, ваши слова меня задевают. И я с трудом удержался что-бы поставить вам минус только за реплику, а не в карму. Как по мне, дак вы обычный тролль.
                                                                          0
                                                                          Я не тролль. Я просто ненавижу говнокод.
                                                                          И как может Вас задеть ветка обсуждения, в который Вы не участвуете?
                                                                            0
                                                                            Вы вот написали «Говнокоду говнопользователи», чем меня и кажддого пользователя нетката оскорбили. Я думаю в реале вам еще бы и врезали хорошенько.
                                                                              0
                                                                              Я не виноват в вашем выборе. Удачи.
                                                                  0
                                                                  Супер!
                                                                  Поржал :-)
                                                            0
                                                            Спасибо, поржал :). Слава богу никогда не встечался с этой системой. Скажите, это хоть не платный продукт?
                                                              +1
                                                              Если бы… Самая дешевая редакция стоит почти 6000 рублей, самая дорогая — больше 32 тысяч рублей.
                                                              0
                                                              всего 6000р за систему без модулей ;)
                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                +10
                                                                Статья напомнила на цитату с баша, пишет программист, который чей-то код правил:

                                                                if (is_int($number)) {
                                                                $number = (int) $number; // на всякий случай
                                                                }

                                                                Какой еще, млять, всякий случай?
                                                                  +3
                                                                  Цитирую:
                                                                  «… Однако функция is_int не делает того, что в данном случае требуется. Она только проверяет, типизирована ли переменная $n как строковая или как целочисленная, но не проверяет, является ли значение переменной $n целым числом. Данный нюанс может ввести разработчика в заблуждение, если он использует функцию is_int для проверки данных HTML-форм (среди прочего).»
                                                                  Джордж Шлосснейгл, «Профессиональное программирование на PHP», стр. 92.
                                                                    0
                                                                    Спасибо, буду знать! Я всего лишь пересказывал цитату на память, а не копи-пастил. Для таких целей я использую `ctype_digit`.
                                                                      0
                                                                      Точно девяносто вторая? Чего-то я найти не могу =)
                                                                      А книжка хорошая. Ага.
                                                                        0
                                                                        Бумажного оригинала у меня под рукой сейчас нет, дома лежит.
                                                                        Электронная версия говорит, что 92-я страница.
                                                                          0
                                                                          хм, возможно я ошибся и это 95-я
                                                                            0
                                                                            Ага, нашёл. 95-я. Хотя это не суть =)
                                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                                            +2
                                                                            загляним в NetCat (так которая система управления контентом, а не та, которая работает как cat, только по сети)
                                                                              0
                                                                              заглянем*
                                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                                  +7
                                                                                  товарищь :)
                                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                                      +2
                                                                                      Не надо никого учить, кому надо тот сам тянется к обучению.

                                                                                      Три типа деятелей:

                                                                                      1) Кто может делать дело, тот делает его сам.

                                                                                      2) Кто не может сам делать дело, но хочет в глазах окружающих выглядеть знатоком и умельцем этого дела, тот учит других тому, как надо делать дело.

                                                                                      3) Кто не может сам делать дело и не может поучать других тому, как надо делать дело, но также хочет в глазах окружающих выглядеть знатоком и умельцем, тот учит как надо учить других тому, как надо делать дело.
                                                                                        +1
                                                                                        Ваши слова этому топику в целом невероятно сильно подходят.
                                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                            0
                                                                            Спасибо
                                                                            Тоже посмеялся…
                                                                              +12
                                                                              Одно отсутствие поддержки UTF-8 уже о чём-то говорит.
                                                                                +1
                                                                                Дык в умелых руках, превращается в UTF-8 версию, за 2-3 часа. обычным iconv-ом.

                                                                                Скажите а вы в своем SVN тоже ведете две ветки cp1251 и UTF-8? И коммитите изменения и туда и туда?
                                                                                  +6
                                                                                  По-вашему, платная система существует для того, чтобы доводить её подобным образом?
                                                                                  Вопрос про две ветки не вполне ясен. На мой взгляд, Windows-1251 — не более чем ущербное наследие былых времён, сейчас неактуальное в принципе.
                                                                                    –2
                                                                                    Хм снова интересная риторика, ну вот вы хотите что-то купить.
                                                                                    Спрашиваете — есть такое тут?
                                                                                    — Нет.
                                                                                    А почему раз за деньги, такого тут нет?
                                                                                    — ??? o_O

                                                                                    А по поводу второго — точно неактуально, так же как неактуальны примерно 4000 тыс. сайтов, которые на ней работают. За все время разработки сайтов я встретил только два проекта в которых был нужен китайский язык, вот и собрал UTF-8.

                                                                                    Итак две ветки — потому что, как по-вашему нужно поступить разработчикам, выпускаем патч, который все клиентские сайты, и соответственно БД переводит в экстренном порядке на UTF-8?
                                                                                    Или для поддержки старых оставляем версию win-1251, но вот хотим utf8, заводим вторую ветку.
                                                                                    И вот вносим новый функционал в 2 ветки? Так нужно?
                                                                                      +5
                                                                                      Я бы работал с UTF-8, а для обратной совместимости со старыми сайтами единожды написал мастер конвертации БД в UTF-8, автоматически отрабатывающий при обновлении системы.

                                                                                      Кодировка UTF-8, кстати, нужна для китайского языка, но и для специальных символов типа μ, × и проч., вполне применимых на любых — в том числе русскоязычных — сайтах.

                                                                                      Система без поддержки UTF-8 сегодня, увы, обречена. И беда не в отсутствии поддержки UTF-8 как таковой, а в том, что разработчик не видит правильных направлений развития своего продукта. Ничего не имею против NetCat и её разработчиков, просто предпочту никогда с ней не связываться как минимум из-за отсутствия поддержки UTF-8 — как и с любой другой системой без такой поддержки.
                                                                                        0
                                                                                        нужна для китайского языка → нужна не только для китайского языка
                                                                                +11
                                                                                дак я ещё и не такой плохой программер :)
                                                                                  +2
                                                                                  Хоть какая-то польза от их говнокода есть… :)
                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                                    +13
                                                                                    Ага. С хинди.
                                                                                    0
                                                                                    посмеяться? ;)
                                                                                      0
                                                                                      сорри, ответ на комментарий iBear был
                                                                                        0
                                                                                        Повысить чью-то самооценку ;)
                                                                                        0
                                                                                        теги у топика прикольно написаны, разделены запятой и тп
                                                                                          +1
                                                                                          Знаю. Я сразу после публикации пытался исправить, но правильный вариант (через запятую) сохраняться не хочет. Нужна помощь модератора/администратора.
                                                                                          0
                                                                                          Не знаком, к сожалению или к счастью, с этой ЦМСкой, и не знаю в каком контексте встречается этот код.
                                                                                          Но могу предположить, что не все так плохо. Но это лишь предположения.
                                                                                          Например, присвоение 0 — это после оптимизации кода, например там сначала могли быть константы, а перед релизом по коду проходится оптимизатор, заменяющий константы непосредственно на значения.
                                                                                          Борьба со слешами, возможно, из-за того что была допущена ранее (например в более ранних версиях) ошибка и были накоплены данные с многократным экранированием:
                                                                                          $a = '\\\\\a';
                                                                                          $a = stripslashes($a);
                                                                                          echo $a;
                                                                                          $a = stripslashes($a);
                                                                                          echo $a;
                                                                                            +1
                                                                                            кхм… если эти данные и были накоплены то решается одной строкой регулярки…
                                                                                              0
                                                                                              Скорее всего, Вы правы, и «регулярки» это более эффективный способ решения (предполагаемой) проблемы. Но в любом случае вопрос уже перекладывается в плоскость «эффективности кода», а не «идиотизма кода».

                                                                                              К тому же мы (во всяком случае я), не знаю архитектуры и контекста откуда автором статьи были взяты куски кода, возможно есть какие-то причины, не позволяющие использовать «регулярки».
                                                                                                0
                                                                                                Хорошо помню случай, похожий на описанный.
                                                                                                В проекте обнаруживается баг с самопальным strip'ом. Смотрю на функцию, всё правильно. Проверяю. Результат не тот. Вызываю функцию два раза подряд — результат верен. Компилирую, заливаю на сервак.

                                                                                                Вот только у меня совсем не ЦМС. Раз в сутки бывает промежуток в несколько часов, когда программа обязана работать, а правил я её буквально в последнюю пару минут перед дэдлайном. Не до регэкспов было.

                                                                                                Потом-то, разумеется, нашёл ошибки, исправил. Но сама ситуация со:
                                                                                                strip();
                                                                                                strip();
                                                                                                больно уж похожа. Вот только NetCat'овцы не исправили в последствии :)
                                                                                                0
                                                                                                Так может там можно экранировать слеш слешем?
                                                                                                0
                                                                                                Хм, судя по «красным циферям» я не прав.
                                                                                                Ребяты, кто подскажет в чем именно?
                                                                                                  0
                                                                                                  Как я уже писал, объяснить и оправдать можно любой код. Но Netcat — это продукт на продажу, отсюда я бы хотел видеть качество. А выходит, что технологически оно ничем не лучше CMS, написанной начинающим программером.

                                                                                                  И потом, во главе угла должна стоять архитектура. На написание кода, при нормальном подходе, уходит меньше всего времени. У нетката, кажется, как и у vBulletin, было все как раз наоборот. Все проблемы решались втупую. Количеством строчек, идиотскими проверками и далее и далее.
                                                                                                +5
                                                                                                кусок кода из Битрикса:
                                                                                                if (strlen($arResult[«ERROR_MESSAGE»]) <= 0 && $arResult[«CurrentStep»] > 5) {
                                                                                                if (strlen($arResult[«ERROR_MESSAGE»]) > 0)
                                                                                                $arResult[«CurrentStep»] = 5;
                                                                                                //…
                                                                                                }

                                                                                                коммент в Битриксе:
                                                                                                Надо сказать, что для скорейшего завершения разработки было решено пока не реализовывать такую же гибкость как в инфоблоках (обойдемся пока без alter'ов и прочего).
                                                                                                  +2
                                                                                                  В России всё делается наспех и на века одновременно. С этим Битриксом уже намучался, но хоть поддержка у них оперативно отвечает. Правда результатом зачастую оказывается «поставлено в план работ» до лучших времён…
                                                                                                  0
                                                                                                  насколько я помню в netcat'e код для шаблонизатора, который потом eval'ом выполняется
                                                                                                  «Шаблонизатор»
                                                                                                  eval(«echo \»$template_footer\«;»);
                                                                                                  exit;

                                                                                                  хранится в БД, и правится в админке
                                                                                                    +1
                                                                                                    Не защищая НетКат спрошу.
                                                                                                    А кто нибудь из комментаторов открывал свой код 2-3х летней давности? ;)
                                                                                                      +1
                                                                                                      продолжу: «… и пытался продать его за 6000р.»
                                                                                                        +2
                                                                                                        Это я к тому, что НетКат существует давно, код писали разные люди. С разным уровнем квалификации. Изменять код в системе, на которой работает не одна сотня сайтов надо крайне осторожно, что бы со следующем обновлением половина из этих сайтом не перестала работать.

                                                                                                        Я думаю подобные косяки беда большинства крупных проектов поддержка которых длится не один год. И тут не важно платный он или нет. Пишут-то люди
                                                                                                          0
                                                                                                          Понятно, но мы, пользователи, должны их поругать публично, иначе ничего не изменится.
                                                                                                            0
                                                                                                            Мне тамошний саппорт как-то по телефону крайне не рекомендовал пользоваться одним из их модулей. Сказав, что код писался давно и, даже беглый взгляд, дает понять, что он не безопасен. Так же заверили, что многие модули будут переписывать заново с нуля.
                                                                                                              +1
                                                                                                              Скорее бы.
                                                                                                            0
                                                                                                            но ведь можно изменять реализацию функций не меняя интерфейс (api)…
                                                                                                            тогда как подход «не знаю, что делает этот кусок кода, но для обратной совместимости пусть будет» крайне не верен…
                                                                                                          0
                                                                                                          Зачем далеко ходить за 2-3 года назад… :)
                                                                                                          сюда
                                                                                                          +3
                                                                                                          По заголовку подумал, что речь идет о настоящем неткате: netcat.sourceforge.net/
                                                                                                            0
                                                                                                            Исправьте теги, пожалуйста.
                                                                                                              +24
                                                                                                              Отвечаю в качестве официального представителя NetCat.

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

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

                                                                                                              Наши разработчики прекрасно знают проблемы кода, и мне в аську скинули ссылку на этот топик со словами «а я тебе говорил». Смысл в том, что именно я ставлю задачи программистам (с точки зрения приоритетности задач). И я не раз ставил в план работ другие работы в ущерб очередному этапу рефакторинга.

                                                                                                              NetCat разрабатывается с 99-го года. За эти 9 лет над кодом ядра трудились самые разные разработчики. От некоторых из них оставалось довольно веселое наследие, которое приходилось (или еще придется) исправлять. Далеко не всегда у нас нас был SVN, CVS, правила документирования кода и тестирования.

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

                                                                                                              В общем, резюме. iBear, спасибо за топик, проблема есть. Рефакторинг проводится и будет проводиться и дальше, но, увы, это не наивысший приоритет.
                                                                                                                0
                                                                                                                А распараллелить работы вы не можете?

                                                                                                                Запустите 2 команды, одна сатисфвачит клиентов, другая делает NetCat 4.

                                                                                                                Можно ведь объяснить инвесторам, что поддержка существующего кода — это путь в никуда, вас просто рано или поздно обойдут.
                                                                                                                  +1
                                                                                                                  У нас и так две команды, и они примерно этим и занимаются. Команды в свою очередь делятся на мобильные рабочие группы. 4-ю версию нельзя делать с нуля, она должна быть совместима с третьей, иначе придется либо кидать текущих пользователей, либо поддерживать две ветки и все равно кидать пользователей. В «тройке» была переписана наверное половина кода, но совместимость с 2.х осталась. Архитектура продукта на мой взгляд довольно удачная с точки зрения модернизации и масштабирования.

                                                                                                                  Инвесторам объяснить можно все что угодно, но с позиции денег. Я вот не знаю, как доказать, что вариант «бросить все на два месяца» более выгоден, чем «в течение полугода постепенно провести аудит и рефакторинг, не бросая приоритетных задач». Вы утрируете проблему — если бы у нас все оставалось на уровне PHP3 и не собиралось меняться — да, из этого ничего путного не вырастишь. Я же говорю лишь о том, что рефакторинг нужен, но не кардинальный и не одномоментно.
                                                                                                                    0
                                                                                                                    Я дро меня еше более менее устраивает, но что с модулями, которые даже новые выходят просто никакие?
                                                                                                                    В частности модуль Форума просто невозможно использовать. Почему вы решили пойти по пути отличном от идеологии системы, создать новые сущности групп пользователей, новые сущности сообщений…
                                                                                                                      +3
                                                                                                                      Форум — не новый модуль. Когда он писался, такой подход представлялся правильным. Почему — рассказывать долго. Сейчас уже понятно, что это была ошибка. До конца года будет выпущен новый модуль, уже в рамках идеологии.
                                                                                                                        0
                                                                                                                        Хорошо бы еще пользователям старого модуля его обменяли бесплатно на новый :)
                                                                                                                          +6
                                                                                                                          Это само собой разумеется.
                                                                                                                          0
                                                                                                                          Еще вопрос. Сейчас использованию админки в Опере новой версии мешает только один досадный глюк, мне его приходится с каждой копией системы. Там дерево схлапывается, потому что опера стала плохо понимать height=100%, зато все остальное работает как часы. Можно ли это исправить, скажем перевесив принудительное изменение высоты этого дерева на javascript?
                                                                                                                            +2
                                                                                                                            Да, есть такое, глюк Оперы. В следующем патче проблему решим.
                                                                                                                        0
                                                                                                                        Если вы говорите, что у вас все в порядке с архитектурой, то не должно быть проблем с совместимостью 3 и 4 версии. Разработчики Windows справляются с проблемой совместимости API на протяжении многих версий. А PHP очень безболезненно переходит от процедур к объектам.

                                                                                                                        И почему вы все время говорите «бросить на 2 месяца»? Если у вас несколько групп и одна будет работать только на рефакторинг, от этого остальные тормозить не будут.

                                                                                                                        И про инвестора я говорю исключительно со стороны денег. 100 рублей сегодня не гарантируют 100000 рублей через месяц.
                                                                                                                          0
                                                                                                                          А что делать с задачами, которые сейчас решает эта группа? Например, одна группа делает SaaS, другая визарды, третья — готовые решения. С кого из них снимать задачи и почему? Можно конечно сказать, что нужно нанять еще программистов и сформировать из них новую группу, но не все так просто. Механическое увеличение штата не ведет автоматически к пропорциональному увеличению скорости разработки. Иногда даже наоборот.

                                                                                                                          Про инвестора — подпишусь. Но что из этого следует в контексте вопроса?
                                                                                                                            0
                                                                                                                            Вы почему-то оппонируете мне, так, как будто-бы я требую чтобы ваши люди сейчас все бросили и стали писать новый неткат. Мне естественно не известны все проблемы вашей разработки, и я сужу со своей колольни.

                                                                                                                            Но! Эти люди когда-то закончат свои задачи, и можно сделать одну группу, которая занимается только рефакторингом, то есть не получает никаких других задач, пока не выстроит нормальный неткат и, что самое важное, отладит правила разработки модулей. Я не исключаю, что у вас они уже написаны, но практика всегда вносит свои коррективы.
                                                                                                                              0
                                                                                                                              Да я вам не оппонирую :) Хотя бы потому что вы говорите правильные вещи, и в целом я с вами согласен. Просто мы немного о разном говорим. Смотрите. Пример несколько утрированный, но тем не менее.

                                                                                                                              Сейчас у всей команды разработки NetCat есть свои задачи. Они расписаны на три месяца вперед. Разумеется, эти сроки отодвинутся, если появится срочная задача — например, найден серьезный баг или что-то в этом роде.

                                                                                                                              Мы ставим на «через три месяца» одной из групп рефакторинг. Но к этому времени появляется новая версия, вишлист наполняется новыми пожеланиями и пр. И мы видим, что объективно надо отодвигать рефакторинг. Что делать?

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

                                                                                                                              Приходится искать компромиссы.

                                                                                                                              Впрочем, в реальности не все так плохо, как в этом примере. Сейчас как раз такая ситуация, что на «через три месяца» вполне можно поставить такую задачу.
                                                                                                                                0
                                                                                                                                Мы ставим на «через три месяца» одной из групп рефакторинг. Но к этому времени появляется новая версия, вишлист наполняется новыми пожеланиями и пр. И мы видим, что объективно надо отодвигать рефакторинг. Что делать?


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

                                                                                                                                  PS. У меня почему-то комменты сами стали поститься.
                                                                                                                                    0
                                                                                                                                    Я о том и говорю, что с подходом номер 1 задача никогда не будет решена. А значит, он неверный :)
                                                                                                                        0
                                                                                                                        «сатисфатчит кликентов»… что-то в этом есть… :))
                                                                                                                        0
                                                                                                                        Увы. Многие места как раз таки не работают. Поэтому и приходится переписывать, разбираться в исходниках, встречать в нем такой вод кодобред, вносить изменения в ядро системы и получать проблемы с обновлением. Ведь народ ковыряет исходники не от нечего делать…
                                                                                                                          0
                                                                                                                          Такие вопросы лучше разбирать на примерах. Если есть пример — давайте попробуем его разобрать. Чаще всего (по статистике обращений в саппорт) к изменениям в ядре прибегают, когда не до конца разбираются в инструментах разработки системы. Это, кстати, одна из причин, почему мы сейчас занимаемся тотальной переработкой документации разработчика.
                                                                                                                            0
                                                                                                                            Первая причина по которой приходится копаться в ядре и вникать в суть — слабая документация. Ну очень уж слабая в нектороых нестандартных моментах, с которыми приходится сталкиваться при работе. Но в целом ядро вполне неплохое и к нему больших притензий нет

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

                                                                                                                              Обращения мы не игнорируем, а складываем в списки и по мере поступления разбираем. Что-то действительно «минусим», но большинство ставится в план — либо в ближайший патч, либо в следующую версию. Но вы правы насчет фидбэка, не всегда получается информировать об этом того, кто обращается с предложением.
                                                                                                                                0
                                                                                                                                Верните неткет смолбиз :)
                                                                                                                                  0
                                                                                                                                  Не вернем :) Но скоро будет кое-что в похожем направлении.
                                                                                                                                    0
                                                                                                                                    Это радует.
                                                                                                                          +1
                                                                                                                          Извечная проблема — грести деньги, пока дают, но с туманными перспективами, или на некоторое время остановиться, «заточить пилу», и в дальнейшем работать более эффективно и с более платёжеспособными клиентами.

                                                                                                                          P. S. Каков приоритет добавления поддержки UTF-8?
                                                                                                                            +1
                                                                                                                            Я так и думал, что вопрос быстрых денег встанет. Разумеется, у нас нет подхода быстро заработать, а дальше хоть трава не расти. Как раз наоборот.

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

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

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

                                                                                                                            В любом случае ваш продукт (компания) — не новичок на рынке и я уверен, что вы придете к переработке системы. Возможно, что даже вторая линия (NetCat 2) имела бы смысл. Можно попробовать убедить инвесторов в финансовой объективности такого подхода потому, что:
                                                                                                                            — На системы есть спрос, пока рынком ЦМС востребованы;
                                                                                                                            — Система «с нуля» — это, маркетологически, принципиально новый, мощный продукт, который при правильном поднесении обязательно будет пользоваться спросом;
                                                                                                                            — Рынок переживает эпоху технофетиша, самое время сделать качественно-новый продукт. Если это будете не вы, то кто-то другой.

                                                                                                                            Удачи компании. И продукту.
                                                                                                                              +1
                                                                                                                              Спасибо за пожелания. На самом деле, вопрос полностью новой версии (не совместимой со старой) изучался. Мы пришли к выводу, что в нашем конкретном случае это не имеет смысла ни с маркетинговой, ни с технической точки зрения. Даже полный рефакторинг выйдет дешевле и закроет принципиальные проблемы, которые были (и еще остаются). Главный плюс — мы не «подвешиваем» судьбу текущих пользователей.

                                                                                                                              Ну и плюс к тому — есть и другие факторы, которые рассказывать очень долго. Проблемы, которые вы подняли, будут решаться, просто не такими кардинальными способами.
                                                                                                                            0
                                                                                                                            Подправьте тэги темы: netcat, php — и т.д., через запятую.
                                                                                                                              0
                                                                                                                              Я честно пытался сделать это несколько раз с работы (писал об этом выше). Получилось только сейчас, из дома.
                                                                                                                              +2
                                                                                                                              Я один такой дурак, для которого netcat это:
                                                                                                                              trak@gw:~$ man netcat | head -10
                                                                                                                              NC(1) NC(1)

                                                                                                                              NAME
                                                                                                                              nc — TCP/IP swiss army knife

                                                                                                                              SYNOPSIS
                                                                                                                              nc [-options] hostname port[s] [ports]…
                                                                                                                              nc -l -p port [-options] [hostname] [port]
                                                                                                                                0
                                                                                                                                нас по крайней мере двое… тоже долго въезжал в название темы…
                                                                                                                                  0
                                                                                                                                  Нет, вас таких уже много здесь отметилось.
                                                                                                                                    0
                                                                                                                                    Поправил тему ;)
                                                                                                                                    +2
                                                                                                                                    я много использовал разных цмсок, отечественных и не только, и могу сказать, что неткет самая вменяемая из них. такой кодобред встречается сплошь и рядом во многих продуктах, и неткет не исключение. Но тут-то хотя бы люди понимают проблемы и выпускают какие-никакие патчи, что не может лично меня не радовать, как пользователя неткета. Модули конечно полный аццтой, я использую исключительно стандартную систему, а остальное дописываю сам, чего и вам желаю, пока модули не доростут в плане кода до своей цены.
                                                                                                                                      0
                                                                                                                                      Знаете, скажу так…
                                                                                                                                      надо почаще заглядывать иногда и к себе в код…
                                                                                                                                      особенно проверять после бодуна и ночной смены, или когда кто-то над душой стоит и капает :)

                                                                                                                                        +2
                                                                                                                                        М-д-а-а, теперь я понимаю для чего придумали Zend )
                                                                                                                                          –2
                                                                                                                                          Я с предыдущей работы уволился из-за Нетката. Он просто полон подобных ляпов.
                                                                                                                                            0
                                                                                                                                            «+= 0» это мол, «пусть будет как есть» :)
                                                                                                                                              0
                                                                                                                                              Нет, это приведение к целому типу.
                                                                                                                                                0
                                                                                                                                                кажется это аналог i %= 10 (i = i mod 10).
                                                                                                                                                  +1
                                                                                                                                                  $i = 16;
                                                                                                                                                  $i %= 10;

                                                                                                                                                  echo $i;

                                                                                                                                                  попробуйте. как-то коряво он приведёт :)
                                                                                                                                              0
                                                                                                                                              Это еще что…
                                                                                                                                              Я както в нашем внутреннем проете на прошлой работе видел код
                                                                                                                                              while (i >9)
                                                                                                                                              {
                                                                                                                                              i -= 10;
                                                                                                                                              }
                                                                                                                                                +3
                                                                                                                                                Идеальных систем не бывает. Основная на то причина – коллективный труд. Когда систему разрабатывает не один человек, а команда разработчиков (а в некоторых случаях по-другому и быть не может), каждый участник старается привнести в код что-то свое – неповторимое и мегаоригинальное с его точки зрения.

                                                                                                                                                Тем не менее, по моему скромному мнению, NetCat CMS – очень даже неплохая платформа. По крайней мере она имеет весьма развитый и удобный API, предоставляет полный контроль над HTML-шаблонами, не «поганит» HTML-разметку и позволяет разрабатывать безупречные синтаксически и семантически корректные интернет-ресурсы, соответствующие всем современным веб-стандартам.

                                                                                                                                                На мой взгляд, единственная серьезная проблема программного комплекса NetCat – отсутствие поддержки UTF-8.
                                                                                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                                                    +2
                                                                                                                                                    Это еще что. Мы ведем один очень большой проект, который писали не мы. Это пипец просто, кладезь перлфаков. Там можно целый музей собрать. Представьте каково это, поклонникам pretty-code поддерживать говнокод. Так оно еще и работает почти стабильно и практически не падает :).

                                                                                                                                                    Но одно мы поняли точно, промышленный код не может быть pretty. Это может быть только говнокод, иначе оно себя не оправдывает. Прекрасное только для себя )

                                                                                                                                                    А прибавление 0 к переменной, это практически нормально.
                                                                                                                                                    Когда нам нужно получить именно число, то к нему можно просто прибавить 0. Если это была пустая переменная, то она превратится в 0, если была строка, то она превратится в 0, если это была строка типа '123ej', то она превратится в число 123. Это такие неявные преобразования ;) Очень удобно в некоторых случаях.
                                                                                                                                                      0
                                                                                                                                                      А ещё кто-то любит поболтать о прекрасном, а другие в это время делом занимаются)
                                                                                                                                                        0
                                                                                                                                                        /* Нужно будет добавить 4-й параметр или передавать на вход массив или объект,
                                                                                                                                                        * который будет содержать данные о пользователе и его правах */
                                                                                                                                                        function Permission ($UserID, $PermissionGroupID=0, $CountPermissionGroupID=1)
                                                                                                                                                        {
                                                                                                                                                        global $db;

                                                                                                                                                        $this->UserID = $UserID;
                                                                                                                                                        /* Непонятно зачем происходит эта проверка, если пользователь не найден или
                                                                                                                                                        * не найденна его группа. $PermissionGroupID не может быть 0, так как
                                                                                                                                                        * идентификатора группы == 0 быть не может. Думаю вообще вся проверка лишняя
                                                                                                                                                        * нужно оставить только присвоение:
                                                                                                                                                        * $this->PermissionGroupID = $PermissionGroupID; */
                                                                                                                                                        if ($PermissionGroupID == 0) {
                                                                                                                                                        if ($CountPermissionGroupID == 1)
                                                                                                                                                        $this->PermissionGroupID = GetPermissionGroupID ($UserID);
                                                                                                                                                        } else {
                                                                                                                                                        $this->PermissionGroupID = $PermissionGroupID;
                                                                                                                                                        }

                                                                                                                                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                                                                                        Самое читаемое