Projects
Дек. 7, 2009 | 10:47 pm
Решил записать список проектов, в которых я принимаю участие, а то некоорые начали выпадать из головы...
- AutoDAO (Java). Мегатулзень для создания DAO-слоя в приложениях, использующих Hibernate.
- argouml-maven-plugin (Java). Плагин к Maven'у, генерирующий картинки из схем, нарисованных в ArgoUML.
- Spring BeanDoc (Java). Генерируатор html-страничек с описанием контекста Spring.
- maven-springbeandoc-plugin (Java). Плагин к Maven'у для Spring BeanDoc.
- Gentoo on N8x0. Порт Gentoo Linux на нокиевские интернет-таблетки.
- fb_text2screen (внезапно, C). Утилита для рисования букв на framebuffer-устройстве в Linux.
- opendsme (внезапно, опять C). Библиотека для чтения и записи конфигурационных данных из специального раздела на нокиевских интернет-таблетках.
- Gentoo Java herd (не менее внезапно, bash). Подпроект Gentoo Linux, занимающийся Java-софтом.
- Portage (Python). Пакетный менеджер, используемый в Gentoo Linux
ссылка | Оставить комментарий | в избранное | рассказать другу
Фиговина для проверки эксепшенов в тестах
Дек. 4, 2009 | 05:46 pm
( Чуть-чуть кода )
Используется как-то так:
Чем это лучше
А тем что когда тест состоит из нескольких statement'ов,
Хорошая статья на эту тему: TestNG and Expected Exceptions
Используется как-то так:
new ExpectException<NumberFormatException>(NumberFormatException.class) { @Override protected void run() { Integer.parseInt("ыыы"); } }.check();
Чем это лучше
@Test(expectedExceptions = NumberFormatException.class) ?А тем что когда тест состоит из нескольких statement'ов,
expectedExceptions не позволяет проверить, какая именно из строчек теста приводит к эксепшену.Хорошая статья на эту тему: TestNG and Expected Exceptions
ссылка | Оставить комментарий {2} | в избранное | рассказать другу
Монтирование ресурсов в Wicket с помощью аннотаций
Дек. 2, 2009 | 10:18 am
ссылка | Оставить комментарий {1} | в избранное | рассказать другу
О Servlet API, sendError и неправильном дизайне
Дек. 1, 2009 | 08:46 pm
ссылка | Оставить комментарий {2} | в избранное | рассказать другу
Доступ к сессии Wicket'а из запроса, обрабатываемого не Wicket'ом
Дек. 1, 2009 | 11:51 am
Собственно, сабж.
Делается крайне просто:
web.xml:
Всё, теперь можно делать
Нюанс: советую прописывать этот фильтр после фильтра с самим Викетом, во избежание всяческих неприятностей.
Ещё нюанс: перед вызовом
Делается крайне просто:
web.xml:
<filter> <filter-name>wicketSessionFilter</filter-name> <filter-class>org.apache.wicket.protocol.http.servlet.WicketSessionFilter</filter-class> <init-param> <param-name>filterName</param-name> <param-value>$НАЗВАНИЕ_ФИЛЬТРА_ВИКЕТА</param-value> </init-param> </filter> <filter-mapping> <filter-name>wicketSessionFilter</filter-name> <url-pattern>$КУДА_ВЫ_ЕГО_ТАМ_СОБРАЛИСЬ_МАППИТЬ</url-pattern> </filter-mapping>
Всё, теперь можно делать
Session.get() и радоваться.Нюанс: советую прописывать этот фильтр после фильтра с самим Викетом, во избежание всяческих неприятностей.
Ещё нюанс: перед вызовом
Session.get() предварительно надо убедиться в существовании сессии с помощью Session.exists().ссылка | Оставить комментарий | в избранное | рассказать другу
IntelliJ IDEA, @NotNull и Maven
Ноя. 30, 2009 | 03:52 pm
У IDEA есть очень приятная фича для проверки кода на потенциальные NPE. Заключается она в развешивании по всему проекту аннотаций @NotNull/@Nullable и последующем статическом анализе + assert'ах в рантайме. В деталях описывать не буду, см. документацию.
Нюанс в том, что для того, чтобы появились assert'ы, надо соответствующим образом пропроцессить классы. При компиляции из самой идеи это происходит автоматически, однако не происходит, если проект собирается чем-то ещё (например, мавеном, который мне очень нравится).
Устранить эту неприятность крайне просто, достаточно добавить следующий фрагмент в pom.xml:
Помимо добавления assert'ов, этот плагин умеет генерировать классы свинговых форм из *.form файлов, производимых идеевским редактором GUI-интерфейсов.
Сами аннотации лежат в
Нюанс в том, что для того, чтобы появились assert'ы, надо соответствующим образом пропроцессить классы. При компиляции из самой идеи это происходит автоматически, однако не происходит, если проект собирается чем-то ещё (например, мавеном, который мне очень нравится).
Устранить эту неприятность крайне просто, достаточно добавить следующий фрагмент в pom.xml:
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>ideauidesigner-maven-plugin</artifactId> <executions> <execution> <goals> <goal>javac2</goal> </goals> </execution> </executions> </plugin> ... </plugins> ... </build>
Помимо добавления assert'ов, этот плагин умеет генерировать классы свинговых форм из *.form файлов, производимых идеевским редактором GUI-интерфейсов.
Сами аннотации лежат в
<dependency> <groupId>com.intellij</groupId> <artifactId>annotations</artifactId> <version>7.0.3</version> </dependency>
ссылка | Оставить комментарий | в избранное | рассказать другу
Дапминг MySQL'я...
Ноя. 25, 2009 | 01:46 pm
MySQL при создании дампа пишет в него таблицы в каком-то случайном порядке. В результате загрузить дамп обратно можно _только_ при выключенных foreign key'ях. Поубивав бы.
ссылка | Оставить комментарий {7} | в избранное | рассказать другу
AutoDAO теперь в центральной мавенской репе
Ноя. 24, 2009 | 05:40 pm
Моя маленькая, но чертовски полезная библиотечка AutoDAO теперь лежит в центральном репозитории мавена.
Что приятно, последующие её обновления тоже будут туда попадать, т.к. используется rsync, регулярно тягяющий новые файлы.
Спасибо товарищу Carlos Sanchez.
Что приятно, последующие её обновления тоже будут туда попадать, т.к. используется rsync, регулярно тягяющий новые файлы.
Спасибо товарищу Carlos Sanchez.
ссылка | Оставить комментарий {5} | в избранное | рассказать другу
Java Exceptions
Ноя. 19, 2009 | 03:36 pm
Забудьте всё что вам раньше рассказывали про иерархию исключений в Java. Это всё враньё. Они утаили от вас самое главное.
( Read more... )
( Read more... )
ссылка | Оставить комментарий {2} | в избранное | рассказать другу
Экономим батарейку выключая ненужные ядра
Ноя. 19, 2009 | 02:35 pm
Выкл:
Вкл:
via Patrick Lauer (bonsaikitten)
for i in 1 2 3; do echo 0 > /sys/devices/system/cpu/cpu${i}/online; done
Вкл:
for i in 1 2 3; do echo 1 > /sys/devices/system/cpu/cpu${i}/online; done
via Patrick Lauer (bonsaikitten)
ссылка | Оставить комментарий | в избранное | рассказать другу
SVN, merging
Ноя. 19, 2009 | 01:57 pm
Вот допустим есть у нас trunk, отфоркали мы feature-бранч и сидим в нём, девелопим. Додевелопили и говорим gatekeeper'у - давай, мёржи в trunk. Он делает svn merge $path_to_feature_branch и говорит упс, конфликты, давайте чините.
Вопрос. Что надо сделать в feature-бранче, чтобы она смогла смёржиться в trunk без конфликтов?
Вопрос. Что надо сделать в feature-бранче, чтобы она смогла смёржиться в trunk без конфликтов?
ссылка | Оставить комментарий {5} | в избранное | рассказать другу
SVN, tree conflicts
Ноя. 19, 2009 | 12:02 pm
wc1:
svn co $path
svn rm $file
wc2:
svn co $path
svn rm $file
wc1:
svn ci -m 'removed $file'
wc2:
svn up
! C $file
> local delete, incoming delete upon update
И? Нахрен мне этот tree conflict, если всё, что я могу с ним сделать - сказать
svn resolve --accept working $file
Это зарезолвит конфликт, используя состояние из working copy, т.е. удалённое, т.е. такое же, как и в репозитории.
ссылка | Оставить комментарий | в избранное | рассказать другу
Java date and time API really sucks...
Ноя. 19, 2009 | 11:53 am
Calendar.getInstance().after("dates in Java suck") returns false.
via Mike Abney
Используйте Joda Time или ждите JSR-310, которая будет тем же самым, только в пакете java.*
ссылка | Оставить комментарий | в избранное | рассказать другу
Ну зачем так делать...
Ноя. 18, 2009 | 06:28 pm
Не апдейтиться в течение всего дня, попытаться вечером закоммититься, получить гору обновлений с конфликтами, охренеть, кое-как смёржить (потеряв часть изменений), закоммититься, сломать компиляцию тестов и запуск проекта, после чего уйти домой.
И при этом объяснять мне, что я не умею работать в команде.
И при этом объяснять мне, что я не умею работать в команде.
ссылка | Оставить комментарий {17} | в избранное | рассказать другу
unrelated
Ноя. 18, 2009 | 10:41 am
Installation of SQLite with "tcl" USE flag enabled provides more (TCL-unrelated) functionality.
ссылка | Оставить комментарий | в избранное | рассказать другу
MySQL...
Ноя. 17, 2009 | 06:01 pm
Нетранзакционное говно...
Attempt #1:
Attempt #2:
Result: FAIL.
Если у вас есть идеи, как в колонку типа timestamp таки засунуть null, я с интересом слушаю.
Attempt #1:
mysql> alter table taro_hardkeys add column deletiontime timestamp default null; ERROR 1067 (42000): Invalid default value for 'deletiontime'
Attempt #2:
mysql> create table foo (deletiontime timestamp default current_timestamp); Query OK, 0 rows affected (0.07 sec) mysql> show create table foo; +-------+--------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------+ | foo | CREATE TABLE "foo" ( "deletiontime" timestamp NOT NULL default CURRENT_TIMESTAMP ) | +-------+--------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> alter table foo alter column deletiontime drop default; Query OK, 0 rows affected (0.15 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table foo; +-------+------------------------------------------------------------+ | Table | Create Table | +-------+------------------------------------------------------------+ | foo | CREATE TABLE "foo" ( "deletiontime" timestamp NOT NULL ) | +-------+------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> insert into foo (deletiontime) values (NULL); Query OK, 1 row affected (0.00 sec) mysql> select * from foo; +---------------------+ | deletiontime | +---------------------+ | 2009-11-17 18:16:02 | +---------------------+ 1 row in set (0.00 sec)
Result: FAIL.
Если у вас есть идеи, как в колонку типа timestamp таки засунуть null, я с интересом слушаю.
ссылка | Оставить комментарий {6} | в избранное | рассказать другу
Маппинговая жопа
Ноя. 17, 2009 | 12:32 pm
XML-маппинги хибернейта + выключенный hibernate.hbm2ddl.auto (даже хотя бы validate) + база с местами отсутствующими, а местами не того типа колонками - это пипец.
Ну и естественно в половине мест название колонки не совпадает с названием поля в объекте. Зачем, блин, зачем это было сделано?
-1 товарищу
alexshubert за допущение такого безобразия.
Кстати, сторонники XML-маппингов. Покажите, как вы легко и удобно напишете маппинг для поля, выражаемый в виде аннотаций вот так:
где Location - это некий енум.
UPDATE: оно ещё и деньги в double'ах считает. Мда.
Ну и естественно в половине мест название колонки не совпадает с названием поля в объекте. Зачем, блин, зачем это было сделано?
-1 товарищу
Кстати, сторонники XML-маппингов. Покажите, как вы легко и удобно напишете маппинг для поля, выражаемый в виде аннотаций вот так:
@Column(nullable = false) @Enumerated(EnumType.STRING) private Location location;
где Location - это некий енум.
UPDATE: оно ещё и деньги в double'ах считает. Мда.
ссылка | Оставить комментарий | в избранное | рассказать другу
И опять try/catch
Ноя. 16, 2009 | 06:21 pm
Стопицоттысячный баг, связанный с неправильным использованием try/catch. На этот раз в спринге:
SPR-6361: TransactionTemplate leaks transactions
SPR-6361: TransactionTemplate leaks transactions
ссылка | Оставить комментарий | в избранное | рассказать другу
Чуть мозг не вывихнул, пока настраивал микрофон на ноутбуке...
Ноя. 9, 2009 | 01:16 pm
( Read more... )
При этом микрофон - это самый левый Capture, но для того чтобы оно работало, надо включить ещё как мимимум DAC0 (может ещё и DAC1, не помню уже), в Digital Input Source выбрать Digital Mic 1 (а совсем не Mixer или Analog Inputs) и пожертвовать пару девственниц.
Ну и, самый очевидный момент, прописать
в /etc/modprobe.d/alsa, потому что иначе она неправильно автоопределяет звуковуху, в результате чего работает только спикер снизу. При этом, даже после прописывания, регуляторы Front и PCM всё-равно ни на что не влияют.
В противоположность этой закладке, вторая прекрасна в своей простоте - единственная галочка Mute и больше ничего.
При этом микрофон - это самый левый Capture, но для того чтобы оно работало, надо включить ещё как мимимум DAC0 (может ещё и DAC1, не помню уже), в Digital Input Source выбрать Digital Mic 1 (а совсем не Mixer или Analog Inputs) и пожертвовать пару девственниц.
Ну и, самый очевидный момент, прописать
options snd-hda-intel enable_msi=1 options snd-hda-intel model=hp-dv5
в /etc/modprobe.d/alsa, потому что иначе она неправильно автоопределяет звуковуху, в результате чего работает только спикер снизу. При этом, даже после прописывания, регуляторы Front и PCM всё-равно ни на что не влияют.
В противоположность этой закладке, вторая прекрасна в своей простоте - единственная галочка Mute и больше ничего.
ссылка | Оставить комментарий {4} | в избранное | рассказать другу
Тест Джоэла для Пронто
Окт. 16, 2009 | 06:35 pm
Пользуетесь ли вы системой контроля версий?
Можете ли вы собрать продукт за один шаг?
Выполняете ли вы ежедневные билды?
Используете ли вы базу данных ошибок?
Исправляете ли вы ошибки перед написанием нового кода?
Есть ли у вас актуальный план работ?
Есть ли у вас спецификация?
Предоставлены ли вашим программистам спокойные условия для работы? 
Используете ли вы новейшее дорогое оборудование?
Есть ли у вас тестеры?
Пишут ли кандидаты на работу код во время собеседования?
Проводите ли вы коридорное тестирование удобства использования программ?Итого: 10 из 12.
Неплохо.
