Страницы

28 марта 2012 г.

pgScript. Использование типа RECORD.

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

Тип RECORD.

       Тип RECORD является двумерным массивом данным, доступ к элементам которого осуществляется через индексы элементов. Элементы нумеруются с нуля. Первый индекс массива указывает на строку, второй на столбец. Например:

MetaStock - TAutoTraderDLL. Первый осознанный биржевой робот.

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

22 марта 2012 г.

pgScript. Написание простых скриптов. Первый опыт.


Приветствую Вас в блоге "Будни программиста".


      Сегодня впервые мне пришлось столкнуться с написанием скриптов на pgScript. Синтаксис написания скриптов на pgScript сильно отличается от синтаксиса написания тел хранимых процедур на plpgsql, что, честно говоря, в начале написания приводило к жуткой синтаксической путанице. :)


Итак, переходим непосредственно к изучению...

19 марта 2012 г.

Lazarus. TDBGrid + ZeosLib 7. Отображение дробных чисел.

Добрый день.
 
       Недавно столкнулся с проблемой отображения вещественных чисел. Дело в том что прога, в которой была замечена проблема работает с финансами, поэтому точность отображения играет ключевую роль, дабы не привести к инфаркту будущих пользователей - финансистов.
       Искажение отображения происходило следующим образом:
Есть исходное число: 1 400 940.05 - в таком виде оно хранилось в базе.
1 400 940 - в таком виде оно отображалось в DBGrid.
Вероятнее всего искажения происходили потому, что по умолчанию, DBGrid в совокупности с датасетом от Zeos отображает один символ после зщапятой. Т.е. число 123.4 - отобразится корректно, а число 123.04 - без дробной части.

Для обхода такого неприятного ограничения я написал процедуру:

procedure TZPostgresQuery.SetDisplayFormat;
var
  i:integer;
  fCount:integer;
begin
  i:=0;
  fCount:=0;
  if FQuery.Active then
  begin
    fCount:=FQuery.FieldCount;
    for i:=0 to fCount-1 do
      case FQuery.Fields[i].DataType of
        ftFloat:TFloatField(FQuery.Fields[i]).DisplayFormat := '#0.##';
        { TODO -odrmiller : Если формат указать как ",#.##", то числа будут отображаться с разделением по три,
        но на винде вместо разделителя пробела ставится символ "?". }
      end;
  end;
end;

       Это ее первая версия, т.к. при обнаружении глюков буду расширять пока еще одновариантный CASE.
Процедура выполняется всегда после открытия датасета.

       Если кто-то знает более оптимальный способ, просьба указать правильный путь. Спасибо :)

18 марта 2012 г.

Metastock... Автоматизация размещения заявок: Использование TAutoTraderDLL


На кануне выходных получил экземпляр библиотеки TAutoTraderDLL.
В комплект поставки входит пустая база данных, TAutoTrader.mdb, куда подгружаются из Quik данные по портфелям и состоянию счета. Reg-файл для регистрации в реестре настроечной информации для библиотеки, инструкции и несколько вспомогательных библиотек.

В данный момент занимаюсь настройкой системы для использования библиотеки. Забегая наперед скажу, что в справке все подробно и понятно описано. в идеальных условиях проблем с настройкой возникнуть не должно, но мои условия были не идеальными... :) При том что я не являюсь трейдером, и имею весьма скудный опыт общения с клиентским терминалом Quik, то настройки библиотеки TAutoTraderDLL для меня была не такой гладкой как хотелось бы.

Первое с чем пришлось столкнуться - это отсутствие пункта меню "Лимиты". Долго искал этот пункт, открывая все подряд по очереди, думая что пункт "переехал" куда-то в ходе развития программы, а нет... Все оказалось весьма интереснее. Пункт меню "Лимиты" отображается лишь тогда, когда трейдеру назначены лимиты... Иначе этот пункта просто нет. (хотя я бы просто заблокировал его, чтобы исключить замешательство заблудших программистов). В общем... RTFM.

Лимиты получили, таблицы настроили. Вперед!

13 марта 2012 г.

ZeosLib. Впечатления от использования в Lazarus

Пишу информационную систему на Free Pascal и PostgreSQL.
Изначально использовал стандартные компоненты (TPQConnection, TSQLQuery и т.д.).
Для того чтобы было проще рулить механизмами взаимодействия с БД - написал диспетчер компонентов.

Суть диспетчера - приведение любого компонента работающего с БД к единому интерфейсу. Таким образом, если мне понадобилось заменить компоненты доступа - надо для этих компонентов написать несколько наследников диспетчера. Для маленьких проектов это не рационально, а вот для больших... Очень даже. Такой подход так же подразумевает создание всех объектов доступа динамически, Но это уже другая история... Которую я опишу позже...

Итак, Zeos*.
Стандартные компоненты хорошо справлялись с поставленными тривиальными задачами, но наступил момент когда нам понадобилась обратная связь с сервером БД. Обратная связь средствами исключений не годится по понятным, думаю, причинам.
Конкретно мне было необходимо автоматически обновлять датасет на клиенте при наступлении определенных событий в базе данных.

Помимо Zeos, такими способностями обладает PostgreDAС... Но он платный - неприемлемо.

Для того чтобы использовать Zeos в совокупности с PostgreSQL,  придется немного переделать исходники самого зеоса. Эта малая плата за бесплатность функционала который он предоставляет :).
Проблема в том что из-за синтаксических особенностей диалекта SQL который использует PostgreSQL, Zeos не всегда понимает, что выполняемый запрос синтаксически правильный. Придется подправить парсер следующим образом:
В модуле ZSQLStrings нужно заменить тело метода TZSQLStrings.RebuildAll:

12 марта 2012 г.

Линус Торвальдс посоветовал неумелым разработчикам средств безопасности застрелиться

Создатель операционной системы Linux Линус Торвальдс опубликовал на своей странице  в Google+ гневную тираду в адрес разработчиков дистрибутива OpenSUSE.
Торвальдс столкнулся с тем, что установленная на его ноутбуке система
OpenSUSE требует ввода пароля администратора для выполнения даже таких элементарных действий, как изменение часового пояса, добавление новой беспроводной сети или принтера. Изобретателей подобных «мер безопасности» Торвальдс назвал «дебилами» и посоветовал им поскорее застрелиться, ибо мир без них будет лучше.

Сотни комментаторов поддержали мнение создателя Linux о политике
безопасности в дистрибутиве OpenSUSE. Некоторые из них возразили против
употребления таких сильных выражений, но сам Торвальдс и многие другие
настаивают на своем. «Шутки часто бывают оскорбительными, — написал
Торвальдс. — Если вы на них обижаетесь, то проблема только в вас.
Подумайте об этом».

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

(С) http://www.osp.ru

11 марта 2012 г.

Доступ по сети к серверу PostgreSQL

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

ОС: Linux Ubuntu 10.04.

Для этого нам небходимо отредактировать два файла (необходимы права root).
Файл /etc/postgresql/8.3/main/postgresql.conf
Ищем секцию CONNECTIONS AND AUTHENTICATION и меняем строку
 #listen_addresses = 'localhost'
на
 listen_addresses = '*'
ВНИМАНИЕ!!!
Не забываем раскомментировать параметр, удалив символ # перед словом "listen_addresses"


Файл /etc/postgresql/8.3/main/pg_hba.conf
Идем в самый конец файла и ищем строки:
 # IPv4 local connections:
 host all all 127.0.0.1/32 md5

127.0.0.1/32 это маска разрешенной сети (32 - это число значащих бит в маске, т.е. в данном случае - все), добавляем строку с маской вашей сети, например:
 host all all 192.168.1.0/24 md5

, т.е. будут разрешены все соединения с адресов 192.168.1.1 и по 192.168.1.254. Или, для большей безопасности, добавляете конкретную машину:
 host all all 192.168.1.3/32 md5 
 
Для того, чтобы обеспечить доступ ЛЮБЫМ IP-адресам необходимо изменить параметр следующим образом:
 host all all 0.0.0.0/0 md5 

Перезапускаем службу:


sudo service postgresql start

sudo service postgresql stop
sudo service postgresql restart

После всех этих манипуляций можно проверять коннект по сети...

Откуда взял исходник для поста, не помню (лежал в архивах), как вспомню - обязательно напишу.