Vugluskr
работа программирование Очередная закавыка на упоминавшемся проекте. Но так как она весьма типична, то решил описать.

Вот есть ресурсы, которые расшарены между сессиями (операторы составляют пакеты задач, которые станут расписанием для ресурсов). У каждого ресурса есть свой приоритет типа статический, меняется только применением самого ресурса где-то. То есть, если ресурс "занят" в 5 процедурах за день, то его статический приоритет равен 5, условно. Есть приоритет динамический, зависит от текущего набора задач во всех сессиях, где этот ресурс потенциально может быть использован. Ядро умеет всё это дело динамически крутить-вертеть и компоновать так, чтобы операторы получали непротиворечивые данные, чтобы ресурсы не были забронированы одновременно на несколько задач.
И вот есть закавыка — оператор в определенных условиях может начать бронирование с определенного ресурса. То есть, сначала выбран ресурс, а потом уже накидываются задачи. И бизнес пожелал, чтобы при постановке задачи, при распределении исполнителей на роль в первую очередь был выбран тот ресурс, с которого оператор начал сессию бронирования. Казалось бы, чо там — приоритеты же. Но оба приоритета блять обслуживаются централизованно, ядром. А тут в сессии надо просто изначально "предпочесть" ресурс! Были мысли и про модификаторы и про сессионный процессинг. Полный пиздец, очень накладно.
Тут на помощь приходит гуй! В интерфейсе оператор может по своему усмотрению сменить исполнителя в роли, на любого из доступных. Это норм, это user action, всё зашибись. Ну так и давайте типа оператор "кликнул" первым делом на наш этот ресурс, чо там :)
Всё работает, все довольны, зашибись. Только вот смотрю на это с т.з. алгоритмистики и data flow. Взяли задачу, выдрали нужные "роли", собрали ресурсы, посчитали занятость, отобрали подходящих, отсортировали по приоритетам, построили расписание, выдали сессии все расчеты, выгрузили в гуй. И тут же блять "кликаем", повторили весь цикл заново :)
Атас. Не делайте так.

PS. Это вопрос проектирования и архитектуры, есичо. Не предусмотрели в начале.
Vugluskr
работа программирование Есть специфический проектик. Морда на ваадине, унутрях — спринг с этими вашими DI и хибернейт с этими вашими ентитями.
Помимо обычных юзерских сессий есть сессии логические — по редактированию и коллективному резервированию общих ресурсов.
4-ый день решаю задачку по корректному захвату и отпусканию ресурсов.
Доходит до маразмов. Есть сложная многокомпонентная форма из нескольких, не связанных между собой блоков. Один из блоков — листинг контейнеров. В каждом контейнере — набор ресурсов (уникальный). Еще один из блоков — нечто вроде графика Гантта, отображение занятости ресурсов. Когда в графике окошко двигают — што-то меняется, в табличке нужно данные переписать. Когда в табличке что-то меняют — в графике нужно соответственно кубики подвигать. Ну суть понятна, да? Ну так вот всё сделали, а блять удаление всего контейнера забыли. Просто в диздоке забыли нарисовать кнопочку удаления :) Ну и экстренно встраивать, понятно. Кнопочка — в табличке. Сделал сначала тупо — по нажатию в табличке дропается строчка, из общей сессии удаляется контейнер, все заинтересованные оповещаются, мол, изменился набор контейнеров (как на добавление), ожидалось, что всё перерисуется и хоп-хей-лалалей. Хуй там! Как водится, всплыли нюансы. В табличке либо не должно быть совсем элементов (контейнеров), либо если есть хоть один — то какой-то всегда "выбран". И вот есть краткий миг, если удаляют выбранный контейнер, когда в табличке есть элементы (она не пуста), а не выбрано нихуя. И тут наступает полный пролапс гениталий. NPE выпадает аж в 5 местах сразу.
Акей, думаю я, пойдём умным путём — сбросим селекшн на соседа, а сами удалимся. Хуй там! Спасибо ебучему клиент-серверу и выбранной концепции "курсора" в общих сессиях — не успевает селекшн переделаться, как мы ломимся со своим удалением и наступает ожидаемый пиздец с NPE.
Акей, думаю я (на третий день ебли), пойдём ваще-пиздец-каким-умным путём — сделаем состояние Stop-The-World на всей морде пока идёт удаление! Дитынахуй сказал мне ваадин, ничо не знаю, у меня всё ровно! И продолжил сбрасывать селект на табличке, точнее, клиент шлёт анселект и дальше всё крутится-вертится невзирая на эти ваши остановки мира :)
Акей, думаю я, щаз сделаем железобетонную логику событие-листенер на ебучее удаление. Делаю, всё железно, всё в тестах збс. И тут на сцену выползает старый добрый сука хибернейт. Ой, а что это вы объектик не отпустили, не евиктнули, а удаляете?! Ненене, так не пойдет, идите-ка вы на хуй, на всякий случай. На этом моменте взвыл. Рвал, метал, вспоминал всех добрыми словами.

Итого, что сейчас — по нажатию на кнопочку отправляется команда в расшаренную логическую сессию. Набор ресурсов выпиливается из общих планов (поклон хибернейту). Все слушатели удаляют из гуя данные по набору (формочки обнуляются, гантт обнуляется — поклон ваадину). Всё это дело на барьере рапортуется. Как все отстрелялись — сессия торжественно командует — такой-то контейнер ёбнут! Все слушатели судорожно у себя обновляют набор контейнеров. Табличка ловит это дело, ищет у себя в потрохах строку контейнера. Если нашла и если строка выбрана — делается селект на любую другую строку. Затем таки строчка убивается. Ура, бля! Наши победили!
Визуально задержка может быть до секунды (превед, расшаренные данные!). За это время вполне успеваешь кликнуть пару раз куда-нить еще.

Ебаный экибастуз.

Дизайнеры! Рисуйте внимательно, бля!
Архитекторы! Проектируйте внимательно, бля!
Манагеры! Горите в аду, сука, со своими ебучими "щаз мы тут костылик за полчаса слепим"!
Vugluskr
Java прожизнь Завтра еду на JPoint. Не докладчиком, просто слушателем. Ни разу в жизни не был на конференциях по софту :) Тащемта, сам не очень понимаю почему эту захотелось посетить o_O
Vugluskr
Java Linux IDEA работа 16-ая идея почему-то взбрыкнула и не захотела по умолчанию запускаться под системным jre, вместо него работала под встроенным. Херь в том, что встроенный — говняшка openjdk. При автокомплите на Map<K, V> это говно не предлагало нормальные HashMap, TreeMap и прочие ConcurrentHashMap, оно их ваще не ставило в список, но зато активно пихало какую-то несуразицу типа HashedMap. Я тупил, не мог понять в чём дело. И тут оно пизданулось громко по sigsegv, полез смотреть лог. А там, мать честная, jre running — openjdk, все дела. Как блять так, откуда?! Посмотрел в запускалку шелловскую, а они оказывается сделали что — раньше она искала последовательно в окружении IDEA_JDK, JDK_HOME, JAVA_HOME, "java" in PATH., а вот начиная с какого-то 14* билда она теперь ищет блять вот так: IDEA_JDK, ../jre, JDK_HOME, JAVA_HOME, "java" in PATH. То есть, если IDEA_JDK не выставить, то похую че там у тебя системное — оно будет крутиться на сраном опене.
А я уж думал багрепорты слать и ваще бесноваться всяко. Но хватило только принудительно указать правильный угол. Мир пока может спать спокойно
Vugluskr
порвало хумор Ветеран ИРА рассказывает сыну о своих приключениях:
— После налета на автоколонну мы отступали несколько дней. Через день у нас закончился весь Гиннес, через два — и весь виски. Мы страдали от жажды, парни были чуть живые.
— Папа, а воды что, не было?
— Не до мытья было, сынок.
Vugluskr
внезапно прожизнь O_o Был тут у офтальмолога. Ну там проверяет всяко, то-сё. Смотрит через какой-то там ***скоп на моё глазное дно и так задумчиво, в никуда, произносит: "Мдаа-а-а.. а яблочки-то глазные у нас небольшие"
Мне кажется, с того момента я стал лучше понимать анекдоты про мужиков с маленькими членами. Даже не знаю почему.
Vugluskr
PDF жизньболь айти В пдф не хранится текст, рамочки и прочая эта ваша хрень. В нём, грубо говоря, хранятся инструкции для плоттера, типа — ставим жало сюда, рисуем отсюда до туда, по такому-то маршруту. Так рисуется всё, что не картинки (они немного иначе). Ну так вот. Есть у вас, предположим, задача — распарсить прайс-лист. Который в табличке. Только табличку вы не можете просто вот взять и получить. Вы можете получить инструкции плоттера. Глифы с буковками распознать довольно просто — словари по шрифтам там же и лежат. И блоки с текстом найти. А составить из этой херни табличку структурированную — это уже только догадками по позиционированию. И самые чудеса начинаются, когда в одной ячейке таблицы несколько строк, да разным шрифтом, да с разными отступами. Тут начинается математический пиздец. Усреднение позиций, выравнивание по этим медианам, нормализация по количеству столбцов/строк. Получается почти всегда. Почти, блядь.
Сильно зауважал ABBYY.
Vugluskr
прожизнь Охуенный способ бросить курить — получить диагноз "эмфизема легких" на КТ.
Через неделю побывать у пульмонолога и узнать, что это просто возрастные изменения структурные и ваще переживать нехер. А курить-то уже бросил вроде...
Vugluskr
Bash прожизнь Unix Периодически натыкался на проблему, что не могу сохранить урл в файлах. Вот есть проект, по нему есть какие-то документы, исходники и кучка урлов на гуглдоки, апи, справочники. Документы и исходники в общей папочке, а вот урлы в пролёте получались. После некоторого размышления сделал следующее — урл это bash-скрипт, который просто открывает этот самый урл в браузере. Ну и название этого скрипта — название собсно содержимого. Получилось ровно то, что я хотел.
Сам скрипт для bash:

function ulinks() {
echo x-www-browser \'$1\' > $2;
chmod +x $2;
}
alias ulink='ulinks'

Использование с командной строки:
ulink dropbox.com dropbox.url

после чего файлик dropbox.url можно запускать
Vugluskr
*прожизнь *башорг *порвало ххх: Надь, скажи, а ты бы Димона отпустила работать в другой город, но за зарплату в 150 тыщ?
ууу: пинками