Буратино дали три яблока. Два он съел. Сколько яблок осталось у Буратино? Думаете одно? Ничего подобного. Никто не знает сколько у него уже было яблок до этого. Мораль — всегда обнуляйте переменные!

Можно это было добавить в «Юмор», но когда с это встречается в работе — бывает очень даже не смешно. В этом блоге наверное все хоть раз прочувствовали на себе.

Комментарии (112)


  1. orloff
    29.01.2008 14:13

    :)да, действительно не смешно порой...плюсанул)


    1. huiTrix
      29.01.2008 14:13

      Не злоупотребляйте unset при разработке web-приложений!!! Дело в том что возврат управления из скрипта сильно затягивается и данные клиенту отправляются позже. Т.е. высвобождение ресурсов производится во время выполнения скрипта, а не после ( автоматическим сборщиком мусора ). Можно посоветовать связку unset и flush, либо полностью положиться на сборщик (что лучше). // KCacheGrid попробуй поюзать для общего развития, а потом говносоветы давай


      1. huiTrix
        29.01.2008 14:13

        Инициализируйте переменные, используйте NULL. Unset только там где без него нельзя обойтись.


        1. Caesar
          29.01.2008 14:13

          +1,

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


        1. Maximark
          29.01.2008 14:13

          Как раз unset() надо пользовать...
          NULL только приравнивает переменную нулю... (т е сама переменная остается в памяти), а ансет - удаляет переменную...
          Кстати со времен доса, тот кто писал всегда переменные обьявляет и обязательно убивает... памяти тогды мало было, а сейчас с жиру все бесятся... :)


          1. huiTrix
            29.01.2008 14:13

            :D Еще раз повторить почему? Или выше прочитаешь.


  1. sanch3z
    29.01.2008 14:13

    Если бы Буратино был в долгу (-3 яблока), то без ансета он бы и поесть не смог!)


    1. re7
      29.01.2008 14:13

      Лекция вышки. В аудитории сидит 3 человека, вдруг 5 встают и уходят.
      Профессор: Хм. Сейчас двое придут и вообще народу не останется.


  1. anonymous
    29.01.2008 14:13


  1. greenisha
    29.01.2008 14:13

    Правильнее было бы сказать не обнуляйте переменные, а инициализируйте переменные. Обычно именно с этим проблемы связаны


  1. varyen
    29.01.2008 14:13

    Не смешно что-то... Очень глупая ошибка, которую очень просто избежать в PHP, не отрубая E_WARNINGS. Там, где нужно, пишется @intval($var) или по ситуации.
    Что касается инклудов скриптов - не случайно во всех хороших и не очень CMSках, состоящих из кучи файлов, первой строчкой стоит проверка, типа if ( ! defined( 'IN_IPB' ) ). Держите это в голове и будет вам щастъе. :)


    1. stepan_ovchinnikov
      29.01.2008 14:13

      вот именно. я пока до вашего комента не дошел не мог понять про что автор пишет вообще


    1. Idiot
      29.01.2008 14:13

      Глобально и надежно!


    1. korchasa
      29.01.2008 14:13

      >@intval($var)
      Для вас это читается лучше, чем $val = 0; ?
      PS: Про использование собаки промолчим...


      1. varyen
        29.01.2008 14:13

        Для меня это читается лучше чем if (!isset($val)) $val = 0; . Чесслово.


      1. caezar
        29.01.2008 14:13

        да уж нет, молчать не надо!! нельзя использовать собачку!


    1. alkeeper
      29.01.2008 14:13

      Может все таки E_NOTICE?


      1. huiTrix
        29.01.2008 14:13

        - E_STRICT
        - "0" не есть NULL.
        - @(int)$var ( а лучше инициализировать )


        1. alkeeper
          29.01.2008 14:13

          Насчет Е_STRICT поддержу, единственная проблема - использование Библиотек, писаных как под 4-ку, так и под 5-ку. Кучу барахла выкидывает. А уж как косоворотит ненавидимую вами систему и без E_STRICT... Буэээ ;)


        1. alkeeper
          29.01.2008 14:13

          P.S. А использование "@" как глушителя ошибок вообще нужно вычеркнуть из собственных навыков


          1. huiTrix
            29.01.2008 14:13

            А вот тут ошибаетесь, просто надо грамотно использовать. Например в шаблоне "Друзей ". Но абсолютно точно нельзя использовать для @get_num($intUserID) или @require_once. P.S. У меня всегда E_STRICT + перехват ошибок и исключений singleton ErrorHandler.


            1. huiTrix
              29.01.2008 14:13

              Шаблонизатор хабра глючит. Имелось ввиду "Друзей: <=@(int)$num&gt". Или $db->squery('SELECT id,name FROM entity WHERE id = ?',(int)@$arRequest[0]);
              @ + /dev/hands = красивый безопасный код


              1. alkeeper
                29.01.2008 14:13

                Мде, а я написал много лишнего ;(


              1. alkeeper
                29.01.2008 14:13

                Предпочитаю так:

                "Друзей: <?=(isset($num)?intval($num):0)?>"

                Длиннее, но как-то правильней, чтоли...
                ИМХО.


                1. nekt
                  29.01.2008 14:13

                  а почему не $num+0?


                  1. alkeeper
                    29.01.2008 14:13

                    Чтоб не было NOTICE. Ну и как бы культуру кода пытаюсь соблюдать.
                    И сотрудников своих пытаю за это...


              1. denver
                29.01.2008 14:13

                @(int)$num

                Никогда не видел чтобы (int) плевалась. Ни варнигом, ни даже нотисом. Проверил сейчас еще раз (5.1.4), посмотрел даже мануал. Так что, если это был единственный пример "умного" использования @, то можете смело больше ее не использовать :)


                1. denver
                  29.01.2008 14:13

                  Ой, может вы так защищаетесь от неинициализированной $num? Ну тогда уже проще не показывать вообще все нотисы, чем плодить собачек. Может я просто не понял кто такие "друзья" которые вставляют разный бред?


                  1. huiTrix
                    29.01.2008 14:13

                    А тепь для гипер умных:

                    class Database implements IDatabase
                    {
                    ....
                    public function result($result, $row, $field)
                    {
                    if(!is_resource($result)) throw new DatabaseException($this->error());
                    return(mysql_result($result,$row, $field));
                    }

                    ....
                    }

                    В контроллере:

                    $intUsersCount = @(int)$db->result($db->query('SELECT COUNT(id) FROM `users`'),0,0);

                    Догадываешься для чего тут "@" ?

                    P.S. Нормальные люди все ошибки и NOTICE напрваляют в журнал. И нихуя не одупляют когда
                    у них журнал засран NOTICE'ами для нормального поведения.

                    P.P.S я так понял вы обработку ошибок и журнализацию не используете. Это лечиться, но трудно


                    1. smbd
                      29.01.2008 14:13

                      Есть адекватное мнение, что стоит перейти на mysqli в PHP. За аргументацией к гуглу. Журнал - ++


                      1. huiTrix
                        29.01.2008 14:13

                        ППЦ, мы все отстали от жизни!!!! Позвони всем чтобы срочно переходили. Система по требованиям должна поддерживать mysql. У нас в т.ч. есть версия mysqli. Тока никому не говори.


                  1. huiTrix
                    29.01.2008 14:13

                    Вдагонку

                    <?
                    // ГиперLayout (Вид)

                    error_reporting(E_NOTICE);
                    ?>

                    <? // 1 случай: котроллер вернул пустой массив; Результат: Notice: Undefined index: ZekID
                    $User = array();
                    ?>

                    НомерТелогрейки: <?=(int)$User['ZekID']?><br />

                    <? // 2 случай. Результат: Undefined variable: User
                    unset($User);
                    ?>

                    НомерТелогрейки: <?=(int)$User['ZekID']?><br />


            1. alkeeper
              29.01.2008 14:13


              @require_once


              Такие уникумы существуют??? Фигассе

              А вот про шаблон "Друзей" хотелось бы по подробнее. Или это просто относилось к детищу г-на Рыжикова?


              1. huiTrix
                29.01.2008 14:13

                Котроллер:
                ...
                $User =$db-&gtfetchAll($db-&gtsquery('SELECT id,name,age,friends,bla2 from USERS WHERE id =?',(int)@$id);
                ...

                Должен вернуться массив. Но если такого id нет. То false;

                Теперь шаблон (Вид):
                &lthtml&gt
                ....
                &ltbody&gt
                .....
                Пользователь: &lt?=@$User['name']?&gt&ltbr /&gt
                Друзей: &lt?=@(int)$User['friends']?&gt
                ....
                &lt/body&gt
                &lt/html&gt

                Так вот если пользователя не существует, контроллер промапит $user = false;
                Шаблон выведет:
                Пользователь:
                Друзей: 0

                Если убрать @ то и int. То шаблон будет
                завален NOTICE'aми.

                Так что сдесь без @ нормульно не обойтись.

                А насчет @require_once это еще не уникумы. У 30% проектов которые мне
                приходилось видеть не закрыт FCKEditor Browser и у проц 60% SQL injecttion. Люди еще
                не знают что такое placeholder'ы и прочая пофигистика.


                1. huiTrix
                  29.01.2008 14:13

                  UPD: сорри не получается много дел делать одновременно

                  Котроллер:
                  ...
                  $User =$db->fetchAll($db->squery('SELECT id,name,age,friends,bla2 from USERS WHERE id =?',(int)@$id));
                  ...

                  Должен вернуться массив. Но если такого id нет. То false;

                  Теперь шаблон (Вид):
                  <html>
                  ....
                  <body>
                  .....
                  Пользователь: <?=@$User['name']?><br />
                  Друзей: <?=@(int)$User['friends']?>
                  ....
                  </body>
                  </html>

                  Так вот если пользователя не существует, контроллер промапит $user = false;
                  Шаблон выведет:
                  Пользователь:
                  Друзей: 0

                  Если убрать @ то и int. То шаблон будет
                  завален NOTICE'aми.

                  Так что сдесь без @ нормульно не обойтись.

                  А насчет @require_once это еще не уникумы. У 30% проектов которые мне
                  приходилось видеть не закрыт FCKEditor Browser и у проц 60% SQL injecttion. Люди еще
                  не знают что такое placeholder'ы и прочая пофигистика.


                  1. alkeeper
                    29.01.2008 14:13

                    Чем плохо так?

                    <body>
                    ...
                    <?if($User):?>
                    Пользователь: <?=$User['name']?><br />
                    Друзей: <?=(int)$User['friends']?>
                    <?else:?>
                    <p>Ошибка: Таких не видали.</p>
                    <endif?>
                    ...
                    </body>


                    1. huiTrix
                      29.01.2008 14:13

                      Ну потомучто у тебя ( error_reporting(E_NOTICE)):
                      1 случай: Notice: Undefined variable: User
                      2 случай если не инициализировано $User['name']: будет NOTICE undefined index
                      3 не инициализировано $User['Friends'], то даже при приведении к типу int: будет NOTICE undefined index

                      Короче как бы не хотели NOTICE,"@" и читаемый код не разделимы. Главное не тыкать @ куда не надо


                      1. alkeeper
                        29.01.2008 14:13

                        Если мне пришел вменяемый результат из вызова $db->fetchAll(), а не Object(DB_Error), то собаки тут нахрен не нужны. А если DB_Error, то тут и собаки не спасут.


                      1. huiTrix
                        29.01.2008 14:13

                        Устал уже, сникерсни.
                        1) Object(DB_Error) к тебе в жизни не придет. Так как Exception ловиться catch, а не возвращается функцией.
                        2) mysql_fetchАра возвращает либо массив, либо фалсе. И там допустим забыли запросить поле friends и т.д.


                      1. alkeeper
                        29.01.2008 14:13

                        Если там допустили забыть friends, то это клиника.
                        А если получили false, то хрена ли че-то пыхтеть?
                        Совершил альтернативное действие и привет!

                        За Exception Спасибо, утерли.
                        Но зачем шаблону действовать из соображений "О! Мне что-то прислали, дай-ка я с ним че-нибудь сделаю".

                        Вы когда-нибудь брали деньги под отчет, не пересчитывая и рискуя, что вас нае@ут?
                        Зачем же пытаться нае@ать свою программу?


                      1. huiTrix
                        29.01.2008 14:13

                        День был тяжелый, пиво кончилось, пойду посплю и на завод. :D

                        Перед уходом:
                        Человек работает в комманде. Нужно разработать свой кусок с позиции что меня все хотят наебать. И мне всеравно как данные будут обработаны в контроллере. У меня задача написать стрессоусточиый кусок кода. Не полагаясь на то что контроллер не забудет инициализировать переменную.

                        Например: был пользователь, его удалили, пользователь переходит по ссылки с ID удаленного пользователя. Если программист писавший контроллер не отработал такую ситуацию, то я все равно должен вывести шаблон грамотно. У меня есть свой атомарный кусок кода в котором не должны выскакивать Notice.

                        Аналогия такая: С++ приложение работающее с внешним миром через сокеты. Я не верю тому что мне всегда буду приходить строки с длинной не привышаюшей длину 1024. Данные поступают из внешнего не контроллируемого мира => моя задача не допустить записать в буффер размером 1024 полученные 1028 байт. Иначе buffer overrun.


                      1. alkeeper
                        29.01.2008 14:13

                        Мне кажется, подсознательно Вы готовы признать некорректность собственного подхода.
                        Особенно после примера с C++ :)


                      1. huiTrix
                        29.01.2008 14:13

                        Спасибо за интересную дискуссию. Мой аккаунт точно сеня завалят за поучения. Приятно было поспорить, до встречи.

                        P.S. Ай че прислали! http://rutube.ru/tracks/259145.html?v=380fee0c60fb696672f10c87b7ec9e86


                      1. alkeeper
                        29.01.2008 14:13

                        Спокойной ночи ;)


                      1. denver
                        29.01.2008 14:13

                        >Мой аккаунт точно сеня завалят за поучения.
                        Ой ли за это ;) А с коммуникативностью у Нас все в порядке?


                      1. huiTrix
                        29.01.2008 14:13

                        Pupsik, ti flirtuesh6? :-D


            1. caezar
              29.01.2008 14:13

              это из той же оперы, что указатели и множественное наследование использовать нужно, только осторожно... а вот кто-то с этим несогласен до такой степени, что придумал джаву


          1. varyen
            29.01.2008 14:13

            Не согласен ни разу. Попробуйте отключить ворны для большинства скриптов - сразу ошибки попрут (типа, "барахло"). Конечно, в 90% случаев на них можно положить, но оставшиеся 10% затрудняют отладку очень сильно - а в случае, когда ведется лог всех ошибок, всё становится гораздо проще.
            Впрочем, и так ниже все за меня сказали. :)


            1. alkeeper
              29.01.2008 14:13

              Что такое "ворны"? E_WARNINGS?
              Всегда все под E_ALL делаю, стараюсь E_STRICT выставлять по возможности.

              Большинство общественно доступных скриптов - унылое говно.
              Упс... На maskas заразился ;)


              1. varyen
                29.01.2008 14:13

                Они самые. Тоже пишу под E_ALL, поэтому и использую @.
                Скажем, в середине скрипта не вижу ничего плохого, если написать
                if (!@$user) die(); :)
                Чем это хуже if (!isset($user)) die(); ?


                1. alkeeper
                  29.01.2008 14:13

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


  1. grim00s
    29.01.2008 14:13

    Лучше уж делать двойной unset() или обнулять переменную вручную. Ибо баг с unset'ом (Zend_Hash_Del_Key_Or_Index) имеет место быть.


    1. varyen
      29.01.2008 14:13

      1. grim00s
        29.01.2008 14:13

        дада )
        http://www.hardened-php.net/hphp/zend_hash_del_key_or_index_vulnerability.html статья
        http://forum.antichat.ru/thread31126.html перевод


  1. mobilz
    29.01.2008 14:13

    А еще можно строить такие структуры, при которых unset не требуется.


  1. quark
    29.01.2008 14:13

    define('true', false); // это забавней...


    1. Bublik
      29.01.2008 14:13

      забавнее, чтобы это определялось рандомно


      1. quark
        29.01.2008 14:13

        эх... если б можно было редефайнить '+', '-' и т.п... Это сколько ж веселых и задорных мгновений можно на 1е апреля доставить коллегам...


        1. Cord
          29.01.2008 14:13

          Пора на питон :)
          Там еще и числам можно методы ставить в соответствие. Представляете себе, у вас число - и объект!
          Плюс - это минус, а минус - это плюс. И гениальная идея товарища - истина это ложь, а ложь это истина. Программист будет прямо Алиса в Зазеркалье :)
          А если такую нотацию принять в команде и потом отдать проект на аутсорсинг... :)))


        1. denver
          29.01.2008 14:13

          А если выше этого когда было что-то типа for ($a=0; $a<10; $a++) { ... }
          или регистр_глобалс включен и заходишь ?a=44


          1. akral
            29.01.2008 14:13

            Если register_globals включен, то кому оторвут руки. ^_~
            Мои скрипты умирают, если включен register_globals.


            1. alkeeper
              29.01.2008 14:13

              1. Тому придурку, что сервер конфигурил.
              2. Мои скрипты убивают register_globals и продолжают работать ;)))


              1. akral
                29.01.2008 14:13

                Эээ, я имел ввиду «Если register_globals включен, то кому-то оторвут руки» =)


                1. alkeeper
                  29.01.2008 14:13

                  Как правило, это кто-то конкретный ;)


        1. alkeeper
          29.01.2008 14:13

          Иногда безобидный notice может привести к вполне реальным fatal error


          1. sergey_novikov
            29.01.2008 14:13

            http://ru2.php.net/manual/ru/function.un…
            (не знаю к какой версии относится)


          1. denver
            29.01.2008 14:13

            1) unset делает переменную неинициализированной снова. При попытке обращения к ней - нотис.
            2) удаляет элемент в массиве ($a[1]=null ничего не удалит)
            ...


  1. anonymous
    29.01.2008 14:13


  1. anonymous
    29.01.2008 14:13


  1. anonymous
    29.01.2008 14:13


  1. anonymous
    29.01.2008 14:13


    1. alkeeper
      29.01.2008 14:13

      Возможно, дело в значении open_base_dir и/или во включенном safe_mode + разница во владельце файлов.


  1. foxweb
    29.01.2008 14:13

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


  1. anonymous
    29.01.2008 14:13


    1. alkeeper
      29.01.2008 14:13

      Если переменную объявить типа такого:
      $a = 5;
      то все в порядке, а если попытаться сделать ей без этого
      $a++;
      то получите Notice: Undefined variable in bla-bla-bla


      1. korchasa
        29.01.2008 14:13

        Это вам только кажеться, что одно ;)


      1. Maximark
        29.01.2008 14:13

        ? разве? всегда считал что unset удаляет и имя переменной из памяти, а =NULL приравнивание... т е переменная отсается в памяти


  1. anonymous
    29.01.2008 14:13


  1. anonymous
    29.01.2008 14:13


  1. korchasa
    29.01.2008 14:13

    А можно вопрос? А зачем unset? Почему не $var = 0;?


  1. anonymous
    29.01.2008 14:13


  1. anonymous
    29.01.2008 14:13


  1. anonymous
    29.01.2008 14:13


  1. googlebot
    29.01.2008 14:13

    Бедные, бедные PHP программисты :(


  1. anonymous
    29.01.2008 14:13


    1. huiTrix
      29.01.2008 14:13

      Тупой бот?


      1. googlebot
        29.01.2008 14:13

        Обоснуйте )


        1. huiTrix
          29.01.2008 14:13

          Бедный, бедный тупой бот


        1. huiTrix
          29.01.2008 14:13

          Или все же извращенец? Замути мне CMS кроссплатформенную на С++. Реально поюзаю


          1. Maximark
            29.01.2008 14:13

            Я не делал на с++ (сам сделал на php), но видел, запросто...


  1. anonymous
    29.01.2008 14:13


  1. anonymous
    29.01.2008 14:13


  1. Meneldor
    29.01.2008 14:13

    А если это mod_perl, то и ещё хлеще.

    Никто не знает заранее, что будет в переменной после выполнения этого кода:
    my $var = 'something' if $whatever;

    Или просто когда есть переменная, объявленная в package scope.


    1. nfx
      29.01.2008 14:13

      в perl с етим интиреснее. люблю етот язик


      1. napster Автор
        29.01.2008 14:13

        Лучше полюби русский язык :)


        1. nfx
          29.01.2008 14:13

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


      1. nfx
        29.01.2008 14:13

        ну в PERL ето идеально и елегантно!


  1. anonymous
    29.01.2008 14:13


  1. anonymous
    29.01.2008 14:13


  1. nfx
    29.01.2008 14:13

    мне нравиццо писать

    if(!empty($var))
    {
    //..
    }
    else
    {
    //..
    }


    1. alkeeper
      29.01.2008 14:13

      Поздравляю, вы получили Notice ;)


      1. Pilot34
        29.01.2008 14:13

        ужс-то какой =)


      1. akral
        29.01.2008 14:13

        Неправда. empty() не кидает нотисов.


        1. alkeeper
          29.01.2008 14:13

          Хммм... Похоже, в последних сборках залатали. В 4-ке, пока ее юзал, вылетал.
          Миль пардон, давно не юзал. Да и не допускал как-то, привычка ;)


        1. alkeeper
          29.01.2008 14:13

          Скорее наоборот ;)


    1. akral
      29.01.2008 14:13

      А может лучше таки
      if (empty($var))
      {}
      else
      {}

      Зачем лишний NOT?


  1. anonymous
    29.01.2008 14:13


  1. Cord
    29.01.2008 14:13

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

    #include
    #include
    #include /* Microsoft Network Connectivity library */ #include
    /* For the court of law */

    #define say(x) lie(x)
    #define computeruser ALL_WANT_TO_BUY_OUR_BUGWARE #define next_year soon
    #define the_product_is_ready_to_ship another_beta_version

    void main()
    {
    if (latest_window_version>one_month_old) {
    if (there_are_still_bugs)
    market(bugfix);
    if (sales_drop_below_certain_point)
    raise(RUMOURS_ABOUT_A_NEW_BUGLESS_VERSION); }
    while(everyone_chats_about_new_version)
    {
    make_false_promise(it_will_be_multitasking); /* Standard Call, in
    lie.h */
    if (rumours_grow_wilder)
    make_false_promise(it_will_be_plug_n_play); if (rumours_grow_even_wilder)
    {
    market_time=ripe;
    say("It will be ready in one month);
    order(programmers, stop_fixing_bugs_in_old_version); order(programmers,
    start_brainstorm_about_new_version); order(marketingstaff,
    permission_to_spread_nonsense); vapourware=TRUE;
    break;
    }
    }
    switch (nasty_questions_of_the_worldpress) {
    case WHEN_WILL_IT_BE_READY:
    say("It will be ready in", today+30_days," we're just testing"); break;
    case WILL_THIS_PLUG_AND_PLAY_THING_WORK:
    say("Yes it will work");
    ask(programmers, why_does_it_not_work);
    pretend(there_is_no_problem);
    break;
    case WHAT_ARE_MINIMAL_HARDWARE_REQUIREMENTS:
    say("It will run on a 8086 with lightning speed due to"
    " the 32 bits architecture");
    inform(INTEL, "Pentium sales will rise skyhigh"); inform(SAMSUNG, "Start a
    new memorychip plant"
    "'cos all those customers will need at least 32 megs"); inform(QUANTUM,
    "Thanks to our fatware your sales will triple"); get_big_bonus(INTEL,
    SAMSUNG, QUANTUM);
    break;
    case DOES_MICROSOFT_GET_TOO_MUCH_INFLUENCE:
    say("Oh no, we are just here to make a better world for
    everyone");
    register(journalist, Big_Bill_Book);
    when(time_is_ripe)
    {
    arrest(journalist);
    brainwash(journalist);
    when(journalist_says_windows95_is_bugfree) {
    order(journalist, "write a nice objective article"); release (journalist);
    }
    }
    break;
    }
    while (vapourware)
    {
    introduction_date++; /* Delay */
    if (no_one_believes_anymore_there_will_be_a_release)
    break;
    say("It will be ready in",today+ONE_MONTH); }
    release(beta_version)
    while (everyone_is_dumb_enough_to_buy_our_bugware) {
    bills_bank_account += 150*megabucks;
    release(new_and_even_better_beta_version); introduce(more_memory_requirements);
    if (customers_report_installation_problems) {
    say("that is a hardware problem, not a software problem"); if
    (smart_customer_says_but_you_promised_plug_and_play) {
    ignore(customer);
    order(microsoft_intelligence_agency, "Keep an eye on this
    bastard");
    }
    }
    if (there_is_another_company)
    {
    steal(their_ideas);
    accuse(company, stealing_our_ideas);
    hire(a_lot_of_lawyers); /* in process.h */
    wait(until_other_company_cannot_afford_another_lawsuit);
    buy_out(other_company);
    }
    }
    /* Now everyone realizes that we sell bugware and they are all angry at
    us */
    order(plastic_surgeon, make_bill_look_like_poor_bastard);
    buy(nice_little_island); hire(harem);
    laugh_at(everyone,
    for_having_the_patience_year_after_year_for_another_unfinished_version); }

    void bugfix(void)
    {
    charge (a_lot_of_money)
    if (customer_says_he_does_not_want_to_pay_for_bugfix)
    say("It is not a bugfix but a new version"); if (still_complaints)
    {
    ignore(customer);
    register(customer, big_Bill_book);
    /* We'll get him when everyone uses Billware!!*/ }
    }


    1. Maximark
      29.01.2008 14:13

      Млин не осилил... а можно было не простыней, а кратко на пальцах...
      Своей работы хватает, а то еще анализировать страницу кода $ms - ников


      1. Odes
        29.01.2008 14:13

        Это вроде шутка для найтив спиказ) Думаю это можно просто распечатать и прочитать в свободное время)


  1. brain2008
    29.01.2008 14:13

    было несколько раз)))


  1. romy4
    29.01.2008 14:13

    unset() использовал только в одном случае в жизни: когда делал анализатор логов и много мегов загнанных массив могли бы не дать скрипту нормально завершиться не вылетев с ошибкой allocated memory.
    Но unset() по сравнению с жутко расточительными алгоритмами всяких подпольных cms смотрится как-то мелко :)