juan_gandhi: (Default)
2010-12-09 05:40 pm
Entry tags:

Java: enum is the right place for "abstract factories"

... and/or strategies.

I was pondering where do I stick my two factory strategies, or rather strategy factories - wrote an abstract class and thought about having two final static members, with well-named implementations, when it occurred to me - kaboom, it's an enum:
enum GadgetFactory {
  christmasGadget {
    Gadget build(User user, WeakReference<Something>) {
      ...
   },
  newYearGadget {
    Gadget build(User user, WeakReference<Something>) {
      ...
   };

   abstract Gadget build(User user, WeakReference<Something>);
}


Sure it is obvious. But if it is, why people hardly ever do it this way?
juan_gandhi: (Default)
2010-12-07 05:58 pm
Entry tags:

web shell

When I wrote it about 8 years ago, I could never guess that I'd need it later on. Now it is a tool without which I could not do anything. Feeling like will have to work on it, turn it into something more useful.

What I'm currently trying to do now, is build latex from sources (already rsync'd) on the server I renor t for $10/mo, where all I have is the opportunity to upload a war and run my servlets or jsps. Being lazy, I prefer jsps... except for my app which I wrote in Scala... but Scala is not very far from jsp actually.
juan_gandhi: (Default)
2010-11-23 11:24 am
Entry tags:

what do you think of apache commons collections?

Hint: I hate their dumb/ignorant/crazy idea of calling a package "functor", since it deals with functions, and calling a function "closure".

The very fact that it is java 1.4, kind of kills it... I think.
juan_gandhi: (Default)
2010-09-17 01:42 pm
Entry tags:

не было ни гроша да вдруг алтын (из практики программирования)

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

Вдруг кабум, эксепшен. Пошел смотреть в логи, нашел другой. Тут и Адам подоспел, говорит, а чёето у меня транзакция висит по пять минут.

Итак, три кварка к обеду. А что было?

1. Тыпычный дедлок, покажите мне стектрейс, я его починю. У меня когда юзер спасается, то его имущество спасается первым. (When a User is saved, some of its data is saved first). Ну а кое-где у нас порой, в другом коде и в другой транзакции, сначала спасаем юзера, а потом его имущество. Понятно, что эти две транзакции подрались и за юзера, и за имущество. Одна держит имущество, ждёт когда юзера отдадут, а другая наоборот.

2. Протечка транзакции. Затеял один умник устроить кеш на данные. Когда данные нужны, просим кеш, а у кеша есть метод, достающий данные. Он их достаёт через транзакцию. И возвращает. Ну как бы не очень монадично, верно? Так вот, а Хыбернейт, он же ленивый; он возвращает пустые обёртки; мол, попросят конкретный контент, прочитаем. Вот оно в кеше и валяется, нечитаное. И когда дело доходит полистать данные, нет ли там чего хорошего, транзакция давно уже испарилась, а кеш ещё нет. Так что кабум, взрыв на макаронной фабрике, выдёргивание из шляпы несуществующего кролика. Ну чё, надо немножко реифицировать, если решили покешировать.

3. Загадка. Адам пишет, мол, транзакция виснет. Посмотрели - виснет на локе, доступ к таблице, где сгенерированные key ranges сидят. Что смешно, в его конкретном случае в этой таблице всего одна строка. И если попинать майсиквел, то имеет место всего одна транзакция. И такое ощущение, что она сама себя и заперла. Следов другой транзакции нету. Да и квери-то весь - update ... set ... where... - одну строку апдейтнуть.

Перестартовали майсиквел, стали смотреть поведение. Оказалось, к этой таблице идёт бурный поток запросов, текущий ключ увеличивается на 100 несколько раз в секунду. Чтоб не разбираться в глюках, я просто увеличил размеры key range в 200 раз - и майсиквел затих. Всё работает, в смысле. Сейчас пойду поработаю над генератором ключей, чтобы он статистику подбирал да фиксил range size, пока не добьётся, чтобы не больше одного типа запроса в десять секунд. Какая разница, длинных чисел нам до сингулярности должно хватить. А там, глядишь, ещё 64 бита в дискурс добавят.
juan_gandhi: (Default)
2010-09-17 11:56 am
Entry tags:

а ещё затрахало...

искать, что там вставить в import static в джаве. Простой import эклипс сам находит, а статику не обучен.
juan_gandhi: (Default)
2010-09-07 02:10 pm
Entry tags:

now imagine

I badly need flatMap in my java code...
juan_gandhi: (Default)
2010-08-29 11:58 am
Entry tags:

definition

Design patterns are standard tricks in OOP languages used in India in mass software production.
juan_gandhi: (Default)
2010-08-28 08:33 am
Entry tags:

visitor pattern

It's just pattern matching + monadic lifting. Omg. The problem was in language.[livejournal.com profile] kouzdra was right, all these patterns are just a set of dirty tricks that are good only when our language language is too bad.
juan_gandhi: (Default)
2010-08-24 04:34 pm
Entry tags:

(java) functionality right in an interface

interface BlaBlaBla {
  Function<X,Y> fun1 = new Function<X, Y>() {
    Y apply(X x) {
      ...
    }
  };
...
}


That's what I do, and I would not do it if I thought it were wrong.
juan_gandhi: (Default)
2010-07-15 10:31 am
Entry tags:

java question

(pls don't laugh)

So, really, in Java we cannot declare Functor, like in Scala?

trait Functor[F[_]] {
  def fmap[A, B](r: F[A], f: A => B): F[B]
}