понедельник, 15 апреля 2013 г.

Список имен всех контроллеров в Django

Относительно недавно решил интересную задачу.
Дано: достаточно объемное приложение на Django. Нужно: собрать имена всех контроллеров по файлам urls.py.

Решение:
get_viewname_list.py

суббота, 5 января 2013 г.

Оптимизация производительности Javascript (Предварительное вычисление функций).

Метавычисления и вычисления в computer scince - это как алгебра и арифметика. Если обычная арифметика оперирует конкретными числами, то алгебра - переменными, которые по своей сути являются абстракцией от чисел. Если при обычных вычислениях в процессе выполнения кода исполнитель (интерпретатор кода) оперирует конкретными значениями, то при метавычислениях - абстрактными типами. Есть всего три самых популярных задачи метавычислений: специализация программ, их композиция и инверсия. Все они легко ищутся в сети. Остановимся на специализации, которая заключается в изменении исходного кода программы с учетом входных данных, например из программы которая считает квадратный корень положительного числа можно получить программу, которая будет считать квадратный корень 0 или 4. Код будет меньше и быстрее, но будет считать только для 0 и 4.
Браузерный Javascript - вещь тормознутая и это очевидно. Есть старый прием, когда для "тяжелых" по скорости функций используют кэширование. Прием простой и эффективный, декоратор кэша на js пишется легко и не принужденно. Но, мне почему захотелось пойти дальше и просчитывать результат функции ДО её выполнения. Т.е. при выполнении кода уже у клиента, вместо выполнения функции будет просто возвращаться заранее просчитанный результат из массива. Конечно, такой трюк возможен, только при известных заранее аргументов этой функции, что далеко не всегда, но все же. В итоге мы получаем прирост (увы, не всегда) в скорости при увеличении объема кода.
Написав, опять же на Js, небольшой код, который бы по переданной в виде Plain Text'а кода функции возвращал код вычисленной функции начал все это тестировать. И вот в чем беда: в Js мало того, что плохо с математикой, работой с DOM (все очень медленно), так еще и работа с массивами тоже не ахти.
Ниже логи для моих браузеров (код оптимизированной функции преводить не буду, ибо здоровый он очень):

Source:
function(x1, y1, x2, y2){return 1 + Math.pow(Math.sin((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)),2)}

Chrome:
Time without pre-optimisation: 290

Build Time (template "{}"): 756

Time with pre-optimisation: 161

Build Time (template "[]"): 689

Time with pre-optimisation: 137

Firefox:
Time without pre-optimisation: 262

Build Time (template "{}"): 1122

Time with pre-optimisation: 116

Build Time (template "[]"): 851

Time with pre-optimisation: 80


Opera:
Time without pre-optimisation: 151

Build Time (template "{}"): 1012

Time with pre-optimisation: 71

Build Time (template "[]"): 660

Time with pre-optimisation: 87

Сама ссылочка на тесты: Тык

На днях надо написать UI к этому всему.

суббота, 15 декабря 2012 г.

hobbit - управляй браузером на любимом языке.

Вспомнил тут я про этот блог. Решил что-нибудь написать.
Неделю назад вернулся из Новосибирска (город сам практически не видел, но Академгородок - это просто рай) с hackday. В двух словах: hackday - 48 часовой хакатон. На этом хакатоне мы с командой реализовывали интересную идейку - удобное управление браузером на любом языке программирования. Зачем это вообще надо? Люди - существа ленивые и любят все что можно и даже нельзя автоматизировать, что бы пока они спят\работают\отдыхают скрипт за них делал какую-то работу, которая так или иначе приносила им доход. Т.к. я уже несколько лет занимаюсь автоматизацией, то большинство плюсов и минусов успел испытать на себе. Есть отдельный класс задач автоматизации: автоматизация действий пользователя в браузере: браузерные игры, различные веб-приложения и т.п. Как и для большинства задач автоматизации действий пользователя быстрый старт можно осуществить с AutoIt. Но, возникают траблы, если сайт использует AJAX (не сможешь работать только с сорцами страницы), если нужна фоновая работа с браузером (не мешать пользователю заниматься своими делами). Последнюю подобную задачу я решил тоже с использование autoit, но без всяких там мышко/кнопко-жамканьем и анализом цвета пикселей (ИМХО, но это не кошерные вещи). Суть решения такова: в хроме через адресную строку выполняется Js-код (благо, на сайте был jQuery), который дергает инфу и жамкает кнопочки. Инфа возвращалась через обычный prompt, который скрипт на autoit закрывал. Извращение еще то, но плюсы есть: получение инфы независимо от положения и размера окна браузера. Минусы тоже существенны: нет перехвата событий на странице, вкладка должна быть активна да и вообще комп используется монопольно скриптом. Скрипт работает, код простой, все довольны. Тут мне и пришла идея - использовать расширения (плагины) хрома для работы со страницей. Их минус: есть доступ только к браузеру (например нельзя дернуть емайл и отдать его скрипту, который отправит письмо), писать можно только на Js. Плюсы: просто шикарное API, перехват событий, работа с фоновые вкладками (вообще никак не будем мешать пользователю).
Поэтому и возникла идея hobbit - плагина, который будет проксей между браузером и внешним кодом. Т.о. получаем плюсы плагинов и плюсы внешнего кода в одном флаконе.
Общая архитектура или как взаимодействуют между собой плагин и внешний код. Взаимодействие идет по двум каналам: через localStorage плагина и через WebSocket. Первая способ провалился, т.к. хром грузит содержимое local storage в ОЗУ при запуске и больше ничего не читает из него до следующего запуска. Второй путь: Плагин представляет собой WebSocket клиент, который общается с WebSocket сервером, поднятым на localhost. За 48 часов мы хотели реализовать два сервера: под винду в виде dll и под линь в виде демона. В итоге, завелся только сервер под винду (dll на C#).
В качестве примера за десять минут набрасали на C# виджет для управления плеером Вконтакте. Все работает как надо (хотя от вида кода я плакал кровавыми слезами).
Планы на текущий момент: переписать dll и нарастить функционал.
Сцыль (только сорцы плагина, нет самой длл-ки): hobbit

четверг, 23 февраля 2012 г.

Модификация программ с закрытым исходным кодом.

В общем надо было по учебе сделать видеоролик какой-нибудь. Поэтому было зашпилено вот это:

Тык

понедельник, 2 января 2012 г.

Парсинг Ifolder.ru

Скинули мне недавно файлики через ifolder.ru. Вид ссылки примерно такой: "http://ifolder.ru/12345678" То есть номер файла задается через вот эти самые чиселки. Потыкав наугад пару ссылок, меняя это число, обнаружил, что возможны два случая:

1. Файл удален, т.к. его давно никто не скачивал.

2. Файл лежит на сервере.

Just for fun сделал скрипт на Python, который бегал по ifolder и ссылки писал в файл.

Сорцы

Выдернутые файлы

среда, 3 августа 2011 г.

Стрелки - формулы для координат.

Недавно понадобилось рисовать стрелки в программе (4fun среда для моделирования с преферансом и поэтессами), проблема - зная две точки - начало и конец отрезка, нарисовать стрелку. Решение ниже.

Итак, дано:

Даны точки (x0 ; y0) и (x1 ; y1). Дан угол между отрезками (для удобства вычислений взят 45 градусов). Дана длина мелких отрезков. Нужно найти координаты (x3 ; y3) и (x4 ; y4).

Находим угловой коэффициент прямой, проходящий через точки (x0 ; y0) и (x1 ; y1):

Делаем выкладки, для угловых коэффициентов прямых (x1 ; y1)(x3 ; y3) и (x1 ; y1)(x4 ; y4) :

Обозначим длину отрезка (x1 ; y1)(x3 ; y3) как L. Зная это L и r, можем найти x:



Теперь легко найти y:


Как видно, получили для (x3 ; y3) (x4 ; y4) по две пары точек. Нам нужно взять из них ближайшие к точке (x0 ; y0). Т.е. оценить расстояния:

Или, упростив:

Алгоритм


Берем такие (x3 ; y3) и (x4 ; y4), при которых минимально

и

соответственно.

P.S. Все картинки кликабельны.


понедельник, 16 мая 2011 г.

Удаленное управление

Мда... Давно не писал. В-общем решил запостить небольшую программку, которую использую на работе. Итак, ситуация: есть компов 50, у каждого уникальное имя, все введены в один домен и соответственно находятся в одной подсети. Есть рутинные задачи - почистить мусор на жестких дисков, собрать информация о конфигурации и т.п. Есть батники, которые это делают.

Итак, как это работает.

1. Берем один комп из всех, монтируем общий для всех сетевой диск. В файлике comps.txt вбиваем имена компов, на которых нам нужно выполнить батник.

2. Редактируем батник BAT.BAT, который будет запускаться на каждом компе. Можем в нем вызвать другой.

3. Запускаем на этом компе батник START.BAT

Как это устроенно:

START.BAT

@echo off
psexec @comps.txt -u login -p password -C RUN.EXE
pause

Параметры

@comps.txt - отсюда psexec берет имена компов

-u login - логин пользователя, под которым логинимся.

-p password - его пароль

-с run.exe - копируем run.exe на удаленную машину.

RUN.EXE

Две строчки кода на AutoIt.

RunWait("cmd /c net use X: \\dc01\xchange")

;Монтируем сетевой диск

Run("X:\RBAT\bat.bat")

;Запускаем с сетевого диска батник

Пример BAT.BAT:

rem hostname >> X:\RBAT\IP.txt
rem dir c: /b >> X:\RBAT\IP.txt
rem shutdown /s
X:\test.bat

Думаю все понятно.

Скачать