juan_gandhi: (Default)
... 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?

web shell

Dec. 7th, 2010 05:58 pm
juan_gandhi: (Default)
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)
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)
Сегодня с утреца поглядел на страницу ексепшенов - ничего нету, всё тихо. Стал было радоваться тихому утру - можно какой-нибудь большой рефакторинг заварить, пока ничего не сломано (предыдущий большой рефакторинг сидит ждёт выхода в продукцию).

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

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

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)
искать, что там вставить в import static в джаве. Простой import эклипс сам находит, а статику не обучен.

now imagine

Sep. 7th, 2010 02:10 pm
juan_gandhi: (Default)
I badly need flatMap in my java code...

definition

Aug. 29th, 2010 11:58 am
juan_gandhi: (Default)
Design patterns are standard tricks in OOP languages used in India in mass software production.
juan_gandhi: (Default)
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)
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)
(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]
}

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

September 2025

S M T W T F S
 1 2345 6
78 9 10 111213
14151617181920
21222324252627
282930    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 13th, 2025 09:53 pm
Powered by Dreamwidth Studios