Страницы

22 декабря 2015 г.

Визуализация данных через d3js. Структуры данных.

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

Итак, хочу сделать некую классификацию по структурам данных.
Вот некоторые разновидности:

JSON - дерево


    {
     "name": "cluster",
     "children": [
      {"name": "AgglomerativeCluster", "size": 3938},
      {"name": "CommunityStructure", "size": 3812},
      {"name": "HierarchicalCluster", "size": 6714},
      {"name": "MergeEdge", "size": 743}
     ]
    },
    {
     "name": "graph",
     "children": [
      {"name": "BetweennessCentrality", "size": 3534},
      {"name": "LinkDistance", "size": 5731},
      {"name": "MaxFlowMinCut", "size": 7840},
      {"name": "ShortestPaths", "size": 5914},
      {"name": "SpanningTree", "size": 3416}
     ]
    }

10 декабря 2015 г.

Визуализация данных. Библиотека d3js.

Есть такая штука - d3js (http://d3js.org/), которая на мой взгляд очень привлекательна. Уже больше недели хочу с ней поработать, все никак не доберусь для этого.

Тупо что-то отобразить - это не интересно. Более интересна написать некий сервис который будет подсовывать нужные данные для отображения этой замечательной библиотекой.
Вот примеры, с оф. сайта:
https://github.com/mbostock/d3/wiki/Gallery
Уже не первый раз залипаю достаточно надолго на этих примерах :)

Лучше бы работал!

29 ноября 2015 г.

Визуализация данных. Мысли вслух...

Сейчас, в современном мире в базы данных не пишутся разве что ваши сны... Хотя, и они тоже туда попадают, если вы этого хотите. Это я к тому что сейчас, все, везде и всегда пишется в какие-либо базы данных, сохраняется в хранилищах, трансформируется и анализируется для принятия решений. Мир сильно изменился, теперь мы порождаем слишком много данных. Система сбора данных работает интенсивнее чем система обработки и анализа. Думаю эта проблема актуальна для всех уровней потребности в данных (от индивидуального человека, до глобальных аналитических систем). Задача современного человека - переварить как можно большую часть информации, которая предоставляется для обозрения/изучения за как можно меньшее время.
Как это сделать?
Визуализация... Представление данных в виде таблиц - это тоже визуализация. Представление данных в виде утверждений - это тоже своего рода визуализация.
Сейчас есть прямая потребность в ускорении потребления информации и принятия решений. Картинки - вот выход. Мы с детства, перед тем как читать книгу - ищем картинки. Т.к. именно они могут рассказать нам о содержимом в сотни раз проще и быстрее чем текст. Уже давно на смену простому тексту пришла инфографика... Почему? Не потому что люди стали ленивее, а потому что это реальное ускорение скорости восприятия. Чаще всего нам не нужно учить наизусть предоставляемые данные, нам просто нужно посмотреть и принять какое-то решение.
Хочется с кем-то пообщаться по поводу визуализации. Т.к. данные сейчас охватывают все сферы жизни - визуализация это очень актуальная тема, которая будет в тренде еще долгое время. Время всего лишь отшлифует методы визуализации и упростит их, но ничем не заменит...
Хочется поработать с вот этой штукой: http://d3js.org/

25 ноября 2015 г.

NetBeans 8.1. Python projects + проблема с Python 3.4. в Ubuntu

Для того чтобы разрабатывать на python в NetBeans необходимо установить плагин.
Его можно скачать здесь: http://plugins.netbeans.org/plugin/61688/python

Необходимо скачать архив и куда-нибудь распаковать.
Далее, открываем NetBeans. Главное меню - Tools - Plugins. Открывается окно - переходим на вкладку "Downloaded", нажимаем на кнопку "Add Plugins...". Открывается диалог выбора файлом. Вам просто нужно пойти в ту папку куда вы ранее распаковали архив и выбрать сразу все файлы. Далее проследует несложный диалог установки - Готово. 
NetBeans захочет перезапуститься - лучше не отказываться.

После перезапуска в список доступных конфигураций проектов добавится папка "Python"

Видео можно посмотреть тут: 

Может возникнуть проблема (у меня была на Ubuntu 14.4), по умолчанию в проекте определен Python 2.7, хотя в системе уже стоит Python 3.4. Предполагаю что это из-за алиасов, т.к. 3-й python в терминале доступен как "python3" (например pethon3 --version).
Решается проблема так: 

Кликнуть правой кнопкой мыши на проекте в окне Projects, кликнуть Properties. Откроется диалог. Рядом с пунктом "Python platform", есть кнопка "Manage...". При нажатии открывается диалог с платформами. Нужно нажать на кнопку "New", и в перейти в каталог "usr/bin", там найти python3 и выбрать его. У вас в список добавится платформа. Выбрать ее и нажать кнопку "Make default", чтобы сделать ее платформой по умолчанию.
Все!

16 ноября 2015 г.

Настраиваем рабочее место django-разработчика на linux (ubuntu 14.4) в виртуальном окружении.

Используем виртуальное окружение чтобы не захламлять систему разными версиями библиотек. (virtialenv).
Если кто-то не знаком с virtialenv - в интернете очень много материалов для ознакомления.

Устанавливаем easy_install или pip для установки дополнительных пакетов.
Установка easy_install:
sudo apt-get install python-setuptools

Установщик готов,  теперь с его помощью устанавливаем virtualenv:
sudo easy_install virtualenv

Теперь создаем папку виртуального окружения:
virtualenv --no-site-packages myvirtual

где
--no-site-packages - параметр указывающий не использовать системные библиотеки питона.
myvirtual - папка витруального окружения.

После выполнения этой команды, в текущем каталоге появился каталог myvirtual. Это легко проверить выполнив команду в терминал:
ls -l

В этом каталоге содержится несколько подкаталогов. Нас на текущий момент интересует bin. В каталоге bin  есть скрипт activate которые активирует виртуальное окружение.

Находясь в каталоге virtualenv вводим команду:
source bin/activate

Тем самым включая контекст виртуального окружения. Это означает что в с текущего момента мы будем работать только в своем виртуальном окружении. В терминале, в начале строки ввода команд в скобках должно быть указано наименование виртуального окружения в контексте которого мы сейчас находимся (myvirtual).

Теперь необходимо установить django. Для этого выполняем в терминале команду:
easy_install django

Ждем окончания установки.

Рабочее место готово!

Для выхода из виртуального окружения вводим команду:

bin/deactivate.


После чего вы вновь окажитесь в окружении своей системы.



8 ноября 2015 г.

Aqua Studio. Teradata. Пропадают комментарии в хранимках

После установки Aqua Studio не до конца настроил некоторые параметры, что в свою очередь вылилось в пропажу комментариев из текстов хранимок. Пропажа вызвала запредельное негодование, т.к. комменты вычистились из нескольких хранимок с 1000+ строк и нетривиальной логикой.

Чтобы остановить стирание комментов при сохранении хранимки в метаданных сервера терадаты, нужно в Aqua Studio установить следующие параметры:


Тем кто сидит на SQuirreL sql можно не бояться :)

Python. Ошибка Teradata beyond SQL_ACTIVE_STATEMENTS limit

Если кто-то встретился с такой проблемой, .то вы просто не закрываете "курсор" когда отправляете много statements на сервер.

Вот пример кода который генерирует ошибку:
    def executeSql(sqlCommand, parameters = ()):
        connect = SqlQuery.getConnect()
        try:
            cursor = connect.cursor()
            cursor.execute(sqlCommand, parameters)
            connect.commit()
        except Exception as e:
            logger.exception('Sql query error.', str(e))
            connect.rollback()
        finally:
            connect.close()
        return 0


Вот пример кода, который позволяет избежать ошибки:
    def executeSql(sqlCommand, parameters = ()):
        connect = SqlQuery.getConnect()
        try:
            cursor = connect.cursor()
            cursor.execute(sqlCommand, parameters)
            connect.commit()
        except Exception as e:
            logger.exception('Sql query error.', str(e))
            connect.rollback()
        finally:
            cursor.close()
            connect.close()
        return 0

SqlQuery  - это самописный билдер подключений. Он не влияет на проблему.
Проблема была замечена пока только на терадате.

17 октября 2015 г.

Теперь еще и Ubuntu!

Установил себе Ubuntu 14.4 на Sony Vaio VPCF1.
Теперь на ноуте Windows 7 и Ubuntu 14. Установилась вообще без проблем. Все работает, с драйверами заморочек не было.

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

Java-курсы. А зачем...?

Привет всем!
Давно хотел включить Java в список своих инструментов.
Сейчас прохожу курс профессиональной разработки. Приобретенный опыт в смежных направлениях помогает быстро схватывать преподаваемый материал.
Честно говоря это первый опыт прохождения курсов и я приятно удивлен... Не думал что эффект будет настолько прогрессивным.

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

16 июля 2015 г.

Выбор языка программирования? Не, не слышал :)

Навеяло статьей

Переходим с Delphi на C# (беглый взгляд + мысли вслух)


Спустя время (обретя опыт и мудрость :) ) возвращаясь к теме "На какой язык лучше соскочить?".

Вопрос в корне не правильный!

       Не задачи должны подбираться под язык программирования, а язык программирования под задачу.
       Если вы кодите на Delphi и хотите слезть, не нужно этого делать - нужно обязательно освоить C# и Java, Python, но при этом не бросать Delphi.
       Владеть одним языком и надеяться, что его хватит для всех потребностей - это ошибка. Это все равно, что в совершенстве овладеть только отверткой и верить что забить ей гвоздь - не проблема при правильном подходе. Гвозди должны забиваться молотком, экономьте свое время. Задача должна определять выбор инструмента....
       Овладейте python. На нем можно быстро писать прототипы и рабочие версии приложений.
Овладейте SQL. Сейчас базы данных везде! И реляционная модель еще долго будет радовать нас своим присутствием (на случай комментария по поводу NoSQL).

Владеть только отверткой - это ошибка.

Teradata. Несколько способов получить номер недели в году. (get week number)

Заморочился этим вопросом, накопал несколько вариантов:


-- week number
SELECT TD_SYSFNLIB.WEEKNUMBER_OF_YEAR (DATE'2015-06-06');

-- week number ISO
SELECT TD_SYSFNLIB.WEEKNUMBER_OF_YEAR (DATE'2015-06-06', 'ISO')

-- week number for Teradata 14
SELECT TO_CHAR(DATE'2015-06-06', 'iyyyiw')

-- week number custom.
SELECT ((DATE'2015-06-06' - ((EXTRACT(YEAR FROM DATE'2015-06-06') - 1900) * 10000 + 0101 (DATE))) - 
       ((DATE'2015-06-06' - DATE '0001-01-07') MOD 7)  + 13) / 7

Генерация Data Vault из Stage. Заметка.

Для прагматиков: в этой статье нет никакой практической пользы, просто пометка. Можно не читать. :)

Генерация схемы Data Vault 1.0 из Stage таблицы. Краткий алгоритм, типичный случай.

Практически всегда есть один Source из которого генерируется несколько целевых Data Vault таблиц.
Алгоритм построения таблиц Data Vault следующий:
1. Определяем бизнес ключи для создания хабов (бизнес ключами обычно становятся айдишники сущности на базе - источнике).
2. Для каждого бизнес-ключа определяем поля которые пойдут в хаб-сателлит (речь идет о полях которые являются описанием бизнес-ключа, предающим ему логический смысл. Без этих полей, для человека, бизнес-ключ просто бессмысленное число или набор символов).
3. Создание линков: На предыдущих шагах определили хабы, теперь их можно линковать. На основе ключей хабов генерируем линки между ними (+линк-сателлит). Таким образом связываем сущности.

TODO: Автоматизация получения DV из Stage.

29 июня 2015 г.

Oracle. Иерархические (рекурсивные запросы)

hierarchical_query_clause::=

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

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

START WITH.
Задает условия определения корня дерева.

CONNECT BY.
Определяет условие связи родительских записей и дочерних.

NOCYCLE.
Задает режим при котором будут игнорироваться "петли" в дереве. Т.е. ситуации когда родительская запись ссылается на дочернюю, а дочерняя снова на родительскую. С этой опцией у вас не будет переполнения рекурсии. Отследить зацикленные узлы можно с помощью поля CONNECT_BY_IS_CYCLE. Это поле вернет 1 если узел зациклен.

PRIOR
В условии CONNECT BY должен быть определен оператор PRIOR. Этот оператор задает направление развертывания иерархии. PRIOR указывается со стороны поля которое должно быть дочерним при развертывании. Т.е. таким образом мы указываем уловие "родитель" = "предыдущему потомку". Другими словами рекурсия на каждом новом проходе ищет потомков предыдущей записи, собирая иерархию.

CONNECT_BY_ROOT.
Псевдополе которое выводит значение из корневой записи на протяжении всей выборки. 

CONNECT_IS_LEAF.
Псевдополе для индикации листов дерева. Т.е. если у узла в иерархии нет потомков, псевдополе выведет 1, иначе 0. 

Примеры можно увидеть здесь.
Более подробно о принципе работы на русском - здесь.

20 июня 2015 г.

Django 1.8. Устанавливаем и настраиваем MySql. Краткое руководство.

Первое что необходимо сделать, это установить MySql.
Как устанавливать и где взять дистрибутив можно  узнать тут:
Install MySql

В конце приведены правки файла py.ini. Не нужно ставить кодировку 1251 как там рекомендуют. Если верить источникам для Django это не пригодится. Вместо кодировки 1251 ставим utf8.

Вот пример:

[mysql]
default-character-set=utf8

[mysqld]
port=3306
character-set-server=utf8
default-storage-engine=MYISAM

Вот подробности, если нужно: Пример

Далее.
Нам нужно установить клиента для обращения к серверу. Есть варианты. Вот ссылка на подробности: http://djbook.ru/rel1.8/ref/databases.html#mysql-db-api-drivers
Если кратко, то

  • MySQLdb - для тех у кого python v2.
  • mysqlclient - рекомендуемый вариант, поддерживает python v3.
  • MySQL Connector/Python is a pure Python driver from Oracle that does not require the MySQL client library or any Python modules outside the standard library.... Ну тут думаю понятно.
Я ставил mysqlclient.

Установка mysqlclient.

т.е. переходим в директорию куда скачали whl-файл и вызываем pip install <file_name>. На экране видно что должно быть в окне cmd в случае успешной установки.

4 мая 2015 г.

Порождающие паттерны проектирования

  • Abstract Factory - абстрактная фабрика. Суть ее в том что существует некий интерфейс (или абстрактный класс) определяющий методы построения объекта. Классы порождаемые от этого интерфейса реализуют создание целевого объекта. Т.е. если мы имеем иерархию классов-наследников, то для конструирования объектов каждого уровня иерархии (если это нужно) нам нужно иметь иерархию фабрик.
  • Builder - строитель. Это "фабрика" с более сложной структурой, в которой предусмотрена реализация интерфейса строителя для каждого типа целевого объекта. Строитель определяет методы которые будут применяться для инициализации и конфигурирования целевого объекта. Строитель не существует сам по себе. Вместе с ним существует класс директор, который управляет строителем (запускает процесс построения целевого объекта) и класс объект которого надо построить.
  • Factory Method - фабричный метод. Это метод класса в котором прописано создание и конфигурирование объекта. Метод возвращает тип целевого объекта.
  • Prototype - прототип. Суть этого паттерна в том, что производится создание нового объекта путем клонирования некого прототипа. Например у нас имеется объект-прототип описывающий базовую конфигурация одноэтажного дома. Чтобы для создания новых домов нам не конфигурировать объект с самого начала, мы клонируем базовый и добавляем в него новые свойства. 
  • Singleton - синглтон. Это класс реализованный таким образом, что становиться невозможным создание более одного экземпляра такого класса. Банальный пример - управление глобальными настройками и доступ к ним из любого необходимого места.