yury_finkel: (манул)
Кстати, вчера вечером на работе включили полный функционал на сайте, над которым я работал с мая прошлого года:

http://uln.estate/

Это пост написан отчасти для того, чтобы похвалиться результатом своего труда, а отчасти и как реклама (для поисковых машин главным образом). От его раскрутки зависит моя зарплата (которая на самом деле довольно-таки смехотворна - недавно я упомянул её в фейсбуке, так меня айтишники-москвичи засмеяли, что я, мол, демпингую. Ага, попробуйте в нашем городе найти зарплату повыше). Так что прощенья просим... Кстати, за содержание сайта я никакой ответственности не несу, но всё техническое оформление (включая довольно непростую работу с базой данных) - моё.
yury_finkel: (манул)
Понадобилось мне сделать многошаговую форму (multistep form) aka wizard в Symfony2. Оказывается, это не так просто, как кажется.

Во-первых, стандартных средств для работы с формами недостаточно. В Symfony всё слишком заабстрагировано, так что непосредственно управлять действиями, которые ты хочешь совершить, нельзя. Когда пытаюсь из первой формы передать управление контроллеру второй формы, Symfony считает, что форма _уже_ завершена, т.к. я нажал кнопку submit (судя по всему, она скрыто передаёт какое-то поле с этим признаком) - и вторая форма не отображается, а сразу отрабатывается, как завершённая.

Далее, пришлось искать расширение для этой цели. Нашёл некий Craue Formflow Bundle, установил. Вроде бы работает, но наткнулся на другую засаду. Во второй форме мне нужно показывать набор единообразных полей в количестве, заданном в первой форме. Набор единообразных полей в Symfony реализуется типом поля collection. Пробую - не работает, зараза. Говорит, что это поле лишнее (мол, в классе данных такого поля нет), и выдаёт его значение = null.

Вчера весь день провёл в чтении нараспев священных текстов документации и шаманских плясках с бубном - ничего не помогло. Сегодня с утра на свежую голову сделал ещё одно шаманское па: зарезервировал заранее в этом поле массив размером 100, а потом его обрезал до нужного размера. Помогло! Эта зараза (craue formflow bundle) _запоминает_ размер поля, заданный при инициализации, и выставляет его именно такого размера, несмотря на то, что в процессе перехода от первой формы ко второй этот размер поменялся. Ну а поскольку раньше я инициализировал это поле массивом нулевого размера, она и резала его до нуля. Причём теперь мне необходимо обрезать этот массив до нужного мне размера два раза: в первый раз при переходе ко второй форме (иначе вторая форма выведет мне 100 полей, а мне столько не нужно), а во второй раз - после завершения второй формы (иначе craue formflow bundle расширяет обрезанный массив опять до размера 100).

И самое главное: в документации об этом - ни слова.

P.S. Ненавижу свою работу.
yury_finkel: (манул)
Натуральный stack overflow в моём мозгу. Основной по работе проект на Java EE, готовый процентов на 90, заброшен ("отложен") полгода назад для того, чтобы сделать сайт на PHP и Symfony. Сайт на Symfony отложен месяц назад для того, чтобы сделать ещё одну задачу (тоже на PHP и Symfony). Эта самая задача с сегодняшнего дня откладывается, чтобы сделать супер-пупер-срочную задачу на PHP (привязанную к старой, но работающей версии проекта на Java и SmartGWT). Это не говоря уже о том, что почти каждодневно возникают "прерывания" для срочных заплаток к старой и очень старой версиям проекта. Всё это написано на разных языках (Java, Groovy, PHP) и на разных фреймворках...

Stack overflooooooow... :(
yury_finkel: (Default)
Чувствую себя выжатым лимоном. В последний месяц я работал очень напряжённо, а в последние дни вообще на пределе сил, чтобы успеть до отпуска реализовать главные фичи в проекте. Сейчас будто остановился на полном скаку. И только сейчас понял, насколько вымотался...


Запись сделана с помощью m.livejournal.com.

yury_finkel: (манул)
Я весь в работе (PHP, Symfony, mySQL, jQuery, HTML, CSS и прочая байда). До «Энциклопедии марксизма» доберусь, наверное, только в отпуске (через 2-3 недели, не раньше). Сейчас просто сил никаких нет. Хотя давно пора статью «Империализм» добить...
yury_finkel: (Default)
Перед сном пришла гениальная идея по работе (сегодня всю голову сломал, придумывая). Правда, мелкий своими капризами не дал додумать. Завтра скорее всего окажется, что фигня. Но хоть спать сегодня буду спокойно...


Запись сделана с помощью m.livejournal.com.

yury_finkel: (манул)
Фреймворк Symfony рулит. Просто-таки немеряно рулит. Там даже ORM есть (эдакая Java EE "для бедных"). И шаблонизатор Twig вместе с маршрутизатором позволяют творить чудеса. Особенно в сочетании с jQuery с клиентской стороны.

В общем, месяц, потраченный на изучение, не пропал зря.
yury_finkel: (манул)
Таки jQuery рулит. Приобщаюсь сейчас.
yury_finkel: (Default)
До сегодняшнего дня я в счастливом неведении не знал, что такое аннуитетный платёж. Не скажу, что я знаю это и сейчас, но программу для расчёта этой хрени я должен переработать. Ненавижу всё, что связано с деньгами и бухгалтерией, на этих вещах у меня отключаются мозги...


Запись сделана с помощью m.livejournal.com.

yury_finkel: (манул)
По работе потребовалось склепать примитивное распознавание символов (номера телефонов в графике, сгенерированные без особого изврата). Вспомнил понятие корреляции, сбацал скрипт на groovy. Сегодня, после двух дней экспериментов, наконец-то заработало. Офигеть, действительно распознаёт! (Ясное дело, что это не OCR, там всё гораздо сложнее, но мне достаточно и этого).

Всё-таки знания, полученные на радиофаке, иногда пригождаются. Хоть и основательно забытые — как-никак я закончил институт 28 лет назад и с тех пор почти не работал по специальности: лет 5 после института работал программистом, ещё как-то связанным с обработкой сигналов (тогда, кстати, корреляция тоже пригодилась), а потом уже просто программистом, без всякой связи с радиотехникой (по большей части базы данных).
yury_finkel: (манул)
Такого жутчайшего бардака с представлением даты и времени, как в Java, я больше нигде не видел. Это просто вредительство какое-то. Вчера это прямо вывело меня из себя.

Мало того, что в классе java.util.Date почти все методы объявлены deprecate (я обычно на это плюю и использую их, ибо удобно), мало того, что рядом с Date есть ещё извращённый класс GregorianCalendar (это при том, что не грегорианских календарей всё равно там нет), который обычно рекомендуется использовать (хотя использовать его неудобно). Так ещё и при попытке использовать тип date в базе данных (PostgreSQL) через JPA этот тип на серверной стороне отображается в java.util.Date, а на клиентской какого-то рожна - в третий класс XMLGregorianCalendar, который не совместим ни с одним из вышеперечисленных, чтобы выдрать из него информацию, нужно извращаться, а вот записать мне вообще так и не удалось. То есть с некоторым извратом на клиентской стороне я помещаю в него нужную дату, но на серверную сторону эта сволочь в любом случае передаёт null. То ли там какое-то из полей не дописано, то ли надо было мудрить с аннотациями, чтобы дата отображалась на нужный мне тип...

В общем, плюнул я на это и переделал таблицу в БД на использование unix time (секунды после 1.1.1970, int8, отображающееся на long). Правда, приходится делить/умножать на 1000, т.к. явский Date внутри себя имеет миллисекунды, но это уже мелочь по сравнению с вышеперечисленным.

Я возмущён: какие индусы писали эту часть API? И главное, всем, кажется, по фиг, хотя это широко известная проблема (судя по гуглу). Видимо, все так же, как и я, используют unix time.

Короче, вывод: при работе с Явой нужно в базе данных избегать типов date, time, timestamp и т.п. любой ценой.
yury_finkel: (манул)
Завтра — в отпуск.

А сегодня доделываю последние (ну или предпоследние) штрихи к программе, над которой корплю уже два с половиной года (вот мой пост от 4 февраля 2012 — это самое начало работы). Если быть точным, это третье поколение системы, над которой я работаю уже лет 8. Первое поколение было написано на PHP и MySQL, второе — на Java + SmartGWT и MySQL и работало через веб-интерфейс (но этот путь показал себя тупиковым), а вот теперь третье, написанное на Java EE + Swing + NetBeans Platform и PostgreSQL. Естественно, каждое поколение было написано с нуля, но с учётом опыта предыдущих. Причём первое и второе поколения до сих пор работают (у них несколько разная область применения), а нынешнее, третье, сейчас пойдёт в тестирование и опытную эксплуатацию, и после доработки и исправлений ошибок (где-то через полгода) заменит второе поколение.

Программа предназначена для автоматизации рабочего места риэлтера. В общем, ничего особенного она из себя не представляет, просто в ней уж очень много всего.

Вот, например, неполный список сущностей (и соответственно, таблиц базы данных), с которыми работает программа: задачи, события, объекты недвижимости, агенты, фирмы, контрагенты — физические лица, контрагенты — юридические лица, сообщения, услуги, этапы... Всё это взаимосвязано между собой достаточно хитрым образом. Например, задачи могут иметь подзадачи (любого уровня вложенности), т. е. организованы древовидно. К ним могут прикрепляться объекты (не более одного), события, агенты, контрагенты, сообщения... К любой сущности (т. е. к задаче, объекту, агенту и т. д.) могут быть прикреплены вложения (фото, видео, документ, вообще любой файл), а также метки (или тэги), по которым производится быстрая фильтрация. Сообщения (фактически внутренняя электронная почта) тоже организованы древовидно (с ответами), они могут ссылаться на задачи или объекты. И т. д. и т. п.

И всё это вместе бегает и крутится, местами даже асинхронно (чтобы не блокировать всю программу на долгих операциях). Естественно, по "трёхъярусной" архитектуре: клиент — сервер приложения — сервер базы данных.

Клиент: 83 класса (*.java), 1.4 Мб исходного текста, примерно 32000 строк.
Сервер: 82 класса (*.java), 550 Кб исходного текста, примерно 17000 строк.
Всё вместе: 165 классов, почти 2 Мб исходников, около 50000 строк.

Это не считая некоторого количества скриптов на groovy, обслуживающих программу.

Может быть, два с половиной года для такой программы — слишком долго, но писал её я практически один (мой непосредственный начальник, он же сисадмин, он же постановщик задач, непосредственно в кодировании участия не принимал, хотя руководил разработкой и генерировал идеи), к тому же с перерывами на другие задачи. К тому же в процессе работы я изучал Swing, Java EE и EJB, с которыми ранее дела не имел.

В общем, хотя с одной стороны я эту работу в гробу видал и жду — не дождусь выйти на пенсию (ещё 10 лет осталось), но с другой стороны — есть некоторое законное удовлетворение от завершения большого дела. Ну как сказать, завершения... Конечно, ещё как минимум полгода, а то и год, придётся программу дорабатывать напильником — в процессе эксплуатации полезут баги и пожелания пользователей. Но основное сделано.
yury_finkel: (злой манул)
Не о политике.

Сегодня на работе с утра полдня потратили, чтобы понять, почему при переходе на новую версию PHP (5.5) отвалилось почти всё, но как-то местами. Выяснилось следующее (цитирую документацию на функцию htmlspecialchars): «[параметр] encoding: Определяет кодировку, используемую для преобразования. Если не указано, то кодировкой по умолчанию является ISO-8859-1 для PHP до версии 5.4.0, и UTF-8 начиная с версии 5.4.0». И далее в разделе «Возвращаемые значения»: «Если входная строка string содержит неверную последовательность символов в указанной кодировке encoding, то будет возвращаться пустая строка в случае, если флаги ENT_IGNORE или ENT_SUBSTITUTE не установлены».

Верхний комментарий к документации: «Unfortunately, as far as I can tell, the PHP devs did not provide ANY way to set the default encoding used by htmlspecialchars() or htmlentities(), even though they changed the default encoding in PHP 5.4 (*golf clap for PHP devs*)».

Т.е. если раньше использовался вызов htmlspecialchars($s) (второй и третий параметры опускались и использовалось значение по умолчанию), и всё работало прекрасно, то теперь нужно перелопатить весь код (включая сторонние библиотеки!) и заменить это на htmlspecialchars($s,ENT_COMPAT|ENT_HTML401,"koi8-r"). Иначе такой вызов даёт всегда пустую строку. А функция, между тем, используется довольно часто.

Руки-ноги бы поотрывать за такое «улучшение»! Совместимость? Нет, не слышали!
yury_finkel: (Default)
Вчера на работе мысленно сплясал лезгинку на радостях: после 3 месяцев чтения талмудов, биения головой об стенку и криков «ничего не понимаю!» заработал даже не прототип, а зародыш новой программы: 3-уровневое (3-tier) приложение на NetBeans Platform + Java Enterprise Beans, веб-сервисы, Glassfish, все дела... К тому же на клиентской стороне — таблица с пэйджингом (подкачкой по необходимости) данных с сервера, да ещё с lazy loading (т. е. пока данные не подкачались, в соответствующих строках пишется «загрузка...», приложение не затормаживается, а по приходе данных эти строки заменяются данными).

Конечно, там ещё год надо писать функционал, но главное, есть основа, на которой можно строить.

В общем, три месяца долбёжки книжек на английском не пропали зря. А то были моменты, когда я думал уже бросить это всё...
yury_finkel: (Default)
После долгих исканий и метаний (например, пытались смотреть OpenSwing), всё-таки решили остановиться на «классике»: NetBeans Platform. Пришло осознание, что систему нужно полностью переписать, причём не изобретать велосипед, а сделать так, как люди делают. Поэтому поставил себе NetBeans IDE (кстати, потыкавшись и пообвыкшись, понял, что оно не многим хуже Eclipse и даже IDEA, зато в него интегрировано многое) и пытаюсь разобраться с фреймворком. Пока не очень понятно (но что-то начинает проясняться), и ещё пока не ясно, как организовать 3-tier-архитектуру (не знаю даже, как это сказать по-русски: трёхъярусную архитектуру?) — а она нам очень нужна. Судя по всему, надо будет использовать что-то вроде Hibernate на серверной стороне (ещё и с ним придётся разбираться).

Минус во всём этом один: приходится изучать большой материал, совершенно новый для меня (я даже термины-то не все понимаю), да ещё и по-английски. А с возрастом я чувствую, что способность к обучению у меня всё ниже и ниже. Ей-богу, мне проще что-то самому кодить, чем разбираться в том, что понапридумывали другие... На работе меня утешают, что, мол, изучение нового — это тренировка мозгов против маразма :) Но башка всё-таки пухнет. :(
yury_finkel: (Default)
По работе понадобилось разобраться (и сделать соответствующую программу) с понятиями математической статистики: средневзвешенное, среднеквадратическое отклонение, доверительный интервал, средняя погрешность и проч. Занимаюсь этим с начала недели. В понедельник ещё смотрел на формулы из «методички» как баран на новые ворота (а «методичка» эта — отдельная песня, это несколько файлов в ворде и экселе, причём формулы написаны примерно так: "D=√∑Di2*ni/n" — без скобок и без линии над корнем — догадывайся сам, находится ли знаменатель под корнем или нет) Потом стал немного въезжать, вспоминать. Дело в том, что в последний раз я этими вопросами занимался ровно четверть века назад — когда был на 3-м курсе института. С тех пор мне ни с теорвером, ни с матстатом сталкиваться не приходилось. Хотя в своё время я математику знал на 5 и даже занимал «призовые» места в олимпиадах (даже во всероссийской как-то раз третье место занял). Но если что-то не используешь, оно напрочь забывается.

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

Но вот сегодня утром меня «осенило». Ведь погрешность — это отклонение среднего от мат. ожидания; а среднее — это случайный процесс; более того, это сумма n случайных процессов (нормально распределённых, что неявно подразумевается в той же «методичке»). Полез в справочники, нашёл, что при сложении нормально распределённых процессов складывается дисперсия, и из этого уже вывел эту самую формулу для погрешности (оказалась правильной).

Конечно, я мог бы этого и не делать, а тупо использовать данную мне формулу, но мне ж надо понимать, что я делаю. Поэтому сегодня у меня такое чувство, что я сделал открытие :) Можете смеяться, я прекрасно понимаю, что это элементарщина, но всё-таки сам докопался, через 25 лет забвения :) Я-то было уже крест на своих мозгах поставил, но оказалось, что они ещё не совсем заржавели. Ну и ещё радует, что хоть что-то, чему меня учили в институте, пригодилось в жизни (вон, даже справочники пригодились, не только место на полке занимают).

Вот такая сегодня у меня маленькая радость :)
yury_finkel: (Default)
(Если, конечно, тогда ещё будет пенсия...)

Программа, над которой я работаю уже год и три месяца, близка к введению в тестовую эксплуатацию. Поэтому у нас очередной аврал — как всегда, полезли неожиданные глюки плюс в последний момент объявились новые фичи, без которых работать ну никак невозможно. В общем, сегодня я сижу и пашу, хотя хотел было забить. Как мне надоело программирование, кто бы знал... Да и вообще работа как таковая (отчуждённый труд), когда я вынужден заниматься не тем, чего я хочу. А тем, чего я хочу, я заниматься не могу — из-за того, что всё время уходит на работу и домашние заботы. На рабочем месте я для себя на компе едва ли успеваю что-то сделать, т.к. надо вкалывать, а дома доступ к компу ограниченный, ибо надо с дитём посидеть, дать жене посидеть за компом, да и вообще сил уже не остаётся...

Обидно ещё, что никак не могу добраться до электронных книг (на первой очереди — 5 томов Плеханова). Я и так-то лишь с трудом могу читать книги с экрана, а принимая во внимание вышесказанное — вообще никак. Заказал себе было на озоне e-ink-читалку, так ведь облом: после почти месяца ожидания прислали сообщение, что поставщик не прислал девайс, деньги вернут и т.п. Так, видимо, и придётся оставаться чукчей-писателем :(

Ну, а под катом — несколько скриншотов моей многострадальной программы (суммарный размер картинок небольшой — где-то 300 Кб).

Серверная часть написана на Java с использованием фреймворка mina, плюс несколько небольших скриптов на php в качестве прокси (если будут тормозить, перепишу на C под fast-cgi, но пока проблем они не вызывают). База данных — MySQL (но в будущем планируется переход на PostgreSQL).

Клиентская часть (работающая в браузере) написана на Java с использованием smartGWT (GWT — Google Web Toolkit — это, проще говоря, компилятор с Java на JavaScript; smartGWT — это к GWT добавили smartClient — мощную javascript-овскую библиотеку виджетов).

Скриншоты... )
yury_finkel: (Default)
Наконец-то я в отпуске. Чувствую себя выжатым лимоном. Похоже, ещё и погода влияет — как-то мне нехорошо; но и поработал под конец очень напряжённо. В последний день в проекте вылезли серьёзнейшие глюки в самом ядре (в серверной части), причём глюки очень трудноотлавливаемые, связанные с параллельной обработкой. Как только начинаешь ходить в отладчике, или даже вставляешь запись в лог — всё начинает нормально работать (потому что отладчик или вывод в лог отрубают всю параллельность), а в штатном режиме — полный глюконат :( Провозился всю пятницу, так ничего и не нашёл. Ну и плевать. После отпуска разберусь.

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

И о переводе. В переводе «Золотой цепи» осталось вычитать (третьим чтением) несколько глав. В принципе работа на два-три дня, но — см. выше — я сейчас, как выжатый лимон. Так что возможно с публикацией немного задержусь.
yury_finkel: (Default)
Сегодня меня что-то одолели ностальгические воспоминания о моей работе в конце 80-х.

... )

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

July 2017

M T W T F S S
     1 2
3 456 7 8 9
10111213141516
17181920 212223
24252627282930
31      

Синдикация

RSS Atom

Развернуть каты

No cut tags