среда, 7 августа 2013 г.

Xiaomi Mi2s

Почему именно он

Я давно наблюдаю за темой топовых китайских смартфонов и не устаю поражаться сочетанием их цены и функциональности. По этому показателю они оставляют далеко позади всех конкурентов. Правда с началом продаж в России цены взлетают высоко вверх (что можно наблюдать по Meizu MX2 и Oppo Find 5), но возможность заказать телефон из Китая по более привлекательной цене всегда остается.

Xiaomi меня привлек тем, что за небольшие деньги дает мощную начинку в компактном размере. Полгода изучения форума привели к выводу, что серьезного уровня брака нет, а значит, аппарат можно брать.

Итак, что мы имеем

Внешность

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

Экран прикрыт "стеклом" Asahi Dragontrail (ходят слухи, что это аналог Corning Gorilla Glass, но нормального сравнения их я не видел). В теории стекло очень стойкое и его невозможно поцарапать ключами или ножиком, но песочком царапается "на ура".

Из коробки аппарат идет только с белой крышкой, но есть много разных официальных цветных: глянцевые, матовые, металлик, "кожа крокодила" и неофициальных (например, под iPhone 5).

В руке аппарат лежит неплохо, чуть хуже, чем SGS4 Mini (чувствуется разница в скосе углов), но им все еще можно комфортно управлять одной рукой (ширина в 62 мм - всего на 3 мм больше, чем у iPhone - решает).

Начинка

Внутри стоит один из самых мощных чипов на сегодняшний день: Qualcomm Snapdragon 600: 4 ядра CPU APQ8064T (Krait) 1.7 ГГц и 4 ядра GPU (Adreno 320). Что это значит:
  • На текущий день нет ни одного приложения или игры, которые могли бы на нем тормозить (не тормозя при этом на чем-то другом);
  • Процессор настолько быстрый, что даже в режиме энергосбережения интерфейс летает (нетипично для андроида, правда?);
  • Если будете долго играть во что-то серьезное (не обеспечив вентиляцию), то можно получить серьезный нагрев и перегрев (вплоть до повреждения экрана).
На предыдущей модели -  Mi2 (без "s") установлен процессор чуть попроще - APQ8064 1.5 ГГц.

С радиочастью не все гладко. Во-первых, отсутствует WCDMA 900, а значит, в некоторых местах в России телефон будет выпадать из 3G в EDGE. А, во-вторых, антенны распложены в нижней части устройства. И там, где сигнал сети не очень сильный, он становится еще слабее. Иногда можно перевернуть аппарат, но, например, разговаривать так можно разве что по громкой связи или гарнитуре.

Экран в телефоне - производства Sharp, 4.3" 720x1280, 342 ppi. Естественно, IPS. Сколько я не приглядывался, отдельных пикселей заметить не смог. Под микроскопом, естественно, разница с 441 ppi (5" Full HD) будет очень значительная. Есть автоматическая регулировка яркости. В режиме энергосбережения экран немного тускнеет.

Говорят, что экран Mi2/Mi2s проигрывает экрану Meizu MX2. Не знаю, одновременно я их в руках не держал, только по очереди с большой разницей во времени. Но, например, на фоне Oppo Find 5 Xiaomi не теряется.

Камера здесь стоит довольно хорошая: в Mi2 и Mi2s 16Gb - Sony Exmor R f/2.0 8 Mpix, в Mi2S 32Gb - Sony Exmor RS f/2.2 13 Mpix (такая же, как в SGS 4 и, по слухам, iPhone 5s). Но софт для обработки снимков вылизан не так хорошо, как у Samsung. Поэтому фоточки получаются не великолепные, а просто очень хорошие. Есть HDR, который иногда позволяет получить кадры, невозможные для обычной камеры. При съемке видео так же есть HDR и есть замедленная съемка.

Управление камерой довольно удобное. Можно спускать затвор клавишами громкости (обеими). Можно фокусироваться на объекте и сразу делать снимок одним тапом по экрану (если успеете сделать тап быстрее, чем сработает автофокус, то снимок не сделается, вместо этого будет сделан focus lock на несколько секунд). Также есть следящий автофокус, распознавание лиц/улыбок и прочие современные фишки/плюшки.

На 13 Mpix камере фоточки получаются очень большими (6-6,5 Мб JPEG).

Примеры фоток можно посмотреть здесь (папка в dropbox).

Комплектная батарейка имеет емкость 2000 MAh. Несколько дней она входит в рабочий режим, потом начинает работать очень хорошо. Если устраивает режим энергосбережения, то батарейки точно будет хватать на световой день. Например, у меня сейчас осталось 49% (с зарядки снял утром). При том, что ходит куча уведомлений (твиттер, почта, RSS). Если много фоткать, да еще и в HDR, то, конечно же, заряжать придется 2 раза в сутки.

Также можно купить батарейку на 3000 MAh, но к ней идет другая крышка (аппарат становится толще) и выглядит уже не так красиво.

MIUI

Одним из главных достоинств аппарата является его оболочка над Android - MIUI: быстрая (говорят, что на других аппаратах она тормозит, но здесь я не заметил тормозов), сильно настраиваемая и очень удобная. Когда очередной яблодрочер начнет говорить вам, что интерфейс Android - корявый, нелогичный и непонятный, просто спросите его, видел ли он MIUI. Как правило, оказывается, что не видел. А, между тем, Xiaomi делает гораздо более привлекательный интерфейс, чем Google или (не к ночи будь помянут) Samsung. Если вы никогда не сталкивались с MIUI, прочтите для начала парочку обзоров. Хотя бы этот или тот.

Прошивка

Поскольку, аппарат официально продается только в Китае, что из коробки в нем установлены только английский и китайский языки. Но перепрошивка в русский достаточно проста. Скачиваете 1 архив (я взял miui.su), кладете его в корень под именем update.zip и перезагружаетесь в режиме Recovery (громкость вверх + питание). После этого говорите "перепрошить из update.zip" и voila - все готово. После этого прошивка от miui.su может сама находить обновления.

И что в итоге?

Стоит ли аппарат своих денег (да еще и с учетом того, что покупать придется не у производителя, а у перекупщиков)? Mi2, цена на который снижена с выходом Mi2s - стоит однозначно. Mi2s 32Gb - уже заставляет призадуматься, поскольку его цена приближается к Meizu MX2 РСТ и Oppo Find 5 (да, это уже лопата, но Full HD - это Full HD). Но если вас не пугают минусы аппарата, то брать, на мой взгляд, стоит.

Update: где и за сколько купить

Лучше всего вкурить соответствующую тему на 4pda. Ленивым можно сразу сходить на http://fulcrumall.com или http://hotmid.com. В зависимости от модели (Mi2 или Mi2s) и объема памяти, а также наличия или отсутствия акций и купонов, цена может быть в диапазоне $250-450.

четверг, 27 июня 2013 г.

Oppo Find 5

На работе для тестирования разрабатываемых приложений на разрешении XXHDPI купили смартфон Oppo Find 5 (Full HD на 5"). И вот какие у меня о нем впечатления.

Для пользователя

Первое, что бросается в глаза -- это, конечно же, экран. Большой, красочный. И очень четкий. Точки здесь не разглядеть даже под лупой, не говоря уже про невооруженный глаз. Смотреть видео или играть в игры (благо 4 ядра Snapdragon S4 Pro позволяют это делать без проблем) -- одно удовольствие.

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

Камера вроде бы неплоха, но толком я ее не тестировал.

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

Для разработчика

Из коробки аппарат не определяется ADB, а значит отладка (и даже простой запуск приложений прямо из IDE) на нем не работают. Тем странным людям, которые ведут разработку под Andoroid из Windows, придется сначала скачать и установить драйвера с сайта Oppo, а потом настраивать. Под Linux достаточно одной настройки:

Сначала создаем (редактируем, если был) файл /etc/udev/rules.d/51-android.rules, записывая в него строку:
SUBSYSTEM=="usb", ATTR{idVendor}=="22d9", MODE="0666", GROUP="plugdev"
Не забываем сделать файл доступным на исполнение.

После этого открываем файл ~/.android/adb_usb.ini и дописываем в него строку
0x22D9
Это, как несложно догадаться, VendorID для Oppo.

Сам телефон необходимо при подключении по USB устанавливать в режим MTP. Все, отладка из IDE работает!

среда, 24 апреля 2013 г.

А есть ли кризис ИТ-кадров в Ижевске?


Помнится, Олег Вылегжанин любит повторять, что в Ижевске настал кризис ИТ-кадров. Но так ли это на самом деле? Для компаний уровня ЦВТ или, скажем, НПО "Компьютер" - вполне возможно. А вот для менее крутых крупных компаний это зачастую не так. Или так, но они тщательно скрывают это от кандидатов на работу :-)

Так в чем же выражается отсутствие кризиса кадров в ИТ? Прежде всего в том, что компаниям не нужны специалисты. Это звучит странно, но это действительно так. Очень многие компании не хотят брать на работу даже мидлов, не говоря уже про сеньоров. Они готовы брать джуниоров. Или не брать никого, если вдруг джуниор не найдется. Рассмотрим эту ситуацию на паре примеров.

Пример первый и достаточно нетипичный - я. В 2012 году я стал серьезно подумывать о том, чтобы сделать свое хобби основной работой (переквалифицироваться из десктоп-разработчика в мобильного). К тому времени у меня уже был некоторый опыт разработки под Java (ME) и плюс я прокачивал свои скиллы в разработке под Android. Поскольку компания, где я тогда работал, не хотела заниматься разработкой мобильных приложений (предпочитая отдавать все на аутсорсинг или даже партнерам), то оставалось только искать другого работодателя. Поскольку я не был супервыгодным кандидатом (общие технологии разработки у меня, конечно, были прокачены довольно круто, но конкретно в Android я тянул только на джуниора), то начал я довольно осторожно - не с рассылки резюме, а с вопросов: какого уровня кандидаты вообще нужны. Результаты были довольно обескураживающие. Некоторые компании вообще не отвечали на вопросы (как так можно, я, честно говоря, до сих пор не представляю), некоторые открыто заявляли:"Нам нужен джуниор, если вы хотя бы мидл, то пообщаться можно, но все равно мы вам можем предоставить условия только как джуниору". Особенно странно это было слышать от тех компаний, где нет сильной команды способной быстро подтянуть джуниора до своего уровня. А может, я просто чего-то не понимаю в найме людей и теория, что лучше взять готового специалиста, который сможет писать продукт (и писать качественно) с первого рабочего дня, уже безнадежно устарела?

В 2013 я все-таки стал искать работу более активно. Но общение с компаниями только подтверждало выводы от предыдущих наблюдений.

Первая компания сказала: "Мы вас совсем не знаем, поэтому можем считать вас только джуниором и предоставить соответствующие условия". Мне до сих пор интересно, какое слово из моего резюме им неизвестно? Или им неизвестен уровень ПО, которое я разрабатывал (проектировал, руководил разработкой и т.д.)? Если так, то тут помочь я им не могу, оценивать уровень ПО, производимого компанией №1 в регионе, надо все таки уметь самостоятельно.

Вторая компания сказала: "Мы понимаем как ты крут, но у нас тупо нет денег, чтобы платить тебе столько, сколько ты стоишь. Так что мы поищем пока типичного джуниора. А потом, если деньги появятся - еще одного". Ну это хотя бы было логично, потому что компания имеет действительно классную команду, способную быстро развивать новичков.

Третья компания извинилась, что дезинформировала меня насчет вакансии и предложила другую работу. Мне ничего не оставалось, кроме как отказаться.

В конце концов я нашел место, где меня смогли оценить и предложить то, что мен было надо, но, сдается, что я попал скорее на исключение, чем на правило.

Второй случай произошел совсем недавно. Я пытался устроить одного своего знакомого, который (в отличие от меня) является сеньором безо всяких скидок и поправок. Причем устроить я его пытался на вакансию, которая максимально точно соответствовала его специализации. Ответ компании (а я общался тоже с хорошо знакомым мне человеком) меня совершенно убил: "Нам надо несколько джуниоров на смешную зарплату". Все, точка. И люди даже не хотят общаться на предмет того, что специалист на текущем месте легко выполняет объем работы за 3-4 джуниоров. Или что у него все скиллы прокачаны больше, чем у текущей команды вместе взятой. Просто не надо и все, хоть головой об стену убейся.

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

PS. Комментировать можно не только здесь, но и на ИжАйТи.

суббота, 20 апреля 2013 г.

Android: пишем свои стили для ActionBarSherlock и HoloEverywhere

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

Генератор стилей

Конечно же, начинать работу со стилями луче не с нуля, а с использования генератора стилей. И тут нас поджидает засада №1: генератор не может отдать пакет, который будет работать одновременно и в Android 2.* + ABS + HE, и в Android 4.*. Связано это с тем, что стили он именует либо в новой нотации ("android:actionBarStyle"), либо в старой ("actionBarStyle"), но не одновременно. Поэтому придется дописывать блок с именами стилей вручную. Ну и не забудьте, конечно, указать теме правильного родителя (например, Holo.Theme.Light.DarkActionBar).

Применение стилей

Дальше мы начинаем применять стили и... HoloEverywhere тупо вылетает на том, что это не его стандартный стиль. Что же делать? Иногда помогает переименование своего стиля в "AppTheme", но если серьезно доработать стиль (чтобы применять его для элементов HE, а не только ABS), то и это не помогает. На помощь приходит решение, подсмотренное на (сюрприз! сюрприз!) Stack Overflow: в design-time выставляем стандартную тему, а первой строкой onCreate(), даже до вызова super пишем:
setTheme(R.style.AppTheme);
И voila, как говорят французы. Все работает!

вторник, 16 апреля 2013 г.

Android: настоящий wrap_content по ширине для ListView

По умолчанию список (ListView) в Android растягивается на всю ширину контейнера. Иногда это бывает не слишком удобно и хочется сделать так, чтобы он занимал ширину строго по содержимому. Как же быть?

Начинающий разработчик воскликнет: "Элементарно! Выставим для ширины значение "wrap_content" и все станет шоколадно!" Я сегодня сказал так же. И даже сделал. Но ничего не сработало.

Как обычно ответ нашелся на stack overflow. Самый популярный ответ говорил, что ничего сделать нельзя. Ведь элементов списка может быть несколько миллионов и на вычисление ширины может уйти несколько часов. Но если промотать ветку до конца, то там обнаружится вполне себе рабочее решение, которое отлично работает для небольшого списка. Единственное, что мне там не понравилось - так это не очень удобные параметры для вызова извне. Поэтому я доработал код до обертки, которую удобно вызывать:
public class ViewUtils {
    private static int getWidestView(Context context, Adapter adapter) {
        int maxWidth = 0;
        View view = null;
        FrameLayout fakeParent = new FrameLayout(context);
        for (int i = 0, count = adapter.getCount(); i < count; i++) {
            view = adapter.getView(i, view, fakeParent);
            view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
            int width = view.getMeasuredWidth();
            if (width > maxWidth) {
                maxWidth = width;
            }
        }
        return maxWidth;
    }

    public static void setListViewWidthByContent(ListView listView) {
        listView.getLayoutParams().width = (int) (getWidestView(listView.getContext(),
                listView.getAdapter()) * 1.05);
    }
}

суббота, 6 апреля 2013 г.

Как мы не стали чемпионами


6 апреля состоялся первый открытый чемпионат Ижевска по игре "Что? Где? Когда?".

Когда я в первый раз прочитал анонс турнира, то мне захотелось тряхнуть стариной и собрать старый добрый сильный состав команды "НПО Компьютер". Сказано -- сделано. Удалось собрать почти что самый первый состав команды (с которым мы играли на первом этапе Кубка Мира в 2003 году): Анна Тернавская, Артем Старыгин, Василий Бабинцев, Константин Чермак, Андрей Подкин и, капитан команды, Рафаэль Гиззатуллин.

Организация турнира была на высоте. Место проведения: Театр оперы и балета. Спонсор: Ростелеком. Собственно проведение: Ижевский клуб "Что? Где? Когда". К слову сказать, на этом мероприятии раздавала свои визитки конкурирующая организация, клуб "60 секунд", проводящий игры в гриль-баре BBQ.

Честно говоря, я, да и другие игроки команды, как выяснилось, ожидали увидеть небольшую тусовку "для своих", но мероприятие оказалось довольно масштабным, играло около 60 команд. Среди них были и те, кого мы видели еще в 2003, когда большое интеллектуальное движение в Ижевске еще только зарождалось, и новички, пришедшие играть по сути первый раз.

После получения бланков немного удивила вопросная дистанция -- всего 24 вопроса. Мы, конечно, не ждали 75 или даже 90 вопросов, как бывает на иных турнирах, но все же для чемпионата (или более правильно -- кубка) города логично ждать хотя бы 36 вопросов.

После традиционной задержки игра началась. Звучит разминочный вопрос и... мы с Костей понимаем, что нам размяться не дали: вопрос оказался за его авторством и моей редактурой (собственно вопрос отправлялся для школьного чемпионата). Ну да ладно, мы птицы люди не гордые, можем играть и без разминки.

Первый и второй вопросы игры оказались до того легкими, что слегка расслабили нас. И уже третий прилетел как щелчок по носу -- первый минус. Снова собрались, спокойно взяли 4 подряд вопроса и ... обидно слили восьмой, хотя все, что нужно для его взятия, было на столе. Потом, видимо, по инерции слили еще один, но все таки дожали тур до конца с результатом 9 из 12.

После объявления итогов оказалось, что впереди нас 8 команд, причем лидеры опережают нас на 2 очка (они взяли 11 из 12). Неприятно, но не смертельно.

Поняв, что отступать уже некуда, второй тур мы заиграли так, чтобы не было мучительно больно за бесцельно прожитые годы показать свои притязания на высокие места. Итог: абсолютно лучший результат второго тура: 11 из 12.

Лидеры же -- напротив, несколько сдали и после 24 вопросов мы делили места с 1 по 4. А это значит, что началась перестрелка из 3 вопросов.

Первый вопрос перестрелки мы не взяли и на мгновение у меня даже пронеслась мысль, что это конец. Но нет, это оказался всего лишь первый "гроб" и все 4 команды продолжили свою борьбу.

Второй вопрос мы взяли довольно уверенно, а одна из команд на нем отсеялась. Следовательно, мы уже призеры. Оставалось только выяснить, какие именно.

Третий вопрос перестрелки мы слили, имея правильную версию на столе. Впрочем, как оказалось позже, это ни на что не повлияло бы. При равенстве баллов места между командами распределялись согласно рейтинга взятых ими вопросов (у вопроса тем больше рейтинг, чем меньше команд его взяло). Мы по такому показателю оказались на чистом втором месте, пропустив вперед только команду "Habemus Papam".

В качестве приза мы получили по "электронной книге" (по сути это мини-планшет с резистивным экраном) Ritmix на каждого игрока, одну грамоту и один сертификат на бесплатную игру в Dozor.

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

воскресенье, 24 марта 2013 г.

Заметки о рутовании

Рутанул свой LG Optimus One. Если кто-то будет делать то же самое, вот несколько полезных вещей:
  • для того, чтобы обновить бинарник su (из приложения superuser) необходимо перемонтировать файловую корневую систему в r/w (например, можно это сделать в ES Explorer);
  • один из безболезненных методов расчистки места: найти данные (/data/data) и кеши (/data/dalvik-cache) от уже удаленных приложений и удалить их;
  • еще один безболезненный способ расчистки места: удалить встроенное приложение, поставить его из Google Play и снова сделать системным (эффект тем больше, чем больше занимали обновления приложения);
  • покупка ключа к Titanium Backup заставляет его работать быстрее на несколько порядков;
  • при удалении системных приложений не забывайте постоянно перезагружаться и устанавливать отладку по USB.