2011/03/24

Бразильский танец с бубном

Очередная моя статья в свежей прессе!

На этот раз рассуждал о настройке, оптимизации работы и обеспечении безопасности Samba-клиента в Linux.

2011/03/22

Убираем анимацию табов в Firefox 4

Сегодня (почтенная публика уже, наверное, в курсе) состоялся релиз Firefox 4! Всё вроде хорошо: и быстрота, и простота, и так далее. Но, следуя трендам, разработчики прикрутили анимацию при открытии таба, которая лично меня ужасно раздражает.
А убрать её через штатное меню настройки нельзя, а можно вот так: надо набрать в строке адреса "about:config", в фильтре ввести "tab", найти параметр browser.tabs.animate и установить его значение в false.

2011/03/21

Выставляем правильное разрешение на внешнем дисплее

Как выяснилось, мой уютный ThinkPad с Арчем на борту не сильно дружит с телеком Samsung по VGA кабелю, а именно дает выставлять разрешение максимум 1024x768, хотя поддерживается там 720p (1360x768). Причину такого поведения доподлинно выяснить не удалось, но тут скорее всего два варианта: либо дрова неправильно обрабатывают EDID блок, либо этот блок неправильно формируется на телеке (либо я вообще неправильно настроил иксы).
Для исправления ситуации командуем, чтобы узнать параметры этого разрешения, так называемый VESA CVT mode line:
$ cvt 1360 768
Далее добавляем этот режим в список доступных:
$ xrandr --newmode "1360x768_60.00"   84.75  1360 1432 1568 1776  768 771 781 798 -hsync +vsync
И добавляем режим для конкретного выхода:
$ xrandr --addmode VGA1 1360x768_60.00
После этого нужное разрешение будет доступно для выбора в xrandr или фронтэнде к нему для вашего WM/DE. Я, вследствие природной лени, пользуюсь lxrandr. Чтобы каждый раз не вбивать команды, можно записать их в файлы ~/.xinitrc или ~/.xprofile - они выполнятся при старте иксов.

Либо можно добавить в xorg.conf блок типа такого:
Section "Monitor"
    Identifier "External VGA"
    Modeline "1360x768_60.00"   84.75  1360 1432 1568 1776  768 771 781 798 -hsync +vsync
    Option "PreferredMode" "1360x768_60.00"
EndSection

2011/03/11

Считаем количество ненулевых битов

"Предложите способ посчитать количество ненулевых битов в содержимом файла с именем blob.dat". Предлагаю:

#!/usr/bin/python2.7

def bstr(n):
    return ''.join([str(n >> x & 1) for x in (7,6,5,4,3,2,1,0)])

f = file('blob.dat', 'rb')
bytes = f.read()
sheet = ''.join([bstr(ord(c)) for c in bytes])

amount = 0
for bit in sheet:
    if bit == '1': amount += 1

print amount

2011/03/03

Скринкастинг в Linux

Вы всё ещё снимаете видео о том, как похекали сайт NASA, с помощью recordmydesktop? Не позорьтесь! Вот вам кошерная команда:

$ ffmpeg -f x11grab -s 1280x800 -r 25 -g 250 -i :0.0 -sameq -vcodec qtrle out.mov

1280x800 нужно заменить в соотвествии с разрешением экрана. На мой взгляд такой набор параметров обеспечивает оптимальное соотношение скорость/качество.

2011/02/26

Liberte Linux

Чуть было не забыл, что недавно вышла в свет моя первая статья в светском журнале Хакер про дистрибутив для настоящего анонимуса!

UPD: текст статьи доступен здесь.

2011/02/17

Парсим XML

Даны два xml-файла, отличающиеся только атрибутами
Файл 1:
<root>
<nodeA val1="1" val2="2" val3="3">
<nodeB val1="1" val2="2" val3="3"/>
</nodeA>
<nodeC val1="1" val2="2" val3="3"/>
</root>
Файл 2:
<root>
<nodeA val1="1" val2="X" val4="4">
<nodeB val1="1" val2="X" val4="4"/>
</nodeA>
<nodeC val1="1" val2="X" val4="4"/>
</root>
Надо реализовать на любом скриптовом языке слияние Файла 1 в Файл 2 так, чтобы в Файле 2:
1) остались уникальные атрибуты Файла 2;
2) присутствовали уникальные атрибуты Файла 1;
3) совпадающие атрибуты имели значения из Файл 1.

Я делал с помощью модуля lxml, которой нет в стандартной поставке питона. Чтобы использовать стандартный модуль xml, надо просто заменить первую строчку на import xml.etree.ElementTree as etree - интерфейсы в этом случае одинаковые.

from lxml import etree

file1 = open('1.xml', 'r')
tree1 = etree.parse(file1)
file1.close()
root1 = tree1.getroot()

file2 = open('2.xml', 'r')
tree2 = etree.parse(file2)
file2.close()
root2 = tree2.getroot()

for i in range(len(root1)):
    for ikey in root1[i].keys():
        root2[i].attrib[ikey] = root1[i].attrib[ikey]

    if len(root1[i]) > 0:
        for j in range(len(root1[i])):
            for jkey in root1[i][j].keys():
                root2[i][j].attrib[jkey] = root1[i][j].attrib[jkey]

file2 = open('2.xml', 'w')
file2.write(etree.tostring(root2))
file2.close()

Атрибуты и их значения здесь представлены в виде словарей, поэтому ими можно легко манипулировать. Более подробная информация здесь: http://lxml.de/tutorial.html

2011/02/16

Проверка логина на корректность

Условие такое:

Логин должен начинаться с латинской буквы, может состоять из латинских букв, цифр, точки и минуса и должен заканчиваться латинской буквой или цифрой. Минимальная длина логина – 1 символ. Максимальная – 20
символов.

import re
from operator import truth

def logincheck(login):
    if login == '' or len(login) > 20:
        print 'False'
        return
    elif len(login) > 2:
        if (truth(re.match('[a-zA-Z]', login[0])) + \
            truth(re.match('[a-zA-Z0-9]', login[-1])) + \
            truth(re.match('^([a-zA-Z0-9\-\.])+$', login[1:-1]))) == 3:
            print 'True'
        else: print 'False'
        return
    elif len(login) == 2:
        if (truth(re.match('[a-zA-Z]', login[0])) + \
            truth(re.match('[a-zA-Z0-9]', login[-1]))) == 2:
            print 'True'
        else: print 'False'
        return
    else:
        if (truth(re.match('[a-zA-Z]', login[0]))) == 1:
            print 'True'
        else: print 'False'

Здесь проверка разбита на несколько этапов: для логина > 2 символов, для = 2 символам и для = 1 символу. Можно, конечно, сделать в 1 регулярное выражение, но мои копошения так и не смогли вывести такую регулярку. Если кто покажет - буду очень рад.

2011/02/15

Преобразование числа в IP адрес

Возобновляю записи по питону! На сайте Яндекса можно найти много тренировочных задачек, что ж, приступим. :)

def ip2str(ip):
        if ip > 0xffffffff:
                raise ValueError('number must be 32 bit')
        ipstr = str(ip >> 24) + '.' + \
                str((ip & 0x00ffffff) >> 16) + '.' + \
                str((ip & 0x0000ffff) >> 8) + '.' + \
                str((ip & 0x000000ff))
        print ipstr

Эта функция принимает число, и печатает его в виде строки IP адреса. Как-то так сделал с помощью наложения масок и байтовых сдвигов.

2011/02/14

Консоль - лучший друг линуксоида

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

#!/bin/bash

echo -e "\e[0;30mCOLOR_BLACK\t\e[1;30mCOLOR_BOLD_BLACK"
echo -e "\e[0;31mCOLOR_RED\t\e[1;31mCOLOR_BOLD_RED"
echo -e "\e[0;32mCOLOR_GREEN\t\e[1;32mCOLOR_BOLD_GREEN"
echo -e "\e[0;33mCOLOR_YELLOW\t\e[1;33mCOLOR_BOLD_YELLOW"
echo -e "\e[0;34mCOLOR_BLUE\t\e[1;34mCOLOR_BOLD_BLUE"
echo -e "\e[0;35mCOLOR_PURPLE\t\e[1;35mCOLOR_BOLD_PURPLE"
echo -e "\e[0;36mCOLOR_CYAN\t\e[1;36mCOLOR_BOLD_CYAN"
echo -e "\e[0;37mCOLOR_WHITE\t\e[1;37mCOLOR_BOLD_WHITE"

Настройки urxvt надо записывать в файл ~/.Xdefaults, среди которых есть color0-15, соответствие которых с выводом вышенаписанного скрипта представлено ниже:

color0 = COLOR_BLACK
color1 = COLOR_RED
color2 = COLOR_GREEN
color3 = COLOR_YELLOW
color4 = COLOR_BLUE
color5 = COLOR_PURPLE
color6 = COLOR_CYAN
color7 = COLOR_WHITE
color8 = COLOR_BOLD_BLACK
color9 = COLOR_BOLD_RED
color10 = COLOR_BOLD_GREEN
color11 = COLOR_BOLD_YELLOW
color12 = COLOR_BOLD_BLUE
color13 = COLOR_BOLD_PURPLE
color14 = COLOR_BOLD_CYAN
color15 = COLOR_BOLD_WHITE

Немного повозившись поставил следующие цвета:

URxvt.color0: #333333
URxvt.color1: #d43a2a
URxvt.color2: #00c800
URxvt.color3: #cdcd00
URxvt.color4: #005d9a
URxvt.color5: #cd68cd
URxvt.color6: #009f9f
URxvt.color7: #dddddd
URxvt.color8: #333333
URxvt.color9: #d43a2a
URxvt.color10: #00c800
URxvt.color11: #cdcd00
URxvt.color12: #005d9a
URxvt.color13: #cd68cd
URxvt.color14: #009f9f
URxvt.color15: #dddddd

Скриншот всего этого непотребства: