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

2011-06-30

БМ

И еще немного про банкиров. Назвать можно - «ловкачи».

Год назад открыл я счет в банке под 7.счемто годовых. Договор на год. Неснижаемый остаток 30 тыр и выплата процентов каждый месяц. Приятный такой счет, его можно пополнять, с него можно снимать. Главное — чтобы на счету всегда было не менее 30 тыров.
Прошел год. В назначенное время вместо процентов я получил фигу и вспомнил про это дело (что на год). Спросил в банке — чекак? Ответили, что счет перешел в разряд самых простых, расчетных или вроде того. Вроде пока нормально все, да?

А вот и вкусное: хотя все удовольствия от счета (в виде процентов) я потерял, ограничение неснижаемого остатка — по прежнему в силе. Привилегии пропадают, обязательства остаются = профит для банка. Ловко? Не то слово.
Чтобы выручить свои 30 тыров, надо топать в то отделение, где открывал счет. Ножкаме. В другое — низзя! И закрывать счет, подписав тонну бумаги.

Всё для клиента! Самый удобный, БМ.
Но деньги (так неудачно запузыренные х.з. куда) они мне вернули. По тихому.

2011-06-29

Parole

По случаю, откопал в закромах архивчик. А в нем старая досовская игруля. Полезная до невозможности.

Parole - древняя игрушка под DOS, разучивание слов (английский/русский) и, как побочный эффект, печать на клаве вслепую. Я именно на этой игруле научился по клавиатуре тыцкать. Как поставил левую руку со смещением вправо на один ряд, так до сих пор и мучаюсь. Юзайте DOSBOX.
sites.google.com/site/vasnake

Там сверху вместо букв слова — вопросительные знаки, ниже — перевод. Еще ниже нарисована клавиатура и пчелка. Если тыркнув в букву вы не угадали ни одной, пчелка начинает двигаться к правильной букве.
Одновременно и аглицкие слова изучаете и печатать вслепую учитесь. В игровой форме. Просто прелесть. Рекомендую всем, кто хочет ненапряжно овладеть десятипальцевым набором текста. Вот только правильную постановку рук сначала уясните, а то потом поздняк метаться.

Игруля запросто идет под DOSBOX. Запускаете его, набираете команду
mount c /home/v/fun
и запускаете Паролю (предполагается, что игруля находится по пути /home/v/fun/parole/parole.exe):
c:
cd parole
parole

profit.

2011-06-28

load average

Как-то я раньше не задумывался над природой пузомерки, которая загруженность процессора показывает. По виндовой привычке смотрел всегда на проценты загрузки камня и думал, что понимаю происходящее. А теперь я прочитал про показатель «load average» в Linux и прочих юниксах. Есть о чем подумать.

The state in question is CPU load—not to be confused with CPU percentage. In fact, it is precisely the CPU load that is measured, because load averages do not include any processes or threads waiting on I/O, networking, databases or anything else not demanding the CPU. It narrowly focuses on what is actively demanding CPU time.
...
The CPU percentage is the amount of a time interval (that is, the sampling interval) that the system's processes were found to be active on the CPU. If top reports that your program is taking 45% CPU, 45% of the samples taken by top found your process active on the CPU. The rest of the time your application was in a wait.
...
The load averages differ from CPU percentage in two significant ways: 1) load averages measure the trend in CPU utilization not only an instantaneous snapshot, as does percentage, and 2) load averages include all demand for the CPU not only how much was active at the time of measurement.
...
the load averages tell us by increasing duration whether our physical CPUs are over- or under-utilized. The point of perfect utilization, meaning that the CPUs are always busy and, yet, no process ever waits for one, is the average matching the number of CPUs. If there are four CPUs on a machine and the reported one-minute load average is 4.00, the machine has been utilizing its processors perfectly for the last 60 seconds.
...
The load-average calculation is best thought of as a moving average of processes in Linux's run queue marked running or uninterruptible. The words “thought of” were chosen for a reason: that is how the measurements are meant to be interpreted, but not exactly what happens behind the curtain.

linuxjournal.com/article/9001

Если проценты загрузки показывают долю времени (квантованного), в которое процесс пользует камень; а средняя загрузка показывает (условно) количество активных процессов, то как понять такое: на однопроцессорной машине, процентная загрузка = 3% а средняя загрузка от 3 до 4? И будет ли прок от пересадки системы на четырехядерную машину, при 3% загрузке одного камня?
Я думаю, так: приблизительно три процесса хотят чегой-то посчитать, но им приходится чего-то ждать. Но как снизить нагрузку — непонятно. Как узкое место найти?

2011-06-27

Поток сознания

Недавно упомянул AOP, и в каментах была дадена сцыль на AOP в Lisp (спасибо, astoon). А кроме того, там было написано такое:

Психологи выделяют состояние сознания, называемое потоком (поток сознания?), в котором мы обладаем немыслимой концентрацией и производительностью. Важность данного состояния при программировании была осознана в последние 2 десятилетия, с тех пор, как данная тема была освещена в классической книге о человеческом факторе в программировании "Эффективные проекты и команды" Тома Демарко (Tom DeMarko) и Тимоти Листера (Tim Lister). Два ключевых факта о состоянии потока: требуется около 15 минут, чтобы войти в него, и даже короткие прерывания могут вывести из данного состояния, после этого требуется опять 15 минут на вход в него. Демарко и Листер, как и многие последующие авторы, концентрируются на исключении прерываний, разрушающих состояние потока, таких, как телефонные звонки и неподходящие визиты начальника. Меньше внимания обращается на не менее важные вещи — прерывания из-за инструментов, которые мы используем в своей работе. Например, языки, которые требуют долгой компиляции прежде, чем вы сможете запустить ваш код, могут быть не менее губительными для потока, чем надоедливый начальник или звонки по телефону. Lisp может рассматриваться как язык, спроектированный для программирования в состоянии потока сознания.

lisper.ru/pcl/introduction-why-lisp

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


Человеческий фактор: успешные проекты и команды



2011-06-25

Export from DWG to CSV

Всё когда-нибудь кончается. Вот и у меня кончились заморочки с экспортом чертежей DWG. Все тесты отработали, всё, что экспортируется, без ошибок импортируется обратно (воспроизводится в Автокаде) — потерь нет. Тема закрыта. По крайней мере, на ближайшее время.

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

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

В качестве резюме могу сказать — в Autocad есть ActiveX API. Дерьмовый. Мой вам совет, не затевайте ничего сложного на этом API, если нет абсолютной уверенности, что вам надо именно это. Если пользоваться AutoLISP, результат будет заметно более предсказуем.
В качестве примера дерьмовости могу привести проблему углов поворота, в частности — блоков. Суть проблемы в том, что в указанном API координаты доступны в системе координат WCS, а углы поворота только в OCS. При этом нет ни одной функции, помогающей вычислить необходимый угол для WCS. Вся эта тригонометрия должна выполнятся вами. Добавим, что рисовать примитивы можно только в UCS, что третья координата замаскирована, что углы измеряются в радианах от 0 до 2Пи а задаются в градусах. Кому действительно интересно — посмотрите в коде работу с булжами полилиний, с дугами и блоками. И в блоге поищите по тегам Autodesk, грабли.

Дальше сами как-нибудь.

2011-06-24

Гроздья гнева

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

Теперь залил на плеер Стейнбека нашего Джона. И первый пункт — новелла «Гроздья гнева». Сильная штука. Люди разное в ней находят. Я нашел описание последствий неумолимого технического прогресса. Наступила индустриальная эра. Хорошо сделанным чугунным сапогом и прям на яйки фермеров Оклахомщины. Жесть. Ничего удивительного, что случилось две мировых в начале 20 века, при таких раскладах-то.

И, кстати сказать, щаз наступает не менее жестяная постиндустриальная эра.

ru.wikipedia.org/wiki/Гроздья гнева
en.wikipedia.org/wiki/The_Grapes_of_Wrath

Кстати еще, название «Grapes...» прекрасно перекликается с заманухой для фермеров, уезжающих в Калифорнию. Якобы они там смогут винограда жрать от пуза, якобы он там повсюду.
Стейнбек — мастер.

2011-06-23

Ноам Хомский

Аврам Ноам Хомский (часто транскрибируется как Хомски или Чомски, англ. Avram Noam Chomsky — Эврэм Ноэм Чомски; 7 декабря 1928, Филадельфия, штат Пенсильвания, США) — американский лингвист, политический публицист и теоретик.

Брешут, что

Ноам Хомский составил список "10 способов манипулирования" с помощью средств массовой информации.

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

rian.ru/media/20110616/389137011

И дают сцыль на испаноязычную статью. А дальше я копать не стал. Как бы то ни было, перечисленные «10 способов...» стоит понять самому и усердно разьяснять близким. Это полезно.
Почитал вики, интересно. Надо будет как-нибудь поближе ознакомиться с его вкладом в лингвистику. Ну и с политическими взглядами, из первых рук.

Вроде как Лем как-то что-то говорил про Хомского, если мне память не изменяет.

2011-06-21

Облако, в штанах

Простите, не удержался. Образование такое, советское. Если облако, значит — в штанах.

Прочел я эдиториал в свежем UP-е. Там про анонс iCloud, средство синхронизации всех яблочных машинок. И родилась у меня идея. Дарю. Как обогатиться на прицепе у Джобса.

Сначала делаем драйверок подключаемой файлсистемы. Пользователь после установки драйверка может создать себе том с файлами, изначально пустой (а лучше, если том сам появляется, в нужном месте типа «мои документы»). Все папки и файлы, которые пользователь положит на этот том, уходят на некий е-сервис, в Интернет.
Далее делаем так, чтобы сами файлы и папки внутре системы идентифицировались по, скажем UUID. А соответствие ID символьному имени хранилось в отдельной табличке. И все это шифруется стойкими шифрами на пользовательском ключе. Это чтобы враги не догадались никогда, что мы храним на томе.

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

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

Пишем бизнес-план по рубке зелени, ищем инвестора и начинаем рубить бабло на эксплуатации «синхронизирующего облака» ака iSync или типа того (PantyCloud).

Не удивлюсь, если такое уже есть.

2011-06-20

Сервер БД для 1С:Предприятие

Это чтож, теперь MS SQL-сервер и не нужен как бэ? Занятно.

Российская компания Etersoft объявила о выпуске новой версии своего транслятора SQL-запросов MS SQL Server в PostgreSQL — SELTA@Etersoft 1.1.

В новом релизе транслятор был полностью переписан — теперь в его основе лежит система парсинга GOLD, распространяемая под собственной Open Source-лицензией, ...
реализована возможность загрузки БД в PgSQL напрямую из дампа MS SQL-сервера, добавлена поддержка PostgreSQL 9.0.

nixp.ru/news/SELTA-Etersoft
etersoft.ru/content/view/305/251

Транслятор реализован в виде ODBC-драйвера PostgreSQL, который представляется как ODBC-драйвер сервера MS SQL, и разбирает запросы, обращения к системным таблицам, адаптируя их для PostgreSQL.
ODBC-драйвер выполнен в виде DLL-библиотеки, что позволяет использовать данное решение как в WINE@Etersoft под GNU/Linux, так и в Windows.

etersoft.ru/content/view/154/208


О, вот и ответ:

Создать универсальный транслятор запросов практически невозможно, поэтому данный продукт предназначен только для некоторых приложений, в частности 1С:Предприятие 7.7.
wiki.etersoft.ru/SELTA

2011-06-19

Облом'с

На фоне пробегавшего сообщения о выходе ICQ-клиента «воздушного», новость действительно выглядит интересной

Adobe AIR 2.6 — последний официальный релиз Linux-версии программной платформы Adobe. Начиная с версии 2.7 компания не будет поддерживать этот порт, однако предоставит некий «набор портирования на Linux для AIR» в рамках своего проекта OSP (Open Screen Project). Т.е. в Adobe предлагают своим партнерам, заинтересованным в запуске AIR-приложений на Linux-десктопах самостоятельно позаботиться обо всех проблемах дальнейшей совместимости.
Этот анонс вряд ли шокирует пользователей GNU/Linux-десктопов, не испытывающих особой любви к Adobe AIR. Однако событие интересно сочетается с недавним выпуском бета-версии официального ICQ-клиента для Linux, созданного на базе AIR.

nixp.ru/news/Adobe

Сами адобовцы как бы с сожалением сообщают о необходимости сконцентрировать силы (а силы у них слабые, выходит?) на растущих сегментах рынка

The official announcement can be found here: http://blogs.adobe.com/flashplayer/2011/06/adobe-air-and-linux-increasing-distribution-on-devices.html

So, with the 2.7 release of AIR, we made a decision to prioritize our resources towards a Linux porting kit for AIR, which our Open Screen Project partners can use to complete implementations of AIR for Linux-based platforms. As such, we will be focusing on supporting partner implementations and will no longer be releasing our own versions of Adobe AIR and the AIR SDK for desktop Linux.

blogs.adobe.com/open/2011/06/focusing-on-the-next-linux-client

Реализацию AIR под Linux оставляют на тех «кому надо», спасибо, хоть напрочь не закрывают. И получается как с .NET — платформа вроде открытая, и Mono в наличии, но в выхлопе — даже Keepass неохотно запускается на Linux, хотя программулина вовсе несложная.

2011-06-18

Зегодня для нам празднинг

Дер полицай таг Все тесты отработали успешно. Это значит, что почти двухнедельная возня с углами поворота блоков в Автокаде — закончена. Осталось чуть-чуть, провернуть аналогичную задачу для текстовых вставок. А там и отпуск недалече.


Чутка сцылок:
Про оружие mpopenker.livejournal.com
Docstrings, Python learningpython.com/2010/01/08/introducing-docstrings
а еще есть Doctest, я не знал.

2011-06-17

Головоломка

А сегодня я осознал, почему так невообразимо сложно решить задачу с углами. Ту, где надо вычислить угол поворота блока при вставке в чертеж, при условии, что известен угол для OCS, координаты даются в WCS а вставку надо делать в UCS. И в общем случае все три координатные системы ни разу не совпадают.

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

Уж очень я неудачно себе тесты подобрал. Из этих тестов не видно, что ось Z меняет направление, что приводит к отзеркаливанию изображения блока. А у меня большая часть блоков обладают симметрией. И только когда я напоролся на блок без симметрии, я увидел, что мощно тормознул.
Ну и AutoCAD «помог», не без этого. Он же фактически двумерный, куда ни плюнь — х,у. Так глаз и замылился. Чтобы увидеть Z, надо проявить находчивость и знание матчасти. Но эта маскировка не отменяет трехмерности модели чертежа. Что и проявилось во всей красе в задачке с поворотом блоков.

Зато потом какое облегчение, трудно поверить. В трехмерке решение простое и даже изячное, особенно по сравнению с теми, что я плодил для двумерки.

2011-06-16

Любопытно складывается

В букмарках застряло когда-то и вот теперь попало на глаза. Запись любопытная во многих отношениях. Тут и шпаргалка по использованию виндовых компонент и иллюстрация нативного COM-программирования и страшилка для скриптокодеров. Да мало ли уцепит взгляд пытливого человека?

Лично я тут вижу напоминание о кодерском кошмаре, которым когда-то приходилось заниматься.

Often, the pieces you need are already there; you just have to figure out how to put them together. Notice that each of the pieces is in itself not very big. You just had to recognize that they could be put together in an interesting way.
void CALLBACK RecalcText(HWND hwnd, UINT, UINT_PTR, DWORD)
{
 HWND hwndFind = GetForegroundWindow();
 g_szPath[0] = TEXT('\0');
 g_szItem[0] = TEXT('\0');

 IShellWindows *psw;
 if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,
                                IID_IShellWindows, (void**)&psw))) {
  VARIANT v;
  V_VT(&v) = VT_I4;
  IDispatch  *pdisp;
  BOOL fFound = FALSE;
  for (V_I4(&v) = 0; !fFound && psw->Item(v, &pdisp) == S_OK;
       V_I4(&v)++) {
   IWebBrowserApp *pwba;
   if (SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba))) {
     HWND hwndWBA;
     if (SUCCEEDED(pwba->get_HWND((LONG_PTR*)&hwndWBA)) &&
       hwndWBA == hwndFind) {
       fFound = TRUE;
       IServiceProvider *psp;
       if (SUCCEEDED(pwba->QueryInterface(IID_IServiceProvider, (void**)&psp))) {
         IShellBrowser *psb;
         if (SUCCEEDED(psp->QueryService(SID_STopLevelBrowser,
                              IID_IShellBrowser, (void**)&psb))) {
           IShellView *psv;
           if (SUCCEEDED(psb->QueryActiveShellView(&psv))) {
             IFolderView *pfv;
             if (SUCCEEDED(psv->QueryInterface(IID_IFolderView,
                                               (void**)&pfv))) {
               IPersistFolder2 *ppf2;
               if (SUCCEEDED(pfv->GetFolder(IID_IPersistFolder2,
                                            (void**)&ppf2))) {
                 LPITEMIDLIST pidlFolder;
                 if (SUCCEEDED(ppf2->GetCurFolder(&pidlFolder))) {
                   if (!SHGetPathFromIDList(pidlFolder, g_szPath)) {
                     lstrcpyn(g_szPath, TEXT("<not a directory>"), MAX_PATH);
                   }
                   int iFocus;
                   if (SUCCEEDED(pfv->GetFocusedItem(&iFocus))) {
                     LPITEMIDLIST pidlItem;
                     if (SUCCEEDED(pfv->Item(iFocus, &pidlItem))) {
                       IShellFolder *psf;
                       if (SUCCEEDED(ppf2->QueryInterface(IID_IShellFolder,
                                                          (void**)&psf))) {
                         STRRET str;
                         if (SUCCEEDED(psf->GetDisplayNameOf(pidlItem,
                                                   SHGDN_INFOLDER,
                                                   &str))) {
                           StrRetToBuf(&str, pidlItem, g_szItem, MAX_PATH);
                         }
                         psf->Release();
                       }
                       CoTaskMemFree(pidlItem);
                     }
                   }
                   CoTaskMemFree(pidlFolder);
                 }
                 ppf2->Release();
               }
               pfv->Release();
             }
             psv->Release();
           }
           psb->Release();
         }
         psp->Release();
       }
     }
     pwba->Release();
   }
    pdisp->Release();
  }
  psw->Release();
 }
 InvalidateRect(hwnd, NULL, TRUE);
}

blogs.msdn.com/b/oldnewthing/archive/2004/07/20/188696

Да, если что, этот код выдает имя каталога (или файла) выбранного в окне Windows Explorer.

2011-06-15

AOP

Java, Spring Framework, AOP. Аспектно-ориентированное программирование.
АОП настолько необычен для закостеневшего в «алгоритмы + структуры» программера, что его можно настоятельно рекомендовать к изучению хотя бы для разминки мозгов.
springsource.org/spring/docs/2.5.x/reference/aop

Про Python и АОП:

There are many articles out there about AOP and python, and consequently, several AOP solutions for python are offered. The spectrum is broad, ranging from “python doesn’t need AOP” to “python has enough language features to do AOP without framework code” to “AOP works great with python” to “AOP is just another thing built for static languages someone is trying to bolt onto python”.
Someone made a good point back in 2004 on a python mailing list that AOP is a paradigm, not a specific framework, and that if we are going to argue against AOP in python, then it opens the door to arguing over OOP, and in turn, probably every paradigm that we know. Are you ready to throw out python classes and do everything functionally?

blog.springpython.webfactional.com/2009/03/23/the-case-for-aop-in-python


Фрилансеру на заметку, как искать работу/работников через профильные соцсети:
amironov.com/blogs/node/340

2011-06-14

ч0рный понедрельник

Кончился. Мир праху.

На досуге решил проверить, правду ли брешут, что cURL может справится с восстановлением upload-а (resumable upload).
Настроил Apache + mod_dav, ибо он уж почти десять лет поддерживает заголовки Content-Range совокупно с методом PUT, и стал экспериментировать.

Врут, собаки. cURL может корректно сформировать заголовки и, конкретно, Content-Range. Но он не может залить на сервер кусок файла согласно этим заголовкам, льет файл либо с начала, либо начиная с указанной отметки, но всегда до конца файла а не до конца куска. Apache же, при имитировании сетевого сбоя, удаляет весь недозалитый файл. Типа сбой транзакции.
Что поделать, селяви. Проверено - Resumable uploads with chunks нельзя сделать по простому.

Можно сделать посложнее. Взять Python и самому формировать запросы PUT в сочетании с нужными заголовками. Плюс обвязка на проверку результатов и обработку запроса HEAD (наличие и размер файла на сервере нужно узнать сперва) — и аплоад чанками на скорую руку готов. На сервере Apache + mod_dav.


ics.uci.edu/~ejw/authoring/implementation
stackoverflow.com/questions/111945/is-there-any-way-to-do-http-put-in-python
inamidst.com/proj/put/put.py

Для справки, в cURL всего две (три) опции на предмет частичной передачи: «-C», «-r», «-a». При несрабатывании первых двух, третью можно даже и не рассматривать. Примеры:$ curl -v -a -r 0-300 -T /home/v/ie8.vmdk --url http://t.home.net:8000/vwebdav/
$ curl -v -C 301 -T /home/v/ie8.vmdk --url http://t.home.net:8000/vwebdav/

2011-06-12

Два раза вычесть

Похоже, я сообразил, что мне делать с углами. Даже в коде реализовал, осталось проверить «в бою».

Если достаточно долго глядеть на картинку, то можно увидеть, что показанная UCS отличается от WCS двумя вещами. Первое — направление отсчета углов меняется на противоположное. В WCS против часовой стрелки, в UCS по ч.стрелке. Второе — вектор с нулевым углом повернут на 90 градусов (ибо совпадает с положительным направлением оси Х).

А больше и знать ничего не надо. Чтобы повернуть блок на нужный угол (60 град) в UCS, надо его поворачивать в обратном направлении и довернуть еще на 90 градусов. Опять же, в нужном направлении.

Как определять факт смены направления на противоположное я знаю, научился когда булжи (bulge) рисовал. Достаточно перевести в UCS два вектора с заранее известными углами, один больше второго, и сравнить углы векторов в UCS. Если тот, что больше, стал меньше — направление поменялось.
Смещение нуля определить еще проще. Переводим в UCS вектор с нулевым углом (0,0; 1,0) и меряем его угол. Считай готово.

trans = Vwcs2ucs()
trans.config(ucsMatrix)
ucsA = trans.wcs2ucsAngle(a)

class Vwcs2ucs:
 def config(self, matrix):
  self.ucsMatrix = matrix
  # detect clock hands directions for UCS
  p0 = self.wcs2ucs(0.0, 0.0)
  p1 = self.wcs2ucs(2.0, 1.0)
  p2 = self.wcs2ucs(2.0, 2.0)
  self.bulgeSign = getBulgeSign(p0, p1, p2)
  # detect origin angle for UCS
  p10 = self.wcs2ucs(1.0, 0.0)
  self.ucsZA = AutoLISP.angleP(p0, p10)
  print 'ucs angle origin [%s] deg, rotation sign [%s]' % (math.degrees(self.ucsZA), self.bulgeSign)

 def wcs2ucsAngle(self, a):
  ta = (self.bulgeSign * self.ucsZA) + (self.bulgeSign * a)
  return normAngle2pi(ta)
Вкратце так. Могу обещать полный комплект, но только после окончания всех проверок.

2011-06-11

OCS, WCS, UCS + Rotation angle

Даже любопытно, что случится раньше, я с ума сойду или наступит полная победа разума над Автокадом?

Я очередной раз зашел в тупик, никак не соображу, как правильно вычислить угол поворота примитива (блока) в UCS. Из исходных данных у меня есть точка вставки (WCS), угол поворота (видимо в OCS) и масштабные факторы, хотя они тут и не при делах. Есть еще матрица перевода координат из WCS в UCS.
На текущий момент у меня вроде как получается вычислить угол повората в WCS. Методом вычисления координат второй точки, дополняющей первую до вектора. Вычислив две точки в OCS, я перевожу их координаты в WCS и беру угол наклона этого вектора. Так получается угол поворота блока в WCS. Натурные эксперименты пока подтверждают правильность подхода.

Но мне надо воспроизвести блок в UCS. И тут начинаются траблы. Посмотрим на картинку:
Тут видно примеры блоков и углы в UCS (что должно получаться) и в WCS (что у меня получается).
На левой картинке видно, что мы имеем UCS; синяя «Т» это блок с точкой вставки в основании «буквы». Нарисованная дуга (я ее спецом нарисовал, для иллюстрации) показывает угол поворота, около 220 градусов, если угол положительный. Черная «буква» Т показывает как вставляется блок, если угол поворота = 0. Выходит, мне надо раздобыть значение угла = 220 град (3.8 рад).
На правой картинке видно, что происходит в WCS. Как видите, угол поворота около 60 град. Эту правую картинку я воспроизвожу, но вот пересчитать угол, чтобы из 60 градусов получилось 220 — никак. 30 градусов — запросто (методом доп.точки), а 220 — фигу.

Очевидно, что надо добавить Pi радиан, но не пойму, откуда это очевидно. И что делать, если в другом случае будет другая матрица пересчета КС. Кстати, неудача с методом доп.точки в данном случае наводит на мысль, что и вычисление угла в WCS из OCS даст ошибку при других обстоятельствах.

Кстати, вот матрица WCS->UCS:
ucsMatrix = ((0.0, 1.0, 0.0), (1.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0))
а вот код пересчета:
def wcs2ucs(matrix, x, y, z=0.0):
 ''' transform point from WCS to UCS
 '''
 a,b,c,d = matrix
 xt = x*a[0] + y*b[0] + z*c[0] + d[0]
 yt = x*a[1] + y*b[1] + z*c[1] + d[1]
 zt = x*a[2] + y*b[2] + z*c[2] + d[2]
 return (xt, yt, zt)
И что мне делать с углами, ума не приложу.

2011-06-10

odtExport

Просто и со вкусом. Экспорт доков формата ODT в формат HTML. В консоли, что немаловажно.

odtExport — утилита конвертации из текстового документа OpenDocument (OpenOffice, LibreOffice) в формат HTML.
Возможности
Утилита конвертирует текст и объекты указанные в ODT файле, в HTML. Объекты которые конвертируются:
  • Текст;
  • Ссылки;
  • Таблицы;
  • Врезки;
  • Сноски;
  • Закладки;
  • Списки;
  • Заголовки;
  • Изображения.

cofe.tv/2011/04/odt
code.google.com/p/odt-export

Чтобы запустить тулзу, нужен только Java runtime.
При случае обязательно попробую.

2011-06-09

и доточить напильником

Вчера я забыл сделать важное заявление. Концептуальное :)
Я очень четко понимаю, что пользуясь Линуксом и прочими продуктами Free* и OpenSource я не вправе чего-либо требовать и ожидать сверх того, что авторы пожелают предоставить сообществу. Поэтому все мои бурчалки на тему «ну кто так строит (с) Обыкновенное Чудо» следует воспринимать как недоумение по поводу «почему так а не иначе». Или «а я бы сделал по другому». Сплошное IMHO, короче.

Продолжим где остановились вчера. Ядреный модуль драйвера от nVidia не хочет компиляться (Debian Squeeze). Компайлер сыпет сообщениями типа
#error acpi_walk_namespace() conftest failed!

Пользуясь своим собственным советом, я полностью прочел ридми к драйверу (nvidia.com/XFree86/Linux-x86_64/270.41.19/README/installationandconfiguration), узнал много нового. Но это не помогло.

Узнал как правильно заблокировать nouveau:
the following two lines will need to be added:
blacklist nouveau
options nouveau modeset=0
in file, for example, /etc/modprobe.d/disable-nouveau.conf
nvidia.com/XFree86/Linux-x86_64/270.41.19/README/commonproblems#nouveau

Узнал как просто и как правильно задать версию компилятора, чтобы установщик драйвера не ругался на несовпадение версий текущей и той, что ядро собирали
# cat /proc/version
(gcc version 4.3.5)
# export CC=/usr/bin/gcc-4.3
это как просто. А ниже — куда копать чтобы правильно:
# update-alternatives --list cc
forums.debian.net/viewtopic?f=30&t=55314


И только сильно после, почти случайно, я узнал, что насторожиться надо было в самом начале, когда возникла странная донельзя ошибка
899 ./nvidia-installer: not found

Не надо было ставить либы amd64-libs. Надо было прочесть вот этот пост:

Some distributions have the option of installing a 64-bit kernel for use with all 32-bit userspace programs.
This configuration is not supported by the NVIDIA Linux Graphics Driver.
If you try to install the 64-bit driver package on such a system, you will receive an error like the following:
./nvidia-installer: No such file or directory

nvnews.net/vbulletin/showthread?s=ce7172da527094e880b7e22020852671&t=72490#2

После чего достаточно было сообразить, что у меня именно оно — 32битный дистр (http://cdimage.debian.org/debian-cd/6.0.1a/i386/iso-cd/) и 64разрядное ядро (linux-image-2.6.32-5-amd64), по умолчанию влезло, я его не выбирал. Отдельный вопрос к составителям дистра — нахрена так, неужели проще жить с таким компотом?

Еще раз проверив, не поглючилось ли мне
uname -a
нет, не поглючилось, amd64

я занялся избавлением от лажи. Приблизительно в такой последовательности:
Установил 32разрядное ядро
aptitude install linux-image-2.6.32-5-686-bigmem
Внес правки в конфиг граба (GRUB2), чтобы по умолчанию грузилось новое ядро, да с нужной опцией nomodeset:
nano /etc/grub.d/10_linux
cat /etc/default/grub
cat /boot/grub/grub.cfg
cat /etc/grub.d/00_header
update-grub
cat /boot/grub/grub.cfg
Потом перезагруз
reboot
Проверка — а на каком ядре мы щаз? И удаление старого ядра с довесками:
uname -a
aptitude search ~i64
aptitude purge amd64-libs linux-headers-2.6.32-5-amd64 linux-image-2.6.32-5-amd64
aptitude search ~i64
aptitude purge nvidia-kernel-common
Установка правильных хидеров, компиляция драйвера от nVidia:
aptitude install linux-headers-2.6.32-5-686-bigmem
aptitude update; aptitude safe-upgrade; aptitude full-upgrade
service gdm3 stop
export CC=/usr/bin/gcc-4.3
sh NVIDIA-Linux-x86-270.41.19.run

Вроде получилось. Делал я все это удаленно, из дому. Завтра приду в офис, проверю, как картинка на дисплей выводится.

2011-06-08

фреймбуфер

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

Конкретно. Debian Squeeze 6.0.1а, ставлю на старую машину (мамка A8N-E) но с новой жифорсиной GF420. Оно ставится, но при перезагрузке виснет намертво с черным экраном, на раннем этапе загрузки. Кноппикс тоже виснет, Убунта — аналогично.

Не ломайте мозги в такой ситуации, это глючит фреймбуфер. Добрые люди (составители дистров) очень любят модуль nouveau. Я бы его тоже любил, он хороший, но по странным причинам он не дружит ни с одной жифорсиной из мне доступных. При этом все знают, что эта «новье» глючит, но упорно заталкивают ее в умолчальные конфиги. Добрые люди, да. Нет, ну мне просто любопытно, что было в голове того, кто принимал решение использовать эту хрень в умолчальных конфигурациях?

А теперь полезное. Если вы столкнетесь с такой ситуевиной, когда сразу после начала загрузки машина виснет и на экране нет изображения, попробуйте поправить видеорежим. Например, используя загрузчик (GRUB) добавьте к опциям ядра еще одну: «nomodeset» (без кавычек, понятно). Мне помогло. Потом можно зарубить «новье» на корню, типа так:
# echo blacklist nouveau > /etc/modprobe.d/blacklist-nouveau.conf

А для Кноппикса у меня сработали такие опции:
knoppix nodrm nofb xmodule=vesa

Источники тайного знания:
wiki.debian.org/KernelModesetting
wiki.debian.org/NvidiaGraphicsDrivers
linuxquestions.org/questions/debian-26/debian-squeeze-radeon-4650-agp-startup-problem


Ну и до кучи: невозможно установить нВидиевский драйвер на ядро amd64, идет сообщение о ошибке, вроде такого:
899 ./nvidia-installer: not found
Патамучта гладиолус сначала надо установить либы (и это не очевидно, да):
# aptitude install amd64-libs
Правда ядреный модуль компиляться палюбому не хочет, но это уже другая история.

2011-06-07

AA-12

Дробовик, двенадцатый калибр, автоматический, 300 выстрелов в минуту. Магазин 8 патронов, барабан 20 (вроде как). Выглядит очень устрашающе, особенно в действии.
Что поразительно, очень слабая отдача и вверх практически не задирает, можно стрелять как из пистолета (трехкилограммового, ага).

youtube.com/results?search_query=aa-12

Там есть кусочек из Expendables (Неудержимые), зачистка коридора из АА-12.

Не дробовик — мечта.

2011-06-06

Managing Zope Objects Using External Tools

Zope.book.22.Managing.Zope.Objects.Using.External.Tools.odt - перевод главы №22 зопобука. Опенофисный документ. Глава разьясняет разные способы создания и редактирования обьектов (страниц) сайта (ибо формы в ZMI мало пригодны для серьезной работы). FTP, WebDAV.

Предыдущие главы доступны тут:
sites.google.com/site/vasnake

Осталось еще две главы
zope.org/Documentation/Books/ZopeBook/2_6Edition/CustomZopeObjects
zope.org/Documentation/Books/ZopeBook/2_6Edition/MaintainingZope
и можно будет подбивать бабки.

Хотя в наличии уже редакция зопобука 2.12, а я перевожу 2.6, переводить новую редакцию особого смысла нет, ибо:

The 2.12 edition of this book does not try to write a new book on how-to do Zope development today. Instead it tries to update the original books content to be true and helpful again. Many of the underlying principles of Zope2 have not changed in the last years. The ZMI, security machinery, page templates and how-to use the ZCatalog are still there in an almost unmodified fashion. The general ideas behind object orientation, being Python based and the general architecture are still the same.

docs.zope.org/zope2/zope2book/Preface.html#preface-to-the-2-12-edition

2011-06-04

Начинаю улавливать логику

Таки да, картина устройства мира с точки зрения AutoCAD начинает проясняться. Всё через OCS! Теперь, когда я открыл вам страшную тайну, я должен всех вас убить. С дугами я разобрался, во всяком случае, на имеющемся тестовом материале функции отрабатывают как положено. Отработал дуги и вернулся к polyline bulge. И снова-здорово. В следующем файле булжи отрисовываются в другую сторону! Ну етить-колотить :(

Поскольку вариант с «координаты в WCS а углы в UCS» очевидно не сработал (иначе бы булжи нормально воспроизводились), а вариант «координаты в OCS и углы в OCS» на дугах сработал нормально — остается предположить, что у булжей та же петрушка. И предыдущая моя тирада на эту тему неверна.

Значит, придется и для булжей придумать способ трансформации углов из OCS в WCS. Продать технологию Автодеску, что-ли, если все получится? А то у них нету.

С дугами я справился, высчитывая положение третьей точки на дуге. Дуга тремя точками определяется однозначно, значит, все что надо - переведя известные координаты (центр, две точки) в OCS, найти третью точку. Потом ее координаты перевести в WCS и — можно пользоваться.

С булжами несколько сложней. Чтобы не портить концепцию описания полилинии через опорные точки и булжи, надо сподобиться правильно определить знак булжа (в WCS) — по часовой минус, против часовой плюс. Попробую сделать это через отношения углов у известных в OCS векторов. Если эти отношения меняются после перевода векторов в WCS, то и знак у булжа надо поменять. Как-то так.

2011-06-03

swap

У многих есть видеокарты с гигабайтом видеопамяти, а у некоторых и поболе. Почему бы не задействовать эту память для дела?

Вот пример того, как можно организовать свап-раздел на куске видеопамяти:
gentoo-wiki.info/TIP_Use_memory_on_video_card_as_swap
linux.org.ru/forum/general/6328457

Организация RAM-диска может быть выполнена в качестве «домашнего задания» :) Это не должно быть трудно, бо гентушная инструкция весьма подробна.


Подборка полезных советов-подсказок по Linux:
panuganty.tripod.com/debiantips/boot

2011-06-02

Arc

Был неправ, прошу простить засранца. И насчет координатных систем приврал и насчет интересности тоже.
Есть свежая информация о том, как определяются дуги в Autodesk AutoCAD. И эта информация интересна, хотя и печальна.

Пользуясь своими же выводами (как оказалось, неверными) пытался воспроизвести дуги (ARC), ранее вынутые из Автокада. Для одного файла процедура отработала успешно, для другого дуги нарисовались впуклостью в другую сторону. Тут я опускаю очень много нецензурщины, изреченной мною в сторону Автокада, Автодеска и особенно API АктивноИксового.

Короче, только путем анализа куска файла DXF я смог узнать в деталях, что дуга определяется как кусок окружности, вырезанный из нее двумя радиусами с заданными углами. От стартового угла против часовой стрелки (по возрастанию значения угла) до конечного угла. Центр, радиус и углы хранятся (задаются?) через жопу в OCS! А выводятся (через API ActiveX) в WCS, но только координаты точек, углы никак не переводятся, так и выдаются OCS-ными! Причем, если вместо углов попросить стартовую и стоповые точки (лежащие на дуге), Автокад их координаты выдаст правильно, но может перепутать стоп и старт. Ибо углы у него учтены в OCS.

Теперь надо придумать, как выразить дугу без углов, одними точками, предварительно переведя их в OCS. И потом уже полученный список точек можно перевести обратно в WCS и сохранить.

Надо было на AutoLISP писать, уже бы закончил.

Упоминаемый кусок DXF (я добавил в скобочках расшифровку кодов), если кого прикалывает:
0 (Text string indicating the entity type (fixed))
ARC
  5 (Entity handle; text string of up to 16 hexadecimal digits (fixed))
8C9A
330 (Soft-pointer handle; arbitrary soft pointers to other objects within same DXF file or drawing.
 Translated during INSERT and XREF operations)
1F
100 (Subclass data marker (with derived class name as a string).
 Required for all objects and entity classes that are derived from another concrete class.
 The subclass data marker segregates data defined by different classes in the inheritance chain
 for the same object.
 This is in addition to the requirement for DXF names for each distinct concrete class derived
 from ObjectARX (see "Subclass Markers"))
AcDbEntity
  8 (Layer name (fixed))
0
100
AcDbCircle
 10 (Primary point; this is the start point of a line or text entity, center of a circle, and so on
 DXF: X value of the primary point (followed by Y and Z value codes 20 and 30)
 APP: 3D point (list of three reals))
-2083.621170452556
 20
1840.652320923426
 30
0.0
 40 (Floating-point values (text height, scale factors, and so on))
9.45475941920373
210 (Extrusion direction (fixed)
 DXF: X value of extrusion direction
 APP: 3D extrusion direction vector)
0.0
220 (DXF: Y and Z values of the extrusion direction)
0.0
230
-1.0
100
AcDbArc
 50 (Angles (output in degrees to DXF files and radians through AutoLISP and ObjectARX applications))
168.1934456428115
 51
271.6914156120172

autodesk.com/techpubs/autocad/acad2000/dxf/group_codes_in_numerical_order

2011-06-01

Debian + Nvidia

Несмотря на изрядную пожеванность темы, народ до сих пор испытывает трудности с установкой драйверов к видеокартам от Nvidia. Под Debian-ом, к примеру. Раз тема не иссякает, изложу свою версию, в виде рецепта: как я ставлю нвидиевские видеодрайверы в Дебианчике.

На сайте nvidia.com находите нужный вам драйвер (надо точно знать, какая у вас железка). Выкачиваете. Пока качается, внимательно изучаете ридми к драйверу, например этот:

download.nvidia.com/XFree86/Linux-x86/270.41.19/README

Потом уходите из графики (если была) в текстовую консоль, рутовую (например через CTRL-ALT-F1, root, rootpassw) и тормозите графику (/etc/init.d/gdm3 stop).

Обновляете базу пакетов (кстати, правильно составить sources.list поможет debian.nsu.ru/aptuner)
# aptitude update; aptitude full-upgrade

Крайне желательно удалить уже установленные видеодрайверы, но можно попытаться и без этого.

Ставите необходимое:
uname -r
и посмотреть, какую версию выдаст, у меня 2.6.18-5-686 (была когда-то)
aptitude install linux-kbuild linux-headers-2.6.18-5-686
aptitude install make gcc g++

Ставите драйвер:
# pushd /var/downloads
# sh NVIDIA-Linux-x86-270.41.06.run

Потом ребут, хотя можно и сразу запустить Х-ы (# service gdm3 start ).

Как-то так. Процесс итеративный, надо смотреть, что система сообщает и исправлять ошибки. Для этого надо неплохо разбираться в матчасти. Linux не для ленивых разумом.


И штоп два раза не вставать, две сцылки на годные рецепты. Почта — настройка MTA (postfix, exim4) на обработку виртуальных доменов (email virtual domains):
debian-administration.org/articles/243
debian-administration.org/articles/140

Архив блога

Ярлыки

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)