forest, summer

2015 год...

Лесной Домик common_house (в начале "Общий Дом Друзей") http://hut.shestero.info был открыт для гостей с конца 2008 по конец 2014 г.

В 2015 году я приостановил эту деятельность. В настоящий момент Домик стоит пустой.

Я не решил пока окончательно что делать, но скорее всего буду искать другое место - c речкой и электричеством.
В будущем я скорее всего опять буду принимать гостей в Домике, но новый домик будет приватным, и доступ в него будет только для моих личных знакомых и друзей.
  • Current Mood
    sad sad
forest, summer

Поселения и сообщества, где я успел побывать

Недавно мои тематические блоги [info]ru_ic , [info]ru_cohousing и [info]common_house , а также основной личный блог [info]shestero перестали быть доступны с территории России вместе со всей блог-платформой http://lj.rossia.org , по решению Роскомнадзора. По секрету скажу, мой личный блог дублировался в ЖЖ shestero, а остальные ещё можно просматривать из России через публичные анонимайзеры. Тем не менее, я решил для удобства продублировать список альтернативных поселений и жилищных сообществ, прежняя версия которого была тут: http://lj.rossia.org/community/ru_ic/1984.html С этого момента новая версия будет тут: http://shestero.livejournal.com/180889.html NB Этот список не полный!

Список альтернативных поселений, интересных сообществ и семей, в которых я побывал

Название

Регион

когда

тип

Ecovil_kaluga
ecovil_kaluga

Калужская обл.

март 2008

"индивидуальное"

Китеж
http://www.kitezh.org

Калужская обл.

октябрь 2008

поселение из семей с приёмными детьми

Агнино

Новгородская

февраль 2009

"ортодоксальное" анастасиевское

Родное
http://ecorodnoe.ru

Владимирская

март 2009

"Центральное" анастасиевское

Любодар (Майское)
http://lubodar.ru

Владимирская

весна 2009

Анастасиевское (обычное?)

Любинка
http://lubinka.ru

Московская

июнь 2009

"Научное"

СРП Благодать
http://www.eco-blagodat.ru

Ярославское напр., за Переславль-Залесским (Ярославская обл.?)

Август 2009,
Ноябрь 2010

“слабо связанное”/"либеральное" анастасиевское

Поселения Казинка - Никольское - Сергиевское
http://kazinka-rp.ru
kazinka.mson.ru
http://www.nikolskoe-rp.narod.ru

Тульская область

осень 2009

Поселение "без правил", но требуют немедленного переселения на место и тяготеют ЗОЖ, к вегетарианству. Приветствуются семьи с детьми.

Кемпхил "Светлана"
http://www.camphillsvetlana.org

Ленинградская область

начало декабря 2009

Единственный в России кэмпхилл, где живут неполноценные взрослые. Есть ферма.

Рыжково
http://www.ryzhkovo.com

Ленинградская область

6 декабря 2009

Место для проведения семинаров и подобных мероприятий для питерцев

АП Аннушка
yakudza_spb

Псковская область

январь 2010

Просто уезд в деревню, добрососедство
(не связанные взаимными обязательствами дворы)

Теремки” и “Гармония”
http://garmonia.nm.ru

Рязанская область

Апрель 2010

Либеральное анастасиевское "коттеджного типа"

Ковчег
http://www.eco-kovcheg.ru

Калужская область

29 мая 2010

Большое анастасиевское поселение с глубокой интеграцией

Остров Обырок
obyrok

Украина, север

Май-июнь 2010

Творческое поселение

Ромашки

Украина, около 150 км южнее Киева

Июнь 2010,
май 2012

Примитивизм, близость к природе, хиповатость. Церковь Последнего Завета (Виссарион), Кришнаиты.

Росы (?)

Украина, около 150 км южнее Киева

Июнь 2010

Либеральное анастасиевское

Нево-Эковиль
http://our-common-home.narod.ru

Карелия, не далеко от Сортовалы

Июнь 2010

Содружество не-родовых поместий

Ясное
http://vkontakte.ru/club2577520

Ленинградская область, запад

Июнь 2010

Анастасиевское (обычное?)

Лопатино / Прямухино
http://community.livejournal.com/poselenie_eco/2806.html
http://pryamukhino.wordpress.com

Тверская область

Июнь 2010

на базе анархо-примитивистов

Никольское Градислав http://gradislav.ru http://www.nikolskoe.nnov.ru

Нижегородская область

Июнь 2010

Анастасиевское (обычное?)

Калиновец http://kalinovec.ru

Нижегородская область, Воротынский р-н

Июль 2010

Анастасиевское (обычное?)

Антоновские Сады

Татарстан

Август 2010

Оригинальное синкретическое, основной упор на создание тесных взаимоотношений

Тиберкуль http://vissarion.ru

юг Красноярского края

Август 2010

Глобальная община (“единая семья”) + помощники

Родники

Курганская область, Юргамышский р-н

Сентябрь 2010

Анастасиевское (обычное?)

Большой Камень
http://ecobs.ru

Вологодская обл., Сокольский р-н

декабрь 2010

Семейный "экотуристический" пансионат с этнографическим уклоном

Коммуна на Медведице
http://vkontakte.ru/club18162755

Курская область (недалеко от Курска, рядом трасса М-2).

7-8 мая 2011

Молодёжно-неформальная тусовка из Курска на базе умирающего СНТ.
"дачное"

Гришино
http://www.grishino.ecology.net.ru

Ленинградская область, Подпорожский район.

15-17 июля 2011

Одно из первых российских экопоселений (доанастасиевской эпохи). Активно привлекает иностранцев.

Сквошино
facebook.com/Skvoshino

Псковская область, запад

30 марта - 1 апреля
2012

Молодёжное, творческое, синкретическое; анархические принципы (самоуправление). Немного хиповатое.

Ягодное/Ягодино
(площадка - поле, нак котором планируется строить поселение)
http://yagodino.narod2.ru

Владимирская область,
юго-запад

29 апреля
2012
(было собрание на поле)

Анастасиевского типа, либеральное

Юшки
(площадка - поле, нак котором планируется строить экоцентр и поселение)
http://hatabobriv.org.ua/kmb.html

Киевская область, ок. 100 км на юг от Киева

19 мая 2012

околоанастасиевского пригородного типа

Барановка
Baranivka.Org

Украина,
Полтавская обл.

16-21 сентября 2012

"Молодёжная дача"
NB Им помогает организация IofC

Этнокультурный центр народных ремёсел «ТЕРЕМ»
https://vk.com/center_terem

Смоленская область, под Вязьмой

31 мая -
1 июня 2014

Экопоселение "выросшее" из ПРП Доброселье, образовательный центр

Økosamfundet Dyssekilde

http://www.dyssekilde.dk

Дания,
3 часа на пригородных поездах от Копенгагена, направление на север.

20 сентября 2014

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





Особые места

Общежитие движения ФАКЭЛ-ПАРТОС
http://fakel-portos.ru

Раменское, МО

Осень 2008

Пифагорейская радикальная организация

Дом Друйзей на Природе
http://common-house.backtothelander.info

Владимирская область

2008-...

экспериментальная площадка

Анархо-альтруистическая коммуна Рассвет
http://rassvet-altruism.ru

г. Воронеж

7 октября 2009,
январь 2011

площадка, флэт

ЧМО Поваровка
http://lj.rossia.org/community/xenodochia/1405.html

Московская обл., Поваровка (ленинградское напр.)

весна 2010

Частное Молодёжное Общежитие

Святогорово

Московская обл., Дмитровский р-н

21 мая 2010

частное поместье-дача

Земляничные поляны

Ленинградская область

Июнь 2010

частное поместье

Особое место в Петяярви

Ленинградская область

Июнь 2010

турстоянка напрости базы ЛИТМО

Зелёный Домик http://zeldomik.ru

г.Томск

Август 2010

бывший хипятник, арт-центр, место проведения квартирников

Эколофт ecoloft

г.Москва, ул.Пятницкая

осень 2010

место проведения квартирников, экологических акций

"Журавлиная Родина" (заказник, сообщество) http://www.craneland.ru http://oxycoccus.narod.ru

Московская обл.,
Талдомский район, д.Леоново

23-24 апреля 2011

Экологи, биологи. Активно борятся с природными пожарами.

Арбузхона (жилищное сообщество на даче)

Московская обл.,
Сходня, ул.Горная

14 мая 2011

ТС МЕСТО
http://www.couchsurfing.org/people/36.6 http://vkontakte.ru/mestomestnoe
mestomestnoe

СПб, р-н В.О.

17 июля 2011

Мастерские и общежитие

"Школа [Эко]Жизни"
vkontakte.ru/club27879973 (содержимое странички не полносью соответствует реальности)

Переславль-залесский р-н ярославской области

8-10 октября 2011

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

Экспериментальный "Дружный Дом" в Лобне
http://vkontakte.ru/club31556393

г.Лобня (ближнее Подмосковье)

25 октября 2011

см. объявление

"Волшебный домик чудесной любви"
(Мал.Вязёмы)
http://vkontakte.ru/homelove

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

26 ноября 2011

Весьма положтельная атмосфера!
Молодёжь. Аюрведическая тематика, вегетарианство.

Образовательный центр "Экосистема"
http://ecosystema.ru

ближнее Подмосковье, Ярославское напр.

17-18 декабря 2011

Киевский Экоцентр

Киев, м.Выдубичи

12,20 мая 2012

Тематическая площадка в Киеве

"Монастырь" Сказкотерры skazkoterra

Крым, Бахчисарайский р-н

14-18 мая 2012
август 2013

Частная площадка, место проведения семинаров и неформальных встреч (психология, эзотерика тип)

Поселение Типицца
http://vk.com/tipizza

рязанская обл., вблизи г. Спасс-Клепики

26-27 июня 2012

Частная площадка, лидер и хозяин chaika_stal
"микс буддизма, индуизма, индианства, нью-эйдж, анархизма и примитивизма и ещё чего-то западноевропейского"

Пространство "Eco-Camp"
healthspirit.ru

Крым, р-н Бахчисарая, дорога на Танковое-Счастивое

август 2013

Коммерческий лагерь в предгорьях Крыма. Йога, вегетарианское питание, культурные события.
Есть WiFi и возможность удалённой работы (электричество итд).

"Приходите в гости" Коммуна
http://vk.com/wearecommune

Рязань

6 октября 2013

Молодёжный флэт, немного хипповатости, но культурно. Темы: мызыка, культурная жизнь, гештальт.

ЧМО Салтыковка (aka "Поликуб")
https://vk.com/saltukovka

МО, Рядом с платф.Салтыковская, горьковское направление электричек

конец 2013 года

Частное Молодёжное Общежитие, "наследник" ЧМО Поавровка

Християния

Копенгаген, Дания

10 сентября 2014

Очень известное старое место-сквот, "свободный город".

Частные коммунальные дома молодых людей, с його-направленностью

Московская область, ярославское направление, платф. Зеленоградская и др.

4-5 октября 2014

Арендуемые вскладчину коттеджи.

Культурно-Оздоровительный Центр "Восхождение".
http://vk.com/centr_voshogdenie

пос. Возрождение, р-н Геленджика, Краснодарская область.

13-16 августа 2015

Площадка на природе. Большинство живут в палатках. Тема ЗОЖ.

Дом Творчества СуМеру (бывш. "Дом друзей в Краснодаре")
(На тот момент уже назывался "Дом творчества")
http://vk.com/dom_druzei (ссылка уже не работает) http://vk.com/su_meru

Краснодар, северо-восток, не далеко от федеральной тарссы.

26 августа 2015

Бывший "вписочный дом".

forest, summer

Преобразование HTML в XHTML на C и C++

Задача преобразования HTML-форматированного текста в XHTML появилась в связи с тем, что нужно было вставлять в XML блоки форматированного текста. (Про чтение таких блоков при SAX-разборе я написал статью: http://lj.rossia.org/users/shestero/141287.html ). Эти вставки писались вручную и часто содержали ошибки форматирования, невидные при просмотре в браузерах, но неприемлимые для строгих парсеров XML. Кроме того в исходных текстах часто были непарные теги, вроде <BR>, которые каждый раз приходилось отыскивать и исправлять вручную.

Для выполнения этой задачи на C++ я успешно приминил бесплатную библиотку Tidy. К сожалению разработка её остановилась в начале 2009, но для моей задачи она сгодилась.

Я использовал MinGW, компилировал из коммандной строки-консоли Qt 4.8.3 под Windows 7.
Так как исходники уже довольно древние, при компиляции возникают небольшие загвоздки. Вот пошаговая инструкция, как я делал:
1. Использовал последний tarbar-архив из CSV (март 2009).
2. После распаковки надо создать вручную директории obj (где Makefile) и bin c lib (в директории tidy) (сами они не создаются)
3. Я использовал Makefile для gmake, но его пришлось изрядно поправить. Также для компиляции в MinGW пришлось поправить директиву выбора блока в файле src/mappedio.c. Исправленные файлы я выложил в архив tidy-changes.7z [здесь].
4. Для сборки библиотеки запустите make из директории build\gmake.

Вот код на C++, обеспечивающий конвертацию:
// Convert HTML to XHTML and clean up using libTidy
#include <tidy.h>
#include <buffio.h>
string CleanHTML(const char *html)
{
    // Initialize a Tidy document
    TidyDoc tidyDoc = tidyCreate();
    TidyBuffer tidyOutputBuffer = {0};

    // Configure Tidy
    // The flags tell Tidy to output XML and disable showing warnings
    bool configSuccess = tidyOptSetBool(tidyDoc, TidyXmlOut, yes)
        && tidyOptSetBool(tidyDoc, TidyQuiet, yes)
        && tidyOptSetBool(tidyDoc, TidyNumEntities, yes)
        && tidyOptSetBool(tidyDoc, TidyShowWarnings, yes) // no
        ;//&& tidyOptSetValue(tidyDoc,TidyCharEncoding, "utf8");

    int tidyResponseCode = -1;

    // Parse input
    if (configSuccess)
        tidyResponseCode = tidyParseString(tidyDoc, html);

    // Process HTML
    if (tidyResponseCode >= 0)
        tidyResponseCode = tidyCleanAndRepair(tidyDoc);

    // Output the HTML to our buffer
    if (tidyResponseCode >= 0)
        tidyResponseCode = tidySaveBuffer(tidyDoc, &tidyOutputBuffer);

    // Any errors from Tidy?
    if (tidyResponseCode < 0) // Tidy encountered an error while parsing an HTML
        throw tidyResponseCode;

    // Grab the result from the buffer and then free Tidy's memory
    std::string tidyResult = (char*)tidyOutputBuffer.bp;
    tidyBufFree(&tidyOutputBuffer);
    tidyRelease(tidyDoc);

    return tidyResult;
}
// ................

        // Convert HTML to XHTML and clean it
        // see also: https://bugs.webkit.org/show_bug.cgi?id=44876
        string xhtml;
        try
        {
            xhtml = CleanHTML( html );
        }
        catch (int e)
        {
            cerr << "Clean HTML error (from libTidy): " << e << endl;
        }
Добавлю, что в моём случае обработка UTF-8 символов (кирилицы) в приложении, запущенном под Windows 7 x64 происходила не правильно (они конвертировались в кодовые &-представления побайтно). Так как мне это не было нужно в тот момент, я не стал разбираться в чём там дело, возможно просто в системных настройках локалей или в каких-то параметрах запуска библиотечных функций или компиляции. Вроде бы Tidy поддерживает UTF-8. Для обработки кириличных HTML-текстов также можно перевести их в однобайтовую кодировку, например в CP-1251.

Для C++ также существует специальная обёртка Tidy-библиотеки TidyPP: http://code.google.com/p/tidypp
forest, summer

Чтение простого XML с помощью RapidXML

Я люблю хранить технологическую конфигурацию моих программ и утилит в XML-файле.
Пока я делал приложения с использованием Qt использовал небольшой класс, который читал эту конфигурацию и сохранял её в QStringMap.

Однако возникла потребность сделать простую утилиту на C++ но без Qt, XML-парсером которой я пользовался.
Типичный формат моего XML таков:
<?xml version="1.0" encoding="utf-8"?>
<registry>
    <version>1</version>
    <section id="common" >
        <parameter id="locale" >ru_RU.utf8</parameter>

        <parameter id="parameter1" >value1</parameter>
        <parameter id="parameter2" >value2</parameter>
    </section>
</registry>
Для чтения я без проблем воспользовался бесплатной библиотекой RapidXML 1.13. Сейчас она входит в Boost, но я попробовал также использовать её и отдельно (при сборке с помощью GNU C++/MinGW под Windows). Собственно библиотека эта состоит из трёх шабонных HPP-файлов, которые не требуют компиляции.

Публикую код, который читает XML и сохраняет конфигурацию в STL-коллекцию:
//#include <rapidxml.hpp>
//using namespace rapidxml;
#include <boost/property_tree/detail/rapidxml.hpp>
using namespace boost::property_tree::detail::rapidxml;

// .................

    // ---
    xml_document<char> doc;

    //cout << "Parse..." << endl;

    try {
        ifstream file( fname_xml.c_str() );
        vector<char> buffer((istreambuf_iterator<char>(file)), istreambuf_iterator<char>());
        buffer.push_back('\0');

        doc.parse<0>( &buffer[0] );
    }
    catch (parse_error e) {
        cerr << "Fail. Parse error " << e.what() << endl;
        return 0;
    }

    xml_node<> *root_node = doc.first_node();
    //cout << "Root found?" << endl;

    if (root_node!=NULL)
    {
        //cout << "Root found!" << root_node->name() << ":" << root_node->value() << endl;
        xml_node<> *node = root_node->first_node("section");
        //if (node!=NULL) cout << "section found" << endl;
        if (node) node = node->first_node("parameter");
        //if (node!=NULL) cout << "first parameter found" << endl;
        while (node!=NULL)
        {
            xml_attribute<>* a = node->first_attribute("id");
            if (a!=NULL)
            {
                config[ a->value() ] = node->value();
            }

            node = node->next_sibling();
        }
    }
    cout << "========" << endl << "Check loaded configuration:" << endl;

    typedef map<string,string>::const_iterator it;
    for (it i=config.begin(); i!=config.end(); i++)
    {
        cout << i->first << "\t= " << i->second << endl;
    }
    cout << "Configuration loaded" << endl;
    // ---
    

Стоит добавить, что когда я подставлял в doc.parse<0>( ... ) для проверки забитую в коде текстовую константу, это приводило к падению программы во время работы парсера (run-time exception). Так получалось потому, что RapidXML для скорости применяет "разрушающий" разбор - точнее в процессе работы он заменяет символы после концов символьных сущонстей XML нулевыми байтами. Таким образом они превращаются в "отдельные" строки с точки зрения C/C++ без копирования их содержимого.
forest, summer

Сжатие потока информации PHP-HTTP-Java

Это логическое продолжение моих статей «Сжатие потока информации PHP-HTTP-Qt» и «Шифровка потока информации PHP-HTTP-Java».

Перед вами код на Java, способный конвеерно принимать запакованный (как в первой упомянутой статье) и возможно зашифрованный (как во второй) XML:

import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
// ................


public static void main(String[] args
{
  System.out.println("DecryptorTest HELLO");
  
  //Security.addProvider( new IAIK() ); // using IAIK Security Provider
  java.security.Security.addProvider(new gnu.crypto.jce.GnuCrypto());
  
  // Using Hex in Apache Commons:
  // byte[] bytes = Hex.decodeHex(key0.toCharArray());
  StringBuilder keyc = new StringBuilder();
    for (int i = 0; i < key0.length(); i+=2) {
        String str = key0.substring(i, i+2);
        keyc.append((char)Byte.parseByte(str, 16));
    }
  System.out.println("DecryptorTest: Common secret key (plain) =" + keyc);

  MD5 md5 = new MD5();
  //IMessageDigest md5 = HashFactory.getInstance("MD5");
  byte[] iv;
  try {
    iv = iv0.getBytes"UTF-8" );
  catch (UnsupportedEncodingException e1) {
    System.out.println("DecryptorTest: Error: UnsupportedEncodingException (UTF-8)");
    return;
  }
  System.out.println("DecryptorTest: Common initialization vector length (bytes) =" + iv.length);
  md5.update(iv, 0, iv.length);
  String ivh = "";
  iv = md5.digest();
  for (int i = 0; i < iv.length; i++) {
    ivh += String.format("%02x", iv[i] );
  }
  System.out.println("DecryptorTest: Common initialization vector (MD5) =" + ivh);

  // encrypt the user password and convert it to Hex
  String passwordh;
  try {
    passwordh = encryptpassword0, keyc.toString(), iv );
  catch InvalidKeyException 
      | UnsupportedEncodingException 
      | IllegalBlockSizeException 
      | BadPaddingException 
      | NoSuchAlgorithmException 
      | NoSuchProviderException 
      | NoSuchPaddingException 
      | InvalidAlgorithmParameterException e
  {
    System.out.println("DecryptorTest: Error: cannot encrypt user password! Exception="+e.toString());
    return;
  }
  System.out.println("DecryptorTest: Personal password (encripted, hex) =" + passwordh);
  
  md5.reset();
  try {
    md5.update(password0.getBytes("UTF-8")0, password0.getBytes("UTF-8").length);
  catch (UnsupportedEncodingException e) {
    System.out.println("DecryptorTest: Error: cannot prepare password (no UTF-8 encoding)");
    return;
  }
  byte[] pwd5 = md5.digest();
  //System.out.println("DecryptorTest: Personal password (MD5, hex) =" + password5);
  
  int keysize;
  keysize = 32// Cipher.getMaxAllowedKeyLength("Twofish/CBC/NoPadding");
  System.out.println("DecryptorTest: maximum key size ="+keysize );
  
  URL url;
  try {
    url = new URL(surl);
  catch (MalformedURLException e) {
    System.out.println("DecryptorTest: Error: Malformed URL");
    return;
  }
    HttpURLConnection conn;
  try {
    conn = (HttpURLConnectionurl.openConnection();
    String post;
    
    post = "user=shestero";
    post+= "&password="+passwordh;
    
    conn.setDoOutput(true)// мы будем писать POST данные
    conn.setDoInput(true);

    OutputStreamWriter out =
        new OutputStreamWriterconn.getOutputStream()"UTF-8" );
    out.write(post);
    // out.write("\r\n"); // перевод строки попадает в значения, передаваемые POST-ом
    out.close();
    
    PushbackInputStream stream = new PushbackInputStreamconn.getInputStream());
    int i0 = stream.read();
    if (i0<0)
    {
      System.out.println("DecryptorTest: Warning: empty reply!");
    }
    else
    {
      stream.unread(i0);
      
      InflaterInputStream inf = null;
      if (i0==0)
      {
        // encrypted
        stream.skip(32)// skip header
        
        System.out.println("DecryptorTest: Note: data comes encrypted!");
        
        byte[] key2 = new byte[32];
        Arrays.fill(key2,(byte)0);
        int j=0;
        for (int i=0; i<keyc.length() || i<pwd5.length; i++)
        {
          if (i<keyc.length()) key2[j++]=keyc.toString().substring(i,i+1).getBytes()[0];
          if (i<pwd5.lengthkey2[j++]=pwd5[i];
          if (j>=keysize)
            break;
        }
        System.out.println("DecryptorTest: Personal key to decript reply =["+key2+"]");

        // TODO: Fix key size
        if (j<=16j=16else if (j<=24j=24else if (j<32j=32;
        System.out.println("DecryptorTest: key2.length="+j);
        Cipher cipher = createCipherCipher.DECRYPT_MODE, key2, iv );
        
        inf = new InflaterInputStream
            new CipherInputStreamstream, cipher )
            new Inflater(true// set 'nowrap' parameter to 'true' here 
            );
        // r = new BufferedReader( new InputStreamReader( new CipherInputStream( stream, cipher ) ) );
      }
      else
      {
        // plain
        System.out.println("DecryptorTest: Warning: data comes unencrypted!");

        inf = new InflaterInputStreamstream, new Inflater(true) );
        //r = new BufferedReader( new InputStreamReader( stream ) );
      }
      BufferedReader r = new BufferedReadernew InputStreamReaderinf ) );    
      
      // Чтение строка за строкой для проверки
      System.out.println("====[REPLY FROM SERVER:]===========================");
          String inputLine;
          while ((inputLine = r.readLine()) != null
          {
              System.out.println(inputLine);
          }
          r.close();
          System.out.println("====[SUCESS]=======================================");
    }          
    catch (IOException e) {
    System.out.println("DecryptorTest: Error: IOException; URL="+surl);
  catch InvalidKeyException
      |  NoSuchAlgorithmException
      |  NoSuchProviderException
      |  NoSuchPaddingException
      |  InvalidAlgorithmParameterException e
  {
    System.out.println("DecryptorTest: Error: cannot decode: Exception="+e.toString());
  
  
  System.out.println("DecryptorTest BYE")
}
Исходник обработан: Java2html
forest, summer

Европейский сентябрь 2014

Сказав спасибо лету, теперь следует сказать мне спасибо прошедшему месяцу осени.
Большую часть сентября я провёл в Европе, в основном в Швеции, Дании, Франции (Париже) и Латвии (Рига, Юрмала). Путешествие было весьма удачным, полезным и интересным! :-)

Вот несколько фотографий из Парижа, из Копенгагена и из эко-поселения в Дании (http://www.dyssekilde.dk):




Собор Парижской Богоматери


Лувр


Париж, монумент из Египта


Копегаген


экопоселение-кохаузинг Dyssekilde (Дания)


экопоселение-кохаузинг Dyssekilde (Дания)


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

Лето, до свидания!

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

Вот несколько фотографий на память о минувшем сезоне:











  • Current Mood
    satisfied satisfied
  • Tags
forest, summer

Hospitality Networks

List from: https://www.warmshowers.org, see also: https://dachgeber.de.

PS Useful inforation for Hitchhickers: http://www.hitchbase.com.

forest, summer

C++/Qt: Получение полного содержимого XML-тега (со вложенными) при SAX-разборе

Задача: при SAX-разборе перехватить полное содержимое определённых тегов в виде исходного текста, как оно есть, со всеми вложенными подтегами.
Хотя задача эта, по-моему, достаточно простая, банальная и затребованная, но по какой-то не понятной причине не нашёл избытка описания готовых её решений.
Зачем удобно перехватывать полный «сырой» текст XML? С ходу столкнулся с двумя возможными причинами:
1. Как известно и у SAX и у DOM разбора есть свои преимущества и недостатки. Возможен большой XML-документ, который по крайней мере удобно разбирать SAX-парсером, но в нём попадаются отсносительно небольшие участки, которые как раз было бы удобно и естественно с помощью DOM.
2. В определённных XML-тегах может находится XHTML-содержимое, разбирать которое не нужно вообще, его надо просто целиком сохранить, например, отправить на визуализацию в GUI-контрол.

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

Итак, как оказалось в Qt это сделать очень просто: достаточно перекрыть в классе QXmlInputSource публичный виртуальный метод next, который «кормит» прасер анализируемым XML посимвольно.

Вариант №1:
Обработчик содержимого (наследник QXmlDefaultHandler):
(В случае если при SAX-разборе попался один из интересующих нас «особых» тегов, мы переходим в режим «перехвата», а при закрытии тега выходим из этого режима, обрабатываем результат).
bool Report::startElement(const QString &namespaceURI, const QString &localName,
                          const QString &name, const QXmlAttributes &attrs)
{
    if (name=="information") // "information" is a special tag name
    {
        m_xmlsource->BeginIntercept();
    }

    return RemoteTable::startElement(namespaceURI, localName, name, attrs);
}
// RemoteTable is a parent class that handle XML content

bool Report::endElement(const QString &namespaceURI, const QString &localName,
                        const QString &name)
{
    if (name=="information") 
    {
        QString info = m_xmlsource->EndIntercept();

        if (m_pHeader!=NULL)
        {
            // send XHTML content into QLabel
            const QString was = m_pHeader->text();
            m_pHeader->setText( was+info );
        }
    }

    return RemoteTable::endElement(namespaceURI, localName, name);
}

Класс ExtXmlInputSource:
#ifndef EXTXMLINPUTSOURCE_H
#define EXTXMLINPUTSOURCE_H

#include <QXmlInputSource>

#include <QIODevice>


class ExtXmlInputSource : public QXmlInputSource
{
public:
    ExtXmlInputSource(QIODevice* dev);

    virtual void    BeginIntercept();
    virtual QString EndIntercept();
    virtual QChar   next();

protected:
    bool            m_interception;
    QString         m_content;
};

#endif // EXTXMLINPUTSOURCE_H

// cpp:

ExtXmlInputSource::ExtXmlInputSource(QIODevice* dev)
    : QXmlInputSource(dev)
    , m_interception(false)
{
}

void ExtXmlInputSource::BeginIntercept()
{
    m_interception = true;
}

QChar ExtXmlInputSource::next()
{
    QChar ret = QXmlInputSource::next();

    if (m_interception)
        m_content+=ret;

    return ret;
}
Таким образом в накопителе ExtXmlInputSource::m_content получится нужный блок XML-текста плюс закрывающийся тег (если открывающий тег не был вообще «самозакрытым»). Тег для симментрии убираем (если результат направляется в DOM, можно наоборот в начале приписать открывающийся тег):
QString ExtXmlInputSource::EndIntercept()
{
    m_interception = false;

    const QString res = m_content;
    m_content.clear();

    // if needed: remove the last (closing) tag
    if (!res.isEmpty()) // non-empty tag?
    {
        int pos = res.lastIndexOf("</");
        if (pos>=0)
            return res.left(pos);
    }

    return res;
}

У этого метода есть недостаток — в режиме «перехвата» парсер всё равно вызывает виртуальные методы обработчика содержимого (в данном случае класса Report, наследника QXmlDefaultHandler), что во-первых не нужно и грузит машину бесполезной работой, во-вторых вносит путаницу и является потенциальной причиной ошибок.

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

Вариант №2 (улучшенный):
Класс ExtXmlInputSource2:
#ifndef EXTXMLINPUTSOURCE2_H
#define EXTXMLINPUTSOURCE2_H

#include "extxmlinputsource.h"

#include <QXmlDefaultHandler>
#include <QXmlSimpleReader>

class ExtXmlInputSource2 : public ExtXmlInputSource, public QXmlDefaultHandler
{
public:
    ExtXmlInputSource2(QIODevice* dev);

    void Intercept(const QString& spectag, QXmlSimpleReader* reader, QXmlDefaultHandler* old);

    virtual bool endElement(const QString& , const QString& , const QString &name);

protected:
    QString m_spectag;
    QXmlSimpleReader* m_reader;
    QXmlDefaultHandler* m_old;
};

#endif // EXTXMLINPUTSOURCE2_H

// cpp:

ExtXmlInputSource2::ExtXmlInputSource2(QIODevice* dev)
    : ExtXmlInputSource(dev)
{
}

void ExtXmlInputSource2::Intercept(const QString& spectag, QXmlSimpleReader* reader, QXmlDefaultHandler* old)
{
    m_spectag = spectag;
    m_reader  = reader;
    m_old     = old;

    if (m_reader!=NULL)
        m_reader->setContentHandler(this);

    BeginIntercept();
}

bool ExtXmlInputSource2::endElement(const QString& , const QString& , const QString &name)
{
    if (name==m_spectag) // warning: no nested tags 'spectag' are expected!
    {
        if (m_old!=NULL)
            m_old->characters( EndIntercept() );

        if (m_reader!=NULL)
            m_reader->setContentHandler(m_old);
    }

    return true; // QXmlDefaultHandler::endElement(namespaceURI, localName, name); == always true
}

Вызов из основного класса-обработчика содержимого происходит с помощью метода Intercept, а приём перехваченного XML происходит как-бы обычным вызовом виртуального метода characters в рабочем обработчике.
В метод Intercept кроме названия тега передаётся указатель на класс SAX-парскра и указатель на рабочий (основной) обработчик содержимого для автоматического возврата в основной режим, после закрывающегося «особого» тега:
bool Report::startElement(const QString &namespaceURI, const QString &localName,
                          const QString &name, const QXmlAttributes &attrs)
{
    if (name=="information")
    {
        m_xmlsource->Intercept(name, m_reader, this);
    }

    return RemoteTable::startElement(namespaceURI, localName, name, attrs);
}
// RemoteTable is a parent class that handle XML content

bool Report::characters(const QString &str)
{
    if (m_name=="information") // m_name set in RemoteTable::startElement
    {
        if (m_pHeader!=NULL)
        {
            // send XHTML content into QLabel
            const QString was = m_pHeader->text();
            m_pHeader->setText( was+str );
        }
    }

    return RemoteTable::characters(str);
}

Оба эти варианты работают с предположением, что «специальные» теги, которые надо перехватывать не будут вложенными.

Приложение.
На форуме RSDN человек по имени Константин дал мне ценные указания, как это сделать технологиями Microsoft:
«MSXML позволяет это делать минимальными усилиями: класс MXXMLWriter умеет из SAX-событий делать строку с текстом, или писать XML документ в любой IStream, или, как для твоей задачи, делать DOM из SAX.
Когда в своей реализации ISAXContentHandler встретился определённый тег, создавай DOM document, создавай экземпляр COM-класса MXXMLWriter назначив ему output новый DOM document, потом нужно аккуратно форвардить события ISAXContentHandler в этот MXXMLWriter, пока определённый тег не закроется. Когда закроется, получиццо DOM-документ с содержимым тега
».

Там же мне дали ссылку по этому вопросу на Java:
http://stackoverflow.com/questions/7998733/loading-local-chunks-in-dom-while-parsing-a-large-xml-file-in-sax-java