Hatred's Log Place

DON'T PANIC!

Feb 20, 2011 - 1 minute read - programming

Си, прекрасное

http://eli.thegreenplace.net/2011/02/15/array-initialization-with-enum-indices-in-c-but-not-c/ - это воистину прекрасно! Использовать enum для именованной инициализации массива. Можно делать в C99, не работает в C++

Ну и ссылки, на правах мемориза:

  • http://www.advancedlinuxprogramming.com/alp-folder - по названию сайта уже понятно, что это такое :) книжка “Advanced Linux Programming” в сободном доступе. На просторах интернета встречается русский перевод, можно поискать.
  • http://mij.oltrelinux.com/devel/unixprg/ - “UNIX programming examples” - примеры кода на Си для unix, в частности - сокеты, IPC, потоки.

Feb 18, 2011 - 2 minute read -

Dokuwiki Bookmark и Firefox

Внимание: статья полностью неактуальна ввиду переезда на статику в 2019 году.

Какое-то время назад я поднял у себя на wiki систему веб-закладок. Из браузеров подобные закладки добавляются при помощи так называемых bookmarklets - javascript вводящихся через адресную строку.

Естественно что, по сути, единственная удобная возможность использования веб-закладок - это создать на панели закладок (каламбууур!) закладку с URL с текстом букмарклета.

Но мне что-то не понравилось: держать открытую панель закладок ради этого, тратить драгоценное экранное место моего EeePC 1000HA… Решил покурить тему.

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

Приступил к поиску. Результат не заставил себя долго ждать: почти сразу нашел расширение Custom Buttons.

Следующим шагом - придумать код кнопки. Атака “в лоб”, то есть подстановкой кода букмарклета в команду openURI не увенчалась успехом. Но, благодаря этим документам:

  • Custom Buttons Documentation
  • Tabbed browser (особенно про получение объекта document для текущей открытой вкладки)
  • Pages tagged with “DOM” (тут вообще читать не перечитать, но оставим это любителям ваять расширения для FF) был составлен следующий код (помещается во вкладке Code (Код) редактора новой кнопки):
/*CODE*/
host  = 'http://hatred.homelinux.net/wiki';

doc   = content.document;
title = doc.title;
url   = doc.location.href;
sel   = doc.selection ? doc.selection.createRange().text : doc.getSelection();

target_url = host + '/doku.php?do=dokubookmark&te=' + encodeURI(sel) + 
                    '&ur=' + encodeURI(url) + '&ti=' + encodeURI(title);

// Open in new Window
window.open(target_url, 'dokuwikiadd',
    'scrollbars=yes,resizable=yes,toolbars=yes,width=680,height=520,left=210,top=150,status=yes');
// Open in new Tab
//gBrowser.selectedTab = gBrowser.addTab(target_url);

Адрес сайта, естественно, исправляете на свой. Так же можете выбрать способ открытия окна сохранения: по умолчанию - новое окно, а можно - в новой вкладке.

На скриншоте процесс редактирования выглядит так:

Кнопку после создания помещаем на любую открытую панель и пользуемся.

Из замеченных косяков: при включенном No script при открытии окна сохранения ругается на возможную XSS атаку и малость коверкает выделение при вставке, приходится перечитывать.

Feb 14, 2011 - 1 minute read - programming

Maven и WTP

WTP - Eclipse Web Tools Platform. Набор расширений для удобной работы с WEB проектами. Деплой на различные серверы приложений, отладка, профилирование и много всего другого вкусного.

Про Maven не пишу, многим понятно. В последних версиях плагина для Eclipse в extra есть модули для j2ee проектов различных версий соглашений (j2ee 5/6 и младше). Но статья по ссылке:

http://www.devx.com/Java/Article/36785

будет полезна как инструкция по переводу существующего проекта, созданного средсвами Eclipse и WTP на сборку maven’ом.

Feb 14, 2011 - 1 minute read - programming

Java и LDAP. Малость заметок

Помаленьку, понемножку, на уровне ссылок.

Заметка первая: LDAP как JNDI ресурс в context.xml

Читать тут: http://old.nabble.com/LDAP-as-resource-in-context.xml-td14204908.html

Из бяк: при использовании пула подключений, само подключение создаётся в момент new InitialDirContext(env); или первого обращения поиска атрибутов. Для подключения создаётся поток, который не завершается при редеплое. Tomcat ругается при этом на потенциальную утечку памяти. Раздражает.

Заметка вторая: использование DN в фильтрах

Не сразу прокурил как, вот статейка на русском языка, поясняющая - как это нужно делать: http://sysadminblog.ru/ldap/2011/01/18/tipichnye-primery-ispolzovaniya-entrydn-v-ldap-filtrah.html

Feb 8, 2011 - 2 minute read - programming

ThreadLocal Memory Leak

Использовать ThreadLocal переменные удобно, для расшаривания данных между разными частями одного потока (допустим достучаться из POJO объекта к HTTP сессии и т.п.). Другое дело, что чревато в контексте использования сервера приложений: тут треды не уничтожаются, а возвращаются в пул потоков, как следствие: GC не собирает их, они остаются в памяти, а тут, помимо явной утечки, есть ещё и потенциальная дырка в безопасности.

По ссылке статья на английском на эту тематику. Как решить теперь буду думать.

По этой ссылке:

http://wiki.apache.org/tomcat/MemoryLeakProtection

Можно почитать про разные MemLeaks в веб-приложениях (точнее про технологию защиты от оных в Tomcat)

UPD: подкатом решение (???)

Решение

Найдено тут: http://weblogs.java.net/blog/jjviana/archive/2010/06/09/dealing-glassfish-301-memory-leak-or-threadlocal-thread-pool-bad-ide

какое выбирать, решать вам, я выбрал второй вариант с наследованием класса. Скопирую его тут с форматированием:


import java.lang.ref.SoftReference;

public abstract class SoftThreadLocal<T> extends ThreadLocal<T>
{
    // Encapsulation required because Generics is stupid about references, and there is no interface for ThreadLocal, 
    //so I can't simply extend a single ThreadLocal, grr! Java has so many brittle design mistakes in it.
    private final ThreadLocal<SoftReference<T>> local = new ThreadLocal<SoftReference<T>>();

    
    @Override
    public T get() 
    {
        SoftReference<T> ref = local.get();
        T result = null;
        
        if (null != ref) 
        {
            result = ref.get();
        }
        
        if (null == result) 
        {
            result = initialValue();
            ref = new SoftReference<T>(result);
            local.set(ref);
        }
        
        return result;
    }
    
    
    @Override
    public void set(T value) 
    {
        if (null == value) 
        {
            remove();
        } 
        else 
        {
            local.set(new SoftReference<T>(value));
        }
    }
    
    
    @Override
    public void remove() 
    {
        local.remove();
    }
}

Далее работа классическая, к примеру, как у меня через ThreadLocal Singleton:

import java.util.HashMap;

/**
 * Небольшой вспомогательный статический класс
 * для расшариванить локальных для треда переменных. Значение будет для каждого треда своё.
 * 
 * Допустим, получая в методе doPost()/doGet() сервлета значение сессии и для проброса во все дочерние
 * классы, без необходимости передачи оных параметром, что, собственно говоря, не всегда возможно.
 *
 * @author hatred
 * 2011-01-27
 */
public class ThreadContext
{
    private /*static*/ final SoftThreadLocal<HashMap<Object, Object>> _context = new SoftThreadLocal<HashMap<Object, Object>>()
    {
        protected HashMap<Object,Object> initialValue()
        {
            return new HashMap<Object,Object>();
        }
    };

    private static ThreadContext _instance = null;
    //
    
    synchronized public static ThreadContext getContext()
    {
        if (_instance == null)
        {
            _instance = new ThreadContext();
        }
        
        return _instance;
    }
    
    synchronized public static void releaseContext()
    {
        if (_instance != null)
        {
            _instance.clear();
            _instance.contextRemove();
        }
        
        _instance = null;
    }
    
    public void put(Object key, Object value)
    {
        _context.get().put(key, value);
    }
    
    public Object get(Object key)
    {
        return _context.get().get(key);
    }
    
    public void remove(Object key)
    {
        _context.get().remove(key);
    }
    
    public void clear()
    {
        _context.get().clear();
    }
    
    protected void contextRemove()
    {
        _context.remove();
    }
}

Кстати, не могу понять, насколько правильно делать getContext() и releaseContext() synchronized?

Jan 31, 2011 - 12 minute read - туризм

Ударим троплением по отсутствию снегоуборочной техники!

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

Подкатом краткие ремарки…

Новая 2011 года - года Великий Воробей

Слово “насяльника” не дописываю, хотя рука поднимается :) Но по сути: так, только так и никак иначе!

Новый год встретили на хребте Большой Воробей (в распадке между непосредственно вершиной г.Туманная и безымянной вершинкой, на которой располагается бывшая метеостанция). Банда подобралась изумительная: сразу куча новых знакомых, и, главное - отличных ребят: Саня (Квазик или Квазикака), Димка (МРО), Олеся (Рыжая), ещё один Дима, Коля (Live), Оля, её парень - Андрей (обобщенно: альпинюги!), Саня Вишневский (местный “любимчик”). Не могу не упомянуть и о нашем “новогоднем чуде” - Антохе, который теперь даже пьяный будет туриков за версту обходить =-)

Вместе пересеклись на форуме у Зелёного, большая часть ребят оказалась из Гринтура, туда же и меня начала затягивать трясина :)

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

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

Кроме того, произошол и мини-обмен опытом: мне объяснили как правильно тропить, а я показал свой способ организации очага из верёвки и палок (что бы не таскать лишнего, если отправляемся в лес). В остальном - болтали, вязали узлы, травили байки и просто прекрасно проводили время.

Январские обгонялки догонялки

Ешё празднуя НГ на Великая Воробья, Квазик начал агитировать меня на участие в сим мероприятии. И таки сбил с бухты барахты: мол там никто не побежит, все пойдут, тусовка, всё такое… Ну я и повёлся :)

А мероприятие проходило 15 января, за неделю до это отпраздновал свой ДР - стукнуло 27, почесал затылок и решил: еду!

Утро. 7.10. Жду электричку на перроне. Прохладно, однако.

По, как мне сказали, традиции, прыгаю в 3й вагон с конца электрички и… обана: вижу Колю (Live) и Вишневского. А ведь Коля собирался в тайгу, на мой вопрос отвечает коротко, но ёмко: холодно!

В Артем-ГРЭС нашу компанию разбавляет Олеся с горными лыжами - собирается на л.б.Грибановка кататься. В таком составе и катимся дальше (Квазик тем временем едет туда же, но на машине, а Оля уже на трассе “траверс”: так и собрался опять почти весь новогодний состав!).

Приехали в Анисимовку: морозец -25 (кто-то говорил и про -27, но не сильно суть), ветра нет, но кто сказал, что его на верху не будет. Ещё и Фалаза кажется в два раза выше - от жеж у страха глазики велики, нннно - хоть и на 4WD, но доползу! :) Кто-то делает робкие заявления - мол может скинуться и на машине, но смело отметаем эти малодушные заявления и топаем до базы своими двумя.

По дороге изымаю у Олеси лыжи, после того как она навернулась на скользком накате. Какие же они тяжеленные! Тем временем то мы обгоняем, то нас обгоняют группы и группки таких же отморозков, в поисках зимней свежести. На самом подходе к нашей цели, добрая женщина на чём-то джипо-паркетно-подобном говорит мне (ну а кому же ещё: лыжи на плечах!) мол, а в Грибановке подъемник не работает. Овечаю, в духе: эта типа, а мы этого, не того, не кататься, мы - бегать. Интересно, что у неё творилось в голове после такого ответа? :) Саня Вишневский ворчит по дороге: “не честно, мы тут лишние 5-6 км накручивает, а кто-то там с вечера/на машине”. Оправдываю это “безобразие” разминкой, а чем не похоже?

По дороге вспоминаю о Наде Юровой: из-под сознания всплывает, что она что-то там говорила про обгонялки, и нужно бы было её позвать… А мысль оказывается материальна, только добрались, начали регистрироваться (заполучил себе 13й номер) и, опппа, кого я вижу - Надя! :) Там же встретили Квазика, ткнул носом где регистрироваться - записался на кольцо: я по северо-западному ребру не поднимался, только спускался, решил восполнить этот недостаток.

Далее всё быстро: новые знакомства, перекус, старт.

В 12.20-12.25 стартанули… Ога как же, пошли все - ЛОМАНУЛИСЬ как лоси, ну и я, в лучших традициях классики (вспоминая “Джентльменов удачи”): все побежали и я побежал! Но с моей дыхалочкой долго это не продолжалось: перешёл на шаг, да и на подъёме было тяжко, но ничего, я сюда за впечатлениями, по дороге фотографировал пейзажи (особенно красиво стало когда вышел на гребень, хотя там был и сильнейший ветерок и конкретный минусок) и обгоняющих меня девчат (разнесён старт на 10 минут был).

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

Тут и началась самая интересная часть маршрута: жопогорки или Фалаза Бобслей-2011. Поясню: спуск по северо-восточному (да ровно как и подъем) - достаточно крутой… И меня сразу удивила форма тропы: ровный такой полукруг. Пытался сначала бежать по нему, хватаясь за деревья, но в один момент упал на пятую точку и… тут я ВСЁ понял: и почему форма тропы такая, и как по ней нужно спускаться! :) В общем, никогда я так быстро с Фалазы не спускался.

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

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

Зелёный (к моменту моего прибытия) уже прибежал с траверса, и вообще они там молодцы, слоны: за 7 часов с минутами уделали маршрут от Лукьяновки (ж/д платформы, если быть точнее) до Пидана, по Ливадийскому хребту на Фалазу и вниз на Грибановку. Скоро прибежала и Оля (“альпинюги!”), заморозила себе палец на ноге: ехала потом в электричке (мама?) отогревала. Но, вроде, всё нормальное уже.

Подождали последних, завершающих кольцо, девушек, чай, награждения, вручения, поздравления. Пообщался с Надей: заполучила 3е место, 1е и 2е - её подруги Настя (1) и Саша (2, ориентировщица).

Вовка (с кем Квазик ехал на машине) подбросил на машине до станции, там отогревались в магазине, из которого нас любезно не выгоняла продавщица, даже спрашивала что где как, когда искали куда выбросить мусор, предложила ведро, в общем - хорошим людям вива!

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

Зимняя Коврижка

<WRAP center round box 80%> Краткий исторический очерк

Остров Скребцова, в народе - Коврижка, небольшой островок в Амурском заливе, километрах в 2х от берега. Назван в 1863 году в честь М.Л.Скребцова, учавствовавшего в гидрографических исследованиях залива Петра Великого. В 1890 на острове был лагерный пункт для Сахалинских каторжников, отправляемых в приморье для ударной работы, но вскоре был ликвидирован, как экономически не выгодный и транспортно неудобный. Во время ВОВ на острове были огороды (думаю правда что один большой). В 1961 в ходе раскопок на острове были найдены следы стоянки древних людей. Сейчас остров необитаем, кроме забегающих туристов. Коренное население: два дерева, геодезический пункт и мыши-полевки (весь островок изрезан ихними ходами).

Сагитировала Надя Юрова, кто-то собирался ещё идти, но в результате стойких оказалось двое (плюс один дезинформированный… каюсь, Чайки во Владивостоке две).

В рюкзачках термос, бутерброды. Протопали по льду минут за 30-40 от Чайки и были уже на островке. Фотоаппарат забыл.

Погода теплая. С островка симпатичный вид на Владивосток со стороны: весь укутан в синей дымке выхлопов и влажности.

В яме на острове оставили рюкзачки, разложили бутерброды, достали термосы. Поднялись на насыпь… Тут, отхлебывая чай, краем глаза замечаю первого коренного жителя острова - полевка, шухерно, но верно продвигается к нашим бутербродам, а за ней и вторая показалась. Э неееет! Без проса есть нельзя! Спускаемся, рюкзаки оставшиеся внизу забираем, мышам оставляем бутерброд.

Потом забавно: отхлебываешь чай - мышь пробегает. Я уж было подумал - что же я такого там заварил? :) Но в скором времени сыр был, как им казалось, сворован и утащен в нору. Ещё немного постояли и отправились обратно на электричку.

А “пингвинов” в заливе… тьма тараканья!

В январе, в тайгу, что бы принять ванну!?

Да-да-да, именно так :) Это мы на прошедших выходных сгоняли на термальные источники на ключе Горячий, что в Лозовском районе, нашего родного приморья.

Предыстория: Зелёному нужно по работе в Лазо, в радиусе 20км он может сделать заброску. В среду, в клубе, по принципу: один сказал, остальные не возражали, выбрали конечной целью - термальный источник. Назначили завпродом, начпоха, распределили кому тащить палатку, кому печку для неё, пилы и т.п., прикинули меню и раскладку. Прозевал электричку, остался ночевать в клубе, как и Олеся.

В общем, опять суббота, договорились, что меня подберут на Подгородинке в 7.20 (получилось позже, но замерзнуть не успел). В машине старые и новые лица (помимо тех, что планировались изначально): Саня Коломеец с Зелёным едет по делам, с нами - Настя (ориентировщица, как сказал Квазик: “Её беречь! Она в будет в моей команде на Ковалеровской!”). В районе Арем-ГРЭС тем же образом подбираем Олесю и двигаем дальше, до следующей, главной цели: ШПЦ (Шкотовский Пирожковый Центр), дабы восполнить потраченные калории на ржач в машине.

Но вот, ШПЦ оставлен позади, наглому барбосу скормлена соска в тесте, едем, болтаем, смеёмся. Так и миновали Новую Москву, перевал Серебряный, Сергеевку, Монакино, Лазовский перевал, Лазо, Беневское и… вот посёлок Свободный: десантируемся, рюкзаки, как обычно, с мерзким хихиканием запрыгивают нам на спины, идём… По дороге, переодеваясь (снял куртку), чуть не оставил какому-то счастливцу в подарок фотоаппарат, пришлось немножко пробежаться за ним и обратно.

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

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

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

Потом скопом и посменно пилили-кололи-таскали дрова для печки. Саня всё твердил, что мало, но на постой дров оказалось больше, чем на Новый год, на две ночи! =-) Правда, как выше писал, и горели они как порох.

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

В ванну в первый день залезла только Олеся.

Но вот и отбой (около 22.40). Вызвался дежурить первым (остальные в порядке лежки по местам). Глаза крайне стремились сомкнуться, но печку держал в полной боевой. Потихоньку заправлялся чаем.

Пока дежурил стал свидетелем забавной сонной ситуации: Саня заливается храпом, рядом Олеся спит. Тут он поворачивается к ней, и так, ласково начинает ей нахрапывать на ушко. Ну, она явно такого не выдержала и таки пнула его в бок. Квазик, как истинный боец сразу подрывается с вопросом мне: “А!? Что случилось!?”. Пришлось ласковым голосом успокаивать, что всё нормально, просто страшный сон, спи :)

Около 00.00 разбудил Димку (МРО), забрался в спальник, который, к слову сказать, оказался не тем, кем представлялся: на чехле High Peak и экстрим до -23, а оказался NovaTour model 450 (экстрим -5, комфорт +10). Но, к слову сказать, было не холодно.

Следующая смена у меня было на утро (7.00). Принял вахту у Сани, расположился. Разогрел и навернул супа, оставшегося с вечера - типа завтрак, немного шлифанул чаем. А у печки тем временем наблюдаю сдувшиеся тюбики от сгущенки, наверное полёвки прокрались и, пока дежурные отвернулись, высосали всё до капли! :laughing:

По окончании, решил уже не ложиться. Опять сдал вахту Димке (МРО), отправился готовить дрова, и распаливать огонь под ванной. Тем временем Дима (№2) так же покинул палатку, занялся разведением огня для готовки, чистку котлов и заправку оных снегом для растопки. Такое мирное трудовое утро.

В том же составе приняли банные процедуры… Это вообще песня: вода сама теплая (27-29 градусов), плюс подогрета (картина: человек сидит в чане, под ним горит костёр… постановка скоро будет :)), а вокруг елки, снег, тайга! =-) В общем, сплошной и безоговорочный кайф.

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

А котлы тем временем всё не хотели закипать, хоть сильно, обильно и усердно парили. Вообще котлы без крышек, особенно зимой - злое зло! Ннно, где наша не пропадала: примерился к одной фанерке - опппа, вот и крышка :) Закипело сразу и мигом. Забабахали борщ “Воробей”, после перекинули “крышку” на котелок под чай. С чаем вышло не без приключений: таки не выдержала фанерка: решилась загореться, но мы на неё не в обиде: дело она своё сделала и нам помогла.

На одном из сеансов связи откликнулся Зелёный: оказывается они уже почти добрались, малость забуксовали, пока спускались на помощь - выбрались. К тому моменту были уже почти все наетые и собранные, для насяльника раскочегарили огонь под ванной с присказкой: Зелёный, давай в ванну, зелени не хватает!

После был обратный путь… Анн нет! Есть такое место на дороге, которое моз мозг ввело в смятение: идёт наезженная колея, а тут ба! переходит в ОДНУ! Ну прям как в фильме в “Зоне особого внимания” (или как-то так):

  1. Тут, бабушка, танки пройдут

  2. Да как же милок, тут же узко!

  3. Да это новые, на одно гусенице!

  4. До чего же техника дошла…

В этом месте нужно было откренивать машину. Зелёный сказал откуда цепляться, я потопал с Саней на это место… Вот только, как оказалось, останавливаться он при этом не собирался. Саня с криком “На абордаж!” пригнул и зацепился, но я, глядя как опасно машина при этом отклонилась по направлению к опрокидыванию, не решился последовать его примеру… А то, дрова есть, ещё бы ночевали =-)

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

Jan 25, 2011 - 1 minute read - programming

JAAS in Action

Довелось повозиться с JAAS, для организации управления доступом внутри XML-RPC сервиса (реализованного в виде сервлета, крутящегося внутри Tomcat). В результате поиска хорошей, систематизированной информации, наткнулся на книжку: JAAS in Action ( http://jaasbook.wordpress.com/)

Книжка доступна для свободного скачивания в формате PDF, лицензия - CC.

Как результат, я её крайне рекомендую: содержит всё необходимое для вникание в работу с JAAS, содержит практические примеры, среди которых, к примеру, использование нескольких Policy-источников, показаны примеры для хранения настроек JAAS, аутентификационной (имя пользователь и пароль, группы пользователя) и авторизационной (политики, разрешения) информации в базе (легко разворачивается до использования других хранилищ, к примеру - LDAP). Язык английский, но читается крайне легко.

Другие ссылки, касательно JAAS, можно поглядеть тут.

P.S. эпопею с сервлетом и авторизацией, я ещё опубликую, как только полностью закончу.

Jan 19, 2011 - 1 minute read -

Ejabberd и LDAP

На правах закладки: ejabberd - группы из LDAP на о снове OU - пример реализации. Но без документации даже не начинать читать. Модуль mod_shared_roster_ldap появился только в комплекте ejabberd 2.1.6, если версия младше, как, например, в Debian Squeeze (2.1.5), то качать отсюда: https://alioth.debian.org/projects/ejabberd-msrl, читать документацию, компилять и настраивать.

Dec 30, 2010 - 3 minute read - programming c++

Astxx: action для команды QueueStatus (+пример)

Логическое продолжение для этой статьи, команда для получения состояния очереди.

Подкатом реализация и пример использования команд QueuePause и QueueStatus, какие эвенты получаются смотрите в документации(( тут или тут, вторая ссылка более полная, но на буржуйском, хотя кого это пугает? :wink:))

Реализацяи QueueStatus

/* 
 * Additonal actions for Astxx
 * Copyright (C) 2010  Alexander Drozdov <hatred@inbox.ru>
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License version 2.1 as published by the Free Software Foundation.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/** @file
 *
 * Include this file to use the QueueStatus action. You should include it by hands.
 *
 */

#ifndef ASTXX_MANAGER_ACTION_QUEUE_STATUS_H
#define ASTXX_MANAGER_ACTION_QUEUE_STATUS_H

#include <astxx/manager/basic_action.h>
#include <astxx/manager/message.h>
#include <astxx/manager/error.h>

namespace astxx {
   namespace manager {
      namespace action {
         /** Ask Queue Status
          */
         class queue_status : public basic_action {
            public:
               /** Construct a QueueStatus action.
                * @param queue          - concretize queue [optional]
                * @param member         - select member [optional]
                * @param action_id      - add optional action Id to all responses [optional]
                */
               queue_status(const std::string& member    = "",
                            const std::string& queue     = "", 
                            const std::string& action_id = "") :
                                member(member),
                                queue(queue),
                                action_id(action_id) {}

               /** Format this action as a message::action.
                * @return this message as a message::action
                */
               message::action action() const {
                  message::action action("QueueStatus");

                  if (!queue.empty())
                  {
                    action["Queue"] = queue;
                  }

                  if (!member.empty())
                  {
                    action["Member"] = member;
                  }

                  if (!action_id.empty())
                  {
                    action["ActionID"] = action_id;
                  }

                  return action;
               }

            private:
               std::string queue;
               std::string member;
               std::string action_id;
         };
      }
   }
}

#endif // QUEUESTATUS_H

Пример

Пример основан на event-test.cc, что идёт вместе с astxx.

#include <astxx/manager.h>
#include <vector>
#include <string>
#include <iostream>

#include "queue_status.h"
#include "queue_pause.h"

void print_event(astxx::manager::message::event e) 
{
   //std::cout << e.format();
   std::cout << e["Paused"] << "<br/>n";
}

int main(int argc, char** argv) 
{
   std::vector<std::string> args(argv, argv + argc);

   if (args.size() != 4) 
   {
      std::cerr << "Usage: " << args[0] << " [host] [username] [secret]<br/>n";
      return 1;
   }

   try 
   {
      namespace manager = astxx::manager;
      namespace action = astxx::manager::action;

      manager::connection connection(args[1]);
      std::cout << "Connected to " << connection.name() << " v" << connection.version() << std::endl;

      boost::signals::scoped_connection c1 = connection.register_event("QueueMember", print_event);
      //boost::signals::scoped_connection c2 = connection.register_event("Queue", print_event);

      action::login login(args[2], args[3]);
      login(connection);

      action::queue_pause qpause("SIP/3008", true);
      manager::message::response resp = qpause(connection);
      std::cout << resp.format();

      action::queue_status qstatus("SIP/3008");
      resp = qstatus(connection);
      std::cout << resp.format();

      action::queue_pause qpause2("SIP/3008", false);
      resp = qpause2(connection);
      std::cout << resp.format();

      action::queue_status qstatus2("SIP/3008");
      resp = qstatus2(connection);
      std::cout << resp.format();


      for (;;) 
      {
         connection.wait_event();
         connection.pump_messages();
         connection.process_events();
      }
      return 0;
   }
   catch (const std::exception& e) 
   {
      std::cerr << "Exception: " << e.what() << std::endl;
   }
   return 1;
}

Собственно что тут происходит:

  • создаём подключение
  • регистрируем обработчик для эвента QueueMember (смотрим токи на AMI)
  • логинимся
  • ставим мембера в паузу и спрашиваем его состояние
  • убираем паузу и опять спрашиваем его состояние
  • в цикле обрабатываем приходящие эвенты

Dec 29, 2010 - 1 minute read - linux

ArchLinux: geda-gaf в community

Собственно - радость! :)

Там же теперь и разводчик pcb. Двойная радость!

К сожалению, утилита xgsch2pcb (менеджер проектов-интегратор gschem и pcb) до community ещё не добралась, но уже не плохо.