Sunday, December 13, 2009

3D ускорение на radeon3200

Включение 3d ускорения на r600 для ubuntu 9.10 Karmic Koala.

Добавляем в дополнительный источник в репозиторий:
  • xorg-edgers. Это позволит установить последнюю версию mesa.
    Версия установленная по умолчанию имеет одну неприятную особенность отсутствует библиотека поддержки r600, хоть версия mesa 7.6 уже содержит поддержку. Но установка полной версии, в моем случае ничего не дала - только отключила поддержку программного рендеренга и выдавала ошибку рендеренга - неправильный порядок пакетов. В новой версии эта проблема решена.
  • и установить новое ядро отсюда:
    2.6.32, для 64 битной платформы нужно установить пакеты:


    • linux-headers-2.6.32-020632-generic_2.6.32-020632_amd64.deb
    • linux-headers-2.6.32-020632_2.6.32-020632_all.deb
    • linux-image-2.6.32-020632-generic_2.6.32-020632_amd64.deb



Как результат 1432.709 FPS в glxgears, и glxinfo:
direct rendering: Yes
OpenGL vendor string: Advanced Micro Devices, Inc.
OpenGL renderer string: Mesa DRI R600 (RS780 9612) 20090101  TCL
OpenGL version string: 1.5 Mesa 7.7-rc2. 


Но пока в quake2 играть с opengl нельзя достаточно чувствительно притормаживает. Но прогресс очевиден:-)

Sunday, November 29, 2009

Иcправление DTD

Некоторые пакеты генерируются документацию через xmlto которая в свою очередь проверяет xml на валидность, иногда там прописаны более новые файлы чем установленные в дистрибутиве, чтобы исправить это мелкое неудобство можно использовать такой скриптик:
list=`grep 'OASIS//DTD DocBook XML V4.4' * -r | sed 's/:/ /' | awk '{print $1}'| grep '.xml'`
for file in $list
do
    sed -i 's/DTD DocBook XML V4.4/DTD DocBook XML V4.2/' $file
    sed -i 's/http\:\/\/www.oasis-open.org\/docbook\/xml\/4.4\/docbookx.dtd/http\:\/\/www.oasis-open.org\/docbook\/xml\/4.2\/docbookx.dtd/' $file
    echo 'fix for '$file'done'
done

Friday, November 27, 2009

symfony мелкие советы


Symfony logo

Создание меню загрузки файлов:

Создаем простое текстовое поле(logo например) для хранения пути файла и в наследнике от автоматически созданной формы в функцию configure дописываем:
$this->widgetSchema['logo'] = new sfWidgetFormInputFileEditable(array(
          'label'     => 'Attachments',
          'file_src'  => '/uploads/'.$this->getObject()->getLogo(),
          'is_image'  => true,
          'edit_mode' => !$this->isNew(),
          'template'  => '
          %input%
          %delete% %delete_label%
          %file%
',
        ));

      $this->validatorSchema['logo'] = new sfValidatorFile(array(
        //если указан путь, то кроме проверки еще и сохраняет,
        //путь относительно uploads
        'path' => sfConfig::get('sf_upload_dir').'/',
        'required' => false,
        'mime_types' => 'web_images'
      ));
      $this->validatorSchema['logo_delete'] = new sfValidatorPass();

создание дополнительной проверки по полю(не стандартной):

Добавлять туда же:
$this->validatorSchema['name'] =  new sfValidatorAnd(
            array(
                new sfValidatorCallback(
                    array('callback'=>
                            array($this->getObject(), 'check')
                    )
                ),
                $this->validatorSchema['name'] /*previous value*/
            )
       );
В модели создаем дополнительную функцию check вида:
public function check($validator, $value) {
       if(haveError($value))
            throw new sfValidatorError($validator, $message);
        }
        return $value;
   }

для проверки более чем одного поля одновременно:

(Приходят все поля после проверки по каждому полю отдельно):
form:
 $this->mergePostValidator( new sfValidatorCallback(
                array('callback'=>
                        array($this->getObject(), 'check')
                )
model:
  public function check($validator, $values) {
       if(haveError($values))
            throw new sfValidatorError($validator, $message);
        }
        return $values;
   }

sfPropelPager

Особенность в sfPropelPager - при подсчете количества страниц он сбрасывает поля группировки - результат может быть больше чем реально существует.

Формирование сложных запросов:

Нахождение имени в нескольких полях:
select * from people where (name like ('%abc%') ) OR (last_name like ('%abc%') );
Выглядит таким образом:
$name = $c->getNewCriterion(PeoplePeer::NAME, '%abc%', Criteria::LIKE);
 $last = $c->getNewCriterion(PeoplePeer::LAST_NAME, '%abc%', Criteria::LIKE);
 $last->addOr($name);
 $c->addOr($last);
Основная особенность нужно объединить сначала части запроса, а уже потом добавлять в основной запрос.

Thursday, October 22, 2009

TCMalloc отличие от стандартного алгоритма

Отличие от стандартного алгоритма управления выделением памяти glibc(ptmalloc2)от tcmalloc(реализация разработчиков google):
  • разделенная между потоками память, у каждого потока собственный пул памяти(уменьшена вероятность взаимоблокировок);
  • все объекты одинакового размера хранятся вместе (позволяет эффективно использовать память в процессе выделения - освобождения памяти).
  • скорость 50 наносекунд против 300 наносекунд (единичное создание удаление объекта (2.8 GHz P4).
Общий принцип работы: при каждом запросе на выделение памяти - память выделяется из общего пула и привязывается к потоку, который эту память запросил, в потоку регистрируется пул под объекты этого размера(класса) размером кратным размеру страницы, в результате следующее выделение будет выполнено в уже привязанной к потоку памяти. Когда пул под объекты определенного класса освобождается он возвращается в основной пул. Для объектов больше определенного размера выделение полностью проводиться в основном пуле без привязке к конкретному потоку (большая вероятность что этот объект будет использован в другом потоке).

Saturday, October 17, 2009

переехал на berlios.de

BerliOS Developer LogoРешил переместить свою тестовую ветку для gtkhtml на berlios.org. Ранее использовал github, но там отсутствует трекер ошибок. При переезде заметил одну неприятную особенность github скрывал имя пользователя в комите использовав вместо него регистрационное имя пользователя(определяется по почтовому ящику). В результате обнаружил, что у меня некоторые комиты по разному подписаны и как следствие решил полностью сбросить репозиторий(полностью реинициализировать).
Так пришлось немного повозиться(проект не отображался через GitWeb), маленькая как это решить: для этого нужно зайти на git.berlios.de и выполнить git init --bare --shared=all /gitroot/(имя проекта)/ После этого нужно отредактировать файлы: description и README.html и создать пустой файл export_ok.

config
Конфигурация генерируются автоматически
[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
        logallrefupdates = true
[gitweb]
 owner = имя пользователя
[hooks]
        mailinglist = 
        announcelist = 
        envelopesender = 
        emailprefix = [Git]
description
описание проекта (генериться атоматически вида Project ghtml at BerliOS - весит сразу под заголовком в GitWeb
export_ok
существование этого файла разрешает просмотр проекта в GitWeb
README.html
описание висит под description
*
остальные элементы стандартны для git реозитория

Thursday, October 8, 2009

Создание простейшего дерева элементов в gtkhtml

Создание простейшего дерева элементов в gtkhtml:
HTMLObject *o,*flow,* table, *cell,*flowcell,*flowtable;
// отступ clue по отношению к левой стороне экрана, используется при отображении коментариям к записям
GByteArray *levels;
//создание текста
o = text_new (e, "АААААА", current_font_style (e), current_color (e));
html_text_set_font_face (HTML_TEXT (o), current_font_face (e));     
levels = g_byte_array_new ();
//создание clue
flow = html_clueflow_new (current_clueflow_style (e), levels, HTML_LIST_TYPE_BLOCKQUOTE, 0, HTML_CLEAR_NONE);
//создание таблицы
table = html_table_new (0, 0, 3, 2, 1);
//Открыть новую строку
html_table_start_row (HTML_TABLE(table));
//создать новую ячейку
cell = html_table_cell_new (0, 0, 1);
levels = g_byte_array_new ();
//создать clue для ячейки в который засунуть текст
flowcell = html_clueflow_new (current_clueflow_style (e), levels, HTML_LIST_TYPE_BLOCKQUOTE, 0, HTML_CLEAR_NONE);
html_clue_append (HTML_CLUE (flowcell), o);
//привязать к ячейке clue
html_clue_append (HTML_CLUE (cell), flowcell);
//привязать ячейку к таблице
html_table_add_cell (HTML_TABLE(table), HTML_TABLE_CELL (cell));
//закрыть строку
html_table_end_row (HTML_TABLE(table));
levels = g_byte_array_new ();
flowtable = html_clueflow_new (current_clueflow_style (e), levels, HTML_LIST_TYPE_BLOCKQUOTE, 0, HTML_CLEAR_NONE);     
//упаковать все друг в друга
html_clue_append (HTML_CLUE (flowtable), table);     
html_clue_append (HTML_CLUE (flow), flowtable);
html_clue_append (HTML_CLUE (e->parser_clue), flow); 
Внутри clue парсера должен обязательно находится еще один clue в внутри которого расположены все остальные элементы. В clue добавляется все иерархия элементов.

Wednesday, October 7, 2009

Скрытие сообщений при компиляции

В новой версии automake доступна возможность скрытия подробностей компиляции, выводятся только ошибки и имя текущего компилируемого файла. Включается через указание в configure.{in,ac}:
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])

Это возможно использовать и в более старых скриптах, в них этот макрос AM_SILENT_RULES не определен и как следствие не используется. Взято от сюда NicerBuilds, более подробно здесь.