8 июля 01 года


          Берем сардельку. Режем вдоль пополам. Кладем две половинки рядом, плоской стороной вверх. Кладем ломтики сыра, мажем майонезом, чуть поливаем кетчупом. В микроволновку до обтекания сыра. Это, конечно, не "омле де ля пассьон", но как fast food вполне катит.
          Иногда напишешь текст - и не знаешь, а стоит его вообще "в сеть" выкладывать, или оставить "для вутреннего применения". Вроде, раз уж написан - не пропадать же добру, с другой стороны - каким-то это эксгибиционизмом попахивает... А, ладно. Другие и не такое выкладывают, значит и мне можно. И заранее прошу прощения читателей, что отошел от обычной компьютерно-сетевой тематики :-)
         

"Я Вас любил. Ещё, быть может?"


Being the one - is just like being in love. No one can tell you you're in love, you just know it.
(c) The Matrix

          Всегда завидовал влюбленным парочкам, летающим на крыльях любви, и не обращающим внимание на окружающий мир. Посмотрите вокруг - таких много, и если ты сам по несчастливому стечению обстоятельств оказался не в их числе - им действительно хочется завидовать. Они знают, что любят, и именно потому так счастливы. Если бы они были не уверены, сомневались - разве могли бы они быть так счастливы?
          "Матрицу" смотрели, похоже, все. В кинозале с "долбаным сюрраундом" или на жеваной пиратской кассете - но найти кого-то, кто не смотрел матрицу - уже тяжело.
          Помним эпизод, когда Нео привели к Пифии, чтобы узнать, "избранный" он, или так, способный студент-практикант? "Быть избранным - это все равно что быть влюбленным. Никто не может сказать тебе, что ты любишь - только ты сам, ты просто знаешь это. Или знаешь, что это не так".
          Многие пытались дать определение, что же такое любовь, и как отличить "настоящую" любовь от "ненастоящей". Все эти определения, вроде "любовь равно дружба плюс секс" или "любовь - это когда готов на всё", кроме очевидной упрощенности ("маша+миша=любовь") имеют один мелкий недостаток - они не работают. "Дружба плюс секс" не дают в результате любовь, "готовность на всё" трудновато проверить на практике, да и примеров, когда после этого "всего" от того, что считали любовью оставалось лишь что-то вроде брезгливости - их есть. Приводить не буду, чтобы не захламлять и без того длинный текст.
          Вот и остается пользоваться старым методом, известным еще до "матрицы", но очень хорошо озвученным именно там. Любовь - это когда ты знаешь, что влюблен. А когда знаешь, что не влюблён, или не знаешь, влюблен или не влюблен - ну, значит, не любовь, а дружба, плюс-минус секс, или еще что-нибудь не такое возвышенное. Но если уж знаешь - то это точно оно, высокое и вечное, и, полетав на крыльях этого высокого и возвышенного, влюбленные летят в загс и заводят детей (или заводят детей, и только потом задумываются о записи акта гражданского состояния - примеров масса), а через год-другой выясняется, что пифия была неправа, что чувства полёта и всего такого - недостаточно, и что "эта дура не знает ничего кроме развлечений а этот козел опять потратил всю зарплату и вернулся домой в полпервого ночи". И это - любовь?! Даа, "это любовь, да-да, конечно"...
          Вспомним Матрицу. Что ответил Нео на вопрос пифии? Напомню. Он ответил "нет, я не избранный". "Извини, парень, но ты - не избранный. У тебя есть дар, но - похоже ты ждешь чего-то". Он не был уверен. Он не был уверен - вполне законное чувство для тех, кто привык обходиться без сильных чувств в своей жизни, и чаще пытаться понять умом, чем почувствовать сердцем - а поскольку "в учебнике" сказано, что раз не уверен - значит, не любовь... в смысле, не "избранный", то... все сомнения - в пользу обвиняемого.
          Чем всё закончилось мы тоже помним. Избранным он таки оказался, хотя и поверил он в это только после хорошей встряски, пифия оказалась не права (ну... не совсем права), а наши победили. Ну, это ведь кино - в нем положено, чтобы наши побеждали а главный герой с главной героиней уходили вдаль по побережью моря, держась за руки... впрочем, стоп, это уже не матрица.
          В жизни редко бывает как в кино. Любовь - слепа, и даже сильному чувству доверять безоговорочно - не стоит. Потом может выползти что-то, чего не заметили за розовыми очками настоящей и возвышенной, и это "потом" может оказаться слишком поздно. Людям, обдумывающим житьё, тем более - решающим, с кем прожить жизнь, а не с кем провести лето или с кем переспать эту ночь, свойственно сомневаться, а поскольку сомнения трактуются известно как - вполне перспективные с точки зрения долговременных и семейных отношений парочки разваливаются - ведь если нет того самого, про которое знаешь и которое не может ошибиться - значит, что-то здесь не так, и надо искать кого-то другого. А потом ещё другого. А потом третьего, но это тоже не то, а потом этот женился, тот замужем, там роман с твоим же соседом и ты точно не у дел, пятый на тебя откровенно "забил", а тебе уже далеко "за тридцать", и уже видишь, что первый (или второй, или пятый-десятый) вариант были бы лучше, но... понадеялись в свое время на то самое определение, которое не врёт, а оно и не сработало. Или сработало, но не помогло - уже поздно. Не в кино ведь живем, полного и безоговорочного счастья в конце первой серии никто не обещал.
          И сколько таких, интересно, ходят по миру, ждут чего-то особенно высокого и чистого, и не верят в то, что есть под боком, поскольку "что-то не то"? А ведь - "что имеем - не храним, потерявши - плачем".
          А сколько семей поверили в это "что-то", и теперь клянут жену-мегеру и мужа-алкоголика?
          А сколько людей - особенно молодых и закомплексованных - внушили себе, что вон та девчонка с косичками - это и есть оно самое (просто потому, что к другим подойти боишься - язык к гортани липнет, и наблюдаются прочие психосоматические расстройства бихевиористического плана)?..
          А сколько вокруг других осожнений из за того, что "being the one - is like being in love, и ты просто знаешь это"?... Не сосчитать.
          Всё-таки любовь, на мой предвзятый взгляд, не должна состоять только из чувства, "высокого, чистого и яркого". Она должна быть осознанной. Она должна быть проверена - и временем, и, как это ужасно бы ни звучало - рассудком. А "чистое и яркое" может и обмануть. Причем в обе стороны.
          По настоящему счастливы наверно даже не те, кто знает, что любит, а те, кто об этом вообще не задумывается, и просто живет. Без проверки чувств и прочей подобной фигни. Жаль, не все так умеют, и не всегда эта дорожка (когда просто живешь как живется) приводит куда надо. Живешь себе живешь, а он хоп! и женится на твоей подруге...

          ...Девчонки и мальчишки, прежде чем брать пример с пифии и говорить кому-то "извини, парень, но..." - задумайтесь, действительно ли "но", и не окажется ли, что об этом "но" лет через десять вы будете вспоминать как о самой большой ошибке в своей жизни? Конечно, в восемнадцать лет таких проблем нет - всё еще впереди. А в двадцать пять? А в тридцать? А в сорок пять? Передумать и откатиться назад - получится не всегда.
         
          Ладно, достаточно я вас заморочил, больше не буду - и продолжим наконец наш "околокомпьютерный" выпуск :-)
          Кстати, "зелень" в фильме матрица - это не "ляп" пиратов, катавших компакт, а вовсе даже режиссерский ход. Все, что происходит в матрице - чуть зеленовато, а все, что происходит в реальном мире - освещено чуть синеватым светом. Я, кстати, синеватости не замечал, пока не прочитал об этом в интернете (сцен в "реальном мире" не так уж и много), и ругал пиратов. А зря.
         

От: Anton
О чем: www & MS Word
Кстати Excel тоже неплохо url'ы открывает :)

          Проверил. Боже! Красота неземная, особенно в попытке разбора экселем тэга <table> :-)
          И, возвращаясь к isdigit('д'). Во-первых, спасибо всем, принявшим участие в обсуждении - сам бы я запутался не так быстро. Во-вторых...
          isdigit() обычно реализуется как макрос (для скорости - одной рукой изобретают strlen(), strcat() и подобные функции, бегающие по всей строке в поисках \0, другой - оптимизируют isdigit() - странные люди). Но никто, конечно, не гарантирует, что оно реализовано как макрос в конкретном компиляторе - и есть компиляторы, где is*() - функции. Там могут быть свои интересные эффекты, но это отдельная история.
          Именно в cygwin (gcc) - isdigit() реализован макросом. Макросом в стиле ((some_array+1)[(unsigned)(c)]&some_mask). В some_array[] побитно разрисовано, кто чем является (вроде бы инициализируется в runtime в зависимости от локали), some_flag - соответственно, проверяет, является ли наш символ тем, что мы хотим (цифрой, например).
          Единичка к array добавляется потому, что, например, "символ" EOF обычно (и cygwin - не исключение) определен как -1. Чтобы не выйти за границы массива - к нему добавляется единичка.
          Преобразование к unsigned не изменяет двоичного представления в случае (int)->(unsigned int), а поскольку int на интелевой архитектуре имеет тот же размер, что и "указатель" - при "-1" происходит вылет за границу массива, "заворот", и попадание одратно с другой стороны - как результат, корректная работа для c==EOF.
          В случае "с", заданного как unsigned char (или приведенного к типу unsigned char) - приведение к uint делается добиванием нулями слева, и макрос работает корректно.
          В случае "с" имеющего тип int (что, вообще-то, является чуть ли не "рекомендованым" местом для хранения символа - ряд функций ввода-вывода возвращают тот же EOF как -1, что вообще говоря, в случае char, совпало бы русской буквой "я" в 1251 кодировке), и символа, лежащего в младшем байте int'а - int приводится к uint без изменения двоичного представления, далее - см. выше.
          В случае же "с", имеющего тип char (а с чего бы вдруг я должен использовать для хранения characters что-то отличное от char??), char (который signed char) приводится к uint (который unsigned int) довольно странным методом - с "расширением знака" до нужного размера (т. е. фактическим переводом signed char в signed int), а затем - переводом signed int в unsigned int (то есть, оставлением бинарного представления как есть). Как результат - char, заданный константой (тот же 'д'), преобразуется в отрицательный int (при расширении знака), а далее... как и с EOF - переполнение, заворот, но - до массива мы уже не долетаем, и читаем информацию из "левого" места. В лучшем случае имея неработающий макрос, в худшем - access violation.
          Самое интересное - что простым образом бороться с этим безобразием (я имею в виду - написать макрос как-то по другому) как бы и непонятно как. Приводить к uchar - нельзя, тогда EOF окажется буквой. Приводить к int - тем более. Вообще не приводить - неявно приведется к int...
          Другая фигна в том, что если не вдаваться в тонкости того, как оно работает - макрос выглядит правильным - "символ" приводится к беззнаковому типу (чтобы не "вылететь" за массив "слева"), к беззнаковому int - чтобы отработался символ EOF...
          Так что вопрос у меня есть. К знатокам языка Си. Тот факт, что в cygwin (signed char) переводится в (unsigned int) с расширением знака (то есть, как в signed int) - это есть специфицированная особенность языка, особенность gcc, особенность cygwin'а, или просто глюк? Мне почему-то кажется, что глюк. С другой стороны - поскольку скорее всего глюк этот отлично известен разработчикам gcc - он наверняка описан как "фича" (и где-нибудь используется, не иначе). GCC - это не абы какой компилятор с улицы, это один из наиболее широко используемых компиляторов языка Си, поэтому по нему я имею право составить впечатление и о языке в целом. А впечатление, извините...
          Мне нравится Си. Мне очень нравится Си. Я до сих пор считаю его лучшим языком для "системного" низко- и средне-уровневого программирования. С одним (точнее - уже с двумя) исключениями.
          Встроенная работа со строками (char *), как и сами строки, никуда не годятся. Неэффективны (для определения длины строки нужно сканировать всю строку), ограничены (символ \0 трактуется как конец строки - это, вообще-то, резко ограничивает те места, где можно применять Сишные строки), небезопасны (даже и комментировать не хочется. buffer overrun - в множестве мест libc, от известных gets или strcat до не столь известных scanf или sprintf).
          Кроме того - встроенные макросы работы с символами - с символами работают неадекватно, зато работают с int. Поскольку часть функций libc возвращают int, а не char, и на это разработчики заложились. А на то, что character data люди хотят хранить в char, а не в int или double - на это заложиться не догадались. В общем, если бы в Си не было строк вообще - и то было бы лучше...
          Заранее отвечу на два возражения.
          - в Си нет gets или strcat - это всё функции libc, а libc к языку имеет косвенное отношение!
          - готов принять это к сведению, как только мне покажут более-менее функциональную программу (я уж не буду намекать, что "программа по подсчету числа Пи" должна это число как-то вывести наружу), не использующую libc, но написанную "на Си" - т. е., собирающуюся большинством компиляторов.
          - в Си нет строк! Строковые функции лежат в libc (см. выше), а char* - не более чем "указатель на char", строкой формально не являющийся, хотя и часто использующийся.
          - поверю не раньше, чем мне расскажут, чем же, если не строкой, является понимаемая компилятором как const char* конструкция вида "произвольный текст в кавычках". Часть языка? Да! Строка? Хм.
          В Калужской области год продавали фальшивую туалетную бумагу, но жалоб не было [http://www.lenta.ru/oddly/2001/06/15/toilet/]. Фальшивая бумага ничем не отличалась от настоящей, но не приносила радости налоговой инспекции.



Оригинал страницы находится на http://dibr.nnov.ru/issue080701.html.(с) DiBR
При перепечатке ссылка обязательна. <<  *  >>