Показ дописів із міткою рецепти. Показати всі дописи
Показ дописів із міткою рецепти. Показати всі дописи

понеділок, 1 лютого 2016 р.

Accessing MS Access from python with Cyrillic table names

My today's issue is quite interesting and is related to the data migration from MS Access to some regular (and more widely-used) database, i.e. MySQL. So we have as input a database, created in the MS Access 2000 (supposed) with the Cyrillic tables, that contains near 5k of sensible records. And expected result should be any DB that is supported by SQL Alchemy (right now it is MySQL, but I believe it will be easy to migrate to any other). And here is the most complex part: "How"?

Firstly I needed some way to provide ODBC  support for my Linux (Windows users/developers are more lucky at this point) as well as driver for access to MDB files. These packages provide such support for Debian:
  • unixodbc
  • odbcinst
  • libodbc1
  • libiodbc2
  • odbc-mdbtools
I got this list of packages from amirkdv, who implemented ODBC module for PHP. [Note: later I found a plenty of other docs about this subject, so I'm not good at Googl'ing at all]. Among other drivers there was also a web-page for unixodbc.org and Easysoft's page, who asked near 500 pounds for their library. Maybe it worth that money, but I need such access for one-time operation, so that's not my case right now.

So final command on my Debian system looked like:
$sudo apt-get install unixodbc odbcinst odbc-mdbtools

Files /etc/odbc.ini and /etc/odbcinst.ini were created after the installation and the latter one contained following lines:
[MDBTools]
Description=MDBTools Driver
Driver=libmdbodbc.so
Setup=libmdbodbc.so
FileUsage=1
UsageCount=1

It was enough for my case. The line "[MDBTools]" in the mentioned above file states for the name of the used driver, that should be indicated for granting access to the database.

At this point system's preparation is over, and it is a time, to look around about libraries that should provide access to the DB from the python. I discovered few of them:
  • pyodbc - outdated and I discovered this a bit later;
  • pypyodbc;
  • sqlalchemy-access - outdated as well.
Unfortunately, pyodbc failed to connect to the database, so I've been forced to use pypyodbc as the only possible way at that moment. Being inspired by usage examples for pypyodbc I finished with something like this: 

import pypyodbc
from os.path import abspath

drv ='MDBTools'
db_file = abspath('./pl.mdb') # Here "pl.mdb" is my input file
con = pypyodbc.connect("DRIVER={};DBQ={}".format(drv, db_file))
cur = con.cursor()

tables = list(cur.tables())

# Get list of tables from the file
for tbl in tables:
  print tbl


And got something like that:
('', '', '\xd0\x92\xd1\x83\xd0\xbb\xd0\xb8\xd1\x86\xd1\x96\xd0\x9b\xd1\x8c\xd0\xb2\xd0\xbe\xd0\xb2\xd0\xb0', 'TABLE', '')
('', '', '\xd0\x9d\xd0\xb0\xd1\x81\xd0\x9f\xd1\x83\xd0\xbd\xd0\xba\xd1\x82\xd0\xb8\xd0\x9b\xd0\x9e', 'TABLE', '')
('', '', '\xd0\xa2\xd0\xb8\xd0\xbf\xd1\x8b', 'TABLE', '')
('', '', '\xd0\xa2\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x80\xd1\x8b', 'TABLE', '')
('', '', '\xd0\xa4\xd1\x96\xd1\x80\xd0\xbc\xd0\xb8\xd0\x9f\xd0\xbe\xd1\x81\xd1\x82\xd0\xb0\xd1\x87\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb8\xd0\xba\xd0\xb8', 'TABLE', '')

Here I should shout "Hooray! I did it!", but unfortunately, there is no reason for joy. As you may notice, tables are named by Cyrillic names, so now I should deal with them in some way.
The only solution that came into my mind was to call SQL statement as Unicode string, with the table's name encoded as regular string, i.e.:

sql_statement = u'SELECT * FROM "\xd0\x92\xd1\x83\xd0\xbb\xd0\xb8\xd1\x86\xd1\x96\xd0\x9b\xd1\x8c\xd0\xb2\xd0\xbe\xd0\xb2\xd0\xb0"' 
res = cur.execute(sql_statement).fetchall()
for item in res:
  print item

So, I got a list of tuples like this one (stripped version), from which records can be converted into regular Unocode.
('\xd0\x94\xd0\xb6\xd0\xb5\xd1\x80\xd0\xb5\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb0',)
('\xd0\x94\xd0\xb7\xd0\xb8\xd0\xbd\xd0\xb4\xd1\x80\xd0\xb8 \xd0\x84.',)
('\xd0\x94\xd0\xb8\xd0\xb2\xd1\x96\xd0\xb7\xd1\x96\xd0\xb9\xd0\xbd\xd0\xb0',)
('\xd0\x94\xd0\xb8\xd0\xba\xd1\x82\xd0\xbe\xd0\xb2\xd0\xb0',)
('\xd0\x94\xd0\xb8\xd1\x82\xd1\x8f\xd1\x87\xd0\xb0',)


The converted version of the records is:

Джерельна
Дзиндри Є.
Дивізійна
Диктова
Дитяча

And now it is a time for "Hooray!!!!"


вівторок, 29 жовтня 2013 р.

Робоче середовище для NuPIC

Одна з платформ, яку я використовую у своїй роботі, це вільна платформа NuPIC, яка є альтернативою сучасному штучному інтелекту. Відправною точкою є сама платформа а також невеличкий вступний урок на Хабрі (знайшов випадково вчора). Тому з вчорашнього дня я займаюся тим, що намагаюся побудувати робоче середовище за допомогою virtualenv з використанням пайтону 2.7.

Для того, щоб запустити таке середовище, потрібні такі залежності:
  1. У Дебіан: libpng-dev libfreetype6-dev libtool automake python-dev
  2. У virtualenv:
    • argparse==1.2.1
    • matplotlib==1.3.1
    • nose==1.3.0
    • numpy==1.7.1
    • pyparsing==2.0.1
    • python-dateutil==2.1
    • six==1.4.1
    • tornado==3.1.1
    • validictory==0.9.1
    • wsgiref==0.1.2
Рядок для pip виглядає таким чином: pip install validictory numpy;pip install matplotlib
Тобто для створення середовища потрібно встановити віртуальне оточення:
$ export NTA=$HOME/nta/eng
$ export NUPIC=/path/to/repo
$ export BUILDDIR=/tmp/ntabuild
$ export MK_JOBS=3
$ cd $NUPIC
$ virtualenv --python=python2.7 venv
$ . venv/bin/activate
(venv) source $NUPIC/env.sh
(venv) ./cleanbuild.sh
Далі запускаємо С++ тести:
$NTA/bin/htmtest
$NTA/bin/testeverything
А також тести на python:
cd $NTA
./bin/run_tests.sh
У тому випадку, якщо ми отримуємо повідомлення: E ImportError: libpython2.6.so.1.0: cannot open shared object file: No such file or directory потрібно видалити вбудовану у NuPIC бібліотеку matplotlib:
rm $NTA/lib/python2.7/site-packages/matplotlib
Хвилюватися з приводу цього не варто, оскільки у нас встановлено matplotlib у $NUPIC/venv//lib/python2.7/site-packages/ .
Надалі, для роботи з NuPIC можна використовувати наступні команди:
$ source $NUPIC/venv/bin/activate
(venv) source $NUPIC/env.sh

неділя, 10 лютого 2013 р.

Cygwin+Vim+Backspace

Цього семестру мої студенти будуть вчити С++ у польових умовах, з використанням Cygwin та G++. Причин для такого вибору є декілька:
  • Необхідно мати зручний компілятор, який буде запускатися швидко і на стареньких комп’ютерах, оскільки нові цього року не світять;
  • Хочу мати під руками компілятор, який відповідає останньому стандарту С++;
  • Хочу розказати студентам, що не IDE єдиним живе програміст;
  • Хочу їх трохи дисциплінувати і навчити гарно форматувати код, а то приносять джерельні коди у форматі doc (так, так, вони умудряються копіювати код у word, а потім дивуються, чому я кажу, що так не можна робити);
  • Хочу їхній код компілювати в себе на Лінаксі, щоб було видно що й до чого;
  • Хочу спробувати попрацювати з cygwin.
Першою суттєвою проблемою став вибір мінімального набору ПЗ. Станом наразі це:
  • gcc-g++
  • gcc-mingw-g++
  • libgcc1
  • gdb
  • make
  • termcap
  • terminfo
  • vim
Перша видима проблема: у vim не можу видаляти символи за допомогою backspace.
Рецепт:
  1. Створюємо файл налаштувань для vim: ~/.vimrc
  2. Встановлюємо параметри backspace:
    set backspace=indent,eol,start
     
  3. Зберігаємо файл
Усьо.

вівторок, 1 січня 2013 р.

Iceweasel 3.5.X and illegal instruction

Вхідні дані:
  • 31 грудня 2012 року:
  • рідний домашній сервер, через який бігає мій інтернет;
    • На сервері крутиться Debian/GNU Linux Squeezy.
  • запущений процес оновлення системи: aptitude safe-upgrade
  • 1 січня 2013 року:
  • оновлений сервер;
  • вилітання крижаного тюленя (iceweasel) з повідомленням «Illegal instruction»;
  • повідомлення хрому (google-chrome) про те, що плагін не вдалося завантажити.

субота, 1 вересня 2012 р.

Підсвітка синтаксису у Vim


Типово vim має підтримку синтаксису лише англійської мови. Інших мов у дистрибутиві я не знайшов, однак довідка vim (:help spell) підказала, що це є файли з розширенням spl.
Невеликий пошук з гуглом, показав, що файли з перевіркою синтаксису, а також файли ймовірних замін знаходяться на http://ftp.vim.org/vim/runtime/spell/

Для перевірки синтаксису, використовуються такі команди як:
  • 'runtimepath' - перелік шляхів, де буде здійснено пошук файлу з перевіркою. Окремі шляхи розмежовуються комою.
  • 'encoding' - кодування файлу.
  • 'spelllang' - мова, за якою здійснюється перевірка.

Якщо ми припустимо, що потрібно здійснити перевірку україномовного тексту, у файлі, який має кодування utf-8, то це можна зробити за допомогою наступних комад:
:set encoding=utf-8
:set spelllang=uk
Тоді vim буде шукати файл uk.utf-8.spl. Якщо ж цей файл є відсутнім у шляху runtime, то vim автоматично спробує його завантажити.

Для перегляду можливих варіантів «правильного» слова - використовуємо комбінацію «z=».