Цитатник – мое приложение для Android

7.02.2012
Olexandr Savchuk

Android Market: Quoter

Смешные цитаты со множества сайтов. Идеальное времяпровождение в очередях, транспорте и т.д.

- Возможность выбора любимых цитатников
- Сохранение страниц для чтения оффлайн
- Отправка цитат через СМС, электропочту, Facebook и т.д.

Рекламу в приложении можно отключить в настройках. Но если вам нравится мое приложение и вы хотели бы поддержать меня как разработчика, пожалуйста оставьте ее включенной. Спасибо :)

Любые комментарии и предложения с радостью принимаются здесь или по электропочте.

Цитатники на русском и украинском:
- bash.org.ru: последние, случайные, бездна, лучшее бездны, с поддержкой страниц!
- ibash.org.ru
- ithappens.ru
- zadolba.li
- bash.bynets.org (бывший bash.org.by)
- ukrbash.org
- killmepls.ru
- nefart.ru
- uebalby.com

Там есть еще »

Пакетная обработка изображений в Picasa с помощью ImageMagick

27.07.2011
Olexandr Savchuk

В нашем офисе мы используем Google Picasa для обработки множества сканов и фотографий. Мы используем Picasa уже несколько лет и очень довольны. Однако, Picasa не предоставляет всех необходимых нам функций, а некоторые слишком сложно использовать при нашем объеме работ. Чтобы упростить нашим сотрудникам задачу, я использовал два основных компонента: набор консольных утилит ImageMagick для обработки изображений, и Picasa Button API.

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

Там есть еще »

Android: прокрутка ListView клавишами громкости

24.02.2011
Olexandr Savchuk

Прокрутка списка кнопками громкости в приложениях на Андроиде нa самом деле не является чем-то сложным. Не зная этого, вчера я потратил какое-то время в поисках хорошего руководства на эту тему. Написав код и опубликовав Quoter в версии 1.0, я решил сам написать небольшую заметку об этом.

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

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
	if (event.getAction() == KeyEvent.ACTION_DOWN) {
		switch (event.getKeyCode()) {
		case KeyEvent.KEYCODE_VOLUME_UP:
			scrollToPrevious();
			return true;
		case KeyEvent.KEYCODE_VOLUME_DOWN:
			scrollToNext();
			return true;
		}
	}
	if (event.getAction() == KeyEvent.ACTION_UP
		&& (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP
			|| event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN)) {
		return true;
	}
	return super.dispatchKeyEvent(event);
}

Наш код выполняется только на событии нажатия клавиш (ACTION_DOWN). Событие ACTION_UP перехватывается для того, чтобы предотвратить системный звук нажатия клавиши. Также проверяется event.getKeyCode(), и если нажата одна из нужных клавиш, вызываются соответствующие функции. В других случаях (другие события или клавиши) событие передается стандартному обработчику.

Теперь остались только собственно функции прокрутки ListView. Проблема с ними вот в чем. Можно прокрутить список в любую точку с помощью метода scrollTo(), но нам нужно перейти не к координатам, а к конкретному элементу списка – Quoter есть приложение для чтения, и читатель хочет перейти к следующей цитате. Вот что мы для этого можем сделать:

private void scrollToNext() {
	int currentPosition = getListView().getFirstVisiblePosition();
	if (currentPosition == getListView().getCount() - 1)
		return;
	getListView().setSelection(currentPosition + 1);
	getListView().clearFocus();
}

private void scrollToPrevious() {
	int currentPosition = getListView().getFirstVisiblePosition();
	if (currentPosition == 0)
		return;
	getListView().setSelection(currentPosition - 1);
	getListView().clearFocus();
}

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

OpenTTD WebConfig

10.10.2010
Olexandr Savchuk

Система для настройки сервера OpenTTD через веб-интерфейс.

Проверено и работает с OpenTTD 1.0.4, Apache2 и PHP 5.2.4 на Винде и Убунте. Должно работать везде, где есть PHP.

Проэкт хостится на OpenTTDCoop DevZone:
http://dev.openttdcoop.org/projects/ottd-webconfig

OpenTTD – Перекрестки и станции

7.10.2010
Olexandr Savchuk

OpenTTD — компьютерная игра, порт известной игры Transport Tycoon Deluxe. Собственнический двоичный код Transport Tycoon Deluxe был преобразован в код на C++ программистом Людвигом Стригеусом с помощью дизассемблера. OpenTTD является бесплатной и свободной программой, для работы можно использовать файлы данных от платной оригинальной Transport Tycoon Deluxe.

Wikipedia

Не прошло и пары лет, как я вновь начал играть в OpenTTD. Игра, как описано выше, представляет из себя открытый римейк досовской стратегии Transport Tycoon Deluxe. Цель игры – построить транспорную сеть поездов, грузовиков, кораблей и самолетов, перевозить дофига пассажиров и груза, и заработать больше денег чем конкуренты. Пара скриншотов для иллюстрации:

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

День из жизни программиста

16.03.2010
Olexandr Savchuk

перевод картинки – © ayambit

Подсветка монитора на CCFL

12.03.2010
Olexandr Savchuk

Я часто работаю за компьютером в темноте, и мне известно, что это не очень полезно для глаз – смотреть в яркий монитор на темном фоне. Я смотрел разные варианты, в том числе и синюю подсветку на LED из Икеи на телевизоре у знакомого, но самому сделать что-то подобное никак не доходили руки. Одно время я даже просто заворачивал настольную лампу за монитор, имитируя “подсветку” – но это было не решение.

Решение же пришло само собой – на одном из сайтов, где я иногда покупаю разные железки, на главной странице я присмотрел пару CCFL (http://ru.wikipedia.org/wiki/Холодный_катод) за символическую сумму в 4,99€. Одной поездкой в магазин и потраченными еще 7€ позже я сижу в темноте и пишу этот текст с абсолютно не напряженными глазами :)

Там есть еще »

§ 162. Творческий кризис

21.02.2010
Olexandr Savchuk

Поставим простой эксперимент. Произнесем без остановки вслух все известные нам слова (или попросим это сделать приятеля). Первые десять слов найдутся сразу. Потом мы начнем искать и перечислять объекты в комнате — еще штук десять. Потом мы вспомним пару необычных слов из дальних углов словарного запаса. А потом мы остановимся, потому что слова кончатся.

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

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

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

Творческий кризис — это тупик бессмысленного пути.

© art.lebedev

SVN для веб-сайтов – осторожно

17.02.2010
Olexandr Savchuk

Многие вебмастера используют SVN не только как систему контроля версий при разработке своего сайта, но и для развертки готового продукта на сервере. В системе была обнаружена уязвимость, о которой многие не знают, и которая может позволить атакующему получить доступ к исходным кодам и конфигурационным файлам проэкта.

В каждой папке, которая контроллируется SVN, создается подпапка .svn. В ней находятся, помимо прочего, список всех файлов в данной директории, а также последние версии этих файлов. Файл .svn/entries содержит имена файлов и папок и техническую информацию о них, а директория .svn/text-base состоит из всех файлов (с добавленным к их расширению .svn-base).

project
  |- index.php
  |- config.php
  |- dir
  |    |- .svn
  |    |    |- entries
  |    |    '- text-base
  |    |         '- file.ext.svn-base
  |    '- file.ext
  |- .svn
  |    |- entries
  |    |- text-base
  |    |    |- index.php.svn-base
  |    |    '- config.php.svn-base
  |    '- ...
  '- ...

Обычно эта директория скрыта, и о ней мало кто заботится. Однако при стандартной конфигурации большинство серверов будут отдавать файлы из нее как и из любой другой – и кроме того, поскольку расширения в text-base изменены на .svn-base, то скрипты не будут выполняться, а будут просто отданы клиенту в виде исходного кода.

Эта уязвимость была обнаружена группой русских программистов некоторое время назад. Они провели скан многих сайтов в зонах .ru, .com и .de, и результаты были ошеломительными. Сотни владельцев крупных сайтов были оповещены об уязвимости их проектов. После того, как дыра была закрыта на большинстве сайтов, информация была опубликована на Хабре.

Существуют множество способов защититься от этой уязвимости. Вот самые простые и действенные:

  • Закрыть доступ к .svn (с помощью .htaccess (Apache) или других настроек)
  • Использовать svn export вместо svn checkout – тогда директория .svn вообще не будет создана.

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

How Fanboys See Operating Systems

19.12.2009
tags:
Olexandr Savchuk