Thursday, 19 March 2015

Google Code Project shutting down: namba-serials-downloader и diesel-api

Вот и пришел конец славному репозиторию на Google Сode. В свое время я там хостил два домашних проектика, в реальности простенькие скрипты. Но воспоминания о них греют мне душу ламповым теплом. Поэтому  я о них немножко расскажу, чтобы небыли забыты.


namba-serials-downloader
Как следует из названия - это штука для скачивания сериалов с намбы, когда то работала и позволяла смотреть мне сериалы, на моем клевеньком Nokia 5500. Вот это действительно лампово %) Все искомые паттерны вынесены в настройки, так что это оставляет шанс на работу скрипта и сейчас...наверняка с небольшими изменениями. Правда в эпоху скоростного интернета и ts.kg вряд ли это кому то нужно =)
Там даже в вике есть инструкция по пользованию =)

diesel-api
А эту штуку я использую до сих пор. С помощью нее я когда-то грабил корованы брутил пароли(набрутил пару тысяч пар, делая максимум 6 штук на логин), случайно устанавливал рекорд посещаемости, удалял массово сообщения и накручивал рейтинги себе и знакомым %)
В этом скрипте есть все: магические строки, примитивное кэширование, спагетти код! Но это все работает и приносит кучу фана! Пользуйтесь на здоровье!
Где-то должен быть еще метод для посылки личных сообщений, когда мне было не лень оповещать людей с небезопасными паролями, но он где-то потерялся.

Вообщем в связи c закрытием репозитория на Гугл коде, я пользуюсь встроенным механизмом переезда и переношу это все на github. Форкайте, чекауйте, пользуйтесь на здоровье!

PS А еще там была такая забавная штука, как evolution-mutation, за авторством Олега Пузанова и Андрея Похилько. Тоже забавно с ней поиграться :)

Sunday, 15 March 2015

Quicksort partitions

Зарубился я тут в сортировки. И даже отгреб от этого головную боль.

После того как написал Ламуто стало ясно, что он безбожно медленный. Решил проверить насколько. Вот оригинал:
int Partition(int *a, int l, int r) {
r--;
int pivot = a[r];
int i = l - 1;
for (int j = l; j < r; j++)
if (a[j] <= pivot)
swap(a[++i], a[j]);
swap(a[++i], a[r]);
return i;
}
view raw gistfile1.cpp hosted with ❤ by GitHub

Видно, что он плохо себя ведет на отсортированном массиве, постоянно вызывает swap на один и тот же индекс. Улучшим:
int Partition(int *a, int l, int r) {
r--;
int pivot = a[r];
int i = l - 1;
for (int j = l; j < r; j++)
if (a[j] <= pivot)
if (++i != j)
swap(a[i], a[j]);
swap(a[++i], a[r]);
return i;
}
view raw gistfile1.cpp hosted with ❤ by GitHub

А теперь сравним с Хоаром:
int Partition(int *a, int l, int r) {
int x = a[l], i = l - 1, j = r;
while (1) {
do j--; while (a[j] > x);
do i++; while (a[i] < x);
if (i < j)
swap(a[i],a[j]);
else
return j + 1;
}
}
view raw gistfile1.cpp hosted with ❤ by GitHub
А теперь глянем на время работы. Первый параметр размер проверяемого массива, второй seed для генератора случайного массива:
fryday@fryday-HP-ZBook-15:~/sorts$ time ./quick_sort_lamuto 5000000 1234
OK
real 0m39.338s
user 0m39.365s
sys 0m0.000s
fryday@fryday-HP-ZBook-15:~/sorts$ time ./quick_sort_lamuto_modified 5000000 1234
OK
real 0m16.236s
user 0m16.143s
sys 0m0.016s
fryday@fryday-HP-ZBook-15:~/sorts$ time ./quick_sort_hoare 5000000 1234
OK
real 0m0.780s
user 0m0.770s
sys 0m0.004s
view raw gistfile1.txt hosted with ❤ by GitHub
Вот так вот. То ли Ламуто - ламото, то ли я ламото  -- криво заимплементил %)