Apache Maven 2
На правах мемориза:
- http://www.ibm.com/developerworks/ru/edu/j-mavenv2/index.html - Введение в Apache Maven 2
- http://docs.codehaus.org/display/MAVEN/Maven+Plugin+Matrix - таблица плагинов Maven 2
На правах мемориза:
WTP - Eclipse Web Tools Platform. Набор расширений для удобной работы с WEB проектами. Деплой на различные серверы приложений, отладка, профилирование и много всего другого вкусного.
Про Maven не пишу, многим понятно. В последних версиях плагина для Eclipse в extra есть модули для j2ee проектов различных версий соглашений (j2ee 5/6 и младше). Но статья по ссылке:
http://www.devx.com/Java/Article/36785
будет полезна как инструкция по переводу существующего проекта, созданного средсвами Eclipse и WTP на сборку maven’ом.
Помаленьку, понемножку, на уровне ссылок.
Читать тут: http://old.nabble.com/LDAP-as-resource-in-context.xml-td14204908.html
Из бяк: при использовании пула подключений, само подключение создаётся в момент new InitialDirContext(env); или первого обращения поиска атрибутов. Для подключения создаётся поток, который не завершается при редеплое. Tomcat ругается при этом на потенциальную утечку памяти. Раздражает.
Не сразу прокурил как, вот статейка на русском языка, поясняющая - как это нужно делать: http://sysadminblog.ru/ldap/2011/01/18/tipichnye-primery-ispolzovaniya-entrydn-v-ldap-filtrah.html
Использовать ThreadLocal переменные удобно, для расшаривания данных между разными частями одного потока (допустим достучаться из POJO объекта к HTTP сессии и т.п.). Другое дело, что чревато в контексте использования сервера приложений: тут треды не уничтожаются, а возвращаются в пул потоков, как следствие: GC не собирает их, они остаются в памяти, а тут, помимо явной утечки, есть ещё и потенциальная дырка в безопасности.
По ссылке статья на английском на эту тематику. Как решить теперь буду думать.
По этой ссылке:
http://wiki.apache.org/tomcat/MemoryLeakProtection
Можно почитать про разные MemLeaks в веб-приложениях (точнее про технологию защиты от оных в Tomcat)
UPD: подкатом решение (???)
какое выбирать, решать вам, я выбрал второй вариант с наследованием класса. Скопирую его тут с форматированием:
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?
31-е января, были вылазки, а вот по отчётам как-то у меня слабо, поэтому выкладываю небольшим дайджестом.
Подкатом краткие ремарки…
Слово “насяльника” не дописываю, хотя рука поднимается :) Но по сути: так, только так и никак иначе!
Новый год встретили на хребте Большой Воробей (в распадке между непосредственно вершиной г.Туманная и безымянной вершинкой, на которой располагается бывшая метеостанция). Банда подобралась изумительная: сразу куча новых знакомых, и, главное - отличных ребят: Саня (Квазик или Квазикака), Димка (МРО), Олеся (Рыжая), ещё один Дима, Коля (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 градусов), плюс подогрета (картина: человек сидит в чане, под ним горит костёр… постановка скоро будет :)), а вокруг елки, снег, тайга! =-) В общем, сплошной и безоговорочный кайф.
Постепенно и весь лагерь пробудился, все так же прошли через банные процедуры.
А котлы тем временем всё не хотели закипать, хоть сильно, обильно и усердно парили. Вообще котлы без крышек, особенно зимой - злое зло! Ннно, где наша не пропадала: примерился к одной фанерке - опппа, вот и крышка :) Закипело сразу и мигом. Забабахали борщ “Воробей”, после перекинули “крышку” на котелок под чай. С чаем вышло не без приключений: таки не выдержала фанерка: решилась загореться, но мы на неё не в обиде: дело она своё сделала и нам помогла.
На одном из сеансов связи откликнулся Зелёный: оказывается они уже почти добрались, малость забуксовали, пока спускались на помощь - выбрались. К тому моменту были уже почти все наетые и собранные, для насяльника раскочегарили огонь под ванной с присказкой: Зелёный, давай в ванну, зелени не хватает!
После был обратный путь… Анн нет! Есть такое место на дороге, которое моз мозг ввело в смятение: идёт наезженная колея, а тут ба! переходит в ОДНУ! Ну прям как в фильме в “Зоне особого внимания” (или как-то так):
В этом месте нужно было откренивать машину. Зелёный сказал откуда цепляться, я потопал с Саней на это место… Вот только, как оказалось, останавливаться он при этом не собирался. Саня с криком “На абордаж!” пригнул и зацепился, но я, глядя как опасно машина при этом отклонилась по направлению к опрокидыванию, не решился последовать его примеру… А то, дрова есть, ещё бы ночевали =-)
А вот уже дальше уже был обратный путь, легкая грусть на сердце и слипающиеся глаза. А сегодня что-то руки отваливаются, от всех эти дровозаготовительных работ =-)
Довелось повозиться с JAAS, для организации управления доступом внутри XML-RPC сервиса (реализованного в виде сервлета, крутящегося внутри Tomcat). В результате поиска хорошей, систематизированной информации, наткнулся на книжку: JAAS in Action (http://jaasbook.wordpress.com/)
Книжка доступна для свободного скачивания в формате PDF, лицензия - CC.
Как результат, я её крайне рекомендую: содержит всё необходимое для вникание в работу с JAAS, содержит практические примеры, среди которых, к примеру, использование нескольких Policy-источников, показаны примеры для хранения настроек JAAS, аутентификационной (имя пользователь и пароль, группы пользователя) и авторизационной (политики, разрешения) информации в базе (легко разворачивается до использования других хранилищ, к примеру - LDAP). Язык английский, но читается крайне легко.
Другие ссылки, касательно JAAS, можно поглядеть тут.
P.S. эпопею с сервлетом и авторизацией, я ещё опубликую, как только полностью закончу.
На правах закладки: ejabberd - группы из LDAP на о снове OU - пример реализации. Но без документации даже не начинать читать. Модуль mod_shared_roster_ldap появился только в комплекте ejabberd 2.1.6, если версия младше, как, например, в Debian Squeeze (2.1.5), то качать отсюда: https://alioth.debian.org/projects/ejabberd-msrl, читать документацию, компилять и настраивать.
Отчёт от Олеси aka Рыжей: http://turizm.primkray.ru/index.php?id=365&doc=k_podnozhiiu_vorobia
PS форма изложения - доставляёт, стилизовано под реальный туристический отчёт :)
Запостил камрад AlexVK (1161371 ):
Программистский жаргон. Раз: http://habrahabr.ru/blogs/habraquotes/111432/
И далее, по ссылке два http://habrahabr.ru/blogs/development/96978/
И первоисточник три http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined
Epoch & Unix Timestamp Conversion Tools: http://www.epochconverter.com/
удобно и быстро, когда нужно прикинуть.
Для всякого непотребства, свазанного с ожиданием:
http://ajaxload.info/
Логическое продолжение для этой статьи, команда для получения состояния очереди.
Подкатом реализация и пример использования команд QueuePause и QueueStatus, какие эвенты получаются смотрите в документации((тут или тут, вторая ссылка более полная, но на буржуйском, хотя кого это пугает? :wink:))
/*
* 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;
}
Собственно что тут происходит:
Собственно - радость! :)
Там же теперь и разводчик pcb. Двойная радость!
К сожалению, утилита xgsch2pcb (менеджер проектов-интегратор gschem и pcb) до community ещё не добралась, но уже не плохо.
Парой слов, что такое Astxx небольшая библиотечка для работы с Asterisk через AMI протокол из C++. Написана с использование STL и Boost.
В одной из прошлых заметок упоминал про дружбу Qt4 и Boost.Signal - для дружбы этой библиотечки и Qt4 это и было нужно :)
Для чего нужна команда, например для организации софтовой DnD кнопки: если интерфейс будет в паузе, из очереди на него не будут переводиться звонки.
Сами классы подкатом.
UPD Переоформил в стиле Astxx
/*
* 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 QueuePause action. You should include it by hands.
*
*/
#ifndef QUEUE_PAUSE_H
#define QUEUE_PAUSE_H
#include <astxx/manager/basic_action.h>
#include <astxx/manager/message.h>
#include <astxx/manager/error.h>
#include <vector>
#include <string>
namespace astxx
{
namespace manager
{
namespace action
{
/** Set Queue Pause state
*/
class queue_pause : public basic_action
{
public:
class error : public manager::error
{
public:
explicit error(const std::string& desc) throw() : manager::error(desc) { }
};
public:
/** Construct a QueuePause action.
* @param interface - member
* @param is_on - pause state
* @param queue - queue for process, if omited - all queues is used
*/
queue_pause(const std::string &interface, const bool is_on = false, const std::string &queue = "") :
_interface(interface),
_queue(queue),
_is_on(is_on) {}
/** Format this action as a message::action.
* @return this message as a message::action
*/
message::action action() const
{
message::action action("QueuePause");
if (!_queue.empty())
{
action["Queue"] = _queue;
}
action["Interface"] = _interface;
std::string on_off_str = "false";
if (_is_on)
{
on_off_str = "true";
}
action["Paused"] = on_off_str;
return action;
}
message::response handle_response(message::response response)
{
basic_action::handle_response(response);
if ("Success" != response)
{
throw queue_pause::error(response["Message"]);
}
return response;
}
private:
std::string _interface;
std::string _queue;
bool _is_on;
};
}
}
}
#endif // QUEUE_PAUSE_H
Встроенного функционала нет, для X11 можно записпользовать такой код (юзается XLib):
#ifdef Q_WS_X11
# include <X11/Xlib.h>
# include <X11/Xatom.h>
#endif
...
toAllDesktops()
{
#ifdef Q_WS_X11
Atom atom = XInternAtom(x11Info().display(), "_NET_WM_DESKTOP", True);
if (atom)
{
uint32_t data = 0xFFFFFFFF;
XChangeProperty(x11Info().display(), // Display
winId(), // Window
atom, // Property
XA_CARDINAL, // Property type
32, // Data format: 8, 16 or 32 bit
PropModeReplace, // Property change mode
reinterpret_cast<uint8_t*>(&data), // Property data
1); // Data elements count
}
#endif
}
тут предполагается, что эта функцейка будет медотом класса окна, иначе нужно будет передавать Display и Window. Специальное значение 0xFFFFFFFF как раз и говорит - разместить на всех рабочих столах, иначе воспринимается как номер стола, куда нужно поместить окно. В случае Windows этот функционал бесмесленен, поэтому портабельность не сильно пострадает, при использовании директив препроцессора.
Подробности: