Как же утомителен процесс инициализации UI при разработке android-приложений. Раз за разом приходится писать горы шаблонного кода: findViewbyId, setOnClickListener, getResources().getDrawable, … Возникает естественное желание переложить эту работу на плечи AOP. Беглый поиск готовых решений, адаптированных под android, навел разве что на RoboGuice, о котором уже упоминалось на хабре. Однако библиотека имеет значительный размер (~0.5 mb), что для многих приложений недопустимо много, и к тому же требует наследования ваших классов application и activity от RoboApplication и RoboActivity, чего не всегда хочется делать. Потому и появился Aibolit, легкая (~40kb), простая в использовании и функциональная библиотека, использующая dependency injection для инициализации UI на android.
Пользователь
История взлома одной браузерной игры. Возврат контроля
11 мин
37KДоброго времени суток. Я занимаюсь аудитом защищённости веб-приложений. По простому — тестами на проникновение в отношении веб-сайтов. Иногда в моей практике встречаются интересные и познавательные случаи, которые я бы хотел описывать в виде таких вот статей, но редко (для меня это первый случай) бывают ситуации когда клиент разрешает публикацию подобного материала с подробным описанием всех имевшихся проблем и предпринятых действий. Естественно, тут вы не встретите никаких конкретных имён, названия фирмы-заказчика и т. д. Упоминания таких данных мне, наверное, никто никогда не разрешит. Надеюсь что для вас, уважаемые читатели, данная статья окажется интересной и полезной.
+185
Почему Agile вам не подходит
4 мин
16KНи об одной теме я не слышал столько негативных отзывов, как об Аджайл. Дескать, он и неэффективный, и не работает, и подходит для ленивых, и придуман для зарабатывания бабла на консультациях, и вообще, нам аджайл не подходит.
Я здесь не собираюсь никого разубеждать. Я хочу поделиться соображениями, почему большинству компаний аджайл действительно не подходит.
Я здесь не собираюсь никого разубеждать. Я хочу поделиться соображениями, почему большинству компаний аджайл действительно не подходит.
+44
Слайдинг экранов с помощью ViewPager
4 мин
83KВступление
Горизонтальная прокрутка экранов — удобная и модная вещь. На Хабре уже был топик, посвященный данной теме. Однако использование ViewFlipper не позволяет с легкостью добиться эффекта привязки, когда экраны двигаются вместе с пальцем. Также нужен механизм автоматической доводки экранов в ту или иную сторону. Примера, где это было бы хорошо разъяснено и реализовано, так и не нашел. В комментариях предлагали посмотреть исходники гугловского кода, где это реализовано. Однако удобнее было бы воспользоваться готовым решением. Такой механизм реализован в Android Support Package. Использовать эту библиотеку можно для версий Android 1.6 и старше. Конкретно нам понадобятся классы ViewPager и PagerAdapter.
+34
Исправление и изменение кодировок MySQL
3 мин
25KВ связи с тем, что довольно много людей обращается с просьбой помочь исправить проблему с кодировками MySQL, решил написать статью с описанием, как «лечить» наиболее часто встречающиеся случаи.
В статье описывается не то, как первоначально правильно настроить кодировки MySQL (об этом уже довольно много написано), а о случаях, когда есть довольно большие таблицы с неправильными кодировками и нужно всё исправить.
Самое плохое в неправильно настроенных кодировках — то, что зачастую проблему сложно обнаружить, и с первого взгляда может казаться, что сайт работает правильно, и никаких проблем нет.
В статье описывается не то, как первоначально правильно настроить кодировки MySQL (об этом уже довольно много написано), а о случаях, когда есть довольно большие таблицы с неправильными кодировками и нужно всё исправить.
Самое плохое в неправильно настроенных кодировках — то, что зачастую проблему сложно обнаружить, и с первого взгляда может казаться, что сайт работает правильно, и никаких проблем нет.
+32
Некоторые возможности использования Intent'ов
6 мин
67KВведение
Объекты типа Intent могут быть использованы для общения между отдельными частями Android приложения, либо между различными приложениями системы. Мощь механизма интентов заключается в том, что с его помощью можно обращаться к любому установленному в системе приложению. Это позволяет повторно использовать некоторые компоненты и значительно сократить время на разработку.
В этой статье я покажу некоторые возможности использования класса Intent для обращения к системным приложениям.
+70
Индикатор выполнения на CSS3
2 мин
3.7KСегодня мы будем воссоздавать прогресс-бар из программы установки Adobe Flash Player средствами CSS3, используя градиенты и тени.
Под хабракатом весь код и ссылка на рабочий пример.
Под хабракатом весь код и ссылка на рабочий пример.
+68
Chainvas: изящный и миниатюрный «костыль», добавляющий средства цепного вызова (method chaining) к любому API
3 мин
2.7KТуториал
Благодаря библиотеке jQuery примерно с 2006 года (то есть лет пять как) никому не надо объяснять, что такое method chaining: это та самая техника программирования, в которой методы объекта могут быть вызваны друг за другом по цепочке, как в jQuery.
Главнейшим достоинством этой техники является заметная экономия усилий программиста. С нею программисту не приходится заново, неоднократно записывать имя объекта вот в такой манере:
Вместо этого программист может вызвать все методыцепóчкою — в одну строку:
Если же ему покажется, что такой вид записи хуже читается человеком, чем предыдущий (особенно когда у методов появляются параметры, иногда довольно обширные), то тогда программист может записывать имена методов с новой строки (JavaScript это позволяет), но всё равно экономить на имени объекта:
На практике возможность такой техники обеспечивается тем, что ни один метод объекта не возвращает значение undefined. Вместо этого, если метод является командою, а не запросом (то есть выполняет некоторое действие, а не возвращает некоторое значение), то в конце его автор библиотеки пишет«return this» — этим-то и обеспечивается возможность записи вызова нескольких команд подряд в форме цепочки.
Насколько я знаю, устоявшегося русского эквивалента англоязычному словосочетанию «method chaining» пока что не существует. Наверное, можно говоритьо «цепочечной» или, для простоты, о «цепной» форме вызова методов.
Удобство цепного вызова вызывает привыкание. Ну правда же: достаточнопару-тройку-другую недель попрограммировать на jQuery — и обыкновенные API начинают раздражать, даже бесить, своею допотопною невозможностью цепного вызова. Также недостаёт возможности задания их свойств в виде объекта, передаваемого методу, подобному .css({color: 'red', 'line-height': 1}) в jQuery.
Вообразите себе, например, как необыкновенно было бы удобно, кабы по холсту(<canvas>) можно было рисовать цепными вызовами в такой манере:
И средство для именно таких цепных вызовов появилось — благодаря Lea Verou. Вот оно:
Главнейшим достоинством этой техники является заметная экономия усилий программиста. С нею программисту не приходится заново, неоднократно записывать имя объекта вот в такой манере:
obj.шмяк();
obj.тыдыжжь();
obj.ынц();
Вместо этого программист может вызвать все методы
obj.шмяк().тыдыжжь().ынц();
Если же ему покажется, что такой вид записи хуже читается человеком, чем предыдущий (особенно когда у методов появляются параметры, иногда довольно обширные), то тогда программист может записывать имена методов с новой строки (JavaScript это позволяет), но всё равно экономить на имени объекта:
obj
.шмяк(параметр1, параметр2, …)
.тыдыжжь(параметр1, параметр2, …)
.ынц(параметр1, параметр2, …);
На практике возможность такой техники обеспечивается тем, что ни один метод объекта не возвращает значение undefined. Вместо этого, если метод является командою, а не запросом (то есть выполняет некоторое действие, а не возвращает некоторое значение), то в конце его автор библиотеки пишет
Насколько я знаю, устоявшегося русского эквивалента англоязычному словосочетанию «method chaining» пока что не существует. Наверное, можно говорить
Удобство цепного вызова вызывает привыкание. Ну правда же: достаточно
Вообразите себе, например, как необыкновенно было бы удобно, кабы по холсту
ctx.beginPath()
.prop({
lineWidth: 2,
strokeStyle: '#333'
}).moveTo(0,0)
.bezierCurveTo(50,50, 80,80, 100,100)
.stroke().closePath();
И средство для именно таких цепных вызовов появилось — благодаря Lea Verou. Вот оно:
+26
Анимация меню при помощи CSS3
8 мин
37KПеревод
В данной статье я хотел бы показать вам некоторые приёмы создания эффектов при помощи CSS3 на примере меню. Идея заключается в простой композиции элементов: иконки, основного названия и вторичного названия, которое будет анимировано при наведении курсора, используя только CSS-переходы и CSS-анимацию. Мы рассмотрим несколько различных эффектов для элементов.
+181
Упрощение жизни разработчика с помощью сторонних сервисов
3 мин
9.6KПредставляю скромную подборку сервисов, которые ускоряют экономят время разработчику и/или ресурсы сервера. Здесь не будет подробных обзоров, только список с кратким описанием и ссылками. Также, я не претендую на свежесть ресурсов, поэтому кому-то перечисленный список покажется слишком очевидным и известным всем.
Буду рад включить ссылки и описания, предложенные в комментариях.
Google Fusion Tables
Позволяет развернуть реляционную базу данных на серверах гугла с обращениями с помощью библиотеки Visualization или JSONP.
Статья на хабре: habrahabr.ru/blogs/webdev/116035
Ссылка: www.google.com/fusiontables/Home
Минусы: количество обращений в секунду равно пяти с одно IP адреса и столько же при обращении с аккаунта (используя авторизацию). То есть развернуть сайт с хорошей посещаемостью и работать с сервисом с помощью сервера не получится. Стоимость увеличения лимита — от 10 тысяч долларов в год (см. Maps API Premier). Кроме того, отсутствуют джойны, которые заменяются представлениями (view), создаваемыми через интерфейс.
Буду рад включить ссылки и описания, предложенные в комментариях.
Google Fusion Tables
Позволяет развернуть реляционную базу данных на серверах гугла с обращениями с помощью библиотеки Visualization или JSONP.
Статья на хабре: habrahabr.ru/blogs/webdev/116035
Ссылка: www.google.com/fusiontables/Home
Минусы: количество обращений в секунду равно пяти с одно IP адреса и столько же при обращении с аккаунта (используя авторизацию). То есть развернуть сайт с хорошей посещаемостью и работать с сервисом с помощью сервера не получится. Стоимость увеличения лимита — от 10 тысяч долларов в год (см. Maps API Premier). Кроме того, отсутствуют джойны, которые заменяются представлениями (view), создаваемыми через интерфейс.
+142
Калькулятор на CSS3
2 мин
9KЗдравствуй, хабраюзер!
Сидя недавно и листая developer.mozilla.org наткнулся на описание -moz-calc();
Вкратце, данное свойство используется для расчёта выражений прямо в CSS.
Тут-то и родилась идея сделать калькулятор, который бы считал через это хитроумное свойство.
Что из этого вышло, можно судить по этому скриншоту:
Сидя недавно и листая developer.mozilla.org наткнулся на описание -moz-calc();
Вкратце, данное свойство используется для расчёта выражений прямо в CSS.
Тут-то и родилась идея сделать калькулятор, который бы считал через это хитроумное свойство.
Что из этого вышло, можно судить по этому скриншоту:
+71
sjFilemanager — Reloaded. AJAX + PHP файловый менеджер версия 1.0 бета
4 мин
6.9KМного воды утекло с тех пор когда я сел за написания своего файлового менеджера. В то время поддержка ИЕ6 считалась обычным делом, а про фичи HTML5 можно было только мечтать. В общем вот ссылка на версию 0.1.0 альфа. В конце первого топика, я написал, что планирую сделать в будущем, можно сказать я сдержал свое обещание и хочу представить Вам версию 1.0b. Из того, что планировалось, была отброшена идея внедрения авторизации в менеджер, потому что, как говорили здесь, это пятое колесо. Рассмотрим, что изменилось и что улучшилось, но для начала скрин
+54
Ajenti 0.6
1 мин
5.5KМы снова приветствуем вас на волнах Changelog FM, и сегодня у нас в студии — Ajenti 0.6.0.
+196
Схватка без зеркал: Nikon J1, Sony NEX-5N, Pentax Q и Panasonic GF3
8 мин
49KРассказав о каждой из представленных в заголовке беззеркалке по-отдельности, мы решили сделать сложное: собрать все эти камеры и устроить настоящую схватку без зеркал!
Disclaimer: разным людям важны в камерах разные параметры, и мы к сожалению не могли осветить в этом сравнительном тесте все-все-все их фишки и особенности. В общем, не судите строго, мы старались :)
Disclaimer: разным людям важны в камерах разные параметры, и мы к сожалению не могли осветить в этом сравнительном тесте все-все-все их фишки и особенности. В общем, не судите строго, мы старались :)
+24
Метод html-верстки кнопок с применением псевдоэлементов
7 мин
8.9KПоявлению этой методики способствовала воистину монстрообразная вёрстка элементов страницы на нашем проекте. Подумать только, для отображения одной кнопки требовалось до семи тегов на один элемент.
Выглядело это примерно так:
html
Видно, что запутаться в таком коде проще простого, тем паче, что вариантов кнопок на проекте накопилось не менее 30. Попытка создать такую кнопку на серверной стороне вызывала негодование у коллег «пехапистов».
Поэтому моей негласной задачей стало максимальное упрощение кода.
Выглядело это примерно так:
html
<div class="large_button"><br> <span class="buttons submit_v2-button clickable"><br> <i class="left left2"></i><br> <i class="body"><br> <b>В архив</b><br> <i class="end"><br> <i></i><br> </i><br> </i><br> </span><br></div>
Видно, что запутаться в таком коде проще простого, тем паче, что вариантов кнопок на проекте накопилось не менее 30. Попытка создать такую кнопку на серверной стороне вызывала негодование у коллег «пехапистов».
Поэтому моей негласной задачей стало максимальное упрощение кода.
+26
Sisyphus.js — защищаем данные форм пользователя от случайных потерь
2 мин
8.1KВ чём проблема?
Бывали ли у вас случаи, когда во время долгого заполнения нудной формы или написания красноречивого и пылкого комментария *внезапно* крашился браузер? Или вы закрывали вкладку, в которой работаете, или отключалось электропитание (а ИБП, по известному закону, нет)? Если нет — то вам повезло, но страховки от подобных происшествий ни у кого нет.
Представьте себе бурю эмоций, испытываемых пользователем, только что потерявшим все вводимые данные — а ведь оставалось немного допечатать и отправить форму. Вот если бы только был способ восстановить эти данные, а не заниматься сизифовым трудом…
+133
Использование карты памяти /sdcard/ приложениями в Android
2 мин
211KДрузья, поклонники зеленых роботов, разработчики приложений, просто пользователи:
как Вы используете карту памяти /sdcard/ в Вашем Android-девайсе?
Рассмотрим, для начала данный вопрос на примере большинства рядовых пользователей устройства под управлением ОС Андроид:
как Вы используете карту памяти /sdcard/ в Вашем Android-девайсе?
Рассмотрим, для начала данный вопрос на примере большинства рядовых пользователей устройства под управлением ОС Андроид:
+40
Вызов unmanaged code из managed без P/Invoke
3 мин
3.7KПродолжаем маршалировать. На этот раз будет рассмотрен способ вызова С-шных функций из C# без использования P/Invoke( [DllImport] ). А если быть до конца точным, то [DllImport] использовать все же придется, но только один раз. По существу, данная статья является статьей о маршалинге делегатов в указатели на функции и обратно.
Итак, приступим.
Итак, приступим.
+20
Кеширующий прокси-сервер на nginx. Хитрая конфигурация
7 мин
39KНа Хабре уже есть несколько описаний Nginx, но, думаю, моя конфигурация тоже будет интересна.
Ситуация выглядит следующим образом: есть размещённый на нескольких серверах IIS сайт (интернет-магазин), перед ним расположен балансировщик. Между ними решено установить nginx для уменьшения нагрузки на IIS.
Основная масса динамического контента отображается Ajax-ом, так что кеширование страниц каталога товаров вполне безопасно. Однако на них могут быть отзывы о товаре, за которые можно проголосовать — совсем как на Хабре, что тоже надо учесть.
Плюс к этому хочется поддерживать валидность популярных страниц в кеше автоматически.
Ситуация выглядит следующим образом: есть размещённый на нескольких серверах IIS сайт (интернет-магазин), перед ним расположен балансировщик. Между ними решено установить nginx для уменьшения нагрузки на IIS.
Основная масса динамического контента отображается Ajax-ом, так что кеширование страниц каталога товаров вполне безопасно. Однако на них могут быть отзывы о товаре, за которые можно проголосовать — совсем как на Хабре, что тоже надо учесть.
Плюс к этому хочется поддерживать валидность популярных страниц в кеше автоматически.
+67
Traits в php 5.4. Разбираем детали реализации
8 мин
53KТуториал
Совсем недавно вышла первая beta php 5.4, а пока я писал топик подоспела и вторая. Одно из нововведений в 5.4 – это traits (типажи). Предлагаю разобраться во всех деталях в том, что же типажи из себя представляют в php.
Простой пример типажа, чтобы не заглядывать в Википедею:
Как видно, к классу
Но во всём есть свои детали.
Простой пример типажа, чтобы не заглядывать в Википедею:
//определение типажа
trait Pprint
{
public function whoAmI()
{
return get_class($this) . ': ' . (string) $this;
}
}
class Human
{
use Pprint; //подключаем типаж, ключевое слово use
protected $_name = 'unknown';
public function __construct($name)
{
$this->_name = $name;
}
public function __toString()
{
return (string) $this->_name;
}
}
$a = new Human('Nikita');
echo $a->whoAmI(), PHP_EOL; //=> Human: Nikita
Как видно, к классу
Human
было добавлено поведение из типажа Pprint
.Но во всём есть свои детали.
+147
Информация
- В рейтинге
- Не участвует
- Откуда
- Berlin, Berlin, Германия
- Зарегистрирован
- Активность