четверг, 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.