Analitycs

суббота, 8 октября 2011 г.

Ошибка - Невозможно подключиться к базе данных QMYSQL (Mac, Python, Qt)

Симптомы

При запуске Qt приложения с MySQL ошибка "Невозможно подключиться к базе данных QMYSQL".

Причина

Отсутствие драйвера MySQL "из коробки" в каких-то вариантах Qt. Почему-то по умолчанию включают только SQLite.

Как лечить?

Скомпилировать драйвер самостоятельно, для чего умные люди написали вот такой скриптик.

Разумеется, не забываем поправить необходимую версию Qt и проверить, чтобы в путях не было пробелов. (У меня в username есть пробел, из-за чего время от времени ловлю различные проблемы с компиляторами)

PyQT на MacOS - Error: Unable to create the C++ code.

При сборке PyQt на MacOS вот по этому мануалу на команде

python configure.py

упорно вылезает ошибка

Error: Unable to create the C++ code.

Решение оказалось простым, как грабли - в пути до исходников не должно быть пробелов.

Теперь сижу, курю - жду пока соберется. ;-)

пятница, 7 октября 2011 г.

3 дня отсутствия = iPhone(+), Steve Jobs(-)

Стоит только уехать на три дня как начинаются авралы
  • iPhone выпускают такой неполноценный, который, "панимаешь" (с) умеет звонить и работать, а не умеет думать за пользователя и причёсывать его собачку, заодно массажируя дистанционно соседа. Ну, короче - какашка, а не телефон.
  • Потом Стив Джобс помирает...
Они что там, совсем нюх потеряли и расслабились? Опять звонить, ругаться?

Ну а если серьезно - просто оставлю это тут.

понедельник, 3 октября 2011 г.

Как бекапить проекты с помощью rsync, sshpass, scp?

Как известно, "админы делятся на две категории - те кто не делает backup, и те, кто его УЖЕ делает". (с)

Ежедневный бэкап

Как кому удобно - я делаю mysqldump базы на продакшене и потом rsync синхронизирую httpdocs и дамп на удаленную машину. Для авторизации - используются ключи.

#!/bin/bash                                                                                                      
DESTINATION=/var/www/vhosts/xxx/httpdocs                                                              
KEY="ssh -i /home/user/.ssh/scm_dsa -l xxx"                                                          
ORIG_HOST=user@xxxx                                                                                              
rsync -a -e "$KEY" --delete --exclude="${DESTINATION}/cache/*" $ORIG_HOST:${DESTINATION}/* ${DESTINATION}/

Недельный бэкап

Уже на удаленной машине архивирую засинхронизированную папку несколько раз и через несколько дней заливаю архив на backup-space. К сожалению, доступ в backup-машинам - только по ftp, поэтому приходится немного извращаться, используя для авторизации sshpass.

#!/bin/bash

VHOSTS_DIR=/var/www/vhosts
TMP_DIR=/mnt/backup
BACKUP_DIR=FTP_USER@XXXXX.XXX.XX:/

/usr/local/bin/sshpass -pFTP_PASSWORD scp ${TMP_DIR}/* ${BACKUP_DIR}scp -Cp ${TMP_DIR}/* ${BACKUP_DIR}

/etc/crontab

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

0 3 * * * root /home/user/bin/backup.sh >> /home/user/logs/backup.log
7 1 * * 0 root /home/user/bin/backup_weekly.sh >> /home/user/logs/backup_weekly.log

Как просмотреть битовые поля(bit fields) в MySQL?

Когда вы используете в таблицах MySQL битовые поля,  то стандартный консольный клиент их не показывает в результатах запросов.

mysql> select deleted from shopping_cart where id > 1000 and deleted = 0 limit 3;
+---------+
| deleted |
+---------+
|         | 
|         | 
|         | 
+---------+
3 rows in set (0.00 sec)

mysql> select deleted from shopping_cart where id > 1000 and deleted = 1 limit 3;
+---------+
| deleted |
+---------+
|        | 
|        | 
|        | 
+---------+
3 rows in set (0.00 sec)

Внимательный человек заметит, что у результатов команды отличается отступ.

Для того чтоб значение поля было показано явно, нужно в запросе либо добавить +0 к имени поля, либо вызвать функцию bin, как показано ниже.

mysql> select deleted+0 from shopping_cart where id > 1000 and deleted = 0 limit 3;
+-----------+
| deleted+0 |
+-----------+
|         0 | 
|         0 | 
|         0 | 
+-----------+
3 rows in set (0.36 sec)

mysql> select deleted+0 from shopping_cart where id > 1000 and deleted = 1 limit 3;
+-----------+
| deleted+0 |
+-----------+
|         1 | 
|         1 | 
|         1 | 
+-----------+
3 rows in set (0.01 sec)

mysql> select bin(deleted) from shopping_cart where id > 1000 and deleted = 1 limit 3;
+--------------+
| bin(deleted) |
+--------------+
|            1 | 
|            1 | 
|            1 | 
+--------------+
3 rows in set (0.01 sec)

mysql> select id,bin(deleted) from shopping_cart where id > 2000 and deleted = 0 limit 3;
+------+--------------+
| id   | bin(deleted) |
+------+--------------+
| 2001 | 0            | 
| 2002 | 0            | 
| 2003 | 0            | 
+------+--------------+
3 rows in set (0.00 sec)

Ну очень вольный перевод вот этого мана

суббота, 1 октября 2011 г.

Несколько аккаунтов Google - Не можете войти в Docs, Reager, Calendar?

У меня сейчас было такое.

Предыстория  - имеется несколько связанных аккаутнов Google - личный и рабочий на Google Apps.

После удаления аккаунта из Google Apps - не мог войти в личные Google Reader, Docs, Plus, причем Gmail работал отлично.

Лечится полной чисткой cookies и кеша браузера. 

пятница, 23 сентября 2011 г.

Python mktime/strptime - TypeError: expected string or buffer

Иногда апдейты повергают меня в транс - недавно ловил баг с PHP+cURL, теперь отличился Python ;-/

Traceback (most recent call last):
  File "test.py", line 22, in 
    s = strptime(row['change_time'], TIME_FORMAT)  File "/usr/lib/python2.6/_strptime.py", line 454, in _strptime_time
    return _strptime(data_string, format)[0]
  File "/usr/lib/python2.6/_strptime.py", line 322, in _strptime
    found = format_regex.match(data_string)
TypeError: expected string or buffer

Описание

Лезем в код - получаем какой-то набор данных из MySQL через питоновский fetchall, затем преобразуем поле со временем и начинаем с ним танцевать.

Перестала работать конструкция
 
    s = strptime(row['change_time'], TIME_FORMAT)
    last_change_time = mktime(s)

После курения манов по времени в Python выясняется, что нужно в mktime отдавать 9 численный tuple


    s = row['change_time'].timetuple()
    last_change_time = mktime(s)

Вот и верь после этого людям... обновляй после этого пакеты...