вторник, 18 декабря 2012 г.

Отслеживание объявлений на avito.ru

Что делать, если очень нужен некий сервис, а в интернетах его ну никак не найти. Конечно же написать свой!) Тем более, если задача относительно тривиальна.
Так и я: появилась необходимость отслеживать объявления о сдаче комнат в СПб. Главное в этом деле, как выяснилось, быть первее всех. Таким образом и появилась идея некоего сервиса, который постоянно будет мониторить объявления, соответствующие интересующих нас критериев.
Сервис это, конечно, громко сказано, ибо дело ограничилось написанием скриптика на Ruby, который в цикле молотит avito и, при появлении новых объявлений, отправляет оповещение на почту. Для отправки писем решил использовать gem pony. Очень удобная штука. Письма получается отправлять почти как через mail() в php!
Что имеем в остатке: скрипт, отбирающий объявления с определенной стоимостью, частников, не прорекламленные из топа и т.д.; постоянно актуальную инфу на почте в письмах с указанием названия объявления, стоимости, ссылки на объявление и краткого описания. Удобно и просто. Сам скриптик, естественно, можно найти на GitHub-е тут

вторник, 20 ноября 2012 г.

Анимация gif на SurfaceView

   Итак, пару дней промучался с корректным отображением анимации. В итоге сделал класс, расширяющий SurfaceView, в который засовывал Gif из ресурсов, чужой библиотечкой разбирал gif на Bitmap покадрово, при инициализации считал нужный шаг на основе FPS и общего времени гифа с дистанцией, до конечной точки.
   Столкнулся с проблемой странной работы SurfaceView и onDraw. Странно потому, что так ничего и не понял: при invalidate(), postInvalidate() и иже с ними, onDraw не вызывается. В интернетах нашлось пару способов, как исправить ситуацию при помощи метода setWillNotDraw. Собственно, как все это связано, я так и не понял. Опыта, знаете ли, маловато. Так что, сделал все в "функции-помощнике", последовательно вызывающей в потоке lockCanvas, onDraw и unlockCanvasAndPost. Работает, вроде, все неплохо)
   Благодаря такому подходу, в onDraw считаю все модификации с Canvas, а смена кадров gif-а идет как бы отдельно от основной отрисовки. Вообщем, именно то, что мне было нужно! Ура!

   В итоге на экране летит анимированная gif-ка. Я улыбаюсь. Я радуюсь. Я - идиот.

четверг, 15 ноября 2012 г.

Java и месяцы.

К моему ньюфажному удивлению, обнаружил, что Java считает месяцы с нуля. То бишь, ноябрь получается 10-ым месяцем, что принесло мне небольшую попаболь.

среда, 14 ноября 2012 г.

Реальный размер Bitmap

     Столкнулся с одной интересной особенностью: размеры Bitmap при вызове getWidth() и getHeight() возвращаются реальные, т.е. сколько пикселей само изображение, загруженное под соответствующее DPI. Однако выводится, например, на Canvas при drawBitmap масштабированное изображение под соответствующий density. Таким образом, правильней писать в некоторых случаях так:

int height,width;
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.resource_name);
height = bmp.getScaledHeight(bmp.getDensity());
width = bmp.getScaledWidth(bmp.getDensity());

Соответственно, можно вместо density самого Bitmap-а брать DPI, например, всего экрана через DisplayMetrics и т.д.
Такой вот простенький трик. Возможно, говорю о крайне банальных вещах, но я дошел до этого не сразу.