воскресенье, 31 августа 2014 г.

Программа для вычисления юлианской даты

Когда-то давно (в 2010 году) я написал эту программу, работая во ФГУП ВНИИФТРИ (Научно исследовательский институт физико-техничесих и радио-технических измерений). Вместе с коллегами приходилось заниматься  разработкой ПО для расчетов корректировок стандартов времени и частоты. Понадобилось простенькое приложение для определения юлианских дат, которое собственно и сделал. 

Программа вычисляет как юлианскую дату, так и модицифированную юлианскую дату.
Юлианский день (JD) - это астрономический способ измерения времени, число дней с полудня 1 января 4713 г. до н. э. по юлианскому календарю.
Модифицированный юлианский день (MJD) используется для простоты астрономических расчетов и равен MJD=JD-2400000,5.
Следует отметить что в большинстве астрономических бюллетеней даты указываются в формате MJD.

Ссылка на программу MJDTranslate.exe
Программа выложена на Софт.mail.ru вот здесь


вторник, 26 августа 2014 г.

Как Punto Switcher помогает мне в программировании

Когда пишу sql-код, часто сталкиваюсь с необходимостью писать длинные и стандартные типовые команды, вроде:
  • select * from table where;
  •  delete from table where;
  • update table set where;
  • create table aaa(bbb intcomment on table aaa is ‘lalala’; alter table aaa owner to dbuser;

К сожалению, в замечательной программе разработки pgAdmin отсутствует автодополнение кода и практически все команды приходится писать полностью, зная наизусть.  Долгое время я так и делал, пока не открыл дополнительные возможности Punto Switcher. В этой программе помимо переключения раскладки можно настроить автозамену текста по определенным сокращениям.
Как настроить:
  1. Кликнуть значок Punto Switcher, далее “Дополнительно”/“Список автозамены” 
  2. Кликаем на “Список автозамены”, далее “Редактировать”  и видим список сокращений, заменяемых  на полные команды.
  3. После нажатия кнопки “Добавить” вписываем сокращение команды и полный текст, которым заменяется сокращенная команда.

После настройки автозамены ее просто применить. Набираем в любом  редакторе  сокращение команды, Punto Switcher предлагает автозамену в желтой всплывающей строке, нажимаем Enter и программа производит автозамену сокращенного текста на предлагаемый.




Этот лайфхак увеличил мою скорость при написании скриптов.

вторник, 25 марта 2014 г.

Макросы в pgAdmin. Контроль выполняемых запросов

        При поддержке сервера БД бывает необходимо узнать, какие именно процессы нагружают сервер и возможно блокируют доступ к таблицам. 
   К примеру, если выполняется pgsql-функция F1, блокирующая таблицу X, с типом блокировки AccessExclusiveLock, то посмотреть содержимое данной таблицы можно будет только после завершения F1. Чтобы узнать, что функция F1 выполняется в настоящее время, я использую следующий макрос для pgAdmin, запрашивающий список задач из системной таблицы pg_stat_activity:

SELECT datname,
       NOW() - query_start AS duration,
       pid,
       query
FROM pg_stat_activity
ORDER BY duration DESC;

   Это макрос (запрос) выводит таблицу со списком выполняемых на сервере Postgresql запросов, отсортированную по продолжительности выполнения данных запросов.
        Если нужно завершить нежелательный запрос,  я копирую его pid, вставляю в окно Query, выделяю данную строку и выполняю следующий макрос:

SELECT pg_cancel_backend($SELECTION$);

       После этого большинство запросов завершает работу, чему можно легко убедиться, если выполнить  первый макрос еще раз.
     Однако бывают такие запросы или функции, которые нельзя быстро завершить таким методом. По моим наблюдениям, это касается особо затратных для системы рекурсивных запросов на основе Common table expressions (CTE) и функций, использующих рекурсивные CTE. Возможно это связано с тем, что рекурсия использует стек, обнуление которого медленное и это тормозит завершение кода.  В таком случае я обычно использую завершение процесса на уровне операционной системы. Я авторизуюсь через security shell непосредственно на сервере БД (FreeBSD).
Далее запрашиваю список процессов Postgresql:

ps -aux | grep pgsql

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

kill pid

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

понедельник, 3 февраля 2014 г.

Макросы в pgAdmin. Доступ к таблицам не-public схемы и получение наименований таблиц в схеме

1.   Часто при написании sql-кода для Postgresql в запросах приходится обращаться к таблицам, находящимся в разных схемах БД.  При этом  в окне редактора Query  надоедает  к названию таблицы добавлять наименование схемы, например, как schema_name.table_name. Если для таблиц, расположенных в public, схему можно не указывать, то для таблиц не из public, это необходимо. Чтобы уменьшить трудоемкость написания такого кода существует переменная search_path.

search_path - это системная переменная Postgresql, действующая в рамках одной сессии и позволяющая указывать через запятую схемы, где будет выполняться поиск таблицы.

Более не нужно писать длинное schema_name.table_name, достаточно в sql-скрипте выполнить команду:

SET search_path TO PUBLIC,
                   gateway,
                   calc_import;



и поиск таблицы будет последовательно производиться в  схемах public, gateway, calc_import.
Соответственно при написании и отладке sql-кода для указания дополнительной схемы, в которой находятся нужные таблицы, я использую макрос PgAdmin:

SET search_path TO PUBLIC,$SELECTION$;

где в качестве  $SELECTION$ выступает название схемы. Как создать макрос в PgAdmin и как им пользоваться можно прочесть здесь.

2.       PgAdmin является самой стабильно работающей GUI sql-tool  для  Postgresql, обладающей большим функционалом. Однако серьезным упущением в этой программе является отсутствие автодополнения при написании запросов. Часто нужно посмотреть точное имя таблицы, которую собираешься использовать в запросе. Новички, как правило начинают открывать браузер объектов в интерфейсе программы - это долго и неудобно. Гораздо быстрее, по-моему - сделать запрос  с получением списка всех таблиц нужно схемы, отсортированного в алфавитном порядке. Для этого я и использую макрос

SELECT *
FROM information_schema.tables
WHERE table_type='BASE TABLE'
  AND table_schema ILIKE ('%' || trim('$SELECTION$') || '%')
ORDER BY TABLE_NAME


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


Каталог блогов Blogolist