пятница, января 18, 2019

Still alive

Давно забытое иногда может сново возродиться.
Знать бы ещё для чего ;)

воскресенье, февраля 21, 2010

О мотивации

Источник
Если вы когда либо пытались добиться от кого-то другого выполнения какой-либо работы, то вы определенно встречались с проблемой мотивации вашего исполнителя. Как заставить его сделать поставленную вами задачи не только в срок, но еще и в лучшем качестве? Как стимулировать его отнестись к поставленной цели со всей серьезностью и с максимальной увлеченностью. Как добиться желаемого результата и не убить в работнике желания к продолжению сотрудничества и к саморазвитию, которое впоследствии может привести к рождению новых более продуктивных и красивых решений.
Все мы уже давно привыкли к методам вроде метода кнута и пряника - мол, работнику нельзя давать сильно много свободы, а то он расслабится, и работнику нужно пообещать большое вознаграждение, чтобы все его мысли были направлены на решение вашей задачи.
Однако время показывает, что данный метод работает далеко не всегда. Но и от него нельзя отказываться полностью, потому что иногда он всё же выполняется. Когда же применять данный метод, и что можно использовать, если метод кнута и пряника не работает? Об этом как раз и рассказывает Дэн Пинк в следующем ролике (русские субтитры имеются: нажмите "View subtitles" и выберите Russian).

четверг, ноября 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. Конечно это всё основы основ и мне стыдно признаваться, что я раньше не знал или не думал об этом, но так уж получилось, и лучше обратить на это внимание позже, чем и дальше ругать всё вокруг при нештатном поведении тобою же написанной программы ;)