суббота, 25 октября 2014 г.

Про время

Я узнал, что время бывает разное:

  • количественное (1 час, 5 января 2014, 3 минуты)
  • и качественное (утро, весна, предвоенное, счастливое).

четверг, 9 октября 2014 г.

Операции над множествами в СУБД Oracle

В СУБД Oracle операции над множествами можно выполнять, как минимум, в трех контекстах с помощью трех различных механизмов. Это

  1. операции над битовыми полями,
  2. операции над вложенными таблицами,
  3. операции над множествами строк таблиц.

В этом порядке они и будут рассмотрены ниже, но сначала - суперкраткое введение в понятие множества.

пятница, 12 сентября 2014 г.

Linux. Упражнения с set(u|g)id и sticky bit

В прошлый раз я исследовал на практике, как работают разрешения rwx в Linux. Сегодня я продолжу упражнения с правами доступа к файлам и каталогам в Linux и рассмотрю атрибуты setuid, setgid и sticky bit. (Забегая вперед, скажу, что приключение оказалось интереснее, чем я ожидал.) Все приводимые далее примеры я буду выполнять в консоли Ubuntu 14.04.

суббота, 30 августа 2014 г.

Linux. Упражнения с rwx

Я собираюсь исследовать на практике то, что в общих чертах представляю себе в теории. А именно: на простых примерах разобраться, как работают права доступа к файлам и каталогам в Linux. Все приводимые далее примеры я буду выполнять в консоли Ubuntu 14.04.

четверг, 31 июля 2014 г.

Java в СУБД Oracle, часть III

В этой статье я рассмотрю, как Java код, выполняющийся внутри СУБД Oracle, работает с данными в БД. Попутно продемонстрирую работу резолвера (resolver) встроенной Oracle JVM и экспериментально установлю, с какими правами выполняется Java код внутри СУБД - правами владельца кода (definer) или вызывающего пользователя (invoker). В заключение, я продемонстрирую использование SQLJ для включения команд SQL в исходный код JAVA.

четверг, 24 июля 2014 г.

Oracle SQL*Plus, полезные возможности

Здесь собраны примеры, демонстрирующие некоторые из полезных возможностей Oracle SQL*Plus. Все приведенные скрипты выполнены в SQL*Plus Release 11.2.0.1.0 в консоли Windows.

Подборка носит отчасти ностальгический характер, поскольку в последние годы всю повседневную оперативную работу с СУБД Oracle я делаю в PL/SQL Developer. Однако, SQL*Plus остается незаменимым для работы в консоли Unix/Linux и из shell-скриптов. Пример в конце статьи - только для Unix/Linux.

четверг, 10 июля 2014 г.

Строки символов Unicode в Python 2 и Python 3

Винсент: Знаешь, что самое забавное в Европе?
Джулс: Что?
Винсент: Такие маленькие отличия. Там вроде все то же самое, что и здесь, но чуть-чуть отличается.

"Криминальное чтиво"

Как известно, ключевым отличием Python 3.x от Python 2.x является переориентация языка и стандартных библиотек со строк байтов на строки символов Unicode. Когда я решил повнимательнее посмотреть на это различие, пришлось копнуть вглубь и вширь, а результаты моих раскопок я оформил в статью, которую предлагаю вашему вниманию.

В Python 2В Python 3
строковый литерал получает тип str строковый литерал получает тип str
тип str представляет собой строку байтов тип str представляет собой строку символов Unicode
для представления строки символов Unicode используется тип unicode для представления строки байтов используется тип bytes
для представления строки unicode в нужной кодировке используется метод unicode.encode(кодировка), возвращающий строку байтов str для представления строки str в нужной кодировке используется метод str.encode(кодировка), возвращающий строку байтов bytes
для преобразования строки байтов str в строку unicode используется метод str.decode(кодировка), возвращающий строку unicode для преобразования строки байтов bytes в строку str используется метод bytes.decode(кодировка), возвращающий строку str
системная кодировка по умолчанию, она же кодировка исходных файлов по умолчанию, ASCII системная кодировка по умолчанию, она же кодировка исходных файлов по умолчанию, UTF-8
при записи в файл строки по умолчанию преобразуются в системную кодировку по умолчанию при записи в файл строки по умолчанию преобразуются в кодировку, определяемую пользовательскими настройками
идентификаторы в программе содержат только символы ASCII, не могут использовать никаких других букв, кроме латинских идентификаторы в программе содержат символы Unicode, могут использовать буквы других алфавитов, кроме латинского

Мои эксперименты я ставлю под ОС Windows 7 в стандартной консоли.

пятница, 20 июня 2014 г.

Java в СУБД Oracle, часть II

В первой части статьи я перечислил основные различия традиционной виртуальной машины Java и JVM, встроенной в СУБД Oracle. А также создал в базе данных несколько Java классов и PL/SQL обертки для вызова их методов, и продемонстрировал передачу и возврат значений из PL/SQL в Java код и обратно. Во второй части будет показан альтернативный способ создания объектов JAVA CLASS, рассмотрено поведение статических переменных класса в течение сеанса Oracle, и реализован Java класс и соответствующая PL/SQL обертка для чтения/записи внешних файлов.

среда, 11 июня 2014 г.

Java в СУБД Oracle, часть I

Мне редко приходится писать на Java хранимые процедуры для СУБД Oracle. А когда приходится, всякий раз я трачу некоторое время на "восстановление контекста", чтобы вспомнить особенности встроенной JVM и работы с ней. Чтобы в следующий раз восстановление контекста прошло быстрее, в этой статье в конспективной форме я собрал самые необходимые сведения и примеры кода на Java для встроенной Oracle JVM.

суббота, 31 мая 2014 г.

Коммуникации между сеансами в СУБД Oracle

В любой среде, где выполняются параллельные процессы, актуальны вопросы совместного использования общих ресурсов и обмена сообщениями между процессами. Одновременно открытые сеансы СУБД Oracle - именно такие параллельные процессы. Я уже рассматривал конкурентный доступ к общим ресурсам с помощью пакета DBMS_LOCK, а теперь поэкспериментирую со средствами обмена сигналами и данными между сеансами СУБД Oracle 11gR2 - пакетами DBMS_ALERT и DBMS_PIPE.

воскресенье, 25 мая 2014 г.

Конкурентный доступ к ресурсам и DBMS_LOCK

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

Таким ресурсом может быть, например, экземпляр некоторой сущности предметной области (сотрудник, элемент орг. структуры, и т.д.) Строки одной таблицы сеанс может зарезервировать для исключительного использования при помощи SELECT ... FOR UPDATE. Но в случае, когда необходимо заблокировать данные, распределенные по нескольким таблицам, лучшим решением будет специальное соглашение между конкурирующими процессами о доступе к ресурсу. А реализовать такое соглашение поможет пакет DBMS_LOCK.

воскресенье, 18 мая 2014 г.

Прогресс длительных операций в СУБД Oracle

Если вам приходилось иметь дело с "долгоиграющими" PL/SQL процедурами, которые выполняются от десятков минут до многих часов, то перед вами вставал вопрос, сколько работы уже сделано на данный момент и сколько еще осталось. Как заглянуть внутрь выполняющейся PL/SQL процедуры?

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

В этом случае нужно предусмотреть механизм, который обеспечит видимость прогресса работы процедуры из другого сеанса работы с БД. Это может быть специальная таблица, в которую PL/SQL процедура будет вставлять записи о завершении отдельных этапов работы и о прогрессе каждого этапа. Как вариант, записи могут добавляться и обновляться в рамках автономных транзакций. Тогда, делая запрос к этой таблице в отдельном сеансе, можно видеть текущий прогресс выполнения PL/SQL процедуры.

В большинстве случаев нет необходимости изобретать велосипед и реализовавать собственное решение для отслеживания прогресса "долгоиграющих" операций. СУБД Oracle предоставляет несколько средств, которыми можно вопользоваться для этой цели (а также для целей отладки, профилирования, и других, которые подскажет ваша фантазия) - это пакеты DBMS_APPLICATION_INFO, DBMS_ALERT и DBMS_PIPE. Все эти средства позволяют тем или иным образом организовать передачу данных из одного сеанса работы с СУБД Oracle в другой.

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

Мыслить как программист. Учимся с Python

Представляю вашему вниманию книгу "Мыслить как программист. Учимся с Python", 2-е издание. Это книга для тех, кто хочет научиться программировать. Книга учит программированию, используя язык Python как средство обучения.

Это открытая книга, по аналогии с открытым кодом.

Написанная Джеффри Элкнером (Jeffrey Elkner), Алленом Б. Дауни (Allen B. Downey) и Крисом Мейерсом (Chris Meyers), книга несколько лет использовалась учениками старшей школы как учебное пособие для изучения программирования. За это время она вобрала в себя замечания и дополнения сотен ее читателей. В 2010 - 2012 годах я перевел книгу на русский язык и незначительно переработал ее.

воскресенье, 20 апреля 2014 г.

Многоликий NULL, часть II

В первой части статьи была сделана попытка понять, что есть NULL, и установлены два аспекта этого явления: в зависимости от контекста, NULL удобно интерпретировать либо как признак отсутствия значения, либо как неизвестное значение. Были рассмотрены: отсутствие значения в столбце таблицы, и как этого избежать с помощью ограничений целостности; взаимоотношения NULL и строковых типов VARCHAR2 и CHAR; использование NULL в выражениях и в качестве агрумента встроенных функций Oracle, скалярных и агрегатных.

Во второй части я рассмотрю взаимоотношения NULL и значений типа BOOLEAN в PL/SQL; эффекты, имеющие отношение к NULL и результатам подзапросов, а также к оператору IN; сортировку по столбцу, часть значений в котором отсутствует.

воскресенье, 13 апреля 2014 г.

Многоликий NULL, часть I

Дыра это просто ничто, но вы можете в ней сломать шею.

Остин О'Мэлли

В этой статье я хочу с разных сторон посмотреть на NULL - явление в мире SQL фундаментальное. Все приведенные ниже примеры выполнены в СУБД Oracle 11gR2.

воскресенье, 30 марта 2014 г.

Шахматная доска с рисом

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

Что общего между этой легендой и двоичной системой счисления?

среда, 19 марта 2014 г.

Let's have a REST, часть III

В части I рассказано о том, что такое REST и что значит для приложения быть RESTful. На несложном примере проиллюстрирован процесс проектирования RESTful приложения. В части II рассмотрены некоторые детали протокола HTTP в связи с реализацией на его основе RESTful приложений. В частности, рассказано, в чем разница между HTTP-методами POST и PUT, что такое идемпотентность, как обойти ограничения языка HTML и сделать браузерное HTML-приложение RESTful (ну, почти RESTful).

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

воскресенье, 9 марта 2014 г.

Let's have a REST, часть II

Теоретически, RESTful приложение может использовать любой stateless протокол для обмена сообщениями между клиентом и сервером. Практически, RESTful приложения базируются на протоколе HTTP, среди методов которого есть методы GET, POST, PUT и DELETE.

пятница, 28 февраля 2014 г.

Let's have a REST, часть I

За аббревиатурой REST (REpresentational State Transfer) стоит модель клиент-серверного приложения, в котором клиент и сервер общаются по stateless протоколу, и программный интерфейс между ними построен с учетом нескольких архитектурных требований.

REST не является технологией, в отличие от SOAP или HTTP. Поэтому нельзя сказать, что приложение использует REST. Приложение может соответствовать модели REST, и тогда говорят, что оно RESTful.

Среди требований к архитектуре RESTful приложения следующие:

  1. идентификация серверных ресурсов,
  2. манипуляция ресурсами с помощью представлений (representations),
  3. самоописательность клиентских запросов,
  4. гиперсcылки в представлениях для перехода к новым состояниям приложения.

Рассмотрим эти требования одно за другим.

четверг, 20 февраля 2014 г.

Код

Какое число представлено на следующей картинке?

Верно ли следующее выражение?

101 - 11 = 10

А что такое "почахо"?

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

Запросы с агрегатами в СУБД Oracle

В этой статье я собрал запросы, иллюстрирующие типичное использование агрегатных функций. Я начинаю с рассмотрения общих агрегатов (totals), когда агрегатные функции применяются ко всей выборке. Затем рассматриваются частные агрегаты, или субагрегаты (subtotals), получаемые при помощи GROUP BY, и совместное использование общих и частных агрегатов в запросах. Приводятся примеры запросов для получения доли или процента частных агрегатов в общих. В заключение, даны примеры использования HAVING.

вторник, 28 января 2014 г.

Сводные таблицы в Oracle 11g

Предположим, нам нужно узнать количество таблиц, вью и триггеров у пользователей БД SYS, SYSTEM и SCOTT. Первым приходит в голову такое решение:

SQL> SELECT owner, object_type, count(*)
     FROM all_objects
     WHERE object_type IN ('TABLE', 'VIEW', 'TRIGGER')
         AND owner IN ('SYS', 'SYSTEM', 'SCOTT')
     GROUP BY owner, object_type
     ORDER BY owner, object_type;

OWNER                OBJECT_TYPE             COUNT(*)
-------------------- -------------------- -----------
SCOTT                TABLE                          4
SYS                  TABLE                        998
SYS                  TRIGGER                       10
SYS                  VIEW                        3865
SYSTEM               TABLE                        157
SYSTEM               TRIGGER                        2
SYSTEM               VIEW                          12

7 rows selected

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

OBJECT_TYPE                 SYS     SYSTEM      SCOTT
-------------------- ---------- ---------- ----------
TRIGGER                      10          2          0
TABLE                       998        157          4
VIEW                       3865         12          0

воскресенье, 19 января 2014 г.

Считаем до 1000... на пальцах

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

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

воскресенье, 12 января 2014 г.

Пользовательские агрегатные функции в Oracle

СУБД Oracle, начиная с версии 8, предоставляет ряд программных интерфейсов для создания расширений (extensibility interfaces). Реализации этих интерфейсов могут быть написаны пользователями СУБД. В частности, это интерфейсы для создания расширений индексирования, расширений стоимостного оптимизатора, пользовательских агрегатных функций.

На базе этих программных интерфейсов компанией Oracle созданы и распространяются вместе с СУБД такие функциональные расширения, как Oracle Text, Oracle Multimedia и Oracle Spatial. Эти расширения Oracle именует data cartridges, а соответствующая технология называется Oracle Data Cartriges (ODC).

Теперь, обрисовав контекст, приступаю к созданию пользовательской агрегатной функции.