четверг, 4 декабря 2008 г.

Python 3.0 (a.k.a. "Python 3000" or "Py3k")

Релиз Python 3.0 доступен для скачивания с оф. сайта.

Не совместим с веткой 2.x

Python 3.0 (a.k.a. "Python 3000" or "Py3k") is a new
version of the language that is incompatible with the 2.x line of
releases. The language is mostly the same, but many details,
especially how built-in objects like dictionaries and strings work,
have changed considerably, and a lot of deprecated features have
finally been removed. Also, the standard library has been reorganized
in a few prominent places.
Из новых возможностей Python 3.0 можно отметить:
  • Нарушение обратной совместимости со скриптами, разработанными для более ранних версий Python;
  • Удаление дублирующих конструкторов и модулей;
  • Вместо оператора форматирования строк "%" использована глобальная функция и метод format(), например "The story of {0}, {1}, and {c}".format(a, b, c=d) или print(format(10.0, "7.3g")).
  • Удалены методы dict.iterkeys(), dict.itervalues() и dict.iteritems(). Методы dict.keys(), dict.values() и dict.items() будут возвращать контейнер объектов (итератор);
  • Возможность аннотирования параметров функций и возвращаемых значений, например def compile(source: "something compilable").
  • Замена оператора print, который широко используется для вывода, на функцию print();
  • Использование Unicode в качестве основной кодировки представления строк (единый тип str, вместо раздельных str и unicode);
  • Для хранения бинарных данных представлен тип bytes;
  • Тип long переименован в int, деление int переменных возвращает float, для получения целого результата нужно использовать //;
  • Для обозначения неравенств, вместо "<>" нужно будет использовать "!=";
  • Признаны устаревшими модули: cPickle, imageop, audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing, xmllib, new;
  • Удалены функции os.tmpnam(), os.tempnam() и os.tmpfile(), вместо них нужно использовать модуль tempfile;
  • Все исключения теперь должны порождаться от класса BaseException;
  • Новый синтаксис для создания мета-классов (Metaclass), реализация абстрактных базовых классов (Abstract Base Class), возможность использования декораторов для классов;
  • Новая реализация библиотеки ввода/вывода, имеющая обратно совместимый API ;
Источник...

понедельник, 1 декабря 2008 г.

Посылка с (K)ubuntu 8.10

Canonical прислал пакет с дисками:
- Kubuntu 8.10
- Ubuntu 8.10 Desktop Edition
- Ubuntui 8.10 Server Edition
- Наклейки (4 шт).

пятница, 24 октября 2008 г.

EeePc 701. AverMedia MR 800 FM radio.

Купил для моего EeePC 701 usb FM радио - AverMedia MR 800.



Работает отлично.
Заодно выяснил, что микрофонный вход EeePc, при подключении к нему выхода с FM донгла, переходит в режим линейного стерео входа. Так что в колонках играет нормальное стерео радио :)

Настройка.
При подключении к usb-порту создается новое устройство:
/dev/usb/hiddev0 с правами чтения/запись только для рута. Можно задать устройству режим 666, чтобы любой пользователь имел к нему доступ:

sudo chmod 666 /dev/usb/hiddev0

Для управления донглом в Сети существует ровно одна программа -
amusbradio-0.01.tar.bz2, которую можно скачать с http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/a/av/av-usbradio/.
Скаченный архив распаковываем во временный каталог, переходим в него и делаем make.
Если нужные для сборки пакеты установлены (как минимум build-essential), то получим исполняемый файл amusbradio. Копируем его в любой bin каталог в пути.

Запускаем коммандой:

sudo amusbradio -L europe -S 88.30

Где:
-L europe - нужный диаппазон. По исходникам видно, что есть еще japan.
-S 88.30 - частота радиостанции. Этот параметр производит тонкую подстройку на станцию.
Частоту станции можно задавать и без -S (amusbradio -L europe 88.30).

Другие параметры:
-mM - убрать/включить звук;
-tT - моно/стерео;
-L - диаппазон (europe, japan);
-l - чувствительность сканирования;
-S - тонкая подстройка на станцию;
-s - сканирование диаппазона, т.е. поиск станций.

После ввода комманды программа выведет:
found 'AVerMedia Technologies AVerMedia USB Radio' at '/dev/usb/hiddev0'
и через некоторое время должен появиться звук :)

среда, 22 октября 2008 г.

Предзаказ Ubuntu 8.10

На shipit.kubuntu.org начался прием заказов на Kubuntu 8.10, на shipit.ubuntu.com соответственно на Ubuntu 8.10 дектоп и сервер. Я заказал.
Kubuntu 8.04 и Ubuntu Server 8.04 мне честно прислали, надеюсь и в этот раз задержек не будет.
Правда, скорее всего, на серверах Ubuntu Server 8.04 TLS менять не буду.

среда, 24 сентября 2008 г.

Python + ODBC

Вот даже и не ожидал, что в стандартной поставке Python в (K)ubuntu 8.04 нет модуля для работы с ODBC. Немного погуглив обнаружил, что библиотек поддержки ODBC, по большому счету, всего две: mxODBC (платная) и pyodbc.
Выбрал pyodbc. Исходники можно скачать с сайта http://sourceforge.net/project/showfiles.php?group_id=162557, последняя версия pyodbc-2.0.58. Документация находится на сайте проекта http://pyodbc.sourceforge.net/docs.html. Библиотека поддерживает python DB API.
Скачанный архив распаковываем во временный каталог, переходим в него и собираем командой:

python setup.py build

И в подкаталоге build/lib.linux-i686-2.5 находим файл библиотеки - pyodbc.so.
Этот файл кладем в каталог проекта и можем работать с ODBC.

Пример:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pyodbc
con=pyodbc.connect("DSN=ContactOnLine;UID=user;PWD=passwd")
rows=cur.execute("select * from DOCS")
for row in rows:
print row.PP_CODE, row.PAYER.decode('cp1251'), row.GROUND.decode('cp1251')
con.close()

воскресенье, 20 июля 2008 г.

Как вытащить данные с мертвого винта?

Вчера вернулся из отпуска и, естественно, сразу включил комп. После загрузки (K)ubuntu сказал, что есть обновления и много. Начал скачивать и... да, закачка затормозила. Подумал что с сетью что-то не так, но все оказалось гораздо хуже - накрылся винт. После перезагрузки перестал определяться биосом и стучит... Винт Samsung 120Gb честно отработал почти 5 лет.
Ну и как обычно бывает в таких случаях, на винте есть бесценная информация в виде семейного фотоальбома за последние пару лет, где-то на 5-7 гигов.
Как и где можно вытащить с мертвого винта нужные данные? Может кто уже имеет опыт и даст дельный совет?

суббота, 12 июля 2008 г.

(K)ubuntu. Конвертируем видео для PSP

Исходные данные:
  1. Гаджет PSP Slim, который помимо игр и музыки, умеет показывать фильмы в формате mp4;
  2. Дочь, которая желает эти фильмы смотреть на этом PSP;
  3. EeePC 701 4G, который будет заниматься конвертированием;
  4. Дача, где происходят все действия;
  5. Погода - отличная (особенно после недели дождей).
После непродолжительного гугленья через Яндекс, ничего толком не нашел. В основном пару прог под винды и какая-то графическая конвертилка под Линукс. А мне хотелось чего-то для командной строки.
Вобщем решил сам разобраться с данной задачей.
Для начала выяснил параметры формата mp4, который поддерживает PSP Slim, в стандартной комплектации, т.е. без установки внешних видео проигрывателей.
Получилась такая команда:

ffmpeg -i $1 -f psp -s 368x208 -aspect 16:9 -vcodec mpeg4 -b 500k -acodec aac -ab 96k -ac 2 M4V00001.MP4

Для перекодировки любого видео использую ffmpeg с соответствующими кодеками.
Описание параметров:
  • $1 - переменная, которая принимает имя входного файла с видео;
  • -f psp - контейнер для видео и звука;
  • -s 368x208 - размер картинки для экрана PSP;
  • -aspect - для широкого экрана PSP 16:9, но , если получаются вытянутые лица, можно поставить 3:4;
  • -vcodec mpeg4 - видео кодек (AVC/H.264);
  • -b 500k - битрейт результирующего видео потока. Качество почти отличное. Стандартный DVD-рип на 1.4 гига конвертируется в 500 мег. PSP поддерживает битрейт до 768K;
  • -acodec aac - аудио кодес с битрейтом -ab 96k и стерео звуком, т.е. 2 канала -ac 2;
  • M4V00001.MP4 - имя файла сконвертированного видео для PSP. Этот файл нужно положить в каталог /video на PSP. Если файлов несколько, то они должны отличаться последней цифрой.
Стандартный avi-ник на 1.4 гига на EeePC конвертировался чуть более часа.

P.S. Эта заметка написана на EeePC 701 4G (1G RAM) Kubuntu 8.04. с выходом в сеть GPRS + Bluetooth с мобильника.

вторник, 20 мая 2008 г.

EeePc 701 4G в качестве AP

Этот "малыш" может успешно работать в качестве точки доступа (AP).
У меня на нем установлена Kubuntu 8.04.
По умолчанию wifi-карта настроена только на режим managed и на команду смены режима дает ошибку. Поэтому карту нужно инициализировать заново. Порядок действий такой:

  • Убиваем текущую настройку:
    sudo wlanconfig ath0 destroy
  • Создаем устройство заново с новыми параметрами:
    sudo wlanconfig ath0 create wlandev wifi0 wlanmode ap
    sudo ifconfig ath0 192.168.0.1 netmask 255.255.255.0
    sudo iwconfig ath0 essid my-ap
Все, точка доступа с именем "my-ap" работает на устройстве ath0 с IP 192.168.0.1.
В данном примере защита канала не использована, т.е. к ней могут подключиться любой в радиусе действия.

пятница, 4 апреля 2008 г.

Дополнительная защита веб-сервера

По наводке от моего товарища Lice пришлось ковырять как закрыть от PHP-скриптов доступ в другие каталоги. дело в том, что если не установлен PHP как CGI модуль, то варианта два. Либо SafeMode + doc_root, что совсем не приятно и мне не нравится. Причины расписывать тут не буду, т.к. не хочется устраивать холивар. В общем, я пошел по другому пути. В каждый виртуальный хост Апача я добавил такую конструкцию:

php_admin_value open_basedir /var/www/user/

Таки образом я избавился от неприятной вещи по типу fileread(’/etc/passwd’);.

Дальше больше. Lice по FTP залил какой-то ПХП-шный shell и стали тестировать. Как я и ожидал, каталоги то он увидел, а вот скачать что-либо, кроме как из своего каталога - никак.

Вот теперь надо отрубить system и exec с кучей всего еще. В php.ini мы правим:

disable_functions = “apache_get_modules,apache_get_version,apache_getenv,apache_note, apache_setenv,disk_free_space,diskfreespace,dl,highlight_file,ini_alter,ini_restore,openlog, passthru,phpinfo,proc_nice,shell_exec,show_source,symlink,system,exec”

Отдельное огромное спасибо Lice за помощь.

взял отсюда...

понедельник, 17 марта 2008 г.

Настройка Genius G-Pen 560 в (K)ubuntu 7.10

Как и обещал, опишу настройку графического планшета Genius G-Pen 560 в (K)ubuntu 7.10.
При подключении к компьютеру G-Pen 560 определяется как обычная мышь, т.е работает в режиме relative и силу нажатия на перо не отрабатывает. Нам нужно сделать все наоборот - вогнать планшет в абсолютный режим и отрабатывать силу нажатия.

Данный планшет поддерживается драйвером WizardPen, его можно собрать из исходников, а можно (нужно) взять готовый:

wget http://www.dallerweb.dk/ubuntu/wp/i386/wizardpen_drv.so

и поместить его в нужную директорию:

sudo cp wizardpen_drv.so /usr/lib/xorg/modules/input/

Теперь узнаем под каким именем планшет известен системе:

cat /sys/bus/usb/devices/*/product

В выводе этой команды ищем название планшета. У меня он определился как G-Pen.
Далее подсистеме udev объясняем что у нас есть еще одно usb устройство и его нужно определять как /dev/tablet-event. Для этого создаем в /etc/udev/rules.d новый файл 010-local.rules, или, если он уже существует, добавляет в него строку для нашего планшета:

BUS=="usb", KERNEL=="event*", SYSFS{product}=="G-Pen", NAME="input/%k", SYMLINK+="tablet-event", MODE="0666"

Перезапускаем udev:

sudo /etc/int.d/udev restart

В директории /dev/ появится ссылка tablet-event.

Настало время править конфиг xorg.conf.
Добавляем секцию, определяющую графический планшет и его параметры:

Section "InputDevice"
Identifier "WizardPen Tablet"
Option "SendCoreEvents" "relative"
Driver "wizardpen"
Option "Mode" "Absolute"
Option "Device" "/dev/tablet-event"
Option "TopX" "66"
Option "TopY" "196"
Option "TopZ" "128"
Option "BottomX" "12000"
Option "BottomY" "9000"
#Option "BottomZ" "300"
Option "MaxX" "12000"
Option "MaxY" "9000"
Option "MaxZ" "1023"
EndSection

И добавляем ссылку на планшет в секцию ServerLayout:

Section "ServerLayout"
Identifier "Default Layout"
InputDevice "Generic Keyboard"
InputDevice "Configured Mouse"
InputDevice "WizardPen Tablet" "AlwaysCore"
...
В Х-сах мышь висит на эвенте /dev/input/mice, который принимает запросы от всех указательных устройств. Чтобы мышь нормально работала при подключенном планшете, ее нужно повесить на собственный эвент. У меня это /dev/input/mouse1

Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "CorePointer"
# Option "Device" "/dev/input/mice"
Option "Device" "/dev/input/mouse1"
Option "Protocol" "ImPS/2"
Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "true"
EndSection
Перегружаем X-сы. Предупреждаю, что планшет должен быть подключен, иначе Х-сы не стартуют. Где-то видел для этого хак - нужно внести еще такую секцию в xorg.conf:

Section "ServerFlags"
Option "AllowMouseOpenFail" "on"
EndSection
После всех этих плясок с бубном система узнает наш планшет... но сила нажатия так и не работает... Тут есть два пути. Первый - загрузиться в виндах (с установленными драйверами), чтобы планшет инициализировался. После этого, не отключая планшет, перегрузиться в Линукс. G-Pen заработает как и ему положено, с отработкой силы нажатия.
Второй путь - скачать и собрать утилитку init-gpen, которая зашлет нужные байты в планшет. Порядок действий такой:

1. sudo rmmod usbhid
2. ./init-gpen
3. sudo modprobe usbhid
4. Restart Xorg

Правда на 4-м пункте у меня иногда Х-сы не перегружаются. Я просто ребутаю всю систему. Главное не отключать планшет, иначе придется выполнять 1-4 пункты заново.

Для настройки кнопок пера нужно выполнить команду:

xinput set-button-map "WizardPen Tablet" 1 3 2

или, при возникновении проблем

xinput set-button-map "WizardPen Tablet" 1 0 0

Все. Планшет полностью готов к работе.

Сила нажатия пера работает в Gimp и inkscape. В Gimp заходим в Файл->Настройка->Устройства ввода->Конфигурирование устройств ввода, добавляем WizardPen Tablet, Режим - Экран.
Радуемся жизни, она прекрасна.

четверг, 13 марта 2008 г.

Перешел на rTorrent

В очередной раз Ktorrent похерил все закачки. Не знаю чего у него глючит, но периодичность порчи всего подозрительная.
Снес его нафиг и поставил из репозиториев консольный rTorrent. Настройка заняла 5 минут.
Все работает, и даже быстрее качает и меньше ресурсов ест.
Доволен :)

вторник, 11 марта 2008 г.

Genius G-Pen 560

Подарил дочке на 8 Марта графический планшет Genius G-Pen 560 (1375 руб).
Подключается по usb, рабочая зона 5x6. Перо - беспроводное, с батарейкой AAA, имеет 1024 степени нажатия.








После подключения к компьтеру, Kubuntu 7.10 планшет определила и загрузила драйвер. Но в данном случае планшет работает как вторая мышь, т.е. курсор перемещается, кнопки отрабатывают, а вот сила нажатия на перо не работает.
Конечно от графического планшета хочется нормальной работы в граф. редакторах типа Gimp и InkScape, а не как обычной мыши. Пришлось по-гуглить и немного потанцевать в качестве шамана с бубном... и я его настроил, о чем и напишу позже :)

понедельник, 10 марта 2008 г.

Ошибки при записи DVD и как с ними бороться

Полезная информация. У меня такое иногда случается.
Взял отсюда...

Случается, что при записи DVD-дисков возникают ошибки. Обычно при этом болванка выбрасывается, однако есть способы некоторые ошибки исправить и записать-таки диск. Почти всегда такой диск нормально читается и проходит проверку на MD5-суммы. Ниже приведены несколько типичных ошибок и способы их устранения.

Сбой в процессе записи в начале или середине диска.
Редко, но бывает так: в начале или середине диски запись обрывается и growisofs выдаёт сообщение:

Executing 'builtin_dd if=1.iso of=/dev/cdrom obs=32k seek=0'
/dev/cdrom: "Current Write Speed" is 16.4x1352KBps.
0/4393730048 ( 0.0%) @0x, remaining ??:?? RBU 100.0% UBU 0.0%
0/4393730048 ( 0.0%) @0x, remaining ??:?? RBU 100.0% UBU 0.0%
0/4393730048 ( 0.0%) @0x, remaining ??:?? RBU 100.0% UBU 0.0%
0/4393730048 ( 0.0%) @0x, remaining ??:?? RBU 100.0% UBU 0.0%
0/4393730048 ( 0.0%) @0x, remaining ??:?? RBU 100.0% UBU 0.0%
1671168/4393730048 ( 0.0%) @0.4x, remaining 1007:27 RBU 100.0% UBU 1.9%
:-[ WRITE@LBA=330h failed with SK=3h/ASC=0Ch/ACQ=00h]: Input/output error
:-( write failed: Input/output error
/dev/cdrom: flushing cache
/dev/cdrom: closing track
:-[ CLOSE TRACK failed with SK=3h/ASC=0Ch/ACQ=00h]: Input/output error
/dev/cdrom: closing session
/dev/cdrom: reloading tray

Болванку выбрасывать не надо, а только запустить процесс ещё раз - диск будет продолжен с того места, где запись прервалась. После этого диск нормально читается и проходит проверку на MD5-суммы.

Ошибка закрытия сессии
Диск полностью записался, и начинается закрытие сессии - иногда здесь происходит ошибка:

2144544*2KB out @ average 9.9x1352KBps
/dev/cdrom: flushing cache
/dev/cdrom: closing track
/dev/cdrom: closing session
:-[ CLOSE SESSION failed with SK=5h/ASC=72h/ACQ=03h]: Input/output error


Обидно, диск-то записался, но читаться он не будет, так как не закрыта сессия.
Для этого есть фирменная "затычка" от авторов dvd+rw-tools: небольшая программа close, и нужен её исходник. Его нужно скачать отсюда, установить/скачать исходные коды dvd+rw-tools и скопировать close.cpp в каталог с исходниками dvd+rw-tools. После этого в каталоге с исходниками компилируем close.cpp командой:

g++ -o close close.cpp

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

close /dev/hda

Если /dev/hda ваш пишущий DVD-привод, конечно. После этого диск будет закрыт, его можно прочесть и он проходит проверку MD5-сумм.


Ошибка при проверке и чтении только что записанного диска.
Диск полностью записался, сессия закрылась, и бывает так, что сразу же считать его не удаётся:

dd if=/dev/cdrom bs=2048 count=2261481 | md5sum

c99a74c555371a433d121f551d6c6398 -
1+0 записей считано
1+0 записей написано
скопировано 2048 байт (2,0 kB), 1,51564 секунд, 1,4 kB/s

Для того, чтобы это обойти, нужно всего лишь вынуть и вставить диск. :-)

пятница, 22 февраля 2008 г.

Logitech QuickCam Communicate STX

После недельного гугления и просмотра конференций, наконец купил веб камеру Logitech QuickCam Communicate STX.
Реальное (матрица) разрешение 640х480, видео до 30 к/с.
Kubuntu 7.10 распознал камеру сразу и подгрузил модуль gspca.
Камера замечательно работает в Skype и kopete.
Запись в avi через mencoder - отлично.
Вобщем доволен :)





четверг, 21 февраля 2008 г.

Маршруты Москвы

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

Вышла новая версия VirtualBox

VirtualBox 1.5.6 (released 2008-02-19)

  • GUI: fixed several error messages
  • GUI: fixed registration dialog crashes once and for all
  • GUI: really ask before resetting the VM
  • GUI: release mouse and keyboard before the host activates the screensaver
  • GUI: fixed issue with license display on big screens
  • GUI: added setting for network name for internal networks
  • GUI: added setting for network device type
  • GUI: keyboard fixes
  • GUI: seamless mode and fullscreen mode fixes
  • GUI: fixed soaked hostkey keyup event under certain conditions
  • GUI: more informative message dialog buttons
  • GUI: VM selector context menu
  • VBoxSDL: added -termacpi switch
  • VBoxSDL: fixed automatic adaption of the guest screen resolution to the size of the VM window
  • VMM: under heavy guest activity, for example when copying files to/from a shared folder, the VM could crash with an assertion
  • VMM: added an option to select PIIX4 (improves compatibility with Windows guests created by VMware)
  • VMM: fixed a bug which could lead to memory corruption under rare circumstances
  • VMM: improved performance of Solaris guests
  • VRDP: fixed a 1.5.4 regression: VRDP client and server were out-of-sync if the VM was started using the GUI
  • VRDP: proper error handling if the VRDP library could not be loaded
  • VBoxManage: fixed crash during clonevdi
  • VBoxManage: added ’list runningvms’ command
  • VBoxManage: improved the compatibility when reading the partition table of a raw disk
  • Shared Folders: added support for read-only shared folders
  • Shared Clipboard: several fixes
  • Network: experimental support for E1000 device emulation
  • iSCSI: better check for misconfigured targets
  • iSCSI: allow to directly attach to internal networks with integrated mini IP stack
  • PulseAudio: don’t hang during VM initialization if no sound server is available
  • VDI: fixed sized virtual disk images are now completely written during creation to workaround buggy sparse file handling on some OS (e.g. Vista)
  • VDI/VMDK: prevent indexing of .vdi and .vmdk files on Windows hosts
  • RDP: fixed compilation of the Linux rdesktop client on newer Linux kernels
  • RDP: install rdesktop-vrdp on Linux hosts
  • ACPI: added sleep button event
  • Serial: proper handling of inaccessible host devices
  • Windows installer: allow smooth upgrade without deinstallation
  • Linux installer: fixed Slackware detection regression
  • Linux installer: updated VBoxTunctl allowing to assign a tap device to a group on Linux kernels > 2.6.23
  • Windows additions: several fixes, in particular for Windows NT4
  • Linux additions: fixed installer for Kubuntu 8.04
  • Linux additions: add default video mode for handling video mode hints from the host
  • Linux host: compatibility fixes with Linux > 2.6.24
Скачать...

среда, 20 февраля 2008 г.

Контрасты в веб-типографике

Интересная статья на хабре, раскрывающая правильное использование различных методов выделения блоков текста, предложений и слов.
Итак, как вы наверное знаете, большинство пользователей интернета не читают строчку за строчкой, а «сканируют» текст, перемещаясь от одной точки к другой. По этой причине, дизайнеры создают типографические контрасты, чтобы подчеркнуть определенный текст. Контраст важен по тому, что не всё содержание страницы имеет одинаковое значение, одно более важно, чем другое. Создавая контрасты, вы можете направить внимание читателя на важные сообщения и в тоже время повысить привлекательность внешнего вида страницы. Вот семь основных методов как добиться типографического контраста.
Читать дальше...

пятница, 15 февраля 2008 г.

Оптимизация работы с MySQL

Еще статейка с хабра об разной оптимизации работы с MySQL. Будет полезна начинающим DBA.
Ни для кого не секрет, что работа с базой данных занимает большую часть работы практически любого сайта. И именно работа с БД чаще всего является узким местом веб-приложений.
В этой статье хотелось бы дать практические советы использования MySQL.
Сразу оговорюсь:
  • данная статья написана про MySQL, хотя общие вещи скорее всего справедливы для любой СУБД.
  • все написанное в статье является моей личной точкой зрения, и не является истиной в последней инстанции.
  • советы не претендуют на новизну и являются результатом обобщения прочтенной литературы и личного опыта.
  • в рамках данной статьи я не буду касаться вопросов конфигурирования MySQL.
Читать дальше...

четверг, 14 февраля 2008 г.

Программирование на Python+Qt для начинающих

Нашел на хабре статью, дающую начальные знания программирования GUI приложений на Python в связке с Qt.
Это руководство нацелено на получение представления о том как писать маленькие приложения на python, использующие библотеку Qt.

Для успешного выполнения всех заданий необходимо иметь базовые знания python, однако, Qt знать не обязательно. Я использую linux в этих примерах и я предполагаю, что вы уже имеете работающий Python и PyQt.
Читать дальше...

суббота, 9 февраля 2008 г.

PHP XML-RPC server, Python XML-RPC client

Стоит задача, поднять web-сервис на защищенном (HTTPS) канале.

Технологий web-сервисов в принципе две: SOAP и XML-RPC. SOAP - тяжелая и замороченная, предназначена для крупных проектов, пока еще не окончательно стандартизована. XML-RPC легкая и полностью стандартизована, построена на использовании XML формата передачи данных между клиентом и сервером по HTTP протоколу. PHP5 поддерживает обе технологии. В дерево исходников PHP5 входит одна из реализаций библиотеки XML-RPC, написанной на С. Правда документация крайне скудная, но разобраться можно.

XML-RPC server:

1. Определяем функции, которые будут доступны клиенту. Для примера напишем функцию сложения двух чисел:
function srvAdd($MethodName, $Params, $AppData)
{
return $Params[0]+$Params[1];
}
Любая функция, регистрируемая на xml-rpc сервере, должна принимать 3 параметра:

$MethodName - внешнее имя функции;
$Params - массив параметров, передаваемых клиентом;
$AppData - дополнительные параметры, передаваемые при вызове функции xmlrpc_server_call_method().

2. Создаем XML-RPC сервер вызовом функции

srv=xmlrpc_server_create();

3. Регистрируем на сервере, определенные ранее функции

xmlrpc_server_register_method($srv, "Add", "srvAdd");

Здесь:
Add - внешнее имя функции srvAdd,
srv - handler сервера.

4. Получаем "сырой" запрос от клиента

$xmlRequest = $HTTP_RAW_POST_DATA;

5. Передаем запрос в диспетчер функций, который автоматически определит какую функцию вызвать.

$response = xmlrpc_server_call_method($srv, $xmlRequest, Null);

Здесь:
$srv - handler xml-rpc сервера;
$xmlRequest - данные от клиента в xml-формате;
Третий параметр, в данном случае пустой, передает дополнительные данные для определенных ранее функций (параметр $AppData).

6. Отдаем клиенту результаты работы функции

print $response;

7. Закрываем сервер.

xmlrpc_server_destroy($srv);

Приведу весь код xml-rpc сервера в котором клиенту доступны несколько функций:


function About($MethodName, $Params, $AppData)
{
$sAbout="ekXMLRPCServer Class v0.9.5\n (c) 2008 Klek\n Author: Eugene Klepikov\n Email: ";
return $sAbout;;
}
//-----------------------------------------------------------------------------
class ekXMLRPCServer
{
private $srvh=null;
private $xmlRequest="";
private $response="";
private $about="";
private $help="";
private $userData=null;
private $arOutOptions=array(
"output_type" => "xml",
"verbosity" => "pretty",
"escaping" => array("markup", "non-ascii", "non-print"),
"version" => "xmlrpc",
"encoding" => "iso-8859-1"
//"encoding" => "utf-8"
);
//-----------------------------------------------------------------------------

function __construct()
{
$this->srvh=xmlrpc_server_create();
$this->registerMethod("system.about", "About");
$this->registerMethod("help", "help");
}
//-----------------------------------------------------------------------------

function __destruct()
{
xmlrpc_server_destroy($this->srvh);
}
//-----------------------------------------------------------------------------

function registerMethod($methodName, $functionName)
{
xmlrpc_server_register_method($this->srvh, $methodName, $functionName);
}
//-----------------------------------------------------------------------------

function request($Request)
{
$this->xmlRequest=$Request;
}
//-----------------------------------------------------------------------------

function run()
{
$this->response=xmlrpc_server_call_method($this->srvh, $this->xmlRequest, $this->userData, $this->arOutOptions);
print $this->response;
}
//-----------------------------------------------------------------------------
}

Поместим файл с кодом xml-rpc сервера в защищенный каталог apache, чтобы к нему можно было коннесктится через SSL https://www.mydomain.ru/xmlrpcserver.php

XML-RPC Client

Клиента проще всего написать на Python, т.к. все нужные библиотеки уже есть в стандартной поставке.

>>> import xmlrpclib
>>> server = xmlrpclib.Server("https://www.mydomain.ru/xmlrpcserver.php")

Теперь можно вызывать функции сервера.

>>> server.Add('10', '15')
>>> 25
>>>

Функции Array() и Dict() различаются типом возвращаемого массива.

>>> server.Array("Peter")
>>>['Peter', 'Hello, Peter. How are you today?']

Array() возвращает список.

>>> server.Dict("Peter")
>>>{'name': 'Peter', 'greeting': 'Hello, Peter. How are you today?'}

Dict() возвращает словарь, т.к. в реализации функции мы использовали именованный массив.

XML-RPC сервер имеет и несколько встроенных функций, одна из которых
>>>server.system.listMethods()
>>>['system.listMethods', 'system.methodHelp', 'system.methodSignature', 'system.describeMethods', 'system.multiCall', 'system.getCapabilities', 'Uptime', 'Array', 'Dict', 'Add']

возвращает список всех доступных на сервере функций.

Замечания:

1. В питоновских библиотеках xmlrpclib, urllib, httplib не предусмотрена проверка сертификата сервера.

2. Для работы с библиотекой XML-RPC в PHP5 нужно поставить модуль php5-xmlrpc из репозитария дистрибутива или, при самостоятельной сборке, добавить к команде configure параметр --with-xmlrpc[=DIR].

пятница, 8 февраля 2008 г.

3D игры в (K)ubuntu. Wine + DirectX 9

Под Linux существует множество довольно интересных игр, но что делать, если хочется поиграть во что-нить новенькое, 3D-ое, которое обычно выпускается только под ЗлоОС :(

Есть несколько вариантов выйти из положения:

1) Использовать нативные версии игр, выпущенные специально под Linux. К таким играм относятся, например, игры компании idSoftware (все помнят Quake4, Doom3, Enemy Territory: Quake Wars), за что им отдельное спасибо.
2) Использовать эмуляторы Wine или Cedega. Wine поддерживает множество виндовых программ и игр, но к сожалению не поддерживает DirectX 9, а ведь именно эту библиотеку используют многие современные игры. Cedega в этом плане немного опередила Wine - добавив у себя поддержку DirectX 9, но в плане юзабилити Cedega очень и очень придирчива к тому, что она запускает (реально запустить под Cedega у вас получится всего пару игр).

Ну что же, будем исправлять положение, установим поддержку DirectX 9 для Wine.

Устанавливаем последнюю версию wine. Для этого добавим себе официальный репозиторий Wine HQ для Ubuntu 7.10

wget -q http://wine.budgetdedicated.com/apt/387EE263.gpg -O- | sudo apt-key add -

sudo wget http://wine.budgetdedicated.com/apt/sources.list.d/gutsy.list -O /etc/apt/sources.list.d/winehq.list

и устанавливаем wine

sudo apt-get update

sudo apt-get install wine

Если у вас уже установлен wine, то для чистоты эксперимента, удалите папку с настройками wine (или перенесите ее в другое место):

rm -dr ~/.wine

1. Для создания папки с настройками, в первый раз, запускаем конфигуратор wine:

winecfg

2. Теперь ищем в интернете или, если у вас установлен на компе ЗлоХП, копируем из папки windows\system32\ файлы mscoree.dll и streamci.dll в папку ~/.wine/drive_c/windows/system32/

3. Удаляем wine'ские файлы d3d:

cd ~/.wine/driver_c/windows/system32/

rm d3d8.dll d3d9.dll ddraw.dll dsound.dll dsound.vxd quartz.dll dxdiagn.dll

4. Редактируем файл user.reg:

gedit ~/.wine/user.reg

в конец файла вставляем:

[Software\\Wine\\DllOverrides] 1196330736
"d3d8"="native"
"d3d9"="native"
"d3dim"="native"
"d3dx8"="native"
"d3dxof"="native"
"dciman32"="native"
"ddrawex"="native"
"devenum"="native"
"dinput"="native"
"dinput8"="native"
"dmband"="native"
"dmcompos"="native"
"dmime"="native"
"dmloader"="native"
"dmscript"="native"
"dmstyle"="native"
"dmsynth"="native"
"dmusic"="native"
"dplay"="native"
"dplayx"="native"
"dpnaddr"="native"
"dpnet"="native"
"dpnhpast"="native"
"dswave"="native"
"dxdiagn"="native"
"mscoree"="native"
"quartz"="native"
"streamci"="native"

5. Распаковываем последнюю версию DirectX (скачать последнюю версию можно отсюда):

wine directx_nov2007_redist.exe

6. Выбираем папку куда распакуются файлы, после распаковки переходим в эту папку и запускаем установку:

wine DXSETUP.EXE

7. Снова запускаем конфигуратор wine:

winecfg

7.1. Переходим на вкладку 'Библиотеки', выбираем из ниже приведенного списка названия библиотек, нажимаем редактировать и выбираем пункт 'Встроенная (Wine)'
d3d8, d3d9, ddrawex, dinput, dinput8

8. Запускаем диагностику DirectX:

wine dxdiag.exe

8.1. В окне диагностики переходим на вкладку 'Дисплей' и выполняем тест 'Проверка Direct3D'.

Если все тесты прошли успешно, то все отлично, теперь у вас в wine есть поддержка DirectX 9, с чем я вас и поздравляю!!! Теперь запускайте ваши любимые игры и наслаждайтесь, но учтите, даже с поддержкой dx9, многие игры до сих пор еще не работают в wine.

P.S. Различные нюансы по запуску нужной вам игры вы можете посмотреть в базе приложений Wine HQ.


Взял отсюда...

вторник, 5 февраля 2008 г.

Дюжина самых необыкновенных револьверов



Дюжина самых необыкновенных револьверов


Как вы думаете, насколько мизерным может быть пистолет? О, вы даже не догадываетесь, какие формы он может принимать! Сейчас мы расскажем о самых интересных и необычных пистолетах, которые вы когда-либо видели.


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

"Выходят на арену силачи..." (с) А.Б. Пугачева

Интересно как сойдутся в поединке два гиганта.

Основной темой IT-изданий по-прежнему остается судьба интернет-гиганта Yahoo!. Microsoft объявила о намерении приобрести компанию за 44,6 миллиарда долларов, что на 62 процента выше рыночной стоимости портала. Казалось, что MS сделала предложение, от которого нельзя отказаться (сделка сулит выгоды обеим сторонам: объединенная компания будет контролировать почти треть американского поискового рынка, общая прибыль составит более 17 миллиардов долларов, а экономия от такого слияния оценивается в $1 млрд. ежегодно), однако в Yahoo взяли паузу.

Возможная покупка Yahoo! корпорацией Microsoft больше всего не по душе Google, который считает, что такая сделка поднимает «тревожные вопросы», связанные с «фундаментальными принципами Интернета — открытостью и новаторством». Защищать эти принципы Google намерен различными способами, в том числе и с помощью лоббистов в Вашингтоне.

В Yahoo! считают, что Microsoft недооценила компанию, сообщили два неназванных источника Reuters. Google в свою очередь пообещал Yahoo! любую помощь в попытках «отбиться» от Microsoft.

Отсюда...

четверг, 31 января 2008 г.

Создатель MySQL объявляет о релизе нового движка Maria, который должен заменить InnoDB

Michael Widenius в своем блоге заявил об анонсе нового движка базы данных MySQL под названием Maria. Новый движок разрабатывается уже в течении двух лет и является закономерным ответом Oralcle'у на приобретение им движка InnoDB. Список основных возможностей Maria:

* ACID (поддержка транзакций)
* Commit / Rollback (откаты изменений)
* Конкурентные запросы (Concurrent selects)
* Блокирование строк (Row locking)
* Поддержка групповых транзакций (Group commit)

Взял отсюда...

пятница, 25 января 2008 г.


Работая в «Глобусе»


офисное место «Глобус»
офисное место «Глобус»

Дизайнер Михаэль Ван дер Клей (Michiel van der Kley) создает свои проекты, увлекается дизайном с 1987 года. Целых двадцать лет! Его последнее изобретение, о котором мы вам сейчас расскажем, наглядно демонстрирует весь его творческий потенциал и отличное воображение.


Колпачки для ручек тоже могут стать полезными



Колпачки для ручек тоже могут стать полезными




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



понедельник, 21 января 2008 г.

(K)Ubuntu. Настраиваем доступ к Microsoft SQL Server

Вобщем возникла настоятельная необходимость получить доступ к M$ SQL базам из Linux. Немного подумав, я вспомнил что такую связку (Linux -> M$ SQL) можно поднять через ODBC. Но нужен odbc-драйвер, который умеет работать с M$ SQL. Память подсказала название драйвера - FreeTDS.
Дальнейшие действия справедливы для (k)ubuntu 7.10. Для других дистрибутивов названия пакетов и расположение конфигурационных файлов могут (и будут) отличаться.

Установим необходимые пакеты:
sudo aptitude install tdsodbc unixodbc odbc-bin php5-odbc
Настройка FreeTDS.
Для настройки FreeTDS нужно в конфигурационный файл /etc/freetds/freetds.conf добавить новую секцию для нашего M$ SQL сервера (название секции может быть любым):
[MsSQL]
host = sql.mydomen.ru
port = 1433
tds version = 8.0
client charset = WINDOWS-1251
где:
host - доменное имя или IP сервера с SQL.
tds version - версия протокола TDS, которая определяется по таблице. Версия 8.0 для Microsoft SQL Server 2000.
FreeTDS использует iconv для перекодирования потока. Если client charset не установлена, то перекодировка отключается и используется дефолтная ISO-8859-1. Эта переменная может принимать все кодировки библиотеки iconv.

Настройка ODBC.
Чтобы ODBC работала с FreeTDS нужно настроить драйвера, для этого скопируем файл описания драйверов из поставки FreeTDS /usr/share/freetds/odbcinst.ini в /etc/odbcinst.ini или, если /etc/odbcinst.ini уже существует и в нем есть записи других драйверов, добавим секцию для FreeTDS:
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/odbc/libtdsodbc.so
Setup = /usr/lib/odbc/libtdsS.so
CPTimeout =
CPReuse =
Далее нужно настроить систему ODBC. Сделать это можно 2-мя путями:
1. Посредством графической утилиты ODBCConfig (из пакета odbc-bin).
2. Отредактировать файл /etc/odbc.ini, внеся в него соответствующие секции:
[SQLOnLine]
Description = FreeTDS
Driver = FreeTDS
Servername = MsSQL
Database = Report
UID = user
PWD = passwd
Port = 1433
где:
Description - описание драйвера.
Driver - имя раздела из файла /etc/odbcinst.ini.
Servername - имя раздела, описывающего сервер БД, из файла /etc/freetds/freetds.conf.
Database - имя базы данных на M$ SQL сервере, к которой нужно получить доступ.
UID и PWD - пользователь, заведенный на M$ SQL сервере и грантованный на работу с данной БД.

После внесения необходимых данных в конфигурационные файлы, нужно удостовериться в работе ODBC. Для этого запускаем графическое приложение DataManagerII (пакет odbc-bin). Выбираем System Data Source, видим название БД SQLOnLine, которую определили в odbc.ini, выбираем ее, вводим логин и пароль и видим, разрешенные таблицы.
Все, можно работать.

пятница, 18 января 2008 г.

Поисковые шаблоны в Aptitude

Очень полезная информация.
Взял отсюда...

В этом посте я расскажу о том, как искать пакеты программ Debian с помощью aptitude. В Ubuntu, понятно, всё делается точно так же.

Обычно, чтобы найти нужный пакет, достаточно написать что-нибудь вроде

$ aptitude search шаблон

и получить список пакетов, в названии которых встречается «шаблон». Например:

$ aptitude search doom
v doom-engine -
p doom-package - Installer for Doom data files
v doom-wad -
v doom-wad-editor
...


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

$ aptitude search HDR

и получает

p chdrv - Chinese terminal for the Linux console
p chdrvfont - Kuo Chiao 16x16 font for CHDRV Chinese con


Явно это не то, что его интересовало. Вот именно здесь пригодятся более «продвинутые» возможности поиска в aptitude. А именно «поисковые шаблоны». Полное описание шаблонов доступно в документации к aptitude. Здесь я расскажу только о некоторых из них.

Итак, каждый шаблон — это некое условие поиска. По умолчанию, если указать сразу несколько шаблонов, то будет выдан список пакетов, соответствующих всем указанным условиям (логическое И). Если шаблоны разделить знаком «|», то будут найдены пакеты, соответствующие хотя бы одному из условий (логическое ИЛИ). Если перед шаблоном (условием) поставить восклицательный знак, то будут найдены пакеты, для которых это условие не выполняется (логическое отрицание). Несколько шаблонов (условий) можно группировать с помощью скобок.

Шаблоны обычно начинаются со знака тильда «~». За ней следует символ, указывающий тип шаблона. Затем может идти дополнительный текст, зависящий от шаблона. Такой синтаксис шаблонов должен быть знаком пользователям почтовой программы mutt.

Итак, самые полезные, на мой взгляд, шаблоны:

~nимя — в имени встречается текст «имя» (можно использовать регулярные выражения, например, ~n^lib отбирает только имена начинающиеся с lib)
~dтекст — в описании пакета встречается «текст» (очень полезно, если название программы неизвестно, но известно, что она должна делать)
~i — отбирает только уже установленные пакеты
~N — отбирает только новые пакеты (которых раньше не было в репозитории)
~U — отбирает пакеты, которые можно обновить
~Dтребование — отбирает пакеты, которые зависят от «требования» (можно использовать регулярные выражения)
~Rзависимый — отбирает пакеты, которые необходимы для «зависимого» (можно использовать регулярные выражения)

Вернёмся к нашему примеру. Поскольку поиск по именам пакетов ничего полезного не дал, можно поискать по описаниям:

$ aptitude search ~dHDR

даёт 27 строк результатов. Уже лучше, но среди них — явно лишние. Можно ограничить выборку только теми пакетами, в описании которых говорится и про HDR, и про изображения (images):

$ aptitude search ~dHDR~dimage
i exrtools - A collection of utilities for manipulating
p libopenexr-dev - development files for the OpenEXR image li
c libopenexr2c2a - runtime files for the OpenEXR image librar
i libopenexr2ldbl - runtime files for the OpenEXR image librar
p libpfs-1.2-0 - C++ library to read and write pfs files
p libpfs-dev - C++ library to read and write pfs files (d
p octave-pfstools - octave bindings for pfstools
i openexr - viewer and docs for the OpenEXR image form
p pfstools - command line HDR manipulation programs
p pfstools-dbg - command line HDR manipulation programs (de
i qtpfsgui - graphical user interface providing a workf


Это именно то, что надо. В данном примере я соединил два поисковых шаблона вместе (логическое И).

А вот пример отрицания условия:

$ aptitude search '!~i~naptitude'
p aptitude-dbg - Debug symbols for the aptitude package man
v aptitude-doc -
p aptitude-doc-cs - Czech manual for aptitude, a terminal-base
p aptitude-doc-fi - Finnish manual for aptitude, a terminal-ba
p aptitude-doc-fr - French manual for aptitude, a terminal-bas
p aptitude-doc-ja - Japanese manual for aptitude, a terminal-b


Здесь я искал такие пакеты, в названии которых встречается «aptitude» (~naptitude), но в системе они у меня не установлены (!~i). Поисковые шаблоны были взяты в кавычки, чтобы избежать интерпретации восклицательного знака оболочкой bash.

А вот пример комбинации логического ИЛИ и логического И. Я смотрю, какие у меня установлены пакеты, такие что в названии встречается firefox или iceweasel (обратите внимание на группировку шаблонов с помощью скобок):

$ aptitude search '~i(~nfirefox|~niceweasel)'
i iceweasel - lightweight web browser based on Mozilla
i iceweasel-gnome-support - Support for Gnome in Iceweasel
i iceweasel-l10n-ru - Russian language package for Iceweasel


Поскольку firefox у меня не стоит, то найдены только пакеты iceweasel.

Конечно, использовать поисковые шаблоны можно не только из коммандной строки. Работают они и во встроенном поиске aptitude в полноэкранном режиме.

От себя могу заметить, что после того, когда я вдруг узнал про поисковые шаблоны aptitude, поиск и установка нужных программ в Debian стали намного проще и приятнее.

вторник, 15 января 2008 г.

Удаляем старые файлы и каталоги

Наверно всем известно, что свободное дисковое пространство стремительно заполняется всякой ерундой. На одном из моих серверов, по просьбе трудящихся, был создан каталог, в который эти самые трудящиеся (в основном отдел маркетинга) клали свои файлы и давали на них ссылки своим контрагентам. Мою просьбу, периодически чистить каталог, все успешно игнорировали. Нужно было что-то делать с этой файловой помойкой. После недолгих размышлений я написал на Python программку, которая и занимается зачисткой.
Все заинтересованные были предупреждены, что файлы и директории, пролежавшие на сервере больше 30 дней будут удалены. Но есть и постоянные директории, которые не должны удалятся.
Программка вызывается по crontab ежедневно.


#!/usr/bin/env python
# -*- coding: utf8 -*-
#----------------------------------------------------------------------------
# Name: delexpfile.py
# Version: 1.0.4
# Purpose: Delete expired files in directory.
#
# Author: Eugene Klepikov
# E-Mail: klek07@gmail.com
#
# Created: 10.01.2008
# Updated: 14.01.2008
# Copyright: (c) 2008 KlekFox
# Licence: GPL
#----------------------------------------------------------------------------
##
'''
Delete expired files in directory.
Run from cron daily.
'''
import sys, os, datetime
from stat import *
iExpDays=30
dtToday=datetime.date.today()
sPath="/www/files"
arExcludeDirs=('balances', 'prcenter', 'const')
#---------------------------------------------------------------------------
def ekDelExpFiles(Path):
dtFile=0
sPathFile=""
for file in os.listdir(Path):
sPathFile=os.path.join(Path, file)
dtFile=datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
#print "Path: ", sPathFile, dtFile.strftime("%d.%m.%Y")
if(os.path.isdir(sPathFile)):
if file in arExcludeDirs: continue
#print "Path is dir: ", sPathFile, datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
ekDelExpFiles(sPathFile)
dtDiff=dtToday-dtFile
if(dtDiff.days > iExpDays):
try:
if(os.path.isdir(sPathFile)):
print "Delete Directory: ", sPathFile, datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
os.rmdir(sPathFile)
else:
print "Delete File: ", sPathFile, datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
os.unlink(sPathFile)
except OSError, msgError:
print msgError
return 0
#---------------------------------------------------------------------------
def main():
print "-----",dtToday.strftime("%d.%m.%Y"),"-----"
ekDelExpFiles(sPath)
return 0

if __name__ == '__main__' :
sys.exit( main() )
#----------------------------------------------------------------------------
#

Некоторые пояснения:
  • iExpDays - через сколько дней файл/директория считается устаревшим.
  • sPath - абсолютный путь к каталогу с файловой помойкой.
  • arExcludeDirs - список директорий, которые не должны обрабатываться.
  • dtToday - экземпляр класса date (пакет datetime), содержит текущую дату.
  • dtFile - экземпляр класса date (пакет datetime), содержит дату файла/директории.
dtDiff=dtToday-dtFile
dtDiff.days - содержит разницу в днях.

Была небольшая заморочка с датой файлов. В Linux, да и во всех *nix, файлы имеют несколько дат: дата создания, дата модификации, дата последнего доступа...
Модуль stat содержит предопределенные константы для работы с файлами:
  • ST_ATIME - дата последнего доступа к файлу.
  • ST_MTIME - дата последней модификации файла.
  • ST_CTIME - зависит от операционной системы: для юниксов содержит дату последнего изменения метаданных, а для виндов - дату создания файла.
Вопрос в том, какую дату использовать ST_CTIME или ST_MTIME?
Тестируя программу, я наткнулся на ситуацию, когда старые файлы не удалялись. Т.е. я создал тестовую директорию и в нее накидал файлов разной давности. Но они не удалялись... Вставил диагностические print-ы и увидел, что при использовании ST_CTIME все файлы датированы датой копирования в тестовую директорию?! При этом ls -l показывает правильную дату создания или модификации фалов. Таким образом для тестирования я использовал ST_MTIME. Но на боевом сервере было решено оставить ST_CTIME.

среда, 9 января 2008 г.

Есть ли жизнь после родов?

Как-то раз, в животе у одной беременной женщины росли и развивались два эмбриона. Одного звали Маленький Верующий, другого - Маленький Скептик.

И вот однажды, Скептик спросил: "Послушай, а ты веришь в жизнь после родов?"

Верующий: Естественно, я верю в жизнь после родов! Это же ясно - жизнь после родов продолжается. Наша жизнь здесь только для того, чтобы мы выросли и были готовы к жизни после родов, чтобы стали достаточно сильными перед тем, что нас ожидает.

Скептик: Да? По-моему, всё это глупость! На самом деле, никакой жизни после родов не существует! Ты хотя бы можешь представить, как бы вообще могла выглядеть эта жизнь?

В: Я не знаю это точно, но определённо будет больше света, чем здесь. А возможно мы будем есть ртом, и бегать, и...

С: Это полная бессмыслица. Бегать вообще невозможно, а есть ртом - полностью смешное предположение. Мы имеем пуповину, которая нас кормит. Без этого невозможно даже представить, чтобы существовала жизнь после родов. Пуповина - это наша жизнь! К тому же, ты заметил, что уже сейчас пуповина становится нам всё более короткой?

В: Нет! Это действительно возможно. Просто весь окружающий мир будет полностью другой, - не то, к чему мы привыкли.

С: Но ведь ещё никто и никогда после родов не возвратился! Все знают, что жизнь кончается родами! А вообще жизнь - это большое страдание в темноте!

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

С: Маму?!? Ты - веришь в Маму? Ха-ха! А где бы Она могла быть?

В: Но ведь Она везде возле нас. Мы находимся и живём в Ней. Без Неё мы не можем существовать.

С: Это всё исключительная глупость. От этой мамы я не видел и кусочка, мне также ясно, что она в принципе не может существовать.

Верующий: Иногда, когда мы очень спокойны, то можем услышать, как Она поёт или почувствовать, как Она поглаживает наш Мир.

И я твёрдо верю, что наша действительная жизнь продолжится потом!

Автор не известен.

Взял отсюда...

Наводит на глубокие мысли...

вторник, 8 января 2008 г.

фильм "Ирония судьбы-2"

По поводу нашумевшего фильма "Ирония Судьбы (продолжение)" высказались многие. Но мне было интересно мнение двух, очень извесных в Рунете, писателей - Алекса Экслера и Леонида Каганова. Мнения оказались противоположными. Мне ближе мнение Лео, т.к. он высказал в слух то, что я чувствовал после просмотра фильма, но не мог сформулировать.
Экслер
Я посмотрел продолжение этого фильма, и оно мне понравилось. Хотя я изначально был предубежден. Но мне пофиг, кто что говорит и пишет по этому поводу. Мне понравилось - и все дела. Впечатления изложены в рецензии.
Каганов
Когда смотришь новый ситком, понимаешь, что мы чего-то потеряли. Чего-то такое важное и человечное. Не пресловутую любовь, которая тут не более, чем страстные серенады самца и томные взгляды сметённой от обилия внимания молчаливой самки. А что-то такое, более зрелое, нажитое лишь долгой-долгой цивилизацией. Когда лгать считалось некрасивым, обманывать - подлым, а ломать чужие квартиры - бандитизмом. Когда пожертвовать личными делами ради того, чтобы броситься сломя голову выполнять служебный долг и не оставить без связи район в новогоднюю ночь - казалось доблестью, а не дуростью... И очень жаль, что создатели современных ситкомов этого не понимают. Не видят. Не замечают.
Полная рецензия...

понедельник, 7 января 2008 г.

Skype в (K)ubuntu 7.10

У меня в (K)ubuntu 7.10 обновился Skype до версии 2.0.0.27 (Beta). Теперь он умеет работать с веб-камерами. Сам я с веб-камерами вообще никогда не работал... Поэтому вопрос - какую веб-камеру купить (модель или чипсет), чтобы она хорошо работала в Linux?

воскресенье, 6 января 2008 г.

Перевел еще один сервер на Ubuntu server 7.10

Вчера (5.01.2008) перевел еще один из своих серверов на ubuntu server 7.10
Железяка хоть и серверная, но довольно старая: P III 600, памяти 512 Мб, 3 диска по 18 Гб.
Имеется встроенный RAID, который ни один дистрибутив Linux не понимает, поэтому создан совтовый RAID. На этом сервере крутилась SuSE 10.0.
В процессе установки, ubuntu server 7.10 определил 2 RAID1 раздела, которые были созданы еще под SuSE. На них и установил ubuntu. Установка прошла без проблем, но после перезагрузки система не смогла смонтировать /dev/md0.... Вот это была засада :( SuSE нормально грузилась с софтового райда. Т.е. у ubuntu Grub не понимает софт-райд разделов.
Пришлось убивать все разделы на 2-х дисках и создавать заново. На первом диске sda создал 3 раздела для: boot, /, home. На втором диске sdb создал аналогичные по размеру разделы.
Далее, первому разделу sda1 (ext3) была назначена точка монтирования /boot. Первый раздел sdb1 (ext3) без монтирования. После этого создал RAID1 для корневого раздела md0 (sda2, sdb2) и для home md1 (sda3, sdb3). На третьем диске sdc создал 2 раздела под swap и data для файловой помойки. После установки дистрибутива на такую конфигурацию дисков, ubuntu загрузилась без вопросов.
Дополнительно поставил Postfix и squid, т.к. этот сервер служит прокси-сервером и еще отдает "тяжелую" почту наружу.
Еще раз убедился, что Ubuntu работает заметно быстрее чем SuSE.