пятница, 26 августа 2011 г.

Java Polymorphism issue



public class XXX {

    @Test
    public void test() {
        B b = new B();
        b.doY();
    }
}



class A {
    public void doY() {
        XProcedure.doX(this);
    }
}


class B extends A {

    public void doY() {
        super.doY();
        XProcedure.doX(this);
    }
}


class XProcedure {

    public static void doX(A a) {
        System.out.println("AAAA!");
    }

    public static void doX(B b) {
        System.out.println("BBBB!");
    }
}


What is output =) ?


Answer:
AAAA!
BBBB!








среда, 10 августа 2011 г.

SOAPFaultException на платформах .NET и Java, опыт работы с JAX-WS

На днях поимел опыт работы с вебсервисами из коробки-моробки JAX-WS.


1. Все исключения выбрасываемые эндпоинтом нужно делать кастомными и аннотировать
@WebFault(name = "CRUDSoapException", targetNamespace = "wsdl.xxx")
см. блог Eben Hewitt 

Иначе на клиента вываливается SOAPFaultException с кускокм строкового говна, который как бы описывает иксэпшн.

2. Все исключения  выбрасываемые эндпоинтом приходят на платформу .NET в виде строкового
 говна (обёрнутого в SOAPFaultException) в не зависимости от способа объявления на эндпоинте.

3.JAX-B может зажевать исключения возникающие при сериализации, и чтобы таки их увидеть нужно включить такой параметр в запуск программы  -Djavax.net.debug=all

4. JAX-B не умеет сериализовать прокси объекты Hibernate (да и вообще - наверное любые сгенерённые прокси). Бороть  так converting-hibernate-proxy-to-real-object
5. JAX-B не умеет сериализовать интерфейсы.  Если есть необходимость использовать интерфейс можно сделать абстрактный класс реализующий этот интерфейс и обвесить его JAX-B аннотациями(@XmlSeeAlso - с указанием классов). В дальнейшем в коде можно будет использовать этот интерфейс добавив для него частный @XmlJavaTypeAdapter, который будет тупо преобразовывать абстрактный класс в интерфейс. 




воскресенье, 20 марта 2011 г.

Наибольшая общая подпоследовательность


public class SequenceTest {
                      //0  1   2  3   4  5  6  7   8
    static int[] qwe = {1, 4, -6, 2, -1, 5, 2, 0, -6};
    //static int[] qwe = {1, 2, 3, 4, 5, 6, 7};

    @Test
    public void test() {

        int maxSum = 0;
        int i1 = 0;
        int i2 = 0;

        int newSum = 0;
        int i1n = 0;
        int i2n = 0;

        for (int i = 0; i < qwe.length; i++) {
            int x = qwe[i];
            if (newSum == 0) {
                i1n = i;
            }
            i2n = i;

            int current = newSum + x;
            if (current > newSum) {//подпоследовательность растёт
                newSum = current;
            } else {//подпоследовательность начала уменьшаться

                if (newSum > maxSum) {//если сумма текущей подпоследовательности больше чем maxSum - запомним её
                    maxSum = newSum;
                    i1 = i1n;
                    i2 = i2n;
                }
                if (current <= 0) {//если подпоследовательность меньше 0 она уже не может быть полезной
                    newSum = 0;
                    i1n = 0;
                    i2n = 0;
                } else {//продолжаем рассматривать уменьшающуюся последовательность
                    newSum = current;
                }
            }
        }

        if (maxSum == 0 && newSum > 0) {
            maxSum = newSum;
            i1 = i1n;
            i2 = i2n;
        }

        System.out.println(i1 + "-" + i2 + "  maxSum:" + maxSum);
    }
}


среда, 16 марта 2011 г.

XStream vs Simple

XStream  быстрее чем Simple приблизительно в два раза. Тестил под Windows. Для теста были созданы сущности с дублирующими друг друга аннотациями для XStream и Simple.




Класс тестика:
package ru.test.serialization;



import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.*;
import org.junit.Test;
import org.simpleframework.xml.convert.AnnotationStrategy;
import org.simpleframework.xml.core.Persister;
import org.simpleframework.xml.strategy.Strategy;
import java.io.StringWriter;
/**
 * @author k.burmistrov
 */
public class SimpleVSXstream {
        @Test public void test() {
        XStream xStream = new XStream(new DomDriver());
        Persister serializer = new Persister();
        long smplstart;
        long smplexecTime = 0;
        Container container;
        long xsstart;
        long xsexecTime = 0;
        String res = "";
        for (int i = 0; i < 100; i++) {
            container = ContainerCreator.getContainer();
            xsstart = System.currentTimeMillis();
            res = xStream.toXML(container);
            xsexecTime = xsexecTime + (System.currentTimeMillis() - xsstart);
            StringWriter writer = new StringWriter();

            try {

                smplstart = System.currentTimeMillis();
                serializer.write(container,writer);
            } catch (Exception e) {
                smplstart = System.currentTimeMillis();
                e.printStackTrace();
            }
            res = writer.toString();
            smplexecTime = smplexecTime + (System.currentTimeMillis() - smplstart);
        }

        System.out.println( "XSTREAM x 100 = " + xsexecTime);

        System.out.println( "SIMPLE x 100 = " + smplexecTime);

        System.out.println("\n" + ContainerCreator.toDebugString(res));
    }
}
Результирующий вывод:
XSTREAM x 100 = 138 SIMPLE x 100 = 213




<CONTAINER PART="0">
   <BIG CODE="String code 50.35868861427403564" LOGIN="String login 50.7245088483040268" SUBADDRESS="0">
      <PART PART="0" SERIAL="0"/>
      <BIG CODE="String code" LOGIN="String login" SUBADDRESS="0">
         <PART PART="0" SERIAL="0"/>
      </BIG>
      <BIG CODE="String code 10.06973240045944129" LOGIN="String login 10.9788960825360289" SUBADDRESS="0">
         <PART PART="0" SERIAL="0"/>
      </BIG>
      <BIG CODE="String code 20.627970543681521" LOGIN="String login 20.5815827829176397" SUBADDRESS="0">
         <PART PART="0" SERIAL="0"/>
      </BIG>
      <BIG CODE="String code 30.9800044849451679" LOGIN="String login 30.5987182743788726" SUBADDRESS="0">
         <PART PART="0" SERIAL="0"/>
      </BIG>
      <BIG CODE="String code 40.9685538564759587" LOGIN="String login 40.11954755881153056" SUBADDRESS="0">
         <PART PART="0" SERIAL="0"/>
      </BIG>
   </BIG>
   <BIG CODE="String code 60.9978869534936364" LOGIN="String login 60.22744058846132909" SUBADDRESS="0">
      <PART PART="0" SERIAL="0"/>
      <BIG CODE="String code" LOGIN="String login" SUBADDRESS="0">
         <PART PART="0" SERIAL="0"/>
      </BIG>
      <BIG CODE="String code 10.06973240045944129" LOGIN="String login 10.9788960825360289" SUBADDRESS="0">
         <PART PART="0" SERIAL="0"/>
      </BIG>
      <BIG CODE="String code 20.627970543681521" LOGIN="String login 20.5815827829176397" SUBADDRESS="0">
         <PART PART="0" SERIAL="0"/>
      </BIG>
      <BIG CODE="String code 30.9800044849451679" LOGIN="String login 30.5987182743788726" SUBADDRESS="0">
         <PART PART="0" SERIAL="0"/>
      </BIG>
      <BIG CODE="String code 40.9685538564759587" LOGIN="String login 40.11954755881153056" SUBADDRESS="0">
         <PART PART="0" SERIAL="0"/>
      </BIG>
   </BIG>
</CONTAINER>



PS: значение атрибутов генериловалось для каждой итерации новое





вторник, 8 февраля 2011 г.

SQL Поиск дырок

Задача:  в последовательности айдишников найти пропуски.

Пример 1: Дырка в одну цифру. 


В таблице "_IDCHECK" нужно
Найти 6.

Наверное проще всего это сделать при помощи left outer join.
Джоиним таблицу саму с собой со сдвигом на 1.
Чтобы понять как это работает сначала посмотрим результаты такого запроса


select a.id, b.id
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)



Осталось выбрать столбцы где  b.id == null


select a.id+1
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
where b.id is null

И убрать последнее значение


select a.id+1
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
where b.id is null  and a.id<(select max(id) from "_IDCHECK" )

ЗЫ: тоже самое можно написать через select


select a.id+1 from "_IDCHECK" as a
  where not exists(select * from "_IDCHECK" as b where b.id=a.id+1)








пятница, 26 ноября 2010 г.

NEUROMANCER переводы на русский



Русский(Б.Кадников, О.Колесников) - http://lib.ru/GIBSON/gibso01.txt
Русский(М. Пчелинцев и Е. Летов)http://lib.rus.ec/b/160980
Английский - http://project.cyberpunk.ru/lib/neuromancer/


Однажды пришли Б.Кадников, О.Колесников(далее БКОК) и перевели Neuromancer.
Сначала они перевели название. Нейромантик. Забавно звучит. Тобишь, есть Нейромант,  а это - рассказ про его маленького сына - Нейромантика. Хорошо что не перевели как Нерво-Сочинитель. Вообще в русском переводе самое оторванное название было бы - мозгопар.  Спустя пару лет после БКОК пришли М. Пчелинцев и Е. Летов(МПЕЛ), и тоже перевелии. Название перевели нормально, а в остальном также. Но перевод МПЕЛ мне как то приятнее читать, и тупят они меньше, хотя точность перевода местами оставляет желать лучшего.  Ну, перейдём к тексту - вот несколько какашечек с перевой же странички.


 1. БКОК Не понял юмор, МПЕЛ молодец 
Eng. `It's not like I'm using,' Case heard someone say, as he
shouldered his way through the crowd around the door of the
Chat.  `It's like my body's developed this massive drug deficiency.'
 БКОК. Проталкиваясь  через  толпу  перед  дверями "Чата", Кейс  услышал,  как
кто-то сказал:
     - Не то чтобы мне все это нравилось.  Просто мой  организм уже привык к
тому, что я в него вкачиваю.
МПЕЛ. — Разве же я употребляю? — услышал Кейс, продираясь сквозь толпу к «Тацу». — Просто у моего организма острая алкогольно–наркотическая недостаточность.


2.БКОК придумал слово, МПЕЛ его переписал 
 Eng. Sprawl (the urban area formed by the expansion of a town or city into surrounding countryside
)
 БКОК. Мурашовник
 МПЕЛ. Муравейник
 Правильный. Окраины, Пригород.  Можнно назвать Бутово(в оригинали это окраины Бостона, так что первая буква хоть правильная)(http://en.wikipedia.org/wiki/The_Sprawl).



3.БКОК упускает детали и путает значения прилагательных, МПЕЛ упускает нюансы словоблудия оригинала
 Eng. Case found a place at the bar, between the  unlikely tan on one of Lonny Zone's whores and the crisp naval uniform of a tall African whose cheekbones were ridged with precise rows of tribal scars
БКОК. Кейс  разыскал  себе место  за стойкой,  между
неприглядным  загаром  одной  из  шлюх Лонни  Зона  и  чистенькой  униформой
высокого африканца, чьи щеки украшали ровные ряды ритуальных шрамов.
МПЕЛ.Тот нашел себе место у стойки между невероятно загорелой шлюхой из команды Лонни Зоуна и высоким африканцем в отглаженной морской форме с аккуратными рядами племенных шрамов на щеках.
Правильный. Кейс  разыскал  себе место  за стойкой,  между
неестественным загаром  одной  из  шлюх Лонни  Зона  и  отглаженной морской униформой
высокого африканца, чьи щеки украшали ровные ряды ритуальных шрамов.



4.БКОК пытается переводить ближе к тексту. МПЕЛ пейсатель сам
Eng.`Isn't you either, sister.  So you vanish, okay?  Zone, he's
a close personal friend of mine.'
  She looked Case in the eye and made the softest possible
spitting sound, her lips barely moving.  But she left.
БКОК. - К тебе это тоже относится,  сестренка. Линяй отсюда, ага? Зон -  один
из моих друзей.
     Девушка  посмотрела  Кейсу  в  глаза  и  изобразила  плевок, но  тем  и
ограничилась. Затем молча встала и отошла.
МПЕЛ.— И у тебя, цыпа, тоже не выйдет. И вообще, вали–ка ты отсюда. Мистер Зоун — мой лучший друг.
Девица в упор взглянула на Кейса и беззвучно ощерилась. Но все–таки ушла.
Правильный. И у тебя тоже сестричка, так что исчезни, ладно? Мистер Зоун — мой хороший друг. Шлюшка посмотрела Кейсу в глаза и тихо сплюнула, её губы дрогнули. Но она ушла.

















суббота, 2 октября 2010 г.

SCJP/OCPJP(Oracle Certified Professional Java Programmer)

СОРС
http://in.sun.com/training/catalog/courses/CX-310-065.xml


БРИФ
1)http://www.rsdn.ru/article/java/scjp_article.xml Вспомнить то что не знал.
  Полезность 5 из 5.
3)

SCJP Sun Certified Programmer for Java 6 Study Guide

 Авторы: Kathy Sierra,Bert Bates. Самая клёвая книжка про scjp.
  Полезность 5 из 5.
2) http://topcode.ru/scjp/ Вспомнить то что не знал.
  Полезность 4 из 5.


ХАЛЯВА

1)http://www.javachamp.com Много вопросов. Все не сосчитать!
Полезность 5 из 5.

2)http://www.whizlabs.com/scjp/scjp.html 14 вопросов c объяснениями. Нужна регистрация.
Полезность 4 из 5.
3)http://www.quizful.net/test Нужна регистрация + нужно заработать балы(чтобы пройти scjp) вкладом в развитие сайта(например статью написать) . В основном материал по java 1.4. Если нету лишних часов - лучше не заморачиваться.
Полезность 3 из 5.
4)http://www.ucertify.com 15 вопросов. Нужно устанавливать вражеский ехе. Вопросы содержат некорректные имена, местами перепутаны ответы.
Полезность 3 из 5.


РАЗНОЕ

IO/NIO
java.util.Scanner
FileChannel
FileReader

ЗЫ.
Экзамен не включает вопросы про побитовые операции/сдвиги и тп.