Конкурсы?

Все слышали про расовую дискриминацию на премии Оскар. Дискриминация на Евровидении — это притча во языцах.

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

Вот пример:

Конкурс Data Science Challenge 2017 ввёл в свои правила явную фразу о том, что участники из стран, которые имеют индекс восприятия коррупции ниже 37, не могут рассчитывать на денежное вознаграждение.

Интересно посмотреть на победителей другого конкурса: Experiments Challenge 2017. Победители, получившие денежные призы из стран (в скобках индекс восприятия коррупции 2014): Голландия (83), США (74).

Ещё участники из Южной Африканской Республики (44) и Индии (38) получили по недежному призу — телефон и очки виртуальной реальности.

Я проиграл в этом конкурсе, не выиграл ничего, получил отписку от Google. Был удивлён, потому что приложения-победители, кроме Objectifier 2016, довольно простые, ну совершенно без выдумки. На эксперимент не тянет. Но решил, что на вкус и цвет все фломастеры разные, повезёт в другой раз, и, слава богу, не нужно думать как получать и декларировать призы.

Но теперь я задумался: как на самом деле происходит отбор победителей?

Понятно, почему рубанули по 37. Из-за Китая (36).

Firebase Cloud Functions

Незадолго до Google I/O я попробовал Firebase Cloud Functions в мессенжере-Вселенной Ты космос. И обнаружил, что не чётко работает подписка на событие добавления в базу данных.

Вот так оно было объявлено:

exports.sendFollowerNotification = functions.database.ref('/{galaxyUid}/messages').onWrite(event => { ... });

Казалось бы, когда добавляется новое сообщение в /{galaxyUid}/messages как дочерний узел, событие должно сработать. Например, при появлении:

https://saturn-6b9e1.firebaseio.com/4ee9bf31-4a5c-4a83-94c7-99a9f48aee38/messages/-KkidPlqZ5WsiDN9mb_c

будет вызвана наша функция.

Однако, когда в messages уже очень много дочерних узлов, событие просто не вызывается и в логах отсутствует какая-либо информация, объясняющая эту ситуацию. Я думаю, что есть какое-то превышение квоты бесплатного тарифного плана.

Как быть?

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

exports.sendFollowerNotification = functions.database.ref('/{galaxyUid}/messages/{planetUid}').onWrite(event => { ... });

Это работает, и дополнительно даёт информацию о планете, которая была добавлена в галактику.

Ты космос

Уже зарекался что-то делать в Google Play — и вот опять, не удержался.

Мессенджер «Ты космос». Вместо сообщений — планеты. Вместо чата — галактика. Можно перелетать от одной планеты к другой. А ещё можно позвать в галактику друзей.

Скачать можно здесь.

Мессенджер

— Двор, — заявил робот, не совсем точно цитируя Томаса Вулфа, — это не только двор, но также и отрицание двора. Это встреча в пространстве двора и в пространстве его отсутствия. Двор — это конечное количество грязной земли, это факт, детерминированный отрицанием себя.
— Ты сам-то понял, что намолол? — спросил Гэллегер, желая и сам это узнать.
— Да.

Генри Каттнер. «Гэллегер Бис»

Хочу создать прикольный мессенджер, который переворачивает смысл каждого слова в отправленной фразе наизнанку.

Например, отправитель пишет:

Добрый вечер, Александр! 🙂

Получатель видит:

Злое утро, Борис! 🙁

— и дальше в таком духе.

Этот мессенджер будет бомба! Без нейросетей и решения сложных задач на стыке информационных технологий и естественного языка не обойтись.

Горе-программист

Пришла новость: гражданин Нигерии, программист, при попытке пройти пограничный контроль в аэропорту Джона Ф. Кеннеди в городе Нью-Йорк, США не смог выполнить два простейших задания пограничника:

  • Расскажите, что такое абстрактный класс.
  • Напишите на листе бумаги функцию проверки сбалансированности бинарного дерева.

Оправдывая свою некомпетентность, нигериец говорил, что у него был долгий и мучительный перелет из Африки. В результате его три часа продержали в обезьяннике, в течение которых связались с компанией, в которой он работает. Только когда компания поручилась, что им действительно нужен такой инженер, его пропустили. За три часа иностранец так и не отдохнул достаточно, чтобы ответить на эти вопросы.

В Америке, конечно, журналисты опять увидели нарушение прав афроамериканцев, трамповщину. Редакция нашего журнала придерживается такой точки зрения, что не важно, кто ты и какого цвета кожи, но важно, что ты умеешь и знаешь. Если на простые вопросы пограничника не можешь ответить, так и не стоит заявлять, что ты — программист. Напиши, «менеджер» в анкете и не позорься. Особенно, если вы из России или СНГ, потому что всех подозревают во вмешательстве в американские выборы-2016. В нашем случае неизвестно, что будет хуже: продемонстрировать компетентность в CS или притвориться идиотом.

Если вам интересен правильный ответ на вопрос про деревья, добро пожаловать под кат.

Читать далее Горе-программист

Video 2x for Nexus 5X

Давно хотел написать про это, но времени не было.

Нажимать красную кнопку бессмысленно — это скриншот.

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

С чем я столкнулся:

1. Далеко не все смартфоны технически способны дать доступ к обеим камерам одновременно. Те, что могут, — это очень хорошие смартфоны, и их на текущий момент не много. Это Google Pixel, последние Nexus, топовые LG, HTC. Тот, кто покупает дешевые телефоны, в пролете. Сами посудите: недавно вышли флагманы с поддержкой видео 4K. А тут HD-видео с 60fps не с одной, а с двух камер одновременно, плюс обработка на GPU.

2. Google Play не отличается удобствами для распространения приложений исключительно под лучшие устройства. Иными словами, я мог бы выложить приложение для всех, но около 90% людей с нищебродскими телефонами поставит приложению 1 звезду, хотя эту звезду следовало бы присудить так: ползвезды производителю такого телефона и ползвезды его покупателю. Поэтому этого приложения нет в Google Play. Там вообще ничего моего больше нет.

3. Как ни странно, у меня возникли проблемы с синхронизацией аудио и видео при использовании стандартного MediaRecorder. Я вышел из положения очень просто: одним MediaRecorder записываю только видео (совмещенные из двух камер с помощью GLSL-шейдеров), вторым — только аудио. Когда пользователь закончил съемку, с помощью Mp4Parser объединяю два файла в один. Таймстемпы выставляются идеально, есть lip sync.

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

Скачать приложение нигде нельзя. Я им пользуюсь эксклюзивно.

Обновлено 10.05.2017: для участия в Experiments Challenge 2017, я выложил-таки приложение на Google Play. Призовых мест приложение не заняло. И тем не менее пусть остаётся в общем доступе.

Flutter

Сегодня расскажу об одном из многочисленных способов создавать кроссплатформенные приложения для Android и iOS — Flutter от Google.

Особенности:

1. Язык программирования — Dart. Не привычный ни для Android- ни для iOS-разработчиков.

2. Среда разработки — Atom. Хотя среда разработки — это слишком громко сказано. Текстовый редактор с плагином Flutter для подсветки синтаксиса, автодополнением, кнопками для запуска и отладки и логом.

3. UI нужно объявлять в коде. А поскольку синтаксис Dart требует множество знаков препинания, то это выглядит как вермишель. Ни Interface Builder, ни предпросмотра…

4. Flutter берет на себя обновление вьюшек. Все состояние описывается в том же классе, где и UI, с помощью переменных членов-класса. Когда состояние меняется, то Flutter автоматически перерисовывает все дерево UI. При этом можно добавить анимации.

5. Превью мне показалось достаточно стабильным. Запуск приложений на симуляторе iPhone 6S и Nexus 5X происходит без заминок. Но список проблем на гитхабе зашкаливает.

6. Есть интеграция с Firebase. Это облачный сервис от Google для мобильных приложений: аналитика, сбор статистики о падениях, пуш-уведомления, место для хранения данных…

7. Есть пошаговая инструкция, как написать свой мессенджер за полтора часа. Но пока вы настроите свой макбук и установите все зависимости (хочет самый последний XCode и Android Studio) пройдет полдня.

8. Material Design из коробки.

Резюме: ни для чего серьезного Flutter не годится. Но для технического превью очень неплохо. Остается только понять, зачем Google инвестирует деньги и время в такие поделки.

Я простудился. Поэтому сижу дома и пишу мессенджер на Flutter. Название Flutter ассоциируется у меня теперь с гриппом. Здоровым бы я не стал этим заниматься… Кстати, еще раз GTA V прошел на 100%! 😉

Реклама на первом

Первый канал в онлайн-вещании стал заменять эфирные рекламные блоки на онлайн-рекламу. Для того, чтобы сделать это, им потребовалось передавать в онлайн-проигрыватель время начала и конца рекламных блоков.

JSON-файл, который запрашивает медиа-плеер первого канала, в нём даны временные метки рекламных блоков:

http://stream.1tv.ru/api/com-inject.json

Если мои предположения верны, то используя эти данные можно сделать блокировку ТВ-рекламы.

Новогодние изменения в CornPlay

С наступающим Новым 2015 годом!

В этом году мы кое-что поменяли.

Во-первых, исходные коды приложений уже опубликованы на http://github.com/cornplay. Исходники новые приложений, если таковые появятся, также будут опубликованы. Присоединяйтесь.

Во-вторых, из-за неприятно высокого курса доллара пришлось отключить площадку Google App Engine, которую мы использовали для синхронизации данных в приложении «Турист — Список вещей». Честно признаюсь, доходы ни от рекламы, ни от покупок в приложении не окупали этот сервис. Взамен мы предлагаем нашим пользователям установить свежее приложение «Турист — Список вещей» без рекламы и с синхронизацией данных, выполняющейся на сервере http://cornplay.com. Перенос данных в свежее приложение из старого пользователи могут выполнить через функцию пункт меню «Поделиться» и выбрав в нём «Импорт в Турист».

Счастливого нового года!