Home

Реклама

Настроить

Любопытно


То, что я узнал от умных людей :)

Свежие записи · Архив · Друзья · Личная информация

* * *
Disclaimer
Это журнал для публикации различных интересных ссылок и материалов, на которые я натыкаюсь в процессе инет-серфинга.

Основные темы: computer science, программирование (включая различные экзотические языки), методики проектирования и разработки, веб-разработка.
Но возможно изредка будут появляться и "человеческие темы" из тех, которые мне интересны.

Форматы
1. Подбор ссылок с краткими описаниями
2. Конспекты книг и статей (по возможности со ссылкой на первоисточник).
Так как я не уверен, как соотносится конспектирование с авторским правом — часть конспектов книг в friends only.

Теги:
конспект статей и книг
заметки там, где слишном много или неинтересно выписывать основные мысли статьи
реферат для компиляций из нескольких статей.

Так как мне скучно идти всё время от "нуля" к вершинам, то записи с пометкой основы будут перемежаться с advanced.

Полный список использованных тегов здесь.

Also:
мой shared list из Google Reader [rss].

Этот пост можно также использовать для срочной связи.
Основной журнал [info]_radiant_ [для чтения френдов и анонсов].
* * *
Решил перейти к записям с подсветкой кода, поэтому поискал, что уже есть готового.

Например, в обозримой мной части русской блогосферы C++ модно подсвечивать с помощью Winnie Colorizer by [info]_winnie. К сожалению, сие с Java не работает.
Для standalone блогов мне известен highlight.js от Ивана Сагалаева. Но в LiveJournal свой js не подключишь.

В общем, перебрал несколько вариантов, остановился на Java2Html, поддерживает несколько вариантов вывода: с помощью css или с inline fonts, в RTF, TeX, XML.
Что очень для меня важно, есть плагин для Eclipse.

Сам код HTML в варианте inline fonts получается страшненький, но в общем и целом нормально...

Метки: , , ,

* * *
Пояснение к предыдущей записи:

Я был очень утомлен, что несколько дней потерял на такую ерунду.
Как мне подсказал гугл, проблема такая была не только у меня одного: тема на forums.java.net раз, тема два.
Но предложенные там варианты решения, как видите, совершенно не годятся [ разве что отчасти из-за (2) меня и осенило ]

Видимо, когда мы пытаемся вытащить сущность из native query с помощью resultClass=TableEntity.class, TopLink не может нормально разобрать DatabaseRecord, нужные нам значения находятся в каких-то странных ключах (ну а почему ничего в ключах не выводится?!), и мы вылетаем с exception.
Простая попытка заменить на resultSetMapping не помогла, почему-то вместо тех же pt_id маппингу очень хочется значения my_table.pt_id — и об этом в доке явно не написано. Ну что ж, мы не жадные, дописали несколько символов...
Вполне возможно, что эта круговерть с resultClass происходит из-за "сложного" запроса, у меня там и группировка, связывание нескольких таблиц [автоматически сгенерированный запрос был ужасным, > 60sec auto-generated vs ~0.03 ms native]

В процессе нашёл некие исходники классов TopLink'а (спустя пару часов мне надоело разбираться в их java bytecode ;) в glassfish{WP}, насколько я понимаю, реконструированные нет, WP утверждает, вполне официальные. Много думал.

Метки: , , ,

музыка:
Yann Tiersen - Soir de fete
* * *
[ Sorry for bad English, I do my best... :) ]

Keywords: native query, TopLink, Oracle, OC4J, The primary key read from the row DatabaseRecord null during the execution of the query was detected to be null. Primary keys must not contain null.

Disclaimer: I still don't understand why second example works, but first does not, so any explanations and help are welcome.

I have spent last three days trying to fix strange bug.
First of all, I work with some big query on big table, so I could not use auto-generated "entity"-queries and I have to use complex native queries.
Secondly, this table was created with composite primary keys, so my first try just doesn't work:

invalid )

As result, the following exception happened:
Exception [TOPLINK-6044] : oracle.toplink.essentials.exceptions.QueryException
Exception Description: The primary key read from the row [DatabaseRecord(
=> 111
=> 2007-12-17 11:27:16.0
=> 18)] during the execution of the query was detected to be null. Primary keys must not contain null.
Query: ReadAllQuery(test.TableEntity)
at oracle.toplink.essentials.exceptions.QueryException.nullPrimaryKeyInBuildingObject(QueryException.java:808) [and so on]


Sadly, googling does not help :(
Using "cut-and-try method" I found that code below works properly, exactly as I need:

valid )
Метки: , , , , ,
* * *
[ Заголовок, конечно, спорный. Конкурентов у технологии много, у них хорошие позиции. Но посмотрим, что получится. ]

Про Google Android{W} и их конкурс на 10m$ для разработчиков слышали, наверно, все, поэтому просто подборка ссылок: [освобождаем табы в браузере, да]
1. Официальный сайт с SDK
2. Сторонний простенький пример с file system explorer
3. Русский блог человека, который вроде старается отслеживать ссылки по теме, и пишет статьи на русском
4. Официальный блог (пишут редко).
5. подборка видео от создателей на youtube
6. Приятный (по наполнению :) ) блог, с насколько я понял исходниками и играми с google api, в частности, несколько последних постов об ndoid
Метки: , , , ,
* * *
Подбор ссылок по результатам разборок с Google Web Toolkit{W}.

Основной сайт.
Сам GWT крут только самой идеей компиляции Java в клиентский JavaScript (сама библиотека хороша, но ничего особенного).
(Мне реально даже страшно подумать, сколько всего там пришлось сделать. В смысле, основные java библиотеки даны с исходниками, но я в них не разбирался, не было времени.)

Минус:
Клиентская часть должна быть написана на Java 1.4, естественно, включая модели, которыми будем обмениваться между клиентом и сервером. А значит, ни generics, ни аннотаций — недоступны соответствующие проверки на compile-time :(
[что забавно, для ускорения сериализации/десериализации на клиенте им всё-таки привелось ввести псевдо-аннотации в Java-Doc для generics...]

На моих задачах браузеры отжирают на интерпретации по 10-20 Мб (это, естественно, уже с данными), так что для обычного webdev'а библиотека не пойдет, а вот для enterprise — очень даже. С одним НО:

Нужно использовать дополнительную библиотечку (например, GWT-Ext).
Она предоставляет очень симпатичный GUI, с приличной моделью данных.
Попытка использовать исходный GWT — ведёт к заморочкам с html-css-вёрсткой.

А теперь собственно подборка:
1. Краткий GWT FAQ (там, например, есть ссылка на плагины в IDE).
Лично мне помогло разобраться, как достучаться до стандартного сервлетного HttpSession — потребовался для правильно работы с web вариантом JFreeChart (о котором, надеюсь, скоро расскажу).
2. Tutorials: Start GWT using Eclipse, официальный Getting Started.
3. GWT Widget Library, обертка для GWT, которая хороша серверной частью — возможностью проще работать в связке GWT+Spring.
3. Более внушительная подборка ссылок по теме GWT (+ ещё FAQ)

Метки: , , ,

* * *
Фактически, ссылка дня.

« ИНТЕРВЬЮ ГЛАЗАМИ ПОСТРАДАВШЕГО»

Описание организации интервью кандидатов в одной game-dev фирме.
В частности, с примерами вопросов (много специфичного для gd, но тем не менее).

Метки: , ,

* * *
1. Generics question
Мелкая "закавыка", но зато нарвался на неё сам.

Что выведет программа?
class Foo {
	private List list = new ArrayList();
	protected List getListForAppend() {
		return list;
	}
}
class Elem {
	@Override
	public String toString() {
		return "Surprize!";
	}
}
class Bar extends Foo {
	private List<Elem> list = new ArrayList<Elem>();
	protected List<Elem> getListForAppend() {
		return list;
	}
}
class Test {
	static void first(Foo f) {
		f.getListForAppend().add("aaa");
	}
	static void second(Bar b) {
		for (Elem e: b.getListForAppend()) {
			System.out.println("Element: "+e);
		}
	}
	public static void main(String[] args) {
		Bar b = new Bar();
		first(b);
		second(b);
	}
}
ответ )
Метки: ,
* * *
5. "What the Bleep"
public class Bleep {
	String name = "Bleep";
	void setName(String name) {this.name = name}
	void backgroundSetName() throws InterruptedException {
		Thread t = new Thread() {
			@Override public void run() { setName("Blat"); }
		}
		t.start();
		t.join();
		System.out.println(name);		
	}
	public static void main(String[] args) {
		new Bleep().backgroundSetName();
	}
}
ответ )
6. "Beyond Compare"
public class BeyondCompare {
	public static void main(String[] args) {
		Object o = new Integer(3);
		System.out.println(new Double(3).compareTo(o) == 0);
	}
}
ответ )
7. "Fib O’Nacci"
public class Fibonacci {
	private static final int LENGTH = 7;
	public static void main(String[] args) {
		int[] fib = new int[LENGTH];
		fib[0] = fib[1] = 1;
		for (int i=2; i<LENGTH; i++) 
			fib[i] = fib[i-2] + fib[i-1];
		System.out.println(Arrays.asList(fib));
	}
}
ответ )
8. "Parsing Is Such Sweet Sorrow"
public class Parsing {
	public static Integer parseInt(String s) {
		return (s == null) ? (Integer) null : Integer.parseInt(s);
	}
	public static void main(String[] args) {
		System.out.println( parseInt("-1") + " " + parseInt(null) + " " + parseInt("1"));
	}
}
ответ )
Метки: ,
* * *
&quot;The Continuing Adventures of Java Puzzlers: Tiger Trap", Joshua Bloch, Neal Gafter, JavaOne Conference [pdf]

1. "Odd Behavior"

public class OddBehavior {
	public static void main(String[] args) {
		List<Integer> list = Arrays.asList(-2, -1, 0, 1, 2);
		boolean foundOdd = false;
		for (Iterator<Integer> it = list.iterator(); it.hasNext(); ) 
			foundOdd = foundOdd || isOdd(it.next());
		System.out.println(foundOdd);
	}	
	private static boolean isOdd(int i) {
		return (i&1) != 0;
	}
}
ответ )
2. "Set List"
public class SetList {
	public static void main(String[] args) {
		Set<Integer> set = new LinkedHashSet<Integer>();
		List<Integer> list = new ArrayList<Integer>();

		for (int i = -3; i < 3; i++) {
			set.add(i);
			list.add(i);
		}
		for (int i = -3; i < 3; i++) {
			set.remove(i);
			list.remove(i);
		}
		System.out.println(set + " " + list);
	}
}
ответ )
3. "Powers of Ten"
public enum PowerOfTen {
	ONE(1), TEN(10), HUNDRED(100) {
		@Override
		public String toString() {	
			return Integer.toString(val);
		}
	};
	private final int val;
	PowerOfTen(int val) {this.val = val; }
	@Override
	public String toString(){
		return name().toLowerCase();
	}

	public static void main(String[] args) {
		System.out.println(ONE + " " + TEN + " " + HUNDRED);
	}
}
ответ )
4. "Testy Behavior"
import java.lang.reflect.*;
@interface Test {}
public class Testy {
	@Test public static void test() {return; }
	@Test public static void test2() { new RuntimeException; }
	public static void main(String[] args) throws Exception {
		for (Method m : Testy.class.getDeclaredMethods()) {
			if (m.isAnnotationPresent(Test.class)) {
				try {
					m.invoke(null);
					System.out.println("Pass ");
				} catch (Throwable ex) {
					System.out.println("Fail ");
				}
			}
		}
	}
}
ответ )
Метки: ,

* * *
5. "Mind the Gap"
Что выведет программа?
import java.io.*;
public class Gap {
	private static final int GAP_SIZE = 10*1024;
	public static void main(String[] args) throws IOException {
		File tmp = File.createTmpFile("gap", ".txt");
		FileOutputStream out = new FileOutputStream(tmp);
		out.write(1);
		out.write( new byte[GAP_SIZE] );
		out.write(2);
		out.close();
		InputStream in = new BufferedInputStream( new FileInputStream(tmp) );
		int first = in.read();	
		in.skip(GAP_SIZE);
		int last = in.read();
		System.out.println(first + last);
	}
}
ответ )
6. "Histogram Mystery"
Что выведет программа?
public class Histogram {
	private static final String[] words = {"I", "recommend", "polygene", "lubricants"};
	public static void main(String[] args)  {
		int[] histogram = new int[5];
		for (String word1 : words) {
			for (String word2: words) {
				String pair = word1 + word2;
				int bucket = Math.abs(pair.hashCode()) % histogram.length;
				histogram[bucket]++;
			}
		}
		int pairCount = 0;
		for (int freq: histogram) 
			pairCount += freq;
		System.out.println(‘C’+pairCount);
	}
}
ответ )
7. "A Sea of Troubles"
Что выведет программа?
public class Hamlet {
	public static void main(String[] args) {
		Random rnd = new Random();
		boolean toBe = rnd.nextBoolean();
		Number result = (toBe || !toBe) ? new Integer(3) : new Float(1);
		System.out.println(result);
	}
}
ответ )
8. "Ground Round"
Что выведет программа?
public class Round {
	public static void main(String[] args) {
		Random rnd = new Random();
		int i = rnd.nextInt();
		if (Math.round(i) != i) 
			System.out.println("Ground Round");
	}
}
ответ )

Выводы:
Java относительна проста и элегантна, но имеет некоторые «острые» углы — избегайте их.
Держите программы простыми и элегантными.
Используйте FindBugs — он находит много таких ошибок.
Если вы не уверены, что делает программа, скорее всего она делает не то, что вы хотите.
Метки: ,
* * *
Josh Bloch, William Pugh, Java Puzzlers Epizode VI, Google TechTalks [video @ video.google.com]

1. "Joy of Sets"
Что выведет программа?
public class ShortSet {
	public static void main(String[] args) {
		Set s = new HashSet();
		for (short i=0; i < 100; i++) {
			s.add(i);
			s.remove(i - 1);
		}
		System.out.println( s.size() );
	}
}
ответ )
2 "More Joy of Sets"
Что выведет программа?
import java.net.*;
public class UrlSet {
	private static final String[] URL_NAMES = {
		"http://javapuzzlers.com",
		"http://apache2-snort.skybar.dreamhost.com",
		"http://google.com",
		"http://findbug.sourceforge.com",
		"http://javapuzzlers.com",
	};
	public static void main(String[] args) throws MalformedURLException {
		Set favorites = new HashSet();
		for (String urlName : URL_NAMES)
			favorites.add( new URL(urlName) );
		System.out.println( favorites.size() );
	}
}
ответ )
3 "Race Little Number"
Как часто этот тест будет проходить?
public class Test extends junit.framework.TestCase {
	int number;
	public void test() throws InterruptedException {
		number = 0;
		Thread t = new Thread( new Runnable() {
			public void run() {	
				assertEquals(2, number);			
			}
		});
		number = 1;
		t.start();
		number++;
		t.join();
	}
}
ответ )
4. "Elvis Lives Again"
Что выведет эта программа?
public class Elvis {
	public static final Elvis ELVIS = new Elvis();
	private Elvis() {}
	private static final Boolean LIVING = true;
	private final Boolean alive = LIVING;

	public final Boolean lives() { return alive; }

	public static void main(String[] args) {
		System.out.println( ELVIS.lives() ? "Hound Dog" : "Heartbreak Hotel");
	}
}
ответ )
Метки: ,
* * *
У меня в rss-reader постоянно попадаются различные обсуждения о работах.
Как проходить собеседования, о размерах достойной оплаты и т.п :)

Thirteen Patterns Of Programmer Interviews via [info]scoon_the_crazy

Interviewing at Microsoft
Блог c подборкой историй о разных интервью в указанной компании...

У русскоязычного сотрудника этой компании несколько интересных сообщений в блоге под категорией job search.

[info]aivanov (Андрей Иванов, раньше был директором питерского Борланда, теперь директор питерского Яндекса)
«Про Мотивацию» (в частности, и про зарплату и компенсацию) [1, 2, 3, 4, 5]

Регулярно "зажигают" за жизнь программиста (и не только о его работе) у сотрудника питерского офиса Яндекса и главного организатора питерской JUG [Java User Group] [info]yakov_sirotkin.
Из последнего, например:
«Почему грустит HR»
«Почему программисты работают медленнее, чем хотят менеджеры»
«Про мотивацию»

О резюме:
Кроме детализированной критики стандартных резюме у вышеупомянутого Not a kernel guy, на проблему есть другие взгляды: от полушутливого совета "Резюме должно умещаться в sms" от Aнатолия [info]anatolix Орлова (руководителя одного из московских отделов Яндекса, которые занимаются веб-поиском) до "резюме не нужно".

Совет: шансы получить умную работу можно повысить решая разные умные задачки ;)

Метки: , ,

* * *
По наводке от [info]e_v_ches.

4. Что напечатает программа?

class A {
	static int x = B.x+1;
}
class B {
	static int x = A.x+1;
}
class Test {
	public static void main(String[] args) {
		System.out.print(B.x + " ");
		System.out.print(A.x + " ");
	}
}
ответ )
Метки: ,

* * *
Java Language Specification, 12. Execution.

12.1 Запуск виртуальной машины.
12.5 Создание новых экземпляров класса
12.6 «Утилизация» (finalization) объектов.
12.7 Выгрузка (unloading) классов и интерфейсов.

Read more... )
* * *
Взяты из The Java Language Specification, "12. Execution"
1. Что напечатает программа?
class Super {
        static { System.out.print("Super "); }
}
class One {
        static { System.out.print("One "); }
}
class Two extends Super {
        static { System.out.print("Two "); }
}
class Test {
        public static void main(String[] args) {
                One o = null;
                Two t = new Two();
                System.out.println((Object)o == (Object)t);
        }
}

Ответ )
2. Что напечатает программа?
class Super { 
        static int taxi = 1729; 
        static { System.out.print("Super "); }
}
class Sub extends Super {
        static { System.out.print("Sub "); }
}
class Test {
        public static void main(String[] args) {
                System.out.println(Sub.taxi);
        }
}

Ответ )
3. Что напечатает программа?
interface I {
        int i = 1, ii = Test.out("ii", 2);
}
interface J extends I {
        int j = Test.out("j", 3), jj = Test.out("jj", 4);
}
interface K extends J {
        int k = Test.out("k", 5);
}
class Test {
        public static void main(String[] args) {
                System.out.print(J.i + " ");
                System.out.print(K.j + " ");
        }
        static int out(String s, int i) {
                System.out.print(s + "=" + i + " ");
                return i;
        }
}

Ответ )
4. Что напечатает программа?
class Super {
        Super() { printThree(); }
        void printThree() { System.out.println("three"); }
}
class Test extends Super {
        int three = (int)Math.PI; // That is, 3
        public static void main(String[] args) {
                Test t = new Test();
                t.printThree();
        }
        void printThree() { System.out.println(three); }
}

Ответ )
Метки: ,
* * *
Ура! Наконец-то я немножко разгрузил свой браузер от открытых табов :)

Далее в программе: кроме таких же интересных мне ссылок с различных rss, будут попытки разобраться во всяких cool things, которые давно стоят в списке To Do [monads, Haskell, Erlang, so on].

Формат у них скорее всего будет совершенно другой: первым делом ссылка на статью, а потом реферат из того, что я понял-пытался сделать и открытые вопросы — для меня лучший способ запомнить/разобраться это всё-таки попробовать и записать, ибо видимо у меня "механическая память".

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

Такие дела.

Метки:

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

lktalks, « Архивы в сети »

Ссылки на архивы Дейкстры, Ершова, Тьюринга и так далее. И не только (архивы Российской Академии Наук, работы Гаусса, Ньютона).

В общем, интересно.

* * *
В сообществе [info]ru_java всё время её существования регулярно (который год!) задаются вопросы о профайлеры для performance analysis в Java.
Нет, конечно, есть в HotSpot JVM jvmstat, но лично для меня это как-то хардкордно.

Рекомендуют там чаще всего два:
JProfiler,
YourKit Java Profiler (разработка питерской компании! как выразился кто-то из подписчиков [info]ru_java: "лучше инструменты для Java пишут в Питере" :) )
Доступны и как standalone приложения, так и плагины к IDEA, Eclipse, NetBeans.

К моему сожалению, оба продукта платны (YourKit, как и у IDEA, есть бесплатная лицензия для разработки Open Source продуктов).
Поэтому я продолжил поиски.

Есть в принципе The NetBeans Profiler Project.
Скажу честно, я его даже не пытался пробовать, из-за внутреннего предубеждения против NetBeans IDE. А во-вторых, мне бы желателен плагин для Eclipse, на котором я веду разработку.

Сейчас я для профайлинга использую Eclipse Test&Performance Tools Platform, уникальная вещь, которая в принципе позволяет на этой базе создавать свои собственные "профайлеры".
Если честно, узнал-то я про неё ещё во время стажировки в Интеле, а вот сейчас довелось поиспользовать.

Статьи в помощь в освоении:
Profiling J2SE 5.0 based applications using Eclipse TPTP
Java Application Profiling using TPTP

Документация по Java Performance от Sun:
Java Performance Documentation

* * *
Теперь немножко лирики. Серия записей от Дмитрия Жемерова [info]yole, сотрудника известной питерской компании JetBrains (если кто не в теме: они разрабатывают IntelliJ IDEA, "The Most Intelligent Java IDE" ™)

Размышления о том, цитирую: "чтобы такое подевелопить, чтобы было реально кайфово".

кайфы и эффективность: сложение и умножение,
кайфы и эффективность: инновации,
кайфы и эффективность: количество и качество.

P.S.: Советую у него же прочитать интересный отчет об участии команды в ICFP Programming Contest 2007.
Да и вообще.

Метки: , , , ,

* * *

Previous

Реклама

Настроить