воскресенье, 12 декабря 2010 г.

атаке подвергся репозиторий Free Software Foundation

Веб-интерфейс к репозиторию FSF был восстановлен после атаки на сервер в прошлые выходные, где хранятся материалы для сайта gnu.org. Атакующими были загружены все имена пользователей и их зашифрованные пароли. Как заявил Matt Lee, один из менеджеров FSF, программное обеспечение проекта GNU не подверглось каким либо вредоносным воздействиям со стороны атакующих.
Админстраторы хостинга откатили все изменения, начиная с 23 ноября. Разработчики, использующие репозиторий FSF, могут загрузить свои изменения из локальных копий, однако должны сменить пароль.
Сама атака произошла 24 ноября при помощи SQL-инжекта, направленного против багтрекерной системы Savane. Атакующие смогли создать новую учетную запись администратора и изменить домашнюю страницу gnu.org
Кроме того, атакующие нашли директорию с правом записи и поместили в нее шелл для дальнейшего доступа. Однако, в FSF надеются, что атакующие не смогли получить root-доступ к самому серверу.
Стоит отметить, что недавно атаке, в ходе которой была скомпрометирована база данных логинов и паролей, вместе с сайтом также подвергся сервер Apache Software Foundation.

суббота, 6 ноября 2010 г.

Python:алгоритм бинарного поиска

Идея этого алгоритма проста(работает на отсортированных массивах\списках):
Сначала высчитываем индекс среднего элемента по формуле (m+n)//2.Где n это индекс начального элемента, а m количество элементов в массиве  В случае нечетного числа элементов округляем до ближайшего целого полученный результат. А дальше уже смотрим  что получается:
а) Элемент найден и мы возвращаем его индекс 
б) Средний элемент меньше ключа поиска 
в) Средний элемент больше ключа поиска 
В случае б) мы должны отсечь те элементы которые меньше среднего, то есть правую часть массива\списка. Дробится этого можно приняв за начальную границу поиска первый элемент со значением больше чем средний элемент, а у нас массив\список сортированный значит это элемент с индексом  i+1, где  i индекс среднего элемента. а конечная граница поиска последний элемент. в случае в) нам нужно принять за начальную границу первый элемент меньший среднего, а значит нам нужен элемент с индексом i-1.  Как конечная граница поиска естественно принять индекс первого элемента. Итак весь процесс будем повторять пока не выполниться любое из трех условий:
1) Элемент найден 
2) Начальная граница стала равна наибольшему элементу массива
3) Начальная граница стала равна индексу наименьшего элемента.
Самый положительный для нас случай 1.Преимущество алгоритма в том что при каждом сравнении убавляется половина отрезка, где происходит поиск элементов.
Краткое описание алгоритма:
1. Взять  индекс первого  элемента (n)
2. Взять индекс конечного элемента (длину массива ) (m)
3. Рассчитать индекс среднего элемента по формуле (m+n)\2 (i)
4. Сравнить средний элемент с ключом
4a Пока 0<=i
5а Если ключ = =элементу в выходим из программы
5б Если ключ>элементу,то n=i+1 m=len(l)
5в Если ключ<элементу, то n=i m=i-1  
6. Переходим к шагу 4a      
А вот и код на python,реализующий алгоритм:
def  quick_sort(l,k):
    m=len(l)
    n=0
    i=(m+n)//2
    while 0<=i
        if l[i]==k:
            return i
        elif  l[i]
            m=len(l)
            n=i+1
        elif  l[i]>k:
            m=i-1
            n=i
        i=(m+n)//2  
    return None  

воскресенье, 31 октября 2010 г.

Python: списки




Обойти вниманием такой тип данных языка Python нельзя.
Списки это последовательность элементов. Данный тип данных относится к изменяемым. Фактически список это структура данных которая реализует хорошол известную структуру данных в программировании: связный список.
Список как структура данных Python поддерживает следующие операции:
append (a)--вставка элемента любого типа в конец списка    
extended(a)--присоединяет в конец  списка другой список переданный параметром функции
count(a)--подсчитывает количество элементов c значением a
index(a)--возвращает индекс искомого элемента или возбуждает исключение ValueError
insert(i,a)--вставить объект  a произвольного типа в позицию i
remove(a)--удаляем элемент со значением a
pop()--удаляем у списка последний элемент и считываем его в переменную имитируя поведение стека.
reverse-переворачивает список, т.е. первый элемент меняется местами с последним и т.д.
sort-сортируем список
Еще список позволяет брать срезы:
a=range(10)#генерируем список из 10 значений от 0 до 10(исключая 10)

 a[1:5]#берем срез с 1 по 5 элемент
[1, 2, 3, 4]
 a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Обратим внимание что первый элемент имеет индекс 0, а не 1!
Кроме того мы можем брать срезы с определенным шагом:
 a[1:5:2]#выбираем каждый второй элемент начиная с 1-го и до 5-го
[1, 3]
А если хотим получить весь список:
 a[:]#выбираем все элементы списка
Все элементы начиная с 1-го
 a[1:]#выбираем все элементы списка начиная с 1(по умолчанию шаг 1)
 [1, 2, 3, 4, 5, 6, 7, 8, 9]
Все элементы с шагом 2:
 a[::2]
[0, 2, 4, 6, 8]
Но Python предоставляет нам дзен-возможности: отрицательные индексы:)
выберем последний элемент:
a[-1]
9
А такой срез нам даст пред предпоследний и предпоследний:
a[-3:-1]
[7, 8]
Ну и весь список в обратном порядке:

a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Пара слов о срезах. Срезы это общий инструмент для всех последовательностей. Срез это независимый объект от первоначального, точнее копия выбранной части. Проверим это:
a=range(10)
asl=a[0:3]
for i in xrange(0,len(asl)): #здесь применена функция xrange, которая возвращает нам #итератор по объекту xrange. Хrange генерирует цифру только во время обращения, чем #экономится память и время выполнения
asl[i]=asl[i]*3

asl
[0, 9, 6]

a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Как видим изменения внесенные в срез никоим образом не затронули исходный объект.
А вот если мы присвоим двум переменным одинаковый список таким образом:

 a=b=range(10)
 a[1]=a[1]*10
 a[1]
10
 a
[0, 10, 2, 3, 4, 5, 6, 7, 8, 9]
 b
[0, 10, 2, 3, 4, 5, 6, 7, 8, 9]
Этот интересный результат связан с тем что в данном случае произошло так называемое поверхностное копирование объектов. Так как в python все переменные это на самом деле ссылки, то когда python обрабатывает присвоения вида: a=b=4 то он прост связывает с именами a и b одну и ту же ссылку
А если мы напишем так:  


a=range(10)
b=range(10)
a[1]=a[1]*10
a
[0, 10, 2, 3, 4, 5, 6, 7, 8, 9]
b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


 То все стандартно так как Python свяжет с каждым именем свою собственную ссылку.
В список можно вкладывать списки и любые другие объекты. Наиболее быстрые операции это pop и append, а вставка элементов и их удаление из середины займут больше времени из за перенастройки указателей в списке.

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

Python: типы данных.

Здесь я решил собирать небольшие записки путешествия по миру python +примеры. И начнем мы его с типов данных. Python это язык типизированный, но сама система типизации в нем динамическая. Что это для нас значит?   Это значит что в одной и той же переменной мы можем совершенно спокойно хранить: числа, строки,кортежи, списки и ваши собственные типы данных. Кошмар:)И например такие строки совершенно нормально воспримет интерпретатор:
 a='Stroka'
a=1
a=[4,3]
Как такое возможно ? Вся тонкость в том чтобы понять что такое переменная в python: это не жестко статически выделенная область памяти, а динамически распределяемая область памяти, которая реализована за счет не типизированных указателей С. Именно поэтому python может свободно жонглировать типами данных, приводя переменную к нужному типу данных по мере необходимости.
А зачем же типы? А они нужны затем, что для каждого типа данных определен свой собственный набор операций и то что например вполне корректно для числа будет совсем некорректно для списка или кортежа.
Так же важно помнить, что python делит все типы данных на две категории:
1. Изменяемые
2. Неизменяемые
На всякий случай поясню: если мы создаем объект первого типа, то мы можем его изменять целиком или отдельные части и мы будем работать все с тем же объектом.
А вот со вторым типом объектов такие штучки не пройдут.
Продемонстрируем это на примере работы с двумя одинаковыми по содержанию коллекциями, но одна из них это список (изменяемый тип данных), а вторая кортеж (неизменяемые объекты).
am=[1,2,3,4]
aim=(1,2,3,4)
for i in xrange(0,len(am)-1):
     am[i]=7*am[i]
 print am           
В результате нам спокойно покажут:
>>>
[7, 14, 21, 4]
Но стоит нам добавить такие строки в скрипт:
 for i in xrange(0,len(am)-1):
     aim[i]=7*aim[i]
print aim
Как Python нам сообщит:
Traceback (most recent call last):
  File "/home/abc/блог/PyMutInmut.py", line 7, in
    aim[i]=7*aim[i]
TypeError: 'tuple' object does not support item assignment  
Собственно и произошло то о чем говорилось ранее: нельзя в неизменяемых объектах менять отдельные части,
Зачем так было придумано? Логика в этом есть и неплохая между прочим, неизменяемость объектов позволяет легче реализовывать, быстрее доступ к таким объектам на чтение но не на запись.Кроме того неизменяемые объекты нужны для функционального программирования, где воздействия на аргументы кроме возврата результата функции не допускаются.  
Здесь есть одна тонкость: неизменяемые объекты можно изменять!) Как ?Ну например так:
stri='hel'
stri=stri+'hel'
Произойдет прозаическая конкатенация строк. Однако заглянем за кулисы:
1) Python возьмет копию исходной строки+вторая
2) Пометит а потом и утилизирует (то есть уничтожит в памяти) исходную строку
3) Присвоит идентификатор новой строке.
То есть видите любая операция с неизменяемым объектом где он меняется порождает новый объект . Но на самом деле список и другие изменяемые структуры могут легко решить ваши проблемы по скорости записи и уступают по скорости чтения не намного.        

пятница, 22 октября 2010 г.

Gedit+FASM

Редактор Gedit я думаю в особых представлениях не нуждается:) И кроме всего прочего (а про прочее можно прочесть здесь) он позволяет подсвечивать синтаксис разных языков программирования. Чтобы включить этот режим достаточно выбрать:
Вид->Подсветка синтаксиса->...(нужный язык)
Итак что же мы имеем? Имеем мы много чего кроме ассемблера. Я остановил свой выбор на FASM(Flat Assembler). И заглянув на форум FASM-community обнаружил следующее: http://board.flatassembler.net/topic.php?t=6365 
Тем в топике не так уж и мало что вдохновляло, а с подсветкой синтаксиса FASM для Gedit была связана эта:http://board.flatassembler.net/topic.php?t=8523
Итак качаем файлики из темы. Это описания в формате xml лексем для ассемблера разновидности fasm. Эти файлы нужны для GTKSourceView. Это в свою очередь С-библиотека расширение для GTK, которое позволяет осуществлять многострочное редактирование текста, операции redo/undo   неограниченной глубины,регистронезависимый  поиск в тексте с кодировкой UTF-8, и прочие вещи специфичные для редакторов исходных текстов. Именно на этой библиотеке работает например Gedit,Anjuta(среда разработки для GNOME). Так вот, чтобы добавить возможности   подсветки нового синтаксиса в Gedit нам нужно распакавать файлики из темы, после чего кидаем в папку GTKSourceView по адресу: /usr/share или /usr/local/share или /user/gnome/share или /usr/X11R6/gnome/share  (у меня сработал первый путь ). Но здесь нас ждет засада: usr относится к системным папкам, которые Linux абы кому модифицировать не дает поэтому root спешит нам на помощь=)
И здесь есть два пути (точнее 3:)):
1) Пойти истинным Unix-way и копировать все командой sudo cp /path/to/your/file  /usr/share/ GTKSourceView/language-specs/asembly.lang
2)запустить nautilus из командной строки sudo nautilus
3) или его же запустить но немного иначе gksu nautilus
Далее когда вы скопируете файл asembly.lang  в language-specs,а в styles   oblivion2.xml останется только перезапустить gedit и возрадоваться.