четверг, ноября 12, 2009

Быстрое умножение...

Помню в школе нас научили умножать двузначные числа на 11. Для этого сказали необходимо левое и правое число оставить такими же, а между ними поставить их сумму (ну и если сумма больше 10, то соответственно первое число надо увеличить). Например, 23 умножим на 11:
получаем число, на первой позиции которого стоит 2, на третьей (последней) позиции 3, а между ними 2+3=5 - стоит 5. Итого 23 * 11 = 253.
Но оказалось, что нам не всё рассказали...

четверг, октября 15, 2009

О пользе чтения сообщений об ошибке

Обновился мой любимый файловый менеджер Altap Salamander. Ну при обновлении как обычно что-то добавилось, что-то исправилось и т.д. Решил вынести на специальную панельку Hot Path Bar ссылочку на папку на компьютере пользователя. Ресурс та скрытый, т.е. после имени ресурса необходимо указать "$". Помню точно, что раньше делал это, и всё получалось. Привычным движениями вызвал диалог настройки, ввел путь \\имя_компа\имя_ресурса$ и... получил ошибку -  после знака "$" должно быть имя переменной!
Начал разбираться, начал вспоминать - да нет же, вроде в прошлых версиях всё работало без лишних телодвижений, без каких-либо переменных. Пробовал и так и сяк - не берёт путь и всё тут.
В конце концов решил обратиться к знатокам. Начать решил с тех, с кем разговариваю на одном языке, т.е. на русскоязычном форуме. Начал формулировать вопрос, при этом надо же указать точно ошибку. Пишу "... вылетает ошибка - Unexpected end of string, character '$' must be followed by variable name or '$' character". Во время переписывания ошибки я же её читаю, и моё внимание привлекает окончание, которое ранее было тупо не дочитано - or '$' character. Вначале сижу и смотрю, потом перечитываю, потом появляется мысль - Неужели всё так просто. Нажимаю Ok, добавляю в конец пути еще один символ '$' и вуаля - всё работает! Ура! ;)
То ли я такой невнимательный, то ли это лишнее доказательство утверждения о том, что правильно заданный вопрос - это половина ответа. В любом случае: всё хорошо, что хорошо кончается. И людей на форуме глупостями не отвлёк, и нужный мне результат получил ;)

среда, августа 26, 2009

В закладки

Вчера долго вспоминал где читал эту статью. Для того чтобы впредь с поиском было меньше проблем, зафиксирую ссылку на неё тут.
Hints and Warnings или Спасение утопающих

вторник, августа 25, 2009

Установка WebUtil

В очередной раз пришлось встретиться с WebUtil на Oracle Forms 10g. Первый раз, когда решил воспользоваться данной библиотекой, помню долго и упорно настраивал, прежде чем добился нормальной работы. Потом были курсы, на которых среди прочего упоминалась установка и работа с WebUtil. Я со "знанием дела" предвкушал былые сложности, но преподаватель заявил, что все трудности остались в прошлом и сейчас настройка поддержки WebUtil не займет ни большого количества времени, ни вызовет особых трудностей. Так в общем-то и получилось - я был приятно удивлён.

Вернувшись на рабочее место, коллега решил применить возможности WebUtil в своих разработках, и мы снова нарвались на всевозможные ошибки - вроде и делали всё как было описано в книге с курсов, но вместо рабочей программы получали набор "непонятных" ошибок. Я захотел проверить всё сам и решил установить всё на чистую систему. Вот этот опыт я и хочу тут законспектировать, чтобы в будущем не искать снова и не нарываться на старые грабли.

Устроивший меня вариант установки я нашел тут, за что товарищу Ammar W. Sajdi БОЛЬШОЕ СПАСИБО. Здесь я приведу перевод его статьи с моими небольшими дополнениями.

Итак, у меня была чистая машина, куда я установил Oracle Developer Suite 10g v10.1.2.0.2, после чего пропатчил DevSuite патчем Oracle Developer Suite 10g patch v10.1.2.3.

ORACLE_HOME - папка, куда был установлен DevSuite (у меня C:\ORA_DS).

1) Скачиваем файл jacob_18.zip (пишут что не надо брать версии ни 1.7, ни 1.9, а только 1.8)

2) Файл jacob.jar из скачанного архива кидаем в ORACLE_HOME\forms\java, а файл jacob.dll в ORACLE_HOME\forms\webutil.

3) Подписываем файлы frmwebutil.jar и jacob.jar:

  • Пуск-Выполнить-cmd.exe
  • добавляем ORACLE_HOME\jdk\bin в переменную среды PATH - set PATH=C:\ORA_DS\jdk\bin;%PATH%
  • подписываем файлы и смотрим нет ли ошибок - 
    C:\ORA_DS\forms\webutil\sign_webutil C:\ORA_DS\forms\java\frmwebutil.jar
    C:\ORA_DS\forms\webutil\sign_webutil C:\ORA_DS\forms\java\jacob.jar

4) Если у вас уже есть схема с базе данных, содержащая хранимый код WebUtil, то этот шаг можно пропустить. В противном случае создаём схему для хранения кода WebUtil. Открываем в текстовом редакторе файл ORACLE_HOME\forms\create_webutil_db.sql и правим его: удаляем или комментируем строку с командой EXIT, чтобы иметь возможность посмотреть не возникло ли ошибок при генерации. Запускаем SQL*Plus и выполняем следующее:

CREATE USER webutil IDENTIFIED BY a
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp;
/

GRANT CONNECT, CREATE PROCEDURE, CREATE PUBLIC SYNONYM TO webutil;
/

CONNECT webutil/webutil@oracle_db_tns
@C:\ORA_DS\forms\create_webutil_db.sql

-- Проверяем вывод SQL*Plus на наличие ошибок, а затем
CREATE PUBLIC SYNONYM webutil_db FOR webutil.webutil_db;
/


--Переподключаемся как SYSTEM, и выполняем:
grant execute on webutil_db to public;
/

5) Редактируем файл ORACLE_HOME\forms\server\default.env - добавляем C:\ORA_DS\jdk\jre\lib\rt.jar в CLASSPATH.

6) Редактируем файл ORACLE_HOME\forms\server\formsweb.cfg, меняем секцию [default] добавляя (или проверяя наличие):
archive_jini=frmall_jinit.jar,frmwebutil.jar,jacob.jar
archive=frmall.jar

и добавляем (проверяем) секцию:
[webutil]
WebUtilLogging=off
WebUtilLoggingDetail=normal
WebUtilErrorMode=Alert
WebUtilDispatchMonitorInterval=5
WebUtilTrustInternal=true
WebUtilMaxTransferSize=16384
baseHTMLjinitiator=webutiljini.htm
baseHTMLjpi=webutiljpi.htm
baseHTML=webutilbase.htm
archive_jini=frmall_jinit.jar
WebUtilArchive=frmwebutil.jar,jacob.jar,frmall.jar
archive=frmwebutil.jar,frmall.jar
lookAndFeel=oracle

7) Редактируем файл ORACLE_HOME\forms\server\webutil.cfg, меняя:
transfer.database.enabled=TRUE
transfer.appsrv.enabled=TRUE


8) Стартуем OC4J

9) Запускаем Forms Builder и подключаемся к схеме из 4-ого шага.

Открываем webutil.pll, выполняем "Compile ALL" (Shift-Ctrl-K), и генерируем в PLX (Ctrl-T).

Если при генерации возникает ошибка FRM-91507, то необходимо изменить в реестре параметр NLS_LANG на "AMERICAN_..." (впереди AMERICAN, а дальше то что было), перезапустить Forms Builder и сгенерировать PLX.

PLX нам необходим для того, чтобы не пришлось присоединять библиотеку с указанием полного пути, что крайне нежелательно.

10) Создаем новую FMB.

Открываем webutil.olb и перетягивая объект WebUtil на нашу форму, создаем подкласс (Subclass), не копию (Copy). Объект WebUtilConfig не нужен.

Присоединяем webutil.pll, удаляя путь.

Добавляем триггер ON-LOGON с кодом

NULL;

(опционально).

Создаём кнопку на новой канве с кодом

SHOW_WEBUTIL_INFORMATION(TRUE);

в триггере WHEN-BUTTON-PRESSED.

Компилируем FMB в FMX после"Compile ALL" (Shift-Ctrl-K).

11) Переходим на закладку Runtime в настройках (меню Edit-Preferences) Forms Builder-а, нажимаем кнопку "Reset to Default", если строка Application Server URL пустая. В конце этой строки добавляем "?config=webutil" (в итоге получим примерно следующее http://server:port/forms/frmservlet?config=webutil)

12) Запускаем форму и радуемся жизни ;).

P.S. Для того чтобы отображались все элементы канвы WebUtil (для предотвращения ошибки FRM-13008) добавляем в реестр в FORMS_BUILDER_CLASSPATH нашего ORACLE_HOME полный путь к jacob.jar (там уже должны быть как минимум frmall.jar и frmwebutil.jar).

четверг, августа 20, 2009

Настройки проектов в Delphi с точки зрения поиска ошибок

Настройки проектов в Delphi с точки зрения поиска ошибок

об ошибках в программах и Application.ProcessMessages в частности

Отладка программ весьма интересный момент. Понять где и почему возникает ошибка и найти пути её предотвращения сродни распутыванию клубка детективного сюжета. А если еще при этом и код вам не сильно знаком, то тут уж точно превращаешься в заправского Шерлока Холмса.

К чему это я? Просто прочитал я тут статью The Dark Side of Application.ProcessMessages in Delphi Applications, и осознал в очередной раз граничность своих знаний и опыта. Вот как вы обычно изучаете какую-то новую программу, среду разработки, язык программирования и т.д.? Вникаете от и до во все тонкости реализации, разбираетесь как именно всё работает и лишь после этого приступаете к работе с инструментом? Или, получив определенный набор знаний и навыков, начинаете пользоваться программой, а при встрече с какими-либо трудностями расширяете свой кругозор знаний, разбираясь с их причиной? Думаю, что большинство работает как-то ближе ко второму варианту. По крайней мере так работаю я. Иногда это заставляет понервничать - "ну почему она опять не работает так, как я этого хочу", а иногда наоборот даёт повод для новых радостей - "вау, оказывается она ещё так умеет" (последнее чаще всего у меня возникало при использовании Microsoft Excel, раз за разом расширяя свои познания его огромных возможностей).

Так о чем это я. Прочитал я статью и понял насколько я был беспечен, используя Application.ProcessMessages. Однажды при удобном случае воспользовавшись вызовом этой процедуры, дальше уже особо не задумывался о возможных подводных камнях, а зря. Если коротко, то надо помнить, что даже самые быстрые, на ваш взгляд, участки кода могут выполняться продолжительное время, а за это время пользователь, увидев "подвисшую" программу, может добавить действий в очередь событий - добивая бедную кнопку в ожидании реакции или еще каким-либо образом. А все эти лишние события могут существенно изменить ожидаемый результат работы программы. Поэтому иногда лучше просто задизейблить элементы управления на время выполнения спорного участка кода, чтобы оградить любимого вашего пользователя от непродуманных действий ;)

P.S. Конечно это всё основы основ и мне стыдно признаваться, что я раньше не знал или не думал об этом, но так уж получилось, и лучше обратить на это внимание позже, чем и дальше ругать всё вокруг при нештатном поведении тобою же написанной программы ;)

четверг, августа 13, 2009

возникла идея

Сегодня в связи с обустройством рабочего места переведенного на новую должность работника возникла идея.

Проблема: получил служебку на предоставления доступа к БД нового зам. начальника одного из отделов. В служебке понятным для её автора языком написано какие функции необходимо предоставить работнику. Беда в том, что мне не совсем понятно о каких именно программах идёт речь.

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

По-моему, хорошая идея. Вот бы только реализовать её и заставить всех ею пользоваться ;)

вторник, августа 11, 2009

Про интуитивно понятный интерфейс

Всё таки понятие интуитивно понятного интерфейса сильно зависит от пользователя ;)

Вот сегодня надо было сравнить два фрагмента программы. На машине установлены PSPad и Notepad++. Одним местом чувствовал, что PSPad умеет сравнивать, но найти данную фичу с первого, да и со второго раза не получилось - сравнение с файлом есть, но мне то просто нужно сравнить текст в двух открытых вкладках. Открыл Notepad++, в котором достаточно быстро нашел пункт меню Дополнения - Compare и выбрал команду Compare. То что надо было сравнить, сравнил, а потом решил всё же проверить есть ли подобная функциональность в PSPad. Полез в справку - не нашел, отправился на сайт разработчика - вот там уже в форуме случайно нашел обсуждение сравнения, где и обнаружил как это делается. Надо было открыть две вкладки со сравниваемыми кусками текста. Потом, находясь в одной вкладке, щёлкнуть правой кнопкой по неактивной второй вкладке, и там в контекстном меню выбрать команду Text Diff with active tab.

Не буду спорить об интуитивнопонятности такого способа, но лишь надеюсь, что в следующий раз найду эти фичу гораздо быстрее :)

понедельник, августа 10, 2009

начнём

Итак сперва буду просто выкладывать мысли без какой-либо определённой связи. Потом буду их обрабатывать и связывать.

В ходе работы вообще возникла необходимость как минимум иметь перечень задач, которыми занят, или с которыми каким-то боком соприкасаешься. У задачи может быть несколько версий. Хочется знать чем эти версии отличаются друг от друга, а также хочется иметь список желаемых изменений и изменений, которые в текущей рабочей, еще не зарелизенной, версии уже реализованы, т.е. те изменения которые потом после релиза попадут в what's new новой версии (выпуск новой версии дело не одного дня, так что можно по дороге о чём-то, что было сделано, и забыть).

Соответственно по задачам:

  • список задач
  • список версий задачи
  • что нового в версии
  • что необходимо добавить в будущем
  • что уже реализовано в текущей рабочей версии

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

Информация о задаче (программе) должна содержать следующее:

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

В системе намечаются несколько типичных ролей пользователей:

  • руководитель
  • разработчик
  • технический персонал
  • пользователь задачи (программы)

пока всё.

о работе...

Пару недель назад слово-за-слово и попали мы со Стасом к начальнику на разговор. Договорились мы до того, что в отделе всё не очень правильно с точки зрения организации работы, и, конечно же, всё надо менять и делать лучше. В результате общения с начальником втроём было решено встретиться в расширенном составе - со всеми руководящими сотрудниками - в ближайший рабочий понедельник. Ну решение принято, одобрено и успешно не выполнено. Бывает.

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

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