<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Программирование &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/Программирование/</link>
	<description>Feed of posts on WordPress.com tagged "Программирование"</description>
	<pubDate>Thu, 21 Aug 2008 02:46:35 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Надо всё таки тут отписаться наконец]]></title>
<link>http://bug2bug.wordpress.com/?p=99</link>
<pubDate>Sat, 16 Aug 2008 21:09:49 +0000</pubDate>
<dc:creator>bug2bug</dc:creator>
<guid>http://bug2bug.wordpress.com/?p=99</guid>
<description><![CDATA[Я люблю свою жизнь.
Недельку назад встретился наконец-]]></description>
<content:encoded><![CDATA[<p>Я люблю свою жизнь.<br />
Недельку назад встретился наконец-то с Наташей.<br />
Работаю сейчас на двух работах - в ООО "Добро" (Ведущим разработчиком, программистом 1С и начальником IT-отдела по совместительству) и ООО "Деко" (Системным администратором и инженером по внедрению и поддержке свободного программного обеспечения). Доволен. С первой же зарплаты купил себе Apple iBook G4, стал вообще счастлив.<br />
Зарегистрировал на себя домены http://zbug.pp.ru и http://desu.org.ru<br />
Разрабатываю для них на Python систему управления контентом.<br />
Таки помирился наконец со Светой, поговорили много о чём.</p>
<p>В-общем, можно сказать, что всё шикарно (:</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Монокультура Microsoft]]></title>
<link>http://peter631.wordpress.com/?p=161</link>
<pubDate>Sat, 16 Aug 2008 18:58:49 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=161</guid>
<description><![CDATA[Все от MS
Еще лет 10 назад все было более-менее. Под Windows м]]></description>
<content:encoded><![CDATA[<p><strong>Все от MS</strong></p>
<p>Еще лет 10 назад все было более-менее. Под Windows можно было писать на Delphi, Visual Basic'е, Power Builder'е, Java, vxWorks  и еще до хрена на чем. Можно было ставить Sybase, MS SQL, Oracle и Informix. Да и сейчас можно, только никто не будет.  MS вынесла всех. У нас работает Ms Windows Vista (tm) СУБД  у нас  MS SQL Server (tm). Пишем в MS Visual Studio (C). Под MS CLR (C). Сливаем сорцы в MS Team System (tm).  Группа сертифицированных MS-инженеров на MS-совместимом оборудовании. Продуктивность работы возросла, конечно, но меня не оставляет ощущение что с потерей разнообразия средств разработки мы что-то потеряли. Причем потеряли больше, чем приобрели.</p>
<p>Конечно, все считают, что Visual Studio и C# безусловно последнее слово в разработке, вот только так ли это в действительности?</p>
<p><strong>Слабость C#</strong></p>
<p> Был такой язык Лисп. Над ним в течении 40 лет трудились лучшие умы. Для Лиспа придуманы были и сборка мусора, и ленивые вычисления, и объекты и все что можно себе вообразить. Собственно, даже сейчас любой из традиционных языков проигрывает Лиспу. Даже используя Лисп, исследователи не смогли заставить компьютер думать. Стоит ли в свете сказанного возлагать на шарп надежды? Очевидно нет - это заранее слабый язык.  Ничего грандиозного мы на нем не напишем - не написали на Лиспе, на Шарпе и подавно не напишем.</p>
<p><strong>Проблемы с обучением</strong> </p>
<p>Я глубоким изумлением узнал, что современных программеров даже не обучают C и ассемблеру. Есть вот, ребята, C# - творение великих святых от MS - пользуйтесь им, остальное - ересь. Программист, не представляющий, что такое регистры процессора - это, ИМХО, совсем...Совсем скоро потеряем контивность мышления, так и будем смотреть в рот MS. Раньше программеров нанимали в России, а теперь - в Белоруссии. И правильно, что необученных и тупых задорого нанимать? Лучше умных и изворотливых задешево. Когнитивность, она не просто так. Ее надо тренировать.</p>
<p><strong>P.S.</strong></p>
<p>Раньше вон марксизм-ленинизм изучали, со всем усердием, теперь - продукцию MS.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Плохие сценарии]]></title>
<link>http://peter631.wordpress.com/?p=158</link>
<pubDate>Sat, 16 Aug 2008 18:35:28 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=158</guid>
<description><![CDATA[К чему много слов? Можно много распинаться, а можно ска]]></description>
<content:encoded><![CDATA[<p>К чему много слов? Можно много распинаться, а можно сказать по делу. Вот сценарии, которые вот-вот готовы сбыться, но все-таки желательно их избежать.</p>
<ol>
<li>Microsoft закрывает все никоуровневые API. Отныне разработчики вынуждены пользоваться только CLR (.Net Framework)</li>
<li>Intel выпускает процессоры, на которых работает только продукция Microsoft. Остальные OS не запускаются. Open Source переезжает на микроконтроллеры и PlayStation.</li>
<li>ВУЗы перестают обучать разработчиков программированию на C и Ассемблере. Отныне это - задача фирм-рабтодателей. Если фирма считает нужным, она расскажет разработчику, что такое регистры (как тут не вспомнить Бредбери, "451 градус по Фаренгейту")</li>
<li>Численность сотрудников Microsoft заваливает за 5 миллионов человек. MS официально просит ООН предоставить ей статус государства.</li>
<li>Правительство запрещает гражданам пользоваться системой, отличной от Windows. Open Source официально преследуется законом. Юниксоиды уходят в подполье.</li>
<li>Правительство легализует закладки в Windows.</li>
<li>MS выпускает подлинно сетевую версию OS, большая часть кода которой размещена на удаленных серверах. Доступ платный.</li>
</ol>
<p>Кое-что уже сбывается. Может, стоит остановиться и подумать?</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Юридическое признание компьютерных журналов (логов)]]></title>
<link>http://peter631.wordpress.com/?p=147</link>
<pubDate>Thu, 31 Jul 2008 16:49:57 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=147</guid>
<description><![CDATA[На самом деле никакой официальной позиции на этот счет]]></description>
<content:encoded><![CDATA[<p>На самом деле никакой официальной позиции на этот счет нет, поэтому я просто попытаюсь в письменном виде порассуждать на эту тему.</p>
<p>Очевидно, что незащищенный никаким образом лог не может служить доказательством, поскольку его легко изменить. Как электронный документ, он не имеет юридической силы, поскольку на нем нет электронно-цифровой подписи (и опять таки его легко изменить). Исходя из этих двух пунктов, попробуем логически порассуждать.</p>
<ul>
<li> Логи, как электронный документ, не могут быть юридически признаны без ЭЦП;</li>
<li> ЭЦП действительна при наличии доказательств факта ее наложения</li>
<li> ЭЦП предполагает наличие криптосредств, более того - сертифицированных криптосредств. Программное обеспечение, содержащее сертифицированные криптосредства, должно проходить аттестацию и исследование на корректность встраивания СКЗИ.</li>
<li> Криптосредства (СКЗИ) должны работать в доверенной среде - на защищенном по требованиям органов компьютере, со специальным ПО (и хардом), контролирующим целостность криптосредств и пр. (Минимально - электронный замок)</li>
<li> Закрытые ключи должны находиться на отчуждаемом носителе.</li>
<li> Запись лога должна содержать высокоточную отметку времени, полученную из внешнего источника, недоступную для модификации. В идеале на запись лога накладывается криптографическая отметка времени (см. TSA, RFC такой-то).</li>
<li> Помимо указанных мер, доступ к ключу должен иметь ограниченный круг лиц.</li>
<li> Внутри системы, доступ к ключу должен регулироваться матрицей доступа.</li>
<li> Лог-файл (файлы) должны быть объектом матрицы доступа.</li>
<li> Машина (компьютер) с логом должны стоять в охраняемом помещении.</li>
<li> Формат данных лога должен допускать проведение экспертизы (проверки отметки времени, подписи данных, проверки сертификатов подписи и пр.)</li>
</ul>
<p> После этого мы можем говорить, что да, наверно, этим логам можно доверять, поскольку маловероятно, чтобы владельцы системы и нарушитель вступили в преступный сговор. Если факты свидетельствуют о возможном сговоре, то при соблюдении вышеуказанных условий круг подозреваемых сужается. Также, в указанном случае имеет место корректность изъятия логов - эксперт не сможет изменить данные, поскольку не обладает доступом к секретному ключу.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Hehe Text Editor: so it begins]]></title>
<link>http://jefim.wordpress.com/?p=83</link>
<pubDate>Thu, 31 Jul 2008 06:24:06 +0000</pubDate>
<dc:creator>Jefim Borissov</dc:creator>
<guid>http://jefim.wordpress.com/?p=83</guid>
<description><![CDATA[So, today I will start telling you about a very simple text editor I am making just for the fun of i]]></description>
<content:encoded><![CDATA[<p>So, today I will start telling you about a very simple text editor I am making just for the fun of it. The thought appeared to me while I was extremely bored just "stumbling" sites. I thought - "Hey, instead of wasting your time doing nthing why don't you make a simple text editor and log the whole proccess in your blog?". And that is basically it. I wrote up some code. The main window and stuff and that was it.</p>
<p>Anyway, some thing I want to achieve during this "session":</p>
<ol>
<li>Tabbed documents</li>
<li>Support for large documents</li>
<li>Windows context integration (like Noepad++ does)</li>
<li>Code highlighting</li>
<li>Code folding</li>
<li>Code structure</li>
<li>Autocomplete for functions and variables</li>
</ol>
<p>And maybe something will be added later. This is a very minimalistic feature list for me right now. Next time I'll show you what I've done so far.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Системы осцилляторов]]></title>
<link>http://systemhalt.wordpress.com/?p=64</link>
<pubDate>Sun, 20 Jul 2008 15:45:43 +0000</pubDate>
<dc:creator>systemhalt</dc:creator>
<guid>http://systemhalt.wordpress.com/?p=64</guid>
<description><![CDATA[
Недавно откопал в одном из бэкапов интересную прожку, ]]></description>
<content:encoded><![CDATA[<p><a href="http://systemhalt.wordpress.com/files/2008/07/oscill.png"><img src="http://systemhalt.wordpress.com/files/2008/07/oscill.png?w=120" alt="" width="120" height="96" class="alignnone size-thumbnail wp-image-65" /></a></p>
<p>Недавно откопал в одном из бэкапов интересную прожку, написанную мною более двух лет назад. Программа моделирует систему тел, связанных между собой пружинками. Довольно занимательно, имхо. Сейчас сижу рефакторю её, ибо код там стрёмноватый по нынешним меркам. Думаю, обязательно нужно будет включить нечто подобное в Комплекс-II.</p>
<p>Скачать можно тута: <a href="http://nightmarez.webasyst.net/files/5ec9cc8e">http://nightmarez.webasyst.net/files/5ec9cc8e</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Юридические аспекты применения электронно-цифровой подписи]]></title>
<link>http://peter631.wordpress.com/?p=108</link>
<pubDate>Sun, 13 Jul 2008 12:18:46 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=108</guid>
<description><![CDATA[Слабость современных законов об ЭЦП
 Несмотря на очев]]></description>
<content:encoded><![CDATA[<p><strong>Слабость современных законов об ЭЦП</strong></p>
<p><strong> </strong>Несмотря на очевидную необходимость применения электронно-цифровой подписи в современном мире, дело продвигается с большим трудом. В США электронно-цифровая подпись признается только в некоторых штатах, да и то с оговорками. В России закон об ЭЦП откровенно слаб (и в техническом и в юридическом аспектах) и не может быть применен. Я читал драфт (модельный закон) об ЭЦП, выпущенный в 2007 году, но он ничем не лучше действующего. Европейская директива CADES существенно лучше, но она тоже ничего не раскрывает по существу дела. Хотя если ее принять у нас, то, конечно, это  улучшит положение. Как практикующий специалист в области практической криптографии я остановлюсь на ряде моментов, которые представляются мне важными и которые либо не отражены, либо слабо отражены в российском законодательстве.</p>
<p> <strong>Апостиль</strong></p>
<p> Несмотря на кажущиеся различия между законодательствами разных стран, юридическая практика, унаследованная нами от римского права, везде схожа. Людям всегда требуется одно и то тоже: регистрация сделок, признание и расторжение брака, наследство, права собственности и прочее. В современном мире, для которого характерна массовая и постоянная миграция людей, глобализация всех процессов, требуются универсальные механизмы признания  юридических документов, оформленных в одной стране, на территории другой страны. Поскольку документы на иностранном языке ничтожны (не действительны), так как официально Вы не можете их прочесть и соответственно принять решение, требуется особая юридическая процедура признания документа. Для некоторых типов документов, например для доверенностей, на территории стран-участниц Конвенции, документы, оформленные на территории других стран <strong>признаются </strong>при наличии специального защищенного от подделки штампа и документа к нему, называемого <strong>апостиль</strong>. Апостиль и заверяемый им документ могут быть официально переведены и имеют юридическую силу.</p>
<p>В юридическом смысле аналогичная ситуация имеет место и с ЭЦП. Самый спорный момент - это момент наложения пользователем ЭЦП на документ, представленный в электронном виде. Бинарный (машинный) формат документа не может быть понятен пользователю. <em>Соответственно, подпись, наложенная на бинарный документ - ipso </em><em>facto - юридически незначима!</em> Следовательно, ЭПЦ должна быть наложена на текстовое представление документа, которое безусловно необходимо показать пользователю перед моментом подписания. После подписания документ не может быть изменен. Как вариант, бинарный формат документа должен быть сертифицирован и должен существовать также сертифицированный экземпляр конвертера этого формата в текстовую форму и обратно. XML и соответствующий стандарт подписания неплохой кандидат на юридически признаваемую форму документа.</p>
<p> <strong>Свидетельства</strong></p>
<p> Когда мы подписываем серьезный юридический документ, нам нужна гарантия признания его государством, чтобы иметь страховку на случай дальнейших споров и судебного разбирательства. Суд обязательно спросит: действительно ли имело место подписание этого документа? Был ли подписан именно этот документ именно этим лицом и в указанное время? Для доказательства этих фактов мы и отправляется к независимому свидетелю - <strong>нотариусу</strong>. Нотариус убеждается в подлинности лиц, подписей, непротиворечивости и законности договора и заверяет документ своей подписью и печатью (если предполагается перевод документа на другой язык - накладывает апостиль).</p>
<p>Для юридического признания ЭЦП нам, к сожалению, тоже нужен независимый свидетель. Иначе лицо, наложившее ЭЦП, может впоследствии отрицать факт подписания, сославшись на компьютерные вирусы, несовершенство системы измерения времени и прочие обстоятельства. В законе есть упоминание об этом, но по существу вопроса ничего не сказано.</p>
<p>Таким образом, необходимы технические средства, которые <strong>заверяют</strong> подпись документа с наложенной на него заверяемой ЭЦП. Это может быть сетевой сервер независимой компании или государственного учреждения, который накладывает поверх заверяемого документа свою ЭЦП, присоединив высокоточную отметку времени. Оригинальная подпись, разумеется, должна быть проверена. Технически это самый тяжело реализуемый момент. Ни в одной из существующих систем он не реализован целиком.</p>
<p> <strong>Экспертиза</strong></p>
<p><strong> </strong>Предположим, что конфликт все-таки произошел и лицо, наложившее подпись, официально, с суде, отрицает факт подписания документа, или, к примеру, отрицает время подписания. В этой ситуации суд обязан назначить проведение экспертизы технических средств и электронного документа. Производитель системы подписи обязан предоставить инструменты для такой экспертизы. Кроме того, документ должен иметь достаточно реквизитов, чтобы эта экспертиза была возможной. Минимально необходимый набор таков:</p>
<ul>
<li>1. Сертификат открытого ключа лица, подписавшего документ и цепочка сертификатов, вплоть до корня, соотв. системы подписи;</li>
<li>2. Список отзыва, действительный на момент подписания документа;</li>
<li>3. Наложенная на подпись заверенная ЭЦП отметка времени и ее сертификат (и корень, если отличен от пункта 1)</li>
</ul>
<p> В ходе экспертизы эксперты должны предоставить суду доказательства того, что:</p>
<ol type="1">
<li>Сертификат подписавшего не был отозван на момент подписания и принадлежит подписавшему</li>
<li>Сертификат подписавшего действительно выпущен указанным центром (проверка цепочки)</li>
<li>Подпись документа верна</li>
<li>ЭЦП отметки времени верна. ЭЦП отметки времени содержит корректный сертификат, не был отозван на момент подписания и был выпущен указанным УЦ.</li>
</ol>
<p> Только при соблюдении указанных условий у нас появляется <strong>косвенное </strong>доказательство того, что документ был подписан, и причем в указанное время. Тем не менее, возможно, лицо подписавшее документ, действовало под принуждением. Также не исключен вариант, что лицо пало жертвой компьютерного вируса или программы-закладки, или программы удаленного управления, тайно внедренной на компьютер подписавшего. Ряд зарубежных систем ЭЦП имеют в своем техническом арсенале средство сигнализации "работаю под принуждением", которое позволяет выявить этот факт при проверке. К сожалению, вопрос с вирусами остается открытым.</p>
<p> <strong>Идентификационные данные</strong></p>
<p><strong> </strong>Какого рода личные данные надо включить в сертификат, чтобы надежно удостовериться, что данный сертификат действительно принадлежит указанному лицу? Разумеется, никакие паспортные данные не могут быть гарантией. Надежную гарантию может предоставить только биометрические данные - отпечатки пальцев, фрагмент ДНК и пр. В настоящее время такие системы только начинают создаваться, и их успехи весьма скромны. Минимум такие системы являются дорогостоящими.</p>
<p> <strong>Заключение</strong></p>
<p><strong> </strong>Приведенные Выше соображения показывают, что юридическое признание электронно-цифровой подписи в настоящее время очень сложно осуществить, что и подтверждает практика.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Мысли вслух]]></title>
<link>http://systemhalt.wordpress.com/?p=61</link>
<pubDate>Tue, 08 Jul 2008 11:53:05 +0000</pubDate>
<dc:creator>systemhalt</dc:creator>
<guid>http://systemhalt.wordpress.com/?p=61</guid>
<description><![CDATA[Как всё-таки трудно в нашем обществе заниматься изобре]]></description>
<content:encoded><![CDATA[<p>Как всё-таки трудно в нашем обществе заниматься изобретательством. Если, конечно, твой папа не нефтяной магнат и бабушка не оставила наследство в сто тыщ мильёнов. Сначала учился в универе, где половину своего времени приходилось тратить на всякую ахинею. Теперь же приходится работать, дабы было чего пожрать, и, тоже трачу столько же времени, только теперь уж на то, чтобы те, кто стоит надо мной, хорошо жили. А на то, чтоб написать сотню строк кода в своём проекте, приходится выкраивать по часу-другому ночью, жертвуя нормальным сном. В следствии чего не высыпаюсь, да, и, порой чувствую совсем себя убитым. Иногда убегаю с работы по-раньше или наоборот опаздываю с той же целью, что, естесственно, сказывается на моей з/п. А архитектурные решения проекта приходится обдумывать на ходу. Ну а как по-другому? Финансирование получить откуда-либо я вообще не представляю возможным. Хотя, конечно, это было бы замечательно... я бы смог развернуться на полную силу и отдавать проекту часов восем-десять в день.</p>
<p>Подумать только, я потратив весь вчерашний день... целый день своей жизни, успел лишь реализовать класс буфера вершин. С такими темпами я буду писать Комплекс до Второго Пришествия :)</p>
<p>Но и это ещё не всё. Работая в нашем посёлке городского типа, я за этот год так и не смог купить себе ноут. Все бабки ушли на жратву, оплату жилья и т.п. Получается, что и работаю я за еду :)  Я бы с удовольствием спал бы по четыре часа в сутки, но, к сожалению, здоровье не позволяет... вот такие помидоры.</p>
<p>Всё. Поплакался. Теперь по сути дела. Проект таки потихоньку развивается. Развивается в данный момент на Delphi. Вроде бы как обратно на .NET переходить пока не хочу. И, надеюсь, что не буду. До начала следующей недели хочу реализовать базовые функции граф. библиотек под OpenGL и DirectX. После чего ещё неделька, наверное, уйдёт на прочие прибабахи (вроде загрузки модулей, основного 3D-меню выбора модулей, etc.), и, можно будет приступать к разработке самих модулей Комплекса.</p>
<p>Сегодня же, если время будет, займусь текстурами: хранением в запакованном виде, загрузкой, отображением.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Гг... Delphi]]></title>
<link>http://systemhalt.wordpress.com/?p=52</link>
<pubDate>Sat, 05 Jul 2008 19:36:48 +0000</pubDate>
<dc:creator>systemhalt</dc:creator>
<guid>http://systemhalt.wordpress.com/?p=52</guid>
<description><![CDATA[
Блин. Прикинул архитектуру проекта. Какие должны быть ]]></description>
<content:encoded><![CDATA[<p><a href="http://systemhalt.files.wordpress.com/2008/07/delphi_a_free_p.jpg"><img src="http://systemhalt.wordpress.com/files/2008/07/delphi_a_free_p.jpg?w=96" alt="" width="96" height="96" /></a><br />
Блин. Прикинул архитектуру проекта. Какие должны быть модули, как должны функционировать и взаимодействовать. Даж простенький рендер написал. На C# 2008 и на Delphi 2007.<br />
С одной стороны ностальгия по Delphi мучает. С другой стороны, на C# немного удобнее.... хоть и не на много. А для Delphi не нужно будет фреймворк таскать... пошёл думать ещё, дабы окончательно определиться с выбором ))))</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Модули]]></title>
<link>http://systemhalt.wordpress.com/?p=49</link>
<pubDate>Mon, 30 Jun 2008 09:33:39 +0000</pubDate>
<dc:creator>systemhalt</dc:creator>
<guid>http://systemhalt.wordpress.com/?p=49</guid>
<description><![CDATA[
Параллельно с разработкой основной программы собираю]]></description>
<content:encoded><![CDATA[<p><a href="http://systemhalt.files.wordpress.com/2008/06/physcmplx.png"><img src="http://systemhalt.wordpress.com/files/2008/06/physcmplx.png?w=128" alt="" width="128" height="68" /></a></p>
<p>Параллельно с разработкой основной программы собираю интересные задачки-эксперименты, которые можно промоделировать. Пока что список не очень длинный.... в дальнейшем обязательно буду пополнять и выкладывать инфу тут. Вообще на данный момент держу цель на 30 экспериментов. Но, возможно, в итоге будет больше.</p>
<ul>
<li>Маятник (математический, двойной, etc.)</li>
<li>Пружинный маятник</li>
<li>Системы осцилляторов (куча грузов, связанных пружинами)</li>
<li>Маятник Фуко</li>
<li>Отрисовка полей (линии потенциалов, etc.), создаваемых заряженными телами</li>
<li>Реактивное движение</li>
<li>Задача Кеплера (+релятивистские эффекты, gravity simulator, etc.)</li>
<li>Движение частиц в электрических полях</li>
</ul>
<p>Если у вас есть интересные идеи, плиз, сообщайте мне.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[.NET Framework]]></title>
<link>http://systemhalt.wordpress.com/?p=41</link>
<pubDate>Sun, 29 Jun 2008 15:22:40 +0000</pubDate>
<dc:creator>systemhalt</dc:creator>
<guid>http://systemhalt.wordpress.com/?p=41</guid>
<description><![CDATA[
После долгой борьбы двух противоположностей внутри м]]></description>
<content:encoded><![CDATA[<p><a href="http://systemhalt.files.wordpress.com/2008/06/011f9494d97e15444146a61d8a79af79.png"><img src="http://systemhalt.wordpress.com/files/2008/06/011f9494d97e15444146a61d8a79af79.png?w=128" alt="" width="128" height="82" /></a><br />
После долгой борьбы двух противоположностей внутри меня: древнего дельфиста и молодого C++-сника, последний таки победил, растоптав первого в пух и прах. Тяга к удобству разработки победила над всем остальным. Выбор пал на платформу .NET</p>
<p>Писать буду под вторую версию. Ибо третья нафиг не нужна, да и требует она как минимум WinXP SP2, что не есть хорошо.</p>
<p>Если быть откровенным, я уже замахивался на .NET и написал пробную софтень с такой же структурой, какая будет у Комплекса. Всё это дело вполне даже успешно функционирует. Что даёт основания надеятся на правильность моего выбора.</p>
<p>Завтра у меня выходной. Буду закладывать первые кирпичики проекта.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[О рулезности ODBC]]></title>
<link>http://peter631.wordpress.com/?p=103</link>
<pubDate>Sat, 28 Jun 2008 18:27:22 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=103</guid>
<description><![CDATA[Старый, зато надежный
Оно конечно, статья эта более был]]></description>
<content:encoded><![CDATA[<p><strong>Старый, зато надежный</strong></p>
<p>Оно конечно, статья эта более была бы уместна году эдак в 1993-96. Ныне в наш век повсеместного управляемого кода все и забыли что есть код неуправляемый, который работает на порядок-два быстрей. Так что если что-то надо сделать быстро, выбираем <strong>неуправляемый</strong> код. Если что-то хотите сделать быстро с базой, например - вызов большого количества хранимых процедур, то лучше ODBC вам не найти.</p>
<p><strong>Кто же добрую скотину гонит со двора</strong></p>
<p>В MS SQL, например, появилась новая клиентская либа - MS Native Client. К ней идет и полнофункциональный, самый современный вариант старого доброго ODBC. Так вот. Помимо прочих достоинств он офигительно, непредставимо <strong>быстр</strong>. OleDb и .Net провайдеры просто отдыхают по сравнению со связкой Win32-NativeClient- ODBC</p>
<p><strong>Преимущества ODBC</strong></p>
<ol>
<li>Он прост, хоть и кажется сложным. Честное слово, по сравнению с OLEDB - сама простота.</li>
<li>Он аккуратно написан, в отличие от современного софта. Вы можете сами в этом убедиться, запустив программу, использующую ODBC из-под BoundsChecker'а.</li>
<li>Он <strong>очень</strong> быстр. Загрузка курсора на борт раз эдак в пять быстрей, чем в ADO.</li>
<li>Он поддерживается в самых современных версиях СУБД (хоть бы тот же MS SQL)</li>
<li>Он переносим на LInux (Unix ODBC)  - я пробовал, все замечательно.</li>
<li>Есть специфические фичи - например, <strong>пакетирование вызова процедур</strong>. Предствавьте, что Вам надо дернуть хранимую процу 1500 раз с разными параметрами. ADO потратит на это 1500 round - trip'ов. ODBC в режиме пакетирования (Column Wise or Row -wize) - только один. Разница по времени офигенная.</li>
</ol>
<p><strong>Недостатки ODBC</strong></p>
<ol>
<li>Вызовы громозкие. Данных типа Variant (object) нет. Въезжать по началу сложно.</li>
<li>Чувствителен к последовательности вызовов, как что не по нему - кричит</li>
<li>Обработка ошибок несколько витиевата.</li>
</ol>
<p>В общем, потратьте немного времени на изучение этого старого надежного интерфейса - пригодиться.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Выбор среды разработки]]></title>
<link>http://systemhalt.wordpress.com/?p=31</link>
<pubDate>Sat, 28 Jun 2008 07:11:45 +0000</pubDate>
<dc:creator>systemhalt</dc:creator>
<guid>http://systemhalt.wordpress.com/?p=31</guid>
<description><![CDATA[
У меня есть два варинта, которые мне более-менее подхо]]></description>
<content:encoded><![CDATA[<p><a href="http://systemhalt.files.wordpress.com/2008/06/ide.png"><img src="http://systemhalt.wordpress.com/files/2008/06/ide.png" alt="" width="126" height="82" /></a><br />
У меня есть два варинта, которые мне более-менее подходят:<br />
1) связка C++/CLI и C#<br />
2) Delphi<br />
У обоих есть свои преимущества и недостатки, которые мне не дают окончательно определиться.</p>
<p><strong>Плюсы Delphi и минусы .NET:</strong></p>
<p>1) Delphi компилирует в нативный код, в дотНете же сборки будут в промежуточном коде (за исключением частей программы, написанных на C++, которые будут непосредственно общаться с OpenGL и DirectX). Мне не очень нравится тот факт, что кто-то может без проблем получить доступ ко всему моему коду. Обфускаторы я не уважаю.</p>
<p>2) Если я буду писать в Delphi, созданная мною программа сможет работать хоть на 98-ой винде без каких-либо проблем. Если же я буду писать под третий .NET, программу можно будет запускать лишь на осях начиная с WinXP со вторым сервис паком, на который перед запуском моей проги нужно будет поставить Windows Installer 3.1 и .NET Framework 3. Довольно неудобно.</p>
<p><strong>Плюсы .NET и минусы Delphi:</strong></p>
<p>1) C++/CLI и C# как ЯП по-развитее будут, чем Delphi. Да и сама .NET мне больше симпатизирует. Разбивать на ОО-модули программу в Delphi проблематичнее чем в .NET<br />
Часто нужно определить типы в одном модуле (DLL), а использовать в других.<br />
Есть, конечно, пакеты Delphi.... но к ним у мя душа не лежит :)</p>
<p>2) Защита от дурака (aka GC). Я, правда, работал в одном проекте в комманде из 10 человек.... и, не смотря на GC, продукт всё-равно тёк памятью и ресурсами :) Но всё же.... Хотя, в Delphi для этой цели можно юзать TInterfacedObject и считать ссылки.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Smalltalk]]></title>
<link>http://bug2bug.wordpress.com/?p=98</link>
<pubDate>Thu, 26 Jun 2008 09:47:20 +0000</pubDate>
<dc:creator>bug2bug</dc:creator>
<guid>http://bug2bug.wordpress.com/?p=98</guid>
<description><![CDATA[Изучаю вот язык программирования Smalltalk. Решил сразу на]]></description>
<content:encoded><![CDATA[<p>Изучаю вот язык программирования Smalltalk. Решил сразу начать с переноса программ, которые меня когда-то просили написать. Язык, кстати, использует два основные парадигмы: объектно-ориентированный подход и сигналы. А самое главное, выглядит красиво и оригинально. :)</p>
<p>Вот пример программы, заменяющей максимальное значение в массиве на среднее арифметическое всех элементов этого массива. Реализовал в виде класса, потому что есть большой профит, хотя можно было бы сделать всё намного проще. :)</p>
<p><code></p>
<p>"Основная программа"</p>
<p>"Создаём объект MyArray из массива"</p>
<p>a := MyArray new: #(1 4 2 3).</p>
<p>"Заменяем максимальный элемент на среднее арифметическое<br />
всех элементов и выводим на печать"</p>
<p>(a at: (a maxn) put: (a avg)) printNl.</p>
<p></code></p>
<p>Сам код класса можно найти по адресу<br />
<a href="http://freeshells.ch/~bug2bug/wiki/doku.php?id=smalltalk">http://freeshells.ch/~bug2bug/wiki/doku.php?id=smalltalk</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Что это такое и зачем оно нужно....]]></title>
<link>http://systemhalt.wordpress.com/?p=19</link>
<pubDate>Sun, 22 Jun 2008 23:02:55 +0000</pubDate>
<dc:creator>systemhalt</dc:creator>
<guid>http://systemhalt.wordpress.com/?p=19</guid>
<description><![CDATA[
Для начала хочу рассказать почему я вообще начал подо]]></description>
<content:encoded><![CDATA[<p><a href="http://systemhalt.wordpress.com/files/2008/06/electrons.png"><img src="http://systemhalt.wordpress.com/files/2008/06/electrons.png?w=123" alt="" width="123" height="96" /></a><br />
Для начала хочу рассказать почему я вообще начал подобными вещами заниматься. Дело было на втором курсе. Преподавал физику у нас проректор. И был у него набор программок, написанных им же, которые рассчитывали кое-какие физические задачи и результаты рисовали на экране. Если мне не изменяет склероз, написаны они были на турбо паскале.... ну и графика, естесственно, была соответственной. А у меня был подростковый возраст со всем присущим ему максимализмом, а ещё я неплохо знал Delphi и умел работать с OpenGL. Ну и захотелось мне сделать <em>такое же, только круче</em> :)</p>
<p>В конце концов через год получилось нечто, что я назвал <em>Комплексом Физических Программ</em>. Тут надо заметить, что я писал его не весь год изо дня в день, а периодически (когда настроение было). Имхо, для студента-второкурсника получилось великолепно.</p>
<p>Далее я, увидев, как все были в восторге, решил написать вторую версию, которая бы была <em>намного круче первой</em>, но так уж всё сложилось, что прожив ещё три года, я так ничего и не сделал.</p>
<p>Сейчас же, имея кое-какое свободное время, я решил таки воплотить в жизнь свою <em>детскую мечту</em>.</p>
<p>Цель моя написать некоторое количество программ (навскидку штук тридцать), объединённых в единую систему. Каждая программа - суть модель какой-либо физической сущности. Одна - моделирует распространение колебаний в упругих средах, другая - движение заряженных частиц, третья - движение астатического маятника, четвёртая - ........</p>
<p>Я считаю, что подобная программа - просто находка для преподавателей физике в школах и университетах. Ведь куда интереснее будет предмет для учеников, если они не будут изучать сухую теорию, а смогут увидеть всё своими глазами на практике.</p>
<p>Кстати, потому что Комплекс предназначен в первую очередь для подобных демонстраций, он не предполагает постановки и моделирования каких-либо ресурсоёмких экспериментов. Всё должно быть изменяемо и вычисляемо в реальном времени на среднестатистическом ПК.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Режим секретности]]></title>
<link>http://peter631.wordpress.com/?p=101</link>
<pubDate>Sun, 22 Jun 2008 13:13:21 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=101</guid>
<description><![CDATA[Введение
Ровным счетом ничего секретного не сообщаю, и]]></description>
<content:encoded><![CDATA[<p><strong>Введение</strong></p>
<p>Ровным счетом ничего секретного не сообщаю, излагаю самые банальные вещи. Но с практической точки зрения:)</p>
<p><strong>Мандарторная модель безопасности, упрощенно</strong></p>
<p> Лениво мне описывать всю модель, идите на wikipedию и читайте про модель Бела-ЛаПадулы, мандаторный способ защиты  и прочее. Я изложу практический аспект.  Самые неприятности при построении информационной системы начинаются, когда некоторый тип данных является <strong>секретным</strong>. Никто не может его ни прочесть, ни исказить, не распечатать, ни переслать по каким-либо каналам. В общем, вот есть комната, охраняемая автоматчиками, и там терминал. Даже принтера нет. А если и есть, то выносить распечатки нельзя - дальше определенной зоны. И язык следует держать за зубами, или пуля в лоб. Вот так. Сложные условия.</p>
<p>Как делается.  Ряд определений. <span style="color:#888888;"><strong><em>Контейнер</em>.</strong></span> Это все, что содержит информацию - терминал (в том плане, что физическое устройство, с которого можно глазами данные считать), принтер, канал связи, носитель (а хоть бы и флешка). <strong><em>Данные - </em></strong>все, что эти сведения содержит. <strong><em>Субъект</em></strong> - разумное существо (и программа, выступающая от лица субъекта). И данным, и контейнерам, и субъектам приписываются так называемые <strong><em>метки безопасности</em></strong>. В простом случае - это просто число, характеризующее благонадежность субъекта, секретность данных или уровень доступа контейнера.  Метки сортируются по возрастанию (собственно, необязательно).  Правила просты:</p>
<ol>
<li>Данные нельзя записать в контейнер, если уровень его метки ниже метки данных</li>
<li>Субъект может записывать (но не может читать) данные на более высокий уровень секретности.</li>
<li>Субъект может читать (но не записывать) на более низкий уровень секретности.</li>
</ol>
<p>Таким образом, информация течет только в одном направлении - в сторону большой секретности. Рассекретить ее можно, но если с помощью специальных процедур. В теории это все ужасно просто выглядит. На практике за такую систему возмется штук от силы 5 контор на планете.</p>
<p><strong> Контейнеры - терминал</strong></p>
<p>Как раз с ними самый большой проблем. Вот, скажем, терминал. Это необязательно старый СМ-овский или ЕС-вский терминал а в смысле клиентская программа, и выполняющий ее компьютер. Там где гриды, кнопочки и менюшки. Вопросы тут возникают такие:</p>
<ol>
<li>Каков уровень доверия к данному терминалу? Какого уровня секретности материалы можно на нем показывать? И кому?</li>
<li>Как убедиться в том, что терминал не был физически перемещен? Злой предатель может подключить свой ноутбук к сети WiFi и используя свой легитимный логин, свистнуть секретные данные. Например, терминал уровня 0 стоит в охраняемой комнате. Пропускная система. Программа как-то должна определить, что имеет место с таким-то набором железа, а не с другим. Железо можно подмахнуть. Сами знаете как.</li>
<li>Вначале работы все терминалы нужно разметить. Какой какого уровня. Занести в базу данных (секретную) вместе с хардверным неизменяемым ID.</li>
<li>Также надо убедиться, что с этого терминала нельзя украсть данные. Нельзя подключить внешние накопители (неучтенные и неразмеченные), флешки там, и пр. Также надо убедиться, что по сети с этого терминала никуда, кроме сервера, нельзя попасть.</li>
</ol>
<p><strong>Контейнеры - принтер</strong></p>
<p>С этим гемора еще больше. Как убедиться что принтер тот, за кого он себя выдает. Как обеспечить его ID ( и его безопасную передачу)? Вообще говоря, компания HP производит такие принтеры, но вывоз их за пределы США запрещен под страхом пожизненного заключения. Что делать-то? Паяем сами железку и вкрячиваем туда. Опять же, принтера надо разметить. Учесть, кто где стоит и какой уровень доступа может печатать.</p>
<p>Печатать просто так мы не можем. Этож секретные документы. Мы баннер должны сверху присобачить. Так и написать. под двумя Сережами. И еще баркод сверху, чтобы охранник на выходе, чирикнув по нему сканнером, убедился, что это документ правильный и распечатан легитимно. И в базе безопасности отметить. Такой-то тогда-то документик получил.</p>
<p><strong>Контейнеры - носители</strong></p>
<p>Тут вообще один сплошной ахтунг. Носители надо учитывать, но как? Как HardID неизменяемый на флешку запихать? Опять же данные шифровать надо, причем на каком-то общем для всего уровня безопасности ключе. Опять же (как в любом другом случае)  все это надо проверять...</p>
<p> <strong>Контейнеры  - каналы передачи данных</strong></p>
<p>Опять таки приятного мало. Но полегче. Там аутентификация, сертификаты, их кому попало выдавать не будем, будем HardID в оконечной железки в них записывать и пр. Полегче.</p>
<p> <strong> А теперь - данные!</strong></p>
<p>Вот тут, похоже, начинаются главные трудности. Как отбеспечить "неотрываемость" метки от данных, которые она отмечает? Вычислить совместный хеш? Хеш с секретом? Подпись? Кто будет менять эту метку? И как эту софтину (назовем ее Ядром Безопасности) контролировать? Чтобы не упала? Не отключилась? И через нее не свистнули данные?</p>
<p><strong>Побочные каналы</strong></p>
<p>Вот тут теория и дает сбой. Даже с высокого уровня секретности данные можно тихонечко украсть. И никто не заметит. В этот как раз и состоит главная трудность реализации мандаторной модели. Предположим - я плохой. У меня высокий уровень доступа и моим сообщникам потребовалась копия секретных данных. Мне надо ее выкрасть. Физически это сделать нельзя - все предусмотрено. Ладно. Обзаводимся помошником, пусть даже программным. Запускаем программного помощника на низком уровне хоть бы даже с какого-нибудь удаленного терминала. Помошник следит за 2 двумя файлами - файлом A и файлов B. И определяет, имеет ли к ним доступ кто-нибудь в данных момент. И регистрирует эти факты. Отлично. Я, сверху, тоже имею доступ к этим файлам. Сначала я читаю файл A. Потом B. Потом снова B. Сопоставим чтение файла A двоичной единице, а чтение B - двоичному нулю. Таким образом я кодирую всю секретную информациюю Потом мне остается только забрать данные у программы - помошника.</p>
<p>Побочные каналы могут быть крайне разнообразными.  Я могу включать и выключать мотор принтера, мигать лампочкой на низкоприоритетном терминале, в общем, надо проявить фантазию !!! А самое главное, что никакая теория меня не остановит.</p>
<p> На практике, конечно, большую часть очевидных каналов зашумляют, чтобы они имели скорость пониже, да качество похуже. Кроме того невредно будет запустить эвристический анализатор событий в системе. В общем, большую часть времени вы будете бороться вот с этими каналами.</p>
<p>Такие дела. Если попадется такой проект - знайте, я завидую Вам. Have fun.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Разработка идёт полным ходом]]></title>
<link>http://systemhalt.wordpress.com/?p=15</link>
<pubDate>Sat, 21 Jun 2008 09:42:07 +0000</pubDate>
<dc:creator>systemhalt</dc:creator>
<guid>http://systemhalt.wordpress.com/?p=15</guid>
<description><![CDATA[
Итак, обо всём по-немногу.
Комплекс будет работать тол]]></description>
<content:encoded><![CDATA[<p><a href="http://systemhalt.wordpress.com/files/2008/06/me.png"><img class="alignleft size-thumbnail wp-image-16" src="http://systemhalt.wordpress.com/files/2008/06/me.png?w=96" alt="" width="96" height="96" /></a></p>
<p style="text-align:left;">Итак, обо всём по-немногу.</p>
<p style="text-align:left;">Комплекс будет работать только под Виндой.... смысла в портировании на другие ОС совершенно не вижу.</p>
<p style="text-align:left;">Мультирендер.<br />
Во-первых, OpenGL версии 1.1. Возможно будет модуль для работы через более свежую версию, но в данный момент это в планы не входит.<br />
Во-вторых, DirectX. Восьмой и/или девятый. Десятый опять таки пока в планах не числится. Но, если всё будет хорошо, то, естессно, и его добавлю.</p>
<p style="text-align:left;">Гуй (GUI) по типу того, что был в первой версии Комплекса. С той лишь разницей, что он будет строиться по типу MDI и всё будет происходить в одном основном окне.</p>
<p style="text-align:left;">Выбор конкретного эксперимента - также в 3D. Возможно, что точно также, как и было. Лишь добавлю работу с мышой для удобства.</p>
<p style="text-align:left;">Язык по-дефолту английский. В планах - добавить поддержку разных языков. Надеюсь, сложностей с этим не возникнет. Тогда будут и русский и украинский.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Куда движется софтверная индустрия?]]></title>
<link>http://peter631.wordpress.com/?p=97</link>
<pubDate>Sat, 31 May 2008 05:51:13 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=97</guid>
<description><![CDATA[Медленней чем ожидалось
 Конечно, делать прогнозы сов]]></description>
<content:encoded><![CDATA[<p><strong>Медленней чем ожидалось</strong></p>
<p> Конечно, делать прогнозы совершенно неблагодарное занятие, но тем не менее. Лет пять назад предсказывали взрывной рост приложений на .net. Тем не менее этого не произошло. Кривая роста оказалась куда плавнее, чем это предсказывали платные мудрецы-маркетологи ms. Масса компаний просто боиться переписывать наработанную кодовую базу со старых языков. Вояки предпочитают использовать и развивать Ada.  Крупные страховые фирмы, банки и промышленные компании вполне довольны Cobol. Секьюрники боятся сьезжать с плоского C. Коммутационщики вообще роют в другом направлении, в сторону функциональных языков. Дело не только даже в кодовой базе. Дело в обученных программерах, утилитах, специфических приемах и установленных процедурах. Попробуйте-ка реализовать на С# правительственные требования к безопасности.  Язык c# и вся эта инфраструктура, коли не помрет, устаканится лет через двадцать. Пока объем наших эмпирических знаний о clr и даже о java стремиться к нулю. Мы не знаем, насколько эти системы безопасны. Мы даже не знаем, как, собственно, это обеспечить. Мы не знаем, как обеспечить быстродействие таких систем. Мы толком не знаем, как нам избавиться от реляционных баз, которые уже явно выработали свое,  и  перейти к хранению объектов. Пока что усилия в этом направлении пока что  смехотворны.</p>
<p> <strong>Субстрат</strong></p>
<p><strong> </strong>Вся нынешняя инфраструктура это субстрат, почва, на которой должно вырасти программное обеспечение будущего. Но помилуй бог, сколько придется грохнуть усилий. Вон немцы не пожалели денег и вложились в java. Отчасти у них получилось. Все результаты, они, разумеется, скрывают. Видимо, получилось не шибко здорово.</p>
<p> Нам нужны новые парадигмы. Почему то у предыдуших поколений с парадигмами проблем не возникало. А у нас кишка тонка. Никаких новых парадигм не выработалось, беззастенчиво используются тридцатилетней давности идеи. </p>
<p> </p>
<p> </p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Эффективная нотация: адекватность vs. стандартность]]></title>
<link>http://peter631.wordpress.com/?p=95</link>
<pubDate>Sat, 24 May 2008 06:59:30 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=95</guid>
<description><![CDATA[Всех нас учили, и это справедливо, что нужно писать при]]></description>
<content:encoded><![CDATA[<p>Всех нас учили, и это справедливо, что нужно писать приложения, в которых логика вынесена в данные. Приложения, управляемые данными. Сама программа должна быть примитивной. С особой остротой встает вопрос об адекватности нотации, о ее удобстве и пр. Это не так просто, как кажется. Есть поистине зубодробительные задачки. Вот тут нам в качесте стандартной нотации для всего-всего навязывают (именно навязывают) XML. Вещь, конечно, весьма неплохая, но подходит явно не ко всему, согласитесь. То есть, программисты "мира Windows &#38; Miscosoft" практически лишены выбора.  Нам приходиться использовать то, что дают. Почему? Потому что, предложив нестандартную нотацию, мы рискуем многим:</p>
<ol>
<li>Не поймут дураки-манагеры клиентов</li>
<li>Разработка парсеров для своей нотации дело хлопотное и долгое</li>
<li>При всем удобстве самописный софт еще долго будет глючным</li>
</ol>
<p>Отчасти я завидую ребятам из мира Unix. Там можно делать все, что тебе захочется. Раньше мы пользовались большой свободой и под Windows, когда существовали альтернативные среды разработки, такие как Java и Дельфи, SmallTalk  и пр. Сейчас производители этих средств махнули рукой на Windows,  и сконцентрировались почти исключительно на LInux,  а MS подгребла под себя все.  В результате виндозники остались с CLR и C#. Эта очень узкая ниша в конечном счете погубит Windows,  которая, в общем-то, является неплохой OS.</p>
<p>Так что приходиться забыть о своих собственных разработках ради вливания в узкий поток MainStream'а, хоть бы и ценой удобства.  Стоит ли оно того?</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Комплекс Физических Программ 2]]></title>
<link>http://systemhalt.wordpress.com/?p=6</link>
<pubDate>Fri, 09 May 2008 22:55:16 +0000</pubDate>
<dc:creator>systemhalt</dc:creator>
<guid>http://systemhalt.wordpress.com/?p=6</guid>
<description><![CDATA[
Прошло несколько лет с момента, когда я создал мой]]></description>
<content:encoded><![CDATA[[gallery]
<p>Прошло несколько лет с момента, когда я создал мой Комплекс Физических Программ. Именно с того момента я убеждён, что эта программа была лишь пробником, альфа-версией чего-то более существенного, хорошо проработанного, профессионального, чего-то действительно стоящего всеобщего всеобщего внимания. Но, сколько я ни пытался начинать разрабатывать вторую версию, сколько ни проектировал и продумывал детали реализации, каждый раз я забрасывал разработку. Через какое-то время я опять брался за дело и.... опять забрасывал. Несколько раз даже получалось нечто работающее. Но каждый раз я приходил к заключению, что это всё не то. Если первый Комплекс считать альфа-версией моего мега-проекта, то, будучи настроенным написать бету, я бы это давно уже сделал. Увы, я вбил себе в голову, что это должен быть завершённый продукт и никак иначе.</p>
<p>Сейчас наступает тот момент, когда я закончу этот грёбаный университет (если закончу) и, в свободное от работы время, смогу заняться Комплексом-2 вплотную. Не скрою, что сейчас у меня уже нет той уверенности в необходимости его разработки, которая была несколько лет назад. Я не знаю, действительно ли он будет полезен многим людям. Знаю лишь точно, что в ближайшее время я обязан сделать нечто такое, а других глобальных идей, кроме Комплекса-2, у меня нет.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Как писать юнит-тесты на C++]]></title>
<link>http://peter631.wordpress.com/?p=90</link>
<pubDate>Wed, 30 Apr 2008 06:22:01 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=90</guid>
<description><![CDATA[Будьте проще
Применение юнит-тестов при наприсании со]]></description>
<content:encoded><![CDATA[<p><strong>Будьте проще</strong></p>
<p>Применение юнит-тестов при наприсании софта на C++, а также проектирование по контракту, приносят очень большую пользу, особенно на необорудованных платформах.  Я не претендую на крутизну решения, однако мое решение непохо работает. Есть, конечно, вещи типа CppUnit, но я предпочитаю пользоваться простейшей из возможных методик.<br />
<code><br />
//*****************************************************************************<br />
//<br />
// Freeware. As Is.<br />
// Простейшая из возможных среда юнит-тестирования на неуправляемом C++<br />
// Легко перенести в Linux. Проверена временем:)<br />
//<br />
// Ограничения :<br />
//<br />
// 1) не ловит информацию об исключениях, не явл. потомками std::exception<br />
// 2) в случае исключения-потомка std::exception не дает информации про строку и файл<br />
//<br />
// $Header$<br />
//<br />
//*****************************************************************************<br />
#include "TestSuite.h"</code></p>
<p>void success()<br />
//<br />
// Этот тест успешен<br />
//<br />
{</p>
<p>}<br />
//<br />
//---------------------------------------<br />
//<br />
void<br />
failedTest()<br />
//<br />
// Этот тест проваливается по условию и пишет строку, файл и сообщение<br />
//<br />
{<br />
CHECK(false, "Bide");<br />
}<br />
//<br />
//---------------------------------------<br />
//<br />
void<br />
alwaysFail(void)<br />
//<br />
// Этот тест проваливается безусловно и пишет строку, файл и сообщение<br />
//<br />
{<br />
FAIL("Malfunction");<br />
}<br />
//<br />
//---------------------------------------<br />
//<br />
void<br />
throwsSomeWildException()<br />
//<br />
// Раскручивает исключение, не являющееся потомком std::exception<br />
//<br />
{<br />
throw 0x0010033;<br />
}<br />
//<br />
//---------------------------------------<br />
//<br />
void<br />
throwsCorrectException()<br />
//<br />
// Раскручивает корректное исключение, но строки и файла Вы не увидите<br />
//<br />
{<br />
throw std::invalid_argument("invalid argument");<br />
}<br />
//<br />
//---------------------------------------<br />
//<br />
int<br />
main(int argc, char* argv[])<br />
{<br />
TestSuite suite;</p>
<p>suite.registerTest(success, "success");<br />
suite.registerTest(alwaysFail, "alwaysFail");<br />
suite.registerTest(failedTest, "failedTest");<br />
suite.registerTest(throwsSomeWildException, "throwsSomeWildException");<br />
suite.registerTest(throwsCorrectException, "throwsSomeWildException");</p>
<p>suite.runAll();</p>
<p>char s[10];<br />
gets(s);<br />
return 0;<br />
}<br />
</code></p>
<p>Полный текст решения доступен по запросу. Пишите - я Вам его вышлю. Написание тестов в этой среде не представляет никакого труда. Каждый тест - это просто функция, которая не возвращает результата и не принимает никаких параметров :  <strong>void testFunction(void).</strong> После того, как тест написан, его надо зарегистрировать и дать ему хинт, под которым он будет выводиться. Проверка условий осуществляется макросом CHECK. Если что не так, макрос напишет, где именно что не так (удобно). Безусловно отрицает тест вызов макроса FAIL. Всего-то делов (зато какая польза). Если в проекте много файлов или подсистем - пишите отдельные файлы, передавайте туда ссылку на TestSuite и регистрите тесты там. Если не лениво, можете усовершенствовать сорцы, добавив цвет и пр.<br />
Ограничения - см. комментарий.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Нотариальная практика в разработке программ]]></title>
<link>http://peter631.wordpress.com/?p=88</link>
<pubDate>Mon, 28 Apr 2008 06:12:43 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=88</guid>
<description><![CDATA[Суть проблемы
Название необычно звучит, правда? Тем не ]]></description>
<content:encoded><![CDATA[<p><strong>Суть проблемы</strong></p>
<p>Название необычно звучит, правда? Тем не менее вещь весьма полезная. Представим ситуацию. Два программера, A и B, совместно пишут программу. Один пишет клиента (не обязательно сетевого), второй - сервер(тоже не обязательно сетевой). В процессе работы они согласовывают сигнатуры методов, суть работы, сигнализацию об ошибках и пр. Пока все хорошо. Проходит полгода (год). Детали программы уже забыты, тесты потеряны (или, в силу специфики, не существуют), а программа дает сбой (или просто начинает тормозить). Кто виноват? Начинаются разборки. Знакомое явление? Более чем. Низкая культура разработки, говорите? Правильно.</p>
<p><strong>Решение проблемы</strong></p>
<p>Согласовать поведение метода и его сигнатуру в <em>письменном виде и передать на хранение третьей стороне</em> - библиотекарю проекта, или нотариусу проекта. Долго, говорите? Лучше сейчас потратить время (немного), чем потом нервы. Такое согласование и будет самым настоящим <strong><em>контрактом</em>.</strong></p>
<p><strong>Что мы пишем в контраке?</strong></p>
<p>Предмет договора - вызов метода xxxxAAAABBB. В контракте указываются:</p>
<ol>
<li>ФИО сторон и дата подписания. Строки документа пронумерованы. Нотариус ставит свою подпись.</li>
<li>Что, собственно, делает метод;</li>
<li>Параметры метода, их типы и возвращемый результат (и его тип);</li>
<li><strong>Очень важно</strong>: неявно маршаллируемые параметры, как то: массивы структур, XML - документы, переданные строкой или через интерфейс, таблицы в памяти (MemData) (Что бы избежать потом вопроса типа : Ты какие поля мне тут передаешь????) и пр. ;</li>
<li>Согласованная обеими сторонами процедура валидации входных данных (особенно для неявно маршаллируемых) и выходных данных (очень важно, но все почему-то забывают).</li>
<li>Время выполнения вызова, если это актуально и, главное, согласованная обеими сторонами процедура его измерения;</li>
<li>Требования к выходным параметрам и резултьтату (особенно неявного маршаллинга);</li>
<li>Обработка ошибок в методе : полная безопасность от исключений, разрешение исключений, исключения определенного типа, код возврата и пр. Например, для функций нежелательно возбужение исключений;</li>
<li>Состояние класса после исключения:  непредсказуемое (нет гарантий), одно из разрешенных (слабая гарантия), состояние, предшествующее вызову метода (сильная гарантия).</li>
<li>Для сетевых вывовов - максимальный размер передаваемых данных. Как правило, он ограничен (вот, скажем, для web-служб).</li>
<li>Заплатки или временные решения</li>
</ol>
<p><strong>Когда это делать</strong></p>
<p>Разумеется, не стоит тратить время на все методы. Но на важные - обязательно. На часто используемые - обязательно. На методы, где есть сомнительные моменты или заплатки - обязательно.  Контракт можно всегда пересмотеть и заключить новый - это не вопрос, но важно, чтобы он был.</p>
<p> Да, вот еще что. Фиксируйте номер контракта (ссылку) в самом коде приложения, а то потом концов не найти.</p>
<p> </p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Ускоряем базу - 1]]></title>
<link>http://peter631.wordpress.com/?p=79</link>
<pubDate>Sun, 20 Apr 2008 07:21:02 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=79</guid>
<description><![CDATA[Общее
Это статья из цикла &#8220;Укорение работы баз данн]]></description>
<content:encoded><![CDATA[<p><strong>Общее</strong></p>
<p>Это статья из цикла "<strong><em>Укорение работы баз данных под управлением СУБД MS SQL</em></strong>". Сегодня мы рассмотрим файловые группы базы данных.</p>
<p><strong>Зачем нужны файловые группы SQL</strong></p>
<p>Оставлять большую базу данных в виде двух сегенерированных по умолчанию файлов - наихудшая практика. Оставить базу в таком положении можно лишь для разработки и очень небольших баз. В остальных случаях следует разбить базу данных по группам и файлам. Ниже мы рассмотрим разбиение базы данных по файловым группам. Итак, файловые группы нужны нам для:</p>
<ol>
<li>обеспечения работы секционирования (partitioning) больших таблиц</li>
<li>для ускорения работы базы путем разнесения таблиц с существенно различными характеристиками доступа по разным файлам и дискам</li>
<li>для поддержки многопроцессорных платформ</li>
<li>отделения индексов от таблиц и вынесения колонок типа BLOB в отдельные файлы (группы)</li>
<li>обеспечения работы базы в условиях нехватки дискового пространства</li>
<li>для организации раздельных backup'ов.</li>
</ol>
<p> </p>
<p> Рассмотрим каждое из применений. Обеспечение секционирования базы таблицы (индекса). Довольно часто встречается ситуация, когда <strong>нужно </strong>хранить данные в одной большой таблице. Всякие там истории транзакций, архивы операций, журналы и прочее. И нет никакой возможности куда-либо это слить из базы. Со временем такая таблица разрастается, занимает много места на томе, все больше и больше времени уходит на поиск  в ней и ее дефрагментацию. Поэтому все нормальные СУБД (с версии 2005 - и MS SQL, наконец-то) предлагают таблицы<strong> секционировать, </strong>разбить на разделы - partitions, по какому-либо признаку, скажем, по месяцам. Каждый фрагмент такой таблицы будет помещен в свой файл (группу файлов). СУБД в случае секционированной таблицы не тратит время, чтобы лопатить весь файл базы, а ориентируется по индексу и читает\пишет данные сразу в/из нужного файла. Таким образом мы экономим на времени и, что немаловажно, на блокировках. Кроме того, каждую файловую группу можно забэекапить отдельно.</p>
<p>Разнесение разных таблиц по файловым группам. Нетривиальная база содержит десятки, если не сотни таблиц. Доступ к этим данным совершенно отчетливо разный - одни используются редко, вторые - часто. В одни больше пишем, вторые читаем. Скажем, редко используемые справочники мы поместим в отдельную файловую группу и переведем на медленный диск. А оперативные данные - на самый быстрый. Архив - тоже на медленный, но на большой. С целом быстродействие системы, время ее отклика повыситься, так как разные по характеру запросы перестанут отнимать друг у друга диск (файл, группу файлов). Бессмысленно смотреть в профайлер, пытаясь понять, почему запросы тормозят. Нужно посмотреть в другое место (анализ базы и счетчики- в отдельной статье). </p>
<p>Поддержка многопроцессорных систем. В то время как однопроцессорная система только делает вид, что умеет выполнять несколько процессов одновременно, многопроцессорные системы <strong>реально </strong>выполняют задачи в параллель. В том числе - и задачи записи и чтения данных на диск. Можно позволить SQL - серверу использовать несколько процессоров для одновременной записи данных на диск, создав в базе несколько , так сказать, "беговых дорожек". Гипертрединг лучше отключить, все равно SQL не понимает, что это такое. Следует поэкспериментровать с этим. У меня получались наилучшие результаты при числе файлов, равном удвоенному числу процессоров, без учета гипертрединга (гипертредный процесссор считается за единицу).</p>
<p>Отделение индексов и блобов. Тут то же соображение, что и во втором пункте - индекса и сами данные суть различающиеся по активности единицы. БЛОБы вообще храняться в базе отдельно. Посему в активно используемой базе индекса сдедует хранить отдельно, особенно учитывая возможность их отключения (потенцальную возможность), а также необходимость их регулярного перестроения. Лучше перестроить один маленький файлик, чем базу на 2000 Гигабайт, а? Кластерные индексы не в счет, они все равно представляют в конечном счете сами данные. Так что с кластерными не получиться. БЛОБЫ вообще отдельный вопрос. Если две таблицы имеют два блобовых поля, храните эти блобы по разным группам.</p>
<p>Нехватка дискового пространства. Тут все просто. Представим, что мы слегка просчитались, и база вот-вот заполнит диск. Места там уже нет, том не расширяемый. Что делать? Добавить в базу файл на другом диске, лучше - отдельной группой. </p>
<p> Резервное копирование групп. Тоже все просто: база содержит справочные данные, которые вообще никогда не меняются, но которых внушительное число, и оперативный журнал, который маленький, но критичный к потере, а также огромного размера архив, который в принципе уже по большей части заархивирован. Неразумно тратить дисковое \ ленточное пространство на резервное копирование тех же самых данных каждый раз по-новой. Лучше копировать только оперативные, справочники - вообще один раз, а архив - инкрементально. (Про хардваре для базы - следующий раз.)</p>
<p> </p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Еще раз о пользе мини-языков]]></title>
<link>http://peter631.wordpress.com/?p=70</link>
<pubDate>Sat, 05 Apr 2008 12:47:12 +0000</pubDate>
<dc:creator>peter631</dc:creator>
<guid>http://peter631.wordpress.com/?p=70</guid>
<description><![CDATA[Мини-языки vs утилиты с GUI
 
Недавно меня спросили, зачем]]></description>
<content:encoded><![CDATA[<h2><em><span style="font-size:large;"><span style="font-family:Arial;">Мини-языки vs утилиты с GUI</span></span></em></h2>
<p class="MsoNormal" style="margin:0;"><span><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>Недавно меня спросили, зачем я</span> создаю мини-языки, а не пишу утилит с GUI. Я сказал, что мне так удобно. В этой статье я попытаюсь объяснить, в чем состоит преимущество мини-языков.<span> (Утилиты с GUI я тоже, конечно, пишу</span></span><span style="font-family:Wingdings;"><span>J</span></span></span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;">Мини-язык – во-первых, это способ передачи знания о системе. Способ, встроенный в саму систему. Вы можете написать скрипт на мини-языке и передать его другим пользователям, например, опубликовав на форуме. Да и Вам этот скрипт потом пригодиться. Во-вторых, мини-язык во многих случаях помогает понять метафору системы, ее словарь. Я совершенно не против утилит с окошками и меню. В начале своей карьеры я писал такие утилиты во множестве, да и сейчас пишу. Утилиты популярны. Утилиты – это ложка, которая дорога к обеду. Но у графических утилит есть недостатки:</span></p>
<p class="MsoNormal" style="text-indent:-18pt;text-align:justify;margin:0 0 0 45pt;"><span style="font-family:Symbol;"><span><span style="font-size:small;">·</span><span style="font:7pt;">        </span></span></span><span style="font-size:small;"><span style="font-family:Times New Roman;">Вам придется написать к утилите ReadMe или рассказать каждому пользователю, как ее использовать; </span></span></p>
<p class="MsoNormal" style="text-indent:-18pt;text-align:justify;margin:0 0 0 45pt;"><span style="font-family:Symbol;"><span><span style="font-size:small;">·</span><span style="font:7pt;">        </span></span></span><span><span style="font-size:small;"><span style="font-family:Times New Roman;">Если речь идет о рутинных, повторяемых операциях, то пользователь каждый раз должен будет нажимать на одни и те же кнопки;</span></span></span></p>
<p class="MsoNormal" style="text-indent:-18pt;text-align:justify;margin:0 0 0 45pt;"><span style="font-family:Symbol;"><span><span style="font-size:small;">·</span><span style="font:7pt;">        </span></span></span><span style="font-size:small;"><span style="font-family:Times New Roman;">Утилит, как правило, получается много (не спорьте. Много,<span>  </span>и вы сами прекрасно это знаете.)</span></span></p>
<p class="MsoNormal" style="text-indent:-18pt;text-align:justify;margin:0 0 0 45pt;"><span style="font-family:Symbol;"><span><span style="font-size:small;">·</span><span style="font:7pt;">        </span></span></span><span><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<h2><span><em><span style="font-size:large;font-family:Arial;">Где нам пригодятся мини-языки</span></em></span></h2>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="text-indent:9pt;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;">Мы можем использовать мини-язык в качестве:</span></span></span></p>
<p class="MsoNormal" style="text-indent:9pt;margin:0;"><span><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="text-indent:-18pt;margin:0 0 0 45pt;"><span style="font-family:Times New Roman;"><span><span><span style="font-size:small;">1.</span><span style="font:7pt;">      </span></span></span><span style="font-size:small;">Средства <em>конфигурирования</em>, хранения настроек – как например, сделано в роутерах или видеоиграх. </span></span></p>
<p class="MsoNormal" style="text-indent:-18pt;margin:0 0 0 45pt;"><span style="font-family:Times New Roman;"><span><span><span style="font-size:small;">2.</span><span style="font:7pt;">      </span></span></span><span style="font-size:small;">Средства <em>первоначальной генерации</em> системы – как например, в базах данных. Вы сможете создать экземпляр базы данных, выполнив скрипт. </span></span></p>
<p class="MsoNormal" style="text-indent:-18pt;margin:0 0 0 45pt;"><span style="font-family:Times New Roman;"><span><span><span style="font-size:small;">3.</span><span style="font:7pt;">      </span></span></span><span style="font-size:small;">Средства <em>описания</em> объектов системы, коль скоро это удобно (та же база) и выразимо в виде <em>языка</em></span></span></p>
<p class="MsoNormal" style="text-indent:-18pt;margin:0 0 0 45pt;"><span style="font-family:Times New Roman;"><span><span><span style="font-size:small;">4.</span><span style="font:7pt;">      </span></span></span><span style="font-size:small;">Средства описания рутинных операций, особенно периодических – например, архивирование.</span></span></p>
<p class="MsoNormal" style="text-indent:-18pt;margin:0 0 0 45pt;"><span style="font-family:Times New Roman;"><span><span><span style="font-size:small;">5.</span><span style="font:7pt;">      </span></span></span><span style="font-size:small;">Средства технической диагностики – в аппаратных системах. Послать сигнал А, убедиться, что пришел ответ B. </span></span></p>
<p class="MsoNormal" style="text-indent:-18pt;margin:0 0 0 45pt;"><span style="font-family:Times New Roman;"><span><span><span style="font-size:small;">6.</span><span style="font:7pt;">      </span></span></span><span style="font-size:small;">Средства поддержки разработки – для приемочного тестирования и поддержки разработки и на всех этапах (<span>“</span>накат<span>”</span> состояния на модель и очистку).</span></span></p>
<h2><em><span style="font-size:large;font-family:Arial;">Где нам не пригодятся мини-языки</span></em></h2>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;">Предметная область содержит интенсивную графику. Мы, разумеется, можем описать окно Windows в виде <em>языка </em>(вспоминаем ресурсные файлы), но этот способ удобным не назовешь. Также, мы можем <em>описать</em> уровень видеоигры, но лучше его нарисовать. Таково наше мышление – разум идет наикратчайшим путем. </span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;">Предметную область лучше выразить в виде диаграммы, картинки. </span></p>
<h2><em><span style="font-size:large;font-family:Arial;">Рекомендации по созданию мини-языков</span></em></h2>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;">Язык должен быть простым, иначе пользователи не станут его использовать. Он должен содержать в упрощенном виде описания нужных понятий и операций. Язык должен быть ортогональным. Язык должен быть минимальным и достаточным. Это сложные цели, и добьетесь Вы их не сразу. Про ортогональность – одно действие соответствует одному оператору языка. Не надо использовать для этого сотню разных команд. Про простоту – не надо использовать скриптовые языки типа VB или Java Script. Это все-таки языки программирования, а программированию надо специально обучаться. Это слишком <em>сложные</em> языки <em>для пользователя</em>. Про достаточность и минимализм – язык должен охватывать все нужные пользователю операции, но их должно немного. </span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;">Кроме того, не нужно слишком затруднять пользователя.<span>  </span>Операции должны быть <em>упрощены</em> до концептуального понятного пользователю уровня. Если ему надо выгрузить накладные из базы в файл, он ничего не должен знать про формат этого файла. </span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;">Про операторы. Не стоит злоупотреблять аббревиатурами, как это делает одна известная фирма (BLKSIZE=10, FMT=UUSB, PGM=My)<span>. Аббревиатуры моментально выветриваются из памяти. </span><strong>Пользователь не должен напрягаться, иначе он не станет использовать этот язык</strong>. Оптимальная длина идентификатора – 6-9 символов. Допускаются короткие, если они выражают целое слово (например, OPEN, TALK, SEND). </span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;">Интерпретатор языка должен быть регистро-нечувствительным. Написание зарезервированных слов большими буквами должны быть стилем, а не требованием.</span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;">Одного оператора в строке достаточно. И вообще, не слишком усердствуйте с парсером. Пусть строка оператора будет иметь позиционные ограничения – пользователи привыкнут, если эти правила просты (скажем, 1-5 позиция – метка, 7-71 оператор, операнды отделяются пробелом и пр.)</span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">Поддерживайте идиому комментариев. Пусть комментарием будет пустая строка. Пусть комментарий начинается с символа <span>“</span>#<span>”.</span></span></span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;">Поддерживайте именованные параметры. Позиционные параметры в команде числом более трех все равно никто не запомнит (ну, максимум пять). </span></span></span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">Не стремитесь к тому, чтобы фраза языка напоминала естественный язык. Это ненужный расход памяти человека (вспомним Кобол: ADD GINN TO VERMUT GIVING <span>M</span>ARTINI<span>). </span></span></span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>Не злоупотребляейте спецсимволами (&#60;Config aaa=&#38;AL</span>&#38;<span> – script=%sfsdf%&#62;).</span></span></span></p>
<h2><em><span style="font-size:large;"><span style="font-family:Arial;">Оценки<span> разных </span>м<span>ини-языков</span></span></span></em></h2>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><strong>Предупреждение. </strong>Все нижеприведенные соображения являются личным мнением автора, которое не навязывается. Автор не высказывает скрытых и явных претензий к авторам и фирмам- разработчикам языков и программных средств и не преследует рекламных и анти-рекламных целей.</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<ul style="margin-top:0;" type="disc">
<li class="MsoNormal"><span><span style="font-size:small;"><span style="font-family:Times New Roman;">XML. Можно сделать и сложно и просто. Но в общем и целом от него просто рябит в глазах. Как показывает практика, лучше использовать ту или иную графическую оболочку для редактирования (что сводит на нет его преимущества как языка.) Оценка – 2+.</span></span></span></li>
<li class="MsoNormal"><span><span style="font-size:small;"><span style="font-family:Times New Roman;">Ini-файлы. Очень хороши, для простых случаев. Оценка – 4.</span></span></span></li>
<li class="MsoNormal"><span style="font-size:small;"><span style="font-family:Times New Roman;">Конфиги видеогр типа <span>“</span>Quake<span>”</span>. Адекватны для своей области. Оценка – 5.</span></span></li>
<li class="MsoNormal"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>JCL компании IBM. Хорош, очень хорош, но написание всего большими буквами и сложноватые правила переноса его очень портят. Оценка – 4 </span>+.</span></span></li>
<li class="MsoNormal"><span><span style="font-size:small;"><span style="font-family:Times New Roman;">Конфиги xinted в UNIX. Очень хороши, понятны, но парсер сложноват. Оценка – 5.</span></span></span></li>
</ul>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">В книге Э. Реймонда «<em><span>Искусство программирования под Unix</span></em><span>” рассматриваемой теме посвящена целая глава, там масса хороших примеров, однако некоторая </span>«<span>упертость” юниксоидов в текстовую обработку всего и вся мешает ему</span>, на мой взгляд,<span> адекватно оценить реальность. Книга "Программист-прагматик" Эндрю Ханта тоже освещает этот вопрос, но не так подробно. Исчерпывающие данные в статье Диомидиса Спинеллиса "Notable design patterns for domain-specific languages".</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span style="font-size:small;"></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>Поскольку с мэнфреймами ныне мало кто знаком (а зря), привожу фрагмент файла на языке JCL из свободно-распространяемой версии IBM MVS 3.8:</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span style="font-size:small;"></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>//SG0290 JOB   (TSO),<br />
//             'Add TSO users',<br />
//             CLASS=A,<br />
//             MSGCLASS=A,<br />
//             COND=(0,NE),<br />
//             MSGLEVEL=(1,1)<br />
//*********************************************************************<br />
//*<br />
//*                       MVS 3.8 SYSGEN<br />
//*                       ==============<br />
//*<br />
//*<br />
//* DESC: Add new TSO users<br />
//*           System Programmers:    HERC01: no password<br />
//*                                  HERC02: password = CUL8TR<br />
//*           Standard users:        HERC03: no password<br />
//*                                  HERC04: password = PASS4U<br />
//*<br />
//*********************************************************************<br />
//*<br />
//ADDUSER PROC HLQ=MISSING,UTYPE= USER(P) or SYSP(P)<br />
//CLEANUP EXEC PGM=IEFBR14<br />
//ASM      DD  DISP=(MOD,DELETE),DSN=&#38;HLQ..TEST.ASM,<br />
//             UNIT=TSO,SPACE=(TRK,(0))<br />
//CMDPROC  DD  DISP=(MOD,DELETE),DSN=&#38;HLQ..CMDPROC,<br />
//             UNIT=TSO,SPACE=(TRK,(0))<br />
//CNTL     DD  DISP=(MOD,DELETE),DSN=&#38;HLQ..TEST.CNTL,<br />
//             UNIT=TSO,SPACE=(TRK,(0))<br />
//LOADLIB  DD  DISP=(MOD,DELETE),DSN=&#38;HLQ..TEST.LOADLIB,<br />
//             UNIT=TSO,SPACE=(TRK,(0))<br />
//BLDCRD1 EXEC PGM=IEUASM,<br />
//             PARM='NOLIST,TERM,DECK,NOLOAD,NOOBJ,SYSPARM(&#38;HLQ)'<br />
</span></span></span></p>
<p><strong><em><span style="font-size:14pt;font-family:Arial;"><br />
</span></em></strong></p>
<h2><span><em><span style="font-size:large;font-family:Arial;">Декларативная или императивная семантика</span></em></span></h2>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>Если мы что-то описываем или конфигурируем, лучше декларативная (не как сделать, а что сделать). Если мы что-</span>то <span>делаем,</span> какую-то процедуру, семантика императивная. Совмещение возможно.</span></span></p>
<h2><em><span style="font-size:large;font-family:Arial;">Связь языка с визуальными средствами</span></em></h2>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;">Если язык описывает состояние модели, например – конфигурацию, то лучше если визуальные средства будут уметь как загружать состояние из мини-языка, так и выгружать его в том же виде. Пример – роутеры.</span></p>
<h2><em><span style="font-size:large;"><span style="font-family:Arial;"><span>Пример воображаемого </span>мини-<span>языка</span></span></span></em></h2>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;">#</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>#</span><span>          </span>Язык описания конечных автоматов.</span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;font-family:Times New Roman;">#</span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>DROP<span>             </span>Message-FSM</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>MACHINE<span>     </span>Message-FSM</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;">#</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>#<span>                      </span></span>Назначение символических имен кодам сообщений</span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;">#</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>ALIAS<span>            </span>State-1<span>            </span>1</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>ALIAS<span>            </span>State-2<span>            </span>2</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>TRANS<span>           </span>FROM=State-1, ON=Message-1, TO=State-2,<span>  </span>EXEC = “ProcessMessage”</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>TRANS<span>           </span>FROM=State-1, ON=Message-2, TO=State-3,<span>  </span>EXEC = “ProcessMessage”,\</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>                                   </span>COND=(Field1=10)</span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span><span>APPLY<span>           </span></span></span></span></p>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>STORE<span>           </span>FILENAME=”MyMachine.bin”</span></span></span></p>
<h2><em><span style="font-size:large;font-family:Arial;">Процесс разработки языка</span></em></h2>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;">Разрабатывайте совместно с пользователем, он ваш судья и последняя инстанция. Узнайте его нужды. Быстро добавляете возможности. Быстро исправляйте ошибки. Только в этом случае результат будет хороший.</span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<h2><em><span style="font-size:large;font-family:Arial;">Каким образом мини-язык поможет Вам самому </span></em></h2>
<p class="MsoNormal" style="text-align:justify;margin:0 0 0 27pt;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="text-indent:9pt;text-align:justify;margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">Если мы пишем систему «<span>от тестов”, лучше, если каждый кусок можно будет протестировать.</span> К несчастью, это не всегда удается реализовать (Хотя надо к этому стремиться). Как правило, накат состояния на модель – сложная и ресурсоемкая процедура. Если такая ситуация имеет место, проект практически обречен с самого начала. (В большинстве программерских контор так оно и есть). Может быть, автоматизировать создание состояния для тестов? <span><span> </span>Ниже приводиться малость надуманный пример. </span></span></span></p>
<h3><span style="font-size:medium;font-family:Arial;"> </span></h3>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span><span style="font-size:small;font-family:Times New Roman;">            </span></span></p>
<h3><span style="font-size:medium;"><span style="font-family:Arial;"><span><span>         </span></span>Пример теста без мини-языка</span></span></h3>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>Database.Open();</span></span></p>
<p class="MsoNormal" style="text-indent:35.4pt;margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;">ExecSql(“DELETE FROM WbContent”);</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>ExecSql(“DELETE FROM WbHeaders”);</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>StartupTransactionMonitor();</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>ExecSql(“INSERT INTO WbHeaders....);</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>ExecSql(“INSERT INTO WbContent…);</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;">//</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>//<span>                      </span>Тут еще всякой всячины…</span>.</span></span></p>
<p class="MsoNormal" style="margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;">//</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span><span>            </span>ShowMessage(“Нажмите клавишу </span>для <span>проводки</span> накладной<span>”);</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span><span>Check (Rs = ExecSql(“SELECT * FROM WbHeaders…”) == 1);</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<h3><span><span style="font-size:medium;font-family:Arial;">Пример с мини-языком</span></span></h3>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span><span><br />
[sourcecode]<br />
ExecScript(“CLEAR DATABASE<span>      </span>UNIT=Waybills”);</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>            </span>ExecScript(“START DATABASE”);</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span><span>            </span>ExecScript(“NEW waybill FILE=”Waybill.txt”</span>, <span>OPERATION=Pass);</span></span></span></p>
<p class="MsoNormal" style="text-indent:35.4pt;mar