Показ дописів із міткою linux. Показати всі дописи
Показ дописів із міткою linux. Показати всі дописи

понеділок, 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 жовтня 2014 р.

Limiting chrome's memory usage per tab

Last two weeks I observed that one of my favorite games - eRepublik, uses abnormally huge amount of memory if you leave chrome for few hours opened. Finally page becomes unrespondable, and you may observe a usage per page near 1-2Gbs of memory. In the example below, my chrome decided to occupy a bit smaller amount of RAM just in 15 minues of site browsing.
Top of my chrome's task manager with "memory leak" 
Indeed, such situation didn't make happy neither me nor other people around the world. Some of them suggested, they would like to have a possibility to limit chrome's memory usage. Indeed, the reason for such strange behaviour is caused by design in chrome, that keeps in memory major part of elements for given tab, until you change website. I perfectly understand Googlers' desire to make everything "smoothing" and fast, but indeed present situation looks quite dangerous for some people, that use webpages as their workplace, or if they need to update pages time to time.
Most of the existing solution you may find on the web, provide you with a possibility to limit overall chrome's memory usage by suspending tabs, by "parking" them etc. Yes, in general cases, it helps, cause chrome uses separate process for each tab, so limiting amount of tabs improves overall picture. But in case when one web-page uses extra-and-extra-and-extra memory this is not the solution. Indeed this is not the solution if you need to work with the site, and you don't intend to check old info, but your main purpose is to grab new one. Perfect solution for such situation was if chrome tried to limit its internal memory per page, let's say by 2 or 3 last complete snapshots, but until this, the only possible way is either to close tab with extended memory usage and open new one, or kill it from Chrome's task manager.
The only solution, that solves this problem in the way, described above is python solution at superuser.com. It is a bit old, so I modified it in order to work with python 2.7.8 (that is default on my system) and psutils 2.1.1 (they don't include into python distro, so you should get them by yourself).
It's main feature is it kills ANY tab that overcomes 800 Mb of real memory. You can put your own value if this one is too small for you.
The main disadvantage is it really kills really ANY tab, and some times it kills other tabs assigned with the renderer. So you will loose all your input forms. Therefore I recommend use this script just if you really need such feature. Otherwise, write to Google HQ and ask them to add this feature to browser.
Source code for solution at github.

середа, 7 березня 2012 р.

Network-Manager та автоматичне вимкнення бездротового адаптера

Уже декілька разів стикався з тим, що нові дистрибутиви включають типово режим „у літаку“. Спроби відключити його через графічну утиліту не завжди приводять до успіху, а тому доводиться лізти в термінал, що для недосвідченого користувача є суцільним жахіттям. Насправді все не так страшно, як виглядає, просто потрібно трішки більше знати про обладнання на якому працюємо.

Основними засобами для перевірки параметрів мережевого з’єднання є утиліти ifconfig, iwlist та rfkill (пакунки net-tools, wireless-tools та rfkill, які в принципі є встановлені). Перша - налаштовує мережеві адаптери, друга - дозволяє сканувати мережі, третя - показує поточний стан мережевого безпровідного адапетра. Але про все по-порядку.

Перш за все, слід дізнатися модель мережевого адаптера. Для цього існує утиліта сканування PCI-пристроїв lspci (для USB-пристроїв lsusb відповідно). Її запуск видає повний перелік пристроїв, які наявні у системі, який я скоротив до прийнятного розміру. Мережевий адаптер для безпровідних мереж, який нас цікавить виділено товстим шрифтом. Важливо не сплутати його із Ethernet controller, який теж є мережевим адаптером, але для дротових мереж.

$ lspci
01:00.0 VGA compatible controller: ATI Technologies Inc Madison [Radeon HD 5000M Series]
01:00.1 Audio device: ATI Technologies Inc Redwood HDMI Audio [Radeon HD 5600 Series]
02:00.0 Network controller: Ralink corp. RT3090 Wireless 802.11n 1T/1R PCIe
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 03)

Якщо пристрій відсутній у даному переліку, можливо його просто немає, а тому слід переконатися, що він підключений. Оскільки Network-Manager керує даним адаптером, то він найбільш ймовірним він є деактивованим, що можна перевірити командою ip link:
$ ip link
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 60:eb:69:6d:c5:58 brd ff:ff:ff:ff:ff:ff
3: wlan0: mtu 1500 qdisc mq state UP qlen 1000
    link/ether e0:2a:82:12:df:7d brd ff:ff:ff:ff:ff:ff
4: vboxnet0: mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff

Як згадувалось вище, за допомогою утиліти rfkill можна управляти блокуванням безпровідного адаптера. Одним з параметрів є list, задача якого, друк списку поточних адаптерів та статусів блокування :
$ rfkill list
0: hp-wifi: Wireless LAN
    Soft blocked: no
    Hard blocked: no
1: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no
32: hci0: Bluetooth
    Soft blocked: no
    Hard blocked: no


Інформація про безпровідний пристрій має наступні поля, які розділені двокрапкою: індекс пристрою, фізичну адресу, опис.
З цих полів індекс використовується при доступі до окремого елементу пристрою. М’яке та жорстке блокування є відповідно програмним та апаратним блокуванням.
У тому випадку, коли rfkill показує щось на кшалт Hard blocked: yes слід шукати відповідну кнопку на ноутбуці, яка вмикає адаптер. Після цього, запуск команди iwlist scan повинен вивести на екран (терміналу) перелік доступних Wi-Fi мереж. Якщо такий перелік є, а Network-Manager не показує перелік доступних мереж, ймовірною є проблема конфлікту кількох модулів бездротових адаптерів.

Перегляд списку адаптерів дозволяє виявити проблематичний модуль. Напр.:
0: tpacpi_bluetooth_sw: Bluetooth
    Soft blocked: no
    Hard blocked: no
1: hci0: Bluetooth
    Soft blocked: no
    Hard blocked: no
2: acer-wireless: Wireless LAN
    Soft blocked: yes
    Hard blocked: no

3: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no

Конфліктуючим пристроєм є acer-wireless, а відповідним модулем - acer_wmi. Для того, щоб його видалити з системи назавжди треба додати відповідний запис до теки /etc/modprobe.d/<назва_файлу>.conf, який буде містити один рядок:
blacklist acer_wmi

субота, 18 лютого 2012 р.

Відключаємо F10 у GNOME3

Нав’язлива прив’язка F10 до кнопки меню у Gnome3 таки поборола мою лінь. Відповідно до запису на форумі ArchLinux, щоб зняти прив’язку - треба відредагувати файл ~/.config/gtk-3.0/gtk.css . Таким чином послідовність дій є наступною:

mkdir -p  ~/.config/gtk-3.0/

cat >> gtk.css

@binding-set NoKeyboardNavigation {
 unbind "F10"
}

* {
 gtk-key-bindings: NoKeyboardNavigation
}

^D

понеділок, 8 серпня 2011 р.

Прискорюємо роботу Evolution

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

Якщо вірити цьому звіту, то я не один з такою проблемою. Одним з її вирішень пропонується наступний скрипт, який я трішки модифікував.

Проблема полягає в тому, що поштовий клієнт періодично переписує базу даних. Вище згаданий скрипт будує її з нуля (оптимізує???).

Для свого Дебіана, я поправив даний скрипт, щоб перебудовував усі таблиці даних. Оскільки з версії 2.28 (начебто), основну базу перенесено до ~/.local/share/evolution/mail , то єдиною зміною стало додання до скрипта рядку, який буде оптимізовувати не лише ~/.evolution/mail, але й ~/.local/share/evolution/mail.

Текст скрипта:

#!/bin/sh

cd ~/.evolution/mail/
for i in `find . -name folders.db`
do
echo "Rebuilding Table $i"
sqlite3 $i "vacuum;"
done

cd ~/.local/share/evolution/
for i in `find . -name folders.db`
do
echo "Rebuilding Table $i"
sqlite3 $i "vacuum;"
done

пʼятниця, 21 травня 2010 р.

CPUFreqUtils : Applying different governors for different cores

In order to avoid overheating I have to keep first of my cores in "Ondemand" governor and another one in "Powersave" governor. Initial cpufrequitls booting script puts both of the cores into the same governor mode. Therefore I just slightly modified that booting script for cpufrequtils, so it satisfied with new requirements.

New Version

So, what is going there:

-) GOVERNOR contains governor for the first core

-) ALTGOVERNOR contains governor for the rest cores

-) CPUs amount is detected and stores in CPUSAMOUNT variable

-) If ALTGOVERNOR variable is not set - Default Governor is applied for all the cores, othervise GOVERNOR is applied for the first core, and ALTGOVERNOR for the rest.

середа, 30 грудня 2009 р.

Зміна розкладки клавіатури

Задався сьогодні проблемою встановлення додаткових розкладок клавіатури, на додачу до існуючих. Хто не знає, в GNOME кількість розкладок обмежено чотирьма, що є найбільш прийнятним для більшості користувачів. Власне до цього ліміту я добрався і виникає питання, а що ж робити далі? А далі метод простий - використовувати setxkbmap. І нема на то ради... Ну, або використовувати KDE...

пʼятниця, 6 листопада 2009 р.

Зміна ядер

Сьогодні таки наважився перейти на ядро 2.6.30.
З величезним подивом виявив, що все працює правильно, а саме:
1) Індикатори температури
2) Відео (потрібно лише перезібрати модуль fglrx, який є в репозиторіях Sid (на час написання допису версія 9-10)).

Пульт віддаленого керуваняя не працює :)

субота, 16 травня 2009 р.

ATI-драйвери версія 9-5






Ніколи не вірив у існування машини часу, однак виявляється - вона таки є.
Яким чином працює? Ну наприклад, коли треба терміново нову версію драйверів для відеокарти, а на сайті викладена лише версія місячної давності (за що щира подяка команді ATI), слід просто ввести у вікні браузера потрібну версію.

Наразі на сайті доступна версія драйверів 9-4, однак можна спокійно завантажити (не чекаючи офіційного повідомлення) версію 9-5 (wget -c http://www2.ati.com/drivers/linux/ati-driver-installer-9-5-x86.x86_64.run)

Про результати тестування напишу окремо.


пʼятниця, 31 жовтня 2008 р.

Давач температури

Нарешті випала невелика нагода добратися до блогу та внести останні нотатки.
Останнім часом ноутбук почав вимикатися при температурі ~90 градусів по Цельсію.
Спершу грішив на кулер, думав може з ним щось, однак після розбирання виявилося, що вся проблема з термопастою, а точніше з її біс зна яким нанесенням (на процесорі її майже не було, взагалі дивно, як воно умудрилося не згоріти). Однак про це далі.
Наразі мова піде про те, як то спало мені на думку і вдалося прикрутити давач температури.

Насправді то зовсім нескладно. Для цього досить трішки полазити по тенетах і почитати чи хтось вже таке робив.

Проблема полягає в кривому БІОСі від HP (Hewlet Packard), а точніше в параметрах ACPI. Для того, щоб полагодити помилку слід списати оте саме ACPI, дизасемблювати, поправити помилку і після того змусити ядро читати поправлену версію.

Найскладніше в цій операції саме процес перезборки ядра, при комп'ютері, який вимикається ;)

Отже, виглядає то всьо таким чином:
  1. Записуємо до теки поточну конфігурацію ACPI (під адміністратором).
  2. sudo cat /proc/acpi/dsdt > /tmp/DSDT
  3. Дизасемблюємо отримане чудо:
  4. cd /tmp;iasl -d /tmp/DSDT
  5. Редагуємо файл отриманий файл
  6. vim DSDT.dsl
  7. З методу Method (_HOT, 0, Serialized) забираємо умовності. Їх треба видалити. Яким чином закоментувати - не маю уявлення; Сішний коментар "//" не спрацював (видно руки криві) :(.
  8. Аналогічну річ слід зробити для методу Method (_CRT, 0, Serialized).
  9. В мене після редагування вони набули наступного вигляду:
  10. Method (_HOT, 0, Serialized)
    {
    Return (Add (0x0AAC, Multiply (TPC, 0x0A)))
    }

    Method (_CRT, 0, Serialized)
    {
    Return (Add (0x0AAC, Multiply (TPC, 0x0A)))
    }
  11. Після цього треба скомпілювати отриманий код:
  12. iasl -tc DSDT.dsl
  13. Отриманий файл DSDT.hex слід скопіювати до підтеки include теки джерельного коду Вашого ядра. В моєму випадку то виглядає таким чином:
  14. sudo cp DSDT.hex /usr/src/dv5temp/linux-2.6.27.3/include
  15. Тепер треба перезібрати ядро, додавши наступні параметри (я зазвичай користуюся make menuconfig, тому вказую для даного методу налаштування).
    1. Device Drivers -> Generic Driver Options -> Select only drivers that don't need compile-time external hardware (тут зняти опцію)
    2. Power Management Options -> ACPI (Advanced Configuration and Power Interface) Support -> Custom DSDT Table file to include (вписати без лапок "DSDT.hex")


  16. Далі компілюємо ядро і встановлюємо:

    • make
    • make install

  17. Перезавантажуємося з новим ядром і вмикаємо давачі температури.
Начебто все.
Для особливо лінивих та початківців - можу порекомендувати ядро 2.6.27.3 зібране мною.
Серед особливостей ядра - підтримка майже всього обладнання ноутбука (окрім пульту дистанційного керування).
Зібрано все в deb пакетах для улюбленої системи.

Ядро
Заголовки
Документація
Джерельний код
Довідник

Всі матеріали почерпнуто з проекту Lesswatts та Google.

понеділок, 13 жовтня 2008 р.

./configure /bin/sh: Bad interpreter Permission Denied

Пишу чергову лабораторку для студентів, де їм потрібно встановлювати програмне забезпечення під Linux. Виникла проблема з тим, що на приєднаному розділі неможливо ані налаштувати програму, ані (використовуючи /bin/bash configure) запустити програмку.
Скрипт configure видає повідомлення - винесене в заголовок даного допису.

Проблема вирішується наступним чином:
1) відкриваємо /etc/fstab в улюбленому редакторі.
2) шукаємо необхідний розділ та додаємо параметр exec
3) повторно приєднуємо розділ і все працює :)

вівторок, 19 серпня 2008 р.

Активація тачпаду

Сьогодні явно напружений день.
Надибав відсутність нормальної роботи тачпаду (коли спробував прокрутити сторінку, на полосі, а вона не прокрутилася :) )

Для активації треба внести наступні зміни у файл /etc/X11/xorg.conf:
~$ sudo vim /etc/X11/xorg.conf

Додати наступний пристрій вводу:
Section "InputDevice"
Identifier "Synaptics Touchpad"
Driver "synaptics"
Option "SendCoreEvents" "true"
Option "Device" "/dev/psaux"
Option "Protocol" "auto-dev"
Option "HorizEdgeScroll" "0"
EndSection

Та встановити Налаштування Сервера:
Section "ServerLayout"
Identifier "Default Layout"
Screen "Default Screen"
InputDevice "Synaptics Touchpad"
EndSection

неділя, 17 серпня 2008 р.

Що працює

Власне, я так і не описав попутньо, що на ноутбуці працює, а що ні. Однією з причин - бажання скласти якнайбільш об'єктивну картину і провести тестування апаратного та програмного забезпечення на предмет помилок тощо.
Отже, після встановлення системи з диску (останній зріз місяця липня) в системі працює:
1) Екран та клавіатура :)
2) USB-порти.
3) Кард-рідер
4) Звук у навушниках
5) Web-камера

Не працює:
1) Зміна джерела відтворення звуку при увімкненні/вимкненні навушників (треба ставити нове ядро або поновлювати alsa бібліотеки)
2) Тачпад (треба вписати в налаштування Х-сервера)
3) Мережева карта (працює, якщо в процесі встановлення ви перейшли на ядро 2.6.25)
4) Карта бездротового зв'язку
5) Пульт дистанційного керування (не перевірено)
6)Кнопка QuickPlay (на ній мікрософтівська програма перегляду відео, треба буде почепити Totem :) )
7) Можливо ще щось :)

четвер, 14 серпня 2008 р.

Ядро 2.6.27-rc3

Нарешті.... я таки повірив в себе. Після двох тижнів розборок з ядрами, я таки запустив пілотну версію ядра 2.6.27-rc3 на ноутбуці. Серце підказувало, що то не мої криві руки, а таки розробники десь помилилися.
Тепер коротко: проблема полягала у неправильному виклику функції native_smp_prepare() , яку поправили аж у поточній версії (я не переконаний, але дана помилка була присутня у ядрах версії 2.6.26-2). Тому, якщо Ваше ядро не запускається -- спробуйте нову версію ядра з стандартним параметром.

Відкритим залишається питання щодо безпроводового зв'язку (наразі ведеться робота, можливо буду шукати драйвери для XP) та врізання розмірів ядра до прийнятних з подальшим викладенням на сторінці.

Чекайте.