Tagged with programming

Разработка приложений с Akonadi: добавление задач в календарь

Недавно, благодаря хорошей идее на KDE Brainstorm я создал плагин для KDE Plasma Runner, позволяющий быстро добавлять задачи и события в календарь, исходный код которого доступен на GitHub.

Сегодня я хотел бы поделиться опытом создания, а конкретно рассмотреть тему написания приложений, использующих Akonadi.

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

Читать дальше »

Typus - админка в Rails-приложениях

typus2 typus1

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

И поэтому я был очень рад обнаружить замечательный проект: Typus. Это плагин для Rails, позволяющий значительно упростить процесс создания админки для приложений.

Читать дальше »

Использование Boost Pointer Container Library

Как часто Вам приходилось хранить в стандартных STL контейнерах указатели на объекты? Я думаю, достаточно. Но хранение обычных указателей приводит к тому, что приходится тратить дополнительные усилия на то, чтобы проверять, что память освобождается при уничтожении контейнера.

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

А судя по замерам, накладные расходы по производительности и памяти на подсчет ссылок достаточно велики: Boost smart pointer timings.

Что же делать в таких случаях? На помощь приходит очередная библиотека в составе Boost - Pointer Container Library. Она предоставляет основные контейнеры, схожие со стандартными, специально предназнченные для хранения указателей.

Читать дальше »

Boost::Spirit: Грамматики, функции и замыкания

В этой заметке я продолжу рассказывать о библиотеке Boost::Spirit, предназначенной для написания на C++ различных парсеров. В прошлой заметке я описал базовые возможности Spirit, a в этой хочу затронуть несколько возможностей, которые по моему мнению практически необходимы в случае написания сколько-нибудь сложных парсеров. Итак, эти возможности:

Читать дальше »

Boost::Xpressive - Альтернатива Boost::Regex

Не так давно я писал об использовании библиотеки Boost::Regex для регулярных выражений в C++. В этой заметке, я опять затрону эту тему, только теперь рассмотрю другой компонент Boost, предназначенный для обработки регулярных выражений: Boost::Xpresive.

Итак, во-первых, чем же он отличается от Boost::Regex:


  • Xpressive не требует линковки никаких дополнительных библиотек;

  • Утверждается, что Xpressive в среднем работает быстрее;

  • В Xpressive реглярные выражения могут описываться не только динамически (в виде строки, передаваемой в некую функцию), но и статически в виде C++ кода.

  • Регулярные выражения Xpressive могут ссылаться друг на друга, образуя целые грамматики

Читать дальше »

Регулярные выражения в С++: использование Boost::Regex

В этой заметке я рассмотрю такую достаточно популярную тему, как использование регулярных выражений. Причем, рассматривать я буду применительно к C++ с использованием библиотеки Boost, которая содержит замечательные средства для их поддержки.

Используемый синтаксис реглярных выражений совпадает с широко известным PCRE (Perl-Compatible Regular Expressions).

Для использования библиотеки необходимо включить заголовочный файл boost/regex.hpp:

#include <boost/regex.hpp>

Читать дальше »

Создание парсеров на C++ с помощью Boost::Spirit

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


  • Написание парсера вручную, анализируя строку средствами C++, возможно, используя регулярные выражения.

  • Генерация парсера с использованием соответствующих утилит, например, Antlr, lex/yacc и т.п.

Несколько иной подход предоставляется библиотекой Spirit в составе Boost. О нем я расскажу ниже.

Boost::Spirit – библиотека, предназначенная для описания текста грамматики вместе с семантическими действиями прямо в C++ коде. Грамматика буквально конструируется из примитивных парсеров путем использования соответствующим образом перегруженных операторов C++. Таким образом, описание грамматики выглядит достаточно близко к классическому описанию, как например БНФ.

Читать дальше »

Создание плазмоидов: One-Line Calculator

onelinecalc

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

Итак, мой апплет: Plasma One-Line Calculator. Крайне простая и вместе с тем необходимая мне вещь. Работает он следующим образом: на рабочем столе отображается текстовое поле, в которое можно ввести выражение. При нажатии Enter это выражение вычисляется и в поле отображается результат вычисления. Вот и все.

Для того, чтобы реализовать вычисление, я использовал возможности скриптового движка в KDE4.

Исходный код

Исходный код плагина состоит из трех файлов:

Читать дальше »

Получение всех Java классов из ClassPath

Уже не первый раз наталкиваюсь на достаточно общую задачу: найти все классы в classpath приложения. Каждый раз гуглю, пишу код, а потом он где-то теряется. Поэтому, выкладываю код своего решения, может быть кому-нибудь пригодится. А если не пригодится напрямую, здесь видно как читать Jar-файлы))) Короче, говоря, гугл рассудит) Краткое описание подхода, чтобы лучше понимался код:

  • Разделяем строку classpath на записи, ссылающиеся на конкретные директории и jar-файлы. В линуксе разделитель между ними - двоеточие, в винде - точка с запятой. Дальше, для каждой записи:
  • Если запись ссылается на директорию - рекурсивно сканируем ее, считая директорию, откуда начали сканирование соответствующей корневому пакету.
  • Если запись ссылается на файл, пытаемся анализировать его как Jar-файл, используя инструментарий из пакета java.util.jar
Чтобы использовать нижеприведенный класс необходимо получить саму строку classpath. Это осуществляется простым вызовом System.getProperty ("java.class.path")

Читать дальше »

Динамика Groovy

В этой заметке я расскажу о некоторых возможностях Groovy, которые обеспечивают его динамичность. В частности:

Читать дальше »

Мультиметоды в Groovy

Мультиметоды – это механизм выбора метода на основе не только динамического типа его получателя, как при использовании виртуальных методов, но и динамических типов его аргументов. По сути, этот механизм обобщает виртуальные функции и перегрузку.

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

В Groovy выбор метода для вызова осуществляется на основе динамических типов аргументов, а не статических, как, например, в Java. В частности, рассмотрим два следующих участка кода.

Читать дальше »

Виртуальные функции в С++ и производительность

Тема поста навеяна недавними постами на www.codeblogz.ru и в журнале Benoît Jacob. Benoît Jacob заявляет, что использование виртуальных функций приводит к трехкратным издержкам по производительности и предлагает технику, позволяющую избавиться от виртуальных функций, за счет использования шаблонов. Здесь я изложу некоторые свои соображения по этому вопросу.

Читать дальше »

Использование Groovy: Замыкания и динамические объекты

Я продолжаю цикл заметок о Groovy – динамическом языке программирования для платформы Java.

В этой заметке я расскажу о замыканиях в языке Groovy, а также об одном из их применений – динамических объектах.

Замыкания

Замыкания можно представлять, как блоки кода (или анонимные функции), которые при выполнении имеют доступ к переменным того контекста, в котором они были объявлены. С другой стороны, замыкания являются объектами, которые могут быть переданы в другие методы, сохранены в переменных, и т.п.

В Java аналогами замыканий являются анонимные классы, однако, они имеют намного менее удобный для использования синтаксис и имеют некоторые ограничения (которые, конечно можно обойти, но… ).

Читать дальше »

Использование Groovy: Ranges, Lists, Maps

В этой и нескольких последующих заметках я расскажу о Groovy. Groovy - это динамический язык для платформы Java, позволяющий использовать в ява-проектах многие возможности таких языков, как Ruby, Python и Perl.

По сравнению с Java, Groovy имеет значительное число отличий, позволяющих писать во многих случаях более лаконичный и читабельный код:

Читать дальше »

StaticMatic: Статические сайты на Ruby

После программирования на Ruby on Rails быстро привыкаешь к этой платформе, и многим ее вкусностям. В частности, к часто используемым языкам разметки Haml и Sass.
Но иногда наступают моменты, когда надо сделать статический сайт из нескольких страничек, за которым нету никакой базы данных, да и серверной логики вообще.
Не хочется возвращаться к старым html и css. Но при этом и делать это на ROR неразумно.

Для таких случаев был создан фреймворк staticmatic, позволяющий на основе Haml+Sass+вкусностей на Ruby сгенерировать набор статичных веб-страниц, которые можно разместить на любом хостинге, без поддержки Ruby вообще.

Итак, как использовать staticmatic:

Читать дальше »

Периодические задачи в Ruby On Rails

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

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

Здесь я кратко опишу процесс установки и конфигурирования плагина для выполнения какой-либо периодической задачи.

Читать дальше »

Свойства в C++

На тему http://dask-blog.blogspot.com/2008/05/property-c.html.

Немного поигравшись, пришел к реализации свойств в C++, которая обладает некоторыми преимуществами, по сравнению с известными мне реализациями:

  • Свойства не требуют инициализации в конструкторах
  • Независимо от количества свойств, размер класса увеличивается на константу, связанную с выравниваем членов. У меня, например, на 4 байта.

Как это делается?

Читать дальше »

Абстракция хранилища данных в J2ME

В процессе написания небольшой програмки для мобильного телефона столкнулся с тем, что работа c файловой системой (JSR-75) поддерживается не на всех телефонах. А данные надо же где-то хранить. Потому я решил реализовать поддержку записи данных как в файловую систему, так и в RecordStore

Но при этом различные объекты пишут данные по разному, поэтому в голову пришла следующая абстракция:

  • Все объекты, которые могут быть сохранены, реализуют интерфейс Storable
  • Имеется абстрактное хранилище данных, от которого наследуются реализации для файлов и для RecordStore. Это же абстрактное хранилище умеет само выбирать реализацию и выдавать ее по запросу.

Читать дальше »

Логирование в Java: Использование slf4j

В этой заметке я расскажу о фасаде для систем логирования, SLF4J, опишу его особенности и использование.

SLF4J (Simple Logging Facade for Java) – библиотека для логгирования, ставящая своей целью предоставить максимально простой, но при этом мощный фасад для различных систем логгирования на Java. Чем же это лучше чем использование какой-либо распространенной библиотеки для логгирования?

Если сравнить использование различных систем логгирования, как log4j и обощенных фасадов, таких как, например, slf4j, то можно найти следующие отличия:

Использование конкретной реализации:


  • Зависимость от этой конкретной реализации

  • Необходимость искать адаптеры, при необходимости использования компонент, разработанных, для других реализаций логгирования

  • Меньше компонент в зависимостях

Использование фасада:


  • Возможность использования различных реализаций

  • Большое число компонент (фасад + реализация)

  • Возможность быстро менять реализацию, возможно даже не меняя не строчки кода

Дополнительно к этому, SLF4J предоставляет возможность интегрировать компоненты, зависимые от других систем логирования (Log4J, JCL), подставляя реализации, направляющие логи этих систем в SLF4J.

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

Читать дальше »

GUI в Java c помощью JFace: Создание окна приложения

JFace - это доплнительный слой абстракции над графической библиотекой SWT, предоставляющий возможности для разработки графического интерфейса приложения на основе модели MVC(Model View Controller). Основные компоненты JFace включают:

  • Viewers - классы для инкапсуляции задач предоставления данных для отображения, их фильтрации, сортировки и т.п.
  • Actions and contributions - вводят семантику описания пользовательских действий и того, как они должны быть доступны пользователю.
  • Image and font registries - предоставляют классы для управления ресурсами, такими как изображения и шрифты.
  • Dialogs and wizards - фреймворк для построения сложного диалогового взаимодействия с пользователем.
  • Field assist - предоставляет возможности для реализации вспомогательной функциональности для полей, такой как отображение статуса поля или подсказки о содержимом.
В первой части будет рассмотрено создание простого окна с использованием JFace, добавление к нему меню, статусной строки и панели инструментов.

Читать дальше »

Переменное число аргументов в Java: конструкция "..."

Недавно случайно обнаружил, что в Java существует возможность красиво реализовать переменное число аргументов у метода. Красиво, это значит без всяких new Object[]{}, которые жутко засоряют код и совсем не способствуют его читабельности. Красивое решение: конструкция "...", которая была добавлена в Java SE 5.

Читать дальше »

Использование boost::multi_index

Контейнеры STL построены на концепции, состоящей в том, что каждый контейнер контролирует свой собственный набор элементов, предоставляя какой-либо интерфейс доступа к ним.

В отличие от STL, контейнеры boost::multi_index построены на другом принципе: каждый контейнер содержит хранилище элементов, предоставляя несколько различных интерфейсов доступа ( называемых в boost индексами ) к ним. Такой подход позволяет достаточно легко и прозрачно строить контейнеры совмещающие свойства различных STL контейнеров, а также быстро менять описание контейнера в случае необходимости добавления или удаления индексов, не меняя уже написанный код, работающий с контейнером.

Читать дальше »