Tuesday 19 March 2013

Contribution to SpringFramework


Finally, SpringFramework 3.2.2 is out and includes few very interesting addons:
  • ObjectToStringHttpMessageConverter (SPR-9738) provides a bridge to ConversionService implementations allowing your WebMethods to return numbers, arrays – anything that ConversionService can turn into String. Just register it in your Web context
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.ObjectToStringHttpMessageConverter">
                <constructor-arg>
                    <bean class="org.springframework.context.support.ConversionServiceFactoryBean" />
                </constructor-arg>
                <property name="writeAcceptCharset" value="false" />
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    and now this is possible:
    @ResponseBody
    public int submitJob() { ... }
  • Jackson2ObjectMapperFactoryBean (SPR-9739) allows you to configure Jackson e.g. in your Web context:
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
                        p:autoDetectFields="false"
                        p:failOnEmptyBeans="false"
                        p:indentOutput="true">
                        <property name="featuresToDisable">
                            <array>
                                <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS" />
                            </array>
                        </property>
                        <property name="serializers">
                            <array>
                                <bean class="org.myproject.NumberSerializer" />
                            </array>
                        </property>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    In majority of cases the configuration will be much simpler – this one shows it with full power.
  • ResourceBundleMessageSource (more exactly: all descendants of AbstractMessageSource) now has commonMessages property which can hold locale-independent values. For example while you want to have mail subject and body locale-dependant, some properties (mail from and mail to) are common across all bundles (no need to duplicate them) (check SPR-10291):
    <bean id="mailProperties" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="org.mycompany.email" />
        <property name="commonMessages">
            <props>
                <prop key="email.from">empty@mydomain.org</prop>
                <prop key="email.to">%s@mydomain.org</prop>
            </props>
        </property>
    </bean>
  • And last but not least important is the introduction of logic that infers type of returned bean (created by some factory) based on the passed arguments (see SPR-9493). That makes e.g. testing much easier to configure (refer SPR-9130) as one need to declare just one factory for all types instead of factory-per-type.
I hope that my small contribution will help many. And separate thanks for code reviewers and commiters of SpringSource.

Monday 3 December 2012

Воришки

В пятницу через себя прочувствовал, каково это, когда у тебя украли велосипед. Ладно, если б при этом ещё и морду набили – было бы не так обидно. Велосипед был пристёгнут цепью Abus 6Ks, но злоумышленник саму цепь оставил целёхонькой лежать на земле: пала раскушенная 6-мм дужка замка.
Погуглив выходные, я взял на заметку несколько советов, которыми, конечно, стоило вооружиться раньше. Всё равно, они ещё послужат хорошую службу:
  • Сделайте велосипед максимально опознаваемым. Например, обклейте его отражателями, разноцветными элементами или другими отличительными знаками.
  • Можно пометить велосипед. Например, выбить аббревиатуру, например, или сделать заметный знак. Как правило, угонщики, если замечают это, то не решаются на кражу – легко потом опознать. Конечно, если вы сами решите продать велик это снизить стоимость.
  • Используйте как минимум два замка разных конструкций, например, цепь, U-замок, кольцевой замок. Многие злоумышленники специализируются (или имеют в наличии необходимые инструменты) только на определённом типе замка.
  • Не цепляйте велосипед только за раму: прихватывайте и колесо. При этом если злоумышленник будет ломать цепь кручением, есть большая вероятность повредить обод колеса. Кому нужен велосипед с восьмёркой?
  • Просто и эффективно: уходя, заберите седло с собой. Ехать быстро без седла как-то не очень комфортно.
  • Если у вас есть время, вы можете отсоединить переднее колесо и пристегнуть его  цепью к заднему. В конце концов, злоумышленнику важно быстро уехать с места преступления, и он будет оценивать свои риски быть застуканным. В среднем по 2 минуты на замок и столько же на установку колеса: кому охота возиться 10 минут?
  • Не используете на велосипеде зажимы, которые позволяют быстро снять переднее колесо или седло (если не собираетесь его всё время снимать): установите вместо них обычные гайки. Вы же не часто меняете камеры.
  • U-замки должны быть на плоских ключах (круглые взламываются).
  • Я обратил внимание, что в магазине можно купить кусачки длиной 480мм, которые перекусывают 6мм металл. Поэтому и покупать надо из этого расчёта. Лучше 12мм цепь.
  • Замки не должны лежать на земле, чтобы исключить взлом при помощи молотка или злоумышленники не могли поставить второй рычаг на землю и использовать свой вес тела.
  • Можете попробовать экзотические способы борьбы: Pedal Lock  от Cheng-Tsung или GPS трекер SpyBike или поднять на столб, но мне кажется, что это скорее "война ради войны".
  • Сделайте фото чистого узла каретки снизу – там находится номер вашей рамы. Или запишите его – он может сыграть огромную роль в поиске.
  • Полагаться на прохожих не стоит, ибо наглость воришек не знает предела.
Успехов всем и не попадать вот в такую ситуацию:

Saturday 24 November 2012

Посылки и пошлины

Из моих наблюдений:
  • На посылки внутри еврозоны (включая Великобританию) импортные пошлины не налагаются.
  • На посылки с заявленной стоимостью ниже $50 импортные пошлины не взимаются.
  • Посылки, для которых не заявлена стоимость на экспортной декларации и которые тяжелее (предположительно) 1 кг, просвечиваются сканером. При обнаружении там электроники конечный адресат получает письмо от PostNL, в котором его просят оценить стоимость посылки.
  • Налог считается так:
    • €17 – сбор за обработку посылки. Платится в любом случае.
    • 30% – импортная пошлина на электронику, вычисляемая от стоимости посылки.
То есть, если заявленная стоимость посылки $60, то вам выставят счёт €17+€13.8=€30.8, что оставляет более половины стоимости посылки. Поэтому:
  • Просите продавца указывать стоимость не более $50.
  • При получении письма от PostNL можно сфабриковать счёт-фактуру или выписку из PayPal.
  • Если вы уже поставлены перед фактом, то всегда есть возможность отказаться от посылки, которая будет отправлена назад. При этом можно договориться о повторной доставке, что может оказаться дешевле, чем заплатить пошлину.
Если у кого-то есть факты, опровергающие или подтверждающие вышесказанное, то прошу оставлять комментарии.

Wednesday 14 November 2012

Снова о Gamma

Купил недавно в Gamma LED лампочку. Взял одну, на 25% скидке. Прихожу домой, вкручиваю в светильник с плавной настройкой яркости свечения. Она горит только когда регулятор "на полной мощности". Хм, для такого светильника в ней смысла нет. Переставил просто в кладовку. Включаю. Мерцает. Как-то часто мерцает, слегка заметно, но всё равно надоедливо. Я отошёл на минутку, думаю, прогреется сейчас. Не тут-то было: мерцать стала чаще, но всё мне — видно. Может, у меня ток не очень переменный? В общем, сдал раздосадованный обратно. Или нужна топовая (а значит, и более дорогая) лампа, или технология ещё не готова для среднего обывателя.

C Гаммой у меня связана ещё одна история. То ли фон радиационный у него повышен… Решил купить недавно смеситель Grohe. Суммарная скидка на него (для владельцев карточки постоянного покупателя) была рекордной для магазина – аж 30% (больше никогда не видел). Вообще, ловлю себя на том, что хожу в магазин только на скидки. Скорее даже так: покупательский аппетит у населения так упал, что только скидка может заставить такого ленивца, как я, оторвать свой зад и принести его в магазин. Но вернёмся к истории. Дают мне на кассе при покупке два набора конструктора Lego (O! O! O!) и купон на €3 на следующую покупку. Я делаю крюк на улицу, оставляю коробку со смесителем на велике, иду назад и покупаю ещё удлинитель, который с купоном достался мне в полцены. Выхожу на улицу довольный, как слон. Подхожу к велосипеду и разочарованно обнаруживаю, что кто-то за время моего недолгого отсутствия успел покопаться в боковой сумке и спереть оттуда бутылку вина. Их было три: одна – "дорогая" бутылка портвейна за €7 и две – дешёвые за €3. Портвейн на месте. «Эти неудачники стырили дешёвую бутылку!» – порадовался я вслух и про себя подумал: «Что б она вам поперёк горла встала, воришки». А ведь могли бы украсть смеситель, что было бы гораздо обиднее. В итоге не принёс мне радости купон: где взял, там и потерял. И нет в жизни полного счастья, есть только какой-то баланс.


Tuesday 30 October 2012

The less the better [or wine with torrent]

Nowadays a lot of compact devices (like media players or TVs) have Torrent client on board, why should anyone bother about the exotic way of running it? Well, in my case the main reason was that I was migrating uTorrent from my laptop to standalone server to allow 24h non-stop feeding. So, let's put everything in one bottle:
  • It was important for me to have less fuzz with migration of about 100 torrents from my laptop. Perhaps that would also be possible for uTorrent for Linux, but I also get used to UI interface & settings.
  • Running uTorrent on server gives me the possibility for non-stop feeding and downloading on demand.
  • Running uTorrent on Linux also have a potential bonus of configuring QoS in case torrent traffic gets annoying. Yes I know about build-in bandwidth settings, however the typical task is usually "I want uTorrent to consume all bandwidth unless there is something else hungry for it". In this case all traffic for internal network should go via server that unfortunately, adds one more point of failure in the chain.
Technically all above can be solved with following setup:
  • We will run Xtightvnc server on Linux. It acts as X-Server and uTorrent will display it's UI on this server. Bonus is that Tightvnc has clients both for Linux and Windows, which will allow you to connect to under from any (popular) platform.
  • We will run uTorrent with wine. Certain versions (like v1.8.5) do not start under wine on some reason, so you'd better double check here that certain version was tested under wine or use /noinstall command line option. Keep uTorrent window on separate workspace & collapsed. Also disable "Show current speed in title bar" to reduce number of UI update events.
  • Hint: When launching  uTorrent also pass the /minimized option. Otherwise it will consume 5% of CPU just to render constantly changing statistics (Tightvnc needs also to response to any UI update even if no client is connected). When minimized it will be 1-2%.
What uTorrent client to choose? Well, I personally have stopped on v1.8.5, because:
  • I do not need magnet URLs or life streaming features in v3.x. The last one is by the way in most cases failing for me (perhaps always fails for MKV container, is it not so suitable for partial playing).
  • The sad trend shows the sad statistics: uTorrent executable size was slowly increasing by 100Kb in 2007-2011 (from 100K to 500K), but in 2011-2012 it doubled in size (from 500K to 1M). Perhaps it's still the smallest torrent client, but with every new release I doubt more and more.

Робопылесос Paranello


Недавно появился у нас дома новый помощник: робопылесос Paranello. Алгоритмом его прохода по комнате я в целом доволен: робот меняет несколько стратегий чистки и за пару часов он сделает пол заметно чище. Был приятно удивлён его способностью найти базовую станцию, запрятанную за TV столиком вне прямой зоны видимости, и способностью огибать по периметру ножки (стола) и выступы (стены). Возможность ручного управления движением робота с пульта ДУ забавляет взрослых пап и возбуждает малышей. Главное правило: почаще вытряхивать контейнер с мусором и прочищать воздушный фильтр, который за пару сессий забивается песком. Тем не менее, за прошедший месяц он несколько раз застрял:
  • Один раз намотал на щётку шнурок от ботинка. Перевоспитываемся и прячем шнурки внутрь.
  • Один раз он наехал на маленькую деталь от конструктора, засосать не смог и съехать тоже, но правильно определил "неполадку" и остановился. Берём на заметку и убираем все мелкие вещи с пола.
  • Один раз намотал на щётку гардину, которая касалась пола. Мы же мотаем на ус и стараемся подвешивать гардины на расстоянии.
Производимый шум (который, конечно же, меньше обычного пылесоса) хотелось бы ещё уменьшить, но это – совсем другая история.

По НТВ в передаче "Чудо техники" рассказано, как тестировать роботов.

Дополнение от 14.11.2012:

В ALDI до  18.11.2012 будет продаваться такой же, как у  меня робот. Спешите приобрести.


Дополнение от 06.07.2013:

В ALDI с 06.07.2013 будет продаваться другой робот. Его бренд не установлен:









Дополнение от 15.07.2013:


iBood предлагает купить iRobot Roomba 760 и Mamirobot K7.

Sunday 22 July 2012

Лето без остановок

Всё-таки как приятно упасть в кресло в собственном саду и потихоньку потягивать Leffe Blond. И пусть вот у тех соседей через один сегодня какой-то праздник, а у этих соседей напротив так пронзительно тявкает собачонка, а у ближних работает какой-то пылесос – главное, что мой внутренний мир спокоен и расслаблен. В беге подготовки к переезду, собственно самого переезда 23-го июля, Electric Family 30-го, крестин 7-го, празднования годовщины 15-го, подготовки к отпуску 21-го… ну должна же найтись хоть минутка для себя!

Лето в экваторе, за окном (не) голландская погода, то бишь солнышко. Благодать.

Нужно сделать самую малость: покрасить вешалку, покосить траву, обрезать кусты, вынести мусор, развесить одежду в шкафу, перестирать всё, вымыть пол на двух этажах, подклеить плинтус… и потом можно уже ехать в тыкве на бал и в ста́рика сыграть. Однозначно, отпуск уже начался! А что, завтра – на работу!?! Это всего лишь на два дня: уже в среду помчит меня Belavia домой в Минск, где ждут меня… не буду говорить что: вы только расстроитесь.