Search
Write a publication
Pull to refresh
10
0
Сысолятин Павел @PSyton

User

Send message

Android JNI + Intelij Idea + Gradle. Полная автоматизация процесса

Reading time4 min
Views13K
Доброго времени суток!
Данный пост является небольшим руководством, по автоматизации компиляции нативного кода в среде Intellij Idea с использованием Gradle. Gradle предоставляет достаточно большой функционал для автоамтизации сборки проектов. Но даже подключение нативных библиотек к Android проекту требует дополнительных усилий со стороны разработчика.

Предыстория


Недавно я сменил место работы и устроился работать в компанию, занимающуюся разработкой собственного мобильного программного обеспечения. Мы с моими новыми коллегами по работе решили перейти с Eclipse (на котором до этого велась вся разработка) на Intellij Idea, и в добавок с Ant на Gradle. У нас достаточно большой проект, с приличным количеством кода, в том числе с использованием нативного C и C++ кода, как самописного так и уже готовых библиотек.

Тех, кто занимается разработкой Android проектов с использованием Android NDK в среде Intellij Idea + Gradle прошу под кат.
Читать дальше →

Внедрение зависимостей в C++

Reading time7 min
Views32K
MagicClass::getInstance().getFooFactory().createFoo().killMePlease();

«Внедрение зависимостей» и «Статическую типизацию» трудно назвать лучшими друзьями на все времена. Некоторые наработки в этом направлении существуют и легко гуглятся, однако интересно, насколько реально создать собственную простую реализацию баз хаков, ловких ухищрений и подключения внешних библиотек. Без особой гибкости, вот чтобы буквально два действия — настройка и внедрение. Вопросы многопоточности затрагиваться не будут, чтобы не отвлекаться от основной идеи. Итак, что же лично я хочу от внедрения зависимостей.

Постановка

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

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

Упрощенный доступ к объектам. Информация, какой объект откуда можно получить чаще всего совершенно неинтересна. Более того, она отвлекает от базовой функциональности и способствует более сильному связыванию подсистем проекта, чем того хочется. Также нежелание программиста продумывать адекватные точки доступа к добавляемым сервисам может негативно сказаться на общей архитектуре системы. «В последние дни я получал почти все нужные мне объекты из модуля номер N, закину и эти туда же...».

Рабочий вариант с тестовым примером можно взять отсюда.
Читать дальше →

Ввод паролей при сборке проектов с помощью gradle

Reading time3 min
Views6.1K
При сборке проектов для Android Gradle позволяет указать некоторые параметры, позволяющие собрать и подписать пакет, готовый для загрузки в Google Play. Однако, вряд ли стоит загружать некоторые данные, такие как пароль от приватного ключа в публичный репозиторий. В статье, перевод которой ниже, автор рассматривает способы ввода приватной информации, такой как пароли, во время сборки проекта.

Gradle позволяет получить доступ к консоли с помощью метода System.console(). Консоль предоставляет метод для чтения паролей, поэтому для ввода пароля можно использовать:
def password = System.console().readPassword("\nPlease enter key passphrase: ")

Теперь можно использовать пароль в любом месте скрипта сборки, и все готово… ой, тогда это будет слишком короткий пост, поэтому теперь поговорим о проблемах.
Читать дальше →

Произвольный порядок списка инициализации шаблона

Reading time4 min
Views6K
Думаю многие кто работает с шаблонами, знакомы со следующей ситуацией. У нас есть некий шаблонный класс с кучей шаблонных параметров

struct deferred;
struct deadline;
struct disable;

template<class T, class Deferred = disable, class Deadline = disable>
struct some_container

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

typedef some_container<int, disable, deadline> deadline_container;
<source>
А хотелось бы 

<source lang=cpp>
typedef some_container<int, deadline> deadline_container;

А ещё лучше, что бы даже порядок задания не имел значение и следующие два, были бы эквивалентны

typedef some_container<int, deferred, deadline> full_container1;
typedef some_container<int, deadline, deferred> full_container1;

Но мы прекрасно понимаем, что как только мы поменяли два параметр у нас получится совершенно не то чего мы ожидали (это вам не tuple где порядок указание не имеет значении)
Думаю многие уже подумали о том, что всего этого можно добиться добавив прослойку между нашим типом и пользователем, для которой написать все возможные специализации. Если у вас только 2 шаблонных параметр то да, если 3 то уже сложно, а если добавится 4, 5 то пиши пропало. Да и как правило добавление нового параметра приводит к переделыванию всех предыдущих специализаций (так как в специализации мы не можем увеличивать число шаблонных параметров, а можем их только уменьшать).
Если вас заинтересовало, прошу под кат, я покажу вам как добиться этого
лёгким путём

BDD-разработка на django

Reading time6 min
Views17K
Программисты очень по разному относятся к тестированию, и многие не любят писать тесты. Процесс TDD же для новичков не особенно понятен — ведь приходится вместо функционала программы писать вначале тест, который его проверяет, то есть количество работы увеличивается. Однако со временем приходит осознание того, что автоматическое тестирование необходимо. К примеру, возьмем процесс разработки даже несложного проекта на django, пока в проекте пара вьюх и моделек все просто. Когда приложение обрастает функциями, внезапно обнаруживается, что совершать такое тестирование все сложнее — кликов больше, надо вносить какие-то данные и т.д., вот тут-то и на помощь приходит behavior-driven development (BDD).

image

Я хочу рассказать о BDD на примере создания примитивного приложения — рейтинга сайтов. Идея тривиальна — на странице отображается список сайтов, пользователь голосует за сайт, сайт поднимается в рейтинге и соответственно изменяет положение на странице.
Читать дальше →

Интеграция Android Studio, Gradle и NDK

Reading time5 min
Views47K
В свете недавних изменений (начиная с релиза 0.7.3 от 27 декабря 2013) новая система сборки под Android становится очень интересной в том числе и для тех, кто использует NDK. Теперь стало действительно просто интегрировать нативные библиотеки в вашу сборку и генерировать APK для различных архитектур, корректно обращаясь с кодами версий.
Читать дальше →

Отладка Android CMake проекта по-взрослому

Reading time6 min
Views14K

После перевода наших проектов на CMake, встал вопрос об отладке нативной части Android. Так как инструменты NDK стали неактуальны, пришлось залезть в дебри и научить Eclipse запускать удалённую отладку CDT-проекта, что называется, вручную. В идеале, чтобы это выполнялось в один клик.

Если вам не чужда разработка с использованием Android NDK, и вы хотите познать некоторые тонкости отладки, велкам под кат.
Читать дальше →

Парсинг формул в 40 строк

Reading time2 min
Views38K
Иногда бывает интересно взять какую небольшую задачку(по типу тех, что дают на собеседованиях) и найти для нее необычное решение.
В этот раз такой это стала задача от Яндекса. В самом посте и в комментариях было предложено несколько вариантов решения, темой этого топика станет поиск короткого решения в функциональном стиле.
Читать дальше →

Об открытости данных в Android-приложениях

Reading time6 min
Views39K
Немного информации о том, какие данные в вашем приложении могут быть доступны для других программ и какие меры можно предпринять, чтобы это предотвратить.


Читать дальше →

Вышла первая версия модуля интеграции Cppcheck в Visual Studio с открытым кодом

Reading time1 min
Views9.8K
Здравствуйте, с вами снова говорит редактор блога ABBYY. На днях ко мне пришли разработчики и принесли с необъятных просторов ГитХаба новость, которая не имеет прямого отношения к нашей компании, но, по их словам, порадует всех наших разработчиков, а заодно и многих не наших. Коллегам они уже рассказали на кухне, для остальных — этот пост.

Продолжаем стихийный сериал о статическом анализе кода на C++ (предыдущие серии: один, два, три, четыре, пять, шесть, семь). Бесплатный анализатор с открытым кодом Cppcheck до недавнего времени отличался фатальным недостатком – не было модуля для его интеграции в Visual Studio.
NO MOAR!

Как сверстать веб-страницу. Часть 2 — Bootstrap

Reading time19 min
Views699K

Введение


Уважаемый читатель, эта статья является второй частью цикла статей, посвященных вёрстке.

В первой части мы верстали шаблон Corporate Blue от студии Pcklaboratory с помощью стандартных средств на чистом HTML и CSS. В данной статье мы попробуем сверстать этот же шаблон, но с помощью CSS фреймворка Bootstrap 3.
Читать дальше →

Не все комментарии одинаково полезны

Reading time7 min
Views34K
Все животные равны, но некоторые животные равнее других. Скотный Двор, Джордж Оруэлл (оригинал).

Достаточно много статей на хабре набирает существенное количество комментариев, e.g. в статьях "лучшее за месяц" их, как правило, более сотни. За годы чтения хабра, создалось впечатление, что примерно в половине случаев для комментариев первого уровня получается вот такая вот картина

(картинка сделана на основе хабра-статьи «Список скептика»).

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

Deploy с помощью Salt

Reading time8 min
Views34K

До сих пор во многих компаниях deploy создает большие проблемы и может занимать дни, недели и в особо запущенных случаях месяцы. Но ситуация не безнадежна. Существует много инструментов и практик, способных помочь в этом нелегком деле. Вот только эти инструменты чаще всего за один-два дня не освоишь, а сроки горят.

Чего обычно хочется:
  • Возможность поднять проект локально на машине разработчика. Весь или хотя бы частями. Причем очень хочется, чтобы Dev конфигурация отличалась от Prod в минимуме параметров. Это позволит избежать “work on my machine” багов. Да и вообще, когда один разработчик работает на OS X, другой на Windows, а продакшен на Debian, то жди беды, это не считая того, что каждый делает работу по настройке окружения.
  • Dev конфигурацию хочется разворачивать на любой машине и ОС в пару команд в консоли. Это опять же позволит уменьшить фактор “work on my machine” багов. А еще позволит привлекать других разработчиков в проект за минимальное время (vagrant up и поехали).
  • Конфигурация должна быть понятна и программисту, и админу.

Всего этого мы добьемся на связке Salt + Vagrant на примере Django проекта. Но большинство техник будут полезны разработчикам не только на Python, но на других языках.
Читать дальше →

Секреты auto и decltype

Reading time5 min
Views113K
Новый стандарт языка принят относительно давно и сейчас уже, наверное, нет программиста, который не слышал о новых ключевых словах auto и decltype. Но как почти с любым аспектом С++, использование этих новых инструментов не обходится без нюансов. Некоторые из них я постараюсь осветить в этой статье.
Читать дальше →

Встраиваем опросы для пользователей Android-приложений

Reading time3 min
Views9K
Привет, Хабр!

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

Под катом хочу рассказать про классную “плюшку” под названием Profit Button, которая поможет установить диалог с пользователями вашего приложения, а также расширить его функционал так, как вы того захотите.


Интегрируемся за несколько минут

Где таится история космоса

Reading time7 min
Views104K
Надеюсь все знают про НПО им. С.А. Лавочкина – предприятие которое с 1965 года реализует все межпланетные миссии СССР и России. По крайней мере, наверняка все слышали об их продукции: «Луна-3», «Луна-9», «Луна-16», «Луноход», «Марс-3», «Марс-5», «Венера-7», «Венера-13», «Вега», «Фобос-Грунт», «Радиоастрон», «Электро-Л»… Как всякое предприятие космической отрасли оно находится под режимом секретности, и даже в музей можно попасть только по предварительной заявке и в составе групповой экскурсии.

Всего месяц назад я с удивлением узнал, что в НПОЛ, помимо музея, еще есть загадочное место под ироничным названием «Ангар 18».



В отличие от американского аналога, он скрывает не инопланетные корабли, а земные. Но богатство коллекции, собранной на незначительной площади, уверенно может конкурировать с ныне разгромленным павильоном «Космос» на ВДНХ. Увидев такое космическое изобилие, я поначалу был просто ошеломлен. Потом узнал, что Луноход – это ходовая модель; «Венера-7» — технологический макет, проходивший термовакуумные испытания перед полетом в 1970 году; и почти все модели содержат элементы, которые создавались для реальных аппаратов, успехами которых я вдохновлялся еще в детстве. Короче, состояние шока отпустило далеко не сразу. Но обо всем по порядку.
Читать дальше →

Домашний сервер «всё-в-одном» — success story

Reading time9 min
Views139K
Жил да был у меня роутер одной хорошей фирмы на букву «Dead». Ну, это с ним, собственно, и случилось.
Посмотрел я на цены новых, на кучу компьютерного хлама в углу, на список подключений на домашнем компе… И понял, что не нужен мне роутер. Соберу свой, с нормальной маршрутизацией, DNS, WINS, i2p, блекджеком и так далее.
Как это было?

Профилирование и отладка Python, инструменты

Reading time14 min
Views114K
В предыдущей статье мы на практике разобрались, где и в каких случаях можно использовать ручное профилирование, а так же познакомились со статистическими профайлерами.

Сегодня мы познакомимся с основной и самой многочисленной группой инструментов — событийными профайлерами.

Приступим!

Жизненный цикл Activity Stack (часть 1)

Reading time4 min
Views24K
Пожалуй, самый популярный вопрос на собеседованиях на Android-разработчика звучит так: «расскажите нам про жизненный цикл Activity». На первый взгляд в этом нет ничего сложного, в каком только блоге об этом ещё не писали, и кандидат тут же начинает рисовать известную блок-схему и по ходу пояснять. Сферический life cycle в вакууме, которым изобилуют все уроки, действительно достаточно прост для понимания, но ведь activity — это только часть некой обобщающей их сущности. Сущность эта называется Activity Stack, и с его жизненным циклом мы сейчас постараемся разобраться.

Жизненный цикл Activity Stack (часть 2)
Читать дальше →

Автоматическая очистка старых драйверов, или выжмем немного места из Windows 7

Reading time6 min
Views233K
В один прекрасный (или печальный, кому как) день мне надоело, что у меня периодически заканчивается место на ноутбуке. Да, я в курсе, что жёсткие диски сейчас дешевы, но это для меня не выход, потому что:
  • У меня SSD, а он всё-таки подороже будет, чем обычные HDD (объём моего текущего SSD — 120 гигов)
  • Ноутбук рабочий, соответственно данные на нём тоже, должны быть шифрованы, всё такое, поэтому самопальный и не утверждённое работодателем носитель втыкать не стоит
  • Я жадный :)

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

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity