Кодировка JSON

Я всегда полагал, что кодировка данных в формате JSON («джейсон») должна быть ЮТФ-8. Оказывается в стандарте указано только, что она должна быть Юникодом. Более того, в стандарте указаны способы определения разных типов кодировок.

Так как первые два символа данных в формате «джейсон» всегда будут в первой половине таблицы ASCII (в самом деле, как не крути, первый символ — «{» или «[», а далее кавычка, буква «f» («false»), «n» («null») или «t» («true») или цифра), то легко угадать в какой именно кодировке встретился Юникод:
           00 00 00 xx  UTF-32BE
           00 xx 00 xx  UTF-16BE
           xx 00 00 00  UTF-32LE
           xx 00 xx 00  UTF-16LE
           xx xx xx xx  UTF-8
Как видите каких-либо маркеров для ЮТФ-8 не выделено, то есть во всех остальных случаях считается, что кодировка ЮТФ-8. Я посмотрел встроенные парсеры ПХП и Пайтона, они ни с какими другими кодировками Юникода, помимо ЮТФ-8, по всей видимости, не работают, то есть нарушают стандарт.
Комментировать
25 октября 2014 21:13

Комментарии в формате JSON

Наткнулся случайно на ссылку, где автора очень изящно решает проблему комментариев в формате «джейсон». Это лучшее решение, которое я только видел (обычно либо выделяют специальный ключ, либо расширяют формат). Только поглядите:
{
  "api_host" : "The hostname of your API server. You may also specify the port.",
  "api_host" : "hodorhodor.com",

  "retry_interval" : "The interval in seconds between retrying failed API calls",
  "retry_interval" : 10,

  "auth_token" : "The authentication token. It is available in your developer dashboard under 'Settings'",
  "auth_token" : "5ad0eb93697215bc0d48a7b69aa6fb8b",

  "favorite_numbers": "An array containing my all-time favorite numbers",
  "favorite_numbers": [19, 13, 53]
}
Он полностью синтаксически верен и разбирается правильным образом во всех языках, по всей видимости.
13 комментариев
24 октября 2014 16:53

Импортозамещение слов

В санкциях, о которых не говорит сейчас только ленивый, я вижу и плюсы, а именно — импортозамещение программного обеспечения. Поверхностная точка зрения на этот вопрос — обычный распил денег, хотя оправданность тут ровно такая же как у сети «ГЛОНАСС». Так уж случилось, что мы живём внутри государств и они время от времени воюют. Использовать во время войны сеть геопозиционирования противника — глупость, точно так же использование его же операционной системы, прикладного ПО.

Промышленный шпионаж через программное обеспечение — не сказки, вы это знаете, если читаете хотя бы «Хабр». Шпионаж на уровне государств — такая же реальность. Поэтому важно иметь собственное программное обеспечение. Да, какая-то часть разработки такого ПО — распил, возможно даже бо́льшая, я не знаю. Но это не повод гнобить всё импортозамещение, это повод искать пути решения проблемы распилов.

Кстати, импортозамещение — не всегда разработка нового ПО с нуля, как думают некоторые. Подойдёт и разработка на основе открытого ПО. Например, я недавно познакомился с несколькими разработками на базе «Линукса», некоторые из которых модифицированы столько сильно, что имеют оригинальную систему безопасности, разработанную вместе с учёными наших институтов, и позволяющую обрабатывать даже гостайну.

В «Астра-Линуксе», например, очень любопытно построена работа программ — они все работают в изолированном контейнере и доступ к ресурсам системы осуществляется на основании уровня допуска программы. Причём все порождённые ей данные буду помечены — программы с меньшим уровнем допуска не смогут получить к ним доступ. Так, например, через буфер обмена невозможно скопировать данные из документа, составляющего гостайну, в обычный документ, наоброт — можно. В графической среде это тоже сразу видно — каждое приложение обведено рамкой, цвет которой кодирует уровень допуска.

Другой положительный момент — некоторые сразу задумались об импортозамещении слов. Я очень хочу что бы умерли «поюзать» («использовать»), «паркинг» («парковка»), «читабельный» («читаемый»), «рандомный» («случайный»), «расшарить» («поделиться»), «заимпрувить» («улучшить»), «имплементация» («реализация»), «имплант» («имплантат») и остальные монстрики, засоряющие язык.

Так же хочется чтобы померли «краудфандинг» («складчина») и «краудсорсинг» (хотя ничего лучше «толоки» я тут предложить не могу).
17 комментариев
23 октября 2014 12:39

Как ускорить Yosemite

«Йосе́мити» — худшая по стабильности операционка Эпл из всех, которые я когда-либо видел, в ней столько всего сломано, что я начинаю думать, что службу контроля качества Эпл должны уволить в полном составе. Она же, возможно, худшая по скорости. Даже на моей свежайшей «прошке», купленной взамен прошлой, умершей от чая, она тормозит.

Я почитал в сети советы бывалых по ускорению её работы, кое-что применил сам, делюсь.

Во-первых, надо отключить полупрозрачность. Это даёт существенный прирост к отзывчивости системы, особенно при работе с двумя мониторами. Отключается она в системных настройках → «Универсальный доступ» → «Уменьшить прозрачность». Уменьшить прозрачность (62.29КБ) Во-вторых, рекомендуют отключить экран виджетов. Говорят, на него тратится порядочно ресурсов системы. Опять «Системные настройки» → «Mission Control» → в списке «Dashboard» надо выбрать «Выкл.». Dashboard (92.69КБ) В-третьих, и это частый совет в таких ситуациях, нужно сбросить данные System Management Controller (SMC). Для этого нужно выключить ноутбук, зажать на десять секунд клавиши левого «шифта», «альт», «контрол» и кнопку питания, после чего включить ноут обратно.

В-четвертых, так же нужно сбросить PRAM. Для этого, опять же, нужно выключить ноутбук, включить его и зажать «комманд», «альт» и клавиши «P» и «R» до тех пор, пока не загрузится операционная система.
18 комментариев
23 октября 2014 09:45

Две «песни про пиво»: AppleScript и Applesoft BASIC

У меня тут мой ноут поперхнулся чаем, так что я неделю был на стареньком компике под Виндой, почувствовал себя себя как без рук. По этой же причине почти не писал ничего в блог, лишь одним вечером на ноуте жены написал очередные две «Песни про пиво» на языках AppleScript и Applesoft BASIC. Первый — современный язык для автоматизации мелочи на «Маках», второй — древний (1977 год) бейсик, когда-то так же использовавшийся на «Маках».
Комментировать
20 октября 2014 14:22

Я — именитый писатель

Один из самых знаменитых и популярных писателей Евгений Владимирович Степанищев полноценно представлен в книжном каталоге интернет магазина OZON. У нас вы найдете, как лучшие книги бестселлеры, так и новинки 2013 года, которые написал автор . Кроме этого вы можете ознакомиться с краткой биографией писателя, посмотреть его фото и полный список литературы, к авторству которой, он причастен. Перед тем как купить книгу, которую написал Евгений Владимирович Степанищев вы можете прочитать отзывы читателей или анотацию к ней.
Жена на «Озоне» нашла (в самом низу страницы).
5 комментариев
17 октября 2014 10:59

Конструкция «??»

В ПХП 7 появилась, наконец, конструкция, которая должна была быть в языке с первых версий:
echo $_GET['var'] ?? 'default'; // PHP 7
echo isset($_GET['var']) ? $_GET['var'] : 'default'; // PHP 5.6 и ниже
Очень похоже на тернарный оператор без средней части, появившийся в версии 5.3, но с одним отличием: проверяется не ложь или истина, а существование.

Теперь в ПХП можно писать намного более эмоционально:
echo X-D ? :-D ??!! O_o; // это работает в PHP 7, я даже могу сказать что это значит.
Может кому-то пригодится, я собирал у себя на «Маке» текущую версию ПХП 7 при помощи следующих команд:
git clone https://github.com/php/php-src.git
cd php-src

brew install re2c
brew info bison27
PATH=/usr/local/opt/bison27/bin/:$PATH

./buildconf
./configure --prefix=/opt/php-5.7 --disable-all
make
make install
4 комментария
12 октября 2014 20:43

Кто крайний присаживаться?

Азбучная истина № 6. Подойдя к очереди в кассу или ко врачу в поликлинике, грамотно спросить у людей: кто последний? Предлагая гостю принять сидячее положение, вежливо сказать: садитесь, пожалуйста. А «кто крайний?» и «присаживайтесь» — это неправильно.
Пишет В. М. Пахомов, кандидат филологических наук, главный редактор портала Грамота.РУ.
4 комментария
12 октября 2014 14:18

JSOND

JSOND — это ещё один «дешёвый» способ увеличить производительность вашего проекта на ПХП, наряду с igbinary. Исходный код есть на PECL, для всех систем существуют пакеты. Насколько я знаю, есть планы по замене стандартного расширения JSON в ПХП7 на JSOND.

Для интереса погонял стандартный тест пакета на одной из наших машин (мы там вчера перешли на ПХП 5.5 наконец-то, стоит последняя версия), вот результаты (меньше — лучше):
STR: {"i": 23, "array": [1, null, false, true, ["aha", "baba", 23, {"test": 23}]]}
JSON: time for 100000 iterations: 1.096384
JSOND: time for 100000 iterations: 0.353658
STR: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
JSON: time for 100000 iterations: 0.700904
JSOND: time for 100000 iterations: 0.202519
STR: {"a": 23.2234232}
JSON: time for 100000 iterations: 0.398129
JSOND: time for 100000 iterations: 0.083977
STR: сериализуется очень длинная строка
JSON: time for 100000 iterations: 0.392990
JSOND: time for 100000 iterations: 0.341663
STR: сериализуется переменная $_SERVER
JSON: time for 100000 iterations: 4.983888
JSOND: time for 100000 iterations: 2.321528
Что приятно, АПИ полностью совместимо, так что проблем нет никаких — в вызовах надо просто добавить одну букву. Есть так же несложный способ самостоятельной замены стандартного JSON на этот модуль в интерпретаторе.
13 комментариев
8 октября 2014 08:51

Эксперт


Помните этот известный ролик про приглашённого эксперта по рисованию красных линий? Я как-то быстро придумал как бы я себя вёл, будучи приглашённым на это совещание в качестве эксперта.

Напомню в чём суть: в ролике эксперта просят подтвердить, что компания сможет нарисовать семь красных линий, строго перпендикулярных друг другу, некоторые — зелёным цветом, некоторые — прозрачным, причём одна из них должна быть в форме котёнка.

Меньше всего проблем вызвала бы перпендикуляность всех линий. Что тут сложного? В ролике нет требования, что линии должны быть прямыми, а если бы и было, детские эксперименты с лентой Мёбиуса подсказывают нам, что можно придумать поверхность с самыми чудны́ми свойствами. Легко вообразить и такую, где можно провести семь прямых линий, перпендикулярных друг другу.

Линия в форме котёнка решается ровно так же — формой поверхности. Изогнём путь одной линии так, чтобы она повторяла силуэт котёнка.

Опять же не очень сложно сделать прозрачные красные линии — надо всего лишь нарисовать их чем-то прозрачным на красном фоне. Линии прозрачные? Прозрачные! Красные? Красные! Что ещё надо?

Загвоздка с зелёным. Но если вспомнить анекдот про Роберта Вуда и светофор, то можно предложить разогнать наш объект до скорости 60 000 км/сек — на этой скорости красный свет из-за эффекта Допплера станет зелёным. Как это сделать, дело не моё, я же эксперт только по красным линиям.

Это, кстати, не единственный вариант, можно попробовать выбрать оттенок красного, в котором содержится зелёный и осветить нужные нам линии чистым зелёным светом — тогда именно он и отразится. Либо, добавить в красный краситель фосфор — какое-то время в темноте линия будет зелёной. Опять же, существуют краски, которые светятся в инфракрасном свете — среди них есть и такие, которые светятся зелёным. Принцип понятен, я думаю.

Оказывается (спасибо, Ирек, что показал) существует ролик-видеоответ, где какой-то мужик (некий Ди. Скот Виллиамсон) таки рисует (ролик на английском) всё требуемое. Причём с зелёным цветом он придумал круче, чем я, но тут сказывается несовпадение языков (я смотрел ролик на русском).

Виллиамсон рисует линии «используя зелёные чернила» (two drawn using green ink), в английском ролике-то как раз требуется нарисовать не зелёные линии (как в русском), а «некоторые — используя зелёные чернила» (some with green ink). Так что всё верно.

Приходится признать, что в мире существуют эксперты по красным линиям круче меня!
13 комментариев
5 октября 2014 19:58

Кухня блокадного Ленинграда

Читая в «Википедии» статью про Игоря Растеряева, увидел упоминание некой «хряпы» и «дуранды», никогда слов этих не слышал, заинтересовался. Оказывается, это упоминались названия со стола блокадников в Ленинграде.

Дуранда — это жмых от подсолнечного масла: плотные, желтовато-коричневые большие пластинки. За ней выстраивались огромные очереди, потому что ее давали без карточек. Просто так дуранду есть нельзя: ее нужно размачивать. Ее клали в большую кастрюлю с теплой водой, она там размякала, потом пропускали через мясорубку. Получалась тестообразная масса, из которой пекли лепешки. Это считалось деликатесом.

Хряпа — верхние капустные листья, которые остаются на поле после уборки кочанов. Обычно в пищу людьми не употребляются, используются как корм скоту. Чтобы отбить горечь, их вымачивают и засаливают.
5 комментариев
28 сентября 2014 17:10

Процедурное настоящее PHP

ПХП, к сожалению, в сердце ещё глубоко процедурный язык. Наткнулся на очередную особенность. Сначала небольшая предыстория.

Многие знают, что FastCGI в ПХП не настоящий — при каждом запросе весь код интерпретируется заново, это позволяет не заботиться об утечке памяти, сбросе состояния между запросами и ещё о многих вещах, а значит упрощает вообще всё, что соответствует духу ПХП — понизить до минимума порог вхождения. Конечно, это сказывается на производительности, но в некоторых случаях ПХП научился смягчать этот недостаток.

Например, есть такая вещь как «постоянные соединения» (persistent connections) — это специальные режим, в котором на уровне процесса PHP FastCGI соединения с чем-либо не закрываются и выдаются в следующий запуск кода уже открытыми. Чудесная вещь, ведь операция соединения, например, с «Ораклом» очень дорогая.

Конечно, кое-чем приходится расплачиваться — например, в открытом соединении «Оракла» остаются установленные предыдущим кодом параметры сессии, временные таблицы, незавершённые транзакции, наверное что-то ещё. Первые два пункта меня лично не пугают, так как параметры сессии у нас везде одинаковые и временные таблицы мы не используем, а вот последний — очень.

Как известно, ПХП может свалиться в фатальной ошибкой по многим причинам, одна из них — превышение времени обработки скрипта. Соответственно, скрипт может упасть и в середине транзакции, она останется незакрытой и может остаться висеть долгое время, пока соединение не получит скрипт, в котором встретится команда закрытия транзакции.

А пока этого не произошло, блокировки на базе могут привести к коллапсу.

В общем-то, есть хороший выход — у нас же есть сервис-объект для работы с базой? Вставим в деструктор принудительный откат транзакции (rollback) и все дела! Если транзакция была не завершена в силу фатальной ошибки, она откатится и всё! Ведь деструктор должен вызвааться на уничтожение объекта!

Как показывает практика, должен, но не обязан. Ниже простой код:
class ImportantToClose {
    public function __destruct()
    {
        // закрываем что-то важное
        echo "Вызвался деструктор\n";
    }
}

$itc = new ImportantToClose;

register_shutdown_function(function()  {
    echo "Вызвалась shutdown function\n";
});

set_time_limit(1);

for(;;);
Если запустить его в интерпретаторе и подождать секунду, то мы получим следующую ошибку:
PHP Fatal error: Maximum execution time of 1 second exceeded in fatal.php on line 18

Fatal error: Maximum execution time of 1 second exceeded in fatal.php on line 18
Вызвалась shutdown function
Можно ещё попробовать записать что-нибудь в файл, результат будет тот же — деструктор не вызовется, тогда как-то старая добрая процедурная shutdown function — да. Поэтому, если у вас есть нечто важное, что необходимо аккуратно закрывать, не делайте это в деструкторе, делайте в этой магической функции. В нашем случае, можно реализовать в каждом сервисе метод close и в этой функции вызвать этот метод для кажого открытого сервиса.

Кстати, не забудьте выставить внутри shutdown function нужное вам время выполнения, если предел будет превышен, то и эта функция будет прервана, в этом случае вам уже ничего не поможет закрыть ресурс корректно.
8 комментариев
28 сентября 2014 12:29

ENUM

Не понимаю, почему в «Оракле» (это СУБД) нет такой полезной вещи как тип ENUM. Вещь совершенно необходимая, как по мне. Вот посмотрите, что понятнее:
CREATE TABLE event_queue (
     …
     status ENUM('done', 'new', 'failed', 'running'),
     …
);
или
CREATE TABLE event_queue (
     …
     status NUMBER(1), -- тут у нас 4 значения будет
     …
);
Я как-то за первый вариант — всюду сразу видно что означает конкретное поле. Это по-моему, так очевидно, что и обсуждать тут нечего. Вместо этого в запросах появляются либо некие магические константы, либо приходится в них пропихивать что-то именованное из кода, но при этом в выборке всё равно будут те же номера.

Кроме удобства программиста, есть очевидная польза и для самой СУБД. Например, возьмём запрос к таблице выше, где мы определили поле status как число. Мы знаем, что статусов у нас всего четыре, это знаем мы, но это не знает «Оракл». Теперь взглянем на два совершенно эквивалентных с точки зрения программиста запроса (ведь он знает, что значений четыре) и посмотрим планы их выполнения:
SELECT *
FROM event_queue
WHERE status IN (1,2)
AND target='search' AND attempts < 3

План №1 (17.65КБ)
SELECT *
FROM event_queue
WHERE status NOT IN (3,4)
AND target='search' AND attempts < 3

План №2 (17.77КБ) Как видите, разница в стоимости аж в три раза. Спрашивается, почему? Ответ очень простой, конечно: в первом случае если status оказался равен единице, вторая проверка уже не нужна, во втором случае, всегда нужны обе проверки. Почему цифры отличаются именно в два раза, а не в три, я не скажу, это, видимо, прикидка, основанная на статистике использования этой таблицы — одно из этих значений (статус «задание провалено») вообще ещё ни разу не записывалось.

Вообще, есть несколько способов имитировать тип ENUM: добавить ограничение (check), ввести новый тип. Но первое никак не сказывается на плане и требует перехода к строковому типу, а со вторым я ещё не эксперементировал.

Обладая Оракл информацией о том, что у нас в этом поле всего четыре возможных значения в этом поле, он мог бы запросто инвертировать значения и снизить стоимость.
21 комментарий
27 сентября 2014 16:52

«Открылся у нас новый бааар»

С ДДТ меня познакомил Дима Мартынов, друг детства, с которым мы дружили всю школу, а потом, когда он уехал в Ульяновск, а позже и в Питер, мы остались приятелями. Я был типичным «ботаником», только очков не носил, правда не заучкой, у меня была «своя атмосфера» — школа мне была неинтересна, я постигал реальность самостоятельно. На моё отношение к жизни песни группы ДДТ ложились как нельзя лучше, так же как и «Агаты Кристи», «Нау», «Пикника», «Аквариума» и некоторых другие.

Ничего из этого списка, кроме ДДТ, кстати, я в настоящее время не слушаю. Ещё с детства помню выкрик фаната «открылся у нас новый бааар», который я уже более 20 лет слышу на записи песни «Я зажёг в церквах все свечи». Всё подряд я не слушаю даже у самых любимых групп, поэтому немудрено, что я не знал, что это то ли заказ песни из зала, то ли фанат спутал вступление.

Сегодня погуглил эту реплику (за 20 лет она обязана была обрести известность) и вот что нашёл:
Много лет перед «Я зажёг в церквях все свечи»  я слышал хрип уфимского поклонника «открылся у нас новый бааанк». Причём здесь банк, думал я. Какая-то странная, зрительская реклама. Когда, в конце 90-х стали перевыпускать ранние альбомы, и я услышал песню 82 года «открылся у нас новый бар», всё стало предельно ясно. Но какие там бары, когда зажигаются свечи? Эти мелкие реплики не затёрли при последующем сведении концертного альбома. Не знаю, специально, или сложно было технически.
По мне такие огрехи добавляют живости, а по прошествии стольки лет чистить их просто нельзя — они уже стали частью той записи, при прослушивании губы сами шепчут в нужном месте «открылся у нас новый бааар».
Комментировать
27 сентября 2014 12:45

«Берегиня»

Берегиня (8.05КБ) На сайте Студии Лебедева увидел шрифт «Берегиня». Это стилизация кириллического и латинского шрифтов под стиль белорусского орнамента (красная полоса над «приветом» — это он). Там есть даже цифры и знаки препинания!

В заметке про шрифт написано (на белорусском), что он может использоваться как декоративный для оформления заголовков, а по мне так лучше использовать его как субкультурный маркер для славянофилов. Сразу вспоминается нюй-шу, тайная письменность женщин уезда Цзянъюн южнокитайской провинции Хунань.

Многие начертания, как мне показалось, можно было сделать проще, но, во-первых, для скрытности более простой вариант хуже, во-вторых, я не шрифтовик, может быть дизайнер их пробовал, но возникли практические трудности, которые мне не увидеть. В конце-концов я только русифицировал меньше десятка шрифтов, когда переводил игрушки на «Спектруме», это весь мой опыт.

Чтение сильно затрудняет пробел — чтобы в этом месте не было провала, автор нарисовал очередную «загогулину», поэтому разрыва слов не видно. Но понимаю зачем это сделано — в традиционных орнаментах никаких разрывов и нет.
Комментировать
27 сентября 2014 12:07