<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:petr_leonov</id>
  <title>petr_leonov</title>
  <subtitle>petr_leonov</subtitle>
  <author>
    <name>petr_leonov</name>
  </author>
  <link rel="alternate" type="text/html" href="http://petr-leonov.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://petr-leonov.livejournal.com/data/atom"/>
  <updated>2009-05-19T20:30:17Z</updated>
  <lj:journal userid="11532469" username="petr_leonov" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://petr-leonov.livejournal.com/data/atom" title="petr_leonov"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:petr_leonov:1668</id>
    <link rel="alternate" type="text/html" href="http://petr-leonov.livejournal.com/1668.html"/>
    <link rel="self" type="text/xml" href="http://petr-leonov.livejournal.com/data/atom/?itemid=1668"/>
    <title>Диплом в МИП</title>
    <published>2009-05-19T20:20:00Z</published>
    <updated>2009-05-19T20:30:17Z</updated>
    <content type="html">Выпускную квалификационную работу по менеджменту писал по такому плану:&lt;br /&gt;1. Теоретическая часть: можно и нужно скопипастить из другой работы по теме, курсач подойдет;&lt;br /&gt;2. Практическая часть;&lt;br /&gt;2.1 Характеристика объекта исследования: простой рассказ о фирме, которую улучшаем;&lt;br /&gt;2.2 Анализ объекта исследования: не простой, а по теме диплома рассказ о фирме, с использованием всяких методик анализа, которые подразумевает тема вашей работы&lt;br /&gt;2.3 Предложения по улучшению: самая творческая часть работы, здесь надо придумать как убрать плохое (выявленное анализом) и добавить хорошее в улучшаемую фирму&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Главные бумажки:&lt;br /&gt;1. Отзыв руководителя&lt;br /&gt;2. Резензия у другого препода&lt;br /&gt;3. Подписанный заведующим кафедрой титульный лист (ну, и вами самим)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Порядок защиты:&lt;br /&gt;1. Актуальность работы: в чем актуальность вашей работы спросите у руководителя &amp;mdash; ему все равно это придумывать придется;&lt;br /&gt;2. Цель: чаще всего целью является разработка предложений по улучшению, углублению, оптимизации и так далее; улучшают обычно фирму (объект исследования);&lt;br /&gt;3. Характеристика объекта исследования: не вдаваясь в подробности, не касающиеся основной темы работы, надо коротко рассказать о фирме, которую вы собрались улучшать;&lt;br /&gt;4. Результаты анализа: без анализов нельзя поставить диагноз, вы (или ваш ангел хранитель) делали этот анализ в пркактической части работы, коротко расскажите о самых ярких впечатлениях от фирмы;&lt;br /&gt;5. Предложения по улучшению: самая главная часть; тут надо выложить все свои мозги, в ассортименте.&lt;br /&gt;&lt;br /&gt;Защищая диплом надо делать упор именно на предложения. Если в самой работе важно качественно провести анализ и выдвинуть грамотные предложения, то во время защиты важно давить именно на придуманные вами предложения по улучшению. Ну, и быть готовыми их защитить (потому и защита).&lt;br /&gt;&lt;br /&gt;А еще словечек мудреных подучить полезно — ученые люди любят и уважают термины. Много слов не надо, вы же не соревноваться пришли. Несколько гармонично вставленных труднообъяснимых словечек будет достаточно.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:petr_leonov:1415</id>
    <link rel="alternate" type="text/html" href="http://petr-leonov.livejournal.com/1415.html"/>
    <link rel="self" type="text/xml" href="http://petr-leonov.livejournal.com/data/atom/?itemid=1415"/>
    <title>petr_leonov @ 2009-01-26T19:10:00</title>
    <published>2009-01-26T16:18:08Z</published>
    <updated>2009-01-26T16:21:21Z</updated>
    <content type="html">&amp;lt;/a&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&lt;span class='ljuser  ljuser-name_vippergirl_bez' lj:user='vippergirl_bez' style='white-space: nowrap;'&gt;&lt;a href='http://vippergirl-bez.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://vippergirl-bez.livejournal.com/'&gt;&lt;b&gt;vippergirl_bez&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp;придумала&amp;nbsp;&lt;a style="text-decoration: none; font-weight: bold; color: rgb(102, 153, 204); " href="http://vippergirl-bez.livejournal.com/27142.html"&gt;столовый флешмоб&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px; "&gt;Предлагаю новый флешмоб!&lt;br /&gt;&lt;br /&gt;1. Я рассказываю и показываю, о том, что творится на моем рабочем столе.&lt;br /&gt;2. Вы оставляете комментарий к этому посту.&lt;br /&gt;3. Вы постите фотографию и свой рассказ в своем ЖЖ с публикацией условий игры, чтобы Ваши друзья тоже могли поиграть.&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;Поддерживаю:&lt;br /&gt;&lt;a href="http://cmsbuilder.ru/files/desktop.jpg"&gt;&lt;img alt="" src="http://cmsbuilder.ru/files/desktop.jpg" /&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:petr_leonov:1136</id>
    <link rel="alternate" type="text/html" href="http://petr-leonov.livejournal.com/1136.html"/>
    <link rel="self" type="text/xml" href="http://petr-leonov.livejournal.com/data/atom/?itemid=1136"/>
    <title>petr_leonov @ 2008-09-05T04:29:00</title>
    <published>2008-09-05T00:32:05Z</published>
    <updated>2008-09-05T00:32:05Z</updated>
    <content type="html">Замутил, наконец, &lt;a href="http://www.cmsbuilder.ru/blog/"&gt;блог себе&lt;/a&gt;. Ура!&lt;br /&gt;&lt;br /&gt;Сюда писать о технике больше не буду, а не о технике я и не пишу.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:petr_leonov:1019</id>
    <link rel="alternate" type="text/html" href="http://petr-leonov.livejournal.com/1019.html"/>
    <link rel="self" type="text/xml" href="http://petr-leonov.livejournal.com/data/atom/?itemid=1019"/>
    <title>petr_leonov @ 2008-08-25T21:45:00</title>
    <published>2008-08-25T17:46:45Z</published>
    <updated>2008-08-25T17:46:45Z</updated>
    <content type="html">До появления полномасштабного блога, пишу в &lt;a href="http://community.livejournal.com/programica/"&gt;открытое сообщество Програмики&lt;/a&gt;.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:petr_leonov:736</id>
    <link rel="alternate" type="text/html" href="http://petr-leonov.livejournal.com/736.html"/>
    <link rel="self" type="text/xml" href="http://petr-leonov.livejournal.com/data/atom/?itemid=736"/>
    <title>XHTML шепчу</title>
    <published>2008-01-06T23:26:25Z</published>
    <updated>2009-05-02T13:27:16Z</updated>
    <category term="xhtml"/>
    <content type="html">Сегодня утром вернулся к выводу RSS-ленты &lt;a href="http://www.programica.ru/blog"&gt;на нашем сайте&lt;/a&gt;. И обнаружил, что &lt;code&gt;innerHTML&lt;/code&gt; меня не спасает. Что же делать? Решение есть, но сначала хорошенько опишу проблему.&lt;br /&gt;&lt;br /&gt;С недавних пор мы решили верстать сайты в XHTML. Затея не нова, скажете вы, — сейчас каждый уважающий себя верстальщик все делает по стандартам и о валидности не забывает. Однако, как мы можем узнать из статьи Ивана Сагалаева «&lt;a href="http://softwaremaniacs.org/blog/2005/12/19/xhtml-you-say/"&gt;XHTML, говорите?&lt;/a&gt;», не все так просто, и многие разработчики не подозревают, что верстают вовсе не в режиме XHTML, а в старом добром HTML–режиме. Дело в HTTP-заголовке Content-type, и вся свистопляска начинается только тогда, когда вы вместо привычного &lt;code&gt;text/html&lt;/code&gt; дадите браузеру нюхнуть &lt;code&gt;application/xhtml+xml&lt;/code&gt;. Или &lt;code&gt;text/xml&lt;/code&gt; на худой конец. Браузер сразу обнаружит, что вы, наконец, одумались и выбрали самый современный отформатированный формат документов и сопутствующие ему самые стандартные стандарты. Однако&amp;nbsp; прежней свою страницу вы не увидите. Делов-то, сейчас слеши в конце &amp;lt;br&amp;gt; и &amp;lt;img&amp;gt; поставим, и все. А не все. Когда вы начнете программировать, предварительно исправив разметку, указав пространство имен и разобравшись с кодировкой, вас настигнут бонусные неприятности с передовым форматом. Самое время вернуться к теме поста.&lt;br /&gt;&lt;br /&gt;Классическим примером разницы в движках HTML и XHTML было отсутствие&amp;nbsp; у XHTML-элементов свойства &lt;code&gt;innerHTML&lt;/code&gt;. То есть загрузить что-то аморфное аяксом и вывести в div стало нельзя. Свойство присваивается, JavaScript ведь этого не запрещает, но реакции никакой нет. Народ стал мучаться с интерфейсами &lt;code&gt;DOMParser&lt;/code&gt; и &lt;code&gt;DOMSerializer&lt;/code&gt;, чтобы эмулировать любимое свойство. И, честно говоря, некоторый успех был. Позже браузеры научились и сами имитировать &lt;code&gt;innerHTML&lt;/code&gt; в режиме XHTML (Ьщяшддф вероятнее всего тем же способом, Opera тоже умеет) и сейчас можно не опасаясь писать нечто вроде &lt;code&gt;$('content').innerHTML = '&amp;lt;h1&amp;gt;Сильно &amp;lt;i&amp;gt;лень&amp;lt;/i&amp;gt; городить createElement() и appendChild()&amp;lt;/h1&amp;gt;'&lt;/code&gt;. Хотя свойство и называется &lt;code&gt;innerHTML&lt;/code&gt; на самом деле HTML ему скормить нельзя. Это скорее &lt;code&gt;innerXHTML&lt;/code&gt;. То есть такое дело не пройдет: &lt;code&gt;mailDiv.innerHTML = '&amp;lt;p&amp;gt;забудем закрыть "p", поставим неразрывный&amp;amp;nbsp;пробел, а еще картинку вставим &amp;lt;img alt="постринке"&amp;gt;'&lt;/code&gt;. И что произойдет? В обычном режиме браузер напряжет свои HTML-извилины и догадается о том, что вы имели ввиду. В новом мире XML умен должен быть не браузер, а мы. А сам браузер, как ему и положено, откажется парсить такую гадость и выбросит исключение.&lt;br /&gt;&lt;br /&gt;Вот какие исключения бывают (на тот случай, если кто-то, как и я, гуглить начинает с текста ошибки целиком):&lt;br /&gt;Firefox 2: An invalid or illegal string was specified&lt;br /&gt;Firefox 3: Component returned failure code: 0x80004003 (NS_ERROR_INVALID_POINTER) [nsIDOMNSHTMLElement.innerHTML] &lt;br /&gt;Safari 3: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7&lt;br /&gt;&lt;br /&gt;Opera 9 умеет парсить HTML сама. За что нижайший ей поклон.&lt;br /&gt;&lt;br /&gt;Первое решение, которое пришло мне на ум, это поправить разметку простенькими регулярками.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;markup = markup.replace(/&amp;lt;(img|br|hr|link|input)(.+?)\/?&amp;gt;/g, '&amp;lt;$1$2/&amp;gt;')&lt;br /&gt;markup = markup.replace(/(&amp;amp;nbsp;)/g, '&amp;nbsp;')&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;После этого чать кода заработала. Потом из любопытства поглядел на список сущностей в HTML. А потом попался фрагмент кода с перемешанными тегами. Писать парсер перехотелось. Помучавшись в раздумиях, решил попробовать распарсить HTML на сервере, а потом выдать его как HTML. Идея мне понравилась, по натуре&amp;nbsp; я серверный программист и раньше воспринимал браузер только как дисплей. Потом, правда, одумался.&lt;br /&gt;&lt;br /&gt;Одуматься удалось и на этот раз. Зачем, спрашиввается, мне парсить HTML на сервере, если у меня в руках самый совершенный парсер HTML — собственно браузер. Не найдя рационального ответа на этот вопрос, решил парсить кривой HTML на клиенте. Вот только куда тиранический XML-режим сослал этот самый парсер — не понятно.&lt;br /&gt;&lt;br /&gt;Отступлю немного и отвечу на вопрос, ответ на который вас, возможно, интересует. Почему у меня HTML весь такой кривой и неправильный. Ответ прост как шланг — на нашем блоге мы решили парсить сырую RSS-выдачу. А получаем мы очень вольно составленный HTML.&lt;br /&gt;&lt;br /&gt;Так вот. Где же cпрятан парсер HTML, когда у нас все кругом в XHTML? Сегодня получить парсер в лисе, скриптом невозможно. Про вебкит и оперу по запросу "new HTMLDocument()" тоже ничего найти не удалось (искал, правда, спустя рукава — любимчик-то мой уже облажался). &lt;code&gt;XMLParser&lt;/code&gt;, как видно из названия, парсит только XML (правда это может быть и XUL, и MathML, и SVG и…). Создать новый HTML-документ с помощью &lt;code&gt;document.implementation.createDocument(…)&lt;/code&gt; можно, но будет он XHTML. Конструкция &lt;code&gt;(new DOMParser()).parseFromString("...", "text/html")&lt;/code&gt; не сработает, так как &lt;code&gt;DOMParser&lt;/code&gt; не поддерживает &lt;code&gt;text/html&lt;/code&gt;. Прямо так и пишет: not implemented.&lt;br /&gt;&lt;br /&gt;Промучавшись полдня с «крутыми» технологиями, решил попробовать самую простую — спрятать iframe и в него загрузить html-файл. Как мы и рассчитываем &lt;code&gt;window.onload&lt;/code&gt; срабатывает когда все загрутся, в том числе и фрейм. Добавлять фрейм можно&amp;nbsp; динамически, но тогда &lt;code&gt;onload&lt;/code&gt; может произойти раньше, чем iframe будет готов. Так как я успел и не забыл, браузеры меня вознаградили. Наградой явился объект &lt;code&gt;document&lt;/code&gt;, который умеет парсить HTML. Ура!&lt;br /&gt;&lt;br /&gt;Как это выгладит в коде? Как всегда было в HTML:&lt;br /&gt;&lt;code&gt;var html = $('htmliframe').contentDocument.firstChild&lt;br /&gt;html.innerHTML = '&amp;lt;div&amp;gt;' + markup + '&amp;lt;/div&amp;gt;'&lt;/code&gt;&lt;br /&gt;Родные, милые черты...&lt;br /&gt;&lt;br /&gt;Осталось извлечь полученное дерево и доставить его на место назначения.&lt;br /&gt;&lt;code&gt;// почистим ноду назначения&lt;br /&gt;while (destination.firstChild)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; destination.removeChild(destination.firstChild)&lt;br /&gt;// склонируем HTML-дерево (в нашем случае див с детьми)&lt;br /&gt;clone = html.firstChild.cloneNode(true)&lt;br /&gt;// вставим див куда надо&lt;br /&gt;content.appendChild(clone)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;В будущих версиях браузеров, возможно, надо будет адаптировать ноды &lt;code&gt;clone = document.adoptNode(clone)&lt;/code&gt;, но пока они на adoptNode ругаются.&lt;br /&gt;&lt;br /&gt;Теперь нам можно завернуть полученные знания в модуль и распространять, наслаждаясь славой и признанием.&lt;br /&gt;&lt;br /&gt;Итог. HTML парсится и выводится в Firefox 2, 3 и Safari 3. Opera 9 все умеет сама. IE и Safari 2 не умеют XHTML совсем, но все же умеют клиентский XSL через xml-stylesheet. Получается, мостик между HTML и XML перебросили.</content>
  </entry>
</feed>
