Android x86 emulator и google maps/play services

Google и intel сделали крутую штуку – образы андроида для x86 atom, которые работают весьма шустро на x86 платформе, в отличие от тормозных armv7. Но счастье резко заканчивается, когда нужно делать приложение, использующее google apis (maps, play services) – x86 образы есть только для чистого андроида.

Тем не менее, гугол (который поиск) помогает решить эту проблему – мы модифицируем образ в эмуляторе.

Continue reading “Android x86 emulator и google maps/play services”

Jenkins, MSBuild и Includes

Однажды оказалось, что Jenkins фейлит билды MSVS 2012 (которые выполняются посредством консольного msbuild), с сообщениями о том, что не найдены всякие заголовочные файлы (например al.h). Как известно, в студии начиная с 2010 “глобальные” настройки путей к инклюдам, либам и прочему перенесены в странное место – Property Manager->$Project|$Configuration -> Microsoft.Cpp.$Platform.user. Ну и ладно, казалось бы, зашли, прописали и всё хорошо. Студия компилит, в консоли msbuild тоже нормально всё делает… Вот только Jenkins запускает своего slave windows сборщика от системного пользователя, а настройки путей, они не глобальные, а per-user оказывается, поэтому он и не подхватывает эти пути.

Самым простым решением оказалось, как ни странно, создать каталог, скопировать туда “свой” файлик C:\Users\konst\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props и добавить в командную строку запуска /p:UserRootDir=d:\msbuild_home

Про строки

В процессе портирования одной игры на Sony PSP возникла “классическая” проблема с нехваткой памяти. Впихнуть в N/10 мегабайт памяти игрушку – ещё то развлечение.

Игра была написана, можно сказать по книжке про C++ и STL, но, к счастью, без книжки Александреску. Код довольно чистый и аккуратный, но, поскольку товарищи считают, что памяти много, то аллокации считать не надо, и можно смело делать, например, new ButtonPressedEvent() внутри кадра (это обеспечило дикое, по моему мнению, количество выделений памяти).

Здесь я расскажу ещё и о том, что в проекте всюду использовался std::string (и wstring) (на самом деле был самодельный клон, который по своей сути работал точно также, но позволял делать гадкую вещь – присваивать юникодным контейнерам неюникодные строки и наоборот, в остальном – тоже самое).

При старте игры зачитываются xml конфиги, из которых вычитываются пути к почти всем ресурсам и загружаются сразу в память. После этого вступительные ролики и главное меню.

В общем в результате при входе в главное меню у нас наблюдалась картина:

nAllocatedBlocks 47089
nAllocatedSize 14563733
peakAllocationSize 17645007

Как мы видим – 47 тыс аллокаций, дающих в результате 14,5 МБ.

Решено было перевести такую безобидную вещь, как Filename (т.е. имя файла с ресурсами, которые загружаются и по которым потом работают ещё всякие мапы и прочие поиски – тоже зло, конечно) с std::wstring (а иногда std::string) на фиксированую строку rk::String<1024> (в зависимости от настроек компилятора она внутри или char, или wchar_t, в нашем случае wchar_t).

Возни при переделке было очень много. Из злобных вещей, которые сразу всплывали – были “неявные” конверсии между ANSI – Unicode – т.е. выражение вида std::wstring filename = “texture.png” на самом деле вызывало бурю эмоций у системы, т.к. нужно было сначала создать строку ansi, создать буфер в памяти, сконвертить её в юникод и потом записать в целевой контейнер. И это только потому что автор забыл написать перед строчкой букву L (L”text”). Ну а поскольку встречались эпические куски кода, где разные строки конкатенировались  из фрагментов, где часть была анси, а часть юникод, чтобы получить полный путь к ресурсу – то получаемый оверхед представляется значительным.

После того, как весь код, связанный с именами файлов был переведён на фиксированые строки и использование только юникодных строк у нас получилась следующая картинка в главном меню:

nAllocatedBlocks 16978
nAllocatedSize 10259790
peakAllocationSize 12734865

Как мы видим – количество произведённых аллокаций уменьшилось почти в 3 раза, это в основном заслуга того, что исчезли неявные конверсии кодировок.

А вот выигрыш по памяти – почти 5МБ (30%) – это уже серьёзная заявка на успех, при том, что rk::String<1024> явный оверкилл и перерасход для имён файлов, длина которых врядле превысит 128 символов (хотя скорее всего здесь была или жуткая ошибка в логике игры, и строки плодились, как кролики, или странная странность в измерениях, но это поведение я буду и дальше изучать, вместе с дальнейшим выпиливанием динамических строк).

Собсно что я хотел рассказать в этом посте:

Старайтесь использовать фиксированые строки. Как правило, в игровом коде нету необходимости динамически менять строки и делать с ними всякие гадкие вещи. Если же вы видите, что ну никак без этого не обойтись – то это скорее всего из-за того, что, либо у вас очень высокая квалификация и вы точно знаете, что делаете и как оно будет работать, либо у вас наоборот – не очень высокая квалификация – и тогда стоит подумать ещё над проектом – может всё-таки найдётся возможность обойтись?

Не смешивайте в рамках одного проекта разные кодировки, особенно с неявными преобразованиями (их вообще лучше запретить под страхом луча поноса в сторону автора). Изначально определитесь, ANSI, UTF-8, UTF-16 или ещё что-то и пользуйтесь чем-то одним. Идеально – все статические строки оборачивать макросом типа _T(), который на основании настроек компиляции будет выбирать кодировку. Этим вы облегчите жизнь не только себе, когда внезапно окажется, что нужно делать японскую локализацию, но и тем людям, которые в будущем будут поддерживать ваш код. Ну и избежите ненужного оверхеда 🙂

ЕДАПС и люди

Побывал я сегодня в таком замечательном месте, как “межрегиональный центр бла-бла-бла по оформлению загранпаспортов”, который находится на территории концерна ЕДАПС – крутых производителей всяческих защищённых бланков, даже для интерпола документы изготавливают.

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

По древней советской традиции занимать очереди задолго до открытия – я туда поехал совсем рано и прибыл к ним где-то в 7:30 утра. Возле домика охраны нашёлся листик со списком фамилий, я туда дописался третьим и пошёл в машину спать.

Где-то в 8:50 отправился я вовнутрь, а там оказалось, что листик наш никому не нужен – там поставили автомат для выдачи талонов в электрическую очередь. Подходишь, набираешь фамилию, получаешь талон с номером, садишься ждёшь. В общем стал я одинадцатым.

Моя очередь подошла где-то к 10 часам, оказалось, что кроме той макулатуры, которую я принёс по списку с веб-сайта, для действующего заграна ещё нужна была копия первой странички – 60 копеек и мне её сделали по месту.

Оформили мои документы и отправили платить в кассу. Тут начинается самое интересное 🙂

Оплатить надо 4 разных платежа, поэтому хитрый банк берёт 4 раза комиссию – по 10 грн. Госсбор 8.5, а комиссия банку 10 – прелестная прелесть.

Ещё они принимают карточки, но при этом будет ещё +2% комиссии.

Вапще в зале я заметил хитрый аппарат, который вроде как тоже принимает деньги к оплате, но на нём большими буквами написано, что он сдачу не возвращает, поэтому я побоялся к нему идти, а зря – т.к. на самом деле у меня платежей была довольно круглая сумма – 398 грн. Надо, чтобы кто-то проверил – можно ли там сэкономить 30-40 грн? 🙂

Дальше я попал в новую очередь – уже на получение моих “персональных данных” в виде фото и подписи. Когда настал мой черёд – меня посадили на стульчик перед которым прикреплён жёстко фотик и в лицо смотрит монитор, на котором дублируется информация, которую вводит тётенька – прикольно так.

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

Чтобы сохранить старый документ – надо оплатить госсбор около 60 грн и, как мне показалось, они не очень приветствуют такое, т.е. нужно придумывать обоснование вида “у меня там действующая виза”, что в моём случае даже правда 🙂

Ещё, как я понял по соседям в очереди – если паспорт заменять, то старый не возвращают с пометками “анулирован” или как-то ещё – можно только получить выдранные странички с визами.

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

Чудеса в решете (или упрощение визового режима с ЕС)

Внезапно оказалось, что теперь не надо подавать справку с работы (которая про зарплату и отпуск), справку из банка (с состоянием счёта) и копию трудовой, чтобы оформить краткосрочную визу.
Достаточно анкеты с фото, паспорта (куда ж без него), бронировку жилья (или приглашение) и мед. страховку (тоже полезная вещь).
Афигеть, так сказать.
Вот ссылка на достоверный источник 🙂
http://www.kijowkg.polemb.net/index.php?document=291

3G Модем GOBI 2000 в Украине

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

Я начал изучать eBay на предмет подходящей мне железке и увидел дивного зверя – Qualcomm Gobi-2000: модем, умеющий и CDMA (EV-DO) и GSM (UMTS). Вся сила в прошивках, которые загружаются при старте – нужен один стандарт, загрузили одно, нужен другой – загрузили второе. Вторым, приятным сюрпризом было наличие встроенного GPS модуля. Двухядерный нетбук за 400 долларов с 3G и GPS? – Это веселее любого планшета за тыщу баксов 🙂

Но самое вкусное, что было у этого модуля – это цена: 39$ за брендовый HP un2420 с доставкой! С радостью купил бы не HP, но их под маркой Qualcomm видимо только крутым фирмам поставляют, а те уже делают из них “свои” модемы.

В общем заказал я у китайцев эту игрушку и буквально через 10 дней она уже была у меня дома, за что отдельное спасибо “Укрпоште”, они явно стали порасторопней чем в былые времена.

Модем прекрасно подошёл в разъём, антенна тоже, система загрузилась, нашла новое устройство и началось…

Как я заводил модем и подключал его к CDMA (EV-DO) оператору “Интертелеком”: читайте в следующем псто )

Новый нетбук

Нахлынуло на меня недавно желание “апгрейднуть” свой нетбук. Старый MSI Wind U100 с атомом внутри и 2ГБ памяти как-то уж очень медленно всё пережёвывал, а жил всего полтора часа от силы…

Решил я купить замену, а поскольку планшет за тыщу баксов меня давила жаба покупать, то я решил обойтись новым нетбуком. Начитавшись хотлайнов и прайс-уа я вычислил самую подходящую машинку – Gigabyte Q1105.

В сравнении со старым 10″ другом у новичка чуть побольше размеры – 11.6″ – но при этом всём, он держит батарею в 2.5 раза дольше, а весит даже меньше!

Поддерживает Wi-Fi b/g/n, и при тесте дома c n-ным роутером он вытягивал торренты со скоростью 8-9 МБ/с – что много круче 2.5МБ/с раньше через b/g!

Внутри стоит двухядерный пентиум, который чуть-чуть слабее моего домашнего старого Core 2 Duo E6300, памяти 4 гига и 64 битная ОС. Экранчик с LED подсветкой и разрешением 1366х768 – сразу скажу, что разница с 10″ 1024х600 огромная! Мне даже удалось в MSVC поработать и не сильно мучиться маленьким экраном и “тормознутостью” – всё было очень даже гуд.

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

Впрочем… недостаток этот с лихвой компенсируется ценой аппарата в 350 баксов! Купить за такие деньги не-атом в общем-то почти нереально.

Подведя итог двухнедельного использования могу сказать, что аппарат просто прекрасен и даже может приносить пользу в дороге или поездках, за счёт большего разрешения и времени жизни а также скорости работы. В отличие от своего предшественника, который был условно полезен, а о работе на нём даже речи не могло быть этим аппаратом можно очень успешно пользоваться (и смотреть фильмы 🙂 ).

А ещё в нём обнаружился слот и антенная разводка для 3G модема, что, конечно же не могло меня не зацепить, но об этом в следующих постах 🙂

Про евро 2012

“Із задоволенням повідомляємо, що Вашу заявку на придбання квитків на матчі УЄФА ЄВРО 2012™ було успішно відібрано”.

Никогда не ходил на футбольные матчи, но тут подумал, что всё ж не каждый год у нас такое мероприятие проводится и попробовал принять участие в билетной лотерее (желающих посетить матч больше, чем мест на стадионе, поэтому проводится лотерея на право купить билет 🙂 ).

Я выиграл один из 4 моих заказов 🙂

Теперь я могу идти 11 июня на первый матч нашей сборной, который будет в Киеве, ура 🙂