Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2011-05-31

counterclockwise

После ознакомления с адовой смесью используемых координатных систем в рамках описания одной полилинии, нижеследующее даже интереса не вызывает. Но, хоть и не вызывает, а я зафиксирую. Чтоб знали.

Как в AutoCAD формируется дуга? Вот цитата из соответствующей доки:

An arc is always drawn counterclockwise from the start point to the endpoint

Против часовой стрелки.
Забыли, правда, уточнить, что это справедливо только в пользовательской системе координат (UCS). В мировой это может быть и по часовой. А координаты точек, напомню, доступны только в мировой системе (WCS). Следовательно, прежде чем работать с дугой, все координаты надо перевести в UCS. Как и при работе с bulge.
UPD. был неправ. Правда тут.



Интересная фраза встретилась намедни, американизЪм:

sell down the river

означает — предательство, вызывающее большие траблы у преданного. Говорят, корни фразы в работорговле на Мисисипи (ниже по реке).

2011-05-28

И это всё о нём

А вот кому еще багофичу от Autodesk (из AutoCAD)?
Речь опять пойдет про bulge и экспорт координат из DWG. Напомню, знак (+ или -) булжа зависит от направления дуги: против часовой стрелки и по часовой, соответственно. Еще напомню, что через ActiveX API координаты доступны только в мировой КС (WCS), хотя для полилиний это неверно, как мы убедились :) Координаты узлов полилиний выдаются в обьектной КС (OCS).

А теперь вопрос: как вы думаете, для какой координатной системы будет выдан знак булжа? Абсолютная величина булжа, слава Аллаху, не зависит от КС.

Правильный ответ — знак булжа выдается для пользовательской КС (UCS)!
UPD. Нет, правильный ответ здесь. (OCS)

Лично у меня на этом месте поднимается волна протеста, где-то внутре. Ну как так можно — все координаты в WCS, но некоторые в OCS. А кривизна дуг в UCS?! А в чертежах, которые мне достались, такая уебищная UCS, что направление дуги меняется. И я, наивный, думаю что знак у булжа тоже поменяется — и наступаю на очередные грабли.

В итоге, чтобы обработать булжи, приходится координаты полилиний приводить из OCS к UCS, аппроксимировать дуги и результат приводить обратно к WCS. Что, бляха-муха, осложняется отсутствием матрицы преобразования UCS -> WCS. Есть только обратная.

Повбывавбы.

2011-05-27

We can't send mail more than 500 miles

Не знаю как вы, а я раньше не слыхал историю про электропочту, которая не ходит дальше, чем за 500 миль. Совершенно прекрасный анекдот, в старом значении этого слова.

Оригинал истории про 500 миль ibiblio.org/harris/500milemail
Оно же по русски rauf.livejournal.com/23552

И более всего в этой истории меня потрясло качество каналов связи. Стабильность показателей такова, что за определенное время письмо улетает на определенное расстояние. Время события между 1994 и 1997 годом! Да у нас в те времена по модему-на-POTS не каждый мог в Интернет выйти!

Даже сейчас, когда магистраль оптоволоконная (FTTB), я не могу похвастаться такой стабильностью каналов. Если бы эта истония произошла с нами, почта улетала бы все время на разные расстояния и было бы очень затруднительно сообразить — почему.


Вышел я на эту замечательную историю отсюда:
habrahabr.ru/blogs/webdev/117053
где рассказывается о как бы чуде. По моему это чудо называется — отсутствие проверок, в конечном счете — детерминированности. Каких только чудес не насмотришься после срыва стека у некачественной программы, огромные коллекции вирусни наглядно демонстрируют спектр.
Это не чудо, это лажа. Поэтому программы и отлаживают — избавляют от лажи :)


Кстати, про чудеса - пытаясь опубликовать этот пост, я не смог залогинится в админку блога через браузер Chrome. Блогоплощадка - Гугель, браузер - Гугель. В почту логинюсь, в блог - не пущаить. За час до того хром обновился. Вчера пускал.
Файерфокс прекрасно запустил меня в блог и дал опубликовать этот пост.
Чудо?

2011-05-26

keepass

Помнится, некоторое время тому, я пробовал в деле KeePass2. На работе под виндой он прекрасно себя зарекомендовал, а вот дома под Дебианчиком стал глючить неподецки. Поэтому для дома я взял KeePassX. Не без гемора, но файлы друг друга они понимают.
И вот, намедни, торкнуло меня попытаться еще разок запустить KeePass2 под Mono в Линуксе. Полез на сайт за свежей версией, а там в «последних новостях» эдакое:
Introducing Debian/Ubuntu package
Опаньки. И точно, сварганили deb-пакет. Поставил я его на свой squeeze
gdebi keepass2_2.15+dfsg-2_all.deb
и хранилка неожиданно показала, что время не стоит на месте. Резюмирую — КиПасс2 под Линуксом работает. Подглючивает местами, но уже не смертельно. Для операций «открыть-взять пароль» вполне годидзе.

Прогресс не остановить!

keepassx.org
keepass.info
sourceforge.net/projects/keepass/forums/forum/329220/topic/4503818
packages.debian.org/sid/all/keepass2/download

2011-05-25

Тонкости архитектуры

Оно конечно, у всех свои резоны делать так а не иначе. Но некоторые резоны бывают сильно неочевидны.

Вот возьмем простую функцию GetUCSMatrix() реализованную в ActiveX AutoCAD (дада, я все еще мудохаюсь с автокадом, вроде дело идет к победе через измор). В доках видно, что это метод интерфейса IAcadUCS, который берется из Document.ActiveUCS. Ну а документ — это интерфейс чертежа. Итого имеем:
acad.ActiveDocument.ActiveUCS.GetUCSMatrix()
Прекрасно. Применяем на практике — облом.

Дебаг показывает, что обьекта ActiveUCS в чертеже нет. Как же так, ведь видно невооруженным глазом, что ось Х повернута вверх, чего быть не может в мировой СК (а может быть только в UCS)? Да и вызов диалога управления пользовательскими СК показывает, что в чертеже вполне конкретная UCS, и она активна. Что получается, пользовательская СК есть, но через программный интерфейс она недоступна.

Бред? Бред. Дальше — больше. Чтение доступных источников приводит заключению (подтвержденному тестовым примером кода), что если UCS не имеет имени (Unnamed не в счет!), то ее как бы и нет, хотя она работает. А если имя есть, то и ActiveUCS есть.

Вот и скажите мне, какой логикой руководствовался тот архитектор, который такое придумал? Почему при наличии активной UCS я не могу ее получить через API? Почему критерием доступности сделано наличие необязательного имени а не наличие обязательного влияния на координаты? Я не постигаю.

Возникает логичный вопрос — а делать то чего? Источники показывают, что если ПСК есть но без имени, то ее параметры надо брать из системных переменных, например так:
m = (self.doc.GetVariable('UCSNAME'), \
 self.doc.GetVariable('UCSXDIR'), self.doc.GetVariable('UCSYDIR'), \
 (0.0, 0.0, 0.0), self.doc.GetVariable('UCSORG'))
Этот код позволяет получить результат, похожий на предполагаемый:
m = ucs.GetUCSMatrix()
m = (self.doc.GetVariable('UCSNAME'), m[0], m[1], m[2], m[3])


Особо отмечу — похожий, ибо нормальная матрица представляет собой четыре массива по четыре числа, в то время как из системных переменных можно получить только три массива по три числа. Где брать четвертый вектор — ну совершенно непонятно. Игнорировать.

Отдельный цимес в том, что не имея доступа к UCS через API, ее невозможно поименовать, чтобы снять проблему безымянности. Только ручкаме, через GUI.
Хотя, может я не все варианты еще проверил?


На этом фоне совершенно теряется фокус с переменными типа VARIANT. Выглядит этот фокус так:
p = array.array('d', [point[0], point[1], point[2]])
norm = array.array('d', [norm[0], norm[1], norm[2]])
res = self.u.TranslateCoordinates(p, csFrom, csTo, disp, norm)
p и norm это «точки» в терминологии API. Просто VARIANT массивы из трех чисел.
Фокус, видимо, связан с реализацией конструктора класса VARIANT в Python. В кишки я не залезал. Во всяком случае, так как написано — работает, иначе - нет.


Да, чуть не забыл. Как использовать матрицу. Поскольку координаты примитивов я сохраняю в мировой СК (WCS) а чертежники трудились в UCS, надо иметь возможность выдать координаты, выдранные из чертежа, опять в UCS. Матрица дает пересчет координат:
(a1,a2,a3) (b1,b2,b3), (c1,c2,c3), (d1,d2,d3)
x = x*a1 + y*b1 + z*c1 + d1
y = x*a2 + y*b2 + z*c2 + d2
z = x*a3 + y*b3 + z*c3 + d3
exchange.autodesk.com/autocadarchitecture

Должно быть так, я еще не проверял.

2011-05-24

OCS2WCS

Похоже, я нашел обьяснение странным выбросам координат. Тех, которые отрицательные, хотя должны бы быть положительными.
Дело в том, что в некоторых случаях (видимо, когда примитивы в AutoCAD создаются процедурно AutoLISP-ом), несмотря на заявки о выдаче координат в WCS, координаты выдаются в OCS (ECS).

OCS
Object coordinate system—point values returned by entget are expressed in this coordinate system, relative to the object itself. These points are usually converted into the WCS, current UCS, or current DCS, according to the intended use of the object. Conversely, points must be translated into an OCS before they are written to the database by means of the entmod or entmake functions. This is also known as the entity coordinate system.

exchange.autodesk.com/autocadarchitecture

И правильный вызов функции trans таки выдает правильные координаты.
Остается только научить мой автомат делать это по ходу пакетной обработки.

Пока разбирался, нарисовалось несколько полезных сниппетов на AutoLISP. Допустим, хандлер примитива = 7598. Тогда:

зумнуть на обьект и подсветить его
(setq h (handent "7598") o (command "zoom" "o" h "") o (redraw h 3))


вывести список атрибутов (кстати, видно гадские отрицательные координаты в примере)
(entget (handent "7598"))
((-1 . ) (0 . "LWPOLYLINE") (330 . ) (5 . "7598") (100 . "AcDbEntity")
(67 . 0) (410 . "Model") (8 . "A_OAENO_OCEU") (100 . "AcDbPolyline") (90 . 3) (70 . 0)
(43 . 2.16) (38 . 0.0) (39 . 0.0) (10 -3195.94 1786.64) (40 . 2.16)...


конвертнуть координаты в WCS
(trans '(-3195.939915040071400 1786.635070675984300) (handent "7598") 0)
(3195.94 1786.64 0.0)


выдать дамп обьекта используя ActiveX API (VisualLisp)
(vl-load-com)
(setq h (handent "7598") o (command "zoom" "o" h "") o (redraw h 3))
(setq o (vlax-ename->vla-object h))
(vlax-dump-object o T)


заготовка конвертора для моего автомата
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(setq u (vla-get-utility doc))
(setq h (handent "7598") o (command "zoom" "o" h "") o (redraw h 3))
(setq o (vlax-ename->vla-object h))
(setq norm (vlax-get-property o "normal")
(setq nc (vla-translatecoordinates u (vlax-3d-point '(-3195.94 1786.64)) 2 0 0 norm))
(vlax-safearray->list (vlax-variant-value nc))


2011-05-23

CSS3 media queries

Парк смартфонов ширится, компьютеры карманного формата захватывают мир. Нам, разработчикам, нельзя игнорировать этот факт. Надо готовить варианты макетов как под большие дисплеи, так и под маленькие. А выбор варианта можно возложить на CSS.

Разрешение экрана в наши дни колеблется от 320px (iPhone) до 2560px (большие мониторы) или даже выше. Пользователи больше не просматривают сайты только на настольных компьютерах. Теперь пользователи используют мобильные телефоны, небольшие ноутбуки, планшетные устройства, ...
Дизайн должен быть адаптивным. Структура должна автоматически изменяться с учетом всех разрешений дисплеев. Эта статья покажет вам как создавать кросс-браузерный адаптивный дизайн при помощи HTML5 и CSS3 media queries.

habrahabr.ru/blogs/webdev/119127

В мемориз.

2011-05-21

WCS2UCS

Любопытно, сколько я еще буду мудохаться с этим Автокадом? Сижу и с задумчивым видом потираю очередную шишку от очередных грабелек.

В Автокаде работать приходится, в основном, с двумя системами координат — WCS и UCS. Что переводится как Мировая Координатная Система и Пользовательская Координатная Система. Да почему нет, удобно же. А вот что неудобно:

WCS
World coordinate system: The reference coordinate system. All other coordinate systems are defined relative to the WCS, which never changes. Values measured relative to the WCS are stable across changes to other coordinate systems. All points passed in and out of ActiveX methods and properties are expressed in the WCS unless otherwise specified.

UCS
User coordinate system (UCS): The working coordinate system. The user specifies a UCS to make drawing tasks easier. All points passed to AutoCAD commands, including those returned from AutoLISP routines and external functions, are points in the current UCS (unless the user precedes them with an * at the Command prompt). If you want your application to send coordinates in the WCS, OCS, or DCS to AutoCAD commands, you must first convert them to the UCS by calling the TranslateCoordinates method.

exchange.autodesk.com/autocadarchitecture

То есть, при работе через COM-интерфейсы мы получаем мировые координаты. А при работе с Автолиспом мы должны указывать пользовательские координаты. Очень удобно, да. Пыщь-пыщь в очЪко того урода, кто это придумал.
Прикольно выглядит упоминание «unless otherwise specified». Я пока не нашел способа заспецифаить этот азервайс. В документации глухо на эту тему. Зато подробно расписано. как в командной строке через звездочку указать мировые вместо пользовательских. Правда в Автолиспе это не работает :(

Ладно, это можно пережить, благо в Автолиспе есть функция trans, переводящая координаты туда-сюда. И ее подобие вроде как доступно через COM-интерфейс. С пивом пойдет. Можно еще матрицу (getUCSmatrix) преобразований вынуть из UCS, для особо привередливых.

Шишку я получил не этим. Шишка выросла после того, как я убедился, что вынутые через COM-интерфейс координаты невозможно перевести в UCS через прекрасную функцию trans. Да вообще никак. Мешает знак «-» (минус). Во всем массиве точек чертежа есть около 10% точек, Х-координата которых определяется как отрицательная, хотя этого не может быть, потому как не может быть никогда. Весь чертеж лежит в положительном квадранте коордсистемы. Можно к этому добавить еще то, что в пользовательской системе координат оси Х и У поменялись местами. Так веселее.

И вот теперь я думаю, как автомат может грамотно определить где «-» по делу, а где «-» по ошибке.
Потирая шишку на лбу.

И сколько я еще буду мудохаться с Автокадом?


Немного полезных сцылок:
dailyautocad.com/2009/01/understanding-coordinate-input-in
cadalyst.com/cad/autocad/import-3d-points-excel-autolisp-solutions
dailyautocad.com/2009/11/starting-drawing-in-autocad-1-model
swe-eng.com/AutoLisp
upfrontezine.com/tailor

2011-05-20

Cloud

Облака это модно. Как нанотехнологии, приблизительно. Что характерно, рядовому пользователю абсолютно по барабану, что на той стороне провода — облако или мейнфрейм седой. Но технологии на месте не стоят, и чтобы поддерживать их разработку нужен PR.

Попиарю и я. ОпенСтек — открытая (open source) программная платформа для построения облачных решений на рядовом железе:

What OpenStack is: OpenStack is a collection of open source technologies delivering a massively scalable cloud operating system. OpenStack is currently developing two interrelated projects: OpenStack Compute and OpenStack Object Storage. OpenStack Compute is software to provision and manage large groups of virtual private servers, and OpenStack Object Storage is software for creating redundant, scalable object storage using clusters of commodity servers to store terabytes or even petabytes of data.

openstack.org

Разворачивание, поддержка и управление вычислительных узлов; масштабируемое кластерное хранилище. И, конечно, виртуализация, куда ж без нее. Я так понял, атом облака — виртмашина.

Есть свободная стойка с железом? Разверните ОпенСтек и почувствуйте себя Урфином Джюсом.

2011-05-19

Bulge

Вот теперь правильно. Результаты совпадают с тем, что показывает AutoCAD.
Что характерно, несмотря на то, что в описании функции написано: 
Angle Returns an angle between two points in radians. To use that angle in AutoCAD you have to convert it back to decimal degrees. eg: (setq a (angle pnt1 pnt2)) sets the angle between pnt1 and pnt2 to the variable a.
На самом деле, возвращается угол между линией, образуемой двумя точками и осью абсцисс. Вот так и живем. Только метод тыка и выручает.

2011-05-17

panty hamster get a spin on its wheel?

А параметры дуги (через bulge) выдаются неправильные. Ой. Весь в отладке.

Вчера смотрел серию 19 третьего сезона Доктора Хауса. Один момент меня срубил. На корню. Уж не знаю, под настроение попало или еще что, но достаточно тупая шутка Хауса вызвала во мне гомерический хохот. Я даже не поленился и вырезал кусок, положил на ютуб:
http://youtu.be/-76VM5yQN4M

Хаус интересуется у Кадди, почему у нее утомленный вид и где она провела вчерашний вечер. Кадди отмазывается, на что Хаус выдает реплику в стиле пародии. Смысл реплики — что-то вроде «домоседка пошла в загул?» а буквальный перевод типа - «хомяк в труселях закрутился в колесе?».
И вот рожа Хауса, пародийное звучание фразы, сама фраза, контекст в котором она сказана, реакция Кадди (актриса пытается не заржать, по моему) — все это вместе меня и срубило. Сильная штука.

en.wikipedia.org/wiki/Hugh_Laurie
ru.wikipedia.org/wiki/Лори, Хью

Officer of the Order of the British Empire (OBE)
Оказывается, Хью был пожалован Офицером!



Как вырезать кусок из фильмы:
avidemux.sourceforge.net/screenshots
howtogeek.com/howto/42107/how-to-quickly-cut-a-clip-from-a-video-file-with-avidemux
Оказывается, Avidemux — прекрасен. Кроссплатформенный и даже работает.



Bulge

Ура, я почти закончил! На свободу с чистой совестью!
Не так это и сложно, спустя 20 лет вспомнить тригонометрию.

Есть в чертежах (DWG) AutoCAD такой примитив как polyline, иногда LWPolyline. Ничего особенного, набор точек, соединенных отрезками. Подвох в том, что у любого отрезка (определяемого двумя соседними точками) может быть ненулевым такой параметр как bulge. Эту хрень придумали чтоб мне было чем заняться чтобы можно было в полилинию встраивать не только прямые отрезки, но и дуги (arc).
Вот как описывает bulge один почтипоэт:

Bulges are something that women have (mostly to please the opposite sex it seems) and something that guys try to get by placing socks in strategic places. At least until they get older. Which is the time they tend to develop bulges in not so strategic places. In other words: bulges are all about curvature.
...
In AutoCAD's online help reference, it says about bulges for polylines:
The bulge is the tangent of 1/4 of the included angle for the arc between the selected vertex and the next vertex in the polyline's vertex list. A negative bulge value indicates that the arc goes clockwise from the selected vertex to the next vertex. A bulge of 0 indicates a straight segment, and a bulge of 1 is a semicircle.

afralisp.net/archive/lisp/Bulges
Предупреждаю, если полезете по сцылке, рекомендую отключить в браузере использование стилей. В моем ФФ4 видно белый текст на белом фоне, если со стилями.

А мне надо эти полилинии с булжами преобразовать в обычные полилинии, где кроме прямых отрезков нет ничего. Соответственно, дуги надо аппроксимировать отрезками. Правда, сначала надо превратить две точки и число (bulge) в геометрическую фигуру — дугу. Но оказалось не слишком все тяжко. Полдня поисков, полдня воспоминаний школьного курса тригонометрии и полдня передирания формул из ёкселя в Python.

Черновой вариант превращения сегмента полилинии с булжем в обычную полилинию готов. 
UPD
Не готов, ибо начиная с центра дуги, считает неправильно. Когда будет правильно - обновлю пост. А пока так
UPD2
Вот теперь правильно. Проверено отладкой на сегментах в разных квадрантах и с разным направлением.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# (c) Valik mailto:vasnake@gmail.com

import sys, os, math

def autoLispAngle(x1,y1, x2,y2):
 return math.atan2(y2-y1, x2-x1)

def polar(x1,y1, phi, dist):
 x = x1 + dist * math.cos(phi)
 y = y1 + dist * math.sin(phi)
 return (x,y)

def sign(n):
 if n < 0.0: return -1.0
 return 1.0

def testBulge(x1, y1, x2, y2, bulge, sublen=0.01):
 ''' AutoCAD polyline arc segment approximation.
 Bulge to arc to line segments (facets)
 http://www.cadtutor.net/forum/showthread.php?51511-Points-along-a-lwpoly-arc&
 att\FacetBulge_rev1.zip\FacetBulge\BulgeCalc_Rev1.xls - formulas with errors, which eliminate with:
 http://www.afralisp.net/archive/lisp/Bulges1.htm
 '''
 print 'calcBulge: p1 [%s], p2 [%s], bulge [%s], sublen [%s]' % ((x1,y1), (x2,y2), bulge, sublen)
 res = {}
# midpoint (F9, G9) # arc midpoint [(12.41925, 13.5352)]; // 16.73, 11.77
 mx1 = (x1 + x2) / 2.0
 my1 = (y1 + y2) / 2.0
 s1 = 'chord midpoint [%s]' % ((mx1, my1),)
 res['chordmidpoint'] = (mx1, my1)
# angle (K13) # angle/2 (K14)
 angle = math.atan(bulge) * 4.0
 angleDeg = angle * (180.0 / math.pi)
 s2 = 'arc angle [%0.5f] rad, [%0.5f] deg' % (angle, angleDeg)
 res['angleRad'] = angle
 res['angleDeg'] = angleDeg
# dist (F5)
 dist = math.sqrt((x2-x1)**2 + (y2-y1)**2)
 s3 = 'chord len [%0.5f]' % dist
 res['chordLen'] = dist
# sagitta length (http://en.wikipedia.org/wiki/Sagitta_%28geometry%29)
 sagitta = dist/2.0 * bulge
# radius (K15) # r = ((dist/2.0)**2+sagitta**2)/2.0*sagitta
 radius = (dist/2.0) / math.sin( abs(angle/2.0) )
 if radius == 0.0: radius = 0.000000000000001
 s4 = 'radius [%0.5f]' % radius
 res['radius'] = radius
# arc length (F14) l = 2*pi*r
 alen = abs(radius * angle)
 s5 = 'arc length [%0.5f]' % alen
 res['arcLen'] = alen
# center (F19, G19)
 t = '''
wrong algo:
 k5 = ( (math.sqrt(radius**2 - (dist / 2.0)**2))*2 ) / dist
 cx = mx1 + (((y1-y2)/2.0) * k5 * sign(bulge))
 cy = my1 + (((x2-x1)/2.0) * k5 * sign(bulge))
 s6 = 'arc center [%s]' % ((cx, cy),)
 res['center'] = (cx, cy)
good algo:
 (setq bulge 2.5613 p1 (list 11.7326 11.8487) p2 (list 13.1059 15.2217) r 2.68744
   theta (* 4.0 (atan (abs bulge)))
   gamma (/ (- pi theta) 2.0)
   phi (+ (angle p1 p2) gamma)
   p (polar p1 phi r)
 )
 '''
 theta = 4.0 * math.atan(abs(bulge))
 gamma = (math.pi - theta) / 2.0
 phi = autoLispAngle(x1,y1, x2,y2) + gamma * sign(bulge)
 cx,cy = polar(x1,y1, phi, radius)
 s6 = 'arc center [%s]' % ((cx, cy),) # 14.2498, 12.7899
 res['center'] = (cx, cy)
# start, end angle (G21, G22)
 startAngle = math.acos((x1 - cx) / radius)
 if not sign(y1 - cy) > 0:
  startAngle = (2.0 * math.pi) - startAngle
 endAngle = startAngle + angle
 s7 = 'start, end arc angles [%s]' % ((startAngle, endAngle),)
 res['seAngles'] = (startAngle, endAngle)
# subangle (F27), numsub (# of Divisions K26)
 if sublen <= 0.0: sublen = alen / 10.0
 numsub = round(alen/sublen, 0)
 if numsub < 2:
  numsub = 2.0
 subangle = angle / numsub
 s8 = 'numsub, subangle [%s]' % ((numsub, subangle),)
# length of subarc L27
 realSublen = abs(2 * (math.sin(subangle/2.0) * radius) )
 s9 = 'real sublen [%0.5f]' % realSublen
# sub points
 currangle = startAngle + (subangle/2.0) + (math.pi/2.0 * sign(bulge))
 sx = x1
 sy = y1
 listPoints = [(x1,y1)]
 for cnt in range(int(numsub-1)):
  if not cnt == 0:
   currangle = currangle + subangle
  sx = sx + (realSublen * math.cos(currangle))
  sy = sy + (realSublen * math.sin(currangle))
  listPoints.append((sx, sy))
 listPoints.append((x2, y2))
 res['points'] = listPoints
 print 'doBulge done [%s; %s; %s; %s; %s; %s; %s; %s; %s; subpoints %s]' % (s1,s2,s3,s4,s5,s6,s7,s8,s9,listPoints)
 return res
#def testBulge(self, x1, y1, x2, y2, bulge, sublen=10):

def main():
 testBulge(13.0, 9.0, 21.68, 33.65, -0.45, 7)
 #~ testBulge(11.7326, 11.8487, 13.1059, 15.2217, 2.5613, 1)
 #~ testBulge(5.9228, 12.0274, 8.1062, 22.8887, 2.2893, 3)
 #~ testBulge(24.2884, 10.3276, 27.3493, 14.9170, -4.5373, 3)
 #~ testBulge(-34.8952, -21.6100, -32.7117, -10.7486, 2.2893, 5)
 #~ testBulge(-16.5296, -23.3098, -13.4687, -18.7203, -4.5373, 5)
 #~ testBulge(10.7004, -22.2329, 12.8839, -11.3716, 2.2893, 2)
 #~ testBulge(29.0660, -23.9327, 32.1270, -19.3433, -4.5373, 2)
 #~ testBulge(-34.2720, 12.0274, -32.0886, 22.8887, 2.2893, 2)
 #~ testBulge(-15.9064, 10.3276, -12.8455, 14.9170, -4.5373, 2)
 #~ testBulge(8.0555, 5.0696, -6.8401, -6.4998, -0.3324, 2)
 #~ testBulge(-3.6195, 4.3654, 6.0425, -6.4998, 2.1734, 2)
 #~ testBulge(6.0425, -6.4998, -3.6195, 4.3654, -2.1734, 2)
 #~ testBulge(1.0, 0.0, 0.0, 1.0, 1, 0.5)
 #~ testBulge(0, 1, -1, 0, 1, 0.5)
 #~ testBulge(1.0, 0.0, 0.99, -0.044, 44.53, 0.3)
 #~ testBulge(0.0, 0.0, 0.0, 0.0, 45, 0.3)

import time, traceback
print time.strftime('%Y-%m-%d %H:%M:%S')
if __name__ == "__main__":
 try:
  main()
 except Exception, e:
  if type(e).__name__ == 'COMError': print 'COM Error, msg [%s]' % e
  else:
   print 'Error, program failed:'
   traceback.print_exc(file=sys.stderr)
print time.strftime('%Y-%m-%d %H:%M:%S')


Надо будет подчистить, убрать накопление ошибки при аппроксимации большим количеством сегментов, обобщить, чтобы и просто дуги с окружностями (circle) можно было в полилинии превращать. Ну и отладить эту байду. Еще полдня — день.

Спасибо Autodesk-у за то, что у меня есть работа, причем достаточно интересная.
Это была реклама Autodesk и его софтины AutoCAD :)

2011-05-15

Подьем экономики, говорите?

Сейчас я расскажу вам, почему у нас пиратят софт и почему экономика в жопе. Ведь правда, деньги — кровь экономики, ее топливо.

Пытался сегодня купить игру для кинекта, на маркете Микрософта. Сразу предупрежу, все завязки на офлайн я отсекал, ибо не комильфо (пойти в магаз и купить коробку — это прошлый век, да и дороже выходит, не говоря уж о том, что медленнее).
Итак, в Microsoft сервисе игрушка оплачивается пойнтами, пойнты покупаются за деньги (при условии наличия учетки). Говорят, что пойнты можно купить через PayPal, но не в России. Для моей учетки на live.xbox доступен только один способ оплаты — через привязку и регистрацию кредитки. ОК, достаю проверенную в боях кредитку и регистрирую ее в сервисе (долго сомневался, стоит ли, ибо жлобы хотят знать слишком много — адрес, телефон, ФИО и это помимо всех кодов с кредитки). Нажимаю «зарегистрировать» - бам, «обратитесь в банк, ваша кредитка проверку не проходит». Но при этом на счете блокируется 30 рублей. Ладно, удаляю регистрацию, ввожу заново с гарантированно правильными сведениями о адресе (срисовал с договора с банком), жму «зарегистрировать» - бам, «введите правильный номер кредитки». Типа, номер кредитки они внесли в черный список на прошлой попытке. Всё, приплыли. Другой кредитки у меня нет, да и не стал бы я ее поганить об этих чмырей.

Я видел, как устроены нормальные сервисы по обмену денег на товар — операции совершаются быстро и удобно, без щекотки параноидальных отростков запросами, не относящимися к номеру и CVV кредитки.

Ладно, думаю, наверняка помимо Microsoft пойнты продают более ушлые ребята. Пошел, погуглил, нашел. Есть такие, за недорого предлагают карточки оплаты в виде то ли сканов, то ли просто картинок — неважно. Важно, что ты им деньги, они тебе код для активации пойнтов. Заказываю покупку, смотрю способы оплаты. Из подходящих мне есть вебмани и с кредитки.

Для начала решил оплатить с вебмани. Для этого надо было пополнить кошелек, маловато там сейчас лежит. Тудыть-сюдыть — кошелек я пополнить не могу. Ни через банковский перевод, ни через кредитку. Причина — вебмани считает меня «нерезидентом». Я думаю, это потому как я им паспорт не принес, в подтверждение того, что кошелек мой а не Бинладена. ББ не спит. Что любопытно — вроде как через терминалы оплаты можно наличкой влегкую пополнить кошелек. Хоть Бинладена, хоть кого, паспорт не спросят. Нахуй вебмани.

Осталась оплата с кредитки. ОК, я согласен, жму на вариант с кредиткой. И попадаю, блин, не верю своим глазам! Это нечто! На сервис Chronopay, с которого недавно увели данные кучи кредиток. Мало того, был у меня опыт оплаты через Хронопей - отрицательный. Не понравилась ему моя кредитка. Всем нравится, а Микрософту и Хронопею — не нравится. Нахуй Хронопей.

Что я имею в остатке. Потрачено более часу времени, причем зря. Microsoft-у напрямую я деньги вручить не могу, не берет. Через посредника тоже не могу, ББ не позволяет. Итого в остатке я сэкономил около тысячи рублей. Потрачу их на более приятные вещи. А игрушка для кинекта подождет, я еще первые две не закончил.

Вот так экономика и живет, на подсосе. Страшно представить, сколько транзакций (денежных) НЕ совершается. Из за совершенно глупых глупостей.

Приложение:
xbox.com/ru-RU/kinect
salegame.ru/showthread 4388
shop.kln.ru/index
webmex.ru/goods
exler.ru/blog/item/9019

2011-05-14

Облако упало

Я гляжу, нынче модно стало ронять блогоплощадки. То ЖЖ колбасило, теперь Блоггер плющит. Ху'з некст?

.NET CMS

Orchard CMS с точки зрения разработчика
habrahabr.ru/blogs/webdev/117373
habrahabr.ru/blogs/webdev/118957
автор демонстрирует процесс разработки модуля под новинку сезона - CMS от Microsoft. .NET и все такое в комплекте.


Наступает сезон. После прошлогодней жары наверное все, кто может себе позволить, поставили себе кондей. Кондей — этапять. Но есть минус — бактерии плодятся в кондейных потрохах, откуда неприятный запах и, не дай Бог — легионеллёз. Хочу попробовать вот эдакого киллера бактерий:
autone.ru/product/10915
lm-shop.ru/ article_id=155 catalogue_id=450
Очиститель кондиционера (аэрозоль) LIQUI MOLY Klima-Anlagen-Reiniger.
Всем удачной пятницы 13.

Topobase всё

Ой.
Одинадцатый год не дошел и до середины, а линейка Autodesk Topobase 2011 уже снимается с продажи. На замену Автодеск выводит линейку 2012, заодно похоронив бренд «Topobase».

В звене веб-серверном сливаются две линейки.

Результат слияния программных продуктов
Autodesk MapGuide® Enterprise
+
Autodesk® Topobase® Web
будет называться
Autodesk® Infrastructure Map Server 2012.

В звене десктопном тоже сливаются в экстазе две линейки.

Результат слияния программных продуктов
AutoCAD® Map 3D
+
Autodesk® Topobase® Client
будет называться
AutoCAD® Map 3D Enterprise 2012.

Не перепутайте
AutoCAD® Map 3D Enterprise 2012
с
AutoCAD® Map 3D 2012.
Во втором нет поддержки сервера (Оракл) и возможна только автономная работа.

Как всегда, при переходе на новую версию были устранены некоторые недоработки и добавлены новые ошибки. Очередной круг игры по мотивам «сапера» - найди заботливо разложенные грабли.


И немного о хорошем. Сотворил я по надобности полезняшку. 
Делюсь: dwg_dump - Скрипт на Python для экспорта из файла DWG (AutoCAD) в CSV. Используются COM (ActiveX) интерфейсы AutoCAD для перебора примитивов чертежа и сохранения атрибутов примитивов в виде текста (CSV). Updated 2011-06-25
google.com/site/vasnake

2011-05-11

FHS

Благодаря проскочившей новости, я смог утащить в копилку еще одну полезняшку.

Полезняшка:
The following directories, or symbolic links to directories, are required in /.

Directory Description
bin Essential command binaries
boot Static files of the boot loader
dev Device files
etc Host-specific system configuration
lib Essential shared libraries and kernel modules
media Mount point for removeable media
mnt Mount point for mounting a filesystem temporarily
opt Add-on application software packages
sbin Essential system binaries
srv Data for services provided by this system
tmp Temporary files
usr Secondary hierarchy
var Variable data

Each directory listed above is specified in detail in separate subsections below. 
/usr and /var each have a complete section in this document due to the complexity of those directories.
refspecs.linuxfoundation.org/FHS_2.3

Однако любопытно — каталог /home не является обязательным. А обязательных - 13 штук.
Вот что мне очень нравится, так это сохранение и приумножение правильных решений. Без попсы и метаний из крайности в крайность. Как 30 лет назад назвали каталог с конфигами /etc так он и сейчас называется. Не то что в выньдосе, где чуть ли не с каждой версией немалая часть основ пересматривается и меняется.

Новость:

Организация Linux Foundation объявила о начале работы по формированию третьей версии стандарта FHS (Filesystem Hierarchy Standard), определяющего набор и место размещения в файловой системе стандартных утилит, системных файлов и директорий...
Прошлая версия стандарта (FHS 2.3) была выпущена в 2004 году, в новой версии планируется отразить современные реалии. Финальную версию стандарта FHS 3.0 планируется выпустить в июле.

citforum.ru/news/26192

2011-05-09

Стакан полный наполовину

Прочел намедни про «множество решений»:

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

amironov.com/blogs/node/64

И могу только подтвердить. Всё так. Те, у кого стакан наполовину пустой, удачливыми быть не могут по определению. Остается разве добавить, что не стоит смешивать удачливость и успешность. Чтобы удачливость привела к успешности, надо иметь хорошие мозги, позволяющие выбрать не просто главное а правильное главное. Надо иметь хорошее упорство, позволяющее не сойти с дистанции; надо иметь смелость принимать решения (и просто смелость). Ну и такая штука как харизма тоже не помешает.
Чуть не забыл — надо же еще знать чего ты хочешь, без этого точно нельзя ничего добиться.

2011-05-08

Landsat imagery

changematters.esri.com/compare
Дэйв Боуман пишет про веб-приложение, построенное на Landsat-овских снимках. Сами же снимки доступны через бесплатные онлайн сервисы Esri. Что любопытно (помимо космоснимков халявных), приложение писали на JavaScript, в бэкенде ASP.NET MVC, и сделали вариант представления под планшеты (догадайтесь какие :)
И все бы прекрасно было, но мерзкая поддержка JavaScript в мелкомягком браузере вынудила написать версию на Flex. От оно как.

Приложение занятное, особенно если посмотреть «туры», проводящие по серии картинок с пояснениями к показываемому. В целом, реклама Esri удалась.

2011-05-07

Надо подождать

Как все загадочно. Запустил сегодня обновление системы (Debian testing) на ноуте
# aptitude update; aptitude full-upgrade
А в ответ - «0 пакетов для обновления». Загадка, как же так, неделю не обновлял, система «testing», должна быть куча обновлений. Непорядок. Проверяю через apt-get
# apt-get update
И в ответ получаю эдакое:
W: Failed to fetch bzip2:/var/lib/apt/lists/partial/ftp.debian.org_debian_dists_testing_main_binary-i386_Packages  Hash Sum mismatch
E: Some index files failed to download. They have been ignored, or old ones used instead.
Оппа.
Погуглил, рецепты разные посчупал — без результата. Но решение нашлось — записывайте: надо подождать.

Фишка в том, что пока идет заливка новых пакетов на сервер, откуда берутся обновления, пакетная система в негодном состоянии. Через час-другой можно будет без проблем обновиться. Но не в данный момент. Во всяком случае я понял именно так. И удивился, что не предусмотрено простого флажка - «погодь, сервер завершит транзакцию».

Если я понял неправильно — ткните пальцем во внятное разьяснение.

2011-05-06

Абсолютно свободен

Платой за полную свободу Дебианчика стал вынос в отдельный репозиторий (non-free) целой кучи драйверов. На трех своих железках я периодически вижу сообщения типа
W: Possible missing firmware /lib/firmware/foobar for module bazz
Вот пример:
update-initramfs: Generating /boot/initrd.img-2.6.32-5-686
W: Possible missing firmware /lib/firmware/e100/d102e_ucode.bin for module e100
W: Possible missing firmware /lib/firmware/e100/d101s_ucode.bin for module e100
W: Possible missing firmware /lib/firmware/e100/d101m_ucode.bin for module e100
Не то, чтобы мне это мешало, но как-то нехорошо. Некрасиво. А кому-то и мешает наверняка.

И сегодня я созрел разрулить эту проблему. Оказалось проще пареной свеклы:
aptitude install apt-file
apt-file update
apt-file search /lib/firmware/e100
aptitude install firmware-linux-nonfree
Только, чтоб сработало, надо в sources.list добавить репозиторий non-free (у меня уже было). Имя пакета для установки (firmware-linux-nonfree) берется из поиска по файлам (предпоследняя строка).

Для другой машины получилось так:
aptitude install apt-file
apt-file update
apt-file search /lib/firmware/rtl_nic
aptitude install firmware-realtek

Более подробно можно прочесть тут:
linux.koolsolutions.com/2009/05/11/tip-debian-linux-kernel-firmware-issues-ethernet-drivers-missing

2011-05-05

Systemtap

Вещь, однозначно. Ставим (# aptitude install systemtap); пишем скрипт (или берем готовый), в скрипте вешаем обработчики на события (событий богато!), в обработчиках собираем сведения (печатаем и/или анализируем); команда stap создает ядреный модуль, цепляет его к ядру, модуль ловит события и собирает (выводит) данные. По завершении модуль выгружается.

Systemtap is a tool that allows developers and administrators to write and reuse simple scripts to deeply examine the activities of a live Linux system. Data may be extracted, filtered, and summarized quickly and safely, to enable diagnoses of complex performance or functional problems.
...
The essential idea behind a systemtap script is to name events, and to give them handlers. Whenever a specified event occurs, the Linux kernel runs the handler as if it were a quick subroutine, then resumes. There are several kind of events, such as entering or exiting a function, a timer expiring, or the entire systemtap session starting or stopping. A handler is a series of script language statements that specify the work to be done whenever the event occurs. This work normally includes extracting data from the event context, storing them into internal variables, or printing results.

sourceware.org/systemtap/tutorial/Introduction
sourceware.org/systemtap/documentation

Один из примеров:
sourceware.org/systemtap/examples/io/iostats.stp

2011-05-04

НожЫки

Вот тут (впечатлительным лучше не глядеть)
spas-combat.ru/forum/ 4848
убедительно продемонстрировано, насколько некоторые ножи могут быть неэффективны (а некоторые наоборот). Ухватистость, форма лезвия, заточка, вес — все играет роль. Особенно заточка и форморазмеры лезвия (что и неудивительно какбе). А вот что удивительно, так это насколько неопасными могут быть складные ножи, приобретаемые для «самообороны». А с другой стороны, если удачно приложить высокоэффективным ножиком (типа «Кондрат») — будет труп. Оно нам надо?

Не будем тешить себя иллюзиями — для эффективной самозащиты через ножик мало иметь толковый ножик (прорезающий помимо одежки и мяско), надо тренировать (регулярно) нанесение нелетальных порезов. А иначе и заморачиваться не стоит.

2011-05-03

Водичка тютю

Начинается летний сезон, пора, когда в столице одного из крупнейших государств (про замкадье и говорить нечего) планово отключают горячую воду. Надолго. В этом году, по приказу мэра, всего на 10 дней.
Вот тут можно узнать, когда у вас не будет воды. У меня в конце июля.
Кстати, мне одному претит эдакая форма представления информации? Мне было бы удобнее получить банальную справку, пригодную для печати (с определенным URL), а не эту красивую игрульку, пригодную только для распальцовки по типу «а у меня прикольнее флешка на сайте!».

oaomoek.ru
rian.ru/moscow/20110317/354787163
rian.ru/moscow/20101025/289082432
rian.ru/infografika/20110317/354795039

Вот я одного не понял, как это так получается, что вода у МОЭК, а расписание у РИА Новости? Почему флешка с новостного сайта? И где тогда база с расписанием? Не постигаю.

2011-05-02

Symfony (web framework on PHP)

А вот кому чек-лист подготовки сайта к выводу в люди? Подразумевается, что сайт построен на Symfony. Но чек-лист будет полезен любому сайтостроителю, ибо проходит по достаточно общим местам любого сайта.
symfony-check.org


Симфони — это фреймворк, не CMS. Ближе к RoR чем может показаться.

Symfony is a web application framework for PHP projects.

It aims to speed up the creation and maintenance of web applications, and to replace the repetitive coding tasks by power, control and pleasure.

The very small number of prerequisites make symfony easy to install on any configuration; you just need Unix or Windows with a web server and PHP installed. It is compatible with almost every database system. In addition, it has a very small overhead, so the benefits of the framework don't come at the cost of an increase of hosting costs.

Using symfony is so natural and easy for people used to PHP and the design patterns of Internet applications that the learning curve is reduced to less than a day. The clean design and code readability will keep your delays short. Developers can apply agile development principles (such as DRY, KISS or the XP philosophy) and focus on applicative logic without losing time to write endless XML configuration files.

symfony-project.org/about

Поют красиво.

2011-05-01

Дзен в стрельбе из лука

Букаф много, но текст заслуживает прочтения. Одолев текст я стал несколько лучше понимать такую непонимаемую штуку как дзен. Зацените небольшую вырезку:

Однажды, когда я выстрелил, мастер торжественно сказал: «„Оно" здесь! Поклонитесь!» Взглянув на мишень (к сожалению, я не смог от этого отказаться), я увидел, что стрела лишь зацепила ее. «Это был правильный выстрел, — констатировал мастер, — именно так все и должно начинаться. Но на сегодня достаточно, иначе при следующем выстреле вы будете прикладывать слишком много усилий и испортите хорошее начало». Постепенно у меня стало получаться подряд несколько выстрелов, попадающих в мишень, хотя и неудач тоже было много. Но если я хоть каким-то образом выказывал недовольство, мастер становился необычайно резким. «Что с вами?! — восклицал он. — Вы не должны расстраиваться из-за плохих выстрелов, и это вы уже давно знаете. Добавьте к этому еще и умение не радоваться хорошим выстрелам. Вы должны быть свободны и от радости, и от печали. Должны научиться пребывать в состоянии легкости и душевного равновесия и радоваться так, как будто хорошо выстрелил кто-то другой, а не вы. И неустанно упражняйтесь — вы даже представить себе не можете, насколько это важно».

В эти недели и месяцы я прошел самую суровую в своей жизни школу, и даже если мне не всегда было легко подчиняться, постепенно я начал осознавать, как много мне это дало. Я полностью избавился от стремления отмечать колебания моего настроения и думать о своем «я». «Теперь вы понимаете, — спросил однажды мастер после особенно хорошего выстрела, — что значит „стреляет оно", „попадает оно"?» — «Боюсь, — ответил я, — что теперь я уже вообще ничего не понимаю, я запутался в самых элементарных вещах. Это я натягиваю лук или лук втягивает меня в максимальное напряжение? Я пронзаю мишень или сам являюсь мишенью? „Оно" с точки зрения тела духовно, а с точки зрения духа телесно, наличествует и то и другое или ни то ни другое? Всё: лук, стрела и мое „я" — сплелось настолько, что я уже больше не в состоянии отделить одно от другого. Исчезла и сама потребность их разделять. Потому что, как только я беру в руки лук и стреляю, все становится таким ясным и до смешного простым...» — «Именно сейчас, — прервал меня мастер, — тетива прошла через вас».

ki-moscow.narod.ru/litra/zen/zen_in_der_kunst

Рекомендую.

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)