Рубрика «json» - 13

Работа с форматом JSON в Swift на первый взгляд не представляет особых сложностей, с одной стороны в стандартном наборе есть класс NSJSONSerialization который умеет парсить файлы, с другой стороны множество сторонних библиотек обещающих сделать этот процесс проще, а код нагляднее. В рамках же данной статьи я хотел бы рассмотреть как читать JSON файлы быстрее и почему очевидные подходы работают медленно.
Читать полностью »

Открытый проект клиента MQTT на Delphi. Продолжение - 1
Начало было здесь: Протокол MQTT и открытый проект клиента MQTT на Delphi

Проект клиента MQTT на Delphi дополнился приборной панелью для наблюдения за потоком информации из интернета вещей в реальном времени и генератором периодических публикаций для тестирования MQTT брокеров. Был принят формат JSON для передачи информации, поскольку он является стандартом для интернет-сервисов.
А также посмотрим что может нам предложить IBM Bluemix для организации удаленного наблюдения и управления вещами в интернете.
Читать полностью »

За эти годы я стал свидетелем того, как все больше и больше людей поддерживают манифест 12 Factor App и начинают реализовывать положения, описанные там. Это привело к появлению приложений, которые были значительно упрощены в развертывании и управлении. Однако примеры практического применения этих 12 факторов были довольно редким явлением на просторах сети Интернет.
12 Fractured Apps и Docker - 1

За время работы с Docker, преимущества 12 Factor App (12FA) стали для меня более ощутимыми. Например, 12FA рекомендует, чтобы логирование было настроено для стандартного вывода и обрабатывалось в качестве общего потока событий. Вы когда-нибудь использовали команду docker logs? Это и есть 12FA в действии!Читать полностью »

Спустя месяцы напряжённой работы мы наконец выпустили приложение для iOS Relevant. С ним мы ломаем существующие устои взаимодействия с сервисами и контентом в сети, благодаря чему пользователь тратит куда меньше времени на привычные вещи. Достигается это путём представления приложений и веб-сервисов в виде карточек (подробнее здесь).

Карточки, как независимые интерактивные единицы, показывают, каким будет будущее мобильных интерфейсов.
imageЧитать полностью »

Компания Apple совершенно неожиданно нанесла удар в поддых рекламной индустрии, легализуя использование контент-блокировщиков в мобильной версии Safari под iOS 9. Вполне очевидно, какой именно контент будут блокировать такие расширения в первую очередь: это реклама.

Этого не объявляли во время презентации в понедельник, но о поддержке соответствующих расширений говорится в официальной документации.

«Новая версия Safari содержит поддержку расширений для блокировки контента (Content Blocking Safari Extensions) в iOS, — сказано в документации. — Блокировка контента предоставляет расширению быстрый и эффективный способ блокировать куки, картинки, ресурсы, всплывающие окна и другой контент».
Читать полностью »

Гугл открыла исходный код своего проекта Jsonnet, языка для конфигурации, который заменяет стандартный JSON и добавляет новые возможности без нарушения обратной совместимости. Среди таких возможностей: комментарии, ссылки, арифметические и условные операторы, массивы и работа с объектами, импорт, функции, локальные переменные. Программы на Jsonnet транслируются в совместимый JSON формат данный.

Комментарии. Jsonnet принимает комментарии в стиле С ( /* … */ ) и С++ ( // )

Ссылки. Ключевое слово self может быть использовано для ссылки на текущий объект. Оператор $ позволяет использовать корневой объект.

Арифметические и условные операторы. Оператор + может складывать числа, строки, массивы и объекты. Операторы == и != возвращают true или false. Оператор if работает как тернарный оператор ?: в С. Далее несколько примером с операторами языка и результат. Примеры взяты со страницы проекта.

// bar_menu.3.jsonnet
{
    foo: 3,     
    bar: 2 * self.foo,  // Multiplication.
    baz: "The value " + self.bar + " is "
         + (if self.bar > 5 then "large" else "small") + ".",
    array: [1, 2, 3] + [4],
    obj: {a: 1, b: 2} + {b: 3, c: 4},
    equality: 1 == "1",
}

Читать полностью »

Предыстория

Совсем недавно у нас случилась ситуация, когда «потерялись» все YouTube и Vimeo ссылки на ролики, количество просмотров которых нам необходимо выводить на сайте. Это нужно, чтобы потенциальные инвесторы и партнеры видели, какие текущие показатели у наших сериальных проектов. Скрипт обновляет данные раз в сутки, хотя я неоднократно просил сделать обновление показателей в реальном времени. Я много лет не программирую, ушел в совершенно иной вид деятельности и в настоящий момент возглавляю анимационную студию. Конечно же, я был обескуражен возникшей ситуацией с потерей данных, устроил разнос и прочее, но это к делу отношения не имеет.

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

Читать полностью »

В одной из прошлых статей мы кратко рассказали, как грид контролы работают с удаленным сервером, используя OData протокол. Большинство современных грид контролов позволяют удобно группировать данные по нескольким колонками. Рассмотрим подробнее, как формулируются запросы к REST серверу, в случае, когда грид производит автоматическую группировку данных.

Удобство (зачем это нужно)

Грид контролы, позволяющие группировать записи по нескольким колонкам, существенно упрощают жизнь как программисту, так и конечному пользователю. Очень удобно иметь возможность сгруппировать, например, список задач, выделить задачи, требующие помощи, разделить их по приоритетам, и т.д.

image
Читать полностью »

Хорошо в плане поддержки JSON живётся программистам на Javascript — по какому-то невероятному стечению обстоятельств там JSON входит в спецификацию самого языка: есть JSON — есть объект. Удобно. Неплохо дело обстоит и в языках, где JSON не входит в сам язык, но поддерживается стандартной библиотекой (Python, Ruby): импортируешь модуль — и готово.

Жизнь программистов на С++ никогда не была особо простой — поддержки JSON у нас нет ни на уровне языка, ни в стандартной библиотеке. И не будет, возможно, никогда. «Тоже мне проблему нашел!» — скажут мне опытные коллеги — «Её там и не должно быть, С++ поставляется без „батареек“. Для решения этой задачи мы...» и вот здесь они разделятся на два лагеря:

1. «Мы используем большой фреймворк (boost, Qt, POCO, другой), который применяется во всех наших проектах и умеет 150 000 разных вещей, в том числе и JSON.»
2. «Мы придерживаемся подхода в котором для каждой задачи применяется своя легковесная библиотека. В частности, для JSON мы уже 150 000 лет назад выбрали отличную библиотеку %JSON_LIB%, которая прекрасно работает.»

Да, всё так и есть. Вот только…

Чем плох подход с использованием фреймворков

Во-первых, тянуть в проект огромный фреймворк ради одного JSON — как-то уныло. Ну ладно, допустим фреймворк у вас был и так. Но тогда придётся писать работу с JSON в терминах фреймворка, а это, как правило, тихий ужас. Посмотрите, например, на документацию по JSON в Qt — куча собственных типов вроде QJsonArray, QJsonDocument, QJsonObject, QJsonValue и т.д. и их придётся использовать. О том, чтобы потом перенести код в другой проект (где этого фреймворка нет) можно сразу забыть. Ну или вот Boost: парсер JSON находится очень логично в модуле Boost.PropertyTree. Ага, так бы я и догадался. Т.е. нам предлагают плясать не от формата JSON, а от структуры данных «дерево», которая умеет себя читать в том числе и из JSON.

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

Чем плох подход с использованием библиотек

Плох он вот этой частью: "...150 000 лет назад выбрали отличную библиотеку...". Скорее всего речь идёт о чём-то, что начинало писаться чуть-ли не во времена DOSа и, без сомнения, работает, но при этом, пытаясь быть совместимым со всеми платформами и стандартами языка совершенно отстаёт от прогресса. Да, всё компилируется и работает, даже тесты проходит. Но библиотека совершенно не знакома с такими вещами, как ключевое слово auto, range-based циклы, строковые литералы, raw-строки, конструкторы перемещения, списки инициализации и прочие классные вещи, делающие код одновременно более эффективным и более легко читаемым. А ведь у библиотеки, созданной годы назад, есть обязательства по обратной совместимости, а значит просто так взять и добавить это всё она не может.

Давайте немного помечтаем.

А что, если бы JSON вошел в стандартную библиотеку нового стандарта С++? Что, если бы он был написан в терминах С++1114 и без требований обратной совместимости со старыми стандартами языка? Что, если бы синтаксис этого модуля попытались бы сделать максимально приближенным к родному для JSON использованию «а-ля Javascript», но в том же время сохранить дух С++ (эффективность, минимальное потребление памяти, совместимость с STL)? Что, если бы его можно было включить в проект одним инклюдом и не беспокоиться о его сборке и линковке? Как бы это всё выглядело и работало?

И у нас есть ответ на этот вопрос! Давайте посмотрим на JSON-библиотеку для С++ написанную в соответствии со всеми этими принципами, ну и вообще написанной людьми для людей, а не чужими для хищников, как это обычно бывает.
Читать полностью »

Предположим в некотором проекте появилась необходимость добавить некоторую форму опроса пользователей на веб сайте (детальная форма) и форму для просмотра и редактирования списка пользователей для администратора системы (списковая форма).

Рассмотрим процесс создания этих форм с использованием OData, Angular.js, Bootstrap и JavaScript Grid. Все требования к такому приложению уже реализованы в этих инструментах, и нам практически не требуется ничего писать.

Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js