суббота, Февраль 13, 2010

bicycle driven development

ковырял сегодня понемногу один неинтересный никому проект на жаве и захотелось мне в нём преферанса дотнетных делегатов и чуть более удобного ивент хендлинга. гугл сказал, что это можно сделать только через жопу. на выбор было много разных жоп, но ни одна из них мне не понравилась, поэтому пришлось гуглить ещё и изобретать велосипед. главными требованиями были простота и читаемость кода, типизация и отсутствие тучи граблей, свойственных большинству других решений.
решилось всё, конечно же, через рефлекшн. обнаружилось, что можно довольно легко рожать прокси-классы имплементирующие заданный интерфейс. в итоге получился простенький диспатчер умеющий подписывать на себя объекты и отдавать по заданному интерфейсу объект его имплементирующий и дергающий всех подписавшихся (конечно, только тех, кто сам реализует этот интерфейс) за вызываемые от него методы.


class Dispatcher {
public void subscribe(Object observer);
public<T> T invoke(Class<T> cl);
}

class Observable {
private Dispatcher dispatcher;
public interface IEventHandler {
void onEvent(Some args);
}
public void subscribe(Object observer) {
dispatcher.subscribe(observer);
}
public void doStuff() {
Some stuff = getStuff();
dispatcher.invoke(IEventHandler.class).onEvent(stuff);
}
}

class Observer implements Observable.IEventHandler {
public void onEvent(Some stuff) {
dealWith(stuff);
}
}


не дотнетный сахар, конечно, но уже почти то, что нужно. впрочем, не обошлось и без проблем.
во-первых неясно, что делать с возвращаемыми значениями. вернуть я могу ровно один объект, но при последовательном вызове всех подписавшихся вернется от нуля до бесконечности. какой из них возвращать - не ясно. когда подписчиков несколько, дотнет возвращает значение последнего вызова. но что делать если ни один из подписчиков нужного интерфейса не реализует? в дотнете это невозможно, там любой ненулевой ивент всегда имеет хотябы одного подписчика, а я пока возвращаю getDefaultValue(). все хорошо, но ломается на value-типах. похоже, что жава отдает на это всегда null, который при попытке кастовать (где-то в глубине рефлекшна, я возвращаю всегда Object) его к инту бросает NPE.
во-вторых рефлекшн имеет пачку странных особенностей. самая мелкая их них - инстанцирование прокси возвращает Object, а не проксю нужного типа. я могу тут же все это скастовать куда надо, но нафига? оно же сразу знает что я создаю. чего бы это и не возвращать? следующая неприятная мелочь уже серьезнее. делать проксю можно только по интерфейсу, однако класса Interface (навроде Class) у жавы нет. т.е. засунуть туда можно любой класс. и огрести рантайм проблем.
в-третьих это рефлекшн со всеми вытекающими тормозами и хреновыми оптимизациями в jit'е. гугл говорит, что рефлекшн не так уж плох в последних версиях, но он определенно хуже прямых вызовов. еще он говорит, что сделано все это не особо хитро - можно подкопаться к класслоадеру и сунуть в него нагенеренный байткод класса, где каждый метод напрямую вызывает всех подписчиков без всякого рефлекшна. тогда все тормоза останутся только при генерации прокси, которая дальше будет работать как обычный класс:

class ProxyClass implements IRequestedInterface {
private Set<Object> handlers;
void onEvent(Some args) {
for (Object handler : handlers)
if (handler instanceof IRequestedInterface)
handler.onEvent(args);
}
}


и на последок у меня пара вопросов к Кэпу: как такое делают нормальные люди? что можно изменить в моей реализации, если нормальные люди вдруг это не делают никак?

четверг, Январь 21, 2010

подарок супу

на сервере, где хостится lj2rss произошла неведомая ёбаная хуйня и он пролежал четрыре дня. есть подозрение, что пролежит еще пару, пока саппорт не разберется с железякой. привет, Илья.

воскресенье, Декабрь 06, 2009

все идет по плану

внезапно снова бан в жж. на этот раз по айпи. при том, что ни с одного из этих серверов никаких "нарушений" не происходило уже пару месяцев. комментариев, конечно, никаких. что за херня у них там происходит?

ЗЫ и до сих пор ни одной попытки со мной связаться

пятница, Декабрь 04, 2009

сложнейшая задача

получил сегодня письмо от журналиста, пишущего статью о том, как жж забанил тор. интересно, почему у него получилось написать мне, а у Ильи - нет?

вторник, Декабрь 01, 2009

чукча не читатель, чукча писатель

Dear LiveJournal user swined,

You were offering a paid service for free through an external service which, when active, would cause performance issues for LiveJournal, and as such your service was blocked and you were notified of this. You then circumvented the ban through use of a proxy, and as such your account was temporarily suspended.

Regards,
Eric
LiveJournal Abuse Prevention Team


странно, правда? в их же собственных доках буржуйским по белому написано, что такой фичи, как френдлента в рсс у них нет. однако они старательно меня за это банят. странные они там.

ЗЫ прошло уже пять дней, а ответа от многоуважаемого (так лучше?) Ильи Дронова я так и не получил. кажется меня опять пытаются, кхм, обмануть.

суббота, Ноябрь 28, 2009

pic unrelated

четверг, Ноябрь 26, 2009

жж такой жж

пришел вчера в жж такой камент:

Уважаемый пользователь swined.
Вас беспокоит коллектив разработчиков Живого Журнала.
Мы с интересом следим за вашим проектом http://lj2rss.net.ru и хотели бы обсудить с вами некоторые моменты его технической реализации. Свяжитесь, пожалуйста, по этому вопросу с главным инженером компании - Ильей Дроновым по почте id@sup.com или, отправив ему сообщение через Живой Журнал http://www.livejournal.com/inbox/compose.bml?user=igrick.

С уважением,
Команда Живого Журнала


я как честный человек написал им. на утро вместо ответа пришло это:

Уважаемый пользователь Живого Журнала swined,

Вы были проинформированы ранее, что внешний сервис, который Вы запустили, http://lj2rss.net.ru/, нарушал Пользовательское соглашение Живого Журнала, и его доступ на сайт был заблокирован. Так как Вы умышленно обошли этот запрет и продолжили нарушение Пользовательского соглашения, Ваш аккаунт был заблокирован.

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

Однако, имейте в виду, что если Вы продолжите попытки обойти запрет на запуск этого сервиса, Ваше присутствие в Живом Журнале станет нежелательным на постоянной основе.

С уважением,
Персонал Живого Журнала


нихуясебе "моменты его технической реализации". больше похоже на "тонкости сексуальной ориентации руководства жж", которые все желающие могут обсудить с одним из обладателей этой самой ориентации Ильей Дроновым по вышеуказанному адресу.

UPD оказывается по ту сторону жж все-таки читают почту и обещают отвечать, а не отписываться копипастой, как это происходило раньше. посмотрим, чем это закончится.