пятница, 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

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



среда, 29 сентября 2010 г.

BufferedImage getType() returns 0

0 это BufferedImage.TYPE_CUSTOM. С таким типом ряд операций(ресайз/скэйл и тп) с изображением сделать проблематично -   все попытки закончатся 
- java.lang.IllegalArgumentException: Unknown image type 0
Фигня возникла при работе с PNG, причём для одинаковых файлов на разных java машинах возвращался разный тип(TYPE_3BYTE_BGR(5) на jdk 1.6.0_19 и TYPE_CUSTOM(0) на jdk 1.6.0_13 ) .
Для получения BufferedImage  использовался 





   ImageIO.read(new File(configuration.getPath()))
Нашёл следующее  лекарство - определять тип картинки ручками. Лекарство видимо будет помогать только при некоторых случаях. Тип определяется так:





bufferedImage.getColorModel().hasAlpha() ? BufferedImage.TYPE_4BYTE_ABGR : BufferedImage.TYPE_3BYTE_BGR;
Лекарство нашёл тут:








вторник, 31 августа 2010 г.

Двойной диспатч как средство борьбы с неопределённостью типов при компиляции

-----------------------------------------------------
...Ласковое дуновение ветра коснулось выдубленной солнцем и непогодой красной кожи седого индейца. Он поморщился, как будто почувствовал в воздухе что-то неприятное,  и вытянув губы в трубочку начал что то насвистывать себе под нос. Белый человек сидящий напротив него поднял глаза от костра,  упёрся взглядом в грубую тунику седого и задумчиво сказал
- Ты прав Бычий Хуй. Есть что то в двойном диспатче.
Бычий Хуй ничего не ответил. Смотря на пламя костра и продолжая насвистывать странную мелодию он полез за трубкой...
------------------------------------------------------

Двойной диспатч можно любить или не любить. Но ввиду особенностей работы c Java, есть несколько ситуаций, когда без него просто не обойтись. Например когда класс, параметризующий вызов метода, неизвестен при компиляции.

Пример:


    

    import org.junit.Test;

    public class TestABC {

        static class A {
        }
       static class B extends A {
       }
       static class C extends A {
           void print(ABC abc) {
               abc.print(this);
           }
       }
       static class ABC {
           void print(A a) {
               System.out.println("a");
           }   

           void print(B b) {
               System.out.println("b");
           }

           void print(C c) {
               System.out.println("c");
           }
       }


       @Test
       public void test() {

           ABC abc = new ABC();

           A a = new A();

           B b = new B();

           C c = new C();

           //----------------------

           System.out.println("-----------------------");

           abc.print(a);
           abc.print(b);
           abc.print(c);
           //-----------------------

           System.out.println("-----------------------");
            //будет вызван только метод void print(A a) 

           abc.print(a);
           abc.print((A) b);
           abc.print((A) c);

           //-----------------------

           System.out.println("-----------------------");

           ((A)c).print(abc);//вот он красавец - двойной диспатч
       }

   }

   


Вывод:


-----------------------
a
b
c
-----------------------
a
a
a
-----------------------
c






понедельник, 2 августа 2010 г.

Хроники поджаривающегося москвича

27 июля.  В ашане смели всё что крутится и дует. Даже обогреватели.

28 июля.  Мотоцикл админа в течение дня плавно погружался подножкой в асфальт... Чтобы
               избежать окончательного всасывания тс, весом админа единым, в качестве подставки в
               асфальт был погружён старый винт.

29 июля.    Спать под мокрой простынёй не вариант. Высыхает. Пододеяльник держится дольше.

1 августа.   В ночь с пятницы на субботу было зарегистрировано N^3 очагов возгарания. С чего   
                 бы это?

2 августа. Хорошо дымит! Курильщики в шоколаде. АдОптированный к дыму организм         
                 успешно справляется с детским дымом торфяников. А ещё говорят курить вредно.

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

4 августа.  Яндекс пожары показывают только один пожар близь Москвы. Врут.

5 августа.  Гугл читает мысли. Так сильно и далеко  мне хотелось быть от этого сайлентхила что 
                 утром гугл мапс спозиционировал меня в районе Красного Села под Питером.

6 августа.  Знакомая из Анголы сказала, что у них так жарко не бывает.

9.августа.  На выходные ездили с корешами на шашлыки. В Питер. Просто ехали пока не кончился дым. А
               там уже и до финского залива всего ничего осталось. В Питере не забыл заехать в торговый  
               центр и купить респираторов мешок.
                  


вторник, 29 июня 2010 г.

Hibernate and primitive type values

  Примитивные примитивы слишком примитивны для хибернэйта. Парадигму мозгоёбства можно описать следующей фразой одного эксперта:Hibernate doesn't care about values, just mappings(https://forum.hibernate.org/viewtopic.php?t=949814).Сказал в 2004 году - как отрезал. Ничего пока принципиально не поменялось. Геморой проистекает из того, что хибернэйт по-умолчнию вместо примитивных типов пишет в базу null. А потом приводит этот null к примитивам(например int). Так что вылетающие из недр хибернэйта
org.springframework.orm.hibernate3.HibernateSystemException: Null value was assigned to a property of primitive type setter of  MovableObject.movingStatus; nested exception is org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of MovableObject.movingStatus
-"это нормально".

Вообще хибернэйт не обладает magic свойствами, всё что он гарантирует в плане метаданных-
а)При начале работы с чистой бд все мапинги хибернэйта будут промаплены
б)При изменениее мапинга старые данные не будут утеряны

А это означает что изменение мапинга столбцов, таблиц и тп, на уже существующую бд через хибернэйт - будут "как то" применены. "Как-то" - по факту это добавление новых столбцов в таблицу, и сохранение метаданных старых.

Лечение. 

1) 100% лечение. Переписывем все геттеры. вместо примитивных типов используем врапперы (Integer) и делаем их проверку на null

    @Column(name = "OBJECTSTATUS")
    private Integer objectStatus ;


    public int getObjectStatus() {
        if (objectStatus == null) {
            objectStatus = 0;
        }
        return objectStatus;
    }

2) @Column(name = "OBJECTSTATUS", nullable = false)
Лечение работает при вставках новых объектов с незаданными полями, имеет ряд противопоказаний. При добавлении мапинга нового столбца лечение не сработает. Также оно вероятно не сработает если изменить мапинг уже существующей колонки(c firebird 2.1.3+hibernate 3.5.1 не сработает точно).
  
Так же присутствует полный просос при работе с наследованием по @DiscriminatorValue - поля которые казалось бы не используются в объектной модели, очень даже используются в таблицах и как результат - ошибки хибернэйта при попытках кастовать  нулл к примитивам.

3)@Column(name = "OBJECTSTATUS")
    private int objectStatus = 0;
Лечение работает при вставках новых объектов с незаданными полями 

   

Самым правильным наверное будет делать так:

  @Column(name = "OBJECTSTATUS")
    private Integer objectStatus=0;

    public int getObjectStatus() {
        if (objectStatus == null) {
            objectStatus = 0;
        }
        return objectStatus;
    }

-при вставках строк гарантируем что будет выставлен везде 0
-при вставке столбца  гарантируем что не возникнет ошибки и через геттер всегда получим дефолтное значение



PS.
1)прокачать знания про то как 6.2.1. Hibernate event-based validation 2)@NotFound(action=NotFoundAction.IGNORE) - это для объектов

понедельник, 21 июня 2010 г.

String.format depends on locality...

Неожиданно. Сужает область применения String.format до вывода в консоль.
public class xxx {
    @Test
    public void xxxx() {
        double xxx = 123.5657;
        System.out.println(Double.toString(xxx));
        //123.5657
        System.out.println(String.format("%.2f", xxx));//работет прально если Formatter formatter = new Formatter(sb, Locale.US)
        //123,57
        System.out.println((new BigDecimal(xxx)).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
        //123.57
        String.format("%.2f", xxx).replaceAll(",", ".");
        //123.57
    }
}

среда, 19 мая 2010 г.

Hibernate+Collections+N*Thread = ConcurrentModificationException

При сохранении ентитей, содержащих коллекции из нескольких трэдов, возможно ConcurrentModificationException. Вне зависимости от секций синхронизации(с.с.), присутствующих внутри транзакции( типа TransactionTemplate tt = new TransactionTemplate(entityManager.getTransactionManager());), итерации по колециям выполняются вне с.с. при сохранении в базу. Чтобы гарантировать отсутствие ConcurrentModificationException необходимо включить в секцию синхронизации всю транзакцию.

вторник, 20 апреля 2010 г.

Unexpected Log from org.apache.commons.httpclient.Wire

В commons-httpclient-3.1 славный парень Oleg Kalnichevski нахуячил  в классе org.apache.commons.httpclient.Wire :


    public static Wire HEADER_WIRE = new Wire(LogFactory.getLog("httpclient.wire.header"));

   

    public static Wire CONTENT_WIRE = new Wire(LogFactory.getLog("httpclient.wire.content"));



Соответсвенно даже если в log4j.properties прописано что то типа 
log4j.logger.org=WARN
сраный лог из httpclient продолжает валиться.
засим в log4j.properties надо добавить что то вроде
log4j.logger.httpclient=ERROR.

Что интересно, на http://hc.apache.org/httpclient-3.x/logging.html в примере логирования присутствуют указания на эту хрень...

четверг, 15 апреля 2010 г.

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544336. deadlock update conflicts with concurrent update

Эта хрень возникает из за того что два потока пытаются одновременно изменить поля одной и той же ентити. Вот что пишут про это
 http://www.firebirdfaq.org/faq151/ ,
http://edn.embarcadero.com/article/30213.

В целом есть два способа это побороть

1)В коде добавить синхронизацию

2)Разобраться с изоляцией транзакций.
Подробнее:
http://ru.wikipedia.org/wiki/Уровни_изолированности_транзакций
для хибернэйта они задаются параметром  hibernate.connection.isolation в пропертях,
значения описаны в java.sql.Connection:
Наверняка:
для hibernate, в пропертях прописать: hibernate.connection.isolation=8

Выдержки из java.sql.Connection:

    /**
     * A constant indicating that transactions are not supported.
     */
    int TRANSACTION_NONE     = 0;

    /**
     * A constant indicating that
     * dirty reads, non-repeatable reads and phantom reads can occur.
     * This level allows a row changed by one transaction to be read
     * by another transaction before any changes in that row have been
     * committed (a "dirty read").  If any of the changes are rolled back,
     * the second transaction will have retrieved an invalid row.
     */
    int TRANSACTION_READ_UNCOMMITTED = 1;

    /**
     * A constant indicating that
     * dirty reads are prevented; non-repeatable reads and phantom
     * reads can occur.  This level only prohibits a transaction
     * from reading a row with uncommitted changes in it.
     */
    int TRANSACTION_READ_COMMITTED   = 2;

    /**
     * A constant indicating that
     * dirty reads and non-repeatable reads are prevented; phantom
     * reads can occur.  This level prohibits a transaction from
     * reading a row with uncommitted changes in it, and it also
     * prohibits the situation where one transaction reads a row,
     * a second transaction alters the row, and the first transaction
     * rereads the row, getting different values the second time
     * (a "non-repeatable read").
     */
    int TRANSACTION_REPEATABLE_READ  = 4;

    /**
     * A constant indicating that
     * dirty reads, non-repeatable reads and phantom reads are prevented.
     * This level includes the prohibitions in
     * TRANSACTION_REPEATABLE_READ and further prohibits the
     * situation where one transaction reads all rows that satisfy
     * a WHERE condition, a second transaction inserts a row that
     * satisfies that WHERE condition, and the first transaction
     * rereads for the same condition, retrieving the additional
     * "phantom" row in the second read.
     */
    int TRANSACTION_SERIALIZABLE     = 8;

четверг, 25 марта 2010 г.

Recursive generic


Увидел нечто подобное у своего коллеги =)


public class X {

  static class A<T extends A<T>> {

    public T createObejct() {
      return null;
    }
  }

  static class B extends A<B> {
    public B createObejct() {
      return null;
    }
  }
  public static void main(String[] args) {
    new B().createObejct();
  }

}



четверг, 11 марта 2010 г.

Unexpected generics behaviour

If someone knows what the fuck please suggest!




public class Test {

  public interface EntityObject {

  }


  public interface SomeInterface {

  }


  public class BasicEntity implements EntityObject {

  }


  public interface BuisnessObject<E extends EntityObject> {

    E getEntity();

  }





  public interface ComplexObject1<V extends SomeInterface> extends BuisnessObject<BasicEntity> {

  }


  public interface ComplexObject2 extends BuisnessObject<BasicEntity> {

  }


   public void test(){

    ComplexObject1 complexObject1 = null;

    ComplexObject2 complexObject2 = null;

    EntityObject entityObject1 = complexObject1.getEntity();

    //BasicEntity entityObject1 = complexObject1.getEntity(); wtf incompatible types!!!!

    BasicEntity basicEntity = complexObject2.getEntity();

  }

}







среда, 17 февраля 2010 г.

HibernateOptimisticLockingFailureException

При попытке сделать hibernateTemplate.saveOrUpdate(entity) вывалился такой иксэпшн:


org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

Иксэпшн вываливается потому что у entity был id!=null и в базе не было entity с такой id. Фактически хибернэйт при сохранении entity вместо insert пытался сделать update. 

Решил проблему вызов save вместо saveOrUpdate.

Помогла

вторник, 2 февраля 2010 г.

Тануки: комплимент с дерьмом

Есть такая сеть ресторанов -ТАНУКИ. И вот однажды я с другом зашёл  перекусить в ресторанчик на Генерала Белова(вспоминается история про бар кручёная сиська). В ресторане было полно свободных мест и мы выбрали замечательное место в курящем зале. Приветливая официантка-таджичка расторопно принесла меню и заказ был сделан. Принесли его довольно быстро, и трапеза началась. Закончив с едой я решил отведать чаю КОМПЛИМЕНТ. Этот чай разливается бесплатно всем посетителям тануки, основной его ингридиент судя по вкусу - каргадэ.
  Есть у меня такая особенность - не люблю когда в чае сверху плавают чаинки - поэтому когда я пью чай в котором сверху плавают чаинки я на них укоризненно смотрю. Вот и в этот раз. Но в чае плавало нечто, что сразу идентифицировать я не смог. Это нечто было овальной формы, коричневого цвета, где то 4 мм в ширину и около сантиметра в длину. Достав это из чая я подверг найденный артефакт пристальному изучению и выяснил что это кал или очень отожравшейся мыши или средней такой крысы. Я позвал мэнэджера и попросил её объяснить что это такое. Увидев экскременты мэнеджер(миловидная белая девушка) не растерялась и заявила что это такие ягоды,но в принесённых ей позже образцах чая таких ягод больше не попалось(видимо все съели - очень вкусные, правда попробовать эту ягоду мэнэджер отказалась). После этого была выдвинута версия два - это сорт другого чая, который туда случайно попал. Я отщепнул кусочек дерьма и передал его мэнеджеру чтобы она нашла мне такой же чай - больше я этот кусочек не видел, что впрочем меня не особо расстраивает, а вернувшаяся белая девушка мэнеджер заявила что она ничего не искала и не собиралась(куда она ходила с калом в кармене не ясно). Спустя какое то время мэнеджер призвала себе на помощь ещё одного белого человека - мусина в самом расцвете сил. Чертовски логичный. На мой вопрос: "А что вы будете делать если в  чае который вам принесли вы обнаружите дерьмо?" он ответил "Я закажу ещё чая". Короче он почти убедил меня что это не дерьмо а чай ферментированный видимо самим тануки, привезённым из японии.

Выводы:
1)Дерьмо всплывает
2)Не ходите в тануки. Там дерьмо в еде.

суббота, 23 января 2010 г.

How to set Spring bean properties

Казалось бы тривиальная задача. Но вот возникла проблема - а именно вопрос: Как передать в качестве параметров одного бина - параметры другого. Задача возникла исходя из желания конфигурировать org.springframework.beans.factory.config.PropertyPlaceholderConfigurer(умеет врапить проперти из всяких файлов типа config.properties в переменные applicationContext.xml) не из applicationContext.xml, а из командной строки при запуске приложения.