четверг, 6 марта 2014 г.

Редактирование объектов с обновлением в разных вьюхах

Существует несколько подходов к редактированию объектов, когда требуется динамическое обновление связанных элементов в других представлениях. В качестве примера можно рассмотреть ГИС систему, в которой на карту требуется наносить точки с определенными атрибутами, главные из которых - это широта и долгота. В системе предусмотрено два вида отображения точек: в табличном списке и на карте ГИС. Редактирование точек можно производить при помощи дополнительного окна с детальной информацией по точке, а также с помощью перемещения точек непосредственно на карте. При этом, во всех представлениях должны динамически изменяться атрибуты. Возможные варианты редактирования:
  1. из окна редактирования без явной кнопки save (типа редактор свойств) или из карты. Объекты хранятся в памяти и всегда используются один указатель во всех представлениях. При изменении свойства объекта испускается сигнал об изменении, на который подписаны представления. Представления обновляются по этому сигналу. По сути это классический Model-View. Одна модель - много наблюдателей. В качестве модели выступает Point
  2. из окна редактирования точки с наличием кнопки save или из карты (save срабатывает при отпускании точки на карте). При хранении объектов в памяти динамическое обновление будет выполняться, но по кнопке save фиксация изменений может не пройти (например, запись в БД). В этом случае нужно по кнопке отмена откатить изменения. Соответственно, необходим клон объекта на момент начала редактирования, чтобы из него можно было восстановить начальное состояние. 
  3. при работе с БД, ормом и passive view, когда на уровне представления хранятся только идентификаторы объектов и загруженные атрибуты. Очевидно, необходим дополнительный объект, который бы занимался оповещением объектов уровня представления. По событию обновления координат, обновлялись бы другие представления. При невозможности сохранения или отмене проводилось бы соответствующее  оповещение.
Если не нужно автоматическое обновление на всех представлениях в динамике, а только по факту успешного сохранение, то можно при вызове окна редактора заполнять контролы данными из объекта (по сути копия данных), по кнопке сохранить извлекаем данные из контролов во временный объект, сохраняем, если успешно, то обновляем атрибуты исходного (для случая хранения объектов в памяти). В случае passive view исходного не будет, нужно просто запросить новые данные для вью. Т.е. в случае работы с БД получаем из контролов данные, сохраняем, оповещаем по id, что сохранение прошло, всем заинтересованным обновиться, они выбирают свежие данные из БД и обновляют вью.

среда, 19 февраля 2014 г.

Ускорение компиляции cmake cotire

Для ускорения компиляции при использовании cmake существует инструмент
https://github.com/sakra/cotire. Но возникли проблемы его применения совместно с ccache. Не получилось настроить, чтобы ccache кешировал precompiled header, сгенерированный cotire. В итоге пересборка проходит долго, столько же времени, сколько занимает сборка при отсутствии ccache. Пока остановились на использовании связки distcc + ccache, без cotire.

ccache и precompiled header

ccache поддерживает работу в precompiled header

Precompiled headers

ccache has support for GCC’s precompiled headers. However, you have to do some things to make it work properly:

You must set CCACHE_SLOPPINESS to time_macros. The reason is that ccache can’t tell whether __TIME__ or __DATE__ is used when using a precompiled header.

You must either:

use the -include compiler option to include the precompiled header (i.e., don’t use #include in the source code to include the header); or

add the -fpch-preprocess compiler option when compiling.

If you don’t do this, either the non-precompiled version of the header file will be used (if available) or ccache will fall back to running the real compiler and increase the statistics counter “preprocessor error” (if the non-precompiled header file is not available).

http://ccache.samba.org/manual.html#_precompiled_headers

вторник, 31 декабря 2013 г.

Yandex Диск: Символические ссылки

Сервис Яндекс Диск умеет работать с символическими ссылками в отличие от Google Drive (на момент написания). В работе клиента для linux  выявлен ряд особенностей, которые хочется отметить:

  1. В случае вложенных ссылок яндекс диск не отличает их и копирует содержимое повторно. В принципе это функциональность объяснима, для клиента все ссылки одинаковы. Под вложенными ссылками я понимаю ссылки на элементы в пределах одной родительской директории. Например, в папке photo отсортированы фотографии по годам, внутри каждого года по дням. Есть желание создать отдельную папку events в директории photo для хранения ссылок на определенные события (день рождения, свадьба), т.е. наша свадьба -> 200Y/200Y-MM-DD. В этом случае клиент яндекс диск повторно скопирует папку в хранилище. Выход: исключить из синхронизации пути с вложенными ссылками.
  2. Исключения папок из синхронизации. Невозможно исключить из синхронизации еще не созданные каталоги. Нужно сначала их создать, затем добавить в exclude-dirs. Внимание! При заполнении exclude-path в конфигурационном файле к первой директории добавляется полный путь к конфигу. Очевидно это баг. Поэтому первой стоит указать фейковую папку, затем через запятую относительные пути к папкам для исключения из синхронизации. Пример конфига:
    (config.cfg)
    auth="/home/user/.config/yandex-disk/passwd"
    dir="/media/work/clouds/yandex_disk"
    exclude-dirs="fake_dir_see_ps_aux,photo/events"
  3. Удаление папки .sync не влечет никаких проблем. Папка пересоздается при перезапуске демона.

пятница, 2 августа 2013 г.

Перестало запускаться расширение Mouse Gestures для Chrome

После очередного обновления chrome или его расширения mouse gestures, точно уже не помню, расширение перестало работать. Подгружалось с сообщением "Не могу запуститься. Перезагрузите страницу". Решение оказалось простым, нужно почистить настройки хрома, в том числе настройки расширений.

понедельник, 29 июля 2013 г.

Настройка Aptana в Ubuntu 12.04

Прокси
Много времени было потеряно на настройке прокси для аптана. В качестве проверки использовалась загрузка страницы home. Как оказалось позднее, настройки прокси подхватываются при настройках manual, username в формате DOMAIN\username. Свободно устанавливается дополнительное ПО. Но страница home так и не работает.

Indexer
Если по умолчанию не заработала индексация содержимого, то необходимо в настройках проекта явно указать зависимость от рельсов и руби в закладке Project Natures

четверг, 25 июля 2013 г.

Установка ruby при помощи rbenv с поддержкой openssl

Перед выполнение команды rbenv install ...ruby_version... необходимо поставить в систему требуемые пакет, тогда инсталляция пройдет с поддержкой openssl.

sudo aptitude install build-essential zlib1g-dev libreadline-dev libssl-dev libcurl4-openssl-dev

Проверить можно след. образом:
irb
require 'openssl' # =>true