Локальное тестирование Facebook Instant Games

Facebook Instant Games Для тестирования игры для платформы Facebook Instant Games есть несколько вариантов:
– Создание тестовой версии продукта в контрольной панели.
– Тестирование локально, без необходимости загрузки игры на сервер Facebook.

Я использую оба варианта. Второй вариант использую гораздо реже и потому каждый раз приходится вспоминать как настроить окружение.

Подробности и иструкция на официальной странице – Testing, Publishing, and Sharing an Instant Game.

JavaScript string length

В веб-версии моего http-загрузчика обнаружилась проблема – длина responseText отличается от реального размера файла. Оказалось, что файл содержал русскую строку текста в utf-8. А я размер получал как responseText.length – длина строки в символах, но не байтах.

Проблема решилась просто – используем Blob:

let size = new Blob([this.responseText]).size;

MySQL: Insert or Update

Есть отличный проект Nakama https://heroiclabs.com но я продолжаю использовать свою реализацию Leaderboards и Profile Storage.

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

'INSERT INTO `some_table`' +
' (`user_id`, `timestamp`, `user_name`, `score`)' +
' VALUES(?, NOW(), ?, ?)' +
' ON DUPLICATE KEY UPDATE' +
' `timestamp`=NOW(), `user_name`=?,' +
' `score`=GREATEST(`score`, VALUES(`score`))';

Для работы этого запроса поле `user_id` должно быть UNIQUE.

Темное меню в macOS Mojave

В новой macOS отломали возможность сделать темное меню при активной светлой теме. В итоге или используй темную тему (а она на мой взгляд весьма сырая), или это в терминале:

$ defaults write -g NSRequiresAquaSystemAppearance -bool Yes

После выполнения команды нужно перелогиниться.

Сглаживание шрифтов в macOS Mojave

С выходом macOS Mojave пропала опция настройки сглаживания на старых девайсах без ретины. Это странно, т.к. именно на старых матрицах с низким DPI эта опция наиболее актуальна.

Но настроить все это можно из терминала.

$ defaults -currentHost write -globalDomain AppleFontSmoothing -int {VAL}

Где {VAL} это один из вариантов:
– 1 лёгкое сглаживание
– 2 среднее сглаживание
– 3 сильное сглаживание
– 0 отключить функцию сглаживание шрифтов

$ defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO

Xcode: очередные «улучшения» билд системы

В недавнем обновлении Xcode были сделаны улучшения в билд системе, направленные на повышение скорости сборки проекта.

Xcode build system

Допускаю, что эти изменения действительно ускоряют сборку проекта и не портят бинарник, если редактирование исходника происходит из встроенного редактора.

Но те, кто пользуется внешним редактором или использует внешние инструменты для работы с системой контроля версий, получат незабываемые ощущения.

Я использую VIM как основной редактор кода (да и вообще для любого текста) и GIT в эмуляторе терминала.

Раньше билд система Xcode сравнивала дату модификации файла с объектным файлом (как и делает большинство билд систем), если тот существует, и на этом основании строилось дерево зависимостей, необходимых для сборки. Полагаю, что очередная «оптимизация» билд системы Xcode строит дерево на основании флага об изменении файла во встроенном редакторе. А все, что изменялось из-вне, считается не модифицированным.

Сделал git checkout some_branch_name, жми cmd + shift + k для очистки проекта и его полной пересборки.
Отредактировал файл во внешнем редакторе, снова жми cmd + shift + k для очистки проекта и его полной пересборки.

Новое поведение билд системы теперь включено по умолчанию. Вернуть старую Build System можно из File > Project Settings…

Xcode Legacy Build System

Загрузка и кодирование в base64 на JavaScript

Для шаринга и инвайта в Facebook / Instant Games нужно в качестве параметра image передать картинку, закодированную в base64. Можно сделать это в offline, но это увеличит размер дистрибутива и увеличит время загрузки игры. Значит это не наш метод.

Я делаю это в рантайме с помощью XMLHttpRequest и FileReader:

function toDataURL(url, callback) {
    var xhr = new XMLHttpRequest();
    xhr.onload = function() {
        var reader = new FileReader();
        reader.onloadend = function() {
            callback(reader.result);
        }
        reader.readAsDataURL(xhr.response);
    };
    xhr.open('GET', url);
    xhr.responseType = 'blob';
    xhr.send();
}

И что бы было совсем хорошо, загружайте нужную картинку в фоне, тогда реакция на нажатие пользователем кнопки share/invite будет мгновенной.

Emscripten: can’t open file embuilder.py

Начиная с версии 1.38.1 emscripten при компиляции вашего проекта может возникнуть такая ошибка:

ERROR:root:We cannot build the native system library in “~/.emscripten_ports/binaryen/binaryen-version_48” when under the influence of emmake/emconfigure. To avoid this, create system dirs beforehand, so they are not auto-built on demand. For example, for binaryen, do “python embuilder.py build binaryen”
ERROR:root:a problem occurred when using an emscripten-ports library. try to run emcc –clear-ports and then run this command again

Решается эта проблема двумя командами:

$ emcc --clear-ports
$ python embuilder.py build binaryen

При возникновении сообщения об ошибке «can’t open file ’embuilder.py’: [Errno 2] No such file or directory», укажите полный путь к текущей версии embuilder.py. В моем случае путь получается такой:

$ python /usr/local/Cellar/emscripten/1.38.5/libexec/embuilder.py build binaryen

Nexus Player flash firmware

Попытка обновления фирмвари приставки стабильно завершалась с ошибкой:

wiping userdata...
/usr/local/bin/mke2fs failed with status 1
error: Cannot generate image for userdata

Прыжки с бубном и потопывание ногами не помогало. Но решение проблемы оказалось простым – нужно обновить mke2fs до свежей версии:

$ brew cask install android-platform-tools
1 2 3 21