About reflection
[info]ystrot
Не знаю как у вас, но при разработке плагинов к Eclipse reflection - это плохо. Поэтому когда одному плагину не хватает API, которое даёт другой плагин, то программисты гневно пишут разработчикам и требуют API расширить. Это, понятное дело, в идеальном мире. А у нас лишний раз не парятся: нафиг кому-то писать, если можно через reflection установить приватную переменную в нужное значение и всё будет работать? Конечно, мы очень скорбим, материм разработчиков и ждём, когда ситуация исправится.

Но при всём при этом, мало кому из нас приходилось насиловать код так, как недавно пришлось мне. Собственно, нужно было решить простую задачу: у org.eclipse.swt.widgets.Tree забрать org.eclipse.jface.viewers.TreeViewer. Понятно, что Tree и в помине не знает ни про какой viewer (собственно, его может и не быть в общем случае). Более того, TreeViewer, оборачивая дерево, практически не оставил следов. Однако, решение всё-таки нашлось и выглядит оно так:

public static TreeViewer getTreeViewer(Tree tree) {
	return getViewer(TreeViewer.class, tree, SWT.Expand);
}

private static <T> T getViewer(Class<T> clazz, Control control, int event) {
	Listener[] listeners = control.getListeners(event);
	for (Listener listener : listeners) {
		Object lookFor = listener;
		if (listener instanceof TypedListener) {
			lookFor = ((TypedListener) listener).getEventListener();
		}
		try {
			Field this$0 = lookFor.getClass().getDeclaredField("this$0");
			this$0.setAccessible(true);
			Object viewer = this$0.get(lookFor);
			if (clazz.isInstance(viewer)) {
				return clazz.cast(viewer);
			}
		} catch (Exception e) {
			// ignore exceptions
		}
	}
	return null;
}


Происходит здесь вот что: viewer неосторожно добавил listener к tree. Этот слушатель мало того, что может дополнительно оборачиваться TypedListener, так ещё и является анонимным внутренним классом TreeViewer. Поэтому в примере мы проходим по всем слушателям нужного события, опционально избавляем его от Typed-обёртки, а затем спрашиваем не лежит ли он в нужном TreeViewer. При этом, если мы наткнулись на неправильный listener, то скорее всего кинется исключение, которое благоразумно игнорируется.

А как вам приходилось использовать reflection?

Incremental Find with Highlight in Eclipse
[info]ystrot
Как известно, в Eclipse есть одна забавная проблема - в ней нет нормального Incremental Find/Find as you type/Search while typing. Причём, многие Eclipse-разработчики только через пару лет плотной работы со средой замечают неприметную опцию "Incremental" в Find/Replace диалоге. Ещё через год обнаруживают, что можно нажать CTRL+J и поискать нужный текст не вызывая мешающего диалога. Обнаруживают, радуются и забывают. Потому что пользоваться таким поиском нельзя ни в той, ни в другой форме. Не говоря уже об отсутствии а-ля мозиловской подсветки, которая есть даже в NetBeans.

Почему, спрашивается, всё так плохо?

Я задумался над этой проблемой уже почти года два назад. Тогда же написал свою первую версию search while typing и понял, почему этого не сделали раньше. Причин много )

Но два года не прошли даром и тем, что у меня в итоге получилось, я наконец-то доволен :-) Можно даже посмотреть на описание фич на кривом английском, глянуть на картинки, скачать и даже заценить исходники.

Об известных
[info]ystrot
В эти выходные решил рискнуть и пополнить свои друзья Лебедевым и Лукьяненко. Интересно, что чуваки пишут :-) Хотя пока удалось выяснить только то, что первый сейчас пишет про тачки и сиськи, а второй вообще пишет что-то странное =/
Кстати, про второго. Иногда читаю "Недотёпу" и сегодня нашёл там забавный прикол:
 
Он протянул Триксу маленькую, с ладонь размером, книжечку, переплетенную в плотную серую ткань. Зеленой нитью в уголке книжечки было вышито надкушенное яблоко.
 - Что это? - восторженно произнес Трикс.
 - Это - твой первый наладонник, - торжественно сказал Щавель. - Малая книга заклинаний. Я туда тебе кой-чего записал на первое время... заклинания для связи, заклинания для ориентирования на местности, музыкальные заклинания - чтобы непринужденно развлекать публику...
 - А боевые заклинания есть?
 - Ну... скорее, защитные. Огненная стена.
 - Вот это да... - Трикс погладил книжечку по обложке. - А почему тут яблоко?
 - Осторожно! - воскликнул Щавель. - Это не просто яблоко, это запечатлитель...
Палец Трикса внезапно кольнуло и яблоко окрасилось красным.
 - Ай! - завопил Трикс. - Под обложкой игла!
 - Не игла, а магия. Наладонник тебя запомнил, чтобы никто другой не смог им пользоваться! - Щевель покачал головой. - Я только хотел предложить тебе придумать ему красивое имя... Но теперь поздно. Наладонник запомнил то, что ты произнес.
 - И что?
 - Теперь, чтобы открыть книжку, ты должен повторить эту фразу.
 - Ай, под обложкой игла? - ужаснулся Трикс. - Это же глупо! Надо мной смеяться будут!
 - Возможно, он удовлетворится одним-двумя словами, - предположил Щавель.
 - Ай, - печально сказал Трикс, поглаживая обложку. Ничего не произошло. - Ай под...
Книжечка открылась.
 - Ну и нормально, - сказал Щавель, пока Трикс с любопытством разглядывал записанные на плотной кремовой бумаге заклинания. - Ай под... Айпод. Нормальное имя для наладонника. Я знаю магов, у которых книгу заклинаний звали "Чтоза", "Блин" или "Уберитеэту".
Tags:

Eclipse 3.5
[info]ystrot
Наконец-то начал полноценно юзать последний эклипс и сразу столкнулся с парой приятных неожиданностей, про которые не пишут серьёзные дяди в серьёзных статьях серьёзные статьи пиздятся со списков фич, которые эклипсовские проекты иногда пишут.

Самая приятная неожиданность - это p2. Да, он наконец-то работает! И теперь можно смело распихать плагины вот так:
 eclipse/
   dropins/
     gef.link
     emf/
       eclipse/
         features/
         plugins/
     wst/
       eclipse/
         features/
         plugins/

А потом ещё затолкать что-нибудь в eclipse/plugins, а потом воспользоваться стандартным загрузчиком плагинов и не бояться, что это последний раз, когда вы видели эклипсину в целости и сохранности. Я правда пока не понял прелести преображения диалогов, но зато теперь всё можно посмотреть в одном месте, а не как раньше: вот здесь мы смотрим [не]загруженные плагины, вот здесь отключаем ненужные фичи, тут вот скачиваем обновления...

Следующей приятной неожиданностью стала починка Launch Configuration. Наконец-то (!) Eclipse не тормозит при вводе имени конфигурации. Это же как надо было реализовать-то это в ганимеде? о_О Из полезного ещё появились автоматические аргументы в JVM для разных конфигураций, тем самым при разработке плагинов существенно реже сталкиваешься с OutOfMemoryError: PermGen, потому что дефолтная конфигурацию куда ближе к правде, чем то, что по умолчанию об этом думает JVM.

Ещё долатали Plugin Manifest Editor, там теперь работает CTRL+Z/Y (раньше тоже было, но криво), гораздо реже ломается подсветка и что-то ещё приятное было. Что касается редакторов в целом, то я всё-таки прочувствовал прелесть block selection mode. Иногда и правда полезно удалить/добавить/скопировать парочку первых/последних/серединных символов в n строках (на самом деле в far я очень часто юзал эту штуку, но там всё-таки редактор был не такой полноценный). Да, и ещё code completion стал умнее. То ли дело в расстановке скобочек у методов, то ли ещё что, но пользоваться стало явно приятней.

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

Аспирантура
[info]ystrot
Один из актуальнейших вопросов для уважающего себя магистра-разработчика: "А нафиг нужна аспирантура? Чего нового я там могу узнать?". Причём заданный мне неоднократно, как человеку, который туда собирается, он поверг меня в глубокие раздумья. И вот я всё-таки нашёл для себя ответ!

Начнём с того, что в самом вопросе есть подвох. Я собираюсь в аспирантуру не для того, чтобы получить какие-то знания. Собственно, я не для того живу, чтобы накопить кучу знаний и умереть мудрецом. В продвижение по научной лестнице есть два смысла:
1. Применение знаний. Ни для кого не секрет, что наука и реальная разработка ПО весьма далеки друг от друга. Кроме того, большинство студентов отпугивает неграмотность некоторых научных сотрудников в области программирования (из-за чего и возникает вышеуказанный вопрос). С другой стороны, пусть первый бросит в меня камень тот, кто считает, что наука ничего не сделала для программирования. Собственно, с научной деятельности всё и началось. Не говоря уже о том, что какие-нибудь алгоритмы (взять хотя бы data mining) до сих пор придумывается именно в научных лабораториях и обсуждаются на научных конференциях. Ленивые разработчики разве что удосуживаются погуглить на тему "а как быстрее всего сделать вот это". Поэтому, на мой взгляд, у комбинирования опыта реальной разработки и научной деятельности есть огромное будущее.
2. Статус. Да-да, именно PhD. Зачем? Потому что это достижение. Это то, что выделяет человека из кодеров, которые готовы тихо колбасить всю жизнь. Желание получить PhD сравнимо с желанием придумать какой-нибудь прикольный концепт и реализовать. Или поучаствовать в каком-нибудь огромном и всемирно-известном проекте. Это желание славы, желание признания. Желание чего-то достичь. А если вам неведомо это желание, то и аспирантура вам ни к чему.

Конечно, я не считаю, что всем надо срочно идти в аспирантуру на благо человечества. Но, надеюсь, мне хотя бы удастся повысить ваше мнение о тех людях, которые туда собираются.

Tags: ,

AOP+Eclipse?
[info]ystrot
AOP - это, конечно, круто, пока не задаёшься вопросом: "А как эту штуку использовать в моём гиганском приложение?". Например, если это гиганское приложение - Eclipse, базированное на мощном OSGi с ленивой и динамической загрузкой плагинов и другими приятными особенностями.

Но как я на днях узнал, есть Equinox Aspects, а значит всё не так уж и плохо. По сути это интеграция AspectJ с Equinox. Что самое приятное, никакой перекомпиляции всего кода не надо (которая меня периодически фрустрирует, когда упоминается при описании AOP). Всё что надо, это добавить необходимый набор плагинов тем же путём, что и обычные плагины, добавить аргумент к JVM и гарантировать, что сервис AspectJ загрузится раньше, чем те классы, в которые хочется вшить свои аспекты.

Причём не смотря на то, что проект ещё в инкубаторе, работает всё сходу и быстро. Итого, AOP вшивается в современные технологии вполне успешно.
Tags: ,

Языковое многообразие
[info]ystrot
Есть в мире хренова туча мировых языков. Вроде бы их многообразие создаёт неприятный дискомфорт в общении, рождённый историей. Вроде бы уже все кинулись изучать английский. Вроде бы уже придумали эсперанто. Вроде бы уже каждые день умирает по одному ненужному языку... и что вы думаете, в конце останется только один самый лучший язык на котором все будут разговаривать? Да чёрта с два!

Взглянем на наш любимый виртуальный мир, начатый с нуля, без всяких исторических погрешностей. Можно даже грубо сказать, что началось всё с одного единственного языка. И что же мы видим? Java, C++, PHP, Ruby, Python, Scala, Lua, TCL... язык устанет перечислять. И ладно бы сказать, что вот этот язык хорош тут, вот этот тут. Так нет! Находятся же языко-обожатели, которые готовы зубы повыбивать, но доказать, что Ruby лучше C++.

А всё почему? Всё потому что люди многообразны и требуют многообразия. И изъясняться все хотят так, как им удобно, т.е. по-разному. И основных языков всегда будет больше десятка, что для программ, что для общения.

Tags:

Google Wave
[info]ystrot
Давно хотел высказаться по поводу "10 reasons why GoogleTalk sucks". Но возможно это всё-таки стало не актуальным: wave.google.com. Действительно, нафиг доводить до ума это убожество, когда проблему надо решать совсем по-другому.

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

Другой вопрос, хорошо ли, что решением проблемы занялся именно google? С одной стороны, кроме этих ребят вряд ли бы кто осилил. С другой стороны, всё-таки у меня есть пара сомнений в том, что чуваки умеют доводить продукты до такого состояния, в котором ими можно не напрягаясь пользоваться. Будем надеяться, что открытость и расширяемость спасёт мир =)
Tags: ,

Why I'm here?
[info]ystrot
Я не любитель livejournal ровно потому же, почему я не любитель рекламы. Однако, я несколько подустал читать умных и интересных мне людей окольными путями, поэтому Добро мне Пожаловать! Может быть даже буду что-нибудь писать. Если повезёт, оно ещё и будет кому-нибудь интересно.

P.S. Апгрейдом оформления и приучением к фичам буду заниматься позже.
Tags:

Home