понедельник, 7 марта 2011 г.

Повторяемые задания

Встретился с интересной задачкой.
Есть список некоторых заданий. Что это за задания нам не интересно, главное что они как-то распределены во времени.
Существуют два типа заданий:
  • разовые;
  • повторяемые.
Каждое из них, думаю, допустимо описать парой: (дата окончания, паттерн повторяемости), где:
  • дата окончания - дата, до которой данное задание должно быть выполнено, включительно;
  • паттерн повторяемости - шаблон по которому создаются новые задания. Задание разовое - пуст, повторяемое - имеет свою структуру:
    • тип повторяемости - один из вариантов: 'ежедневно', 'еженедельно', 'ежемесячно', 'ежегодно';
    • повторять через - число дней/недель/месяцев/годов;
    • длительность задания - d-дней, m-месяцев, y-лет.
Думаю с разовыми заданиями все очевидно, задание необходимо выполнить до указанной даты окончания,  больше оно нас не будет тревожить. Что же касается повторяемых заданий, то тут есть проблемы.
На самом деле, повторяемое задание - это одно разовое задание, которое нужно выполнить до указанной даты окончания и шаблон по которому будут созданы новые разовые задания. Вопросы, связанные с повторяемыми заданиями, которые нас будут интересовать:
  1. Как определить, необходимо ли сегодня (DD.MM.YY) создавать новое разовое задание для некоторого повторяемого ? Будем считать, что задание может быть создано за 1 день до официального начала.
  2. Как назначить дату окончания нового разового задания ?

пятница, 20 августа 2010 г.

Sikuli играет в игру LPairs

Sikuli - инструмент для автоматизации работы с элементами GUI, играет в LPairs (простую игру для укрепления памяти).

Скрипт

четверг, 5 августа 2010 г.

Параллельное выполнение команд: GNU Parallel

Проект GNU Parallel развивается с 2007 года и представляет собой утилиту для выполнения задач в shell параллельно в текущей и/или удаленных системах. Задачи формируются из скриптов и команд операционной системы, и параметров (или частей команд) из стандартного ввода. В этом GNU Parallel похож на xargs, в задачи которого входит формирование команд из данных со стандартного ввода, по заявлению разработчика, GNU Parallel даже имеет схожие с xargs опции.
Схожесть с xargs позволяет использовать GNU Parallel в ранее созданных скриптах, в сложных конвейерах, используя все предоставленные ресурсы имеющихся систем (ядра/процессоры текущей или удаленных многоядерных/многопроцессорных систем).

среда, 7 июля 2010 г.

Утилиты для аудита исходных кодов: Graudit, RATS

Бесспорно полезно проводить аудит исходных кодов с целью выявления потенциально проблемных и опасных участков кода. В случае, если эта операция автоматизирована при помощи какой-то утилиты, то также это не отнимет много времени.
Пробовал я утилиты для автоматизированного аудита исходных кодов на задачах 1-го курса университета (ЯП c), расположенных в ~/1-course.

суббота, 24 апреля 2010 г.

Стул в Blender из скрипта на python

Задача
Нарисовать стул в Blender из скрипта на python.
Решение
from Blender import *

# Clean scene
def newactivescene():
    sc = Scene.New()
    oldsc = Scene.GetCurrent()
    sc.makeCurrent()
    Scene.Unlink(oldsc)
    return sc

sc = newactivescene()

# Camera
camera = Camera.New()
camob = Object.New('Camera')
camob.link(camera)
sc.link(camob)
camob.setLocation(3.5,-5,5.8)
camob.setEuler(60*2*3.14/360,0,30*2*3.14/360)
sc.setCurrentCamera(camob)

# Lamp
lamp = Lamp.New('Sun')
lampob = Object.New('Lamp')
lampob.link(lamp)
sc.link(lampob)
lampob.setLocation(2,-2.5,7)
lampob.setEuler(60*2*3.14/360,0,30*2*3.14/360)

# Legs height, weight
height = 1.9
weight = 1.8
# Legs
sc.objects.new(Mesh.Primitives.Cylinder(100,0.5,height)).\
setLocation(-weight/2,weight/2,height/2)
sc.objects.new(Mesh.Primitives.Cylinder(100,0.5,height)).\
setLocation(weight/2,weight/2,height/2)
sc.objects.new(Mesh.Primitives.Cylinder(100,0.5,height)).\
setLocation(weight/2,-weight/2,height/2)
sc.objects.new(Mesh.Primitives.Cylinder(100,0.5,height)).\
setLocation(-weight/2,-weight/2,height/2)
# Seat
sc.objects.new(Mesh.Primitives.Plane(weight+0.5)).\
setLocation(0,0,height)
# The back of
ob = sc.objects.new(Mesh.Primitives.Plane(weight+0.5))
ob.setLocation(0,(weight+0.5)/2,height+(weight+0.5)/2)
ob.setEuler(90*2*3.14/360,0,0)

Window.RedrawAll()

воскресенье, 11 апреля 2010 г.

Удаление содержимого html по маркеру в тегах на языке python

Задача
Оставить в строке, содержащей html код, всё кроме содержимого тегов (и самих тегов) помеченных определенным маркером ("ignoremarker").

четверг, 4 февраля 2010 г.

Stunnel выручил

Преамбула
Обслуживая один удаленный веб-сервис с доступом only HTTP, решил изменить (не без оснований) настройки cookies. В частности, переключил настройку cookies с cookies over HTTP на only secure cookies (over HTTPS).