Отправляет email-рассылки с помощью сервиса Sendsay

KirovLUG: пользователи Linux в Вятке

За 2005-01-18

Re: Генерация индексов для проекта lindocs.

Сейчас, пусть функция prn, не просто печатает аргументы передаваемые ей,
а создает из них строку, которая будет использоваться в качестве ключа в
объекте-словаре (ассоциативный массив). Заодним, сменим название этой
функции.
Почему будет использоваться объект-словарь? Если мы хотим в дальнейшем
сосчитать количество материалов, в которых участвуют оба ключевых слова,
то при каждой сформированной паре ключевых слов, пришлось бы искать -
упоминалась эта пара уже до этого или нет. А в случае использования
конкатенации пары слов в качестве ключа в ассоциативном массиве, можно
воспользоваться стандартными средствами поиска.

def count_pair(a, b):
c_keys = [a, b]
c_keys.sort()
s_key = string.join(c_keys,':')
Сначала в функции создается список, содержащий два ключевых слова.
c_keys.sort() - стандартный метод для объектов-списков, сортирующий
элементы списка.
string.join(c_keys,':') - функция модуля string, производящая
конкатенацию элементов списка в одну строку, в качестве разделителя
между элементами в строке будет выступать ":". Для работоспособности
данного кода в начало скрипта, в секции, где указываются импортируемые
модули, необходимо указать, что импортируется модуль string:

import string
Ключ для словаря сформирован, теперь необходимо реализовать работу с
самим словарем. В начале скрипта создадим пустой объект-словарь:

dc_graph = {}
Теперь допишем функцию count_pair. Если записи с данным ключом еще не
было в словаре, то создадим ее, а если уже была такая запись, то
увеличим значение-счетчик, которое говорит, в скольких материалах была
такая пара ключевых слов.

def count_pair(a, b):
c_keys = [a, b]
c_keys.sort()
s_key = string.join(c_keys,':')
if dc_graph.has_key(s_key):
c = dc_graph[s_key]
else:
c = 0
dc_graph[s_key] = c+1
dc_graph.has_key(s_key) - проверяем имеется ли строка s_key среди ключей
словаря
c = dc_graph[s_key] - получаем значение-счетчик соответствующее ключу
s_key
dc_graph[s_key] = c+1 - присваиваем новое значение записи с ключом
s_key, если такой записи не было, то она создается. Вообще-то, она в
любом случае создается заново, просто в случае, если запись с таким
ключом уже была, то она удаляется (это особенности реализации работы со
словарями в Python)

Если присмотреться к тому, что в итоге получится в объекте-словаре, то
можно увидеть граф: ключи словаря описывают ребра графа, а значения
- вес ребер графа.

   2005-01-18 14:19:50 (#299553)

Re: Генерация индексов для проекта lindocs.

> firewall faq
> firewall ipfw
> firewall freebsd
> firewall nat
> faq ipfw
> faq freebsd
> faq nat
> ipfw freebsd
> ipfw nat
> freebsd nat

Данное отображение навело на мысли.

Человек знакомый с теорией графов увидит, что это ничто иное как
описание графа. Каждое слово - вершина графа, одинаковые слова - одни и
те же вершины, пара слов - указание какие вершины связаны между собой.

Итак, чем же отобразить получившийся граф? Александр Лубягин подсказал
мне воспользоваться для этого программным пакетом graphviz (в ALT Linux
Master 2.4 есть также пакет с примерами описания графов graphviz-demos).

В первую очередь из выводимых данных нужно сформировать описание графа,
для этого перенаправим вывод программы, выводящей пары вершин (в нашем
случае "./on_stat.py") на вход команды awk:

$ ./on_stat.py | awk '{print $1" -- "$2";"}'
firewall -- faq;
firewall -- ipfw;
firewall -- freebsd;
firewall -- nat;
faq -- ipfw;
faq -- freebsd;
faq -- nat;
ipfw -- freebsd;
ipfw -- nat;
freebsd -- nat;

Если среди вершин встречаются такие, в названии которых есть "-", то в
таком случае вершины лучше заключить в кавычки:

$ ./on_stat.py | awk '{print "\""$1"\" -- \""$2"\";"}'
"firewall" -- "faq";
"firewall" -- "ipfw";
"firewall" -- "freebsd";
"firewall" -- "nat";
"faq" -- "ipfw";
"faq" -- "freebsd";
"faq" -- "nat";
"ipfw" -- "freebsd";
"ipfw" -- "nat";
"freebsd" -- "nat";

Теперь добавим шапку и подвал описания графа:

$ echo "graph G {"; \
./on_stat.py | awk '{print "\""$1"\" -- \""$2"\";"}'; \
echo "}"
graph G {
"firewall" -- "faq";
"firewall" -- "ipfw";
"firewall" -- "freebsd";
"firewall" -- "nat";
"faq" -- "ipfw";
"faq" -- "freebsd";
"faq" -- "nat";
"ipfw" -- "freebsd";
"ipfw" -- "nat";
"freebsd" -- "nat";
}

Описание графа сформировано. Осталось подать эти данные на вход
программе генерирующей графическое отображение заданного графа:

$ (echo "graph G {"; \
./on_stat.py | awk '{print "\""$1"\" -- \""$2"\";"}'; \
echo "}") | \
dot -Tpng -o graph.png

Результирующее изображение будет помещено в graph.png. Помимо растровых
типов (png, jpg, gif) поддерживаются PS и SVG.

На самом деле описание графа может быть более полным - вид графа, вид
вершин, метки, цвета, ссылки - очень многое может повлиять на конечный
вид сгенерированной схемы графа.

   2005-01-18 12:18:49 (#299461)

ATI Proprietary Linux x86_64 Driver

После долгого ожидания и оффициального отказа ATI от поддержки AMD64 под
Linux, выходят новые драйвера:

New Features

This section provides information on new features introduced in the ATI
Proprietary Linux software driver. This release introduces the following:

1. Drivers for X.org 6.8 are now provided
2. x86_64 drivers now available for XFree86 4.3 and X.org 6.8

Release Notes: http://www2.ati.com/drivers/linux/linux_8.8.25.html
http://www.ati.com/support/driver.html

Stranger

   2005-01-18 11:29:37 (#299400)

Re: Sisyphus

> Я, за! Только где я их хранить буду ?:)
>
> PS Бинарники или сорцы? Или и то и это?
И то, и это...

   2005-01-18 08:22:46 (#299275)

Re: Sisyphus

Kolotov Alexandr wrote:

>Заказываем subj... 3 DVD (750р)... кто с нами?
>
>
>
Я, за! Только где я их хранить буду ?:)

PS Бинарники или сорцы? Или и то и это?

   2005-01-18 07:10:48 (#299256)

Re: Sisyphus

В сообщении от 17 Январь 2005 14:30 Kolotov Alexandr написал(a):
> Заказываем subj... 3 DVD (750р)... кто с нами?

Я!

   2005-01-18 00:17:52 (#299149)