<?xml version="1.0" encoding="windows-1251"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
<channel>
	<title>Usabili.ru</title>
	<atom:link href="http://usabili.ru/news/rss/" rel="self" type="application/rss+xml" />
	<link>http://usabili.ru/</link>
	<description>блог о веб-разработке</description>
	<lastBuildDate>Mon, 06 Feb 2012 23:47:25 +0300</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>dayly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<managingEditor>askme@usabili.ru</managingEditor>
	<generator>BoughCMS</generator>
	<image><title>Usabili.ru</title><url>http://usabili.ru/images/rss.jpg</url><link>http://usabili.ru/</link><width>100</width><height>100</height><description>блог о веб-разработке</description></image>
	<item>
	<title>Мастерство авторизации</title>
	<guid isPermaLink="true">http://usabili.ru/news/2012/02/04/mastery_of_authorization.html</guid>
	<link>http://usabili.ru/news/2012/02/04/mastery_of_authorization.html</link>
	<comments>http://usabili.ru/news/2012/02/04/mastery_of_authorization.html#comments</comments>
	<pubDate>Mon, 06 Feb 2012 14:50:59 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>советы</category>
	<category>javascript</category>
	<category>интерфейс и взаимодействие</category>
	<category>браузеры</category>
	<description><![CDATA[<p>Есть ли что-нибудь более сложное и увлекательное чем регистрация и авторизация? У меня уже накопилась целая подборка: &laquo;<a href="http://usabili.ru/news/2011/07/12/basic_login_errors.html">Основные ошибки проектирования процесса авторизации</a>&raquo;, &laquo;<a href="http://usabili.ru/news/2010/07/28/user_registration.html">Пользователь важен для вас? Просто дайте ему зарегистрироваться</a>&raquo;, &laquo;<a href="http://usabili.ru/news/2009/11/23/openid-consumer-enhancements.html">Комментарии open_id, улучшены</a>&raquo;. Что ж, сегодня я намерена продолжить эту тему.</p>
	<h2>Пароль должен сохраняться в браузере</h2>
<p>Всегда важно предоставлять вашим пользователям пользоваться  автоматическим сохранением пароля в браузере. На десктопах это позволяет  сэкономить несколько секунд, а на мобильниках несколько минут.  Попробуйте например набрать несколько раз пальцем на тачскрине логин  типа <code>askme@usabili.ru</code> и пароль типа <code>&quot;&gt;pf,bkbnbvj,bkmybrjd-pkj&quot;</code>. Поэтому это очень важный момент. К сохранению в браузере я отношу и плагины менеджеров паролей, типа  roboform.</p>
<h2>Форма логина должна проверяться без перезагрузки</h2>
<p>Когда вы ошибаетесь в наборе логина и пароля &mdash; очень раздражает, если  каждый раз вам приходится загружать новую страницу на которой написано  только то что вы ошиблись, или использовали недопустимый символ. Поэтому  логично делать проверку авторизации аяксом, вида <code>form  onsubmit=&quot;somecheck();return false;&quot;</code>.</p>
<p>В самой функции <code>somecheck()</code> делается ajax запрос, проверяется  результат, и, в случае успеха, делается редирект в закрытый раздел через  <code>self.location=&quot;/some&quot;</code>.</p>
<p>Пару месяцев назад, мы с коллегами столкнулись с досадным багом в  хроме. Хром не предлагает сохранить пароль если <code>onsubmit</code> формы  возвращает <code>false</code>. Баг с ноября 2009, уже полгода имеет статус <code>fixed</code>,  хотя работает до сих пор. Примеры тут: <a rel="nofollow" class="external" href="http://usabili.ru/labs/browser_bugs/chrome_test_passwd.html">простой</a> и <a rel="nofollow" class="external" href="http://usabili.ru/labs/browser_bugs/chrome_test_passwd2.php">сложный</a>.  В сложном примере на секунду появляется таки запрос сохранения, но тут  же пропадает. В dev-версии хрома (18) сложный пример работает как надо.</p>
<p>Решением было обнулять функцию сабмита формы, а затем сабмитить её. Разумеется при этом <code>action</code> формы должен вести куда надо.</p>
<pre class="js">
document.getElementById('login_form').onsubmit=function(){return true;};
document.getElementById('login_form').submit();
</pre>
<h2>Конечная страница не должна получать лишних POST параметров</h2>
<p>&nbsp;Дело в том, что когда страница содержит данные, переданные методом  POST, то при обновлении страницы (например нажав F5) браузер сначала  спросит хотите ли вы отправить данные ещё раз. Это ненужный пользователю  вопрос. Чтобы этого избежать нужно не сразу посылать пользователя на  конечную страницу, а посылать на другую, которая сделает редирект на  нужную. В&nbsp;таком случае не будет лишних POST параметров. Пример можно  увидеть в действии при авторизации в этом блоге.</p>
<h1>Пароль должен быть по-желанию открыт пользователю</h1>
<p>Единственной вообще причиной почему нужно маскировать пароли на сайтах &mdash; это в  том что всякие звёздочки пошли из нативных приложений операционных  систем. А те пошли от экранов авторизаций тех времён когда персональные  компьютеры были не очень персональными, и чтобы стоящий рядом не  подглядывал пароль &mdash; звёздочки очень полезны. Кстати многие пользователи  верили что звёздочки защитят их пароли от вирусов, троянов и кейлоггеров, многие  до сих пор верят.</p>
<p>Якоб Нильсен &mdash; один из известнейших юзабилистов в мире, с 1995 года писал о безопасности паролей и человеческом факторе (<a rel="nofollow" class="external" href="http://www.useit.com/alertbox/passwordsecurity.html">Human Factors of Password Security</a>), и в 2000 писал (<a rel="nofollow" class="external" href="http://www.useit.com/alertbox/20001126.html">Security &amp; Human Factors</a>), и в 2009 писал (<a rel="nofollow" class="external" href="http://www.useit.com/alertbox/passwords.html">Stop Password Masking</a>). Много всего хорошего о паролях, и в частности о том, что звёздочки у паролей пользователям-то не нужны. Но почему-то никто не воплощает его слова в реальность. Даже в мобильных (!!!) браузерах нет настройки &quot;показать мне все мои пароли&quot;, это искренне бесит. А ведь на многих сайтах для регистрации просят &quot;подтвердить пароль&quot; (пожалуйста, не менее 6 символов, используйте цифры и буквы разного регистра) &mdash; господи дай этим людям мозгов. В большинстве настроек андроида пароли тоже скрываются, хотя казалось бы...</p>
<blockquote>
<p>It's time to show most passwords in clear text as users type them.  Providing feedback and visualizing the system's status have always been  among the most basic usability principles. Showing undifferentiated  bullets while users enter complex codes definitely fails to comply.</p>
<p>Most websites (and many other applications) mask passwords as users  type them, and thereby theoretically prevent miscreants from looking  over users' shoulders. Of course, a truly skilled criminal can simply  look at the keyboard and note which keys are being pressed. So, password  masking doesn't even protect fully against snoopers.</p>
<p>More importantly, there's usually nobody looking over your shoulder  when you log in to a website. It's just you, sitting all alone in your  office, suffering reduced usability to protect against a non-issue.</p>
</blockquote>
<p>На текущий момент, мне известна только <a rel="nofollow" class="external" href="http://tema.livejournal.com/1021672.html">Лебедевская заметка</a>, в которой упоминается очень <a rel="nofollow" class="external" href="http://livejournal.design.ru/account/create_account/">правильный концепт регистрации</a>, использующей открытый пароль, который, к сожалению, пока остался концептом.</p>
<p>Итак, что тянуть резину, давайте сделаем это! Вот какой концепт получился у меня &mdash; <a rel="nofollow" class="external" href="http://usabili.ru/labs/browser_bugs/test_visible_passwd.html">http://usabili.ru/labs/browser_bugs/test_visible_passwd.html</a>. Это кроссбраузерная (Chrome, Opera, Firefox) реализация незамаскированного пароля. Важно именно то, что браузер здесь запоминает пароль, хотя пароль может вводиться открытым текстом. <strong>Для того чтобы любой браузер вообще предлагал сохранять пароль &mdash; необходимо чтобы пароль был полем type=&quot;password&quot;, при загрузке страницы.</strong></p>
<p>Просто так менять яваскриптом тип поля ввода &mdash; нельзя. Чтобы поменять его &mdash; необходимо пересоздать весь элемент. Для этого воспользуемся такой функцией:</p>
<pre class="js">
function changeInputType(oldObject, oType) {
	var newObject = document.createElement('input');
	newObject.type = oType;
	if(oldObject.size) newObject.size = oldObject.size;
	if(oldObject.value) newObject.value = oldObject.value;
	if(oldObject.name) newObject.name = oldObject.name;
	if(oldObject.id) newObject.id = oldObject.id;
	if(oldObject.tabIndex) newObject.tabIndex = oldObject.tabIndex;
	if(oldObject.placeholder) newObject.placeholder = oldObject.placeholder;
	if(oldObject.className) newObject.className = oldObject.className;
	oldObject.parentNode.replaceChild(newObject,oldObject);
	return newObject;
}
</pre>
<p>Итак, основной концепт состоит в следующем. Когда страница грузится &mdash; тип поля с паролем обязательно должен быть password. После этого пользователь может показать или скрыть пароль. Во время сабмита формы (при проверке аяксом, см. выше) &mdash; пароль необходимо принудительно скрыть. А затем вызвать сабмит формы.</p>
<p>Однако есть одна особенность. В файрфоксе и опере &mdash; вызов .submit() формы &mdash; не вызовет диалог сохранения пароля. Однако этот диалог &mdash; вызывается если кликнуть по кнопке сабмита данной формы вызвав .click();. Таким образом, для кроссбраузерной реализации, перед сабмитом формы &mdash; мы должны кликнуть по кнопке сабмита. Общий алгоритм в вашей аякс-проверке должнен получиться примерно такой:</p>
<pre class="js">
if(auth_success) {
	changeInputType(document.getElementById('password'), 'password');
	document.getElementById('login_form').onsubmit=function(){return true;};
	document.getElementById('login_button').click();
	document.getElementById('login_form').submit();
	return true;
}
</pre>
<p>Кнопку переключения маскировки можно оформить иконками, как это предложено Лебедевым. Например так:</p>
<p><img width="313" height="100" alt="" src="http://usabili.ru/news_imgs/143/1.png" /></p>
<p>Так же проставить полям атрибуты <a rel="nofollow" class="external" href="http://htmlbook.ru/html/input/tabindex">tabindex</a> и <a rel="nofollow" class="external" href="http://htmlbook.ru/html/input/placeholder">placeholder</a>.</p>
<p>На тему споров о целесообразности открытого пароля можно почитать следующие статьи:</p>
<ul>
    <li><a rel="nofollow" class="external" href="http://www.useit.com/alertbox/passwords.html">Stop Password Masking (Jakob Nielsen's Alertbox)</a></li>
    <li><a rel="nofollow" class="external" href="http://www.schneier.com/blog/archives/2009/06/the_problem_wit_2.html">Schneier on Security: The Problem with Password Masking</a></li>
    <li><a rel="nofollow" class="external" href="http://www.schneier.com/blog/archives/2009/07/the_pros_and_co.html">Schneier on Security: The Pros and Cons of Password Masking</a></li>
    <li><a rel="nofollow" class="external" href="http://www.thetechherald.com/articles/Is-usability-worth-more-than-security/6488/">Is usability worth more than security?</a></li>
    <li><a rel="nofollow" class="external" href="http://nakedsecurity.sophos.com/2009/06/09/guest-blog-eyephone/">Keep an eye on your iPhone | Naked Security</a></li>
    <li><a rel="nofollow" class="external" href="http://www.out-law.com/page-10128">Usability and security gurus agree that masked passwords should go</a></li>
    <li><a rel="nofollow" class="external" href="http://www.out-law.com/page-10152">Security guru says he was 'probably wrong' to attack masked passwords</a></li>
    <li><a rel="nofollow" class="external" href="http://countermeasures.trendmicro.eu/password-masking-a-necessary-evil/">Password Masking &ndash; a Necessary Evil &raquo; CounterMeasures</a></li>
    <li><a rel="nofollow" class="external" href="http://blog.securityactive.co.uk/2009/07/01/apparently-we-should-no-longer-blank-passwords-when-entered-on-websites-thoughts/">Apparently we should no longer blank passwords when entered on websites. Thoughts? | Security Active Blog</a></li>
    <li><a rel="nofollow" class="external" href="http://www.jahne.com/information-and-removal/about-face-on-bruce-schneier/">about face on bruce schneier | Jahne - Virus and Spyware Removal</a></li>
    <li><a rel="nofollow" class="external" href="http://lists.webappsec.org/pipermail/websecurity_lists.webappsec.org/2009-June/">The websecurity June 2009 Archive by thread</a></li>
</ul>
<p>А что думаете вы?</p>
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/143/</wfw:commentRss>
	<slash:comments>2</slash:comments>
	<author>Usabili</author>
	<modified>2012-02-04T06-47-00Z</modified>
	  </item><item>
	<title>Про файрфокс</title>
	<guid isPermaLink="true">http://usabili.ru/news/2012/02/01/142.html</guid>
	<link>http://usabili.ru/news/2012/02/01/142.html</link>
	<comments>http://usabili.ru/news/2012/02/01/142.html#comments</comments>
	<pubDate>Wed, 01 Feb 2012 09:19:17 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>браузеры</category>
	<description><![CDATA[<p>Вчера вышел 10й файрфокс. Для большинства разработчиков, это конечно не новость. Уверена, что все как и я давно следят за планом выхода на офф сайте: <a href="https://wiki.mozilla.org/Features/Release_Tracking">https://wiki.mozilla.org/Features/Release_Tracking</a>. А те кто не следит, успели прочитать обзор на <a rel="nofollow" class="external" href="http://habrahabr.ru/blogs/browsers/137378/">хабре</a>.</p>
<p>Чтож, хотя это никому не интересно, я выскажу своё отношение к браузеру.</p>
<p>Файрфокс для меня и моих коллег - является инструментом №1 в работе. Кроме удобных расширений, типа web-developer toolbar, httpfox, и html validator браузер имеет ряд нативных инструментов, таких как подсветка кода, удобный style editor в nightly версиях и доступный в свежем релизе инспектор html. Так же огромным плюсом является низкое потребление памяти. Например для одинаковых 20 вкладок фф потребляет 330 мб, а свежий хром 585, т.е. почти в 2 раза больше. (В опере 383). Файрфокс более старый и привычный браузер, хотя UX-сотрудники mozilla всячески пытаются сделать его непривычным и отбить нелояльных пользователей.</p>
<p>Что касается частой смены релизов, которое так обсуждают на хабре, в духе &quot;Опять новый фарфокс, вот в советское время он так часто не выходил&quot;, то я считаю частую смену мажорной версии нормальным решением. И кстати соответсвующим духу mozilla, вспомним, что браузер <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/Netscape_Communicator">Netscape</a> - пропустил выход 5й версии когда вышел ie6. Если почитать например про <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%9D%D1%83%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B9_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F">нумерацию версий программного обеспечения</a> в википедии, то можно найти ряд ещё более экзотических примеров. Например Опера, по абсолютно глупым причинам с 10й версии указывает в строке User-agent - версию 9.80. А так, я считаю всем уже всё равно какой цифры браузер. Хотя конечно правильнее было бы выпускать одну версию в квартал,&nbsp;как планировалось, а не одну версию в 6 недель как сейчас. Мне кажется, что в будущем файрфокс либо будет именовать версии номером года и месяца (как убунта например), либо придумает новое название, как photoshop cs.</p>
<p>Какие-то революционные перемены должны произойти и в быстродействии. По моим субъективным меркам Файрфокс является весьма медленным браузером по сравнению с Оперой и Хромом. Дело в том, что несмотря на то что файрфокс выигрывет в скорости на ряде математических действий - работа с Dom и CSS у него поставлена весьма плохо. </p>
<p>Одним из таких изменений должен стать проект <a href="https://wiki.mozilla.org/Electrolysis#">electrolysis</a>, который на начальном этапе позволил сделать Out-of-process plugins, а в конечной позволит сделать Out-of-process tabs, как это сделано в хроме. Т.е. быстродействие конкретной вкладки перестанет зависеть от других вкладок и вообще от их количества.</p>
<p>Также разработчикам нужно серьёзно переструкрутировать их базу данных, например places.sqlite, потому что сейчас например работа с закладками превращается в кошмар, когда их собрано более тысячи штук. Пока что разработчики фф пытаются начать взаимодействие собственно с разработчиками sqlite чтобы оптимизировать работу с ней, либо вообще отказаться от этой библиотеки.</p>
<p>Что касается прочего быстродействия, то разработчикам нужно перестать гнаться за количеством багов, а смотреть на качество. В баглисте текущего релиза&nbsp; <a rel="nofollow" class="external" href="http://www.mozilla.org/en-US/firefox/10.0/releasenotes/buglist.html">http://www.mozilla.org/en-US/firefox/10.0/releasenotes/buglist.html</a> всего несколько багов затрагивающих быстродействие. Складывается впечатление что разработчикам проще писать новый код, чем вносить правки в старый. Неужели проще было вводить поддержку html5-элемента &lt;bdi&gt;, чем ввести поддержку input[type=number], или сделать хотя бы черновую поддержку других input элементов? Почему поддержка &lt;video&gt; и &lt;audio&gt; появилась довольно быстро несмотря на сырость,&nbsp;а по каким-то вопросам идёт многолетнее ожидание окончательной спецификации?</p>
<p>Ну и конечно заявление о том что большинство дополнений файрфокс теперь по-умолчанию совместимо с файрфокс - для меня звучит как шутка. =)</p>
<p>Я постоянно слежу за развитием любимого браузера, и всячески желаю ему скорейшего развития. Хотя пока поводов для радости мало, сейчас на рынке браузеров важна не скорость разработки, а ускорение - когда мозилла поправит все текущие баги и введёт новые фичи - хром введёт их ещё больше и разрыв между браузерами только увеличится.</p>
<p>Спасибо моим коллегам за помощь в написание статьи.</p>
	
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/142/</wfw:commentRss>
	<slash:comments>0</slash:comments>
	<author>Usabili</author>
	<modified>2012-02-01T07-49-00Z</modified>
	  </item><item>
	<title>Микроформаты, Schema.org и W3C</title>
	<guid isPermaLink="true">http://usabili.ru/news/2012/01/30/Schema.org_is_valid.html</guid>
	<link>http://usabili.ru/news/2012/01/30/Schema.org_is_valid.html</link>
	<comments>http://usabili.ru/news/2012/01/30/Schema.org_is_valid.html#comments</comments>
	<pubDate>Mon, 30 Jan 2012 12:23:52 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>Cтандарты</category>
	<category>семантика</category>
	<category>вёрстка</category>
	<category>о поисковиках</category>
	<description><![CDATA[<p>Неделю назад, мой друг и&nbsp;коллега <a rel="nofollow" class="external" href="http://jelu.ru/">Джелу</a> спросил меня, как я&nbsp;отношусь к&nbsp;разметке Schema.org и&nbsp;правильно&nbsp;ли в&nbsp;целях продвижения использовать разметку для картинок которую предлагает яндекс в&nbsp;разделе справки&nbsp;&mdash; &laquo;<a rel="nofollow" class="external" href="http://help.yandex.ru/webmaster/?id=1122760">Schema.org для Яндекс. Картинок</a>&raquo;.</p>
<p>Я&nbsp;до&nbsp;этого не&nbsp;обращала внимания что там нового у&nbsp;яндекса, а&nbsp;оказалось новый формат разметки они уже с&nbsp;ноября прошлого (2011) года поддерживают. А&nbsp;ввели его Google, Microsoft и Yahoo аж&nbsp;в&nbsp;июне. Что&nbsp;ж, обычные микроформаты сказала я, глянув один раз на&nbsp;пример. Глянув на&nbsp;пример второй раз я&nbsp;заметила что микроформаты как раз необычные. И&nbsp;более того, используют кажущуюся невалидной с&nbsp;точки зрения <acronym lang="en" title="HyperText Markup Language">html</acronym> разметку. Об&nbsp;этом я&nbsp;и&nbsp;хочу сегодня рассказать, надеюсь статья будет интересной.</p>
	<h2>Микроформаты от Microformats.org</h2>
<p>Я думаю что вам всем знакомы такие микроформаты типа <a rel="nofollow" class="external" href="http://microformats.org/wiki/hcard">hcard</a>, hProduct и т.п. большая часть которых написана Тантеком Селиком (<span class="vcard"><span class="fn">Tantek &Ccedil;elik</span>)</span>&nbsp;  (известным веб-идеологом, редактором спецификации CSS и других). Они  позволяют добавить семантическую аннотацию к тем элементам разметки  которые вы используете посредством имён классов. Например так:</p>
<pre class="html">
&lt;div class=&quot;vcard&quot;&gt;
 &lt;div&gt;
   &lt;span class=&quot;category&quot;&gt;Кафе&lt;/span&gt;
   &lt;span class=&quot;fn org&quot;&gt;Ромашка&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class=&quot;adr&quot;&gt;
   &lt;span class=&quot;locality&quot;&gt;г. Солнечный&lt;/span&gt;,
   &lt;span class=&quot;street-address&quot;&gt;просп. Романтиков, д. 21&lt;/span&gt;
 &lt;/div&gt;
 &lt;div&gt;Телефон: &lt;span class=&quot;tel&quot;&gt;+7 (890) 123-45-67&lt;/span&gt;&lt;/div&gt;
 &lt;div&gt;Мы работаем &lt;span class=&quot;workhours&quot;&gt;ежедневно с 11:00 до 24:00&lt;/span&gt;
   &lt;span class=&quot;url&quot;&gt;
     &lt;span class=&quot;value-title&quot; title=&quot;http://www.romashka-cafe.some&quot;&gt; &lt;/span&gt;
   &lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Данная разметка как видно полностью валидна с точки зрения html, и  так же доступна для стилизации через css. Подробнее о микроформатах  можно почитать в <a rel="nofollow" class="external" href="http://help.yandex.ru/webmaster/?id=1111573">хелпе яндекса</a>.</p>
<h2>Микроформаты от Schema.org</h2>
<p>Данный вид микроформатов <a rel="nofollow" class="external" href="http://help.yandex.ru/webmaster/?id=1122752">заметно отличается</a>, как видно из примера:</p>
<pre class="html">
&lt;span itemscope itemtype=&quot;schema.org/ImageObject&quot;&gt;
&nbsp; &lt;h2 itemprop=&quot;name&quot;&gt;Винни-Пух&lt;/h2&gt;
&nbsp; &lt;img src=&quot;vinni.jpg&quot; itemprop=&quot;contentURL&quot; /&gt;
&nbsp; &lt;span itemprop=&quot;description&quot;&gt;Винни-Пух залезает на дерево.&lt;/span&gt;
&lt;/span&gt;</pre>
<p>Он не использует классы, для элементов разметки, а вместо них  использует новые, пока ещё не валидные атрибуты. Говоря слово &quot;пока&quot;, я  должна перейти к ответу на самый главный вопрос в статье.</p>
<h2>Валидна ли вёрстка от Schema.org?</h2>
<p>И отвечая на этот непростой вопрос, я хочу сказать, &quot;<strong>Да, вёрстка валидна</strong>&quot;. Теперь постараюсь ответить почему.</p>
<p>Дело в том что эта схема, вовсе не выдумка поисковых систем. Данный  метод для семантической аннотации структурированных данных в  HTML,&nbsp;впервые предложил никто иной как Хикси (Ян Хиксон, действующий  редактор стандарта разметки html5). И предложил он это ещё три года  назад в рассылке группы whatwg. Очень рекомендую к прочтению:</p>
<blockquote>
<p><a rel="nofollow" class="external" href="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-May/019681.html"><strong>[whatwg] Annotating structured data that HTML has no semantics for</strong></a><br />
<b>Ian Hickson, Май 2009</b></p>
</blockquote>
<p>В данный момент, он же, под пишет полноценную спецификацию W3C касательно микроформатов - <a rel="nofollow" class="external" href="http://www.w3.org/TR/microdata/">www.w3.org/TR/microdata/</a></p>
<p>Данная спецификация представляет собой модуль, расширяющий спецификацию HTML, (примерно как сейчас выходят новые <a rel="nofollow" class="external" href="http://www.w3.org/Style/CSS/current-work">модули к CSS</a>), одним из нововведений которого, являются 5 новых глобальных атрибутов:</p>
<ul class="brief">
    <li><code title="attr-itemid"><a rel="nofollow" class="external" href="http://www.w3.org/TR/microdata/#attr-itemid">itemid</a></code></li>
    <li><code title="attr-itemprop"><a rel="nofollow" class="external" href="http://www.w3.org/TR/microdata/#names:-the-itemprop-attribute">itemprop</a></code></li>
    <li><code title="attr-itemref"><a rel="nofollow" class="external" href="http://www.w3.org/TR/microdata/#attr-itemref">itemref</a></code></li>
    <li><code title="attr-itemscope"><a rel="nofollow" class="external" href="http://www.w3.org/TR/microdata/#attr-itemscope">itemscope</a></code></li>
    <li><code title="attr-itemtype"><a rel="nofollow" class="external" href="http://www.w3.org/TR/microdata/#attr-itemtype">itemtype</a></code></li>
</ul>
<p>Напомню, что это атрибуты которые могут применяться к любому тегу. В текущей спецификации html всего <a rel="nofollow" class="external" href="http://dev.w3.org/html5/spec/global-attributes.html#global-attributes">14 глобальных атрибутов</a>.</p>
<p>Что касается поддержки в браузерах, то в ней пока нет смысла, в них  ничего не развалится. Для xml разметки логический атрибут itemscope,  должен записываться как обычно, в виде itemscope=&quot;itemscope&quot;.</p>
<p>Интереснее с поисковыми системами. Пока что именно для них  микроформаты и предназначены. Здесь хочется поздравить  соотечественников, в рабочую группу <a rel="nofollow" class="external" href="http://schema.org/">Schema.org</a>,  с ноября месяца, наряду с Гугл, Микрософт (bing) и Яху, входит и  Яндекс. Соответственно данные микроформаты в полной мере распознаются  данными поисковиками и учитываются в поиске.</p>
<p>Данные глобальные атрибуты уже добавлены в ряд неофициальных валидаторов разметки, но пока не попали в официальный <a rel="nofollow" class="external" href="http://validator.w3.org/">validator.w3.org</a>. Однако повторюсь, уже сейчас я признаю эту разметку полностью валидной.</p>
<p>Узнать какие схемы использует в поиске яндекс можно <a rel="nofollow" class="external" href="http://help.yandex.ru/webmaster/?id=1122752">в соответствующем разделе хелпа</a>.  Замечу, что хотя это не сказано открыто, вместо &lt;div&gt; или  &lt;span&gt; вы можете использовать любые (блочные и строчные) элементы.  Проверить вашу разметку микроформатов можно тут: <a rel="nofollow" class="external" href="http://webmaster.yandex.ru/microtest.xml">http://webmaster.yandex.ru/microtest.xml</a>.</p>
<h3>Что же ещё готовит спецификация?</h3>
<p>Для браузеров, спецификация готовит ряд функций для работы с DOM: <a rel="nofollow" class="external" href="http://www.w3.org/TR/microdata/#microdata-dom-api">http://www.w3.org/TR/microdata/#microdata-dom-api</a> примерно реализующие предпосылки 2009 года (см. ссылку ранее). Возможности стилизации используя CSS пока не предполагается, автор делает упор на разграничения классов используемых для CSS и семантики.</p>
<p>Спецификации от Schema.org и Microformats.org - не взаимоисключающие, вы можете использовать их на одной странице, например микроформаты hcard и ImageObject.</p>
<h3>Дополнительные ссылки:</h3>
<ul>
    <li><a rel="nofollow" class="external" href="http://www.w3.org/2001/sw/interest/webschema.html">Semantic Web Interest Group - Web Schemas Task Force</a></li>
    <li><a rel="nofollow" class="external" href="http://ablognotlimited.com/articles/microformats-vs.-schema">Microformats vs. Schemas ~ A Blog Not Limited</a></li>
    <li><a rel="nofollow" class="external" href="http://dev.w3.org/html5/spec/global-attributes.html#global-attributes">3.2.3 Global attributes &mdash; HTML5</a></li>
    <li><a rel="nofollow" class="external" href="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-May/019704.html">Re: [whatwg] Annotating structured data that HTML has no semantics for. by 	Eduard Pascual</a></li>
    <li><a rel="nofollow" class="external" href="http://habrahabr.ru/blogs/microformats/134534/#habracut">Много нового про семантическую разметку от Яндекса / Микроформаты (microformats) / Хабрахабр</a> (заметьте, ни слова о валидности!)</li>
    <li><a rel="nofollow" class="external" href="http://dev.iptc.org/rNews-10-Implementation-Guide-HTML-5-Microdata">- rNews 1.0: Schema.org-compatible Implementation Guide HTML 5 Microdata</a></li>
</ul>
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/140/</wfw:commentRss>
	<slash:comments>3</slash:comments>
	<author>Usabili</author>
	<modified>2012-01-30T16-32-00Z</modified>
	  </item><item>
	<title>Феерические глупости</title>
	<guid isPermaLink="true">http://usabili.ru/news/2012/01/25/silly_bug_hunting.html</guid>
	<link>http://usabili.ru/news/2012/01/25/silly_bug_hunting.html</link>
	<comments>http://usabili.ru/news/2012/01/25/silly_bug_hunting.html#comments</comments>
	<pubDate>Thu, 26 Jan 2012 16:03:05 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>вёрстка</category>
	<category>браузеры</category>
	<category>CSS</category>
	<category>Cтандарты</category>
	<description><![CDATA[<p>Сегодня, мой друг и&nbsp;коллега <a rel="nofollow" class="external" href="http://cav.in/">Cavin</a> прислал мне ссылку на&nbsp;статью с&nbsp;хабра&nbsp;&mdash; &laquo;<a rel="nofollow" class="external" href="http://habrahabr.ru/blogs/css/136960/">Браузеры запутались в&nbsp;блочной модели для таблиц</a>&raquo;. Я&nbsp;считаю, что эта статья в&nbsp;полной степени показывает мои мысли о&nbsp;том, что в&nbsp;россии специалистов любого профиля очень мало.</p>
	<p>Сама статья о том что автор, якобы нашёл баг в отображении браузерами табличной вёрстки. Причём основное внимание внимание обращается на отличия в хроме, и особенно на глюки с шириной.&nbsp;<a rel="nofollow" class="external" href="http://sypex.net/habr/chrome_bug.php">Исходный код страницы здесь</a>. Статья набрала 67 комментариев и 61 добавление в избранное!</p>
<p><img src="http://habrastorage.org/storage2/5d3/4b6/ab2/5d34b6ab283d4b1f67e7cfa63bd825c8.jpg" alt="" /></p>
<p>Но, позвольте, ежу ведь понятно что дивы (слева) никогда не будут отображаться так же как ячейки (справа). Единственный баг который мне бросается просто в глаза - это&nbsp; баг файрфокса в отображении свойства box-sizing:border-box, для элементов с типом отображения table-cell, баг известный и старый (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=338554">bug 338554</a>), смотрите так же <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=243412">bug 243412</a> где изложена точка зрения мозиллы на этот счёт.</p>
<p>Что касается всего остального - отображение браузеров полностью соответствуют спецификации. Неужели сложно прочитать два параграфа из неё?</p>
<blockquote> <b style="font-size:15px;"><a rel="nofollow" class="external" href="http://www.w3.org/TR/CSS2/tables.html#width-layout">http://www.w3.org/TR/CSS2/tables.html#width-layout</a></b> </blockquote>
<p>Потратьте время, вкурите мануалы, и убедитесь почему это так.</p>
<p>Я считаю, люди, которые умеют верстать, либо ушли работать в серьёзные компании, типа яндекса, оперы и т.п., либо у них просто нет времени сидеть на хабре. Или быть профессионалом уже не модно?</p>
<p>Если вы делаете багрепорт - ссылайтесь на спецификацию!</p>
<p>Автор в примере даже использует атрибут cellspacing для таблиц. Фееричнее всего смотрится рассуждение о возможности использования  <code>border-collapse: collapse</code> вкупе со ссылкой на <a rel="nofollow" class="external" href="http://htmlbook.ru/html/table/cellspacing">http://htmlbook.ru/html/table/cellspacing</a> ! Зайдём на страницу, что написано? &quot;Аналог CSS: <code>border-spacing</code>&quot;.&nbsp;Вуаля! Почему об этом не сказал никто из полусотни комментаторов? Как могут люди всерьёз считать, что отображение таблиц в <strong>десктопных</strong> браузерах отличаться между операционными системами в одних и тех же версиях!&nbsp;</p>
<h2>Всем кто не знает сообщаю:</h2>
<p>В одной версии одного десктопного браузера - между системами может изменяться лишь сглаживание картинки (зависит от настроек Antialias шрифтов в системе, поддержки direct2d и рендеринга через видеокарты). К нему относится лишь хинтинг и алиасинг шрифта, и всевозможные тенюшечки. Также изменятся могут всякие кнопочки и скролбары, в зависимости от настроек темы.</p>
<p>Исключением из вышеописанного правила, являлся только IE5.5 под винды и мак, но это было два разных браузера вообще, просто с одним названием.</p>
<p>Что касается браузеров мобильных - в определённых режимах работы они могут сознательно нарушать спецификацию, компактно сжимая всё содержимое страницы до нужных пользователю размеров. В этом режиме сложно что-то предугадать или находить несоответствия (они сознательны). Однако могу сказать что это поведение будет длиться недолго, и с массовым появлением ёмкостных экранов, мобильные браузеры используют полноценный zoom правильной страницы.</p>
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/141/</wfw:commentRss>
	<slash:comments>19</slash:comments>
	<author>Usabili</author>
	<modified>2012-01-25T05-01-00Z</modified>
	  </item><item>
	<title>Убираем баннеры с википедии</title>
	<guid isPermaLink="true">http://usabili.ru/news/2012/01/18/adblock_wikipedia.html</guid>
	<link>http://usabili.ru/news/2012/01/18/adblock_wikipedia.html</link>
	<comments>http://usabili.ru/news/2012/01/18/adblock_wikipedia.html#comments</comments>
	<pubDate>Wed, 18 Jan 2012 23:48:45 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<description><![CDATA[<p>Свободе слова настала <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/Stop_Online_Piracy_Act">SOPA</a>. Примерно на это как бэ намекает нам <a rel="nofollow" class="external" href="http://en.wikipedia.org/wiki/Main_Page">википедия</a>:</p>
<blockquote style="margin-left:100px;">
<p>18 января (UTC-5) на 24 часа в знак забастовки отключена Википедия на  английском языке. День выбран в связи с заседанием Конгресса, на котором  должен обсуждаться законопроект SOPA. Сообщество Википедии на русском  языке поддерживает коллег и призывает всех тех, кто видит этот текст,  помочь в противодействии принятию закона.</p>
</blockquote>
<p>Я считаю что если кто-то делает сплеш баннер который блокирует частично или полностью содержимое сайта - он должен быть наказан. Вне зависимости от законопроектов. Т.е. если бы все страницы с википедии - стали бы пересылаться на сайт конгресса США (задосив его тем самым), то это было бы правильно, я считаю. Ну, подумаешь день сайт не работает.</p>
<p>Но использование сплеш скрина который закрывает сайт <strong>после</strong> загрузки сайта - это моветон и чёрное seo. Я решила бороться с этим через следующие правила фильтрации AdBlock:</p>
<pre>
|http://en.wikipedia.org/w/index.php?title=Special:BannerController*
|http://ru.wikipedia.org/w/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:BannerController*
</pre>
<p>&nbsp;Расширение Adblock, если кто не в курсе служит для блокировки рекламы в Firefox и Chrome. Данные фильтры - возвращают доступ к английской википедии. Ну и заодно убирают грустные лица создателей с российской версии.</p>
<p>Я считаю что когда википедия ограничивает мой доступ к статьям про <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%A0%D0%B8%D0%BC%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%B0%D0%BB%D0%B5%D0%BD%D0%B4%D0%B0%D1%80%D1%8C">Римский календарь</a>, <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_%D0%BD%D1%83%D0%BB%D1%8F">Делитель нуля</a>, <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5">Процедурное программирование</a>, <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8">Разделение ответственности</a>, <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%94%D0%B0%D0%BC%D0%B0%D1%81%D1%82">Дамаст</a>, <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/ECMAScript">ECMAScript</a>, <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0">Объекты первого класса</a>, <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/Boot_to_Gecko">Boot to Gecko</a>, <a rel="nofollow" class="external" href="http://en.wikipedia.org/wiki/God_object">Божественный объект</a>, <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%BA%D1%80%D0%B0%D1%81%D1%82%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D1%8F">Прокрастинацию</a>, <a rel="nofollow" class="external" href="http://en.wikipedia.org/wiki/Songket">Songket</a>, <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%AD%D1%80%D0%B8%D1%82%D1%80%D0%B5%D1%8F">Эритрею</a>, <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%BF%D0%B0%D0%BB%D0%BC">Напалм</a>, <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/SATA#mSATA">SATA</a> и <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%A0%D0%B8%D0%BC_(%D1%82%D0%B5%D0%BB%D0%B5%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB)">сериал Рим</a>, тогда это хуже чем любая SOPA!</p>
<p>С прошедшими праздниками вас!</p>
	
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/139/</wfw:commentRss>
	<slash:comments>2</slash:comments>
	<author>Usabili</author>
	<modified>2012-01-18T23-13-00Z</modified>
	  </item><item>
	<title>С новым годом!</title>
	<guid isPermaLink="true">http://usabili.ru/news/2011/12/31/happy_new_2012.html</guid>
	<link>http://usabili.ru/news/2011/12/31/happy_new_2012.html</link>
	<comments>http://usabili.ru/news/2011/12/31/happy_new_2012.html#comments</comments>
	<pubDate>Sat, 31 Dec 2011 21:14:41 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<description><![CDATA[<p>&nbsp;Поздравляю всех с новым годом, желаю чтобы ваши проекты всегда были успешными, приносили много профита и знаний, и было время заняться здоровьем.&nbsp;</p>
<p>С праздником!</p>
	
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/138/</wfw:commentRss>
	<slash:comments>0</slash:comments>
	<author>Usabili</author>
	<modified>2011-12-31T21-12-00Z</modified>
	  </item><item>
	<title>Объекты, объекты-объекты; объекты? Объекты!</title>
	<guid isPermaLink="true">http://usabili.ru/news/2011/12/30/objects_objects.html</guid>
	<link>http://usabili.ru/news/2011/12/30/objects_objects.html</link>
	<comments>http://usabili.ru/news/2011/12/30/objects_objects.html#comments</comments>
	<pubDate>Fri, 27 Jan 2012 05:06:17 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>методология</category>
	<category>советы</category>
	<category>javascript</category>
	<description><![CDATA[<blockquote style="margin-left:100px;"> Зомби зомби зомби. &copy; Народная мудрость </blockquote><blockquote style="margin-left:100px;"> Developers! Developers! Developers! Developers! &copy; Stiven Ballmer </blockquote>
<p>Речь в&nbsp;сегодняшней статье пойдёт в&nbsp;основном о&nbsp;яваскриптах, потому что именно их&nbsp;я&nbsp;преподаю сейчас стажёру нашей компании. Поэтому статья носит в&nbsp;основном методологический характер.</p>
<h2>Что такое объект?</h2>
<p>Поскольку яваскрипт, в&nbsp;<nobr>общем-то</nobr> <nobr>объектно-ориентированный</nobr> язык, мы&nbsp;повторяли определение что&nbsp;же такое объект в&nbsp;программировании и&nbsp;в&nbsp;яваскриптах в&nbsp;частности. Поискав для сравнения определения в&nbsp;интернете я&nbsp;ничего хорошего не&nbsp;нашла. Во&nbsp;всех источниках упоминается полнейшая чушь, что становится конечно понятно откуда берётся каша в&nbsp;головах студентов, соискателей, и&nbsp;стажёров. Потому что, вместо того чтобы делать знания простыми и&nbsp;понятными методологисты переписывают одни и&nbsp;те&nbsp;же книжки каждый раз только запутывая формулировки. Впрочем к&nbsp;концу статьи, я&nbsp;думаю вы&nbsp;запутаетесь сами =). Пока процитирую некоторые определения из&nbsp;википедии:<b><br />
</b></p>
<blockquote> <span style="color: rgb(255, 0, 0);"><b>Объект</b></span>&nbsp;&mdash; Сущность в&nbsp;<a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%90%D0%B4%D1%80%D0%B5%D1%81%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8" title="Адресация памяти">адресном пространстве</a> вычислительной системы, появляющаяся при создании экземпляра класса или копирования прототипа (например, после запуска результатов компиляции и&nbsp;связывания исходного кода на&nbsp;выполнение). <br />
<a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29">Википедия</a><br />
</blockquote>
<p>Заметьте, в&nbsp;довольно простое определения навязали адресное пространство, компиляцию, классы и&nbsp;прототипы. Это всё равно что спросить что такое птица, а&nbsp;в&nbsp;ответ получить что это сущность употребимая в&nbsp;пищу и&nbsp;вылупляющаяся из&nbsp;яиц!</p>
<blockquote> <span style="color: rgb(255, 0, 0);"><b>Объект</b></span>&nbsp;&mdash; некоторая сущность в&nbsp;виртуальном пространстве, обладающая определённым состоянием и&nbsp;поведением, имеет заданные значения свойств (атрибутов) и&nbsp;операций над ними (методов). Как правило, при рассмотрении объектов выделяется то, что объекты принадлежат одному или нескольким <a title="Класс (программирование)" href="http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%81_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29">классам</a>, которые в&nbsp;свою очередь определяют поведение (являются моделью) объекта. Время с&nbsp;момента создания объекта (конструкция) до&nbsp;его уничтожения (деструкция) называется <b>временем жизни объекта<br />
</b> </blockquote>
<p>Я&nbsp;не&nbsp;читала таких определений, когда начала изучать яваскрипты, поэтому интуитивно они представляются совсем по&nbsp;другому. Это понятие класса должно строится на&nbsp;понятии объекта, а&nbsp;не&nbsp;понятие объекта строится на&nbsp;понятии класса.</p>
<blockquote> <span style="color: rgb(255, 0, 0);"><strong>Объект</strong></span>&nbsp;&mdash; это сущность, которой можно посылать сообщения, и&nbsp;которая может на&nbsp;них реагировать, используя свои данные. Данные объекта скрыты от&nbsp;остальной программы. Сокрытие данных называется <a title="Инкапсуляция (программирование)" href="http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29">инкапсуляцией</a>. </blockquote>
<p>Опять таки. В&nbsp;определении говорится об&nbsp;инкапсуляции. А&nbsp;что если данные объекта не&nbsp;скрыты? В&nbsp;прочем поскольку моя статья про яваскрипты, данное определение вообще никакой смысловой нагрузки не&nbsp;несёт.</p>
<p>Объект в&nbsp;программировании, это такая штука, которая не&nbsp;всегда может иметь визуальное представление, типа кнопки или поля. Скорее наоборот.<br />
Представь себе массив&nbsp;&mdash; упорядоченный набор переменных. Каждая переменная в&nbsp;обычном массиве может содержать строку, число, (любую типизированную переменную) или&nbsp;другой массив. Поэтому моё определение звучит так:</p>
<blockquote> <span style="color: rgb(51, 153, 0);"><strong>Объект</strong></span>&nbsp;&mdash; это массив, который может содержать в&nbsp;качестве переменных, кроме всего прочего, функции или&nbsp;другие объекты. </blockquote>
<p>Такое определение я&nbsp;призываю запомнить стажёров, потому что это именно то, с&nbsp;чем мы&nbsp;работаем в&nbsp;яваскриптах.</p>
<p>Справедливости ради, хочется так&nbsp;же отметить определение из&nbsp;англоязычной версии. Оно довольно хорошее.</p>
<blockquote> The programming construct that combines data with a&nbsp;set of&nbsp;methods for accessing and managing those data is&nbsp;called an&nbsp;object. &copy; en.wikipedia.org <br />
<br />
Т. е. данные, и&nbsp;набор функций (методов) для работы с&nbsp;этими данными называются объектом. </blockquote>
<p>Такой вариант так&nbsp;же допустим для запоминания. А&nbsp;теперь мне хочется рассказать почему яваскрипт это целиком <nobr>объектно-ориентированный</nobr> язык, и&nbsp;какие сложности в&nbsp;обучении ему возникают.</p>
<h2>Объекты в&nbsp;Javascript</h2>
<p>Теперь внимание, дальше вы&nbsp;можете запутаться!</p>
<p><strong>В&nbsp;яваскриптах&nbsp;&mdash; почти всё является объектами, но&nbsp;не&nbsp;всё называется объектами</strong>. Число&nbsp;&mdash; или строковая переменная (или сущность)&nbsp;&mdash; не&nbsp;называются сами по&nbsp;себе объектами! Но&nbsp;по&nbsp;факту&nbsp;&mdash; являются ими.</p>
<p>Например у&nbsp;числа или строки могут быть встроенные функции. <nobr>Т. е.</nobr> функция.split например&nbsp;&mdash; аналог строковой функции explode в&nbsp;<acronym lang="en" title="Hypertext Preprocessor">php</acronym> <nobr>и т. п.</nobr></p>
<pre class="js">
var a = 'te.st';
var b = a.split('.'); // в b - будет массив из значений te и st
</pre>
<p>Чтобы понять сказанное выше утверждение, приведу такой аналог: &laquo;насекомые и&nbsp;птицы&nbsp;&mdash; не&nbsp;называются животными, хотя по&nbsp;факту являются ими&raquo;. <nobr>Т. е.</nobr> вы&nbsp;видите на&nbsp;улице собаку или слона и&nbsp;говорите &laquo;О, какое животное&raquo;. А&nbsp;когда видите птицу, говорите &laquo;какая птица&raquo;, хотя из&nbsp;биологии это тоже царство животных. А&nbsp;собаки или слоны относятся к&nbsp;млекопитающим. Так и&nbsp;тут, когда вы&nbsp;видишь число или строку&nbsp;&mdash; нет нужды говорить &laquo;о, какой объект&raquo;. Лучше сказать какая строка или какое число. А&nbsp;вот когда вы&nbsp;видите, например, документ <acronym lang="en" title="HyperText Markup Language">html</acronym>&nbsp;&mdash; document, или его тело&nbsp;&mdash; document.body&nbsp;&mdash; тут уж&nbsp;можно сказать &laquo;какой объект&raquo;, просто потому что он&nbsp;уже и&nbsp;не&nbsp;число и&nbsp;не&nbsp;строка.</p>
<p>Далее, небольшая тонкость касающаяся массивов. В&nbsp;яваскриптах есть названия для классов объектов&nbsp;&mdash; строка, число, массив и, внимание(!), Объект. Так и&nbsp;приходится писать объект объект.</p>
<p>новый массив можно создать например как:<br />
a&nbsp;= new Array(); или в&nbsp;сокращённой нотации a&nbsp;= [];<br />
новый Объект (буду писать с&nbsp;большой буквы), можно создать так:<br />
a&nbsp;= new Object(); или в&nbsp;сокращённой нотации a&nbsp;= {};</p>
<p>в&nbsp;объект массива&nbsp;&mdash; []&nbsp;&mdash; мы&nbsp;можем записывать только числовые, строковые и&nbsp;булевы переменные. Ну&nbsp;и&nbsp;другие массивы тоже. В&nbsp;объект Объекта&nbsp;&mdash; мы&nbsp;можем записывать то&nbsp;же самое + функции. Пример:</p>
<pre class="js">
var a = {1,2,3, 'my_func': function(){ do_something; } };
</pre>
<p>Обращу внимание, что функция будет доступна как элемент массива: a['my_func'](); и&nbsp;как метод объекта a.my_func();&nbsp;&mdash; в&nbsp;принципе равнозначно, как кому нравится.</p>
<p>Теперь внимание&nbsp;&mdash; массив, может содержать индексы элементов, <nobr>т. е.</nobr> на&nbsp;какой позиции какая переменная находится. <strong>В&nbsp;яваскриптах массив может содержать только ЧИСЛОВЫЕ индексы.</strong> В&nbsp;то&nbsp;время как объект&nbsp;&mdash; может содержать любые индексы переменных.</p>
<p>Индексы в&nbsp;записи Объекта пишут так index:value, однако это не подходит для записи массива (спасибо SelenIT в комментариях), поэтому запись</p>
<p>a= [1:'something', 2:'something'];&nbsp;&mdash; <strong><span style="color: rgb(255, 0, 0);">НЕ&nbsp;верна</span></strong><br />
a= ['first':'something', 2:'something'];&nbsp;&mdash; <strong><span style="color: rgb(255, 0, 0);">НЕ&nbsp;верна</span></strong><br />
a= {'first':'something', 2:'something'};&nbsp;&mdash; <span style="color: rgb(51, 153, 102);"><strong>верна</strong></span></p>
<p>Но&nbsp;можно создать такой объект</p>
<pre class="js">
var a = {'вася':'Пупкин'};
</pre>
<p>и&nbsp;обращаться к&nbsp;нему как к&nbsp;массиву</p>
<pre class="js">
alert(a['вася']));
</pre>
<p>Подробнее об&nbsp;этом написано в&nbsp;моей статье &laquo;<a href="http://usabili.ru/news/2009/09/12/javascript-rabota-s-massivami.html">Javascript&nbsp;&mdash; работа с&nbsp;массивами и&nbsp;объектами</a>&raquo; (09.2009).</p>
<p>Теперь я&nbsp;расскажу о&nbsp;функциях. Функции&nbsp;&mdash; так&nbsp;же как и&nbsp;строки, и&nbsp;числа, и&nbsp;Объекты, являются в&nbsp;<nobr>какой-то</nobr> степени объектами. Они, согласно моему определению &laquo;объект&nbsp;&mdash; это данные + функции&raquo;&nbsp;&mdash; могут содержать набор данных, и&nbsp;(!) функций.<br />
Отличия от&nbsp;строк&nbsp;&mdash; <nobr>и т. п.</nobr> &mdash;&nbsp;в&nbsp;том что чтобы вызвать внутреннюю функцию функции, или&nbsp;же переменную объявленную внутри функции необходимо вызвать саму функцию, объявляются внутри с&nbsp;помощью кодового слова this. Вся эта конструкция выглядит так:</p>
<pre class="js">
function test(){
         // do_something;
         this.x = 5;
}
тогда a = test().x; // равно 5</pre>
<p>функция при этом выполняется, и&nbsp;может <nobr>что-то</nobr> делать:</p>
<pre class="js">
&lt;script&gt;
function test(){
         // do_something;
        alert('test');
         this.x = 5;
}
a = test().x;

&lt;/script&gt;</pre>
<p>присвоит переменной число 5&nbsp;&mdash; и&nbsp;покажет alert().</p>
<h3>Ссылки на&nbsp;объекты</h3>
<p>В&nbsp;заключение, мне хочется в&nbsp;очередной раз рассказать об&nbsp;одной особенности языка Javascript связанной с&nbsp;операцией присваивания.</p>
<p>Когда происходит присвоение переменной строки, числа или логической переменной, это создаёт <strong>копию этого значения</strong>. В&nbsp;то&nbsp;время как присваивание переменной массива или объекта создаёт <strong>ссылку на&nbsp;это значение</strong>. Это вызывает путаницу, <nobr>т. к.</nobr> оказывается что изменение одной копии массива изменяет и&nbsp;вторую когда не&nbsp;надо, и&nbsp;наоборот когда надо присваивание свойства элемента переменной не&nbsp;изменит его с&nbsp;изменением этого свойства.</p>
<p>Пример:</p>
<pre class="js"><code>a=document.title; // Присваиваем переменной a - значение заголовка документа </code>
<code> a='test'; // присваиваем переменной другое значение, заголовок документа не меняется </code>
<code>a=document; // присваиваем переменной значение документа </code>
<code> a.title='test'; // присваиваем заголовку значение - меняется заголовок окна.</code></pre>
<p>Об&nbsp;этом, и&nbsp;о&nbsp;том как копировать объекты и&nbsp;массивы, так&nbsp;же написано в&nbsp;моей прошлой статье &laquo;<a href="http://usabili.ru/news/2009/09/12/javascript-rabota-s-massivami.html">Javascript&nbsp;&mdash; работа с&nbsp;массивами и&nbsp;объектами</a>&raquo;.</p>
<p>P.S. Так же очень хочу сказать что Джон Ресиг (создатель jquery если кто не в курсе), недавно выступил с отличной и правильной идеей преподавания javascript в качестве первого языка программирования. Пожалуйста прочитайте его статью: <a rel="nofollow" class="external" href="http://ejohn.org/blog/javascript-as-a-first-language/">Яваскрипт как первый язык программирования</a>.В ней он так же затрагивает некоторые вопросы методологии, и как и я подчёркивает то, что в яваскриптах всё, включая функции является объектами. Цитирую:</p>
<blockquote>
<h3>Function Declarations</h3>
<p>Perhaps the most interesting change that we can make is a rather  subtle one, but it's eschewing normal function declarations for creating  anonymous functions and assigning them to a variable.</p>
<pre class="js"><span style="color: #009900; font-style: italic;">// Don't do this:</span>
<span style="color: #003366; font-weight: bold;">function</span> getData<span style="color:#008800; font-weight:bold;">(</span><span style="color:#008800; font-weight:bold;">)</span> <span style="color:#008800; font-weight:bold;">{</span> <span style="color:#008800; font-weight:bold;">}</span>
<span style="color: #009900; font-style: italic;">// Do this instead:</span>
<span style="color: #003366; font-weight: bold;">var</span> getData = <span style="color: #003366; font-weight: bold;">function</span><span style="color:#008800; font-weight:bold;">(</span><span style="color:#008800; font-weight:bold;">)</span> <span style="color:#008800; font-weight:bold;">{</span> <span style="color:#008800; font-weight:bold;">}</span>;</pre>
<p>There are a number of good habits that are instilled when you use this particular technique.</p>
<p>Makes it easier to understand &quot;functions as an object&quot;. I've found that when you show new developers a function being assigned to a variable it suddenly becomes much more obvious that a function is actually an object and can be manipulated as such (and that a function can be passed as an argument to another function). Thus students are advanced along the path towards a better understanding of functional programming.</p>
</blockquote>
<p>С удовольствием выслушаю ваши замечания по теме.</p>
	
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/137/</wfw:commentRss>
	<slash:comments>11</slash:comments>
	<author>Usabili</author>
	<modified>2011-12-30T10-19-00Z</modified>
	  </item><item>
	<title>Родительский селектор в CSS 4</title>
	<guid isPermaLink="true">http://usabili.ru/news/2011/12/29/%D0%A0%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B9_%D1%81%D0%B5%D0%BB%D0%B5%D0%BA%D1%82%D0%BE%D1%80_%D0%B2_CSS.html</guid>
	<link>http://usabili.ru/news/2011/12/29/%D0%A0%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B9_%D1%81%D0%B5%D0%BB%D0%B5%D0%BA%D1%82%D0%BE%D1%80_%D0%B2_CSS.html</link>
	<comments>http://usabili.ru/news/2011/12/29/%D0%A0%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B9_%D1%81%D0%B5%D0%BB%D0%B5%D0%BA%D1%82%D0%BE%D1%80_%D0%B2_CSS.html#comments</comments>
	<pubDate>Thu, 29 Dec 2011 08:09:19 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>вёрстка</category>
	<category>CSS</category>
	<category>Cтандарты</category>
	<description><![CDATA[<blockquote>Некий царь призвал трёх мудрецов и&nbsp;попросил объяснить следующий факт:<br />
&laquo;почему, если в&nbsp;кувшин, доверху наполненный водой, опустить рыбу, вода не&nbsp;выливается&raquo;.<br />
Двое мудрецов представили подробнейшее обоснование. Третий опустил в&nbsp;кувшин рыбу. И&nbsp;вода вылилась. <br />
</blockquote>
<p>С&nbsp;наступающим, дорогие друзья!<br />
Я&nbsp;так и&nbsp;не&nbsp;нашла силы побороть лень и&nbsp;дописать таки статью о&nbsp;вариантах комментариях, которую пишу уже месяца четыре. Думаю ничего страшного если она полежит у&nbsp;меня в&nbsp;запасниках ещё немного.</p>
<p>Сегодня я&nbsp;зашла таки, на&nbsp;рекламированный <a rel="nofollow" class="external" href="http://pepelsbey.net/">Вадимом Макеевым</a> портал <a rel="nofollow" class="external" href="http://Web-Standards.ru"><nobr>Web-Standards</nobr>.ru</a>. И, на&nbsp;удивление обнаружила там перевод заметки &laquo;<a rel="nofollow" class="external" href="http://snook.ca/archives/html_and_css/css-parent-selectors/">Why we&nbsp;don&rsquo;t have a&nbsp;parent selector</a>&raquo; <a rel="nofollow" class="external" href="http://snook.ca/about/">Джонатана Снука</a>, написанная, что символично, 10 октября прошлого года (<nobr>10.10.10</nobr>). Собственно вот ссылка на&nbsp;сам перевод&nbsp;&mdash; &laquo;<a rel="nofollow" class="external" href="http://web-standards.ru/articles/parent-selector/" rel="bookmark">Почему у&nbsp;нас нет селектора по&nbsp;родителю</a>&raquo; <nobr>20.09.11</nobr>.</p>
<p>Сама статья бесспорно хорошая, в&nbsp;ней говорится вообще о&nbsp;том как писать быстрый код, почему селектор потомков медленный, почему селектор родителя был&nbsp;бы ещё медленнее, однако не&nbsp;говорится почему собственно есть хоть одна причина такой селектор не&nbsp;сделать. Да, это будет медленно. Да, всем понятно что селектор по&nbsp;id&nbsp;самый быстрый. Но&nbsp;в&nbsp;любом случае мы&nbsp;говорим о&nbsp;миллисекундах машинного времени. Обычно этим можно принебречь если сайт нагружен картинками и&nbsp;потоковым видео.</p>
<p>Собственно я&nbsp;бы не&nbsp;стала об&nbsp;этом писать если&nbsp;бы не&nbsp;прочитала ещё в&nbsp;сентябре черновик селекторов четвёртого уровня. <nobr>Т. е.</nobr> то, что мы&nbsp;будем называть CSS4.<br />
Ссылка: <a rel="nofollow" class="external" href="http://www.w3.org/TR/2011/WD-selectors4-20110929/#overview">http://www.w3.org/TR/2011/<nobr>WD-selectors4-20110929</nobr>/#overview</a><br />
В&nbsp;самом низу указан родительский селектор: <code>$E&nbsp;&gt; F</code> , который выбирает элемент E, родитель элемента F.</p>
<p>Кроме селектора родителя, конечно добавилось много других новых, клёвых селекторов, которые отнимут у&nbsp;Джонатана Снука ещё лишние секунды жизни.</p>
<h2>Заключение</h2>
<p>Безусловно, в&nbsp;тех проектах, в&nbsp;которых важна скорость работы в&nbsp;браузере&nbsp;&mdash; нет места подобным селекторам. Пример: проект, который я&nbsp;сейчас разрабатываю, расчитан на&nbsp;использования только в&nbsp;современных браузерах полностью исключая <nobr>IE6-8</nobr>, и&nbsp;возможно IE9 <nobr>из-за</nobr> их&nbsp;низкой скорости работы с&nbsp;dom; и&nbsp;тем не&nbsp;менее, в&nbsp;оформлении используются только селекторы id&nbsp;и&nbsp;класса; в&nbsp;яваскриптовом коде большинство селекторов заменены с&nbsp;jquery на&nbsp;нативные <nobr>и т. п.</nobr></p>
<p><nobr>Т. е.</nobr> каждый разработчик обязан представлять себе где и&nbsp;сколько времени отнимает выполнение его кода (<acronym lang="en" title="Cascading Style Sheets">css</acronym>, js, <acronym lang="en" title="HyperText Markup Language">html</acronym>). Но&nbsp;при этом инструменты для того чтобы сделать &laquo;быстро и&nbsp;сразу&raquo; должны быть. Например на&nbsp;главной странице моего блога, менее 400 элементов в&nbsp;DOM, использование тормозящего селектора в&nbsp;данном случае вообще не&nbsp;будет заметно.</p>
<p>Спасибо что читаете мой блог! =)</p>
	
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/136/</wfw:commentRss>
	<slash:comments>0</slash:comments>
	<author>Usabili</author>
	<modified>2011-12-29T07-18-00Z</modified>
	  </item><item>
	<title>Биты, байты, кодировки</title>
	<guid isPermaLink="true">http://usabili.ru/news/2011/09/14/the_truth_about_bits_and_bytes.html</guid>
	<link>http://usabili.ru/news/2011/09/14/the_truth_about_bits_and_bytes.html</link>
	<comments>http://usabili.ru/news/2011/09/14/the_truth_about_bits_and_bytes.html#comments</comments>
	<pubDate>Fri, 30 Dec 2011 01:04:46 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>советы</category>
	<category>методология</category>
	<description><![CDATA[<p>Почти полтора месяца писала данную статью, но&nbsp;надеюсь оно того столило. Данная статья может выглядеть холиварной, поэтому не&nbsp;спешите писать комментарии пока не&nbsp;прочитаете полностью. Статья главным образом о&nbsp;методологии.</p>
<p>Дело в&nbsp;том, что я&nbsp;твёрдо уверена, что в&nbsp;учебных заведениях по&nbsp;информационной специальности, школьникам и&nbsp;студентам забивают голову историей древнего мира вместо актуальных знаний. Все методички преподают дамы бальзаковского возраста, а&nbsp;пишут эти методички профессора возраста Карла Маркса. В&nbsp;результате от&nbsp;соискателей на&nbsp;работу, и&nbsp;от&nbsp;стажёров, я&nbsp;слышала такие забавные заблуждения, относительно фундаментальных основ, как:</p>
<ul>
    <li>в&nbsp;байте 1024 бита</li>
    <li>в&nbsp;байте 8 бит потому что 8&nbsp;&mdash; степень двойки</li>
    <li>бит принимает всякие разные значения от&nbsp;0 до&nbsp;1</li>
</ul>
<p>В&nbsp;числе прочих забавных случаев: для выбора десяти случайных чисел из&nbsp;<acronym lang="ru" title="База данных">бд</acronym>, соискатели десять раз делают запрос; для открытия файла на&nbsp;чтение используют в&nbsp;<acronym title="Hypertext Preprocessor">PHP</acronym> флаг 'a+'; не&nbsp;умеют работать со&nbsp;строками, кодировками и&nbsp;указателями. Написать функцию, которая возвращает строку задом намерёд, не&nbsp;используя <nobr>переменную-буфер</nobr>&nbsp;&mdash; вообще непосильная задача.</p>
<p>В&nbsp;этой статье, я&nbsp;хочу коснуться проблемы заблуждений с&nbsp;битами и&nbsp;байтами, и&nbsp;написать свою методику обучения этим фундаментальным знаниям.</p>
<p>&nbsp;</p>
	<p>Итак&hellip; сперва я&nbsp;хочу написать определения из&nbsp;<strike>википедии</strike> методичек, которые являются догмой в&nbsp;умах профессоров из&nbsp;мин.образования.</p>
<ul>
    <li>Бит&nbsp;&mdash; это двоичный логарифм вероятности равновероятных событий или сумма произведений вероятности на&nbsp;двоичный логарифм вероятности при равновероятных событиях; (или&nbsp;другими словами) бит&nbsp;&mdash; это единица информации, равная результату эксперимента, имеющему два исхода</li>
    <li>Бит&nbsp;&mdash; минимальная единица информации.</li>
    <li>Байт&nbsp;&mdash; минимальная <u>адресуемая</u> единица информации.</li>
</ul>
<p><nobr>Из-за</nobr> этих определений, в&nbsp;умах будущих программистов ЭВМ, больше каши, чем <nobr>из-за</nobr> <nobr>каких-либо</nobr> других определений! Они совершенно истинны, но&nbsp;совершенно бесполезны для обучения. Я&nbsp;превращаюсь в&nbsp;Халка, когда слышу их.</p>
<h2>Про биты</h2>
<p>Итак, дети, садитесь, урок первый, представьте себе выключатель. Нет, не&nbsp;двоичный логарифм вероятности&hellip; А&nbsp;обычный такой выключатель, тумблер, рычажок, что угодно, включающее например лампочку, когда находится в&nbsp;одном положении и&nbsp;выключающее в&nbsp;другом. На&nbsp;некоторых рычажках даже подписывают буковки I/O, как указатели положений ручки. Нет, выключатель не&nbsp;несёт в&nbsp;себе информацию. Он&nbsp;выключает свет.</p>
<p>У&nbsp;выключателя есть два положения&nbsp;&mdash; вкл/выкл. Если мы&nbsp;поставим рядом два выключателя, то&nbsp;количество комбинаций позиций, которое могут занимать их&nbsp;ручки&nbsp;&mdash; четыре. (Когда оба выключены, когда оба включены, и&nbsp;две комбинации когда включен только один из&nbsp;них). Если мы&nbsp;возьмём систему из&nbsp;трёх выключателей&nbsp;&mdash; они смогут занимать восемь комбинаций. И&nbsp;так далее, N&nbsp;выключателей имеют <code>2^N</code> комбинаций. Выключатель который имеет только два положения (вкл/выкл) мы&nbsp;можем назвать битом. Если мы&nbsp;представим, что положениям вкл/выкл соответствуют числа 1 и&nbsp;0, то&nbsp;можно легко записать <nobr>какое-нибудь</nobr> целое число в&nbsp;двоичной системе счисления, используя только последовательный набор выключателей, так чтобы каждый выключатель отвечал за&nbsp;свой двоичный разряд.</p>
<p>Безусловно выключатели мы&nbsp;можем применить к&nbsp;магнитной дорожке, или оптическому диску, так, чтобы при помощи специального устройства можно было &laquo;включать&raquo; или &laquo;выключать&raquo; их&nbsp;маленькие участки. Теперь мы&nbsp;наконец подошли к&nbsp;тому, что все компьютерные запоминающие устройства состоят из&nbsp;&laquo;ноликов и&nbsp;единичек&raquo;.</p>
<p>Однако, в&nbsp;этих ноликах и&nbsp;единичках нам надо хранить информацию. Какую&nbsp;же информацию нам можно хранить? Давайте рассмотрим один бит. Мы&nbsp;можем условно договориться, что он&nbsp;может хранить информацию, и&nbsp;два его состояния вкл/выкл содержат значения &laquo;баклажан&raquo; и&nbsp;&laquo;не&nbsp;баклажан&raquo; соответственно. Это отлично подходит, когда нам надо произвести учёт баклажанов! Однако в&nbsp;реальном мире компьютеры, которые умеют только считать баклажаны&nbsp;&mdash; не&nbsp;пользуются спросом. Выходит выключатель (бит) не&nbsp;может нести в&nbsp;себе информацию. Чтобы записывать ноликами и&nbsp;единичками <nobr>какую-то</nobr> информацию, было решено группировать их&nbsp;по&nbsp;несколько штук, и&nbsp;такую группу называть байтом.</p>
<h2>Байт</h2>
<p>На&nbsp;заре компьютеров байты составляли 4, потом 5, потом 6 бит&hellip; Группа из&nbsp;6 бит может принимать целых 64 значений. Вполне неплохо, так как можно создать некую таблицу соответствий этих значений определённым символам&nbsp;&mdash; кодировку. Такая кодировка уже может содержать цифры и&nbsp;заглавные буквы латинского алфавита, а&nbsp;также некоторые арифметические знаки. &laquo;<a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%A8%D0%B5%D1%81%D1%82%D0%B8%D0%B1%D0%B8%D1%82%D0%BD%D0%B0%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0"><nobr>Шестибитные-кодировки</nobr></a>&raquo;&nbsp;&mdash; применялись на&nbsp;компьютерах в&nbsp;<nobr>1950-х</nobr>&nbsp;&mdash; <nobr>1960-х</nobr> годах.</p>
<p>Для человека который только начинает изучать информатику, будет понятно и&nbsp;легко запомнить что байт&nbsp;&mdash; является минимальной единицей информации. В&nbsp;байт можно записать <nobr>какое-нибудь</nobr> число, либо например <nobr>какой-нибудь</nobr> символ из&nbsp;<a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B1%D0%BE%D1%80_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2">таблицы символов</a> (англ. charset, буквально &laquo;набор символов&raquo;)&nbsp;&mdash; <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0">кодировки</a> (codepage, encoding).</p>
<p>С&nbsp;развитием компьютеров, появилась потребность в&nbsp;большем количестве значений для байта. В&nbsp;<nobr>1963-м</nobr> году появилась первая редакция семибитной кодировки ASCII. Поэтому байты стали занимать 7 бит. 7 бит, требующиеся для одного символа данной кодировки позволяют использовать 128 значений. В&nbsp;этой кодировке уже были включены строчные латинские символы, и&nbsp;больший набор управляющих и&nbsp;арифметических символов.</p>
<p><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/ASCII_Code_Chart.svg/500px-ASCII_Code_Chart.svg.png" alt="" /></p>
<p>Всемирное распространение компьютеров подтолкнуло дальнейшее расширение границ занимаемых байтом. Для различных языков требовалось чтобы таблица символов также могла хранить алфавит того языка, где используется данная ЭВМ. На&nbsp;текущий момент восемь&nbsp;&mdash; это последнее и&nbsp;видимо окончательное количество бит составляющих байт. Соответственно байт может принимать 256 значений. По&nbsp;сравнению с&nbsp;таблицей ASCII&nbsp;в.&nbsp;новых таблицах символов&nbsp;&mdash; организовалось 128 вакантных мест. Теперь я&nbsp;думаю можно рассказать как значения хранятся в&nbsp;различных кириллических кодировках.</p>
<h2>Кодировки</h2>
<p>Итак, чтобы хранить символы не&nbsp;входящие в&nbsp;ASCII, необходимо было придумать новые кодировки. Поскольку до&nbsp;этого таблица ASCII была наиболее подходящей (были и&nbsp;другие), то&nbsp;она и&nbsp;пошла в&nbsp;основу новых кодировок. Поэтому следующие кодировки отличаются только значениями начиная с&nbsp;80 (hex). Для наглядности оставлю только кириллические символы.</p>
<p><img width="421" height="150" src="http://usabili.ru/news_imgs/132/cp866.png" alt="Кодировка cp866" /></p>
<p>Так выглядела наиболее популярная кодировка под DOS. Примечательно что файлы в&nbsp;этой кодировке до&nbsp;сих пор встречаются. Как правило среди устаревшей архивной информации, в&nbsp;программах WinRar, Блокнот и&nbsp;WordPad, до&nbsp;сих пор есть опции &laquo;открыть как текст DOS&raquo;, впрочем последними двумя мало кто пользуется =).</p>
<p><img width="421" height="150" src="http://usabili.ru/news_imgs/132/koi8-r.png" alt="Кодировка koi8-r" /></p>
<p>Кодировка koi8 была примечательна тем, что русские буквы там располагались на&nbsp;позициях английских звуков из&nbsp;нижней половины (<nobr>т. е.</nobr> ASCII). Это <nobr>когда-то</nobr> давно позволяло смягчить переход со&nbsp;старых серверов понимающие только ascii на&nbsp;новые, что было актуально среди почтовых серверов. Смысл был в&nbsp;том что если отправленное вами письмо приходило на&nbsp;старый сервер, то&nbsp;пользователю оно показывалось как транслит, что позволяло хоть <nobr>как-то</nobr> понять текст письма.</p>
<p><img width="421" height="150" src="http://usabili.ru/news_imgs/132/cp1251.png" alt="Кодировка cp1251" /></p>
<p>Самая популярная у&nbsp;нас в&nbsp;России однобайтная кодировка, на&nbsp;сегодняшний день, это именно <nobr>&laquo;windows-1251&raquo;</nobr>. Разумеется популярность её целиком обусловлена популярностью Windows среди&nbsp;других операционных систем. Возможностей кодировки вполне хватает для использования её в&nbsp;широком круге задач. Например движок моего блога, <nobr>по-умолчанию</nobr>, использует для работы именно данную кодировку.</p>
<p><img width="421" height="150" src="http://usabili.ru/news_imgs/132/iso8859-5.png" alt="Кодировка iso8859-5" /></p>
<p>Я&nbsp;не&nbsp;могу не&nbsp;упомянуть о&nbsp;кодировке ISO, Удивительно, но&nbsp;несмотря на&nbsp;то&nbsp;что её никто никогда не&nbsp;использовал, эта кодировка является единственной кодировкой имеющей статус стандарта.</p>
<p>На&nbsp;примере данных кодировок видно, как один байт может хранить какое угодно символьное значение русского и&nbsp;английского языков, а&nbsp;также цифр и&nbsp;знаков пунктуации.</p>
<p>Но&nbsp;что делать когда этого не&nbsp;достаточно?</p>
<h3>Многобайтные кодировки</h3>
<p>Если вам хочется создать кодировку которая&nbsp;бы имела коды одновременно для русского и&nbsp;греческого алфавита? Одним байтом тут не&nbsp;отделаться. Появилась задача разработать кодировку один знак которой может занимать больше чем один байт, так как два байта могут принимать уже 2^16 = 65536 значений, а&nbsp;четыре байта аж&nbsp;4294967296. Поэтому сначала придумали стандарт кодирования символов&nbsp;&mdash; Юникод, который включал&nbsp;бы в&nbsp;себя максимально полный перечень символов которые может принимать один знак.</p>
<p>Первая версия Юникода (<strong>Unicode </strong>1991&nbsp;г.) представляла собой <nobr>16-битную</nobr> кодировку с&nbsp;фиксированной шириной символа; общее число разных символов было 2<sup>16</sup> (65&nbsp;536).</p>
<p>Вторая версия Юникода (<nobr>UCS-2</nobr>), стала называться <strong><nobr>UTF-16</nobr></strong>, она позволяла гораздо расширить количество возможных значений, также используя для символов <nobr>16-битные</nobr> последовательности (<nobr>т. е.</nobr> по&nbsp;2 или по&nbsp;4 байта на&nbsp;символ).</p>
<blockquote> Символы с&nbsp;кодами 0&times;0000.0xD7FF и&nbsp;0xE000.0xFFFF представляются одним <nobr>16-битным</nobr> словом, а&nbsp;символы с&nbsp;кодами 0&times;10000&ndash;0&times;10FFFF&nbsp;&mdash; в&nbsp;виде последовательности двух <nobr>16-битных</nobr> слов. Количество символов, представляемых двумя <nobr>16-битными</nobr> словами равно (<span class="texhtml">2<sup>20</sup></span>). Для представления символов с&nbsp;кодами 0&times;10000&ndash;0&times;10FFFF используется матрица перекодировки. Первое слово из&nbsp;двух переданных лежит в&nbsp;диапазоне <nobr>0xD800-0xDBFF</nobr>, а&nbsp;второе&nbsp;&mdash; <nobr>0xDC00-0xDFFF</nobr>. Именно этот диапазон значений не&nbsp;может встречаться среди символов, передаваемых с&nbsp;помощью одного <nobr>16-битного</nobr> слова, так что расшифровка кодировки всегда однозначна. Ясно, что имеется как раз <span class="texhtml">2<sup>10</sup> * 2<sup>10</sup> = 2<sup>20</sup></span> таких комбинаций.
<p align="right"><a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/UCS-2">Википедия&nbsp;&mdash; <nobr>UTS-2</nobr></a></p>
</blockquote>
<p>Кодировка <strong><nobr>UTF-32</nobr></strong> (<nobr>UCS-4</nobr>) использует по&nbsp;32 бита, или 4 байта на&nbsp;хранение одного символа. Строго говоря, стандарт Unicode не&nbsp;описывает символы со&nbsp;значениями выше 2^21, так что хватило&nbsp;бы и&nbsp;трёх байт, на&nbsp;символ, вероятно компьютеры работают несколько быстрее с&nbsp;мелкими блоками памяти кратными двум, или для того чтобы в&nbsp;сектор диска попадало кратное количество символов. Так или иначе это единственная из&nbsp;многобайтных кодировок с&nbsp;постоянной длиной. Помимо недостатка&nbsp;&mdash; использования четырёх байт на&nbsp;символ, у&nbsp;неё есть и&nbsp;очевидное преимущество &mdash;  возможность прямой адресации к&nbsp;<nobr>N-ному</nobr> символу. В&nbsp;других кодировках требуется последовательное вычисление позиции каждого символа. Поэтому текстовые редакторы, внутри себя хранят всю информацию в&nbsp;виде <nobr>UCS-4</nobr>.</p>
<p>В&nbsp;1992 году Кеном Томпсоном и&nbsp;Робом Пайком был изобретён формат <strong><nobr>UTF-8</nobr></strong>. Он&nbsp;отличается тем, что он&nbsp;ASCII совместим, и&nbsp;значения из&nbsp;таблицы Юникода могут занимать от&nbsp;1 до&nbsp;4х символов.</p>
<p>Символы <nobr>UTF-8</nobr> получаются из&nbsp;Unicode следующим образом:</p>
<table border="1" style="border-collapse:collapse;">
    <tbody>
        <tr>
            <th>Unicode</th>
            <th><nobr>UTF-8</nobr></th>
            <th>Представленные символы</th>
        </tr>
        <tr>
            <td><code>0&times;00000000</code>&nbsp;&mdash; <code>0&times;<nobr>0000007F</nobr></code></td>
            <td><code>0xxxxxxx</code></td>
            <td>ASCII, в&nbsp;том числе английский алфавит, простейшие знаки препинания и&nbsp;арабские цифры</td>
        </tr>
        <tr>
            <td><code>0&times;00000080</code>&nbsp;&mdash; <code>0&times;000007FF</code></td>
            <td><code>110xxxxx 10xxxxxx</code></td>
            <td>кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и&nbsp;коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания</td>
        </tr>
        <tr>
            <td><code>0&times;00000800</code>&nbsp;&mdash; <code>0&times;0000FFFF</code></td>
            <td><code>1110xxxx 10xxxxxx 10xxxxxx</code></td>
            <td>все другие современные формы письменности, в&nbsp;том числе грузинский алфавит, индийское, китайское, корейское и&nbsp;японское письмо; сложные знаки препинания; математические и&nbsp;другие специальные символы</td>
        </tr>
        <tr>
            <td><code>0&times;00010000</code>&nbsp;&mdash; <code>0&times;001FFFFF</code></td>
            <td><code>11110xxx 10xxxxxx 10xxxxxx 10xxxxxx</code></td>
            <td>музыкальные символы, редкие китайские иероглифы, вымершие формы письменности</td>
        </tr>
    </tbody>
</table>
<p>Символы, в&nbsp;кодировке <nobr>UTF-8</nobr>, могут занимать до&nbsp;шести байт, но&nbsp;Unicode не&nbsp;определяет символов выше <code>0&times;10ffff</code>, поэтому символы Unicode могут иметь максимальный размер в&nbsp;4 байта в&nbsp;<nobr>UTF-8</nobr>.</p>
<h2>Заключение</h2>
<p>Вот собственно и&nbsp;всё что я&nbsp;хотела рассказать. Я&nbsp;считаю что очень интересно разбираться в&nbsp;том как работает компьютер, знать как хранятся в&nbsp;нём символы которые я&nbsp;набираю на&nbsp;клавиатуре, представлять насколько однобайтная кодировка например <nobr>win-1251</nobr> (или <nobr>utf-32</nobr> с&nbsp;фикс. длиной) работает быстрее со&nbsp;строковыми функциями и&nbsp;почему <nobr>и т. п.</nobr> Надеюсь статья вам понравилась.</p>
<p>Большое спасибо Википедии за&nbsp;возможность скопировать цитаты и&nbsp;таблицы, а&nbsp;то&nbsp;бы писала статью ещё месяц.</p>
<p>Все кто хочет узнать больше, также могут почитать про то&nbsp;в&nbsp;каком порядке записываются байты в&nbsp;кодировках <nobr>UTF-16</nobr> и&nbsp;<nobr>UTF-32</nobr>&nbsp;&mdash; в&nbsp;википедии <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/UCS-2#.D0.9F.D0.BE.D1.80.D1.8F.D0.B4.D0.BE.D0.BA_.D0.B1.D0.B0.D0.B9.D1.82">тут</a> и&nbsp;<a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/UTF-32#.D0.9F.D0.BE.D1.80.D1.8F.D0.B4.D0.BE.D0.BA_.D0.B1.D0.B0.D0.B9.D1.82.D0.BE.D0.B2">тут</a>. А&nbsp;также что такое порядок байтов тут: <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2">Порядок_байтов</a>. Также интересна будет статья <a rel="nofollow" class="external" href="http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4_%D0%B2_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D1%85_Microsoft">Юникод_в_операционных_системах_Microsoft</a>.</p>
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/132/</wfw:commentRss>
	<slash:comments>9</slash:comments>
	<author>Usabili</author>
	<modified>2011-09-14T03-33-00Z</modified>
	  </item><item>
	<title>С днём программиста</title>
	<guid isPermaLink="true">http://usabili.ru/news/2011/09/13/happy_programmers_day.html</guid>
	<link>http://usabili.ru/news/2011/09/13/happy_programmers_day.html</link>
	<comments>http://usabili.ru/news/2011/09/13/happy_programmers_day.html#comments</comments>
	<pubDate>Tue, 13 Sep 2011 15:10:06 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<description><![CDATA[<p>Собственно сабж. Поздравляю всех коллег с Днём программиста! Желаю чтоб код запускался без отладки, точки с запятой ставились сами, и лишние кавычки не попадали в БД. =)</p>
<p>Всем JS-программистам и верстальщикам отдельно желаю чтоб заказчики не пользовались IE.</p>
<p><img alt="" src="http://www.liveinternet.ru/stat/ru/browsers.gif?id=49;id=55;id=50;id=54;id=checked;period=month;relgraph=yes;graph=yes" /></p>
	
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/133/</wfw:commentRss>
	<slash:comments>0</slash:comments>
	<author>Usabili</author>
	<modified>2011-09-13T14-58-00Z</modified>
	  </item><item>
	<title>На комментарии теперь можно подписаться</title>
	<guid isPermaLink="true">http://usabili.ru/news/2011/07/16/news_comment_subscription.html</guid>
	<link>http://usabili.ru/news/2011/07/16/news_comment_subscription.html</link>
	<comments>http://usabili.ru/news/2011/07/16/news_comment_subscription.html#comments</comments>
	<pubDate>Mon, 18 Jul 2011 08:46:30 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>тест движка</category>
	<description><![CDATA[<p>За&nbsp;эти выходные движок моего бложика приобрёл одну важную функцию, для меня и&nbsp;для вас, дорогие читатели&nbsp;&mdash; теперь мои ответы на&nbsp;ваши комментарии будут отправляться вам на&nbsp;почту. До&nbsp;этого блог не&nbsp;имел автоматического уведомления, когда я&nbsp;отвечала на&nbsp;<nobr>чей-нибудь</nobr> комментарий, в&nbsp;некоторых случаях я&nbsp;делала такую рассылку в&nbsp;ручную. Сейчас есть галочка &laquo;<input type="checkbox" value="1" style="width: auto; padding: 5px;" checked="checked" /> Сообщать мне о&nbsp;новых комментариях на&nbsp;<nobr>e-mail</nobr>&raquo;, рассылка работает в&nbsp;пределах той новости на&nbsp;которую вы&nbsp;отвечаете.</p>
<p>Текущая реализация, сейчас удовлетворяет главную задачу&nbsp;&mdash; автоматически сообщать вам, когда я&nbsp;отвечу на&nbsp;ваши комментарии. Однако имеется и&nbsp;ряд недостатков:</p>
<ul>
    <li>Подписаться на&nbsp;рассылку комментариев можно только оставляя комментарий.</li>
    <li>Соответственно, подписаться можно только авторизуясь на&nbsp;сайте.</li>
    <li>Нет ссылки отписаться от&nbsp;рассылки, в&nbsp;тексте уведомления.</li>
    <li>Нет ссылки отписаться от&nbsp;рассылки на&nbsp;самом сайте.</li>
    <li>Нет списка новостей на&nbsp;комментарии к&nbsp;которым вы&nbsp;подписаны.</li>
</ul>
<p>Прошу читателей блога помочь мне найти ещё недостатки текущей реализации и&nbsp;придумать <nobr>что-нибудь</nobr> полезное, связанное с&nbsp;комментированием новостей. На&nbsp;каких сайтах вам понравилась форма комментариев? Вы&nbsp;подписываетесь на&nbsp;комментарии к&nbsp;<nobr>какой-то</nobr> новости?</p>
<p>Спасибо.</p>
	
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/131/</wfw:commentRss>
	<slash:comments>1</slash:comments>
	<author>Usabili</author>
	<modified>2011-07-16T23-43-00Z</modified>
	  </item><item>
	<title>Основные ошибки проектирования процесса авторизации</title>
	<guid isPermaLink="true">http://usabili.ru/news/2011/07/12/basic_login_errors.html</guid>
	<link>http://usabili.ru/news/2011/07/12/basic_login_errors.html</link>
	<comments>http://usabili.ru/news/2011/07/12/basic_login_errors.html#comments</comments>
	<pubDate>Wed, 13 Jul 2011 13:58:46 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>usability</category>
	<description><![CDATA[<p>PHP-программисты часто делают пару ошибок присущие авторизации, которые впрочем легко исправляются. Все ошибки описанные ниже были исправлены на&nbsp;рабочем сайте в&nbsp;течение получаса, написание статьи заняло у&nbsp;меня в 5 раз больше времени.</p>
<p>&nbsp;</p>
	<p>&nbsp;</p>
<h2>1) После авторизации показывать пользователю окно с&nbsp;перенаправлением</h2>
<p>Стремитесь проектировать взаимодействие с&nbsp;пользователем в&nbsp;<nobr>1-Клик</nobr>.  Для программиста это не&nbsp;очевидно, но&nbsp;каждое дополнительное открытие  не&nbsp;нужного промежуточного окна увеличивает время достижения результата  на&nbsp;100% от&nbsp;идеального показателя.</p>
<p>Многие известные системы страдают этим. Насколько я&nbsp;помню у&nbsp;всех  форумов phpBB до&nbsp;сих пор после авторизации идёт страница &laquo;Подождите,  вы&nbsp;будете перенаправлены, если ваш браузер не&nbsp;поддерживает редиректы нажмите&hellip;&nbsp;  блаблабла&raquo;. Не&nbsp;стоит даже обсуждать случай, когда браузер пользователя  действительно не&nbsp;поддерживает <nobr>meta-перенаправления</nobr>, потому  что тогда время его взаимодействия на&nbsp;данном действие возрастёт  на&nbsp;1000%. Замечу что плохи именно meta, а&nbsp;не&nbsp;http редиректы (301,302).</p>
<p>Обычно ошибка заключается в&nbsp;том что программист реализует функцию  проверки авторизации используя переменные $_COOKIE, а&nbsp;проводит  авторизацию используя функцию <code>setcookie()</code>, которая  устанавливает куксу, но&nbsp;не&nbsp;устанавливает переменную. Или&nbsp;же проверка  авторизации запускается после авторизации на&nbsp;странице.</p>
<p>Решение: принудительно устанавливать переменную $_COOKIE, а&nbsp;вызов функции авторизации подвинуть выше проверки на&nbsp;авторизацию.</p>
<h2>2) После авторизации показывать главную страницу, или страницу профиля пользователя</h2>
<p>В&nbsp;99% случаев это не&nbsp;та&nbsp;страница ради которой пользователь  авторизовался на&nbsp;сайте. Как правило пользователь захотел  прокомментировать статью, или скачать торрент, или совершить <nobr>какое-либо</nobr> другое действие на&nbsp;странице на&nbsp;которой он&nbsp;находился до&nbsp;этого.</p>
<p>Пользователю придётся возвращаться назад в&nbsp;истории браузера, или, что  сложнее, искать нужную страницу, для которой требовалась авторизация  на&nbsp;сайте, заново, что потребует катастрофически много усилий и&nbsp;времени.</p>
<p>Причина, почему так происходит, в&nbsp;том, что в&nbsp;качестве функции  авторизации используется статичный адрес типа /login/, и&nbsp;функция  авторизации не&nbsp;получает данных о&nbsp;странице на&nbsp;которой был пользователь.</p>
<p>Решение&nbsp;&mdash; использовать в&nbsp;этой функции http-переадресацию на&nbsp;страницу  $_SERVER['HTTP_REFERER'], если она задана. Либо производить авторизацию  на&nbsp;той&nbsp;же странице (<nobr>т. е.</nobr> на&nbsp;любой странице движка), используя в&nbsp;качестве action адреса формы авторизации&nbsp;&mdash; значение $_SERVER['REQUEST_URI'].</p>
<p>Замечу, что <strong>авторизация на&nbsp;отдельной странице /login/ и&nbsp;переадресация на&nbsp;нужную пользователю страницу, методом <nobr>http-редиректа</nobr>, является предпочтительной</strong>, <nobr>т. к.</nobr>  в&nbsp;случае обновления страницы, браузер не&nbsp;спросит нужно&nbsp;ли посылать  данные формы заново. Вы&nbsp;можете проверить это, войдя на&nbsp;сайт чтобы  оставить комментарий к&nbsp;этой статье =).</p>
<h2>3) При отсутствии авторизации перенаправлять на&nbsp;главную страницу</h2>
<p>Это больше всего характерно для <nobr>админ-панелей</nobr> сайтов, и&nbsp;подобных закрытых систем. Очень часто, когда менеджер сайта заходит по&nbsp;ссылке <code>/admin/items/edit_4999.html</code>&nbsp;&mdash; он&nbsp;обнаруживает, что не&nbsp;авторизован на&nbsp;сайте. Адрес страницы часто бывает сложно запомнить, и&nbsp;<a rel="nofollow" class="external" href="http://boughcms.ru/">система управления контентом</a>  должна приложить определённые усилия, чтобы менеджер никак не&nbsp;потерял  этот адрес. Перенаправлять в&nbsp;данном случае не&nbsp;авторизовавшихся  пользователей&nbsp;&mdash; не&nbsp;вежливо. Сайт который мы&nbsp;с&nbsp;коллегами улучшали  сегодня&nbsp;&mdash; просто говорил о&nbsp;том что доступ запрещён, на&nbsp;нужной странице,  и&nbsp;содержал ссылку на&nbsp;страницу с&nbsp;формой авторизации, что не многим лучше.</p>
<p>Исключениями могут быть только системы где адрес страницы не&nbsp;является критичным, например браузерные онлайн игры.</p>
<p>Решением для <nobr>админ-панелей</nobr>&nbsp;&mdash; является показ формы авторизации на&nbsp;странице требующей пароля. Так, чтобы пользователь попал куда надо в&nbsp;<nobr>1-клик</nobr>.</p>
<h2>4) Вызывать проверку авторизации в&nbsp;каждой функции</h2>
<p>Ошибкой незаметной для пользователя, но&nbsp;иногда захламляющей и&nbsp;замедляющей код&nbsp;&mdash; является проверка авторизации в&nbsp;каждой функции <nobr>какого-то</nobr> модуля, вместо соответствующей проверки в&nbsp;одном месте до&nbsp;вызова функций.</p>
<p>В&nbsp;модуле документооборота который я&nbsp;смотрела сегодня, это было не&nbsp;так. В результате, проверка авторизации, не&nbsp;относящаяся к&nbsp;<nobr>бизнес-логике</nobr>, присутствовала почти в&nbsp;каждой функции, и&nbsp;при этом присутствовала не&nbsp;всегда, когда должна была&nbsp;бы.</p>
<p>Решение&nbsp;&mdash; в&nbsp;одном месте будет гораздо проще отследить, какой функционал требует авторизации, а&nbsp;какой нет.</p>
<h2>Заключение</h2>
<p>Надеюсь статья поможет начинающим программистам сделать несколько улучшений их кода.</p>
<p><nobr>P. S.</nobr> Кстати, слова &laquo;авторизироваться&raquo; в&nbsp;русском языке  нет, правильно говорить &laquo;авторизоваться&raquo;. Я&nbsp;считаю, что это эквивалентно словам &laquo;входить&raquo; и&nbsp;&laquo;войти&raquo;. Правильно &mdash;  &laquo;авторизовавшись&raquo;, вместо &laquo;авторизировавшись&raquo;.</p>
<p><nobr>P. P. S.</nobr> Термин <nobr>1-клик</nobr> можно увидеть  в&nbsp;действие на&nbsp;сайте amazon.com, он&nbsp;был реализован Джеффом Безосом,  основателем компании Amazon.com и&nbsp;его проэктировщиками. О&nbsp;проектировании  подобных интерфейсов вы&nbsp;можете прочитать в&nbsp;книге Алана Купера  &laquo;Психбольница в&nbsp;руках пациентов&raquo;.</p>
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/130/</wfw:commentRss>
	<slash:comments>3</slash:comments>
	<author>Usabili</author>
	<modified>2011-07-12T01-27-00Z</modified>
	  </item><item>
	<title>О геополитике, и о защите кода</title>
	<guid isPermaLink="true">http://usabili.ru/news/2011/05/11/code_protection.html</guid>
	<link>http://usabili.ru/news/2011/05/11/code_protection.html</link>
	<comments>http://usabili.ru/news/2011/05/11/code_protection.html#comments</comments>
	<pubDate>Wed, 11 May 2011 23:28:15 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>советы</category>
	<description><![CDATA[<p>Долго не&nbsp;писала, не&nbsp;отвечала на&nbsp;коментарии, и&nbsp;гостевую&nbsp;&mdash; была в&nbsp;отъезде.</p>
<p>В&nbsp;предыдущем посте (<a rel="nofollow" class="external" href="http://usabili.ru/news/2011/04/26/zend_guard.html#">Zend Guard пролетел&hellip;</a>), коллега Bars задал вопрос, как быть если просят открыть код, до&nbsp;оплаты проекта, и&nbsp;как работать с&nbsp;западными заказчиками.</p>
<h2>О&nbsp;геополитике</h2>
<p>Сперва, немного проясню, читателям блога, и&nbsp;тебе, уважаемый Bars, что как и&nbsp;где. Самая благоприятная атмосфера для работы по&nbsp;сайтостроению сейчас в&nbsp;России, здесь очень большой спрос на&nbsp;сайты, который щедро оплачивается, особенно в&nbsp;Москве, даже мы&nbsp;иногда аутсорсим часть работы украинским коллегам. Средний российский фрилансер работает на Москву. Поскольку мы&nbsp;работаем с&nbsp;заказчиками тоже исключительно в Москве, они приезжают в&nbsp;офис, пьют кофе и&nbsp;все проблемы легко решаются.</p>
<p>Сложнее обстоят дела на&nbsp;Украине, откуда судя по&nbsp;всему и&nbsp;пишет тов. Bars. Украинский внутренний рынок сайтостроительства вообще не&nbsp;насыщен, особенно по&nbsp;дизайнам (пруф. ищите ссылки на&nbsp;интервью А.Лебедева). <nobr>Т. е.</nobr> ситуация такая, что свой, украинский заказчик, не&nbsp;может платить столько, сколько платят на&nbsp;западе, например. Поэтому на Украине более развито направление работы с&nbsp;западными заказчиками. Работа на&nbsp;внутреннем рынке ведётся, но&nbsp;пока медленно. Украинские компании пока вообще не&nbsp;понимают, зачем им&nbsp;сайты. Билл Гейтс со&nbsp;своей книжкой &laquo;Бизнес со&nbsp;скоростью мысли&raquo; видимо уже 12 лет никак не&nbsp;попадёт на&nbsp;книжные лавки Киева. А&nbsp;жаль. Зато именно украинским дизайнерам мы&nbsp;обязаны такому обилию шаблонов на&nbsp;западных <nobr>темплейт-стоках</nobr>.</p>
<p>Совсем тяжко сейчас в&nbsp;Белоруссии (Беларуси). Батька запретил всё, что только можно. Знакомые минчане очень переживают. Все банковские транзакции перекрыты. Перевод валют не&nbsp;осуществляется. Даже банк <nobr>&laquo;Москва-Минск&raquo;</nobr> не&nbsp;совершает переводов <nobr>Москва-Минск</nobr>! О&nbsp;кризисе внутренней насыщенности белорусского рынка, можно понять, просто посмотрев на&nbsp;сайт того&nbsp;же банка&nbsp;&mdash; <a rel="nofollow" class="external" href="http://www.mmbank.by/">http://www.mmbank.by/</a>. А&nbsp;потом, для сравнения, на&nbsp;не&nbsp;самый лучший сайт Банка Москвы <a rel="nofollow" class="external" href="http://www.bm.ru/">http://www.bm.ru/</a>.</p>
<p>В странах Европы, ситуация поздоровее. Люди работают и&nbsp;на&nbsp;внутренний и&nbsp;на&nbsp;западный рынок.</p>
<h2>Как вести себя с&nbsp;заказчиками</h2>
<p>Статьи с&nbsp;примерно таким заголовком вам нужно читать в&nbsp;больших количествах. Легко отличить хорошие статьи от&nbsp;плохих, но&nbsp;прочитать критически стоит почти все. Также полезно практиковаться в&nbsp;риторике и&nbsp;прикладной психологии. Но&nbsp;самое полезное&nbsp;&mdash; это завести себе крутого менеджера, если у&nbsp;вас его ещё нет. Если вы&nbsp;делаете сайт <nobr>один </nobr>&mdash; <nobr>то</nobr> менеджер должен просить никак не&nbsp;меньше 30&ndash;50% с&nbsp;заказа, или он&nbsp;просто не&nbsp;понимает своих задач.</p>
<p>Далее, что касается закрытости кода. Конечно можно его обфусцировать, но&nbsp;почти вся обфускация сводится к &quot;<code>$blablabla=blablabla; eval($blablabla);&quot;</code> <nobr>т. е.</nobr> эффективность ноль. Как правильно начал делать тов. Bars в&nbsp;своей статье&nbsp;&mdash; сайт нужно показывать на&nbsp;своём хостинге. И&nbsp;никуда его не&nbsp;устанавливать до&nbsp;тех пор пока вам не&nbsp;будет переведена вся сумма в&nbsp;полном объёме. Если заказчик из&nbsp;СНГ, и&nbsp;вообще производит впечатление приличного человека, можно пойти на&nbsp;уступки и&nbsp;заранее оговорить, что после демонстрации на&nbsp;своём хостинге он&nbsp;оплачивает 66% стоимости, тогда он&nbsp;будет уверен, что вы&nbsp;перенесёте сайт, а&nbsp;для вас остаток как раз и&nbsp;будет той платой за&nbsp;труды по&nbsp;переносу. Услуги по&nbsp;переносу желательно сразу включать в&nbsp;общую стоимость (и&nbsp;уточнить заказчику что это не&nbsp;5&nbsp;минут обычно, а&nbsp;больше). Хорошей практикой будет полностью оплачивать хостинг сайта (на&nbsp;пару недель), а&nbsp;потом передавать сайт прямо с&nbsp;этим хостингом&nbsp;&mdash; заказчик не&nbsp;будет нервничать, <nobr>что-то</nobr> сломается.</p>
<p>У&nbsp;нас не&nbsp;утопия. Если у&nbsp;заказчика будет большой соблазн кинуть&nbsp;&mdash; он&nbsp;кинет. Настройте себя на&nbsp;эту мысль. Достаточно один (иногда два =)) раза наступить на&nbsp;грабли кидания, чтобы понять, в&nbsp;какой момент передавать свой код. Код, который вы&nbsp;уже написали&nbsp;&mdash; больше всего нужен заказчику, а&nbsp;не&nbsp;вам. Если заказчик не&nbsp;хочет платить&nbsp;&mdash; не&nbsp;отдавайте код. Умный заказчик купит готовый продукт охотнее и&nbsp;дороже, чем будет ждать разработки с&nbsp;нуля. Потому что пара недель простоя его бизнеса стоит гораздо больше, чем ваша пара недель. Он&nbsp;может ругаться, но&nbsp;не&nbsp;может не&nbsp;заплатить. Иначе убытки будут у&nbsp;него, а&nbsp;не&nbsp;у&nbsp;вас. Это основная идея&nbsp;&mdash; запомните её и&nbsp;никаких проблем не&nbsp;будет.</p>
	
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/129/</wfw:commentRss>
	<slash:comments>0</slash:comments>
	<author>Usabili</author>
	<modified>2011-05-11T01-35-00Z</modified>
	  </item><item>
	<title>Zend Guard пролетел...</title>
	<guid isPermaLink="true">http://usabili.ru/news/2011/04/26/zend_guard.html</guid>
	<link>http://usabili.ru/news/2011/04/26/zend_guard.html</link>
	<comments>http://usabili.ru/news/2011/04/26/zend_guard.html#comments</comments>
	<pubDate>Tue, 26 Apr 2011 21:48:57 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>PHP</category>
	<description><![CDATA[<p>С&nbsp;этого года наша компания предоставляет своим клиентам полностью открытый исходный код движков. Задолбались =)</p>
<p>Начну статью издалека, для тех кто не&nbsp;в&nbsp;курсе. Есть такая хитрая заокеанская компания Zend, известная тем что является разработчиком языка <acronym lang="en" title="Hypertext Preprocessor">PHP</acronym>, на&nbsp;основе своего Zend Engine. Сам язык <acronym lang="en" title="Hypertext Preprocessor">PHP</acronym>&nbsp;&mdash; проповедует обратную совместимость, <nobr>т. е.</nobr> код написанный для ранних версий языка запуститься и&nbsp;на&nbsp;более поздних, а&nbsp;версия для более поздней версии языка, <nobr>де-юре</nobr>, запуститься на&nbsp;языке с&nbsp;той&nbsp;же главной версией. Однако сам язык является интерпретируемым, <nobr>т. е.</nobr> не&nbsp;имеет возможности быть скомпилирован в&nbsp;запускаемое приложение. Что приводит, по&nbsp;сути, к&nbsp;тому, что весь код написанный на&nbsp;<acronym lang="en" title="Hypertext Preprocessor">PHP</acronym>&nbsp;&mdash; в&nbsp;<nobr>какой-то</nobr> степени открыт. Конечно компания Zend понимает, что многие компании захотят делать свой, написанный на&nbsp;<acronym lang="en" title="Hypertext Preprocessor">PHP</acronym>, коммерческий продукт закрытым, даже для владельца лицензии. В&nbsp;качестве <nobr>какого-то</nobr> решения, компания использует продукт под названием Zend Guard (и&nbsp;Zend Optimizer на&nbsp;серверной части). Суть продукта в&nbsp;том, что он&nbsp;может обфусцировать ваш скрипт, оптимизировать его и&nbsp;частично переводить в&nbsp;машинный код. Алгоритм обфускации и&nbsp;кодирования отличается у&nbsp;разных версий Zend Guard, но&nbsp;по&nbsp;сути вполне поддаётся декомпилированию. Статьи с&nbsp;примерами можно найти например в&nbsp;журнале Хакер, либо поискать на&nbsp;китайских форумах версию программы Dezender для требуемой версии.</p>
<p>Проблема в&nbsp;том, что обратная совместимость закодированного Guard&rsquo;ом кода, была утрачена в&nbsp;версии <acronym lang="en" title="Hypertext Preprocessor">PHP</acronym> 5.3. Код скомпилированный последними версиями гварда должен быть скомпилирован для абсолютно конкретной версии <acronym lang="en" title="Hypertext Preprocessor">PHP</acronym>. В&nbsp;случае с&nbsp;последней версией 5.3 на&nbsp;сервер необходимо ставить обновлённый Zend Optimizer&nbsp;&mdash; сейчас он&nbsp;называется Zend Loader. Это привело к&nbsp;тому что сейчас в&nbsp;интернете повсеместно распространена версия 5.2, которая прекратила поддерживаться 16 декабря 2010 (<a rel="nofollow" class="external" href="http://www.php.net/archive/2010.php#id2010-12-16-1">пруфлинк</a>). При этом уже спустя небольшое время в&nbsp;ней были найдены уязвимости и&nbsp;компания Zend была таки вынуждена выпустить обновление (<a rel="nofollow" class="external" href="http://www.php.net/archive/2011.php#id2011-01-06-1">пруфлинк</a>). Знакомые владельцы крупных хостингов пока не&nbsp;знают как переносить клиентов на&nbsp;версию 5.3, которая поддерживается в&nbsp;настоящий момент, и&nbsp;выходит уже два года как. Некоторые хостеры ставят её только на&nbsp;новые сервера, только для новых клиентов.</p>
<p>Сам Zend Guard для версии <acronym lang="en" title="Hypertext Preprocessor">PHP</acronym> 5.2 работает довольно нестабильно. Он&nbsp;может от&nbsp;раза к&nbsp;разу по&nbsp;разному сжимать одинаковый код (даже если отключить обфускацию и&nbsp;оптимизирование), который может то&nbsp;читаться сервером, то&nbsp;нет. Один и&nbsp;тот&nbsp;же код может запускаться или нет в&nbsp;зависимости от&nbsp;малой версии <acronym title="Hypertext Preprocessor">PHP</acronym> или даже операционной системы (бывали разные результаты на&nbsp;фёдоре, убунте и&nbsp;freebsd)!</p>
<p>Поэтому, ввиду апгрейда операционной системы на&nbsp;рабочем сервере, было принято решение ставить самый последний <a rel="nofollow" class="external" href="http://files.zend.com/help/Zend-Server/rpm_installation.htm"><acronym lang="en" title="Hypertext Preprocessor">PHP</acronym> из&nbsp;родного репозитория</a> и&nbsp;отказываться от&nbsp;шифрования. Мы&nbsp;даже отказались от&nbsp;штатного скрипта обфускации, стало намного проще жить.</p>
<p>Чего и&nbsp;вам желаем товарищи =).</p>
	
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/128/</wfw:commentRss>
	<slash:comments>2</slash:comments>
	<author>Usabili</author>
	<modified>2011-04-26T17-06-00Z</modified>
	  </item><item>
	<title>Вышел Firefox 4</title>
	<guid isPermaLink="true">http://usabili.ru/news/2011/04/02/firefox_review.html</guid>
	<link>http://usabili.ru/news/2011/04/02/firefox_review.html</link>
	<comments>http://usabili.ru/news/2011/04/02/firefox_review.html#comments</comments>
	<pubDate>Sat, 02 Apr 2011 12:10:06 +0300</pubDate>
	<dc:creator>Usabili</dc:creator>
	
	<category>браузеры</category>
	<category>firefox</category>
	<description><![CDATA[<p>Пару недель назад вышел Файрфокс 4. Народ делал браузер полтора года, поэтому не написать о нём я не могу, Mike Beltzner обидится (шутка).</p>
<h2>Похвала</h2>
<p>Всю похвалу файрфоксу попытаюсь уместить в начале статьи, чтобы не мешать критике, но и чтобы никуто вдруг не подумал что мне файрфокс не нравится. О том, как я люблю файрфокс я и так регулярно пишу в статьях (не сарказм): файрфокс для разработчика незаменим, несмотря на встроенную в Chrome панель разработчика, у файрфокса есть плагины без которых невозможно жить: Web-developer toolbar, Html validator, Adblock, удобный лог js-ошибок, и кстати веб-консоль для разработчиков тоже прикрутили (плагины пока всё равно лучше), гугл кстати предоставляет некоторый функционал консоли Хрома, как расширение к расширению Firebug. Т.е. Файрфокс это очень добротная бронемашина, на которую можно легко поставить как пулемёт, так и межконтинентальные ракеты, не говоря уже о тюнинге в виде поисковых плагинов, скинов, и легкой раскраски вместо них (Personas).</p>
<p>Файрфоксом я пользуюсь уже много лет, потому что когда я наконец поняла что IE совсем плох, были альтернативы только в виде глючной оперы и надстроек над IE, вроде MyIE. Поэтому я пересела на Netscape 7, с него на тяжеловесный mozilla suite, а затем собственно на отколовшийся от него phoenix, который потом переименовали в firebird и наконец в firefox. И до сих пор довольна им. В 4 версии он достаточно хорошо поддерживает CSS3 и HTML5, у очень многих свойств из css-transition убран префикс -moz который использовался ранее, на этом похвалы браузеру хочу закончить. И перейти к основной части статьи</p>
<h2>Критика FF4</h2>
<p>Баги в программах, как известно, можно исправлять бесконечно. В файрфокс 4 разработчики настолько устали от полуторогодовой разработки браузера, что чрезвычайно спешили выпустить уже хоть что-то релизное. Последние пару месяцев руководство мозиллы вообще запретило заниматься какими-то багами кроме имеющих статус Blocking. К релизу не пофиксили даже их - <a href="https://bugzilla.mozilla.org/buglist.cgi?quicksearch=blocking2.0">полторы сотни остались незакрытыми</a>.</p>
<p>Самый показательный баг - регрессия производительности при отображении главной страницы дополнений - about:addons, там в ифрейме грузится внешняя страница с сайта addons.mozilla.org, скроллинг которой ужасно тормозит даже на топовых компьютерах (баги 623615, 626536, 625253). В результате пользователи Firefox 3 сменят окошко удобного, быстрого и понятного менеджера дополнений на страницу, которая, во-первых, тормозит, во-вторых, плохо отображается в скинах версии 3го файрфокс. Да, вся куча скинов оказалась несовместимой с новой версией, а найти что-то хорошее из текущего выбора очень сложно. Тем же кто принудительно использует старые скины придётся терпеть некрасивый addon manager и отсутствие бекграундов под модальными диалогами js (alert, confirm, prompt).</p>
<p>В программе также были сделаны очень неприятные изменения в плане usability о которых я уже писала - это убрана строка состояния, и объединены кнопки stop-reload. Впрочем это можно пофиксить дополнением status-4-evar и перестановкой кнопок на панели навигации.</p>
<h2>Планы развития Firefox</h2>
<p>Планы развития браузера можно почитать на странице <a href="https://wiki.mozilla.org/Firefox/Roadmap">Firefox/Roadmap - MozillaWiki</a>. Главное что мозилла, наконец решила выпускать более частые релизы. Это очень здорово, если конечно не продиктовано стремлением набрать номер побольше, а то IE9, Chrome 10, Opera 11... Просто это позволит быстрее поддержку новых возможностей для сайтостроителей, сейчас мы до сих пор должны писать -moz-border-radius пока все пользователи не перейдут на FF4. Не знаю, насколько это удастся команде разработчиков, но nightly билд уже имеет номер 4.2a. Команда наконец принялась разгребать малозначительные баги, каждый день исправляется по 40-50 штук (на rss исправлений можно читать тут <a rel="nofollow" class="external" href="http://pipes.yahoo.com/pipes/pipe.run?_id=17e1ec1625fca5fde4143a54032b1bc5&amp;_render=rss">Firefox Daily</a>, уже год как читаю). </p>
<p>Будет развиваться проект Electrolisys разделяющий задачи и сущности браузера, начальным этапом был out-of-process-plugin который вынес всё отображение плагинов, таких как flash, из основного процесса браузера. В конечном итоге разработчики стремятся выделить каждую вкладку в отдельный процесс. И заодно улучшить расход за распределением памяти в них. Я&nbsp;думаю это будет здорово, потому что у меня обычно открыто 20-30 вкладок, и почему-то через некоторое время нужды памяти файрфокса увеличиваются и он начинает кушать гигабайт и в попытках умерить аппетит начинает кушать процессорные ресурсы, приходиться его перезапускать. Также это будет положительно влиять на стабильность и безопасность вкладок.</p>
<p>Большая ставка также делается на мобильные устройства и социальность. Ну куда ж без них. </p>
<h2>P.S. </h2>
<p>Вот в целом всё что я хотела сказать о файрфоксе на текущий момент. Обычно друзья и коллеги просят меня написать меня о чём-то конкретном, или провести какое-то исследование. Из более чем сотни моих читателей обычно комментариев единицы. Но это конечно не останавливает меня раскрывать тут профессиональные секреты и делиться опытом =). Написание будущих статей вы можете ускорить, попросив в комментариях написать меня на какую-нибудь конкретную тему. Например это могут быть:</p>
<ul>
    <li>микроформаты</li>
    <li>об использовании шрифтов на страницах</li>
    <li>zend guard</li>
    <li>Mercurial - система контроля версий</li>
    <li>Trac - багтрекинг система</li>
    <li>приоритет css селекторов</li>
</ul>
<p>спасибо что читаете мой блог =)</p>
	
	]]></description>
	<wfw:commentRss>http://usabili.ru/news/comments_rss/127/</wfw:commentRss>
	<slash:comments>2</slash:comments>
	<author>Usabili</author>
	<modified>2011-04-02T07-47-00Z</modified>
	  </item></channel>
</rss>
