2012/04/23

PowerShell - путь к успеху

PowerShell - некое расширение cmd.exe, плотно взаимодействующее с .NET, позволяющее выполнять различные команды и тем самым автоматизировать работу в системе. Есть возможность удаленного подключения во второй версии, прямо как SSH!
Правда сам язык команд крайне сложен в понимании, а справка организована весьма плачевно. Тем не менее, это уже хоть что-то.

В современных виндоусах он присутствует по умолчанию, в старых версиях же придется немного попотеть, доустановив нужные компоненты:
1. NET. Framework 2.0 SP1
2. Windows Management Framework Core

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

Для того, чтобы иметь возможность подключаться к компьютеру удаленно через PowerShell, нужно для начала активировать эту возможность:
Enable-PSRemoting
Кроме того, нужно быть в списке доверенных хостов, по умолчанию там никого нет. Не будем долго запариваться и разрешим всем хостам соединяться:
Set-Item WSMan:\localhost\Client\TrustedHosts *
Ну и последним сюрпризом стало то, что просто так скрипты не запустишь, их выполнение либо совсем отключено, либо они должны быть подписаны! Для устранения этого недостатка просто изменим политику:
Set-ExecutionPolicy Unrestricted
После всех этих манипуляций наконец-то придем к успеху - удаленному запуску скриптов на машине с PowerShell:
Invoke-Command -ComputerName "mycomfyserver" -credential Administrator -FilePath D:\myscript.ps1

2012/04/17

Шифрование AES с помощью pycrypto

Pycrypto - весьма удобный модуль, в котором реализованы различные схемы шифрования. Вот простой пример, как можно шифровать и расшифровывать данные с помощью симметричного AES:
from Crypto.Cipher import AES
import base64
import os

# размер блока шифрования
BLOCK_SIZE = 32

# символ, использующийся для дополнения шифруемых данных
# до размера, кратного 32 байтам
PADDING = '{'

# функция дополнения
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING

# функции шифрования и расшифрования
# результат дополнительно обертывается в base64
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)

# генерируем ключ
secret = os.urandom(BLOCK_SIZE)

# создаем объект
cipher = AES.new(secret)

# шифруем строку
encoded = EncodeAES(cipher, 'password')
print 'Encrypted string:', encoded

# расшифровываем строку
decoded = DecodeAES(cipher, encoded)
print 'Decrypted string:', decoded
Как видно, все достаточно просто, а главное полезно. Таким образом можно шифровать трафик, конфиги с критичной инфой или что-то ещё. При этом конечно необходимо как-то защитить сам ключ, например, скомпилировав скрипт в бинарник и навесив на него всяческих коварных крипторов.

2012/04/10

Python и перенос строк в файлах

Многим известно, что в разных системах перенос строки в файлах обозначается разным образом. Например, в Windows это CR+LF (0x0d + 0x0a), а в *NIX это просто LF.
Самое интересное, когда нам нужно в винде сформировать файл с переносами строк под линукс или наоборот.
Представим, что мы открыли файл в режиме w, что я делаю обычно на автомате.
Если мы будем писать типа file.write('qwerty\n'), то в файл запишется CR+LF. Аналогично произойдет, если заменить \n на \x0a. А если писать просто file.write('qwerty'), то никакого переноса не будет. Оказывается открывая файл в режиме w при записи строки к ней автоматически добавляется перенос строки в системном формате.

В этом случае нам поможет открытие файла в бинарном режиме, то есть wb. Тогда никакого безобразия с добавлением виндовых переносов строк не происходит и мы можем со спокойной совестью писать file.write('qwerty\n').

2012/02/20

HOWTO: Взломать Wi-Fi за 10 часов

В грядущем номере журнала Хакер выходит мой материал по взлому Wi-Fi. Не пропустите!

2012/01/24

Конвертация MyISAM -> InnoDB

По мотивам предыдущего поста. :))
В интернете много всяких заметок по поводу преобразования MyISAM в InnoDB: и с помощью всяких скриптов, и утилит типа mysql_convert_table_format, и даже с помощью sed. Но нам сложности не нужны, поэтому предлагаю самый простой вариант. Во-первых, остановим сервер:
# /etc/rc.d/mysql-server stop
Затем нужно убедиться, что в конфиге /etc/mysql/my.cnf нет строчки skip-innodb, а также присутствует строчка типа:
innodb_data_file_path = ibdata1:100M:autoextend
Затем логинимся в консоль MySQL:
mysql -u <username> -p
И вводим команду:
ALTER TABLE <tablename> ENGINE='InnoDB';
Вот и всё! Моя гиговая табличка преобразовалась за шесть минут.

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

2012/01/12

Восстановление MySQL MyISAM

Если у вас в логах внезапно начали появляться ошибки типа "Table './mybd/cw_table' is marked as crashed and last (automatic?) repair failed", то значит наш дорогой MyISAM дал сбой. А так как автовосстановления в нем не предусмотрели, то придется вручную нам это сделать. Во-первых, остановим сервер mysql:
# /etc/rc.d/mysql-server stop
Воспользуемся утилитой myisamchk для восстановления таблицы с ключом -r, что означает recovery:
# myisamchk -r cw_table
Это помогает в большинстве случаев. При запущенных случаях, если посыпались много таблиц, то можно проверить всю базу целиком:
# myisamchk --silent --force --fast --update-state /var/lib/mysql/mybd/*.MYI
Если сбои произошли в результате смерти жесткого диска и файлы восстановлялись с помощью черной магии, то вместо опции --fast лучше задать --medium-check или же --extended-check, если времени вагон / небольшие таблицы / мало индексов.

2011/12/15

Задачи на собеседованиях

В декабрьском номере журнала Хакер под моим чутким руководством стартовала новая ежемесячная рубрика про задачи на собеседованиях. Прошу высказывать здесь все пожелания и замечания!

Предложения по задачам для последующих выпусков складывайте сюда же.

2011/11/08

Экспресс курс по сортировкам или вспомнить всё

1. Пузырьком О(n^2). Два вложенных цикла, во внутреннем сравниваются пары соседних элементов, начиная с нижних. Таким образом за один проход внутреннего цикла получаем один отсортированный элемент на своем месте.

2. Выбором О(n^2). В исходном массиве ищем наименьший элемент и меняем его с первым. Далее повторяем эти шаги с подмассивом исходного, куда не входит уже отсортированный первый элемент.

3. Вставками O(n^2). Все элементы условно разделяются на готовую последовательность a1 ... ai-1 и входную ai ... an. Hа каждом шаге, начиная с i = 2 и увеличивая i на 1, берем i-й элемент входной последовательности и вставляем его на нужное место в готовую.

4. Шелла O(n log^2 n). Некая модификация сортировки вставками: здесь сначала сортируется не весь массив, а группы элементов, отстоящих друг от груга на некоторое расстояние d. Это расстояние постепенно уменьшаем и доходим до того, что сортируем опять же весь массив. Например, для массива 16 элементов разумно выбрать начальное d = 8, а потом уменьшать его в два раза. Сначала будет сортироваться 8 групп по 2 элемента, потом 4 группы по 4 и так далее.

5. Пирамидальная O(n log n). Из исходного массива сначала строится пирамида. Она является так же сбалансированным деревом и обладает свойством, что каждый элемент меньше либо равен родителю. Это дерево легко вписывается в массив, если вписывать элементы по порядку - слева направо и сверху вниз. Далее первый элемент (максимальный) меняем с последним (минимальным) и забываем его, т.е. не учитываем в пирамиде. Перестраиваем пирамиду согласно свойству, т.е. просеиваем первый элемент вниз. Повторяем шаги пока пирамида не иссякнет.

6. Быстрая O(n log n). Из массива выбирается некоторый опорный элемент a[i]. Запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные a[i], влево от него, а все ключи, большие, либо равные a[i] - вправо.
Теперь массив состоит из двух подмножеств, причем левое меньше, либо равно правого. Для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру.

7. Поразрядная O(nk). Итак, в этом алгоритме у нас есть некие вспомогательные списки, называемые карманами. Их количество равно разрядности данных, например, для человеческих чисел = 10. Вначале они пустые и в них добавляются элементы нашего массива согласно значению первого разряда. Далее полученные списки склеиваются, и операция повторяется над полученным массивом, но только со 2 разрядом. И далее вплоть до максимального разряда самого длинного числа.

2011/10/20

Matplotlib - анимация в реальных условиях

На сайте проекта - http://matplotlib.sourceforge.net/examples/index.html - даны базовые примеры анимации с графиками, которые, как обычно бывает, плохо работают в боевых условиях. Например, у меня имеется прога на GTK, с отдельным потоком, где производятся все вычисления для графиков. По-хорошему, там же и надо вызывать функцию перерисовки, но не тут-то было!

Иксы выкатывают мне неведомую ошибку:
The program 'panel.py' received an X Window System error. This probably reflects a bug in the program. The error was 'BadDrawable (invalid Pixmap or Window parameter)'. (Details: serial 6974 error_code 9 request_code 62 minor_code 0) (Note to programmers: normally, X errors are reported asynchronously; that is, you will receive the error a while after causing it. To debug your program, run it with the --sync command line option to change this behavior. You can then get a meaningful backtrace from your debugger if you break on the gdk_x_error() function.)
Я так и не понял почему такое может происходить, поэтому начал искать другой способ запуска функции через определенный промежуток времени. В этом мне помог такой кодес:
import gobject
gobject.timeout_add(1000, self.animate)
 Такой замес тупо вызывает функцию animate каждую секунду. Все довольны!

2011/10/07

Подключение некоторых Android 2.3 based устройств к Linux

Не знаю уж почему так делают, но на некоторых прошивках Android 2.3 при подключении к компу устройство по умолчанию распознается как модем, а не как флешка, что сопровождается подобными деферамбами dmesg:
[81405.955234] usb 2-2: new high speed USB device number 7 using ehci_hcd
[81406.098927] cdc_acm 2-2:1.0: This device cannot do calls on its own. It is not a modem.
[81406.099041] cdc_acm 2-2:1.0: ttyACM0: USB ACM device
На этом всё, то есть как флешка оно не определяется. Итак, чтобы исправить это, заходим в телефон и набираем номер *#7284#, выскочит некая PhoneUtil, где и надо выбрать в обоих случаях пункт PDA. Вот и всё, теперь андроид монтируется как в старые добрые времена.