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

2011-12-30

snapshot

На днях случилось расстройство. Поломалась виртмашина у меня.

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

В Virtualbox это простая и дешевая операция. Скомандовал, типа
VBoxManage snapshot ags.small take snapone
и у тебя уже есть снапшот.
Чтобы откатиться взад, командуй
VBoxManage snapshot ags.small restore snapone
Чтобы убить снапшот (логичнее было бы не «убить» а «внедрить» - содержимое снапа накатывается на состояние машины)
VBoxManage snapshot ags.small delete snapone
Если его не убить, все изменения так и будут записываться в боковую ветку.

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

Вот и в этот раз. Стал я удалять сделанный ранее снап, и не смог. Было это приблизительно так:
VBoxManage snapshot ags.small restore snapone
fail с не-помню-каким сообщением. Плюс сдохла вторая вирмашина (ядреный модуль упал?)
reboot
VBoxManage snapshot ags.small restore snapone
ok
VBoxManage snapshot ags.small delete snapone
VBoxManage: error: Snapshot operation failed. Error message: Hard disk  has more than one child hard disk
Насколько я понял логику механизма, при восстановлении снапшота виртбокс прислюняет к машине новый пустой дисковый контейнер и удаляет старый. Новый он прислюнил а вот старый убить не смог по неизвестной причине. Глюк, да. После чего к машине оказались присоединены два дополнительных диска снапшотной направленности. Надо как-то лишний удалить.
ls -la /extht1/virtsnap/
-rw------- 1 v v      413696 Dec 29 02:11 {62621749-a694-4a15-ae87-c5751ec85e5f}.vdi
-rw------- 1 v v   827740160 Dec 28 17:20 {f3b9f664-24ce-4ea0-b997-c151cd07cbf3}.vdi

Кто из них лишний, понять невозможно. Но можно предположить, что тот, который больше — старый, который должен был быть убит на этапе restore snapone. После принятия такой гипотезы остается малость:
cp /extst1/virt/ags.small/ags.small.vbox ~/ags.small.vbox.old
nano /extst1/virt/ags.small/ags.small.vbox
^K (cut) line with text <HardDisk uuid="{f3b9f664-24ce-4ea0-b997-c151cd07cbf3}" location="/extht1/virtsnap/{f3b9f664-24ce-4ea0-b997-c151cd07cbf3}.vdi"  ...

VBoxManage snapshot ags.small delete snapone

ok

Типа, получилось. Если бы не получилось, пришлось бы восстановить файл конфига (*.vbox) и попробовать удалить другой лишний файл.

Вот так и живем. Вот тут (nerdbynature.de/s9y/?212) автор добился успеха в аналогичной ситуации без грубой (настоятельно не рекомендуемой) ручной правки конфига. Одними командами управлятору. Да, чуть не забыл, мой рецепт сработал для версии Virtualbox 4.1.8. Вообще, судя по ихним форумам, история типичная. Хотя лично у меня вроде как только второй раз за несколько лет.

Вот так и живем. Что приятно, когда имеешь дело с открытыми решениями, проблему побороть можно так или иначе. А вот что делать, когда, к примеру, браузер MS IE не может пройти аутентификацию на MS IIS с использованием схемы NTLM Auth? Судя по логам, не хватает ему трех попыток, чтобы подобрать правильную версию формата ответа. Вот что делать?
Вопрос актуальный. В одной немалой компании из-за этой проблемы потрачено уже немало нервных клеток.

С наступающим!

2011-12-28

Лимерик

Попалось на просторах забавное:

There was a young fellow named Perkin
Who was always jerkin' his gherkin
Said his girlfriend, "Hey Perkin,
Stop jerkin' yer gherkin.
Yer gherkin's for ferkin', not jerkin'!

еще и с вариациями

There once was a young fellow named Perkin
Who always was jerkin his gherkin
Says the wife to young Perkin
"Quit jerkin' yer gherkin,
Yer shirkin' yer ferkin' ya bastard!"

A hairless young harlot named Perkin
When asked why she favoured a merkin,
Replied in a trice
It’s nice for the lice,
Who else would have nowhere to lurk in”


Ли́мерик — форма короткого юмористического стихотворения, появившегося в Великобритании, основанного на обыгрывании бессмыслицы.
...
Традиционно лимерик имеет пять строчек, построенных по схеме AABBA, причём в каноническом виде конец последней строки повторяет конец первой.

Получается, не такой уж и лимерик :)

2011-12-27

Новогоднее

Не знаю как у вас, а у меня новогодние каникулы это время годового бекапа. Спокойно, без спешки, разобрать завалы, скопившиеся за год, рассортировать, упаковать, сложить в несколько разных мест (для надежности) и забыть. Редко когда возникает нужда вынуть что-то из архива. Раз 5 за год бывает ситуевина, когда нужен прошлогодний архив. А позапрошлогодний — практически никогда (никогда не говори «никогда»!). Это про мои данные, документы, проекты и проч. А вот системные файлы я уж давно не бекапил. Беспечный.

На винде вроде как смысла особого не было. Не настолько часто ее переустанавливал, чтобы затеваться с восстановлением. Проще с нуля все накатить. Заодно и от хлама избавиться. На Linux еще проще. Список пакетов сохранил и вроде как достаточно.

Это потому как я уже давно фактически не сисадмин. А вот сисадмин заценит:
толковое обьяснение проблем и сложностей сохранения/восстановления файлов под юниксами. Метаданные, линки и прочее. К сожалению, без готовых рецептов.
rus-linux.net/MyLDP/admin/backing-up-unix_ru
halfgaar.net/backing-up-unix

2011-12-26

Превосходная степень


Сто лет назад, в эпоху мышей с шариками и во времена выхода в свет игрухи Quake III Arena у меня был компьютер так себе, средний. И в нем был акселератор Voodoo, для поиграть. И я помню до сих пор, как я выжимал из железяк всё возможное, только бы поднять частоту кадров в Кваке еще хоть на пару свыше тех 20, что удалось добится отключением в игре всего, что только можно было отключить. Тогда мне это было интересно. В итоге, в лучшем случае я видел кинематографичные 24-25 кадров в секунду. Без разгона и особых оптимизаций я получал кадров 18. И могу уверенно сказать, что играбельность не сильно отличалась в этих двух случаях. Что реально сделало игру комфортной, так это полная смена платоформы, что дало фреймрейт более 30 кадров/сек.

Это я к чему, спросите вы. А к тому, что именно тогда я осознал одну важную штуку — лишние два кадра в секунду — это не достижение. 10 и даже местами 20% разгона не стОят того, чтобы платить за это своим временем и возможной нестабильностью компа. Если и затеваться с апгрейдом, то он должен поднимать общую производительность системы не менее чем на треть. Не менее.

Кстати, про нестабильность. Приблизительно в то же время я на опыте убедился, что разгон (overclocking) компа — занятие для тех, кому надо ставить рекорды а не работать. Если надо работать, разгон лучше убрать. В Наташкиной машине был установлен легендарный Целерон-А, если правильно помню название. Этот камень (он и щаз где-то в коробке с комплектухой валяется) гнался по определению у всех и всегда. Понятное дело, я его разогнал. Машинка проходила абсолютно все тесты, работала безупречно. Никаких проблем вообще. Но разгон я через некоторое время снял. Потому как в Фотошопе, в одном из инструментов (кисть что-ли?), при его, инструмента, применении возникали артефакты. Кисть артефачила по изображению «звездочками», яркими пикселами в произвольных местах картинки. Причем иногда могла и не артефачить. Долго мы искали причину, пока я не снял разгон с камня. Нет разгона — нет артефактов. Такие дела. Я тогда долго не мог поверить, что такой безупречно разгоняемый камень, проходящий все тесты, вынужден работать у меня вполсилы. Но — факт, Фотошоп, как лакмусовая бумажка, показывал вредность разгона.

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

К тому моменту как я дочитал до слов «Радость, которую я испытал...» меня уже было не остановить. Я ржал и матерился одновременно. Громко и неудержимо.
Я, блять, не понимаю, я отказываюсь понимать, как можно радоваться, купив четыре гига оперативки вдвое дороже обычного (двумя, едреныть, планками!), даже если это дает целых десять fucking процентов к скорости чтения/записи.
Я недавно покупал оперативку по 700 рублей за 4 гига (4 одной планкой, взял бы 8-ми гиговые, но не было). И эта память у меня показывает не меньше 18 гиг/секунду. В штатном режиме. А тут автор радуется получив 20 в разгоне. За вдвое большие деньги.
Ну не пиздец?
Ребятки, дорогие мои, за эти деньги лучше возьмите 8 гиг оперативы. Толку будет больше. Гораздо.

Желаю, чтобы все!

2011-12-24

БЭМ

В каждой избушке свои погремушки. Поговорка.

Если у вас потогонка и конвеер, если у вас поточное производство, если у вас очень много однотипных проектов по HTML верстке... если вы работаете в Яндексе, наконец, то (что?). Если все это, то вам надо как-то свести все многообразие и богатство возможностей HTML, CSS, яваскрипт (в контексте верстки) к минимально необходимому набору. Набору примитивов и возможностей их обработки, такому, чтобы как раз хватало на создание ваших типичных проектов. Набор должен быть прост, однозначен, универсален, доступен пониманию армии работников конвеера и, что немаловажно, автоматически обрабатываем.

Встречайте, Яндекс БЭМ:

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

bem.github.com/bem-method/pages/beginning/beginning.ru

Надо будет при случае построить чего-нибудь, используя инструменты БЭМ. При моей нелюбви к занятиям версткой, овладение этими струментами может оказаться полезным.

2011-12-23

Notorious markets

Замечательная новость, Савеловский рынок исключили из списка пиратских.

Examples of positive action at markets that USTR identified in the February 2011 list include the Chinese website, Baidu, identified in the Notorious Markets List for several years, which entered into a landmark licensing agreement with U.S. and other rights holders from the recording industry. At the Ladies Market in Hong Kong, local customs officials took action to remove allegedly infringing goods from the premises, and authorities reported a commitment to continue to undertake enforcement actions at the market. Finally, at the Savelovskiy Market in Russia, management has implemented an action plan to stop the distribution of infringing goods.
These markets are no longer included in the Notorious Markets List. The positive efforts undertaken at those markets will benefit U.S. and other IP right holders.

ustr.gov/about-us/press-office/press-releases/2011/december/ustr-announces-results-special-301-review-notorio
lenta.ru/news/2011/12/21

Надо будет заглянуть, поглядеть, как там, на Савеле...

А вот рутрекер по прежнему в топе нарушителей прав собственности.

2011-12-21

CryptDB

Не слишком давно я видел инфу от IBM, у них вроде как разработали методы гомоморфного шифрования данных. Тогда дискутировали неслабо, обсуждая применимость технологии. А нынче мы имеем рабочее решение, позволяющее хостить свои SQL-БД на вражеском железе. Ибо врагу достанется только зашифрованное нечто. Раскрываться инфа будет только на стороне клиента, обладающего ключами.

Исследователи из Массачусетского технологического института представили проект CryptDB, в рамках которого предпринята попытка решения проблемы безопасного хранения данных в БД, обслуживаемых в облачных сервисах и других неподконтрольных системах.
...
При использовании CryptDB, в процессе выполнения SQL-запросов все действия производятся только с зашифрованными данными, т.е. пользователь может отправить SQL-запрос к СУБД и получить результат без расшифровки информации на стороне сервера (данные будут расшифрованы на оборудовании клиента).
...
Для обеспечения сохранения конфиденциальности информации используется многоуровневая система шифрования, ... Для скрытия данных на каждом уровне используются свои методы гомоморфного шифрования, при которых данные необратимо искажаются, но сохраняется возможность совершения определённых математических операций, которые дадут аналогичные результаты, что и операции над исходными данными....

Манипуляции над зашифрованными данными накладывают ограничения на возможность выполнения вычислений внутри запроса (невозможны операции сравнения для вычисляемых значений, например, нельзя использовать "salary > age*2+10", но можно "salary > age" или "salary > 10"), тем не менее поддерживаются большинство агрегатных функций и стандартных типов данных, таких как integer и varchar/text. CryptDB реализован в виде прокси, не требующего модификации кода СУБД. Для выполнения криптографических операций на стороне СУБД используется набор дополнительных функций (UDF, user-defined functions).
...
CryptDB выполнен в роли надстройки, способной работать с любыми СУБД MySQL 5.1 и PostgreSQL 9, не требуя модификации кода СУБД. Код CryptDB доступен через Git-репозиторий проекта (git clone -b public git://g.csail.mit.edu/cryptdb).

opennet.ru/opennews/art 32610
forbes.com/sites/andygreenberg/2011/12/19/an-mit-magic-trick-computing-on-encrypted-databases-without-ever-decrypting-them
forbes.com/forbes/2009/0713/breakthroughs-privacy-super-secret-encryption
researcher.ibm.com/researcher/view_page 2661



Супер. Остается только узнать, какому классу защиты отвечает такая метода и выяснить точный список «чего нельзя делать» на такой защищенной СУБД.

2011-12-20

Websockets на Python

Автор пишет, что результаты тестирования его удивили. Оно и верно, показать результат втрое уделывающий соратников, такое не всем по плечу. Участники состязаний:

Если вкратце, то получается следующая картина:
sockjs-node может отправлять до 45,000 сообщений в секунду при среднем времени отклика в 200 мс.
sockjs-tornado на cpython 2.6.6 может выдавать до 55,000 сообщений в секунду при времени отклика в 200 мс
sockjs-tornado на pypy 1.7 просто «разрывает» со своими 150,000+ сообщениями в секунду.

Конечно, сервера могут отправлять и большее количество сообщений в секунду, но время отклика растет и приложение перестает быть realtime :-)

habrahabr.ru/blogs/python/134822
mrjoes.github.com/2011/12/15/sockjs-bench#comparison

Представляем команду победителей, команду, убедительно порвавшую соперников:

PyPy is a fast, compliant alternative implementation of the Python language (2.7.1). It has several advantages and distinct features...

Tornado is an open source version of the scalable, non-blocking web server and tools that power FriendFeed. ... it is non-blocking and reasonably fast. Because it is non-blocking and uses epoll or kqueue, it can handle thousands of simultaneous standing connections, which means it is ideal for real-time web services.

SockJS-tornado is a Python server side counterpart of SockJS-client browser library running on top of Tornado framework.

SockJS is a browser JavaScript library that provides a WebSocket-like object. SockJS gives you a coherent, cross-browser, Javascript API which creates a low latency, full duplex, cross-domain communication channel between the browser and the web server.

Выводы? Да вроде все и так ясно.

2011-12-18

Прометей

Потрясающая по простоте и эффективности конструкция:

И финка из начинающего режиссера мгновенно превратилась в сказочную маленькую разбойницу. Лихо вырезала из сосны большое полено, сантиметров тридцать в диаметре и поставила на торец, оно оказалось ей по пояс. Мы наблюдали за ней как дети за фокусником, было видно, что бензопила для нее такая же привычная вещь, как для наших девушек фен.
Дальше она начала резать полено вдоль как тортик, но не до самого низа - чтобы оно не распалось на дольки. Всего четыре прореза.
Потом финка открутила какую то крышечку и в центр деревянного тортика налила из бензопилы несколько капель масла, чуть плеснула бензина из бачка, отдала хозяину агрегат, вынула из варежки зажигалку и чиркнула…
От начала ее работы, до появления у нас самой настоящей газовой плиты прошла ровно минута. Еще через десять, мы все пили мятный чай, а на деревянной конфорке уже шкворчала картошка с салом. Огонь никак не нужно было поддерживать, он горел сам по себе - красиво и ровно выжигая полено изнутри, как будто в середине бревна была спрятана хитроумная газобаллонная конструкция. И продолжалось это не пять и не десять минут, а почти час…
Ах какие живописные лица были у бывалых лесорубов. Жаль, что камера замерзла, а то бы заснял для истории. Поначалу они недоверчиво шептались ожидая подвоха, но когда поняли, что подвоха не будет и что их жизнь поделилась на «до» и «после», тут уж излили душу радостными междометиями:
- Хуе…
- О нихх…
- Твою жеж мать… ну пп…
- С хера…б…
Если бы Илма вдруг крикнула – «На колени!»
Я не сомневаюсь, что лесорубы попадали бы.
Больше в тот день уже никто не работал, они рвали друг у друга пилы и строили деревянные буржуйки, все еще не веря своему счастью.
И когда мы в кузове трактора уезжали из леса, нас провожала снежная поляна украшенная десятками волшебных огней и радостные бегущие люди которым с этого дня уже на фиг не нужны были ни дрова, ни мангал, ни проволочка на сковородке…

storyofgrubas.livejournal.com/91742
survivalbook.ru/taezhnaya-svecha-2
entus.narod.ru/primus/primus_st
youtube.com/watch?v=ILcagOV_ojo

2011-12-17

The Joel test

Во вчерашнем посте я дал сцыль на тест для сисадминов. Программерам там тоже есть что почерпнуть. Что бы не думали себе некоторые, хороший программер должен понимать, как оно все работает. Да ладно, я не об этом. Я о том, что в тесте том была сцыль на тест Джоела, для программеров. Он очень коротокий, этот тест:

Do you use source control?
Can you make a build in one step?
Do you make daily builds?
Do you have a bug database?
Do you fix bugs before writing new code?
Do you have an up-to-date schedule?
Do you have a spec?
Do programmers have quiet working conditions?
Do you use the best tools money can buy?
Do you have testers?
Do new candidates write code during their interview?
Do you do hallway usability testing?

joelonsoftware.com/articles/fog0000000043

Если на 11 вопросов ответ — да, то жить можно. Если меньше, у вас проблемы. Пояснения читайте в статье.

2011-12-16

Sysadmin

Вышел Silverlight 5 - citforum.ru/news/27530
Есть слухи, что это последний сильверлайт. Индустрия переходит на HTML5.


33 коровы 32 вопроса сисадмину, тест Лимончелли. Прекрасный текст и замечательный тест

Цель этого теста — упростить общую оценку команды СА. Он будет полезен и руководителю команды, и ведущим специалистам, и рядовым членам команды. Тест также может служить способом оценки потенциального места работы: если вы не хотите присоединиться к кораблю дураков, вы должны выяснить у вашего возможного работодателя, какие из практик они используют, а какие — нет. И не так важно, сколько они набирают очков, как отношение: нежелание или невозможность изменений сигнализирует опасность.

everythingsysadmin.com/the-test
n-ix.com/ipesin/translations/other/32LimoncelliTest
opennet.ru/opennews/art 32531

Сисадминам учить наизусть.


Кстати, а знаете ли вы, что если у вас RAID5 из 7-ми двухтерабайтников, и, не приведи Аллах, отказал один диск, шансы потерять весь массив составляют 62%?
Нет, не знаете?

The problem with RAID 5 is that disk drives have read errors. SATA drives are commonly specified with an unrecoverable read error rate (URE) of 10^14. Which means that once every 200,000,000 sectors, the disk will not be able to read a sector.

zdnet.com/blog/storage/why-raid-6-stops-working-in-2019/805

А я-то думал, зачем им RAID6? Теперь понятно зачем. А зеркало (RAID1) еще надежней.

2011-12-15

If

Уже который день не идет из головы, засело как заноза, выражение
... had it not been for you.
Это из фильмы Finding Forrester.
Перевести можно «... не было бы если бы не ты». Не знаю как носителям языка, а для меня это сложное выражение. Чтобы понять его смысл, надо либо знать его как устойчивое выражение, либо провести разбор (морфологический, если не путаю). А вот в разборах я ни бельмеса. В школе я эту тему прошел мимо. Отдельно доставляет «for» имеющее значение, по мюллеру, «4) указывает на причину, повод от, ради; tocry (to shout) ~ joy плакать (кричать) отрадости;».

Два применения такого оборота:
english-test.net/forum/ftopic51082
indianexpress.com/news/i-might-not-be-standing-before-you-today-had-it-not-been-for-gandhi-his-message


До кучи, еще из аглицкого
...
If you can fill the unforgiving minute
With sixty seconds' worth of distance run,
Yours is the Earth and everything that's in it,
And--which is more--you'll be a Man, my son!

Богоподобный Киплинг, последняя строфа из поэмы «If».
Еще мне вот это нравится - R.Kipling. The White Man's Burden.


Некоторые полагают, что
...аглицкий язык - сигнально-информационный, а русский - эмоциональный, подтекстовый...
Профессору виднее, конечно. Но мне так не кажется.

2011-12-14

Redis-ка

Redis is an open source, advanced key-value store.
Часто упоминается как сервер структурированных данных, поскольку запись по ключу может содержать строки, хеши, списки, наборы и сортированные наборы.

redis.io/topics/introduction

Она же No-SQL БД, держащая эту БД в оперативке, что дает офигительную скорость.

Попробуйте пообщаться с Редиской через консоль прямо в браузере:
try.redis-db.com



Интересная новость

два исследователя из Дартмутского университета выступили с идеей создания расширенных вариантов утилит diff и grep для обработки сложных типов данных
...
В качестве примеров ... можно привести параметры сетевых интерфейсов в Cisco IOS или настройки виртуальных хостов Apache....
Например, в настройки может быть внесено всего два изменения, но за счет перемещения окружающих изменение данных, diff (традиционный) может отобразить десяток изменений
...

opennet.ru/opennews/art 32513
nixp.ru/news

Давно пора что-то эдакое сделать. А то, к примеру, дадут тебе два одинаковых XML-я и давай, ищи между ними разницу, когда они отформатированы как придется.
Любопытно, как будут выглядеть конфиги этих E-grep и Е-diff?

2011-12-13

Google велик

Google могучЪ. Но не слишком эффективен?
В день гугелем пользуется мильярд человек. Серверов у гугеля мильён. Получаем тыщу человек на сервер в день. Это не есть много. Но, правда, и не мало.
На мильен серверов Google имеет тридцать тыщ персонала. Получаем тридцать серверов на сотрудника. Это не есть много. Хотя, учтя, что с непосредственно с серверами работает не более 10% народу, получаем много.

Вот такая занимательная арифметика. Хотите больше? Пжалте:

insight-it.ru/masshtabiruemost/arkhitektura-google-2011

а заодно и это, в тему:
insight-it.ru/masshtabiruemost/10-izvestnykh-masshtabiruemykh-arkhitekturnykh-shablonov

2011-12-11

Профи

Нынче один из самых модных языков, для серверных задач, это Эрланг. Штука мощная, если не пугает лиспо-подобная стилистика. Пожалте, иллюстрация: фиддлер-лайт на эрланге
easy-coding.blogspot.com/2011/11/tcpip-proxy-erlange
писано С++ профессионалом, в целях изучения нового языка.


О, кстати, а вот еще один С++ про:
cdriper-rss.livejournal.com/30830
Прошелся тяжким катком по Джону Кармаку.

Формально — все правда. Чего уж. Код написанный Кармаком нельзя назвать образцовым. Вот только, сдается мне, если бы Джон задумывался о стройности и изящности кода, не было бы ни Doom, ни Quake. Поскольку движки написаны в срок (более того, есть сведения, что Кармак выдает свой код сильно заранее) и работают, нет причин для беспокойства. Игры продаются, деньги прут. Более того, код логичен и вполне человекочитаем. Кому надо, тот сам его отрефакторит.
Короче, сдается мне, Джон из тех людей, которым проще переписать изрядный кусок кода, нежели задумываться о всяких там принципах типа DRY. Я знаю таких. Они пишут быстро. Наверное, потому как не задумаются о чепухе и не гнушаются черной работы (переписывать). Правда, использовать потом, то, что они понаписали, практически невозможно. В этом отношении код Джона просто идеален.

Как же мне нравится, когда профессионалы рассуждают о своем, профессиональном. Просто пестня!

2011-12-10

ORB PyRo

PyRo, точнее Pyro, это Python Remote Objects. Библиотека берет на себя функции ORB. Фишка в том, что программеру очень легко добавить сетевое взаимодействие. Необходимо добавить всего несколько строк к уже имеющейся логике. Смотрите сами
# saved as greeting.py
import Pyro4
class GreetingMaker(object):
    def get_fortune(self, name):
        return "Hello, {0}. Here is your fortune message:\n" \
               "Behold the warranty -- the bold print giveth and the fine print taketh away.".format(name)

greeting_maker=GreetingMaker()
daemon=Pyro4.Daemon()                 # make a Pyro daemon
uri=daemon.register(greeting_maker)   # register the greeting object as a Pyro object
print "Ready. Object uri =", uri      # print the uri so we can use it in the client later
daemon.requestLoop()                  # start the event loop of the server to wait for calls


# saved as client.py
import Pyro4
uri=raw_input("What is the Pyro uri of the greeting object? ").strip()
name=raw_input("What is your name? ").strip()
greeting_maker=Pyro4.Proxy(uri)          # get a Pyro proxy to the greeting object
print greeting_maker.get_fortune(name)   # call method normally
Модуль greeting.py стартуем на одной машине, модуль client.py — на другой. После чего, клиент получает от сервера результат отработки функции GreetingMaker.get_fortune.

packages.python.org/Pyro4/intro.html#simple-example
irmen.home.xs4all.nl/pyro

Я не видал еще более простого способа вызвать функцию с сетевого узла. Прэлэстно, однозначно.

2011-12-09

игра

Вчера я не пошел в контору, работал дома. Сумел обработать 11 помидоров. Сегодня я отправился в контору, где наработал целый 1 (один) помидор. Ужасно :)

Конечно, если упомянуть, что в середине второго помидора все здание обесточили, то картина меняется. Вот что значит — не всю правду сказать :)
Поскольку второй помидор закончить я не успел, он не считается. А потом включился свет, я поднимал сервера, было не до помидоров. А потом начальник сказал «а не пойти ли нам по домам» и мы пошли. Вот так и вышло. Вчера, дома — 11. Сегодня, в конторе — 1.

Что такое помидоры? Это, знаете ли, такие овощи-фрукты. На грядках растут. А еще это такая игра себя с собой при помощи снаряжения — таймера. Правила игры очень простые: один помидор = 25 минут непрерывной работы над определенной задачей и потом 5 минут перерыв. Через четыре помидора длинный перерыв — 25 минут. Помидор неделим, если вы отвлеклись от задачи, помидор удаляется и не считается. В целом — это главное, остальное уже мелочи. Конечно, никто никого не гонит, начинать следующий помидор прям сразу за предыдущим нет нужды, как и по первому писку таймера вскакивать и бежать на перерыв/к верстаку. Но вы же чуете (психология, мать ее), время-то тикает! Если помидор от помидора класть далеко, к концу рабочего дня их выйдет немного. Поэтому перерывы между помидорами выходят небольшие.

Я считаю, за офисную вахту — 8 часов, сделать 12 помидоров можно не напрягаясь особо.

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

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

Таймер подойдет любой. Я себе на андроидный комм поставил почти первую попавшуюся программулину, найденную в маркете по слову «pomodoro».

Спасибо Фрицу за наводку. Рекомендую.

en.wikipedia.org/wiki/Pomodoro_Technique
pomodorotechnique.com

2011-12-08

night hoss

Фильма True Grit, предпоследняя сцена, реплика:

...Reuben had a complaint what he referred to as "night hoss"...

Вот тут
imdb.com/title/tt1403865/board/flat/186895588
есть версия, как понимать сказанное. На мой взгляд, хорошая, годная версия. Рубен жаловался на то, что ему снятся кошмары.

Прикольно, игра слов — nightmare (кошмар, дурной сон), night-mare (ночь-кобыла) и night-hoss (ночь-лошадь).

Кстати, вот нафига вот такое делать:
compliant
complaint
И произносится почти одинаково. У меня в таких случаях стабильно провалы в памяти и путаница. Трудности перевода, да.

2011-12-07

HMC

Hybrid Memory Cube (HMC) — это прорыв! 128 гигабайт в секунду (да ладно, я согласный на 100, нынче мы имеем в лучшем случае 10 ГБ/с с одного канала) нам обещают Micron вместе с IBM. В том смысле, что вот-вот они начнут производить оперативную память для компов, обладающую такой шаблоноразрывающей скоростью.

cnews.ru/news/2011/12/02/466942
micron.com/innovations/hmc

Это нечто.
Думаю, не пройдет и пяти лет, как у нас будет возможность посчитать вообще всё. К примеру, заштатная телестудия сможет не снимать новости а генерировать их :)
Прощай, реальность.

2011-12-05

Не Tor-ом единым

Смешное название - «айтупи». Типа «ай! тупи!». А на самом деле Invisible Internet Project, что можно перевести как Проект Интернета-невидимки.

Designed and optimized for hidden services, which are much faster than in Tor. Fully distributed and self organizing.

I2P нужен для построения свободного, защищенного, анонимного интранета, в котором есть узлы-серверы и узлы-клиенты. Серверы могут быть как обычными (если не считать анонимности) вебсайтами так и чем угодно. Хотя, насколько я понимаю, основной трафик в этом интранете создают жители цивилизованных стран (домен DE какбе намекает), качающие запрещенные у них торренты. Поскольку трафик шифруется и анонимизируется, отловить качков практически невозможно. Во всяком случае, этот неуловимый Джо будет неуловим, пока есть несравнимо больше беспечных качков на открытых каналах.

Инструмент можно использовать как анонимайзер, но фишка в том, что никто не хочет быть outProxy, т.е. тем узлом, на котором формируются запросы к «опасному» традиционному узлу, скажем, серверу с публикацией «Майн Кампф». Ведь если что, то люди в черном придут к владельцу outProxy, а на такой риск идти никто не хочет. Ведь открыть такой аутПрокси, это все равно что сделать из своего WiFi роутера публичную точку доступа.

Чтобы осознать такой тренд, мне хватило прочесть три абзаца из FAQ:

Misconception
i2p2.de/faq

i2p2.de/how_networkcomparisons
ru.wikipedia.org/wiki/I2P
en.wikipedia.org/wiki/I2P

Вещь полезная однозначно.

2011-12-04

vim

Как перестать бояться и начать использовать vim:
jenyay.net/Programming/Vim

Разжевано достаточно для того, чтобы нубы могли начать.

У этого же автора есть интересный проект: реализация алгоритма роя частиц:
jenyay.net/Programming/ParticleSwarm
а также много других интересностей.

Вообще, вычисления методом PSO натурально параллелизуются, что нынче большой плюс к карме.

2011-12-02

Как оно работает

VirtualBox.Technical background

Почему для виртуализации надо брать Core i7; чем поддержка виртуализации от AMD лучше таковой от Intel; как и когда переписывается исполняемый код; как выдать еще несколько процентов производительности ... и много всякого другого, интересного тем человекам, кто хочет знать как работает виртуализация

virtualbox.org/manual/ch10

Написано вполне доступно для айтишника среднего уровня.


И практическая полезняшка на закуску.

На днях заметил неладное — в адресной строке Firefox пропадают префиксы. Надо мне скопировать сцыль из адресной строки, ожидаю на выходе нечто вроде http://www.blabla... а получаю www.blabla...
Непорядок.
Как это исправить. Идем на страницу about:config и выставляем параметр browser.urlbar.trimURLs в false

Attachment

Какому веб-разработчику не приходилось грузить апельсины бочками отгружать файлы? В этом деле важно не забыть про правильные заголовки ответа, в частности «Content-Disposition».

Что любопытно, есть страница, на которой собраны результаты тестов разных браузеров на разные варианты этого поля. Что еще интереснее, оказывается, достаточно имя файла закодировать в UTF-8 и заключить его в кавычки, отбив лишние кавычки слешами:
Content-Disposition: attachment; filename="\"quoting\" tested.html"

greenbytes.de/tech/tc2231/#attwithasciifnescapedquote

Это ничего, что отбитые кавычки браузерами пока не воспринимаются толком, в MS Windows в именах файлов кавычки запрещены великим Биллом. А юниксоиды сами разберутся :)


Полезняшки в тему

Пощелкав кнопками подобрать оформление таблички. HTML and CSS Table Border Style Wizard
somacon.com/p141
quackit.com/html/html_table_tutorial

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

2011-11-30

Silverlight

Говорят, 5-й Silverlight будет последним. Слухи такие. А мы тут, как идиоты, под сильвер аппликухи пытаемся делать. Ужас какой.

engadget.com/2011/11/09/talk-mounts-that-version-5-could-be-silverlights-last-might-on
microsoft.com/silverlight/future
weblogs.asp.net/scottgu/archive/2010/11/04/silverlight-questions
habrahabr.ru/company/microsoft/blog/107582
habrahabr.ru/blogs/silverlight/132298

SQL, аналитика

MySQL, переменные в запросах. Хорошая, годная статья. В красках проиллюстрировано использование выборки «окном», отрицательные стороны индексов, использование переменных в запросах и ваще webew.ru/articles/3923.webew

Доп.материалы по теме
rsdn.ru/article/db/WindowFunctions
olap.ru/home.asp?artId=891
asuxxi.narod.ru/oradoc/ora/ora065
docs.google.com/Doc?id=ddd4649x_4ggr4npc3

2011-11-29

Не надо жадничать

Боюсь, что уже поздно, но ведь лучше поздно чем никогда, правда? 15 ноября была опубликована глава из Руководства Администратора Debian. С целью подтолкнуть сбор средств на благую цель — сделать это руководство бесплатным приложением к дистрибутиву. Глава доступна в виде PDF файла. В ней рассказано про APT-и-компания

raphaelhertzog.com/2011/11/15/20-things-to-learn-with-the-free-chapter-of-the-debian-administrators-handbook

Я залил 10 евро. А вы?


А еще Intel подготовил нам няшку — чипсет с четырехканальной памятью, полоса до 52 гигабайт/секунду. На борту до 64 гигабайт DDR-3 1600 Mhz. Процессоры нынче 6-ти ядерные, в следующем году должны появится 8-ми ядерные на техпроцессе 22 нанометра. А пока этого техпроцесса нет, то 6-ти ядерники выдают тепла до 130 Вт. Короче, к концу следующего года надо планировать апгрейд. Путем замены мамки, камня, памяти. Летать будет — только держись.

tomshardware.com/reviews/core-i7-3960x-x79-performance
wikipedia.org/wiki/Sandy_Bridge#Ivy_Bridge
anandtech.com/show/5091/intel-core-i7-3960x-sandy-bridge-e-review-keeping-the-high-end-alive

2011-11-28

Что за напасть

Только за сегодня сразу два показательных поста в моей ленте. Про оперативную работу на местах:

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

dalnoboi.livejournal.com/151591


Про обработку заявлений от граждан:
...
Кто-то скажет, что я ничего не добился. Это не так. Больше такого случая не повторится, как минимум пару лет.

flavorchemist.livejournal.com/52736

То ли радоваться успехам, то ли огорчаться податливости пропаганде. Полезнее радоваться, разумеется.

2011-11-26

Вполне электронная

Я приятно удивлен! На сайте госдумы вполне приличный поиск законопроектов, и мало того, к поиску сделан внешний API. И еще БД переехала с Oracle на PostgreSQL. Просто разрыв шаблона — как-то я уже привык полагать, что ничего кроме потемкинских деревень у государевых людей не увидишь. А тут такое.

...
Оптимизация БД позволила снизить время обработки тестовой выборки из 65 тысяч поисковых запросов с 10 часов до 15 минут.
...

habrahabr.ru/blogs/e_gov/133305


а в это время, в цивилизованных странах
androidsecuritytest.com/features/logs-and-services/loggers/carrieriq
xda-developers.com/android/the-rootkit-of-all-evil-ciq
4pda.ru/2011/11/24/50519

2011-11-25

yield

Генераторы — это прекрасная штука. И тут появляется он, йилд:

Для понимания, что делает yield, необходимо понимать, что такое генераторы. Генераторам же предшествуют итераторы
...
Всё, к чему можно применить конструкцию «for… in...», является итерируемым объектом: списки, строки, файлы…
...
Генераторы это тоже итерируемые объекты, но прочитать их можно лишь один раз. Это связано с тем, что они не хранят значения в памяти, а генерируют их на лету
...
Yield это ключевое слово, которое используется примерно как return — отличие в том, что функция вернёт генератор

habrahabr.ru/blogs/python/132554

Я для себя уяснил тему генераторов и йилда после написания такого кусочка кода:

def fib():
    a, b = 0, 1
    while 1:
        yield b # return and continue
        a, b = b, a+b
        if b > 100:
            return

def testYeld():
    """ yeld example (http://www.python.org/dev/peps/pep-0255/) """
    print 'Fibonacci by generator func, aka yeld op: ', list(fib())
    print 'iterate by hand:'
    gen = fib(); ln = ''
    for x in gen:
        ln += str(x) + ', '
    print ln


И немного серебрянки.
Нормальное, кастомизированное контекстное меню (ПКМ) для Silverlight-ных аппликух: c-sharpcorner.com/uploadfile/dpatra/right-click-and-context-menu-in-silverlight-4

2011-11-24

Трудности перевода

Вот вроде и стандарты есть, и POSIX по определению — portable, а все равно, никуда не деться от вот таких няшек:

if (getenv("A_FLAG")) {
...
}
...
А корень зла тут в том, что после putenv() результат getenv() может стать либо NULL, либо "", в зависимости от платформы.

easy-coding.blogspot.com/2011/11/getenv-putenv

Пока есть из чего делать электричество, труд наш бесконечен. И это не может не радовать — без куска хлеба не останемся :(


А вот пхпистам на заметку, годная статья:

Хотел было назвать статью «профессиональное PHP программирование», но по факту — это лишь «заметки бывалого», которые будут полезны начинающим разработчикам, хотя, возможно, привлеку внимание и «старшего» поколения ;)

anton.shevchuk.name/php/about-php

2011-11-23

Сизиф.js

Почему я стараюсь не сочинять текст в окне браузера а копипастить в него:

Бывали ли у вас случаи, когда во время долгого заполнения нудной формы или написания красноречивого и пылкого комментария *внезапно* крашился браузер? Или вы закрывали вкладку, в которой работаете, или отключалось электропитание (а ИБП, по известному закону, нет)?
...
В результате была написана простенькая свистелка, способная хранить данные, вводимые в форму, в Local Storage браузера и при повторной загрузке той же страницы (query params matter) заполнять ими форму. Данные конкретной формы в Local Storage чистятся при её отправке или ресете.

habrahabr.ru/blogs/webdev/131288

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

Хотя, если Sisiphus будет помечать оберегаемую форму характерным узнаваемым значком, чтобы пользователи сразу видели, что они под «защитой», да если автоочистку сделать настраиваемой (события, таймер, отмена автоочистки), набирать текст прямо в браузере было бы не так сцыкотно.

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

2011-11-22

Язык

Как же все-таки приятно послушать неравнодушного профессионала, толкующего о своем (и твоем):

Страуструп поступил очень мудро, обеспечив практически полную совместимость своего детища со сверх популярным и тогда, и что более удивительно -- сейчас, Си. Если бы не этот шаг, вряд ли бы плюсы стали бы тем, чем они стали. Но это достоинство языка с каждым днем становится все большим и большим его недостатком, добавляя множество дыр и низкоуровневых проблем в язык вроде как высокоуровневый и современный. Многие до сих пор так толком и не понимаю, что С и C++ это два совершенно разных языка, на которых нужно писать совершенно по-разному. И расхожее сочетание "C/C++" это просто какой-то root of all evil. Мне сплошь и рядом попадаются люди, которые худо-бедно программировали на Си, потом за день выучили ключевое слово "class" и стали считать себя большими гуру в плюсах (к примеру, такой случай). "Специалист" подобного рода узнается слету -- у него в коде вы обязательно найдете любимый printf... Плюсы очень мощный и одновременно довольно сложный инструмент, на овладение и глубокое понимание которого требуется много времени. Без полной перестройки мозгов начать программировать на C++ после С никак не получится, и те, кто этого не понимает, серьезно портят репутацию языка. Когда Линус Торвальдс, ни черта на смыслящий в C++, начинает поучать других на тему, почему плюсы это зло, выглядит это чертовски комично.
...
Лично я не считаю, в отличии от многих, что новый стандарт это революция, и C++11 это совершенно новый язык. Дело в том, что C++98 несет в себе просто нереальное количество недодуманностей, ограничений и откровенных недоработок, поэтому я бы сказал, что новый стандарт разрабатывал Капитан Очевидность и главная задача, которая стояла перед ним -- латание старых дыр и огрех, затянувшееся на непростительные 10+ лет.
Я отношу себя к той категории людей, которым не нужно читать умные толстые книжки о том, чем может быть вам полезно то или иное новшество в языке. Я из тех, кто много много лет в нетерпении ерзал на стуле, ожидая, когда же наконец комитет закроет все эти бесчисленные проблемы в дизайне моего любимого языка...

cdriper-rss.livejournal.com/30406

Сто лет я не писал на С/С++. Но еще помню как радовался обьектности, перейдя с простого С. И как же мне хорошо сейчас, когда я пишу на Python и прочей динамике :)

Что поделать, C'est la vie. Недостатки C++ обусловлены его достоинствами. Это инструмент из разряда тех, которые нельзя давать в руки недоучкам без присмотра. Я имею в виду большие проекты, для мелких поделок неважно чем винтики крутить, толковой отверткой или мультитулом. Вообще, нынче представляется разумным большие проекты писать не на C++ а на чем-нибудь более безопасном. Вроде Java или C#. И не надо сразу кричать про производительность получаемого кода, если очень надо, торомозной код можно и на ассемблере изложить.


А я тут, кстати, декораторами побаловался:
def testDecorators():
 print 'testDecorators...'

 class decorBeforeAfter(object):
  def __init__(self, f):
   print 'decorBeforeAfter init...'
   self.f = f
  def __call__(self, *args, **kws):
   print "before", self.f.__name__
   res = self.f(*args, **kws)
   print "after", self.f.__name__
   return res

 def checkReg(fn, *args, **kwargs):
  print 'checkReg [%s]...' % fn.__name__
  def crFunc(*args, **kwargs):
   print 'crFunc [%s]...' % fn.__name__
   for a in args:
    print '  arg=[%s]' % a
   for k in kwargs:
    print '  kvarg[%s]=[%s]' % (k, kwargs[k])
   res = fn(*args, **kwargs)
   print 'crFunc done'
   return res
  print 'checkReg done'
  return crFunc

 print 'define doWork...'
 # @decorBeforeAfter
 @checkReg
 def doWork(a, b, c='baz', d=''):
  print 'doWork a=[%s], b=[%s], c=[%s], d=[%s]' % (a,b,c,d)
  return 'qux'

 print 'invoke doWork...'
 res = doWork('foo', 'bar', d='oops')
 print 'res = [%s]' % res
#def testDecorators():

Понравилось, но не очень. Код перестает быть прозрачным и безопасным — IMHO, ясен пончик. Хотя если не вдаваться в детали реализации, код читать заметно легче.

artima.com/weblogs/viewpost.jsp?thread=240808
ibm.com/developerworks/linux/library/l-cpdecor
wiki.python.org/moin/PythonDecorators
wiki.python.org/moin/PythonDecoratorLibrary#Singleton
saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python

2011-11-21

Ringtone

Что-то по вечерам стало так лениво, хоть ложись и глазки закрывай. Для разгона посмотрел Бешеных Псов Тарантиновских. И захотелось мне песенку из саундтрека в телефон закинуть, в качестве рингтона.

Нашел на ютубе ролик, скачал, конвертнул в mp3, отправил в тел по почте (лень было блютуз запускать :). Взял тел, открыл почту, скачал песенку, перебросил ее в папку /sdcard/media/ringtones. Пытаюсь назначить песенку рингтоном — не играет и не назначается. Пытаюсь проиграть стандартным медиаплеером — не играется, говорит, что «данный формат не поддерживается». Вот напасть.

Повторил все телодвижения, только уже с форматом OGG, через блютус попробовал. Также безуспешно.

А засада оказалась в том, что в Андроиде вся эта рингтоновая тряхомудия интегрирована с медиатекой. Файл регистрируется в медиатеке в процессе его скачивания, что через Интернет, что через блютус. Если скачанный файл вручную переместить, медиатека его потеряет. Заголовок есть, файла нет. При этом никто не говорит, что, мол «не могу найти файл». Говорит, что «формат не поддерживается». Кнопки «зарегистрировать в медиатеке» нету, кнопки «переиндексировать хранилище» нету. Справится с этой напастью можно либо перезапустив аппарат, либо перемонтировав карту памяти, через настройки — хранилище.

И вот кому послать горячий привет? Пусть ему станет горячо.

Заклинание получения песенки.ogg из ютубовского ролика:
ffmpeg -i George_Baker_Selection_Little_Green_Bag.flv -ac 2 -f wav lgb.wav
ffmpeg -i lgb.wav -acodec libvorbis -aq 6 lgb.ogg

linuxconfig.org/ffmpeg-audio-format-conversions
en.wikipedia.org/wiki/Vorbis#Technical_details
linuxquestions.org/questions/linux-software-2/ffmpeg-vorbis-vs-libvorbis

2011-11-18

Make

Практика применения тулзы make

Утилита Make вполне гибкая и может отследить точно, что нужно пересобрать, чтобы всё было обновлено, и при этом не пересобирать лишнее. Вот как выглядит правило в Makefile о том, что серверу Джанго нужно:

.PHONY: run
run: bin/django syncdb bin/sass compile_trans
./bin/django runserver 0.0.0.0:8000

habrahabr.ru/blogs/django/132524

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

А Fabric круче. И, главное, на Python :)

2011-11-17

Неделя не задалась

С понедельника стала осыпаться моя новая машинка. Проработала без упрека больше двух недель и вдруг пошли падающие процессы. В среду нашлась сбойная планка памяти, одна из четырех по 4 гига. Когда в среду вечером я запустил комп на трех рабочих планках, стабильная работа прочувствовалась как бальзам на раны.

Добавить к этому прочие неприятности, вроде битых секторов на дисках виртмашин, битых БД, сдохший у начальника телефон, прочие нервотрепки — точно, неделя не задалась.

Но это все не интересно. Интересно вот что:

Антрополог Дуайт Рид (Dwight W. Read) ... полагает, что интеллектуальные способности особенно сильно зависят от объема так называемой рабочей памяти (working memory). Говоря упрощенно, это та часть памяти, в которой хранится и обрабатывается информация, непосредственно необходимая субъекту в данный момент.

По современным представлениям, рабочая память имеет довольно сложную структуру. Центральное место в ней занимает «исполнительный компонент» (central executive component), ... Его главная задача — удерживать внимание на той информации, которая необходима субъекту для решения насущных задач. Сама эта информация может храниться где-то еще. Ее обычно называют кратковременной памятью (short-term memory) и рассматривают как компонент рабочей памяти... Компьютерным аналогом кратковременной памяти (понимаемой как часть рабочей памяти) являются регистры процессора. Кроме того, в состав рабочей памяти входит ряд вспомогательных структур (см. Baddeley's model of working memory).

Ключевое значение имеет объем кратковременной памяти, измеряемый количеством идей или концепций, с которыми «исполнительный компонент» рабочей памяти может работать одновременно. Эту важнейшую характеристику рабочей памяти называют short-term working memory capacity (ST-WMC). Многочисленные эксперименты показали, что у человека ST-WMC ≈ 7 (хотя некоторые исследователи склоняются к более низким оценкам, порядка 4-5). Большинство животных не может обдумывать комплексно, как часть единой логической операции, более одной, максимум двух идей (ST-WMC ≤ 2).
...
Шимпанзе из Таи манипулируют двумя объектами: орехом и камнем, который используется в качестве молотка (см. видео). Наковальней служат элементы рельефа, которыми не нужно манипулировать — например, плоский выход скальных пород или корень дерева. В Таи все взрослые обезьяны умеют колоть орехи. Очевидно, управляться с двумя объектами может научиться любой шимпанзе.

Шимпанзе из Боссу пытаются совладать сразу с тремя объектами, потому что у них принято использовать в качестве наковальни небольшой камень, который нужно выбрать и правильно установить. Обычно наковальня получается шаткая, и ее нужно придерживать. Иногда используется и четвертый объект — камень-клин, которым шимпанзе подпирают наковальню, чтобы не шаталась. Но в этом случае сначала обезьяна возится с двумя объектами (наковальней и клином), а потом с тремя (наковальней, которую всё равно нужно придерживать, орехом и молотом). С четырьмя предметами одновременно никто работать не пытается (клин не придерживают).

Обучение искусству раскалывания орехов протекает долго и мучительно. В возрасте полутора лет обезьяны начинают имитировать отдельные действия, входящие в комплекс (например, стучат по ореху рукой). Примерно в 2,5 года они уже выполняют последовательности из двух действий (например, кладут орех на камень и стучат рукой). Лишь в возрасте 3,5 лет они оказываются в состоянии правильно выполнить всю цепочку операций: найти наковальню, положить орех и стукнуть камнем.

Если шимпанзе из Боссу не научился колоть орехи до 5 лет, то не научится уже никогда. Бедная обезьяна будет до конца своих дней с завистью смотреть на соплеменников, ловко колющих орехи, но так и не сообразит, в чём же тут секрет. Таких «двоечников» в популяции Боссу примерно четверть. Они иногда возобновляют попытки, но не могут понять, что нужны три предмета, и пытаются обойтись двумя.

elementy.ru/ newsid 430954
dn54.livejournal.com/142540

Получается что? Получается, что те, у кого рабочая память поширше, справляются со сложными задачками легше :)
А уж если кому не дано (в детстве межушную мышцу не прокачали?), те могут и под презрительное «дебил» попасть.

В этом отношении, как мне кажется, в славное племя программистов попадют сливки — людям с относительно небольшой рабочей памятью очень сложно вести серьезные программные проекты. Уж очень много «идей или концепций» надо держать в голове в процессе разработки.

2011-11-16

PhotoRec

Если у вас чудесным (загадочным) образом пропадут фотки с флешки, или какие другие файлы, не приведи Господь, воспользуйтесь восстановительной тулзой. Таких много, но мне понравилась одна конкретная — PhotoRec.

cgsecurity.org/wiki/PhotoRec_Step_By_Step
cgsecurity.org/wiki/TestDisk_Download
blog.mypapit.net/2007/10/how-to-recover-photo-files-from-sd-card-mmc-with-photorec

Понравилась простотой, открытостью и функциональностью. Тулза опенсорцная, консольная (запускать под рутом), кроссплатформная. Восстанавливает всякие файлы со всяких дисков и партиций.

Рекомендую.

Правда мне не помогла :) вся чудесность тулзы, ибо восстанавливать было нечего. Редиски флешку почистили. Собственно, первое правило восстановления — если что, немедленно перевести девайс в режим «только чтение» и тут же снять посекторный образ. Восстанавливать файло можно и с образа.
А может это была не та флешка — не знаю. Приключения могли быть всякие, я со свечкой не стоял. Мотороллер не мой...

2011-11-15

flac to mp3

Рецепт, как превратить один огромный файл FLAC с разметкой треков в файле CUE во  много небольших файлов mp3, по трекам. С сохранением тегов. Части рецепта не мои, моя компиляция и проверка в бою :)

На примере альбома Blake – Together

Установить софт
aptitude install cuetools shntool
aptitude install flac wavpack
и еще вот это: packages.debian.org/squeeze/kid3

Разбить большой файл на маленькие
cuebreakpoints Blake\ -\ Together.cue | shnsplit -o flac Blake\ -\ Together.flac
cuetag Blake\ -\ Together.cue split-track*.flac

Перекодировать маленькие флаки в mp3. Скриптом
#!/bin/bash
# name flac2mp3.sh
OUT_DIR="./mp3"
[ ! -d ${OUT_DIR} ] && mkdir -p ${OUT_DIR}
# modify the lame options to your
# preference
lame_opts=" --vbr-new -V 2 -B 256 "
for x in "${@}"
do
FLAC=${x}
MP3="${FLAC%.flac}.mp3"
[ -r "$FLAC" ] || { echo can not read file \"$FLAC\" >&1 ; exit 1 ; } ;
metaflac --export-tags-to=- "$FLAC" | sed 's/=\(.*\)/="\1"/' > tmp.tmp
. ./tmp.tmp
rm tmp.tmp
echo "Converting ${FLAC} to MP3 format"
flac -c -d "$FLAC" | lame ${lame_opts} \
--tt "$TITLE" \
--tn "$TRACKNUMBER" \
--tg "$GENRE" \
--ty "$DATE" \
--tc "$COMMENT" \
--ta "$ARTIST" \
--tl "$ALBUM" \
--add-id3v2 \
- ${OUT_DIR}/"$MP3"
done

bash ../flac2mp3.sh split-track*.flac

После чего остается только пакетом переименовать полученные mp3-файлы в нечто более внятное, исходя из содержимого тегов. Хотя можно и скрипт чутка поправить, чтобы мп3-шки сразу создавались с нужными именами. Но мне проще применить kid3.


Немного про «with» в Python tony.su/2011/11/11/python-context-managers коротко и внятно о важном.

2011-11-14

Masked shell input

Грех жаловатся на память, все-таки вспомнил, что надо сказать «Б» сказавши «А». Как в MS Windows в командной строке замаскировать звездочками ввод пароля, я написал. А вот как это сделать в Linux:
stty_orig=`stty -g`
stty -echo
read secret
stty $stty_orig
tech-recipes.com/rx/278/hide-password-entry-in-bournebash-shell-script

Правда, тут будет без звездочек. Зато «из коробки».


Какие бывают двойные смыслы.

В эпизоде «Captain Cook» сериала Blackadder Goes Forth есть момент, когда генерал интересуется у Блекаддера, знает ли он журнал (забыл название, что-то вроде Страна и Король). На что тот отвечает, что да, знает, прекрасная бумага — мягкая, прочная и отлично абсорбирует :)
А генерал говорит -
top-hole, Blackadder I thought it would be right up your alley.

Сперва я пару минут втыкал, о чем это он. Даже на паузу поставил. Так и не докумекал, отложил на потом. И вот, узнал о чем речь.
На первом уровне сказанное означает примерно следующее:
превосходно, я подумал, что вы с этим прекрасно справитесь (подразумевается, что он выдает Блекаддеру некое задание).
А на втором, я полагаю, нечто похожее на:
(отсыл к «дырке»), я так и думал, что вы чистите им проход (clean up — right up).
forum.wordreference.com/showthread.php?t=424007

Обратите внимание, дословный перевод вообще смысла не имеет. Сплошные фразеологизмы.

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

Сериал, кстати, превосходный (некоторым нравится даже в переводе на русский). Жалко, скоро кончится :(

2011-11-12

Extend root partition

Намедни я наступил на грабельки, заботливо заныканные в визарде разбиения диска, том, что в установщике Debian Squeeze.

При установке Дебиана, рутовый раздел получился размером в 300 мегабайт с хвостиком (это мне досталось от авторазбивателя, экономный, собака). И мне этого не хватило, потому как у меня одновременно живут два ядра - из бекпортов и обычное. Все место на рутовом разделе сожрали ядра и их модули, все в папке /lib

Как временное решение, одно ядро я снес
aptitude purge linux-image-2.6.32-5-amd64
aptitude autoclean
После чего появилось время подумать о расширении рутового раздела или его переносе. Под эту задачу я провел эксперимент (сразу скажу - удачный) на виртмашине. Трудности возникли только на этапе переконфигурации граба, и то только потому, что я не знал, как его переконфигурить.

Итак, для переноса раздела я стартовал машину с liveCD GParted gparted.sourceforge.net/livecd

Потом проделал следующие операции с разделами:
уменьшил раздел /home (чтобы что-то продать ненужное, сначала надо что-то ненужное купить);
уменьшил раздел primary, в котором появилось свободное место (это sda2);
копипастом перенес рутовый раздел на освобожденное место;
расширил новый раздел (это получился sda3) до максимума, 10 гигов;
установил у него флаг бутовости;
удалил старый рутовый раздел sda1 (эту жопу никому не могу рекомендовать, не делайте этого!).

На этом операции с разделами закончены. Перезапустил машину и увидел
grub rescue>
Потыркался немного и пошел читать help.ubuntu.com/community/Grub2#Rescue_Mode grub_rescue Booting

Почитав, сгенерировал такие команды:
set prefix=(hd0,3)/boot/grub
set root=hd0,3
insmod normal
normal

После чего попал в обычное меню граба и смог запустить операционку. Войдя рутом в ось, стал шаманить с грабом, в попытке заставить его загружаться с нового раздела. К успеху привела такая команда
dpkg-reconfigure grub-pc
меня спросили про всякое а я ответил как сумел, в частности сказал, что граб ставить надо на все доступные ему разделы.

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

2011-11-11

Глупости какие

Шесть единичек — 11 год, 11 месяц, 11 день. Прикольно.

Намедни заглянул в избирательную комиссию, за открепительным талоном (у них это называется «открепительное удостоверение»). Причина проста как репа — я хочу провести поцедуру голосования с удобством, по месту жительства. Ибо ехать в ебеня, где у меня прописка — ни разу не удобно.

Так вот, заглянул. Говорю — а дайте талончик открепительный. Отвечает тетя — да бери, только заявление напиши, вот и бланк тебе. Вписал я в бланк ФИО, место прописки и прочие мелочи, вроде «почему я не могу явиться на свой участок голосования». Настал момент, когда надо выяснить, а какой у меня номер участка. Вот тут моя инициатива и накрылась сами-знаете-чем. Патамучта нельзя быть красивой такой получить открепительный талон где попало. Его можно получить только по месту прописки. Вот.
Забрал я заяву, попрощался и с чистой совестью покинул скорбное заведение.

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

И ваще, где «электронная Россия»? Что интернетов не хватает? Не могут в день выборов мой паспорт пробить по центральной БД на предмет — голосовал/не голосовал/может/не может? Чтобы дать мне возможность зайти и голоснуть на любом участке? Я уж не говорю о «электронных выборах», модель которых умные люди разработали уж много лет назад, взяв за основу принципы криптографии с открытым ключом.

Фигня какая-то.


Чтобы не было дурного послевкусия, вот симпатичное/полезное. Про конечные автоматы:

Конечные автоматы и т.н. автоматное программирование -- вещи, с которыми программисты часто сталкиваются при решение задач лексического и синтаксического разбора, при описании поведения объектов в играх, при реализации всевозможных протоколов связи.
По сути дела, Finite State Machine (FSM) это некий объект, у которого есть состояние, описываемое конечным множеством значений, плюс есть некое конечное множество событий, которые могут быть поданы на вход такому объекту. Самый простой пример FSM это, например, выключатель. Объект с двумя состояниями "вкл" и "выкл" и двумя событиями -- "включить" и "выключить".
Другой простой пример -- автоматическая дверь с датчиком контроля состояния
С точки зрения программы FSM описывается фактически как таблица, где по горизонтали идут события, а по вертикали идут состояния. Каждая ячейка этой таблицы, расположенная на пересечении конкретного события и конкретного состояния, есть указатель на некий код, который должен быть выполнен, когда на вход объекту, находящемуся в указанном состоянии, подается указанное событие.

cdriper-rss.livejournal.com/29555

Наш человек.

2011-11-10

Справочник

Мне сайт пригодился в качестве справочника, а вообще там залежи полезной информации. Годный ресурс.

Я HTML верстки и прочих CSS чураюсь, а тут понадобилось вспомнить, в чем разница между display: none и visibility: hidden
Так на сайте мгновенно нашелся ответ со 100% релевантностью webdesign.about.com/od/css/f/blfaqhidden


Почти в том же стиле, Python Tips, Tricks, and Hacks, с частичным переводом на русский habrahabr.ru/blogs/python/85238, хотя, в принципе, для понимания достаточно заголовков и кода к ним :)

2011-11-09

SDF to text

На днях компилял библиотеки FDO. Долго возюкался, но своего добился. Как мне и надо было, я сумел получить работающий враппер к FDO для Python.

py.fdo-3.6.0_5104.zip - Python bindings for FDO, compiled Python wrapper for FDO 3.6. Platform Windows 2003, x86. К пакету прилагается скрипт экспорта (дамп) данных из файлов SDF. Решил выложить пакет здесь, ибо убедился в том, что найти готовые бинарники вместе с враппером нелегко. Пришлось собирать самому. Заодно и свой дампер из SDF в текст добавил.

sites.google.com/site/vasnake

Всю эту бодягу с компиляцией я затеял по одной простой причине. Понадобилось мне, внезапно, сваять экспорт данных из формата SDF. Такой это хитрожопыймудрый формат, что прямую конвертацию из него ни в один из более распространенных форматов сделать невозможно. Как я понял, причина проста — гадский Автодеск в формат SDF заложил много фишек, недоступных в старых добрых шейпах и иже с ними.

Метод борьбы с несовместимостью очевиден, делай раз — переливай данные в удобный для обработки формат; делай два — адаптируй данные под целевую платформу. Шаг первый я фактически сделал, нарисовав сегодня за полдня скрипт (см. в пакете disasm.py) выдающий содержимое SDF-файла в виде текста. Почти WKT. Шаг второй у каждого свой и, часто, тривиален.

Чуть не забыл, скрипт мой не протестирован на всем разнообразии вышеупомянутых фишек. Так что дотачивать будете сами (ну или меня попрОсите).


Откуда ноги растут
fdo.osgeo.org/documentation
fdo.osgeo.org/content/fdo-360-downloads
trac.osgeo.org/fdo/browser/trunk/Fdo/Python
trac.osgeo.org/fdo/wiki

2011-11-08

FDO

Бобер, выдыхай!
Я таки скомпилял обертку к FDO для Python. Потратил не меньше трех дней, мазафака. То ли кризис так влияет, то ли у Автодеска всё так нынче делается, но просто (без затей) собрать релиз из исходников не вышло. И это релиз, не альфа и не бета. Отягощает сборку еще тот факт, что под MS Windows все очень плохо с инструментарием — в сравнении с Linux, конечно.

В целом, чтобы собрать из исходников FDO, надо строго выполнить инструкции, записанные в файлике OpenSourceBuild__README.txt и сделать поправки на следующее:
* MS Visual Studio нужно не абы какую, а строго 2008 (она же 9.0) в комплектации C#, C++ профессиональную (или в какую там входят MFC, ATL). Express не пойдет, ибо этих мфц и атл там нету. Мазохисты, вроде меня, могут собрать и экспрессом.
* Python надо строго 2.4, о как.
* Понадобится внести правки в некоторые исходники.
* Понадобится копировать недостающие библиотеки в нужные места руками, в зависимости от ошибок компиляции.
* Надо быть готовым, что соберется не все а только основное :)

В связи с последним замечанием, есть шанс, что сборка не будет работать так хорошо, как хотелось бы (это я буду завтра заценивать, насколько хорошо она работает).

Какие у меня (постфактум) получились изменения в исходниках:

--- C:/d/sdf/fdo/orig/OpenSource_FDO/setenvironment.bat Fri Nov 19 19:44:26 2010
+++ C:/d/sdf/fdo/OpenSource_FDO/setenvironment.bat Mon Nov 07 21:33:02 2011
@@ -1,6 +1,6 @@
-@echo off
+@echo on

 rem
 rem Copyright (C) 2004-2006  Autodesk, Inc.
 rem
 rem This library is free software; you can redistribute it and/or
@@ -27,12 +28,12 @@
 if "%1" == "x86_amd64" goto setvcvarsall
 if "%1" == "x86_ia64"  goto setvcvarsall
 goto usage

 :setvcvarsall
-SET ACTIVENAMECHECK="Microsoft Visual Studio 9"
-SET ACTIVEPATHCHECK="C:\Program Files\Microsoft Visual Studio 9.0\VC"
+SET ACTIVENAMECHECK="Microsoft Visual Studio 10"
+SET ACTIVEPATHCHECK="c:\Program Files\Microsoft Visual Studio 10.0\VC"
 if exist %ACTIVEPATHCHECK% goto VSExist
 SET ACTIVEPATHCHECK="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC"
 if exist %ACTIVEPATHCHECK% goto VSExist

 :VSExist
@@ -98,11 +99,11 @@
 if not exist "%SDEHOME%" SET SDEHOME=
 if exist "%SDEHOME%\bin\sde.dll" SET SDEVER_ARCUNITTEST=92
 if exist "%SDEHOME%\bin\sde91.dll" SET SDEVER_ARCUNITTEST=91

 SET ACTIVENAMECHECK="7-Zip"
-SET ACTIVEPATHCHECK="C:\Program Files\7-Zip"
+SET ACTIVEPATHCHECK="d:\app\7-Zip"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%

 SET ACTIVENAMECHECK="Graphviz"
 SET ACTIVEPATHCHECK="C:\Program Files\ATT\Graphviz\bin"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
@@ -112,23 +113,23 @@
 SET ACTIVEPATHCHECK="C:\Program Files\doxygen\bin"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% documentation package not recognized in the Windows PATH. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="GnuWin32 Bison/Sed"
-SET ACTIVEPATHCHECK="c:\Program Files\GnuWin32\bin"
+SET ACTIVEPATHCHECK="c:\d\GnuWin32\bin"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not recognized in the Windows PATH. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="Python 2.4"
-SET ACTIVEPATHCHECK=C:\progra~1\Python24
-if exist %ACTIVEPATHCHECK% SET PYTHON_HOME=C:\progra~1\Python24
+SET ACTIVEPATHCHECK=C:\Python24
+if exist %ACTIVEPATHCHECK% SET PYTHON_HOME=%ACTIVEPATHCHECK%
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not found. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="SWIG 1.3.31"
-SET ACTIVEPATHCHECK=C:\progra~1\swigwin-1.3.31
-if exist %ACTIVEPATHCHECK% SET SWIG_HOME=C:\progra~1\swigwin-1.3.31
+SET ACTIVEPATHCHECK=c:\d\swigwin-1.3.31
+if exist %ACTIVEPATHCHECK% SET SWIG_HOME=%ACTIVEPATHCHECK%
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not found. Update the setenvironment.bat script file with the correct path

 goto end

--- C:/d/sdf/fdo/orig/OpenSource_FDO/setenvironmentVS10.bat    Tue Mar 30 01:20:03 2010
+++ C:/d/sdf/fdo/OpenSource_FDO/setenvironmentVS10.bat Mon Nov 07 22:35:13 2011
@@ -1,6 +1,6 @@
-@echo off
+@echo on

 rem
 rem Copyright (C) 2004-2006  Autodesk, Inc.
 rem
 rem This library is free software; you can redistribute it and/or
@@ -75,11 +75,11 @@
 if not exist "%FDOGDAL%" SET FDOGDAL=%FDOTHIRDPARTY%\gdal
 if not exist "%FDOGDAL%" echo OPTIONAL FDO environment variable FDOGDAL is not set
 if not exist "%FDOGDAL%" SET FDOGDAL=

 SET ACTIVENAMECHECK="7-Zip"
-SET ACTIVEPATHCHECK="C:\Program Files\7-Zip"
+SET ACTIVEPATHCHECK=d:\app\7-Zip
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%

 SET ACTIVENAMECHECK="Graphviz"
 SET ACTIVEPATHCHECK="C:\Program Files\ATT\Graphviz\bin"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
@@ -89,23 +89,23 @@
 SET ACTIVEPATHCHECK="C:\Program Files\doxygen\bin"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% documentation package not recognized in the Windows PATH. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="GnuWin32 Bison/Sed"
-SET ACTIVEPATHCHECK="c:\Program Files\GnuWin32\bin"
+SET ACTIVEPATHCHECK=c:\d\GnuWin32\bin
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not recognized in the Windows PATH. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="Python 2.4"
-SET ACTIVEPATHCHECK=C:\progra~1\Python24
-if exist %ACTIVEPATHCHECK% SET PYTHON_HOME=C:\progra~1\Python24
+SET ACTIVEPATHCHECK=C:\Python24
+if exist %ACTIVEPATHCHECK% SET PYTHON_HOME=%ACTIVEPATHCHECK%
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not found. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="SWIG 1.3.31"
-SET ACTIVEPATHCHECK=C:\progra~1\swigwin-1.3.31
-if exist %ACTIVEPATHCHECK% SET SWIG_HOME=C:\progra~1\swigwin-1.3.31
+SET ACTIVEPATHCHECK=c:\d\swigwin-1.3.31
+if exist %ACTIVEPATHCHECK% SET SWIG_HOME=%ACTIVEPATHCHECK%
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not found. Update the setenvironment.bat script file with the correct path

 goto end

--- C:/d/sdf/fdo/orig/OpenSource_FDO/Fdo/Python/Resource/FdoWrapper.rc Wed Feb 16 18:43:18 2011
+++ C:/d/sdf/fdo/OpenSource_FDO/Fdo/Python/Resource/FdoWrapper.rc  Mon Nov 07 22:37:54 2011
@@ -5,11 +5,12 @@
 #define APSTUDIO_READONLY_SYMBOLS
 /////////////////////////////////////////////////////////////////////////////
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+//#include "afxres.h"
+#include "winresrc.h"

 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS

 /////////////////////////////////////////////////////////////////////////////
--- C:/d/sdf/fdo/orig/OpenSource_FDO/Fdo/Python/Swig/Fdo/FdoIncludes.i Wed Jan 06 04:06:08 2010
+++ C:/d/sdf/fdo/OpenSource_FDO/Fdo/Python/Swig/Fdo/FdoIncludes.i  Mon Nov 07 22:57:32 2011
@@ -432,11 +432,14 @@

 %include "Fdo/Schema/SchemaException.h"
 %include "Fdo/Schema/ClassDefinition.h"
 %include "Fdo/Schema/AutogenerationException.h"
 %include "Fdo/Schema/Class.h"
+
+%ignore FdoClassCapabilities::Set;
 %include "Fdo/Schema/ClassCapabilities.h"
+
 %include "Fdo/Schema/ClassCollection.h"
 %include "Fdo/Schema/ClassType.h"
 %include "Fdo/Schema/DataPropertyDefinition.h"
 %include "Fdo/Schema/DataPropertyDefinitionCollection.h"
 %include "Fdo/Schema/DataType.h"
--- C:/d/sdf/fdo/orig/OpenSource_FDO/Thirdparty/apache/xalan/projects/Win32/Res/AllInOne/AllInOne.rc   Wed Mar 24 22:43:20 2010
+++ C:/d/sdf/fdo/OpenSource_FDO/Thirdparty/apache/xalan/projects/Win32/Res/AllInOne/AllInOne.rc    Mon Nov 07 22:37:54 2011
@@ -5,11 +5,12 @@
 #define APSTUDIO_READONLY_SYMBOLS
 /////////////////////////////////////////////////////////////////////////////
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+//#include "afxres.h"
+#include "winresrc.h"


 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS


И скрипт сборки:
@echo off
chcp 1251 > nul
set wd=%~dp0
pushd "%wd%"
set NLS_LANG=AMERICAN_CIS.UTF8
set PYTHONPATH=
@cls

set INCLUDE=c:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include;%INCLUDE%
set LIBPATH=c:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\lib;%LIBPATH%
set LIB=c:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\lib;%LIB%
set SWIG_HOME=c:\d\swigwin-1.3.31
set PYTHON_HOME=c:\Python24
set PYTHON_INCLUDE=%PYTHON_HOME%\include
set PYTHON_LIB=%PYTHON_HOME%\libs\python24.lib
set FDO=c:\d\sdf\fdo\OpenSource_FDO
set FDOTHIRDPARTY=%FDO%\Thirdparty
SET FDOUTILITIES=%FDO%\Utilities
SET XALANROOT=%FDOTHIRDPARTY%\apache\xalan
SET XERCESCROOT=%FDOTHIRDPARTY%\apache\xerces
SET NLSDIR=%FDOTHIRDPARTY%\apache\xalan\src\xalanc\NLS
SET ACTIVEPATHCHECK=d:\app\7-Zip

set path=%path%;c:\WINDOWS\Microsoft.NET\Framework\v3.5;c:\d\GnuWin32\bin;c:\Python24;c:\d\swigwin-1.3.31;c:\d\Microsoft SDKs\Windows\v7.1\Bin

@REM ~ goto TEST

call setenvironmentVS10.bat x86>nul
set
@REM ~ call build_thirdparty.bat -w sdf -w fdo
call build_thirdparty.bat -a clean
set
@REM ~ call build.bat -py=build
call build.bat -a clean
exit

:TEST
set FDO=c:\d\sdf\fdo\OpenSource_FDO\fdo
set path=c:\d\sdf\fdo\OpenSource_FDO\Utilities\ExpressionEngine\Bin\Win32\Release;%path%
pushd Fdo\Python\UnitTest
call UnitTests.cmd
popd
exit


C:\d\sdf\fdo\OpenSource_FDO\Fdo\Python\UnitTest>python Src/main.py
Testing ApplySchemaTest...
Testing CapabilitiesTest:Capabilities...
Testing ClientServicesTest:ClientServices...
Testing ClientServicesTest:ConnectionCreation...
Testing CommandTest:ApplySchemaCommandCreation...
Testing CommandTest:InsertCommandCreation...
Testing CommandTest:SelectCommandCreation...
Testing LOBTest...
Testing StringBufferTest...
Testing TypeMapTest:Enumerations...
Testing TypeMapTest:Exceptions...
Testing TypeMapTest:PrimitiveArrays...
Testing TypeMapTest:Primitives...
----------------------------------------------------------------------
Ran 13 tests in 0.070s
OK


Видно, что я пытался использовать MS Visual Studio 10 (это была одна из попыток), но пусть это никого не смущает. Использование Студии 2008 жестко зашито в конфигах FDO и компиляла реально Студия 2008 Express.

Послевкусие после сборки фдо довольно гнусное. Как то я не ожидал, что сборка free проекта потребует наличия сильно небесплатной Студии (да еще и конкретной, старой версии!), плюс еще и неслабой правки вручную. Нехорошо это.

Ненавижу Автодеск :)

sgillies.net/blog/400/fdo-and-python

Архив блога

Ярлыки

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) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) 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) Klaipeda (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) купи/продай (9) Photo (8) 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) 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) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)