<?xml version="1.0" encoding="UTF-8"?><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>Блог ГО</title>
	<atom:link href="https://blgo.ru/blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://blgo.ru/blog</link>
	<description></description>
	<lastBuildDate>Fri, 09 Dec 2016 10:47:53 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.3</generator>
	<item>
		<title>Смена пола и расы одним кликом</title>
		<link>https://blgo.ru/blog/2016/03/12/uts-52/</link>
		<comments>https://blgo.ru/blog/2016/03/12/uts-52/#respond</comments>
		<pubDate>Sat, 12 Mar 2016 19:54:47 +0000</pubDate>
		<dc:creator><![CDATA[vasa_c]]></dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[unicode-table]]></category>
		<category><![CDATA[Переводы]]></category>

		<guid isPermaLink="false">https://blgo.rublog/?p=886</guid>
		<description><![CDATA[Сегодня мы узнаем, как Юникод трудится не только на поприще объединения носителей разных письменностей и языков, но и распространяет идеи толерантности и гендерного равноправия среди смайликов. Вообще, одна из базовых концепций, заявленных при создании Юникода, это простота. То есть, конечно, базовая спецификация содержит около тысячи страниц, плюс три десятка технических приложений. И это без каталога [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Сегодня мы узнаем, как Юникод трудится не только на поприще объединения носителей разных письменностей и языков, но и распространяет идеи толерантности и гендерного равноправия среди смайликов.</p>
<p>Вообще, одна из базовых концепций, заявленных при создании Юникода, это простота. То есть, конечно, базовая спецификация содержит около тысячи страниц, плюс три десятка технических приложений. И это без каталога из сотен тысяч символов со всеми их характеристиками. Но вот сам итоговый текст в юникодовой кодировке, он простой и незамутнённый. Без всяких знаков форматирования, контрольных символов и другого мусора. С ним легко работать и обрабатывать. Ну, если про диакритику не вспоминать. И не задумываться про все возможные реализации UTF. А так всё хорошо.</p>
<p>Потихоньку, Юникод начал продавать душу и простоту ещё давно. То <a href="https://unicode-table.com/ru/blocks/variation-selectors/">селекторы начертания</a> введут. То <a href="https://unicode-table.com/ru/1F1F7/">региональные индикаторы</a> из которых можно лепить коды стран, типа &#171;RU&#187; и &#171;IT&#187;, а айфончик будет их заменять на флаги (как будто миллиона не использованных символов мало было для того, чтобы ввести отдельные флаги).</p>
<p>Но тут подоспели эмоджи. И большинство населения земли стремительно переходит с общения с помощью старых письменностей на общение сугубо с помощью эмоджи. Чтобы не отстать от прогресса, Юникод, так же, становится всё больше не стандартом кодирования различных алфавитов, а стандартом кодирования смайликов и эмоджи. Каким будет светлое будущее, уже сейчас можно представить с помощью черновика стандарта UTS-52.</p>
<p>Все символы-эмоджи в Юникоде описаны по возможности нейтрально. Например, &#171;человек на лыжах&#187;. Но при выводе на экран, выводится конкретный лыжник. Обычно, это белый джентльмен с достатком выше среднего. Что не всем, конечно, может нравится. Первой ласточкой стала возможность менять цвет кожи. Можно было сделать из лыжника афро-американца, афро-азиата или афро-африканца, наконец. Хотя зачем в Африке лыжи?</p>
<p>И вот теперь новый прорыв. Предложен механизм с помощью которого можно будет делать вообще-вообще что угодно. Настраивать свои любимые смайлы, как душа просит. Хотя пока ещё не совсем всё что угодно, на данный момент предложены только модификаторы пола, направления и опять-таки цвета (ну и новый вариант флагов до кучи). То есть можно будет сделать из лыжника белую девушку левых взглядов, а потом поменять её на азиата с правым уклоном. Всё это открывает новые горизонты для реализации себя с помощью написания эсэмэсок.</p>
<p>Некоторые эксперты предсказывают появление модификатора &laquo;копуляция&raquo;, которым можно будет соединять различные символы (например, &laquo;котик с глазами сердечками&raquo; и &laquo;латинская буква L&raquo;), а также выстраивать с его помощью цепочки.</p>
<p>Узнать, как всё это будет из первых рук можно на <a href="https://unicode.org/reports/tr52/">официальном сайте</a>. Либо прочитать <a href="https://unicode-table.com/ru/a/unicode/standard/reports/uts52/">русский перевод</a> на сайте Юникод Тэйбл.</p>
<p>Юникод Тэйбл &mdash; самый лучший Тэйбл об Юникоде в мире!</p>
]]></content:encoded>
			<wfw:commentRss>https://blgo.ru/blog/2016/03/12/uts-52/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Нужен программист, PHP, СПб, от 30 т.р.</title>
		<link>https://blgo.ru/blog/2015/09/07/vacancy-php-prog/</link>
		<comments>https://blgo.ru/blog/2015/09/07/vacancy-php-prog/#respond</comments>
		<pubDate>Mon, 07 Sep 2015 07:24:27 +0000</pubDate>
		<dc:creator><![CDATA[vasa_c]]></dc:creator>
				<category><![CDATA[Вакансии]]></category>
		<category><![CDATA[вакансия]]></category>

		<guid isPermaLink="false">https://blgo.rublog/?p=875</guid>
		<description><![CDATA[Нужен веб-разработчик, от 30 000 р, СПб, Техноложка, СА-дизайн. Нужно знать: &#8212; PHP5 (>5.3 с неймспейсами и всем остальным) &#8212; JavaScript (работать с jQuery и иметь представление о том, как она сама работает) &#8212; MySQL &#8212; HTML и CSS на уровне «внедрить и подправить». Верстать макеты заставлять не будем. &#8212; Unix, хотя бы на уровне [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Нужен веб-разработчик, от 30 000 р, СПб, Техноложка, <a href="https://sadesign.ru/">СА-дизайн</a>.</p>
<p>Нужно знать:</p>
<p>&#8212; PHP5 (>5.3 с неймспейсами и всем остальным)<br />
&#8212; JavaScript (работать с jQuery и иметь представление о том, как она сама работает)<br />
&#8212; MySQL<br />
&#8212; HTML и CSS на уровне «внедрить и подправить». Верстать макеты заставлять не будем.<br />
&#8212; Unix, хотя бы на уровне пользователя.<br />
&#8212; ООП, MVC и т.д. и т.п.</p>
<p>Ключевые слова с которыми придётся столкнуться:</p>
<p>Git, Sphinx, Composer, PSR, phpunit,<br />
jQuery, node.js, ES6, TypeScript, WebPack, Grunt, Gulp</p>
<p>Работа в команде, участие в разработке сайтов.<br />
Примерный уровень сайтов:<br />
<a href="https://unicode-table.com/ru/">unicode-table.com</a><br />
<a href="http://arendasmeni.ru/">arendasmeni.ru</a><br />
<a href="http://hotel-inn.ru/">hotel-inn.ru</a><br />
<a href="http://www.sanitarim.ru">sanitarim.ru</a></p>
<p><a href="https://sadesign.ru/portfolio/">Портфолио</a></p>
]]></content:encoded>
			<wfw:commentRss>https://blgo.ru/blog/2015/09/07/vacancy-php-prog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>axy.define &#8212; бициклет на тему CommonJS</title>
		<link>https://blgo.ru/blog/2015/05/15/axy-define/</link>
		<comments>https://blgo.ru/blog/2015/05/15/axy-define/#respond</comments>
		<pubDate>Fri, 15 May 2015 07:59:06 +0000</pubDate>
		<dc:creator><![CDATA[vasa_c]]></dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[commonjs]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[typescript]]></category>

		<guid isPermaLink="false">https://blgo.rublog/?p=868</guid>
		<description><![CDATA[А тем временем полку бесполезных велосипедов всё пребывает. Я забросил последнее время JavaScript, а он тут развивается семимильными шагами. Так что я решил освежить знания и посмотреть на новые веяния. Для начала взялся разобраться с TypeScript (потому что я типизированный задрот и педант), Node.js (потому что куда без него), а заодно подумать над модульной системой [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>А тем временем полку бесполезных велосипедов всё пребывает.</p>
<p>Я забросил последнее время JavaScript, а он тут развивается семимильными шагами. Так что я решил освежить знания и посмотреть на новые веяния. Для начала взялся разобраться с TypeScript (потому что я типизированный задрот и педант), Node.js (потому что куда без него), а заодно подумать над модульной системой для клиента (потому что 21-й век на дворе).</p>
<p>И чтобы всё это объединить, я написал на TypeScript модульную систему, которая эмулирует окружение ноды в браузере (не полностью, конечно, но немного).</p>
<p>Вот &#8212; <a href="https://github.com/axyjs/axy-define">axy.define</a>.</p>
<p>Имеется некая виртуальная файловая система, в которой в виде файлов лежат модули и любые другие данные, с ними можно работать с помощью модуля fs. require() ищет модули внутри этой &#171;ФС&#187;. Полный алгоритм ноды: относительные пути, поиск по node_modules + системные каталоги, подстановка расширений, индексные файлы, package.json&#8230;</p>
<p>Можно написать аяксовый загрузчик и модули с данными будут прозрачно подсасываться с сервера.</p>
<p>Частично реализованы некоторые элементы окружения, global, process, модули ядра, такие как fs, path.</p>
<h3>Пример</h3>
<p><a href="http://axyjs.github.io/axy-define-examples/asm/">Ссылка</a></p>
<p>Тестовое приложение тупо меняет цвет страницы на серый.</p>
<p>Для сборки проекта есть утилита в виде npm модуля, которая запускается из командной строки с нужными опциями.<br />
Рекурсивно и асинхронно обходит каталог с исходниками, заключает модули во врапперы, записывает всё в итоговый каталог.</p>
<p>В примере тестовый проект собран вместе с node_modules в которой лежит сама утилита сборки.<br />
В браузере же:</p>
<ol>
<li>Из &#171;командной строки&#187; опять запускается сборка проекта уже в виртуальной ФС.</li>
<li>Собранный проект запускает отдельную песочницу.</li>
<li>В песочнице опять проходит сборка с нуля.</li>
<li>Собранный повторно проект уже запускается и меняет цвет страницы.</li>
<li>Стандартный поток вывода перенаправлен из консоли в дивы.</li>
</ol>
<p>Такой вот треш.</p>
]]></content:encoded>
			<wfw:commentRss>https://blgo.ru/blog/2015/05/15/axy-define/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ещё библиотечки</title>
		<link>https://blgo.ru/blog/2015/04/02/php-libs-march/</link>
		<comments>https://blgo.ru/blog/2015/04/02/php-libs-march/#respond</comments>
		<pubDate>Thu, 02 Apr 2015 11:36:12 +0000</pubDate>
		<dc:creator><![CDATA[vasa_c]]></dc:creator>
				<category><![CDATA[Библиотеки]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">https://blgo.rublog/?p=864</guid>
		<description><![CDATA[И ещё вдогонку библиотечек на PHP. axy/fs-paths: пути в ФС Работа с путями к файлам. Разбор, нормализация, вычисление относительных и всё такое прочее. Разные типы: Unix, Windows, UNC, даже URL&#8217;ы. Любителям статики &#8212; статика, любителям объектов &#8212; объекты :) Допустим, мы спарсили страничку по адресу http://example.com/news/view/?id=10, а в ней ссылки. Как узнать, куда они ведут? [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>И ещё вдогонку библиотечек на PHP.</p>
<h2><a href="https://github.com/axypro/fs-paths">axy/fs-paths</a>: пути в ФС</h2>
<p>Работа с путями к файлам. Разбор, нормализация, вычисление относительных и всё такое прочее.<br />
Разные типы: Unix, Windows, UNC, даже URL&#8217;ы.<br />
Любителям статики &#8212; статика, любителям объектов &#8212; объекты :)</p>
<p>Допустим, мы спарсили страничку по адресу <code>http://example.com/news/view/?id=10</code>, а в ней ссылки.<br />
Как узнать, куда они ведут?</p>
<pre lang="php">
use axy\fs\paths\Paths;

$base = 'http://example.com/news/view/?id=10';

$links = [
    './../archive/?page=5#10',
    '/profile/',
    'http://site.loc/',
];

$urls = Paths::getAdapter(Paths::TYPE_URL);

foreach ($links as $link) {
    echo $link.' --> '.$urls->resolve($base, $link).PHP_EOL;
}
</pre>
<p>Результат:</p>
<pre lang="">
./../archive/?page=5#10 --> http://example.com/news/archive/?page=5#10
/profile/ --> http://example.com/profile/
http://site.loc/ --> http://site.loc/
</pre>
<h2><a href="https://github.com/axypro/callbacks">axy/callbacks</a>: колбэки</h2>
<p>В дополнение к стандартному <a href="http://php.net/manual/en/language.types.callable.php">callable</a> связывание аргументов:</p>
<pre lang="php">
$callback = new Callback(['obj', 'sum'], [1, 2]);
$callback(3, 4); // $obj->sum(1, 2, 3, 4);
</pre>
<p>Или так:</p>
<pre lang="php">
$callback = ['obj', 'sum', [1, 2]];
// ...
Callback::call($callback); // $obj->sum(1, 2);
</pre>
<p>И связывание контекста заодно:</p>
<pre lang="php">
class MyClass
{
    public function getEventHandler()
    {
        return new Callback([$this, 'onEvent'], ['click'], true);
    }

    private function onEvent($event)
    {
        echo 'Event '.$event.'!';
    }
}

$obj = new MyClass();
$handler = $obj->getEventHandler();

// click
$handler(); // "Event click!". Private method was called
</pre>
<h2><a href="https://github.com/axypro/magic">axy/magic</a>: магия</h2>
<p>Работа с магическими свойствами: отложенное создание магических свойств, надстройки над массивами, read-only и всё такое прочее.<br />
Всё в виде трейтов, комбинируется, как угодно.</p>
<h2><a href="https://github.com/axypro/magic">axy/envnorm</a>: нормализация окружения</h2>
<p>При запуске приложения, обычно, нужно поколдовать с глобальными настройками и окружением:</p>
<p>&#8212; Перехватить все ошибки и предупреждения и выдавать вместо них нормальное исключение.<br />
&#8212; Перехватить исключения на верхнем уровне.<br />
&#8212; Выводить ошибки при разработке и отключить на продакшене.<br />
&#8212; Настроить недонастроенное окружение: правильную кодировку, таймзону путь к сендмайлу и т.п.</p>
<p>Просто пишем нужный конфиг и выполняем вначале:</p>
<pre lang="php">
use axy\envnorm\Normalizer;

$config = [
    'errors' => [
        'exceptionHandler' => 'myExceptionHandler',
    ],
    'datetime' => [
        'timezone' => 'Europe/Moscow',
    ],
];

Normalizer::createInstance($config)->normalize();
</pre>
<p>Всё в composer&#8217;е, на гитхабе и с документацией на подобии инглиша.</p>
]]></content:encoded>
			<wfw:commentRss>https://blgo.ru/blog/2015/04/02/php-libs-march/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Source map и PHP</title>
		<link>https://blgo.ru/blog/2015/03/17/php-source-map/</link>
		<comments>https://blgo.ru/blog/2015/03/17/php-source-map/#comments</comments>
		<pubDate>Tue, 17 Mar 2015 12:11:44 +0000</pubDate>
		<dc:creator><![CDATA[vasa_c]]></dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[axy]]></category>
		<category><![CDATA[sourcemap]]></category>

		<guid isPermaLink="false">https://blgo.rublog/?p=858</guid>
		<description><![CDATA[Написал библиотечку для работы с source map из нашего любимого похапе. Если кто не знает что такое source map Вот, допустим, у нас есть сайт, а у него много JavaScript-файликов. Ну и при деплое, мы их все, как порядочные люди, сливаем вместе и сжимаем каким-нибудь минификатором. И наши пользователи не грузят теперь себе много мелких [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Написал <a href="https://github.com/axypro/sourcemap">библиотечку</a> для работы с source map из нашего любимого похапе.</p>
<h3>Если кто не знает что такое source map</h3>
<p>Вот, допустим, у нас есть сайт, а у него много JavaScript-файликов. Ну и при деплое, мы их все, как порядочные люди, сливаем вместе и сжимаем каким-нибудь минификатором. И наши пользователи не грузят теперь себе много мелких файликов со всеми комментариями и отступами, а загружают парочку сжатых.</p>
<p>Единственная проблема, что в сжатом файле теперь у нас какая-то херь, которую совершенно невозможно дебажить. И сообщения об ошибках ведут теперь совершенно непонятно куда.</p>
<p>Однако, все современные минификаторы могут при сжатии ещё создавать файл source map.<br />
В нём <a href="https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1">хитрым образом</a> закодировано соответствие позиций в сгенерированном файле и в исходных.<br />
В конце сжатого файла можно дописать ссылку на карту:</p>
<pre>
//# sourceMappingURL=script.min.js.map
</pre>
<p>И происходит волшебство. Грузится сжатый файл, а в отладчике браузера показываются исходные. Более того, так как в map-файле содержится только соответствие строк и столбцов между файлами, то можно спокойно дебажить TypeScript или какой-нибудь там Coffee прямо в браузере:</p>
<div><img src="https://img-fotki.yandex.ru/get/3014/154712453.1/0_146d0b_c9a367a_orig" alt="" /></div>
<p>Ну, то есть вообще, что угодно:</p>
<div><img src="https://img-fotki.yandex.ru/get/17917/154712453.1/0_146d0c_beefdab5_orig" alt="" /></div>
<p><span id="more-858"></span></p>
<h3>И, допустим, у нас такой кейс</h3>
<p>Например, мы, как те ещё извращенцы пишем на TypeScript и при деплое делаем следующее:</p>
<ol>
<li>Компилируем ts &rarr; js</li>
<li>Вырезаем лишнюю хрень из js, которую ts-компилятор туда любит пихать.</li>
<li>Обёртываем каждый файл в свою обёртку для commonJS</li>
<li>Сливаем свои маленькие модули в несколько больших файлов</li>
<li>Минимизируем их</li>
</ol>
<p>И у нас возникает такая эротическая фантазия, чтобы после всего этого ещё и в отладчике у нас бы показывался исходный TS-код.</p>
<p>Минификатор нам конечно map-файл создаст, но он будет указывать на промежуточные файлы с предпоследнего этапа.<br />
Какой-нибудь Google Closure Compiler может быть настолько крутым, что половину наших пунктов за нас сделает и ещё промежуточные map-файлы сможет слить в один.<br />
Но всё равно за всеми нашими фантазиями ему не угнаться, а значит придётся всё делать вручную.</p>
<h3>Библиотечка</h3>
<p>Взять можно через композер: <a href="https://packagist.org/packages/axy/sourcemap">axy/sourcemap</a>.<br />
Документация <a href="https://github.com/axypro/sourcemap/blob/master/README.md">тут</a>.</p>
<p>Создание новых карт, загрузка существующих, редактирование, удаление/вставка кусков, поиск по фильтрам и всякая другая чепуха, всё включено.</p>
<p>Сливаем js-файлы, параллельно сливаем их карты:</p>
<pre lang="php">
$map = new SourceMap();

$map->concat('one.js.map', 0); // one.js в начале итогового js-файла
$map->concat('two.js.map', 25); // two.js вставлен с 25-й строки
$map->concat('three.js.map', 100);
</pre>
<p>Вставляем в начало js-файла пару строк, изменяем его карту:</p>
<pre lang="php">
$map = SourceMap::loadFromFile('out.js.map');
$map->insertBlock(0, 0, 2, 0); // все позиции сдвинутся вниз
$map->save();
</pre>
<p>Изменяли файлы в несколько этапов и получили несколько последовательных карт. Сливаем их в одну:</p>
<pre lang="php">
$map = SourceMap::loadFromFile('out.js.map');
$map->merge('stage3.js.map');
$map->merge('stage2.js.map');
$map->merge('stage1.js.map');
$map->save();
</pre>
<p>Всё в <a href="https://github.com/axypro/sourcemap/blob/master/README.md">доке</a> описано.</p>
]]></content:encoded>
			<wfw:commentRss>https://blgo.ru/blog/2015/03/17/php-source-map/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>JavaScript, суррогатные пары и фекалии</title>
		<link>https://blgo.ru/blog/2015/02/08/javascript-surrogate/</link>
		<comments>https://blgo.ru/blog/2015/02/08/javascript-surrogate/#comments</comments>
		<pubDate>Sun, 08 Feb 2015 15:06:06 +0000</pubDate>
		<dc:creator><![CDATA[vasa_c]]></dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">https://blgo.rublog/?p=851</guid>
		<description><![CDATA[Если кратко: JavaScript не поддерживает суррогатные пары. Что в общем и правильно, так как в большинстве случаев это не нужно, а только лишние расходы. Однако, в меньшинстве случаев из-за этого придётся повозиться. Теперь рассмотрим подробнее, что означает этот набор слов. UTF-16 vs UCS-2 Как, наверняка, знают все здесь присутствующие, строки в компьютерах представляются, как последовательность [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Если кратко: JavaScript не поддерживает суррогатные пары. Что в общем и правильно, так как в большинстве случаев это не нужно, а только лишние расходы. Однако, в меньшинстве случаев из-за этого придётся повозиться.</p>
<p>Теперь рассмотрим подробнее, что означает этот набор слов.</p>
<h3>UTF-16 vs UCS-2</h3>
<p>Как, наверняка, знают все здесь присутствующие, строки в компьютерах представляются, как последовательность байтиков. А каким образом эти байтики соответствуют буковкам, это определяет кодировка.</p>
<p>Старые добрые кодировки, вроде Windows-1251 были однобайтными. Одному символу &#8212; один байт. Работать с ними было одно удовольствие. Хочешь узнать длину строки (количество символов): это просто количество байт. Нужен 5-й символ: просто нужен пятый байт от начала строки. Единственный минус: в нашем многополярном мире 256 различных символов, это слишком мало. Особенно для китайцев с их тысячами иероглифов.</p>
<p>Поэтому теперь мы все любим Unicode. В юникоде много разных кодировок на все случаи жизни. Вот, например, UTF-8: в нём можно закодировать любой Unicode-символ хитрой переменного размера последовательностью байт. При этом базовая ASCII в нём остаётся такого же вида, как и в старых кодировках. Можно читать английские тексты не думая о кодировках, исходники программ и HTML/XML файлы сохраняют свою структуру, а наиболее популярные символы занимают меньше места, чем всякие иероглифы, что тоже приятно.</p>
<p>Неудобно его только обрабатывать. Чтобы узнать длину строки или найти N-й символ, нужно проходить по всем байтам сначала и производить над каждым разные вычисления. Что напрягает. Поэтому в памяти строки лучше хранить в какой-нибудь кодировке фиксированного размера.<br />
<span id="more-851"></span><br />
Например, в UTF-32 (или UCS-4, что одно и тоже). Четыре байта на символ. Нужна длина: поделите количество байт на 4. Нужен N-й символ &#8212; умножьте на 4. Благодать. Единственный минус, тот же Firefox спокойно выедает гигабайт памяти. А если он ещё строки будет хранить по 4 байта на каждый символ, то вообще п.ц.</p>
<p>Поэтому лучше использовать UTF-16 (или UCS-2, что поначалу было одно и тоже). Те же радости фиксированной ширины и при этом вдвое меньше занятого места. Однако, количество различных символов сокращается до 2^16. Сначала это никого не волновало, ибо, как говорили древние: &#171;64К хватит всем&#187;. Но в новых стандартах Unicode начали появляться такие обязательные к использованию символы, как <a href="https://unicode-table.com/ru/1F435/">мордочка обезьяны</a>, <a href="https://unicode-table.com/ru/1F63B/">улыбающийся кот с глазами сердечками</a> и <a href="https://unicode-table.com/ru/1F4A9/">воняющий кусок говна</a>.</p>
<p>Разработчики не устояли и придумали хак для того, чтобы с помощью UTF-16 можно было кодировать хотя бы миллион символов. Суррогатные пары. Есть &#171;High Surrogates&#187; (диапазон кодов D800—DB7F) и есть &#171;Low Surrogates&#187; (DC00—DFFF). Вместе верхний и нижний суррогат составляют суррогатную пару, которая кодирует символ выше базовой плоскости (дальше первых 64K). Итого такой символ занимает 4 байта. Например, вышеприведённый символ дымящегося &#171;чего надо&#187; представляется двумя суррогатами <code>D83D</code> и <code>DCA9</code>, которые путём хитрых манипуляций приводятся к итоговому Unicode-коду <code>1F4A9</code>.</p>
<p>С одной стороны в UTF-16 мы получили возможность использовать символ говна, с другой мы вернулись к переменной длине символа. И нам опять следует на каждый чих проходить всю строку сначала. В UCS-2 же суррогатные пары никак не обрабатываются и <code>D8:3D:DC:A9</code> в нём будет просто двумя ничего не значащими символами.</p>
<h3>В JavaScript</h3>
<p><a href="http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf">Стандарт ECMAScript</a> по поводу того, какую кодировку следует использовать, как всегда темнит. В п.2. он заявляет &#171;используйте UCS-2 или UTF-16, как вам нравится, хотя лучше UTF-16&#187;, а в 4.3.16 начинает что-то рассказывать про 16-битный integer, завершая своим любимым &#171;стандарт не накладывает ограничений&#187;. Как обычно &#8212; делайте вы что хотите.</p>
<p>Переходим к делу. Мы захотели раскрутить Юникод на полную катушку и решили использовать символ фекалий в квадратных скобочках в своём нике на форуме:</p>
<p><img src="https://img-fotki.yandex.ru/get/16146/154712453.1/0_140118_2b5ec26_orig" alt="" /></p>
<p>В HTML это выглядит, например, так:</p>
<pre lang="html">
Автор: <div id="nick">[&#128169;]</div>
</pre>
<p>Содержимое тега <code>div#nick</code> в честном UTF-16 будет представлено в виде последовательности байтов <code>00:5B:D8:3D:DC:A9:00:5D</code>. При разборе этого мы берём первое 16-битное слово: <code>005B</code>. Это открывающая скобочка, обычный символ. Дальше &#8212; <code>D83D</code>, это начало суррогатной пары, дальше должна идти часть из &#171;Low Surrogates&#187; и она там есть: <code>DCA9</code>. Значит склеиваем в один символ, преобразуя в код <code>1F4A9</code>. Итого у нас строка из трёх символов: <code>5B 1F4A9 5D</code>.</p>
<p>Если же мы разбираем эти байты с точки зрения UCS-2, то у нас просто набор 2-байтных слов: <code>005B D83D DCA9 005D</code>.</p>
<p>Попробуем:</p>
<pre lang="javascript">
var nick = document.getElementById("nick").firstChild.nodeValue,
    len = nick.length,
    i;
console.log("length = " + len);
for (i = 0; i < len; i += 1) {
    console.log(nick.charCodeAt(i).toString(16));
}
</pre>
<p>Результат:</p>
<pre>
length = 4
5b
d83d
dca9
5d
</pre>
<p>То есть из DOM нам пришёл UTF-16, но JS работает с ним, как с UCS-2. Длина строки у нас вместо 3 стала 4, а если мы захотим получить третий символ, то вместо "]" мы получим хз что (DCA9).</p>
<p>Точно также если мы захотим вывести улыбающегося кота, зная его код (1F63B):</p>
<pre lang="javascript">
var cat = String.fromCharCode(0x1F63B);

document.getElementById("nick").innerHTML = cat;

console.log(cat.charCodeAt(0).toString(16)); // f63b
</pre>
<p>Хрена с два. <code>fromCharCode()</code> использует только младшие 16 бит.</p>
<h3>Попаболь</h3>
<p>Поэтому, если у вас есть вероятность попадания в ваши строки дымящихся кусков говна и вы хотите их корректно обрабатывать, то вам придётся самим реализовывать поддержку UTF-16 поверх UCS-2.</p>
<p><a href="https://github.com/unicode-table/ut-js-common/blob/master/ut-common.js#L52">Таким, например, макаром</a></p>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt">Или таким</a></p>
<p>На сегодня всё.</p>
]]></content:encoded>
			<wfw:commentRss>https://blgo.ru/blog/2015/02/08/javascript-surrogate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Регистрация, пароли и одно место (ч.I½)</title>
		<link>https://blgo.ru/blog/2014/07/24/regform-112/</link>
		<comments>https://blgo.ru/blog/2014/07/24/regform-112/#comments</comments>
		<pubDate>Thu, 24 Jul 2014 07:54:12 +0000</pubDate>
		<dc:creator><![CDATA[vasa_c]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">https://blgo.rublog/?p=841</guid>
		<description><![CDATA[А вот гражданин Proton в камментах к предыдущему опусу не повёлся на мой вброс и даже привёл конструктивную критику. Попробую что-нибудь ответить. 1. Пароль на почту &#8212; не секьюрно. Ну, правил на все случаи нет, всегда головой нужно думать. Если важна безопасность, можно и не высылать на почту, можно и вводить мышкой на виртуальной клавиатуре. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>А вот гражданин Proton в <a href="https://blgo.ru/blog/2014/07/18/regform/#comment-3042">камментах к предыдущему опусу</a> не повёлся на мой вброс и даже привёл конструктивную критику. Попробую что-нибудь ответить.</p>
<p>1. Пароль на почту &#8212; не секьюрно.</p>
<p>Ну, правил на все случаи нет, всегда головой нужно думать. Если важна безопасность, можно и не высылать на почту, можно и вводить мышкой на виртуальной клавиатуре. Плюс https, двухфакторная авторизация, usb-токен и бумажное письмо с паролем почтой России. Хотя последнее я бы не рекомендовал.</p>
<p>У меня таких сайта четыре, где я готов поеб.цо ради безопасности. Ещё есть полтора десятка сайтов, утеря доступа к которым принесла бы мне некий дискомфорт.</p>
<p>И ещё есть сотня разных форумов, рассылок, coub&#8217;ов, весёлых картинок, эксклюзивных фоточек котеков и остальной порнографии. Когда у меня сопрут почту, я больше буду волноваться за саму почту, чем за этот трэш.</p>
<p>Когда на подобных сайтах меня заставляют лишний раз думать, я обычно ухожу. Я не люблю думать лишний раз.</p>
<p>Итого: если у вас банк, вы можете требовать от клиентов каких-то действий ради их же безопастности.<br />
А если у вас фоточки котиков и вы хотите удержать случайного посетителя, чтобы он зарегистрировался и написал в камментах &#171;ми-ми-ми&#187;, то будьте проще. И в первую очередь подумайте, зачем вам вообще эта регистрация сдалась.</p>
<p>2. &laquo;один клик по полю с паролем и lastpass генерит мне уникальный пароль необходимой мне сложности и длины и заполняет оба поля&raquo;</p>
<p>Да, не надо забывать и о более прошаренных боярах. Значит просто вкладочка &laquo;ввесть пароль самому&raquo; и вкладочка &laquo;создать пароль и прислать&raquo;.</p>
]]></content:encoded>
			<wfw:commentRss>https://blgo.ru/blog/2014/07/24/regform-112/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Регистрация, пароли и одно место (ч.I)</title>
		<link>https://blgo.ru/blog/2014/07/18/regform/</link>
		<comments>https://blgo.ru/blog/2014/07/18/regform/#comments</comments>
		<pubDate>Fri, 18 Jul 2014 13:49:39 +0000</pubDate>
		<dc:creator><![CDATA[vasa_c]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">https://blgo.rublog/?p=838</guid>
		<description><![CDATA[Ну, или вот, скажем, регистрация и авторизация. Что может быть проще. Однако, почему-то все через задницу делают. Вот, например, форма: Значительное количество граждан, наконец, поняло, что если есть мыло, то отдельный &#171;логин&#187; в большинстве случаев не требуется. Не все, но значительное количество. Это радует. Что огорчает: 1. Я должен придумать себе какой-то пароль. Уникальный и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ну, или вот, скажем, регистрация и авторизация. Что может быть проще. Однако, почему-то все через задницу делают.</p>
<p>Вот, например, форма:</p>
<div><img src="https://img-fotki.yandex.ru/get/9650/154712453.0/0_fa0ad_7a65ada6_orig.png" alt="" /></div>
<p>Значительное количество граждан, наконец, поняло, что если есть мыло, то отдельный &laquo;логин&raquo; в большинстве случаев не требуется. Не все, но значительное количество. Это радует.</p>
<p>Что огорчает:</p>
<p>1. Я должен придумать себе какой-то пароль. Уникальный и сложный. А я не люблю ничего придумывать и мозги напрягать, я лучше уйду с сайта. И потом эти люди удивляются, что половина паролей &#8212; &laquo;123456&raquo;.</p>
<p>2. Я должен его куда-то записать. На бумажку или в файлик. Так чтобы всегда его найти. Куда мне его записать? Я опять должен насиловать себе мозг. Ну его в баню.</p>
<p>3. Я должен идти к себе на почту и жать на какую-то ссылку.</p>
<h2>Делаем чуть лучше</h2>
<div><img src="https://img-fotki.yandex.ru/get/9650/154712453.0/0_fa0ae_42a8df5e_orig.png" alt="" /></div>
<p>Просто ввожу своё мыло и мне на него приходит:</p>
<p>&laquo;Здравствуйте, Вася! Мы рады приветствовать вас на сайте &laquo;Весёлые Шлюшки&raquo;.<br />
Ваши данные для входа:<br />
e-mail: my@email.loc,<br />
пароль: D32nD38Neu23<br />
Вы всегда можете сменить пароль на свой любимый 123456 в личном кабинете.&raquo;</p>
<p>1. Я ничего не придумываю, за меня сами всё придумают. И придумают сложный и уникальный пароль.</p>
<p>2. Он у меня в почте, мне не надо думать где его хранить. Я с любого компа захожу в свой джымаил и нахожу свой пароль.</p>
<p>3. Я его просто запомню в браузере и забуду.</p>
<p>4. Если я авторизовался на сайте по паролю, который мне прислали на почту, то это уже значит, что почта моя. Не нужно никаких ссылок для активации.</p>
<h2>Напоминание пароля</h2>
<p>Точно также. Не ссылку на ввод нового пароля, который нужно опять запоминать. А &laquo;вот ваш новый пароль &#8212; F348rNh64, а вот ссылка на его активацию, если это не вы запросили, игнорируйте&raquo;. Мой новый пароль опять у меня на почте, в любой момент я могу его найти.</p>
<p>Продолжим при следующей встрече.</p>
]]></content:encoded>
			<wfw:commentRss>https://blgo.ru/blog/2014/07/18/regform/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Symfony &#8212; фигимфони</title>
		<link>https://blgo.ru/blog/2014/03/20/symfony-java/</link>
		<comments>https://blgo.ru/blog/2014/03/20/symfony-java/#comments</comments>
		<pubDate>Thu, 20 Mar 2014 12:01:23 +0000</pubDate>
		<dc:creator><![CDATA[vasa_c]]></dc:creator>
				<category><![CDATA[Гон]]></category>
		<category><![CDATA[брюзжание]]></category>

		<guid isPermaLink="false">https://blgo.rublog/?p=832</guid>
		<description><![CDATA[Продолжаю излагать своё глупое и дерзкое имхо. На сей раз речь пойдёт о деяниях богоравного Фабьена, да живёт он вечно. Наш любимый PHP последнее время развивается семимильными шагами. И, хотя от этого развития по-прежнему веет обычным пыховским распиздяйством, но всё равно, даже снобы питонисты признают, что &#171;оно наконец-то становится похоже на язык&#187;. И фреймворки тоже [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Продолжаю излагать своё глупое и дерзкое имхо. На сей раз речь пойдёт о деяниях богоравного Фабьена, да живёт он вечно.</p>
<p>Наш любимый PHP последнее время развивается семимильными шагами. И, хотя от этого развития по-прежнему веет обычным пыховским распиздяйством, но всё равно, даже снобы питонисты признают, что &#171;оно наконец-то становится похоже на язык&#187;.</p>
<p>И фреймворки тоже подтягиваются. Прошло время php-нюков и жумл. Теперь php-человек использующий Symfony ощущает себя не говнокодером, но Программистом. Наконец-то, на php-форумах начали появляться фразочки типа &laquo;dependency injection&raquo;, &laquo;service container&raquo; и другая чертовщина. Наконец-то, на php начали писать расширяемый, повторно используемый и тестируемый код. Symfony &#8212; рулит!</p>
<p>Но, воспаде, господа, это же Java! Это же не PHP ни разу.<br />
Ява, конечно, это прекрасный и достойный образец для подражания. Но может нужно знать меру?</p>
<p>Несомненно, Symfony сейчас, это самое продвинутое, что есть в мире Похапе. Все остальные решения сосут у неё по полной. Но ведь и она сама точно также сосёт у Явы. Потому что, это Ява, написанная на Похапе.</p>
<p>Собственно, к чему это. Вот есть, допустим, человек, которому надоело говнокодить на пыхе. Его тянет к трёхэтажным паттернам. Его манят аннотации и огромные xml-конфиги. Он хочет чтобы логика была размазана ровным слоем по десятку пакетов. Чтобы всё наследовалось и расширялось. Он готов потратить немалое количество своего времени на изучение Symfony и связанной с ней инфраструктуры.</p>
<p>Может ему лучше потратить это время на изучение Java и её инфраструктуры? Мне кажется толку будет больше.</p>
]]></content:encoded>
			<wfw:commentRss>https://blgo.ru/blog/2014/03/20/symfony-java/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Таблица символов Юникода и Зигмунд Фрейд</title>
		<link>https://blgo.ru/blog/2014/02/20/ut-freud/</link>
		<comments>https://blgo.ru/blog/2014/02/20/ut-freud/#comments</comments>
		<pubDate>Thu, 20 Feb 2014 09:18:35 +0000</pubDate>
		<dc:creator><![CDATA[vasa_c]]></dc:creator>
				<category><![CDATA[Гон]]></category>
		<category><![CDATA[unicode-table]]></category>

		<guid isPermaLink="false">https://blgo.rublog/?p=824</guid>
		<description><![CDATA[Одна из новых фич сайта Unicode Table: возможность отредактировать название символа. Если вам не понравилось то, как мы перевели название, просто щелкните по нему и введите то, которое, как вам кажется, является правильным: Понятно, что хотя мы вам, несомненно, доверяем, название не изменится сразу же, а отправится к нам на проверку. Приходящие к нам исправления, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Одна из новых фич сайта <a href="https://unicode-table.com/ru/">Unicode Table</a>: возможность отредактировать название символа.</p>
<p>Если вам не понравилось то, как мы перевели название, просто щелкните по нему и введите то, которое, как вам кажется, является правильным:</p>
<div><img src="https://img-fotki.yandex.ru/get/9742/154712453.0/0_e3c48_57611fda_XL.png" alt="" /></div>
<p>Понятно, что хотя мы вам, несомненно, доверяем, название не изменится сразу же, а отправится к нам на проверку.</p>
<p>Приходящие к нам исправления, как и обычно, делятся на две группы:</p>
<p>1. Полезные.<br />
2. Херня.</p>
<p>Как вы понимаете, в этой статье мы будем рассматривать вторую группу, как самую интересную.<br />
<span id="more-824"></span></p>
<p>Большая часть исправлений, как и следовало ожидать, относится к группе &laquo;х.й&raquo;, &laquo;п.зда&raquo; и &laquo;Дж.гурда&raquo;.<br />
Ну и всё остальное от &laquo;fwenqebrwereer&raquo; до проявлений совершенной уже клиники.</p>
<p>Но самая интересная и неожиданная следующая группа. Вот примеры:</p>
<pre>
2464 <a href="https://unicode-table.com/ru/2464/">&#9316;</a>: Цифра <b>пять</b> в круге &rarr; Цифра <b>шесть</b> в круге
2705 <a href="https://unicode-table.com/ru/2705/">&#9989;</a>: Жирная <b>незакрашенная</b> отметка галочка &rarr; Жирная <b>закрашенная</b> отметка галочка
00B2 <a href="https://unicode-table.com/ru/00B2/">&#178;</a>: <b>Верхний индекс</b> 2 &rarr; <b>Нижний</b> индекс 2
00BF <a href="https://unicode-table.com/ru/00BF/">&#191;</a>: Перевернутый <b>вопросительный</b> знак &rarr; Перевернутый <b>восклицательный</b> знак
00B3 <a href="https://unicode-table.com/ru/00B3/">&#179;</a>: Верхний индекс <b>3</b> &rarr; Верхний индекс <b>4</b>
02FF <a href="https://unicode-table.com/ru/02FF/">&#767;</a>: Модификатор буквы <b>нижняя левая</b> стрелка &rarr; Модификатор буквы <b>средняя правая</b> стрелка
</pre>
<p>Кто-то тратит время своей жизни с тем, чтобы не просто написать &laquo;хуй&raquo;, а исправляя пять на шесть и верх на низ.<br />
Причём это совершенно разные люди с различных IP.</p>
<p>Не отстают и англоязычные:</p>
<pre>
2799 <a href="https://unicode-table.com/en/2799/">&#10137;</a> Heavy <b>rightwards</b> arrow &rarr; Heavy <b>leftwards</b> arrow
254C <a href="https://unicode-table.com/en/254C/">&#9548;</a> Box drawings light double dash <b>horizontal</b> &rarr; Box drawings light double dash <b>vertical</b>
1E24 <a href="https://unicode-table.com/en/1E24/">&#7716;</a> Latin capital letter <b>h</b> with dot below &rarr; Latin capital letter <b>t</b> with dot below
</pre>
<p>Да что там, англоязычные. Угадайте не пользуясь гуглотранслейтом, что здесь написано:</p>
<pre>
2086 <a href="https://unicode-table.com/cn/2086/">&#8326;</a> 下标六 &rarr; 下标五
</pre>
<p>Хотелось бы узнать у знатоков психологии и психиатрии, что это за тик такой.</p>
<p>Дедушка Фрейд, наверное бы, определил, что пациентов в детстве напугали большим пинусом.</p>
<p>P.S. Не забываем <a href="http://www.ratingruneta.ru/awards_vote/?site_id=147">голосовать за нас</a> на &laquo;рейтинге рунета&raquo;. </p>
]]></content:encoded>
			<wfw:commentRss>https://blgo.ru/blog/2014/02/20/ut-freud/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
