среда, 19 декабря 2012 г.

BDE Paradox переносим в MySQL

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

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

Как задача базу Paradox  перенести на серверную платформу с СУБД MySQL.

Прямых конвертеров, тем более бесплатных не нашлось, пришлось писать все самому.

Что делает программа:
1. Анализирует структуру таблицы Paradox после чего создает аналогичную структуру в SQL запросе.
2. Подключается к MySQL серверу к указанной базе, где создает таблицу с таким же именем как  и таблица Paradox.
3. После создания таблицы предлагается перенос данных.

Для доступа к таблицам Paradox необходимо иметь установленное ПО BDE(Borland DataBase Engine).
Для доступа к серверу MySQL необходима DLL библиотека LIBMYSQL.DLL которую можно взять в папке BIN установленного сервера, данную библиотеку нужно разместить в рабочем каталоге программы или же в [Диск]:\windows\system\  тогда библиотека будет доступна всем приложениям.






















После запуска программы указываем настройки подключения к MySQL серверу, указываем таблицу Paradox и нажимаем кнопку импортировать, отвечаем на ряд вопросов и имеем готовую таблицу в MySQL - задача решена.
готовую программу можно взять тут https://docs.google.com/open?id=0B888Vt6ak9afeXQtTS04UkY1Q1E

вторник, 4 декабря 2012 г.

Запрет запуска программ

Я не вредный программист, но иногда бывают случаи когда необходимо сделать так, что бы что то не работало. И вот тут на выручку приходит программирование.

Все началось с того что на работе огромный парк техники. И многие используют её не совсем так как положено в рабочее время( Пасьянсы, Сапер, MostWanted,Counter Strike и т.д). И вот родилась она -  задача.
Как не банально задача проста, необходимо исключить запуск некоторых приложений, а так как пользователи умудряются переименовывать exe файлы дабы администратор случайно на них не наткнулся ... то приходится использовать радикальные меры.

И так, что мы имеем? Может быть запущена "игра" исполняемый файл которой может быть переименован.

Ладно, запускаем Delphi и начинаем:

Несмотря на то, что исполняемый файл и переименован но при компиляции приложению, а точнее его главному окну был дан заголовок, вот он то нам и надо.
Вспоминаем WinAPI и начинаем кодить.
Логика получается примерно такая:
1) Имеем список шаблонов/маск заголовка окна, к примеру "Блокнот", запускам блокнот и наблюдаем
2) Зная часть Caption-а нужного нам окна, переберем все ВИДИМЫЕ окна системы и сверим их с файлом шаблона.

3) Если нашлось нужное нам окно - закрываем его.
4) А пользователю можно выдать сообщение, нечто вроде "Не стоит тут играться".

Для себя же добавим такие удобства как:
1) Показывать/Не показывать иконку в трее
2) Доступ к всплывающему меню программы
3) Ведение лога

когда все готово, запускаем программу у себя, будут созданы пустые фалы конфигурации.
Закрываем программу, а вот файлы конфигурации осторожно заполняем, дабы не написать "explorer" как маску закрываемого приложения.

Ну вот все и готово для наших любимых пользователей.

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

Уже готовую программу можно взять тут https://docs.google.com/open?id=0B888Vt6ak9afeTg0Snp3LUNtMEE

Но стоит всегда помнить, никогда не делайте того что не сможете отменить или вернуть назад.


Удаленные службы Windows

Дело было ради шутки, в общем сидя в кабинете с коллегами решили подшутить над пользователем Х. Весь сыр бор из за того, что данный пользователь очень трепетно относится к своему работающему программному обеспечению, и можно сказать 2/3 рабочего дня изучает диспетчер задач(ProcessExplorer) в поисках новых процессов.
Свои процессы наверное уже заучил наизусть. По этому поводу установить на компьютер бэкдор не представляется возможно, да и антивирус его быстренько обнаружит.
Решено было средствами ОС Форточка заставить компьютер вести себя подозрительно.
Но первые же попытки залогинится на удаленной машине выпали в системный журнал, что было не очень хорошо.
Но решение как всегда нашлось.

В очередной раз запустив Delphi решил использовать в системе такое интересное место как Службы.
Алгоритм получился такой:
1) Зная логин и пароль локального администратора( а пользователь то работает под доменным) можем залогинится без подозрений.
2) Используя WinAPI и RPC получаем список удаленных служб.
3) После получения списка служб и зная как они называются в удаленной системе мы можем с ними сделать все стандартные манипуляции Стоп/Старт

что собственно и было нужно.

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

Интересной является служба "Темы"(на случай если вы захотите подшутить)

Стартуем перезапуск, блокируем компьютер и идем пить кофе.

Саму программу уже готовую можно взять тут https://docs.google.com/open?id=0B888Vt6ak9afNU5sWEVWVTZFblE

Только нужно всегда помнить, что в любой шутке должна быть доля шутки.

Страховка от пользователей MS Excel

Так как пользователей огромное количество и они все работают с документами созданными во всеми нами любимом редакторе MS Excel, то регулярно встречаются случаи когда документы портятся, теряются, и пропадают разным - не предсказуемым способом(выключили свет, вынули флешку и т.д.) Надежды на автоматическое сохранение нет, и особого доверия так же оно не вызывает.

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

Для борьбы с MS Excel было решено использовать встроенные механизмы самого офисного пакета, но управлять ими из вне.

Для решения данной задачи использовалась Delphi.
Принцип работы:
1)Запускается утилита
2) Регулярно проверяем наличие запущенного приложения MS Excel.
3) При обнаружении работающего Excel, создается OLE подключение к встроенному языку Visual Basic Application(VBA).
4)Используя VBA сохраняем копию работающего документа в заранее установленную временную директорию.
5) Для уменьшения размера занимаемой копии подвергаем её сжатию.
6) Регулярно обновляем созданную копию документа.
7) При закрытии документа или MS Excel высвобождаем занимаемый OLE объект.

В случае потери документа используя средства программы имеем возможность восстановить файл.

Работающую программу можно взять тут https://docs.google.com/open?id=0B888Vt6ak9afZUxLQ2l4WE85cVE

понедельник, 3 декабря 2012 г.

Генератор отчетов

Было время столкнулся с тем что у нас на предприятии использовалась(и используется) программа для ведения кадрового учета, она всем хороша, падает регулярно, но что делать у всех свои недостатки.
Переписывать программу никто добро не даст, и не давал(так как за неё уплочены не малые деньги), а отделу кадров работать надо. В принципе программа(указывать какая не буду дабы избежать нежелательных комментариев) всю информацию ведет как надо, но вот отчетная информация страдает, отчеты формируются часами, и не всегда так как того  ожидает пользователь. Я как программер вынужденный сопровождать сие чудо вынужден был придумать инструмент для генерации отчетов таких каких мне захочется, и работающих как можно быстрее. Тут то и появилось ТЗ:
1) Нужно получение информации из базы данных персонала
2) Критерии отбора должны быть гибкие и понятные для человека занимающегося сопровождением программы
3) Должна быть гибкость в выборе данных
4) Должна быть возможность использовать генератор отчетов не только с программой работающей у нас.

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

Для подключения решил использовать строку подключения ADO. Конкретно наша программа работала с DBF файлами :( печаль, но что делать. Изучив заголовок файла пришел к выводу что самый подходящий драйвер VFP(Visual FoxPro), хотя программа работает не на Фоксе, но Фокс благополучно разобрал типы данных .... кроме дат, зашифрованных в полях.
Для работы через ADO использовал драйвер VFPOLEDB, саму строку подключения использовал примерно вот такую:

Provider=VFPOLEDB.1;Data Source=#SOURCE#;Mode=Share Deny None;Extended Properties="";User ID="";Password="";Mask Password=False;Cache Authentication=False;Encrypt Password=False;Collating Sequence=MACHINE;DSN=""

Как среду разработки выбрал Delphi 7, под рукой большего не было, на связку PHP/Apach/MySql пришлось забить, потому как в сети http протокол зарублен на уровне сис.админа, нет ни интернета и ДНС не фурычит в сети, вот такие вот сложные дела.

Собственно решение было найдено, к базе данных коннектится через ADO, главное что бы драйвер под ADO существовал, после установки соединения к базе данных выполняем SQL запрос, полученный результат представляем в виде таблицы, с которой есть импорт в CSV формат, который благополучно может переварить MS Excel/Open Office.

Генератор отчетов был реализован, если вдруг кому надо: бесплатно можно пробовать

https://docs.google.com/open?id=0B888Vt6ak9afTUpQVDlfQjdZbmc