Saturday, December 25, 2010

Обрадовать PageSpeed

Ну очень короткий пост или улучшить результаты в PageSpeed ну хоть немного.

  • Включить кеширование. Если ваш случай Apache, добавляем подобную комбинацию для медиаконтента:
    Header set Cache-Control "max-age=3153600, public"
    Сжимать выдаваемый контент:
    SetOutputFilter DEFLATE
    Эти строчки желательно использовать только внутри FilesMatch, IfModule - так как сжимать картинки бесполезно, а кешировать до бесконечности html нельзя - на корень вход с параметрами в url не поставишь.
  • Объединить несколько css/js файлов в один через вызов скрипта с параметром список объединяемых скриптов/стилей. Желательно при объединении оставлять метки что откуда взято - чтобы не искать иголку в стоге сена.
  • Упаковать результаты вывода этого скрипта (желательно не полностью, а каждый файл с пометкой минимизированная версия чего представлена). Для css - мне понравилось использовать cssmin, для js - google closure compiler. Оба инструмента позволяют минимизировать на лету. Первый локально, второй можно через API удаленно. Во втором случае лучше давать исходный код, а не каким-то образом минимизированную версию.

Tuesday, December 21, 2010

Магия глубины

На прошлых выходных мне случайно попалась ссылка на интересный сайтик, который долго искал - на нем предлагаются драйвера для Windows для поддержки стереоскопичного 3d. Когда то лет 5 назад у уже видел ссылку на подобную функциональность, она включалась редактором реестра для Nvidia карт, но они ее почему-то удалили. Теперь опять в дровах она появилась, но опять для Nvidia и для топовых карт, это не является достаточным основанием, как по мне менять свои компьютер с ATI видеокартой. Вот теперь эту функциональность можно посмотреть на любой видео карте. Правда некоторые игры имеют возможность самостоятельно создавать картинку с искажениями цветов нужные для анаглифных очков, но хотелось везде и сейчас.

И вот на какие мысли это меня натолкуно:

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

Это в принципе равнозначно тому, что у обоих кадров подобны буферы глубины кроме близко расположенных объектов. И если генерировать сначала буфер глубины для далеких объектов, там где разница в отображении для разных глаз меньше пикселя, то загружая эти данные в буфер глубины мы резко сокращаем количество расчетов цвета и для точек, так как все дальние точки уже учтены на этом буфере. Или можно брать кадр с расстоянием до точек для одного глаза и убирая все точки ближе определенного минимума- мы получим исходные данные для второго глаза. Правда можно еще учитывая данные о расстоянии немного сдвигать изображения для каждого глаза - но это получается какая-то косоглазая глубина.

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

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

Может так и делают и я что-то упустил?

Saturday, December 4, 2010

Применение смартфонов с точскрином

Так как они не могут пока конкурировать с обычными мобильными телефонами по времени жизни без зарядки. Обычные мобильные телефоны живут где-то ближе к неделе(или это у меня они так долго выдерживали) с точскрином с нормальными характеристиками и внешним видом живут где-то 2 дня максимум.

Я подумал их же можно использовать вместо мышки - такой высоко технологичной и дорогой. Они все имеют какое-то подобие usb порта и теоретически можно создать приложение которое будет эмулировать протокол мышки для компьютера и экран можно использовать как подобие точпада с возможностью отображение области под указателем мышки и дополнительной информации - например управление через поворот относительно сторон света и 3d управление через акселерометры и gps.

Ядро 2.36.1 + Ubuntu

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

Sunday, November 7, 2010

Восмеричность(octal)

Пример почти рабочего кода с иногда неожиданным результатом:

Язык

Код

Результат

php:

echo (int)08;

0

javascript:

alert(parseInt("08"));

0

c/c++:

int main() { printf("%d\n", 08); }

error: invalid digit "8" in octal constant

python:

print 08

SyntaxError: invalid token

Erlang:

B = 08.

8

Tuesday, November 2, 2010

Видео с конференции Yandex

Конференция проходила 1 октября.

Наиболее интересное по моему мнению:
  1. 'Базовые оптимизации' Петр Попов - Краткие описания оптимизации алгоритмов в основном хранения индексов.
  2. 'Построение системы видеокоммуникаций для большого числа пользователей в сети Интернет' Вячеслав Борилин - Текущее состояние передачи видео в конференциях, какие существуют проблемы.
  3. 'Танки в Лунапарке' Андрей Кузьмичев - Просто интересный(веселый) доклад.
  4. 'Веб-сервер Phantom' Влад Селиверстов - Описание архитектуры их вебсервера, легковесные потоки и состояния - но на С++, а не на экзотических языках. Тестовые данные несколько сомнительны, но как доказательство что можно и без экзотики создать быстрое решение.
  5. 'Как мы охотимся на гонки (data races)' Константин Серебряный - Теория определения гонок и как они их выявляют, инструменты.

Sunday, October 31, 2010

Компиляция новой прошивки для D-Link 2650

По пунктам:
  1. Загружаем и устанавливаем в виртуальной машине Fedora 9.
  2. Загружаем исходные коды прошивки.
  3. Распаковываем и запускаем(в виртуальной машине) install.sh на все вопросы отвечаем утвердительно.
  4. В результате в систему устанавливаются crosstools для mips(/opt/toolchanins).
  5. Заходим в /opt/DLink DSL-2650U и пишем make PROFILE=DSL-2650U
  6. Все первая прошивка готова, она будет собрана в images
  7. Теперь идем в userapps/opensource/busybox
  8. Копируем brcm.config в .config, если еще его нет
  9. Запускаем make menuconfig выбираем нужные нам программы(ls, cp) так в стандартной прошивке их нет. Особо экономить на включении не нужно там оригинальная прошивка немного больше 4мегабайт и вполне хватить места еще под пару программок в оставшемся свободном месте 8 мегабайтной внутренней флешки.
  10. Сохраняем полученный .config в targets/DSL-2650U/brcm.config
  11. Пересобираем прошивку
  12. Все - прошиваем и проверяем.

Возможно можно использовать другую версию, но на 9 все работает. Для того чтобы использовать на других нужно пересобирать crosstools и проще просто поставить виртуальную машину чтобы не морочить голову с версиями. В прошивке используется старое ядро 2.6.9 и старый busybox(даже не стабильная версия, а 1.0.0-rc3). Обновить ядро наверное не очень получиться так как часть модулей, если посмотреть по структуре директорий, уже в бинарном виде.

Для экспериментов можно использовать программы записанные на USB флешку, так как при монтирование разрешено запускать программы с флешки и они вполне работают.

Дополнительную информацию можно посмотреть здесь и инструкция по прошивке OpenWRT на него.

Saturday, October 23, 2010

Конвертация тегов в mp3

Очень простой скрипт:
find -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1

Sunday, October 10, 2010

Смена темы загрузки ubuntu

Или миссия не выполнима:-)

В последних версиях(наверное уже выпусков 4) ubuntu отсутствует возможность смены темы загрузки с меню пользователя, например в старом gdm можно было выбрать пункт в самом меню выбора имени пользователя. Варианты решения:
  1. Замена картинки grub: в файле /etc/grub.d/05_debian_theme заменить имя картинки на нужную(строка WALLPAPER="), желательно брать картинку из пакета: grub2-splashimages
  2. Замена темы plymouth: ставим нужную тему и набираем sudo update-alternatives --config default.plymouth
  3. Смена картинки в gdm(как сменить полностью тему я не нашел): выходим из системы, чтобы было видно окно выбора пользователя, и вводим: DISPLAY=:0.0 sudo -u gdm gnome-appearance-properties и меняем значение фоновой картинки.

Все пункты проверены в 10.10.

Sunday, September 12, 2010

Ubuntu beta: Hybrid graphics

В бета версии(как у знал в понедельник это бета версия) ubuntu в настройках ядра включили поддержку vgaswitcheroo. Переключать можно только магической посылкой определенной комбинации символов в определенный файл:-) Или проще говоря поддержки на уровне пользовательских программ нет, переключать можно только применяя команды описанные ранее.
Толку для игр от этого мало - так как в бета релизе у меня не работает нормально opengl - картинка представляет собой появляющиеся и исчезающие полигоны, играть нормально нельзя.
Зато проверил hdmi(фильмы на большом экране смотреть:-)) он нормально работает экранами через пользовательские программы можно управлять, звук есть. Ранее проверить нельзя было, так как разьем выведен с 3650 и управлять им с 3200 нельзя. Зато глюков с экранами нет - windows иногда забывала где основной и выводила на hdmi приглашения входа.
P.S.: Плюс очень большое количество fps в glxgears: 3200 - 270fps, 3650 - 320fps. Но я думаю эту мелкую неудобность к релизу исправят.

Monday, September 6, 2010

Асинхронно выводить на экран?

Или маленькая мысль о том:
так ли X-протокол безнадежно устарел.

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

В общем идея такая: в отдельном потоке держать обработку списка задач которые синхронно отсылаются на сервер (возможно похоже на случай с Beos, где в app-server запущен еще один дополнительный поток на каждое окно, если верить некоторым публикациям), если потребность в них отпала - пользователь или кто то еще изменил существенно прорисовку зачем продолжать? Так мы можем определить, что за секунду мы прорисовываем 1000 примитивов и постепенно прорисовывать их пока не закончиться временной лимит, или кто-то не отменит прорисовку. В результате того как сейчас работает X протокол мы можем, если пользователь был не очень активен последнее время - с устройств ввода не было событий мы можем спокойно поставить проверку на ввод после n-го элемента(или по времени смотря что раньше произойдет), что выведет проверку на состояние каждые 1 секунду, и когда появляется активность ставить проверку на десятые доли секунды. Думаю это существенно снизит нагрузку на процессор.

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

Sunday, September 5, 2010

Псевдослучайное сжатие

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

Это было давно, как теперь кажется, я учился в университете и полдня мне рассказывали интересные штуки(кроме случаев когда рассказывали не очень).

И на предмете защита информации, или как-то подобно называвшемся, очень часто предметы имели длинные названия, которые все сокращали до очень кратких фраз, была у нас тема псевдослучайные последовательности на основе xor и регистров сдвига. Это очень простые по логике устройства умевшие генерировать n-1 чисел, где n это 2 в степени разрядности регистра сдвига. Почему на одно число меньше, если это очень хорошее число установить в регистре сдвига, то он будет всегда выдавать только его. Все остальные числа спокойно переходили одно в другое по случайному закону, но всегда по одной последовательности. Ну зато они и псевдослучайная последовательность. Разнообразие этих генераторов немного все таки ограничено, так некоторые варианты, как я помню можно упростить до более простых.

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

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

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


Как я выше указал мы берем от совсем минимальной длины регистра сдвига до максимально возможной для данной последовательности - мы где-то можем примерно проверить разрядность до длины полученной последовательности-2. Причина в том что на полной последовательности мы ничего проверить не можем, на -1 мы можем хоть уже делать предположения, о том какие настройки возможны, на -2 можем начать отбрасывать точно не подходящие и прогнозировать множество возможных вариантов. Но так как мы начинаем с минимального - мы делаем предположение основываясь множестве уравнений полученных вычитанием верхней строки из строки расположенной на 1 строку ниже. Чем длиннее предполагаемая разрядность, тем меньше уравнений и больше множество вариантов. И начиная с минимальной разрядности мы отбрасываем варианты.

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

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

P.S.: Я мог конечно что-то забыть и здесь есть неточности, но все же пока все не забыл, постарался максимально  правильно все описать.

Saturday, August 28, 2010

Ошибка ли? (продолжение) или разработка под ubuntu

Продолжение поста.

Пока благодаря использованию альфа версии я добился большого роста количества попугаев в своем профайле на Launchpad отвечая кучу вопросов: 'а не хотите ли написать жалобу сообщение об ошибке разработчикам?' -  всегда да и в полном объеме. (Для тех кто не пользуется Ubuntu или у него всегда все хорошо: там дается выбор слать много или отделаться только сокращенной версией?). 

Так быстро (2 недели или 4 выходных) рейтинг на сайтах связанных с разработкой у меня не рос, хотя я не знаю за что он там дается и по какому принципу. На gnome у меня только 5 пунктов. Хотя прогресс все же есть - теперь сообщение о менеджере питания уже не появляется (раньше каждые 5 минут), но ошибка с не запускающимся gdm вовремя остались, хотя по их классификации это проблема с сплешскртном, но я не разбирался, не в этом суть, 3d тоже что-то не очень работает сижу на фреймбуферных дровах. Главное я посмотрел на kerneloops подобная ошибка там есть - значит исправят.

Хотя, я посмотрел на текущие ошибки в следующем релизе федоры там тоже есть ошибка с radeon при установке черненький экранчик - и очень интересно решение, отключайте kms и как следствие и 2(3)d ускорение на видеокарте, ты не один - нас...

А теперь непосредственно продолжение поста.

Для того чтобы найти причину ошибки решил все таки отдебажить код библиотеки, сейчас ее вынесли из состава gtk+, но все таки замены ей не придумали(то есть она еще нужная), что в принципе противоречит популярной сейчас стратегии все засовывать внутрь своего проекта.

Единственные проблема непосредственно ее использовать сложно, так как она используется через gtk. И я решил, а не поставить ли нам полные версии отладочной информации?

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


    echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse" |
    sudo tee -a /etc/apt/sources.list.d/ddebs.list
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01 5E0577F2
    sudo apt-get update
    
    , и ставим что понравилось:-) Но мне опять таки не помогло, или дебагер у меня несколько неправильный или что-то еще, в общем от этой идеи тоже отказался.
  • И наконец самый правильный вариант самому собрать пакеты, тут тоже все просто вглубь gtk заползти удалось.


    apt-get source foo
    apt-get build-dep foo
    dpkg-source -x foo_version-revision.dsc
    fakeroot debian/rules binary
    
    Но не дальше, дебагер отказался находить код для автоматически загружающихся динамических библиотек для распаковки файлов.
Но это уже гораздо ближе к цели.

Tuesday, August 17, 2010

Ubuntu 10.10

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

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

Опций для переключения видеокарт в gdm не видно, похоже нужно еще подождать. Но 3d точно сломали - теперь опять мигают текстуры в cube2 и на выходных что-то  сломалось в драйверах: в логах ядра сообщения что не возможно поставить команды в очередь видеокарты, на экране вместо изображения черный фон и вместо курсора белы квадратик, похоже решил переименовав failsave в xorg.conf и перезапустив gdm. На следующий день все загрузилось нормально, в общем опять жду когда подправят 3d :-) 

И вообще когда появятся нормальные драйвера на radeon, обещались прошлым летом, но пока что-то оно не очень рабочее, или это только мобильные версии не очень?

Friday, August 13, 2010

автоматический редирект на https<->http

Маленький пример кода для перенаправления:

     $redirect_needed = false; 
    /*
     * какое-то очень умное правило определения важности
     * шифрования данной страницы 
     */
    if (!isset($_SERVER['HTTPS']) && $redirect_needed) { 
      header('Location: https://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']); 
      die(); 
    } 
    if (isset($_SERVER['HTTPS']) && !$redirect_needed) { 
      header('Location: http://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']); 
      die(); 
    }

Tuesday, July 20, 2010

Ошибка ли?

Обнаружил интересную особенность в обработке анимации(gif) в gtk+. Непосредственно ошибку обнаружил не я, но я все таки решил проверить, можно ее повторить без лишнего кода. Оказалось да - но распространяется она не только на случай, когда файл загружается частями gdk_pixbuf_loader_write и потом показывается анимация (gdk_pixbuf_loader_get_animation + gdk_pixbuf_animation_get_iter), но даже если загрузить анимацию сразу через gtk_image_new_from_file. В любом случае используется до 1GB памяти - что не очень хорошо для 6MB файла, да и вообще плохо. 

Если верить документации на gdk_pixbuf_animation_get_iter - то библотека сама контолирует выделение pixbuf и после сдвига его использовать нельзя. Я думал что после загрузки через gdk_pixbuf_loader - создается копия данных и как только количество этих данных становиться больше чем нужно, для минимального отображение, посылается сигнал на прорисовку - что в принципе подтвердилось, так как если брать статическую картинку(gdk-pixbuf-animation-get-static-image), то затраты памяти значительно меньше. Далее я думал, что gdk_pixbuf_animation - при создании создает только 1 кадр, и при запросе на сдвиг времени выдает следующий по порядку(пропуская лишние, если нужно) и удаляет предыдущий копию. Но похоже это не так так как если самому вызывать очитку отображенного кадра(unref) при удалении обьекта анимации создается сообщения о повторном удалении обьектов. Думаю создаються все кадра и не удаляются.

И ошибка или так задумано?

Friday, June 25, 2010

Сравнение скорости прорисовки карт(gmap, openlayers).

Маленькое сравнение библиотек для работы с картами (в скобках более слабый компьютер):
  1. gmap v3 - 7,186(13) секунд;
  2. gmap v2 - 20,541(34) секунд;
  3. openlayers - 6,181(7) секунд.
Условия:
  • Прорисовывается список стран используя изначально разобранный kml, для уравновешивания условий прорисовки (Gmap - для прорисовки kml используется разбор на уровне сервера с возвратом обратно только готового изображения);
  • Запускается по нажатию на start, и до момента нажатия stop. Почему не автоматом? Карта может прорисовываться асинхронно, а так точно можно отследить, хоть и не с абсолютной точностью, момент когда по мнению пользователя все прорисовано;
  • Подсчет времени начинается после разбора, результаты должны быть более-менее реалистичными;
  • Вариант прорисовки через canvas для openlayers не участвовал в сравнении, так как сильно проигрывал стандартному варианту;
  • Использовался ff 3.6.3(linux).
Если кто-то найдет ошибки в коде прорисовки или способы ускорения буду рад обсудить.

Saturday, June 5, 2010

Hybrid graphics and .34

Поставил себе .34 ядро в Ubuntu, в нем поддержка Hybrid graphics(switcheroo), оказалась отключена (файл для управления не создавался). Пересобирать ядро, как то желания не появилось, решил пока подождать выхода .34.1 и посмотреть на результаты в Lunar. В этом дистрибутиве появляются ядра в основном только после выхода первого багфикса, что в принципе и правильно.

В общем результаты: самый честный счетчик попугаев glxgears подрос до 3278 frames in 5.0 seconds(OpenGL renderer string: Mesa DRI R600 (RS780 9612) 20090101 TCL DRI2, 1.5 Mesa 7.7.1), в втором кубе вода стала прозрачной, но деревья стали выглядеть несколько странно в виде рубленных текстур.

Saturday, May 29, 2010

Формирование pdf из js

Обнаружилась интересная библиотека jspdf - позволяющая создавать простейшие pdf из js. Она основана на коде(скорее принципах и как пример) fpdf. Позволяет менять размер шрифта и размещать текст на странице - pdf возвращается как datauri, отлично работает в linux, но в windows есть несколько проблемок: ie не понимает datauri ни в каких формах, кроме как встроенное в страницу изображение, firefox при установленных обработчиках pdf(например: acrobat reader) происходит переход на этот url и показывается черный экран вместо контента страницы, иначе предложение загрузить. Это решаемо достаточно просто контент отправляется обратно на сервер как параметр POST, в ответ возвращается уже как контент с типом pdf - и все нормально работает.

P.S.: Я немного улучшил эту библиотеку добавив смену цвета шрифтов, поддерживается градации серого и полная RGB палитра.

Monday, May 17, 2010

gtkhtml

Прогресс добавления поддержки css:

libxml2


Может изменять кодировку поэтому дерево всегда приходит в utf8. То есть она частично снимает проблему конвертации - нужна только в ответном запросе.

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

После получения полного контента нужно отмечать что пришел последняя часть информации - если не указать то могут быть не полностью обработан полученные данные - разбор полностью выполняется только для полностью корректных частей. Если данные были не корректно отформатированы - то libxml всегда пытается  вернуть корректное дерево.

Сама библиотека:


Отрисовка дерева строиться на собственном виде дерева элементов - поэтому
четкого преобразования полученного DOM дерева  в дерево элементов один в один получить нельзя. Сейчас с моими изменениями пытаемся реализовать почти преобразование один в один - поэтому многие вещи отображаются не корректно. Например картинки - если они находятся на более чем одном уровне вложенности их не показывает, так как описания потока отображения(clue) - поддерживает только определенный вид вложенности - и определенные комбинации не могут быть отработаны так как код реализации выравнивания и раз размещения реализованы не для всех потоков(точнее по части функционала в каждом) .

Замена реализации отрисовки на данном этапе мне кажется не правильным путем - так еще больше оторвет мою ветвь от от основной - и вероятность принятия изменений в основную ветвь еще больше упадет и будет сложнее тестировать, так как появятся новые специфичные ошибки и старые тесты даже при аналогичном отображении будут иметь другую структуры элементов и старые тесты скорее всего проваляться.
Сейчас основной различие - применены все мои изменения для исправления мелких ошибок функциональности(выделены как патчи в bugzilla): исправления относительных путей, поддержка datauri и мелкие исправление в makefile. И не выделенные в качестве изменений: зависимости от гнома при компиляции(gnome-common,gconf), удален парсер html и рекурсивная обработка дерева.

В общем пока планирую - вернуться к не рекурсивному обходу дерева(стандартным старым функциям) и попытаться запостить патч в стандартную ветвь.

Стоит прочитать.....

Недавно дочитал книгу о физике Ричарде Ф.Фейнмане.'Вы, конечно, шутите, мистер Фейнман!' - очень веселая и интересная книга, рекомендовал бы в любом случая прочитать. Физика(и вообще наука) в книге упоминается очень вскользь и очень простыми для понимания фразами, можно читать книгу как собрание интересных историй из жизни.

Saturday, April 24, 2010

Hybrid graphics...Очень кратко

Включение достаточно простое:
  • патчим текущее ядро
  • включаем kms в ядре и поддержку radeon(желательно все как модули)
  • устанавливаем последние версии mesa и xf86-video-ati
  • копируем прошивки R600_rlc.bin и R700_rlc.bin в /lib/firmware/radeon/

Перегружаемся и монтируем mount -t debugfs none /sys/kernel/debug в результате появляется переключатель /sys/kernel/debug/vgaswitcheroo/switch - из которого можно прочитать текущее состояние видеокарт. Если записать в него записать( echo some_thing > switch):
  • DDIS - включение дискретной карты;
  • DIGD - включение интегрированной карты;
  • OFF - выключить лишнюю карту - позволяет серьезно продлить время работы от батарейки(при включении включены обе карты).

Благодарность Dave Airlie за решение этой маленькой несуразицы с поддержкой. :-) и авторам заметки asusm51ta-with-linux. Надеюсь это патч скоро попадет в основную ветвь ядра....

И маленькие логи напоследок:
glxinfo 3650
....
OpenGL vendor string: Advanced Micro Devices, Inc.
OpenGL renderer string: Mesa DRI R600 (RV635 9591) 20090101  TCL DRI2
OpenGL version string: 2.0 Mesa 7.8.1
OpenGL shading language version string: 1.10
....
glxgears 3650
......
9416 frames in 5.0 seconds = 1883.109 FPS
......
glxinfo 3200
......
OpenGL vendor string: Advanced Micro Devices, Inc.
OpenGL renderer string: Mesa DRI R600 (RS780 9612) 20090101  TCL DRI2
OpenGL version string: 2.0 Mesa 7.8.1
OpenGL shading language version string: 1.10
.......
glxgears 3200
.......
6627 frames in 5.0 seconds = 1325.309 FPS

Friday, March 12, 2010

Программный scroll на JQuery

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

Предполагаемый выход создание div ограничивающего общий обзор видимости(div_for_scroll), в нем большой div(scrolled_content_full) (его размер линейно зависит от реального количества элементов). Он нужен для получения нужного нам scroll. И уже в нем div(scrolled_content) сдвигаемый по вертикали в котором отображается список видимых в данный момент элементов.

Вот и вся идея.

HTML код:
<div id="div_for_scroll" style="height: 132px; overflow-y: scroll;">
<div id="scrolled_content_full" style="height: 1000px;">
<div id="scrolled_content" style="padding-top: 123px;">
This div contein scrolled content
</div>
</div>
</div>

Js код:
        var ElementsArray = {};
       
        //каждый элемент массива объект вида: {html:html, name:HumName, id:i}, имя нужно для сортировки.
       
        function refreshScroll() {

            var FontSize = 16;
            var newSize = parseInt((ElementsArray.length + 1.5) * FontSize);
            if (newSize<132)
                newSize = 132;
            jQuery("#scrolled_content_full").css("height", newSize + "px");
            var currpos = parseInt(jQuery("#div_for_scroll").scrollTop() / FontSize);
            var newHtml =  "";
            for (var i= currpos;i< (currpos + 10); i ++) {
                if (i < ElementsArray.length)
                    newHtml    += ElementsArray[i].html;
            }
           
            jQuery("#scrolled_content").html(newHtml);
            jQuery("#scrolled_content").css("padding-top",jQuery("#div_for_scroll").scrollTop());
        }

        jQuery("#div_for_scroll").scroll(refreshScroll);

Saturday, February 27, 2010

Упрощение списка координат

Иногда нужно упростить список координат, например вывод kml(kmz) на маленьких уровнях увеличения - большая точность отображения не нужна, зато скорость очень важна.
Наиболее популярным вариантом в этом случае является Douglas-Peucker Algorithm дающим хорошую для человека результирующую траекторию. Но он является достаточно алгоритмически сложным, так как для удаления лишних точек удаляя определяя точки с минимальным векторный расстоянием между точками. 

Более простым вариантом является замена всех точек на точку в середине между двумя соседними - в результате получается на 1 точку меньше. Эту операцию поврторяем пока количество точек не станет удолетворять максимально допустимому для отображения. Недостатки - не учитыват важность точек(смена направления), срезаются углы и выравнивается границы.

Более хорошая версия - проход по точкам и высчитывается минимальное растояние между точками, если оно слишком мало, то увеличиваем его до минимально допустимого.
Затем запускается цикл по точкам и добавляются только те точки, которые располагаются на расстоянии от последней добавленной точки больше, чем минимально допустимое полученное на предыдущим шаге. Эту операцию повторяют пока количество точек не станет меньше максимально допустимого (вычисляется в общем-то на глаз, до тех пор пока время пересчета допустимо по времени ожидания и дефекты в контурах карт еще мало заметны). Также итерации могут продолжаться пока в контуре более 3 точек и площадь полигона больше допустимого для отображения, меньше можно просто отбрасывать(можно считать, что площадь линейно зависима от произведения минимального расстояния на количество точек, что, конечно, геометрически не всегда верно). Для упрощения математической сложности модно считать что расстояние равно не квадрату различий между точками((x1-x2)^2 + (y1-y2)^2 ), а сумме расстояний по координатам по модулю(|(x1-x2)| + |(y1-y2)|), что опять таки не всегда верно, но зато быстро.   

3D в linux

После обновления ядра до 2.6.33 и обновления Ubuntu до 10.04 (запуск обновления: update-manager -d ) с установленными обновлениями из xorg-edgers появилась достаточно быстрый рендеринг 3d и kms. Правда - с стандартным ядром у меня система не загрузилось,  на этапе создания splash screen  экран погас и на переключение консолей не реагировал, возможно причина в уже установленных обновлениях mesa. Без обновления до 10.04 33 ядро грузилось с поддержкой KMS, но без поддержки 3d. Сейчас есть только один артефакт - неправильное отображение воды в Cube2. 

Осталось  подождать поддержки Hybrid graphics и стабилизации версии mesa.

Sunday, February 21, 2010

Erlang

Не бывает достоинств без недостатков.
Достоинства:
  • функциональный язык с простым синтаксисом;
  • удобный синтаксис для записи математических функций;
  • ленивое исполнение;
  • событие ориентированный;
  • замыкания;
  • обширная библиотека OTP;
  • легковесные потоки;
  • удобная система фильтрации в условных операторах и разбора данных  по шаблону.
Недостатки, если смотреть излишне критично, вытекают из достоинств:
  • необычный синтаксис; 
  • никогда во время исполнения не чистит память, очистка вызываться только после завершения N-количества потоков;
  • во время очистки блокируется полностью вся виртуальная машина;
  • только недавно появилась поддержка многоядерных процессоров;
  • изначально написан для телефонных станций (ориентация на необычную специфичную сферу деятельности);
  • легковесные потоки - миф - при появлении ожидания  сообщения переключается на другой поток и при появлении новых сообщений ставим в очередь (возможно ее переполнение);
  • полностью функциональный язык со всеми неудобствами - нужно реализовывать большинство алгоритмов полностью рекурсивно (и кто его знает сколько оно будет думать?) и не использовать переопределение значений переменных(непривычно и иногда неудобно);
  • сложные вещи реализуется просто, простые очень сложно;
  • строки представлены списками, где используется не экономный формат данных для хранения 1 байта используется 8;
  • базы данные мнезье - все хорошо пока у вас памяти больше, чем данных, а потом или все читаем с диска или ядро убьет вас(не умеет оптимально кешировать запросы используя достоинства обоих типов хранения данных);
  • сложение строк дает разные значения в зависимости перемены мест слагаемых.

Риторические вопросы:
  • хотим чтобы не не использовали небезопасное выделение памяти и глобальные переменные - может стоит объяснить людям почему это плохо или дать удобный интерфейс для использования, а не полностью запрещать в синтаксисе?
  • ленивое выполнение - а вы всегда уверены когда это все выполниться и не зависнет ли? Как посчитать время исполнения? И все современные компиляторы стараются в месте с суперскалярной архитектурой (внеочередное выполнение, параллельное исполнение нескольких участков с применением уже рассчитанных результатов при благоприятном стечении условий) пытаются оптимизировать поток выполнения. И не стоить заменять логику надеждой - среда исполнения сама разберется  что уже не нужно исполнять дотянув реальное выполнения до последнего момента;
  • замыкания - если вы боитесь за стек включите оптимизации в компиляторе он давно умеет это избегать(в gcc - уже есть оптимизация при которой для рекурсивного выполнения стек если это возможно не растет).
  • если так уж хотим выделяться - берем гугловсий Go и получаем все тоже, но компилируемое... Не хотим? Есть куча библиотек по контролю за памятью и обменам сообщениями, все равно он преобразует в байткод исполняемый в виртуальной машине написанной на с, и если немного подумать можно сделать возможно и лучше и быстрее.

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

Wednesday, February 17, 2010

Прогресс развития

 Миникс - расширяет базу пользователей - похоже решили пойти по пути linux, созданного позже и рожденного с его помощью, уже получившего значительное распространение по сравнению с хоть не родным, но все же отцом.
 Но он реально нужен, так как хоть и медленно развивается в академических кругах в основном, позволяет протестировать идеи выноса на пользовательский уровень вещей выполняемых обычно в ядре - 20 лет назад это мало кого интересовало кроме людей науки, а теперь почти все ос в той или иной степени реализует ее:
  1. Seven, Vista - вынесли графику в пользовательский уровень.
  2. Linux - потихоньку движемся к случаю, когда в ядре остаются только задачи контроля и управления доступом к устройствам, и полностью пользовательского уровня генератор понятных абстрактному интерфейсу, общему для всех, команд вывода графики и файловые системы не критичные для системы в  FUSE.
Также он получил пакетный менеджер и уже почти готов для использования в повседневной жизни(много портировано, графика работает, а что еще в общем то нужно).

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

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

ReactOs - тоже сильно продвинулись, решились обьеденить свои наработки по реализации win32 и проекта wine, а не переписывать все как в windows. Надеюсь вскоре ее можно будет использовать как запускалку Windows игр, там где Wine не подходит.

Sunday, February 7, 2010

Прогресс с поддержкой 3d в linux

Или до обновлялся теперь 3d работает быстрее, но появились очень интересные особенности: в QuakeII мигает отображение, в кубе втором отсутствуют стены и пол. В общем еще немного подождать и все будет работать. Надеюсь ждать осталось недолго.
P.S.S.: При отключении эффектов рабочего стола QuakeII не мигает и нагрузка не процессор значительно меньше(сейчас любое 3d приложение сильно нагружает процессор).

Hybrid graphics on linux

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

Если судить по информации, что я имею:
  • эта технология нормально работает только в Vistе - есть нормальные драйвера и поддержка производителей ноутбуков;
  • для XP отсутствует поддержка в графической системе переключения;
  • Seven - есть только сентябрьский драйвер находящийся в вечной бете - хотя вполне рабочий, но вечно удаляемый системой, так она считает его устаревшим и без вопросов удаляет. И работает только самая слабая видеокарта и на второй стоит отметина проблемы инициализации. И если в биосе переключить нельзя - то никак уже не подключишь.
P.S. Hybrid graphics(оно же: PowerXpress(ATI), HybridPower(Nvidia)) - это когда системе присутствует более одной видеокарты и при смене нагрузки или питания происходит переключение видеокарты: при низкой нагрузке работает интегрированная видеокарта с низким потреблении энергии, если нужна большая производительность или дополнительные выходы(HDMI например, хотя для основных они могут кросится и сами, работает мощная, но вывод идет через выходы более слабой) включается более мощная.

symfony

  • Получить в форме значение поля - работает в обоих случаях для нового объекта установили значение по умолчанию (через setDefault) и в случае редактирования существующего объекта: $form['имя поля']->getValue();
  • Если нужно получить значение от select с установленным multiple нужно чтобы имя заканчивалось [] иначе получим только первое значение вместо списка. 

Thursday, January 14, 2010

Особенности WebKit

Обнаружил интересную особенность браузеров удостоенных на WebKit: если js функции вызываются не в порядке объявления, то возникает исключение при попытке их вызвать на обработку события(Uncaught ReferenceError: somefunc is not defined). В ff все работает нормально он может вызывать функции, если они объявлены в другом порядке(хотя бы в одном файле).

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

Пояснение об изначальных данных - была страница на которой не срабатывали нажатия на кнопки в Safari, при однозначном возврате из функции(alert('A');return;) до вызова функции идущего ниже по коду все работает, без возврата исключение при вызове функции(сообщается что функции не определена).

P.S.: В обычном состоянии исключения не показываются нужно открыть окно отладки(инспектор элементов).