tag:blogger.com,1999:blog-81399750976039074702024-02-20T04:49:47.196+03:00static_cast[... хрупки завитушки двоичного кода...]Andrew Abramovhttp://www.blogger.com/profile/06722852809581083456noreply@blogger.comBlogger7125tag:blogger.com,1999:blog-8139975097603907470.post-30122606947664794182012-02-03T10:12:00.003+04:002012-02-03T10:44:46.826+04:00«Протокол Цикла»<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<h2 style="border-bottom-width: 0px;">
или взгляд на проблему обработки информации</h2>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimsKFpG3k8nUgHwEa_5pPL21v7qq1qb5-TCv5O6f7i3LpfUjW5IhVPwdx8UWuiQSgiIzuACj8CmZnIrIFu4DSUmdUQNDMXOSqvkXxYLjOb98O-75nmEACIDbqsyu5y7US6z2QuYhroJMk/s1600/AI_robot_small.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimsKFpG3k8nUgHwEa_5pPL21v7qq1qb5-TCv5O6f7i3LpfUjW5IhVPwdx8UWuiQSgiIzuACj8CmZnIrIFu4DSUmdUQNDMXOSqvkXxYLjOb98O-75nmEACIDbqsyu5y7US6z2QuYhroJMk/s1600/AI_robot_small.jpg" /></a>Информационные потоки нарастают. Море информации - безгранично и продолжает расширяться взрывными темпами. Для того, чтобы ориентироваться в имеющемся хаосе, извлекать из него пользу, упорядочивать его хотя бы частично и на ограниченных пространствах необходимы техники и технологии.<br />
<br />
Первые — определяются сознанием индивида. Вторые — предоставляют индивиду необходимый инструментарий. Однако, эти понятия взаимосвязаны. Без техник невозможно сформировать технологию и создать инструментарий. Без технологии, без конкретного воплощения идеи в конечный процесс, техники остаются лишь более-менее интересной теорией, игрой разума. Сплав же техник технологий выводит процесс на новый виток. Позволяя эффективно воспринимать и преобразовывать информацию, извлекать скрытые и не очевидные смыслы, строить пригодные для восприятия отображения. <br />
<a name='more'></a> Человек познает мир посредством создания его копий. Спектр результатов реализации данного стремления лежит в пределах от создания миров, которые совершенно не похожи на реальность (“нереальности”), либо копий, “фотографически” воспроизводящих эту реальность. Арсенал техник и технологий создания этих копий также весьма широк. Человечество за всю свою сознательную историю придумало сотни способов “закреплять” реальность в визуальном образе, символе, знаке, звуке и даже запахе. Мотивацию этого рассматривать в текущем контексте бессмысленно. Явление имеет место, бороться с ним бесполезно, потому как любой открывший рот и назвавший дерево деревом уже совершил акт копирования реальности. Результат — сотни тысяч артефактов искусства и не менее впечатляющий ряд философских и других систем, а также океан менее значимой информации. <br />
<br />
Итак, мы имеем некоторую картину мира. Правильным образом построенная, она является не просто отражением реальности, но и становится инструментом познания, выделяя в анализируемом массиве информации значимые фрагменты, расставляя акценты, скрывая то, что может отвлечь от решения поставленной задачи. Правильно сформированная модель, использующая необходимые техники и технологии позволяет взглянуть на мир под требуемым углом. Картина, фильм, рекламная или политическая статья - все это копии мира нацеленные на решение конкретных задач. Копии-инструменты. <br />
<br />
Однако, объективно-существующая реальность подвижна и изменчива, и те, кто пытался создавать логически завершенные и выверенные картины мира, рано или поздно запутывались во вновь возникающих петлях, замкнутых циклах и разомкнутых цепях бесконечной длины. Следствия становились причинами, и тогда охотник и добыча менялись местами. И, уже подчас сами того не замечая, ловцы последовательностей начинали строить вокруг себя защиту, дававшую им возможность спрятаться от новых парадоксов, необъяснимых событий, фактов, которые упорно не хотели влезать в те рамки, в которые их хотели запихнуть. Начав с крестового похода за истиной, эти создатели заканчивали в удаленных от торных дорог скитах, на разный лад повторяя одну и ту же фразу: “Я знаю, что я ничего не знаю”. Создание завершенной картины мира невозможно. Истина не есть абсолют, достигнув который один раз, можно сказать, что это и есть корень причин. Подобно буддистской мандале из разноцветного песка, которую монахи разрушают сразу после того, как закончена работа, об открытой сегодня истине стоит забыть, когда солнце взойдет на следующее утро. <br />
<br />
То есть “сотни тысяч артефактов искусства и не менее впечатляющий ряд философских и других систем” уже не являются актуальными на сегодняшний день и час. Они были верны для какого-то периода времени, который уже давно прошел, и для какого-то участка в пространстве. Да, возможно, те закономерности будут “работать” и для других подобных ситуаций, но как говорил Гераклит: “Нельзя вступить в одну и ту же реку дважды”. Истина, открытая вчера вечером в десять часов на восемь утра следующего дня, — уже ложь. Картину мира каждый момент нужно воссоздавать заново. <br />
<br />
Отсюда следует необходимое требование к инструменту познания — он должен быть динамическим. Мало толку создавать пусть и идеальные, но не актуальные, практически не применимые отражения. Если рассматривать не работу художника, а работу аналитика, то копия действительности должна иметь необходимую динамику, сходную с динамикой изучаемого процесса или явления. В этом случае построенная модель выдает результаты, которые являются гораздо более полезными, более близкими к моделируемой реальности. Конечно, в случае произведения искусства, даже статичная модель полезна. Но она полезна в силу других решаемых задач. И даже в этом случае, динамичные модели более успешны. Сравним картину и кино, статую и спектакль. Динамика, внутренний двигатель — вторая основа моделирования реальности. <br />
<br />
Человеческое сознание, как массив связанных между собой воспоминаний, также является копией реальности, только гораздо более сложной и комплексной. По сути, любой текст или живописное полотно являются небольшим фрагментом той картины мира, который каждый из нас носит в своей голове. Вбирая в себя факты реальности и устанавливая между ними связи, каждый из нас создает свой микрокосм, свою картину мира, которая является лишь небольшой частью того, что мы видим вокруг. <br />
<br />
Таким образом, человеческий мозг — это готовый инструмент аналитика, подготовленный эволюцией для решения задач и моделирования ситуаций. Любой техника и технология, созданные человеком, являются лишь очередной копией, моделью его собственного сознания. Однако, качественно построенная модель в данном случае, несомненно, полезна. Она позволяет расширить спектр решаемых задач за счет более грамотного использования доступных ресурсов. Инструмент может принимать на себя рутинную работу, служить дополнительными фильтрами, организовывать и упорядочивать исходный информационный массив, освобождая сознание оператора для выполнения финальной, наименее формализуемой части работы То, что принято называть творчеством и интуицией начинает опираться на подготовленный фундамент, становится более эффективным. <br />
<br />
Любой процесс познания и обработки информации вне зависимости от того, кем или чем он исполняется, будь то человеческий мозг или механизированная модель, можно описать циклом, сходным по своей структуре с циклом дыхания. Ведь в текущей действительности мегаполисов и корпораций обработка информации не менее значимый процесс, чем дыхание. В этих сходных процессах можно выделить две фазы и две точки перехода между этими фазами. Вдох-выдох и паузы между этими двумя действиями. В так называемой “закрытой фазе” картина мира относительно стабильна. Связи между фрагментами достаточно “жесткие”, решения, которые принимаются, основываясь на этой картине мира, адекватны окружающей ситуации. Но мир не стоит на месте. Каждый день приносит новые потоки информации. Существующая картина мира срабатывает как фильтр, вбирая в себя те фрагменты информации, которые не противоречат ей, и оставляет “за скобками” то, что противоречит. Таким образом, формируется некий массив неупорядоченной информации, который не входит в жесткую картину мира. Если этот массив не достигает “критической массы”, находясь в относительном равновесии с “жесткой” картиной мира, то сознание человека или модель реальности так и остается в “закрытой фазе”. Состояние стабильно. Если же этот массив растет, то тут возможны два варианта развития событий. В отрицательном сценарии жесткая составляющая становится еще жестче, и противоречащий ей массив информации просто отрицается. В положительном сценарии процесс обработки информации переходит в “открытую фазу”. <br />
<br />
В “открытой фазе” старая картина разрушается на несвязанные фрагменты и начинается процесс построения новой картины мира из осколков прежней и новых фрагментов, которые ранее не могли быть включены в жесткую модель. “Свержение старых идолов”, “переоценка ценностей”, “формирование нового мировоззрения” - все это смысловые синонимы “открытой фазы” применительно к человеческому сознанию. Система обработки находится как бы в дрейфе, формируя новые связи между фактами и нарабатывая новые пути поведения в новых условиях. Происходит переобучение. Эта фаза также может стабилизироваться или иметь отрицательный и положительный сценарии развития. В отрицательном сценарии новая картина мира так и не сформировывается. Для человека это может приводить, в крайнем случае, к потере способности принимать какие-либо решения, адекватно вести себя. Для механической модели - это означает списание, ошибочность заложенных в неё двигателей. В положительном сценарии формируется новая картина мира. Далее наступает следующая фаза цикла. <br />
<br />
Переход между фазами может быть плавным, старая картина мира постепенно сменяется на новую. В отдельных случаях смена фаз может происходить очень быстро. Такие точки перехода между фазами имеет смысл называть экстремумами, пиковыми состояниями сознания. Переход от открытой к закрытой фазе для человека может называться “моментом истины”. Картина мира в “моменте истины” полностью адекватна какой-то определенной части макрокосма, частицы мироздания, которая окружает модель. Человек, на какой-то момент времени, становится тождественен осознаваемой вселенной. Переход из закрытой фазы в открытую фазу сходен с “конусом тишины”, образующимся за самолетом, перешедшим звуковой барьер. Старая картина мира сломана и уничтожена. Ничего нет. Любое принимаемое решение равнозначно по своим предпосылкам. <br />
<br />
С экстремумами связаны так называемые нейтральные стагнации цикла, или остановки в точках экстремума. Классическую буддистскую нирвану можно трактовать как нейтральную стагнацию в “конусе тишины”, состояние полного разрушения личности, которое фиксируется на неопределенно долгий период времени. Пророки христианства, наоборот, являют собой пример остановки в “моменте истины”. Достигнув “момента истины”, получив “откровение Господне”, пророки фиксируются на этой картине мира, проповедуя об истине, которая открылась им и является неизменной и последней в инстанции. Это - стагнация в противоположной точке цикла. Несмотря на то, что точки качественно полярны, человеческие переживания “экстремумов” тождественны, равнозначны. В случае “момента истины” макрокосм осознаваемой вселенной тождествен микрокосму человека. В случае “конуса тишины” личность отсутствует, микрокосм, внутренняя картина мира разрушена, существует только макрокосм доступной вселенной. Моменты разрушения старой системы представлений через “конус тишины” и создание полной картины мира являются главными моментами в духовной жизни человека. Это пики, точки, в которых личность полностью гармонична с окружающим миром. В первом случае эта гармония происходит от полного совпадения внешней и внутренней картины, во втором - поскольку личность является пустотой и существует только мир, происходит совпадение пустоты и вселенной. Каждый новый виток этой спирали приводит к образованию более полной картины мира и возрастанию творческих способностей. Нормальным циклом может считаться последовательная и ритмичная смена фаз без частого прохождения через точки экстремумов. Человеческая психика не может постоянно находиться в напряженном состоянии, которым характеризуется “открытая” фаза. Периоды отдыха так же необходимы, как и периоды напряжения. Поэтому пребывание в “закрытой” фазе необходимо. Безусловным негативом считаются отрицательные сценарии фаз, которые можно отнести к сфере психических отклонений. Нейтральные стагнации тоже не приветствуются. <br />
<br />
Однако, инструментальные модели действительности обладают свойствами, сходными с человеческим сознанием, если рассматривать их в контексте цикла обработки информации. Нормальное функционирование модели предполагает оперирование в “закрытой фазе”, результат соответствует представлениям, заложенным в модель. Данное предположение наиболее очевидно демонстрируется алгоритмической моделью. В этом случае все данные, не укладывающиеся в жесткую компоненту картины мира, провоцируют ошибку исполнения алгоритма или, как минимум, игнорируются. В случае с деревьями решений, новая информация может расширять и уточнять картину мира, но только в том случае, пока не вступает в жесткое противоречие с ней. Для нейронных сетей новая информация так же воспринимается в случае непротиворечивости, усиливая и уточняя наработанные связи. Основная проблема инструментальных моделей заключается в отсутствии переходов между фазами. При накоплении критического объема противоречивой информации статическая модель гибнет, переставая генерировать результат адекватный изменившемуся окружению. Отсутствие внутренних двигателей упрощает модель, сокращая время на её конструирование. Но в противовес этим очевидным плюсам на другую чашу весов ложится сокращенный жизненный цикл модели, и сложность её поддержки, заключающаяся в необходимости отслеживать приближение к критическому порогу, проводить своевременное принудительное переобучение, повторяющиеся затраты времени на введение модели в рабочий цикл. Построение модели, для которой переобучение не является фатальным состоянием, несомненно, более сложная задача, но балансируя на эмпирической грани полезности, не стоит забывать смотреть вперед. Динамическая модель может отработать гораздо дольше и эффективнее, и затраты на ее разработку становятся аналогом инвестиций в образование человека. Формирование технологии построения динамических моделей в конечном итоге приведет к снижению стоимости каждой новой копии в силу эффекта конвейера. <br />
<br />
Данный текст, в свою очередь, тоже является копией реальности, имевшей место быть определенное время назад в каком-то ограниченном физическом пространстве. Скорее всего, он уже устарел, и не является неоспоримым даже для первоначального фрагмента, не говоря уже о фрагментах реальности, в которых существуют читатели. Истина, по-прежнему, где-то рядом. Мандалу необходимо начинать строить заново.
<br />
<hr />
<div class="sdfootnote">
Использованы фрагменты
текстов “гейткипеского цикла” Станислава
Шульги.</div>
</div>Andrew Abramovhttp://www.blogger.com/profile/06722852809581083456noreply@blogger.com1tag:blogger.com,1999:blog-8139975097603907470.post-83690157374988616092011-08-19T12:28:00.001+04:002011-08-19T12:29:32.506+04:00Корпорация добра<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-UNPTF-twftdLoVyZgXsCXwq6OiKAICPQVaiwFij1G_jzuT73nFJZ9nZB5exluP8FACdTxiDGZ8ZykEJIOiWnwjmIw_UNTjQKVDtU_eW7twXGS3tHsUgA5EjF4tTLxDbCmYORF0djXFA/s1600/google_andr.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-UNPTF-twftdLoVyZgXsCXwq6OiKAICPQVaiwFij1G_jzuT73nFJZ9nZB5exluP8FACdTxiDGZ8ZykEJIOiWnwjmIw_UNTjQKVDtU_eW7twXGS3tHsUgA5EjF4tTLxDbCmYORF0djXFA/s1600/google_andr.jpg" /></a></div>
Как известно, Google борется за организацию информации: <a href="http://goo.gl/ekOk6">http://goo.gl/ekOk6</a>. Прямо первой строкой, миссия компании.<br />
Чуть ниже, в "10 принципах", правда, упоминается и второй
(неофициальный, и "неофициально первый") девиз Google: "Don't be evil".
Кстати, рекомендую сравнить:<br />
Шестой пункт из "10 принципов"<br />
<ul>
<li>
английский вариант: <strong>You can make money without doing evil.</strong> (<a href="http://www.google.com/about/corporate/company/tenthings.html">http://www.google.com/about/corporate/company/tenthings.html</a>)</li>
<li>
русский вариант: <strong>Бизнес должен быть полезным для всех</strong> (<a href="http://www.google.ru/intl/ru/about/corporate/company/tenthings.html">http://www.google.ru/intl/ru/about/corporate/company/tenthings.html</a>)</li>
</ul>
Разница вполне заметна.<br />
<br />
А теперь - ближе к делу. Конкретно о поиске информации, социльных сетях и доброте душевной.<br />
<br />
<a name='more'></a><br />
Есть у меня телефончик вполне известной компании с операционной
системой от Google. И есть там, конечно же, приложение для управления
списком контактов. И в условиях современного мира, это приложение,
конечно же, умеет не только хранить телефонные номера на SIM карте, но и
многое другое. В частности, синхронизацию с почтой от Google и
популярными социальными сетями, такими как Twitter и Facebook.<br />
Далее - пошаговый процесс, причиной которому послужило желание добавить к контакту "авторскую" аватарку.<br />
<br />
<ol>
<li>
Имеем контакт в телефоне, который содержит имя-фамилию и телефонный номер.</li>
<li>
Спрашиваем у владельца его почтовый адрес от Google. (Ибо, по словам контакта, там и есть аватарка, которая ему нравится)</li>
<li>
Добавляем к контакту почтовый адрес, и синхронизируем телефон с аккаунтом Gmail.</li>
<li>
Видим аватарку, радуемся!<br />
...</li>
<li>
Замечаем, что телефон предлагает "ссылки" для этого контакта.</li>
<li>
Открываем, видим: этот же человек в Twitter и Facebook.</li>
<li>
После подтверждения "связи" этих аккаунтов в записной книжке у
контакта появляется личный e-mail, о котором я доселе не знал. Причем,
именно с пометкой "личный".</li>
</ol>
То есть, с задачей поиска и организации информации Google справляется
на отлично! Последующая проверка показала, что одна из социальных сетей
при определенных условиях действительно показывает данный e-mail.<br />
А вы говорите - DataMining! Технологии и исследования! Отслеживание социальных связей! Распилы бюджетов!<br />
Все проще - Android все сделает за вас. Только укажите ему: про кого
искать, и продолжайте пить свой кофе. Не нужны дорогие разработки и
прожирающие гранты команды исследователей. Корпорация добра спасет нас
всех. Если, конечно, мы не будем слишком осторожны оставляя следы в
интернетах.<br />
<strong>PS:</strong> я по-прежнему люблю и уважаю Google, как компанию,
которая отлично делает то, за что взялась, и кроме того, прилично
двигает в перед информационные технологии.<br />
<strong>PPS:</strong> не, ну правда! чего мы велосипеды изобретаем?<br />
<strong>PPPS:</strong> навеяно всяческими историями о сливах в поисковых системах.<br />
<br /></div>
Andrew Abramovhttp://www.blogger.com/profile/06722852809581083456noreply@blogger.com1tag:blogger.com,1999:blog-8139975097603907470.post-24235054290025545992011-04-08T14:58:00.000+04:002011-04-08T14:58:37.794+04:00Мечтают ли андроиды об электрических овцах?...<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEismXa6caZe2kccnXcuw9nt1lRQRz5d1Fk8X8fgeraG17-tj4bTBJASpgqheKZGsbtkxdsRpyLCoVGTTVOwNhE8tFAld36X557ejlFZG6acQiy2_PtZbI0TJWOBKcDIpolU263p7KD3Mjc/s1600/nhb.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEismXa6caZe2kccnXcuw9nt1lRQRz5d1Fk8X8fgeraG17-tj4bTBJASpgqheKZGsbtkxdsRpyLCoVGTTVOwNhE8tFAld36X557ejlFZG6acQiy2_PtZbI0TJWOBKcDIpolU263p7KD3Mjc/s1600/nhb.jpg" /></a></div>
<div style="text-align: left;">
Собственно говоря, возник вопрос: <span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"><i><span class="Apple-style-span" style="color: #cfe2f3;">а для кого мы создаем программное обеспечение?</span></i></span></div>
<div style="text-align: left;">
<span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"><i><span class="Apple-style-span" style="color: #cfe2f3;"></span></i></span>Естественно, речь идет не о casual ПО, класса текстовых процессоров и компьютерных игр. Я хотел бы рассмотреть целевую аудиторию специализированных программ. Например, из близкой мне области, можно взять широко известные Nmap и Nessus.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Кто этот мифический специалист, использующий данный софт? Каковы его цели и мотивация? Я прекрасно понимаю, что вопросы поставленны слишком обще, и не имеют однозначного универсального ответа. Однако, хотелось бы разобраться...<a name='more'></a></div>
<br />
<div style="text-align: left;">
Вопрос банален, что важнее функционал или интерфейс?</div>
<blockquote>
<span class="Apple-style-span" style="color: #cccccc;"><i>Тратить годы на упрощение системы или то же самое время на совершенствование фильтрующих и генерирующих блоков — примерно такова дилемма.</i></span></blockquote>
<div style="text-align: left;">
На мой взгляд, проблема в "пороге вхождения". Для выборки данных из БД можно использовать красивую систему построения отчетов, интерфейсы a la "wizard", с выбором всех необходимых компонентов и построением связи. А можно предоставить текcтовое поле для ввода SQL выражения. Второй вариант, кстати, предоставляет больше гибкости и возможностей получить необходимый резльтат. Как его оформить? Ну, например, с помощь XSLT. Таким образом, в первом случае оператор должен уметь нажимать кнопки, а во втором знать SQL, XML и хорошо понимать что ему требуется получить.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Очевидно, что второй специалист стоит дороже. Однако, и результат, который вон выдает тоже более ценен. Где находится зона баланса цены и качества? И, кстати, возвращаясь к предыдущей заметки <span class="apple-style-span"><span style="color: black; font-family: "Calibri","sans-serif"; font-size: 13.5pt; line-height: 115%; mso-ansi-language: RU; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">–</span></span> где баланс скорости разработки и удобства использования?</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Общая тенденция ведет к раскручиванию интерфейсов. Nmap обзавелся графикой (Zenmap). Теперь можно запускать сканирование прикасаясь к клавиатуре разве что для ввода цели, и совершенно не вникая в описание программы и её ключей. Надо признать, что просмотр результатов стал более нагляден за счет карты сети и прочих красивостей. Но, ценность информации не выросла. От того, что отчет оформлен в красивую таблицу данных в нем больше не стало. Карта сети <span class="apple-style-span"><span style="color: black; font-family: "Calibri","sans-serif"; font-size: 13.5pt; line-height: 115%; mso-ansi-language: RU; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">–</span></span> плюс, но стоил ли он той разработки?</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Еще один пример: VisualSploit из пакета Canvas. Эксплуатация уязвимостей в стиле drag&drop. Здравствуйте script-kiddies! Зачем учиться, читать, разбираться? Достаточно накидать мышкой компонентов <span class="apple-style-span"><span style="color: black; font-family: "Calibri","sans-serif"; font-size: 13.5pt; line-height: 115%; mso-ansi-language: RU; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">–</span></span> и вот тебе взлом системы.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Может имеет смысл задуматься?</div>
<blockquote>
<i><span class="Apple-style-span" style="color: #cccccc;">система не должна упрощаться. Дружественность системы, то, что проповедовал и внедрял в жизнь Гейтс для своих настольных приложений, было как раз тем, чего они старались и стараются избежать.</span></i></blockquote>
Повышение порога входа приводит к тому, что приходит только действительно целевая аудитория. Чтобы понять что это и как это использовать нужно как минимум понимать зачем оно нужно. Дожен быть сформированный взгляд на проблему. Иначе <span class="apple-style-span"><span style="color: black; font-family: "Calibri","sans-serif"; font-size: 13.5pt; line-height: 115%; mso-ansi-language: RU; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">–</span></span> пшик. Толпы посторонних "пользователей" <span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 18px; line-height: 20px;">– </span>это всего лишь нагрузка на поддержку продукта.<br />
<blockquote>
<span class="Apple-style-span" style="color: #cccccc;"><i>Щелкать в Word по клавишам можно научить любую обезьяну. Чтобы на серьезном уровне освоить последнюю <…>, требуется порядка двух-трех лет. И это при сформировавшемся взгляде на философию системы.</i></span> </blockquote>
А мы ищем таланты. И даже готовы помогать им учиться. Но пусть они мечтают именно о нашей овце.<br />
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span class="Apple-style-span" style="font-size: x-small;">Все приведнные цитаты взяты из произведения Станислава Шульги "Диспетчер Атаки." 2005 год. </span></div>
<div style="text-align: left;">
<br /></div>
</div>Andrew Abramovhttp://www.blogger.com/profile/06722852809581083456noreply@blogger.com0tag:blogger.com,1999:blog-8139975097603907470.post-43791551969885278842011-03-30T15:49:00.001+04:002011-03-30T15:58:54.667+04:00Остановите конвейер! Я сойду!<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXewS8Sf56SA0OzwdrYFLW3QRPSj2T_tx-I8T1x0NjH9zSJ5EzFcMIOOuMrncg5SiOyP8H_ShdNGKcZb-ngeco-t1pFjiDXrTFeSTaFgx0Zg5eLV5dYoHu9ojTopLyjDg32O3_Y5hvkE0/s1600/gates.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXewS8Sf56SA0OzwdrYFLW3QRPSj2T_tx-I8T1x0NjH9zSJ5EzFcMIOOuMrncg5SiOyP8H_ShdNGKcZb-ngeco-t1pFjiDXrTFeSTaFgx0Zg5eLV5dYoHu9ojTopLyjDg32O3_Y5hvkE0/s1600/gates.png" /></a></div>
<div class="MsoNormal">
Хотя, скорее всего, более точной цитатой для выражения
мыслей данной заметки будет<i> "Дайте мне другую лошадь, эта
заканчивается"</i>.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Суть в том, что меня не устраивает современная парадигма
программирования. В корне. Практически, без учета конкретных языков и
технологий. С++, MFC, ATL, C#, WxWidgets, QT - все это и многое другое за
скобками. Программирование решения бизнес-задач не удовлетворяет критериям
стоимости. Оно слишком дорого. Время, ресурсы, в конечном счете <span style="font-family: Calibri, sans-serif; font-size: 11pt;">– деньги…</span> Решение задачи <span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">–</span> слишком дорого. От формулирования идеи и формирования
архитектуры решения до конкретного воплощения проходит слишком много времени.<o:p></o:p></div>
<div class="MsoNormal">
Сколько стоит написать "Hello, World" на
стандартном "промышленном" языке? Минуты 3, если поторопиться. И это
без учета загрузки тяжелых и объемных сред разработки. Неоправданные потери
времени.<o:p></o:p></div>
<div class="MsoNormal">
</div>
<a name='more'></a><br />
<div class="MsoNormal">
Несколько лучше, если брать "языки сверхвысокого
уровня". На Bash или Python <span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">–</span> время измеряется в секундах. Однако, мне
сложно представить полноценное бизнес-приложение на Bash. Тем более, с
использованием GUI. Да, C# и подобные среды упрощают создание интерфейсов,
упрощают кодирование типичных операций. Но только операций. Даже с простейшими
алгоритмами дело обстоит гораздо хуже. Несомненно, что поиск в строке по
регулярному выражению гораздо проще и быстрее написать на C# или Perl, ту же
задачу на ассемблере. Но принципиальные отличия не так и велики. И даже наличие
множества библиотек и компонентов для выполнения типичных действий не улучшает
картину. Все равно, большинство упрощений стоит на уровне действий, операций,
максимум <span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">–</span> тривиальных алгоритмов. К тому же, не стоит списывать со счетов
время на поиск и освоение требуемых библиотек. Серебряных пуль по-прежнему не
существует.<o:p></o:p><br />
<br /></div>
<div class="MsoNormal">
А ведь задача совсем в другом. Нас интересуют не операции и
не алгоритмы. Нас интересуют результаты. А вот для их достижения нужно с
упорством обезьяны молотить по клавишам вбивая код. И даже разнообразные
вариации на тему autocompletion<span class="apple-style-span"><span style="color: black; font-family: Arial, sans-serif; font-size: 10pt;"> </span></span>не
вносят принципиальных изменений. Они лишь сокращают затраты на перекрестный
поиск по коду. Но сам код все так же вбивается через узкое горло текстового
интерфейса.<o:p></o:p><br />
<br /></div>
<div class="MsoNormal">
Я не агитирую за голосовой ввод. Дело не в этом. Это лишь
очередной инструмент вроде эргономической клавиатуры. На мой взгляд, узким
местом является сам текст. Текст вообще. Текстовое представление информации это
архаичный формат выражения мыслей. Сравните разговор лицом к лицу, разговор по
телефону, и обмен мгновенными текстовыми сообщениями. Плотность информации
скачет на порядок при каждом переходе. Скорость передачи одного и того же
массива данных катастрофически падает при каждом отсеве составляющей общения.
Да, можно текстом передать все (или практически все) оттенки эмоций, но сколько
нужно текста для достоверного описания одной улыбки?<o:p></o:p><br />
<br /></div>
<div class="MsoNormal">
У текста есть одно преимущество. Универсальность.
Формализованное описание, позволяющее кодировать все, что человек в состоянии
выразить хоть как-то. И, кроме того, данное формальное кодирование мы хоть
как-то умеем обрабатывать нечеловеческими системами. Для этого, правда,
приходится формализовывать информации еще больше, загоняя ее в рамки
сверхжестких синтаксических конструкций. И снова идет потеря информации. И
снова мы загоняем плотный поток в узкое бутылочное горлышко ограниченного
формализованного представления. Довольно высокая цена за универсальность.<o:p></o:p><br />
<br /></div>
<div class="MsoNormal">
Возвращаюсь к программированию. Меня все чаще посещает
мысль, хорошо выраженная братьями Стругацкими в рассказе "Испытание
СКИБР":<o:p></o:p></div>
<blockquote>
<i>"Нельзя тратить по два года на каждую систему. У нас с
Сермусом есть кое-какие идеи. Программирование программирования"</i>.</blockquote>
<div class="MsoQuote">
<o:p></o:p></div>
<div class="MsoNormal">
У меня нет идей. Что это будет <span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">–</span> "программирование
программирования", новые интерфейсы "человек-машина", новые
революционные языки программирования<span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">…</span> Я не знаю. Но нынешние затраты на
разработку программных продуктов, на мой взгляд, превышают все допустимые
границы.<o:p></o:p><br />
<br /></div>
<div class="MsoNormal">
Я не против хорошего кода. Это искусство. Меня восхищают
программы с demo-сцены, где в 64Кб уложен код и данные для воспроизведения
десятиминутного объемного ролика с музыкальным сопровождением. Это чистое
искусство. И пускай оно им и остается. Я прекрасно понимаю сложность задач
управления оборудованием и базовых модулей операционной системы. Это если и не
искусство, то наука. На крайний случай <span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">–</span> серьезная работа обеспечения. Она
имеет место и должна существовать. Но писать руками код для построения
интерфейса пользователя, выполнения выборок из БД и формирования отчета <span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">–</span> это
нонсенс. Или, по крайней мере, должно быть нонсенсом.<o:p></o:p><br />
<br /></div>
<div class="MsoNormal">
Шаги в этом направлении есть. Google AppInventor предлагает
собирать программы как паззлы, соединяя фрагменты, прикрепляя (в прямом смысле)
обработчики событий и определяя в ручную лишь необходимые параметры. Но и это
лишь некий Proof Of Concept. Слишком малы фрагменты паззла. Скорость разработки
не возрастает, а, скорее, падает из-за большого количества лишних движений
мышкой.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Нужна другая парадигма. Эта уже заканчивается.<o:p></o:p></div>
</div>Andrew Abramovhttp://www.blogger.com/profile/06722852809581083456noreply@blogger.com0tag:blogger.com,1999:blog-8139975097603907470.post-41912233825870664732010-09-03T17:56:00.002+04:002010-09-08T10:48:04.669+04:00General Purpose AI<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDQKOWAOmA89vNIarPYvUMdTstStT8IWuL8sAvYk5-S8Cd5nvyEU5jEN04pghHqNkhTxrar1yDbadTnO9P22qSzIHRPNg-vzXkOLRlL3lPEDKTeoNW3p6cCECZEqdnFKku2LcV81ngQV0/s1600/mushrooms_small.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDQKOWAOmA89vNIarPYvUMdTstStT8IWuL8sAvYk5-S8Cd5nvyEU5jEN04pghHqNkhTxrar1yDbadTnO9P22qSzIHRPNg-vzXkOLRlL3lPEDKTeoNW3p6cCECZEqdnFKku2LcV81ngQV0/s320/mushrooms_small.jpg" /></a></div>
Как-то в моем кругу общения сложилось шутливое правило:<br />
<i><span class="Apple-style-span" style="color: #9fc5e8;">"Упоминания General Purpose AI в приличном обществе считаются неприличными."</span></i><br />Попробую объяснить, откуда взялась это шутка, и почему упоминания о AI и, в частности, о <i>Нейронных Сетях</i> меня вгоняют в тоску или хихиканье (в зависимости от изначального настроения).<br />
<br />
По большому счету, <i>все уже описано до нас</i> (как обычно). Готов подписаться под каждой буквой замечательной статьи <a href="http://cgm.computergraphics.ru/content/view/166">Александра Вежневеца "Нейронные Сети. Мифы и реальность"</a>. Как минимум, под теми буквами, которые описывают эволюцию отношения к магическому термину "Нейронная Сеть" (произносится с благоговейным придыханием). Про альтернативы судить не берусь – не настолько хорошо подкован в теории. Да-да, я довольно прилично прогуливал математические курсы, которые читались нам в университете.<br />
<br />
И все же, вставлю свои пять копеек в эту не новую тему.<br />
<br />
<a name='more'></a>В освоении вопросов Искусственного Интеллекта и сопутствующего инструментария я, как и большинство, прошел этап восторженного неофита. Казалось, что достаточно прикрутить к программе правильно подобранную сеть, обучить ее на эталонной выборке – и задача мистическим образом решится сама. И, самое главное, казалось, что нерешаемых задач нет. Распознавание, кластеризация, симуляция поведения – главное, правильно подобрать конфигурацию Нейронной Сети. Этакий восторг начинающего демиурга. Как же: имитация работы мозга! Машина думает! Машина учится!<br />
<br />
Однако, шло время, и постепенно стало выясняться, что подобрать конфигурацию не так-то просто, а качественно обучить ее – еще более сложно. Стали закрадываться сомнения в существовании "серебряной пули". Сомнения укрепились и перешли на качественно новый уровень в тот момент, когда для решения очередной задачи выяснилось, что разобрать входную выборку на набор признаков гораздо сложнее да и интереснее, чем непосредственная кластеризация данных с помощью нейросетевых алгоритмов. А ведь что там скучная алгоритмическая задача по сравнению с Интеллектом?<br />
<br />
Тогда-то и кристаллизировалось понимание, что нейронные сети и прочий AI – всего лишь инструмент. Стандартный скучный инструмент. Что-то вроде очередного языка программирования. Причем, языка довольно неудобного. Единожды описав решение с помощью нейронной сети изменить описание уже не возможно. Ибо что там за числа в ней хранятся – не знает никто, даже сама нейронная сеть <span class="Apple-style-span" style="font-family: Wingdings;">J</span><br />
<br />
Ценность такого решения катастрофически мала. Хотя скорость разработки (подчеркиваю: именно разработки) довольно высока. Ведь вместо анализа задачи, разработки алгоритма, его кодирования и отладки достаточно взять готовую реализацию нейросетевого алгоритма и более-менее достоверно его обучить. Поддерживать такое решение, правда, сложно. Но это ведь уже другая проблема, не так ли?<br />
<br />
В общем-то, получается, что нейронные сети – всего лишь один из инструментов для решения задачи кластеризации данных или их аппроксимации. Причем, далеко не лучший инструмент, обладающий множеством "болезней". А все остальное – не более чем ореол магии и таинственности, успешно подогреваемый СМИ и околонаучными тусовками. Эдакая технологическая секта: стоит один раз использовать нейронную сеть в программе – и Вы в клубе! Использование неудачное – значит Вы что-то неправильно сделали (обучающая выборка, исходный алгоритм или его реализация). Ведь 200 миллионов леммингов не могут ошибаться! А если использование было приемлемо удачным – то вы уже Адепт, Несущий Светоч Тайны в массы.<br />
<br />
Но ведь большинство задач, для которых модно применять нейронные сети, вполне решаются стандартными алгоритмическими методами. Или применением других, более эффективных методов кластеризации. Да и в случае применения нейросетей - основная нагрузка ложится не на них, а на этап подготовки входных данных. Просто об этом не принято говорить. Да и к чему – скучно это и непонятно. А упоминание нейросетей и AI – сразу окружает обсуждаемое решение ореолом Тайны и Сопричастности Большой Науке.<br />
<br />
Именно этим и обусловлена моя реакция на упоминания использования нейросетей. После пары-тройки вопросов обычно выясняется, что нейросеть нужна именно в целях PR, придания значимости, таинственности и подобия научности довольно обычному решению обычной задачи.<br />
<br />
Так что, истинные джентльмены не упоминают General Purpose AI. По крайней мере – в приличном обществе.<br />
<div class="MsoNormal">
<o:p></o:p></div>Andrew Abramovhttp://www.blogger.com/profile/06722852809581083456noreply@blogger.com2tag:blogger.com,1999:blog-8139975097603907470.post-40079946778785816552010-08-26T14:02:00.003+04:002010-09-02T12:32:44.103+04:00Почти как настоящий...<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzj_x7eXputk3goVdps5o_Oo4bOed3wg9vXzQktadcw0sqQN9MF4yTRfjx7Il71VzqAVduh5jSvrPzbQJxJowdp_IPaDJLLDOdJuZFk68OHuI_SVBgwe6Jo-RkhFCBeb68E33z0tbSgSY/s1600/icon_html.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzj_x7eXputk3goVdps5o_Oo4bOed3wg9vXzQktadcw0sqQN9MF4yTRfjx7Il71VzqAVduh5jSvrPzbQJxJowdp_IPaDJLLDOdJuZFk68OHuI_SVBgwe6Jo-RkhFCBeb68E33z0tbSgSY/s320/icon_html.gif" /></a></div>
Думал я тут о разработке кросс-платформенных приложений.<br />
Хотя, "думал" - громкое слово. Нужно сделать так, чтоб приложение работало на *NIX и Windows. Нужно - значит будет!<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="background-color: white;"><span class="Apple-style-span" style="color: blue;">static_cast</span><span class="Apple-style-span" style="color: #444444;"><</span><span class="Apple-style-span" style="color: purple;">Linix</span><span class="Apple-style-span" style="color: #444444;">>(</span><span class="Apple-style-span" style="color: purple;">Windows</span><span class="Apple-style-span" style="color: #444444;">)</span></span></span><br />
и даже<br />
<span class="Apple-style-span" style="background-color: white;"><span class="Apple-style-span" style="color: #444444;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="color: blue;">static_cast</span><<span class="Apple-style-span" style="color: purple;">FreeBSD</span>>(<span class="Apple-style-span" style="color: purple;">Windows</span>)</span></span></span><br />
<br />
Да и, собственно говоря, проблем особых нет. Те утилитки, которые я "программирую" - вещи специфические, и на 99% - консольные приложения. Но в пресловутом "мире современных информационных технологий" консольное приложение - и не приложение вовсе. Так, робот, тулза для гиков. В общем - сугубо для частного использования в узком кругу задач. А чуть в паблик выходишь - так уже без GUI и никуда.<br />
<br />
И что же нам предлагает "современный мир" в качестве решения задачи кросплатформенного GUI? Да не так и много...<br />
<b></b><br />
<b><a name='more'></a>.NET</b> - ну есть, конечно, <b>Mono</b>. Но и к самому .NET'у я настороженно отношусь, а Mono'вские интерфейсы (графические) - это вообще что-то с чем-то. Прошлый век по сути. Моё эстетическоре восприятие действительности - протестует :-)<br />
<b>QT</b>. O да! Признанные мэтры! Не поспоришь. И красиво отрисованных приложений я видел не мало. Но, каждая попытка поставить QT и на нем что-нить наваять, не доходила даже до компиляции пресловутого "Hello, world". Тяжело, массивно, навороченно. И очень напоминает программирование под Windows времен середины 90х - сплошное WinAPI (в смысле стилистика программ очень похожа). Спорить не возьмусь, QT я не знаю - не осилил.<br />
<b>wxWidgets</b>. Этим я даже пользовался. Не одно "приложение" написано. Но вот как-то визуальная часть меня напрягает. Выглядит это все - довольно уныло. Тоже попахивает прошлым веком. А попытка натянуть туда "скины" или хоть как-то раскрасить картинку приводит к пресловутому "ручному" рисованию с обработкой всех подряд сообщений графической подсистемы. Короче - опять "закат солнца вручную".<br />
<b>WEB-based GUI</b>. Модно, современно, и вообще понтово. И красиво, однако. Взять, например, jQuery-UI - шикарнейшие интефейсы без особых проблем. И кастомизация на уровне. Даже проблемы совместимости браузеров практически решены. Одно плохо - непонятно что со смысловой нагрузкой делать? Таскать за собой web-сервер, на котором крутятся CGI - как-то не логично. А в контексте браузера много не наработаешь - доступ к локальной системе порезан из соображений безопасности. Не затачиваться же, в самом деле, под эксплуатапцию уязвимостей браузеров? :)<br />
А вот еще <b>XUL </b>есть. Ну почти как настоящий - всго-то надо xulrunner или firefox - и приложение с доступом к локальным ресурсам готово. Однако, опять грабли с внешним видом. Долго изучал документацию в разделе "Skins" но не впечатлился доступными возможностями. Цвет элементов - и тот не всегда поменять можно. Грустно...<br />
<br />
Однако, как подсказал мне один официант - "Импровизируйте, и все получится". XUL содержит очень полезный элемент - browser (ну или iframe - что в данном случае одно и тоже). Делаем окно, в него browser развернутый на всю площадь - и voila! Рисуем там все что душе угодно с помощью того же jQuery. А доступ к локальным ресурсам обеспечивает код на JavaScript, который выполняется в контексте chrome://, предоставленном xulrunner'ом. Собственно, есть доступ к sqlite DB, локальным файлам и каталогам и, даже, запуск приложений.<br />
<br />
Последнее - запросто решает большинство вопросов. Ведь если что-то нельзя сделать из JavaScript, то это можно сделать из нативного приложения. Которому-то, как раз, GUI уже не нужен и даже вреден.<br />
<br />
Вот и получается - GUI на базе веб технологий для конфигурирования системы и отображения результатов, нативное приложение для выполнения осмысленных действий, и XUL со своим XPCOM'ом для связывания всего этого в единое целое. Простенько и со вкусом. Да и накладные расходы минимальны.Andrew Abramovhttp://www.blogger.com/profile/06722852809581083456noreply@blogger.com1tag:blogger.com,1999:blog-8139975097603907470.post-71686702063939832132010-08-24T12:36:00.007+04:002010-09-02T12:49:16.756+04:00Hello, World!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRYIDnKk6X4poSJCkdeiXjpSrKXgXVUFAP2SYq-qryatHzaG8x2C_IJXbSnDJwiLW54QbEPQwZyy7IPMM_0FhGfnLmDT0kXLFgIy4nWmGqM2c4rDhb-GfH5YBp6_R_Eqdv4oYm3LH1DkA/s1600/world.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRYIDnKk6X4poSJCkdeiXjpSrKXgXVUFAP2SYq-qryatHzaG8x2C_IJXbSnDJwiLW54QbEPQwZyy7IPMM_0FhGfnLmDT0kXLFgIy4nWmGqM2c4rDhb-GfH5YBp6_R_Eqdv4oYm3LH1DkA/s320/world.png" /></a></div>
Итак, типичное начало типичной деятельности IT'шника очень близко связанного с программированием.<br />
<br />
<b>Hello, World!</b><br />
<br />
Ну а вообще-то сразу вспоминается старая добрая шутка про написание "Hello world" специалистами различной квалификации. Посмотреть можно, например, тут: <a href="http://www.gnu.org/fun/jokes/helloworld.html">Hello World! - GNU Project</a><br />
<br />
Эх... Давно пройденный этап:<br />
<span style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; float: none; line-height: 1; white-space: pre; display: block;"><span style="color: green; font-family: 'Courier New'; font-size: 10pt;">#!/usr/local/bin/perl</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt;">$msg</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">=</span><span style="color: grey; font-family: 'Courier New'; font-size: 10pt;">"Hello, world.\n"</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">;</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">if</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">(</span><span style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt;">$#ARGV</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">>=</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">0</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">)</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">{</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;"> while</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">(</span><span style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">defined</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">(</span><span style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt;">$arg</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">=</span><span style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">shift</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">(</span><span style="color: #cf34cf; font-family: 'Courier New'; font-size: 10pt;">@ARGV</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">)))</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">{</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt;"> $outfilename</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">=</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt;">$arg</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">;</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;"> open</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">(</span>FILE<span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">,</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: grey; font-family: 'Courier New'; font-size: 10pt;">">"</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">.</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt;">$outfilename</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">)</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">||</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">die</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: grey; font-family: 'Courier New'; font-size: 10pt;">"Can't write $arg: $!\n"</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">;</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;"> print</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">(</span>FILE<span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt;">$msg</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">);</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;"> close</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">(</span>FILE<span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">)</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">||</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">die</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: grey; font-family: 'Courier New'; font-size: 10pt;">"Can't close $arg: $!\n"</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">;</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;"> }</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">}</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">else</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">{</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: blue; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;"> print</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;"> </span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">(</span><span style="color: #ff8000; font-family: 'Courier New'; font-size: 10pt;">$msg</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">);</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">}</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">1</span><span style="color: navy; font-family: 'Courier New'; font-size: 10pt; font-weight: bold;">;</span><span style="color: red; font-family: 'Courier New'; font-size: 10pt;">
</span></span>
<br />
Сейчас уже, скорее, так:<br />
<pre style="background: #FFFFFF; color: black; float: none; line-height: 1;"><span style="color: blue;">#include</span> <span style="color: #a31515;"><stdio.h></span>
<span style="color: blue;">#include</span> <span style="color: #a31515;"><string.h></span>
<span style="color: blue;">#define S</span> <span style="color: #a31515;">"Hello, World\n"</span>
<span style="color: #a31515;">main</span>(){<span style="color: #a31515;">exit</span>(<span style="color: #a31515;">printf</span>(<span style="color: blue;">S</span>) == <span style="color: #a31515;">strlen</span>(<span style="color: blue;">S</span>) ? 0 : 1);}</pre>
<br />
И, даже, все чаще так:<br />
<pre style="background: #FFFFFF; color: black; float: none; font-family: 'Courier New'; font-size: 10pt; line-height: 1; display: block;"><span style="color: #804000; font-weight: bold;">%</span> <span style="color: blue; font-weight: bold;">cc</span> <span style="color: blue; font-weight: bold;">-o</span> a.out <span style="color: #804000; font-weight: bold;">~/</span>src<span style="color: #804000; font-weight: bold;">/</span>misc<span style="color: #804000; font-weight: bold;">/</span>hw<span style="color: #804000; font-weight: bold;">/</span>hw.c
<span style="color: #804000; font-weight: bold;">%</span> a.out
Hello, world.
</pre>
<br />
Так что, вступаем и компилируем вместе! ;)Andrew Abramovhttp://www.blogger.com/profile/06722852809581083456noreply@blogger.com1