Monthly Archive for October, 2009

Page 2 of 4

Prolog на Mac

Допустим, вам понадобился Prolog на OS X. Если вы все еще читатете, то идем дальше.

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

  • Кроссплатформенные решения я нашел в виде плагинов для Eclipse, соответственно сперва нужен сам Eclipse. Версий там вагон, я выбрал где меньше всего всякой ненужной мне фигни, так как на Java я не разрабатываю.
  • Первый плагин я пробовал PDT, он уж очень старый и на 3.5 не работает, 3.1 я скачал, но так и не установил, потому что нашел второй плагин ProDT. Он заработал нормально, и для моих простых тестов вполне достаточен. В Downloads нужно качать самый мелкий файлик.
  • Для ProDT нужен SWI-Prolog — некоторая кросплатформенная opensource имплементация языка. Качаем, ставим.
  • SWI-Prolog требует или нет MacPorts, но в любом случае, он у меня был и штука весьма полезная.
  • Распаковываем ProDT в eclipse/dropins/prodt/eclipse/plugins, запускаем eclipse и он сам все устанавливает.
  • Теперь в свойствах ProDT ( Eclipse -> Preferences -> Prolog -> Compilers -> Swi Compiler ) нужно прописать путь до компилятора, который по умолчанию ставится в /opt/local/bin/swipl.
  • Переключаем вид Window -> Show Perspective -> Other… -> Prolog.

Все, теперь можно создаь простенький проектик и файлик в нем, например, следующего содержания:

da( one ).
da( two ).

Запустить, и в консоли написать

da(X).
x = one ;
x = two.

va.lent.in

vИтак, представляю на суд общественности бету моего последнего персонального проекта. Счетчик FPS еще повисит какое-то время. http://va.lent.in.

Я часто загораюсь всякими странными навязчивыми идеями, вот так и с доменом lent.in и далее сайтом на нем. Сайт я делал долго и по кусочкам. В какой-то момент надо было эти кусочки собрать и первая версия получилась каким-то уж совсем abomination. Пришлось перекраивать и перестраивать концепцию.

Эффект IDE я показывал уже давно, и вдохновением для него послужил некоторый реальный продукт и некоторый еще не вышедший продукт. И вот я подумал, а почему бы сайт программиста не сделать в виде кода. Ага! И код будет на фоне печататься руками в темной комнате. Сеттинг был положен и какое-то время я прикидывал возможные исполнения.

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

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

Дальше, я получил скилл работы в After Effects, где я собрал и отредактировал видео ряд сайта. Получилось, конечно, не идеально, но мне очень нравится. Особенно, если видеть исходный материал. Ну и стоит упомянуть, что нормально снять-то получилось раза с пятого.

Интересный “эффект подергивания” со смещением RGB каналов претерпел много серьезных изменений. В самом начале, он был на AS, полностью все изображение (в данном случае код рисуется в BitmapData) так красивенько искривлялось, но уже на немного больше небольшого объема текста начинало все ужасно тормозить. Тормозило даже подергивание всей картинки без особого искривления. Сделал тот же эффект на Pixel Bender, но честно говоря на больших картинках особо прироста производительности не заметил. В итоге получился интересный компромисс — маленькими участками (20 пикселей в высоту) сдвигается изображение в рандомной точке со сползанием вверх/вниз. Довольно забавно и гораздо менее ресурсоемко.

Эффект перелистывание картинок тоже мне нравится, хотя и косячит.

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

Но, самым важным полученным опытом я считаю знакомство с Flex Profiler. Я с ним просидел не один день, высматривая наплодившиеся объекты и вызываемые функции. Я обычно всегда задумываюсь о производительности и стараюсь что-то оптимизировать. Но на этот раз оптимизация прошла какого-то вселенского масштаба. К концу проекта, новые компоненты уже писались, учитывая весь прошлый опыт, и оптимизировался каждый символ. Код, правда, от этого получился весьма зубодробительный. Инлайны, фактори объектов, всякие ухищрения по ускорению просчета и отрисовки. Конечно же, я сильно уперся в возможности плеера. Фулскрин видео и постоянная перерисовка почти всего экрана отжирают сразу чуть ли не 70% используемого процессорного времени. Все, на что я раньше не обращал внимание, дало о себе знать сразу же. ФПС за ФПСом я отвоевывал у чертового плагина. Я перестал доверять флэшовой событийной модели. Оно толпу событий перекидывает туда-сюда очень уж медленно. Отказавшись от огромного числа лишних событий, удалось поднять производительность заметно выше.

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

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

Башорг отжег

<@Monster> Мне люди на работе сказали, что я зря обозвал функцию DrawChildren
<@Monster> ибо, когда быстро произносишь…

Не, честно, я чуть не умер под столом от смеха (((8

SQLite Admin for AIR

Продолжая тему про AIR и SQLite, вот аппликуха-админ для эировской базы данных. Должно быть удобно, хотя сам не пользовал. Добавил в закладки.

WorkflowLab

workflowlab_557x130

Я не понимаю, чем хорош вообще WorkflowLab от Adobe. По мне так он не умеет делать совершенно ничего. Значки продуктов к таскам проставлять?

Слушай, это мой интернет или сайт действительно лежит?

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

Так вот, чтобы не надоедать с тупыми вопросами, в интернете есть миллион сервисов, например downforeveryoneorjustme.com или downorisitjustme.com, которые рады будут вам помочь.

Конечно, точно сказать срезолвились ли DNS они не смогут, но понять лежит ли google или это локальный косяк провайдера (скорее всего второе, но вдруг) можно.

AIR и ORM

Когда я узнал, что данные в AIR приложениях можно хранить в локальной SQLite базе данных, с одной стороны я был рад, но с другой я подумал, что придется опять возиться с SQL и прочей фигней. Как бы было хорошо, подумал я, если бы было какое-нибудь ORM решение типа как в Ruby или как Hybernate в Java. Статья на Хабре по поводу AIR + SQLite подтвердила мои опасения насчет SQL. Но! В комментариях я наткнулся на ссылку на онлайн журнал Adobe Edge и статью в нем про FlexORM. Как я раньше не видел этой ссылки?

В общем, все просто отлично. О грязном SQL можно будет забыть.

Google Wave + AS3

wave-as-client

А тем временем на google.code лежит as3 библиотечка для работы с Google Wave API. А я только вчера отказался от приглашения. Надо будет попробовать как в следующий раз предложат с чем это едят.

Производительность BitmapData

Наткнулся я на пост про тестирование производительности BitmapData за бородатый 2006ой год. Очень уж странными показались мне выводы. И я выполнил его код разок на 10м плеере от флекс компилятора. Вот какие результаты у меня получились.

“BitmapData.draw()” 2896 ms
“BitmapData.clone()” 2306 ms
“new BitmapData()” : 2031 ms
“BitmapData.fillRect()” : 664 ms
“BitmapData.copyPixels()” 499 ms

В оригинале выглядело так:

“BitmapData.draw()” 4068 ms
“new BitmapData()” : 2324 ms
“BitmapData.clone()” 1012 ms
“BitmapData.copyPixels()” 962 ms
“BitmapData.fillRect()” : 515 ms

Как видно, отличается прям совсем. Я не беру во внимание сами числа, а лишь их отношения. Вот так вот, доверяй но проверяй.

Странно, как .clone() могло выполняться в 2 раза быстрее, чем new.

Мммм… хочу.

Обязательно себе куплю!

pillow