Hatred's Log Place

DON'T PANIC!

Sep 8, 2010 - 2 minute read - Comments -

Unix man pages в Qt Assistant

В продолжении темы, поднятой мною тут: 906984 , таки решил озадачится, результатом озадачивания стало два скрипта.

  • - пробегает по указанным секциям man-страниц (где они лежат и какие секции - внутри файла, лениво было опциями делать), и конвертирует их в HTML, заодно, по некоторым патернам создаёт ссылки (типа printf(3) или ссылкки в секцию 0, для )
  • - собственно уже пробегает по этим, сгенерированным, страницам, делает файл проекта справки Qt Assistan и, по завершении, вызывает *qhelpgenerator// для создания файла справки (на самом деле это SQLite база). После чего этот файл можно подключить в Qt Assistant:

Для того, что бы к работал поиск в “Указателе”, нужно указывать ключевые слова, в данный момент, в качестве оных, используется имя самой страницы. Полнотекстовый поиск будет доступен в соответствуем месте в Qt Assistant после окончания генерации индекса. В “Содержании” добавится новый пункт “Unix man pages”.

Вот так вот примерно это дело выглядит:

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

Бонусом нам это добавляет контекстную справку по всем функциям glibc и установленных библиотек (для которых есть man-page) в Qt Creator.

Сгенерированный мною файл справки можно взять тут: http://hatred.homelinux.net/~hatred/unixman.qch.gz

UPD:

буквально сегодня в списке рассылки Qt Creator проскользнула статья: Linux Man Pages integration with Qt Creator со схожим механизмом получения справочного файла. Отличие в том, что он брал готовые man-страницы в html с http://www.kernel.org/doc/man-pages/online_pages.html

UPD2:

Там же в рассылке всплыла ссылка на галерею документации для Qt Creator: https://developer.qt.nokia.com/wiki/Qt_Creator_Documentation_Gallery

В текущем состоянии не густо, но есть C++ Reference и убогенькая, сгенерированная doxygen документация по STL, а так же рекомендацию, как при помощи Doxygen генерировать документацию для Assistant.

Aug 31, 2010 - 10 minute read - Comments - туризм

Слоны идут на север

Ещё когда топали на Ольховую, Ярослава кинула идею, что надо бы съездить на север Приморья, посетить водопад Чёрный Шаман (Большой Амгинский, высота около 30-35 метров - видимая часть и около 10-15 метров невидимая). Тогда дата была определена крайне расплывчато: а вот как нибудь в августе.

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

Но, как обычно, ближе к старту, выясняется что у большей части народа ехать не получается, с машиной непонятки и вообще, вместо пяти дней вырисовывается только два выходных + день дороги. Решаем ехать с Ярославой на её Subaru R2 до Тернея, где мы должны встретиться с местными ребятами (я тогда их имен не знал: Женя и Саша), и на их транспорте уже ехать дальше на севера.

Итак, нам нужно быть в Тернее в 17.00 в пятницу, по слухам дорога до туда занимает 14 часов, поэтому выдвигаемся в 3 ночи, запасаемся заваренным кофием в термосе.

Приключения начались почти сразу, начиная с того, что нас остановили и проверили документы на всех постах ДПС, на которых не спали доблестные служители закона :) Ну а первое плутание началось после поворота на Хороль, далее на трассе М-60, где дорожные работы ведутся - плутали в поисках поворота на А-181 (на Дальнегорск) - свернули на грунтовку какую-то, малость разули глаза и вернулись :)

С небольшими остановка на попить кофе, вставить новые спички в глаза, а под утро любуясь на движущийся прямо на нас рассвет, багровые переливы солнца в облаках, добрались до Рудной Пристани, там на повороте подобрали пожилую женщину - Шуру, попросила добросить до Каменки. Там же скоро закончился асфальт на дороге. Пока ехали разговорились, получили приглашение в гости на борщ и чай, а так как втечение 100 километров мы пытались заставить себя остановиться, перекусить, то даже не пытались препираться. Послушали разные рассказы о жизни местных поселков, чем живут. В Каменке, покушав, и поблагодарив, поехали дальше и… только выехав, обнаружили что оставили сумку с документами на машину, пришлось возвращаться. Проблема стала в том, что дома её не оказалось, посидев немного, подумав, Ярослава предлагает: Я остаюсь караулить у дома, а она на машине отправляется кататься по поселку - вдруг встретит… Через минут 20 - возвращается, встретились, забрав документы, ещё раз поблагодарив за гостеприимство, обменявшись телефонами, и получив приглашение на будущее - заезжать в гости, оправляемся дальше в путь. Действительно - будьте проще и доброжелательнее и люди к вам потянутся.

Дальше началась трясучка по грунтовке до самого Пластуна, бедный R2 (по прозвищу “Лунтик”, за специфичную форму зеркал, похожих на уши одноименного мульт-персонажа) с достоинством выдержал весь путь, ни разу не чихнув, за что ему объявляется благодарность.

Кстати, на моё удивление, почему это перед Дальнегорском перевал не закатан в асфальта, Шура поведала простой и логичный ответ: “Зимой на асфальте сильно скользко, так хоть как-то, а летом почти любой дождь просто смывает асфальт”. Вот такие пироги - век живи, век учись, дураком помрешь.

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

Вышли на связь с Женей (должен был с нами ехать), он отвечает, что сам не едет, даёт связь с Сашей (да на всей дороге одни Саши :)), с которым, собственно, на его же машине и должны были ехать дальше на север. Встречаемся, знакомимся, оказывается с ним едет ещё его девушка - Лена, и матёрый собак - Кекс :) Ну а сам пепелац - вообше зверь! Старенький SURF дизельный, да ещё за всю поездку посчитали - 8 литров на 100 км! Это зачёт, я считаю.

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

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

Таким образом перевалили через перевал Берёзовый (на картах обозначен как Таёжный), и забрались на вершину перевала Таёжный (который на карте никак не обозначен, там развилка на Амгу и Малую Кему, что примечательно, километраж до Амгу - не проставлен, мол, “а вы думаете доедете?” :)). Так вот, по местным приметам, на вершине перевала нужно остановиться и походить немного - иначе проблемы в пути будут, так что, будущие путешественники, мотайте на ус.

В первый день мы только успели спуститься с перевала Таёжный к Кеме, полюбоваться на красивые пороги и бурную реку, какие я раньше видел, пожалуй, только на фотографиях и видео. Недалеко от дороги, в небольшом закутке разбили лагерь, Я и Ярослава спали в палатке (наконец-то я её обновил самостоятельно! Оказалась компактной но вполне комфортной, индивидуальные входы вполне вмещают личный рюкзак литров в 100). Саша, Лена и Кекс спали в машине.

Распалили костер с подручных средств (жердины свежие) - дрова в ближайшем окружении уже были разобраны и на дворе уже темень и, как на зло, в фонарик не поставил свежие батарейки, и, он не мудрствуя лукаво, решил по-быстрому сесть… Пока с усилием распаливали костер, на газовой горелке сделал гречку с сервелатом, перекусили, пропустили пару (ну а кто и побольше) рюмочек водки, за дорогу, за встречу, за знакомство, за успех нашего безнадежного дела. Меня быстро начало рубить в сон - вторые сутки без сна, это не хухры мухры, полез в палатку… Проснулся только когда в палатку залазила Ярослава, точнее заползал её коврик, тыкаясь мне в лицо, моё лицо, этого терпеть не стало, и дало команду: проснись, положи коврик, спи дальше. Что было почти на полном автопилоте и проведено :)

Утром повылазили, наскреб немного дров по округе, заправились чаем, попрыгали в машину и двинулись дальше, вдоль Кемы, дальше через перевал в долину реки Большая Луговая, через Максимовку через перевал в Амгу. Там Саша закончил работу по позиционированию спутниковой тарелки, сгоняли в сам посёлок, с грустью посмотрели на “кладбище леса” (очень символично, что рядом кладбище человеческое), и отправились в обратный путь.

Первой остановкой были теплые ключи недалеко от Амгу, там особо не стали останавливаться - очередь была. Просто поснимали, и тронулись дальше. Да вода действительно теплая :)

Далее был самая главная цель нашего автопутешествия - водопад Черный Шаман, народное название, или Большой Амгинский. После Теплых ключей, перевал и после него, в скором времени отворот налево, дальше не очень хорошая, с бродами и узкая дорожка до полянки перед спуском в шикарнейший каньон. К сожалению, горе-турЫсты, которые в большинстве своём добираются туда на машинах, удосужились чертовски попортить виды выброшенным мусором - трудно на машине увезти? Или банки закопать? Ладно, боги им судьи.

С полянки достаточно крутой спуск в самый низ каньона, по спуску валяются крупные куски известняка, взял один камушек на память. В самом низу дерево, на которое вяжут ленточки и верёвочки, видать что бы вернуться, ну… мы тоже повязали :) Далее незабываемая прогулка по каньону вверх по течению: шея затекала от того что голову держал запрокинутой, обзора объектива фотоаппарата не хватало, что передать все красоты и краски… А внизу шумит прохладный ручей. В одном месте даже пришлось малость воспользоваться натянутыми веревками, дабы продвинуться ближе к Шаману, не замочив ноги, в общем даже такая малая прогулка вышла очень колоритной и впечатляющей.

Апофеозом становится неожиданное появление и самого красавца - водопада Чёрный Шаман, я даже не смог сдержать эмоций крикнув: “Дядька, ты ШИКАРЕН”!

Естественно пофотографировались, я залез под сам водопад, а после и Ярослава последовала моему примеру, вода крайне бодрящая :)

Долго задерживаться не получилось и, попрощавшись с местом, тронулись на подъем, который, как и ожидалось, оказался много легче чем спуск. Наверху нас ждал уже приготовленный рыбный суп, который быстро умяли за обе щёки и тронулись (а время уже около 21.00) на поиски дороги на источник св.Елены. В указанном месте (после моста через Максимовку) свернули налево на большую трассу, дальше, по описанию, 16 км и отворот налево… Ехали-ехали, ехали-ехали, ехали-ехали, вот уже и 16 км, поворота не видно, тут видим силуэт УАЗика (микрик), думаем, неужели на вахту лесорубов приехали. Выходим, здороваемся, задаём гениальный вопрос в тайге: “а как сопсно называется это место”. Ответ нас тоже поразил: “Источник св.Елены”. Вот так: нас не сбить с пути, нам пофигу куда идти :laughing: Как потом выяснилось поворот налево был, не такой, не совсем явный, но был, и мы по наитию в него и свернули, удача, девушка капризная, но крайне желанная :)

Решаем продвинуться дальше по дороге, и разбить лагерь, а на источник уже отправляться на следующий день и, после него, в обратный путь. Чуть только проехали местные лагеря, наблюдаем поворот налево, решаем не изменять традиции (всю дорогу самые удачные и правильные повороты у нас были налево :)) и поворачиваем туда, дорога быстро портится, а слева от нас, даже в темноте заметная, унылая картина выпиленного леса… очень удручающе действует, место так и излучает боль… Решаем не ночевать в таком месте, а возвращаться, и, опять поворачивая налево, ехать дальше, искать ручей и разбивать лагерь. Так и сделали, быстро добрались до старого лесо-склада, там же и ручей рядом и дров достаточно, поставили палатки, доели остатки супа, приготовили чаю, и долго вели беседы, любуясь полохами языков огня, журчанием ручья и тихим шорохом ночной тайги, а вокруг все в серебряном свете, ещё не полной луны…

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

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

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

Около одно из притоков Кемы, сделали привал на чай, я окунулся в глубокой заводи - шикарнейшие ощущения и красивые места.

Возле Кемы остановились на порогах, поснимали их при дневном свете.

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

В скором времени были в Тернее, с Ярославой поехали в центр - только там ловил её телефон с Мегафоном (мой акос тихо молчал до самого Дальнегорска :)), прозвонились, предупредили, что ночуем в Тернее. Дальше сгоняли на местную лодочную пристань, которая выглядит крайне колоритно.

Когда вернулись к Саше и Лене, там уже была почти готова банька. Переложили вещи, почистили от пыли рюкзаки, после помылись, поужинали и без задних ног отвалились на боковую.

На следующий день привели себя в порядок, обменялись контактами с Сашей, и в 12 часов начали наш обратный путь. Обратная дорога далась легче и быстрее, и без каких либо приключений, только изредка останавливались снимать виды. Таким темпом в 23.00 были уже на угольной, а в 00.00 Ярослава скинула, что тоже добралась до дома…

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

Aug 29, 2010 - 1 minute read - Comments - linux

Psi+ - редактирование контактов в ростере

Столкнулся с проблемой - никоим образом не получалось отредактировать контакт в ростере, хотя горячая клавиша была назначена. В конференции psi-dev@conference.jabber.ru подсказали, посмотреть, а не залочен-ли ростер, оказалось - залочен, исправлять: * Настройки -> Дополнительно * далее находим опцию: options.ui.contactlist.lockdown-roster и ставим в true

Всё!

Aug 28, 2010 - 3 minute read - Comments - programming

Гоняем структуры по сети, часть вторая

Тут уже писал про проблему пересылки/приёмки структурированных данных по сети.

На нашей целевой платформе нельзя применять сторонние библиотеки (типа libpack, как в предыдущей статье), и, так вышло (лучи ненависти), что #pragma pack() то работает, то не работает, да ещё стоит условие, что данные должны быть преобразованы к сетевому виду (ntohs(), ntohl(), htons(), htonl()), поэтому я сделал на макросах такой фит ушами:

/**************************************************************************************************/
/* Паковка и распаковка данных, для передачи по сети ---------------------------------------------*/
/**************************************************************************************************/

// Распаковка массива в структуры
/**
 Начало блока распаковки массива данных, на которые указывает <br/>c ptr и размера <br/>c size
 */
#define unpack_begin(ptr, size) { <br/>
            size_t   __addr = 0; <br/>
            size_t   __size = (size_t)(size); <br/>
            uint8_t *__ptr  = (uint8_t*)(ptr); <br/>
            union { <br/>
                uint8_t        cc[8]; <br/>
                uint16_t       ii[4]; <br/>
                uint32_t       ll[2]; <br/>
                float          ff[2]; <br/>
                double         dd;    <br/>
            } __swapd; (void)(__swapd)

/**
 Распаковка очередной порции данных в <br/>c target
 */
#define unpack_next(target) <br/>
            pack_printf("Unpack <br/>"%s<br/>"... Size: %d, current offset: %d, current size: %d<br/>n", #target, __size, __addr, sizeof(target)); <br/>
            if ((__addr + (int)sizeof(target)) <= (__size)) <br/>
            { <br/>
                memcpy(&(target), __ptr + __addr, sizeof(target)); <br/>
                __addr += sizeof(target); <br/>
            } (void)(0)

/**
 Распаковка очередной порции данных в <br/>c target, с преобразованием из сетевого вида
 Сетевое преобразование работает для простых типов размерос 2 (short), 4 (int, float)
 и 8 (lint32_tlint32_t double) байтint16_t остальных данных
 */
#define unpack_net_next(target) <br/>
            unpack_next(target); <br/>
            switch(sizeof(target)) <br/>
            { <br/>
                case 2: <br/>
                    memcpy(&__swapd.ii[0], &target, 2); <br/>
                    __swapd.ii[0] = ntohs(__swapd.ii[0]); <br/>
                    memcpy(&target, &__swapd.ii[0], 2); <br/>
                    break; <br/>
                case 4: <br/>
                    memcpy(&__swapd.ll[0], &target, 4); <br/>
                    __swapd.ll[0] = ntohl(__swapd.ll[0]); <br/>
                    memcpy(&target, &__swapd.ll[0], 4); <br/>
                    break; <br/>
                case 8: <br/>
                    memcpy(&__swapd.dd, &target, 8); <br/>
                    __swapd.ll[0] = ntohl(__swapd.ll[0]); <br/>
                    __swapd.ll[1] = ntohl(__swapd.ll[1]); <br/>
                    memcpy(&target, &__swapd.dd, 8); <br/>
                    break; <br/>
            } (void)(0)

/**
 Конец блока распаковки
 */
#define unpack_end() } (void)(0)


// Паковка данных из элементов струтуры в массив данных
/**
 Начало блока паковки данных в <br/>c ptr размером <br/>c size
 */
#define pack_begin(ptr, size) unpack_begin(ptr, size)

// Внутренний вспомогательный макрос, как общая часть для pack_next()/pack_net_next()
#define _pack_next_intr(source, data) <br/>
            printf("Pack <br/>"%s<br/>"... Size: %d, current offset: %d, current size: %d<br/>n", #source, __size, __addr, sizeof(source)); <br/>
            if ((__addr + (int)sizeof(source)) <= (__size)) <br/>
            { <br/>
                memcpy(__ptr + __addr, &(data), sizeof(source)); <br/>
                __addr += sizeof(source); <br/>
            } (void)(0)

/**
 Пакует очередной элемент
 */
#define pack_next(source) <br/>
            _pack_next_intr(source, source)

/**
 Пакует очередной элемент, преобразовывая его в сетевой вид
 */
#define pack_net_next(source) <br/>
            switch(sizeof(source)) <br/>
            { <br/>
                case 2: <br/>
                    memcpy(&__swapd.ii[0], &source, 2); <br/>
                    __swapd.ii[0] = htons(__swapd.ii[0]); <br/>
                    _pack_next_intr(source, __swapd.ii[0]); <br/>
                    break; <br/>
                case 4: <br/>
                    memcpy(&__swapd.ll[0], &source, 4); <br/>
                    __swapd.ll[0] = htonl(__swapd.ll[0]); <br/>
                    _pack_next_intr(source, __swapd.ll[0]); <br/>
                    break; <br/>
                case 8: <br/>
                    memcpy(&__swapd.dd, &source, 8); <br/>
                    __swapd.ll[0] = htonl(__swapd.ll[0]); <br/>
                    __swapd.ll[1] = htonl(__swapd.ll[1]); <br/>
                    _pack_next_intr(source, __swapd.dd); <br/>
                    break; <br/>
                default: <br/>
                    pack_next(source); <br/>
                    break; <br/>
            } (void)(0)

/**
 Конец блока паковки данных
 */
#define pack_end()            unpack_end()

Можно ещё оптимизировать, тут оверхед с переменными вспомогательными, можно без них в большинстве случаев. Ну и, кажется, не совсем корректная работа с величинами больше 4 байт (double), но на серверной машине, по-моему, вообще залепа сделана, посмотрим как работать будет :)

Пример использования для отсылки данных:

struct Data {
  short     id;
  float      d;
  long      tm;
} data;

data.id = 0;
data.d  = 73.3;
data.tm = 0xFEFD;

int n;

size_t data_size = 2 + 4 + 4; // sizeof(short) + sizeof(float) + sizeof(long) - поля структуры
char *data_ptr;

data_ptr = calloc(data_size, sizeof(char));

pack_begin(data_ptr, data_size);
  pack_net_next(data.id);
  pack_net_next(data.d);
  pack_net_next(data.tm);
pack_end();

n = send(sock, data_ptr, data_size, 0);

Пример получения данных:

struct Data {
  short     id;
  float      d;
  long      tm;
} data;

int n;

size_t data_size = 2 + 4 + 4; // sizeof(short) + sizeof(float) + sizeof(long) - сколько данных получить нужно
char *data_ptr;

data_ptr = calloc(data_size, sizeof(char));

n = recv(sock, data_ptr, data_size, 0);

unpack_begin(data_ptr, data_size);
  unpack_net_next(data.id);
  unpack_net_next(data.d);
  unpack_net_next(data.tm);
unpack_end();

// Тут структура заполнена распакованными данными

Если преобразование в сетевой вид не нужно, используйте pack/unpack_next()

Aug 27, 2010 - 1 minute read - Comments -

Пустые директории в GIT

На заметку, отсюда и отсюда, делается пустая директория /tmp:

$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp

Основной нюанс: добавить .gitignore раньше, чем вписать туда игнорировать ВСЕ файлы

Aug 27, 2010 - 1 minute read - Comments - linux

OpenSource #067

Очередной выпуск, в котором опубликована четвертая, заключительная статья из цикла “Схемотехника в Linux с помощью gEDA”: “Создание паттерна в PCB”, рассказывается как делать паттерны (футпринты) для компонентов, как обычно - в примерах.

Скачать выпуск: http://osa.samag.ru/get/OpenSource067.zip

Aug 19, 2010 - 1 minute read - Comments - linux

OpenSource #066

Вышел 66 выпуск электронного приложения к журналу “Системный администратор”, а в нем и моя третья статья из цикла “Схемотехника в Linux с помощью gEDA”, в которой рассмотрено создание условного обозначения компонент для gschem. Так же сделано небольшое отступление и рассказано о интеграции gschem и pcb при помощи менеджера проектов xgschm2pcb. В общем качаем и читаем: http://osa.samag.ru/get/OpenSource066.zip

Aug 9, 2010 - 2 minute read - Comments - programming

Гоняем структуры по сети

Вспоминаем о выравнивании (не говорю о том, что числовые поля нужно привести в сетевой вид, дабы на удаленной стороне была уже произведена корректная распаковка данных: man 3 htons/ntohs, man 3 htonl/htohl, man 3 endian), чешем репу - а если приёмная сторона использует другое выравнивание, нежели у нас при сборке бинарника?((по рабоче-крестьянски: на типичной 32бит машине все переменные выравнены по 32битной длинне))

Вижу варианты: * пихать все в char-буффер - некрасиво * поэлементно отправлять - неудобно и некрасиво * использовать #pragma pack() - удобно, красиво, но не супер переносимо * использовать систему атрибутов GCC - не переносимо

Посмотрим на использование #pragma pack(), конкретно посмотреть подробности на официальной странице: http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

При объявлении структуры, которая будет гоняться по сети рекомендуется отключить выравнивание:

#pragma pack(push,1)
....
#pragma pack(pop)

Простой пример:

#include <stdio.h>

#pragma pack(push,1)
struct test_packed {
  char ch;
  long data;
};
#pragma pack(pop)

struct test_unpacked {
  char ch;
  long data;
};

int main()
{
  printf("Packed size: %d, Unpacked size: %d<br/>n",
         sizeof(struct test_packed),
         sizeof(struct test_unpacked));
  return 0;
}

Компилируем и выполняем:

$ gcc -o main main.c && ./main
Packed size: 5, Unpacked size: 8

Всё наглядно :)

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

UPD: тут 864110|#864110 подкинули ещё ссылку: http://www.leonerd.org.uk/code/libpack/

PS по слухам появилось в 2.95.2 или около того.

Aug 9, 2010 - 2 minute read - Comments - programming c++

Мой "C/C++ Coding Style" версия 1.1 + Astyle

Подправил малость стандарт кодирования для своих проектов, из изменений:

  • Для функций, в которых производятся действия по инициализации допускается использовать префикс init (сокращенный вариант initialize)
  • Убрана жесткая рекомендация по использованию 0 вместо NULL в C++
  • Добавлена рекомендация использовать calloc вместо malloc в C
  • Добавлена рекомендация добавлять пробел после ключевого слова языка и открывающей скобкой
  • Рекомендация не использовать одиночные блоки if, while, for и т.п.
  • Добавлена рекомендация по использованию astyle с учетом стандартов перечисленных здесь.

Более подробно про Astyle.

Сама программа является достаточно мощным форматировщиком кода, причем с приятной документацией (для почти всегда достаточно простого astyle –help).

Моя команда astyle выглядит так:

astyle --style=ansi --indent=spaces=4 <br/>
          --indent-classes --indent-switches --indent-preprocessor --indent-col1-comments <br/>
          --max-instatement-indent=24 --min-conditional-indent=4 <br/>
          --pad-oper --pad-header --unpad-paren --add-brackets <br/>
          --convert-tabs --align-pointer=name <br/>
          <source_file_name> 

По опциям пробежимся (за подробностями в astyle --help):

  • --style=ansi - базовый стиль форматирования, что бы на каждый чих установки не делать
  • --indent=spaces=4 - выравнивание пробелами, использовать 4 оных
  • --indent-classes - делать отступ для protected:, private: и т.д.
  • --indent-switches - делать отступ у case внутри switch
  • --indent-preprocessor - отступ у многострочных макроопределений
  • --indent-col1-comments - делать отступ однострочным комментариям (???)
  • --max-instatement-indent=24 - при разбивке выражения на строки, следующая строка обычно выравнивается по предыдущей, в частности, по открывающей скобке. Это опция ограничивает максимальный отступ в 24 символа
  • --min-conditional-indent=4 - ??? задал по аналогии :)
  • --pad-oper - делает отступы вокруг операторов, после запятых, точек с запятой, если просто - делает более удобочитаемыми математические выражения
  • --pad-header - делает отступы после ключевых слов языка и перед открывающимися скобками (у if, while, for и т.д.)
  • --unpad-paren - а вот ненужые удаляет (типа после функции), можно использовать только когда нужно
  • --add-brackets - обрамляет однострочные блоки в фигурные скобки
  • --convert-tabs - преобразует табуляцию в пробелы (эквивалентное количество, задано выше)
  • --align-pointer=name сдвигает *, & в определении к имени переменной, т.е. преобразует char* ptr или char * ptr -> char *ptr

Aug 8, 2010 - 1 minute read - Comments - linux

OpenOffice: не получается отредактировать содержимое (Readonly content cannot be changed)

В случае когда включен режим редактирования файла (кнопка на панели “Edit file” нажата), права доступа к файлу разрешают доступ и в директории можно создавать/удалять файлы, всяких ACL и selinux при этом не используется. В свойствах файла пароля на редактирования не стояло.

При всех этих условиях, меня ввело в замешательство сообщение, при попытке отредактировать файл:

Оказалось (для меня): в OpenOffice можно блокировать отдельные секции для редактирования, поэтому бредем в Format -> Sections и наблюдаем такую картину:

Обращаем внимание на раздел “Write protection” и снимаем отметку “Protected” для всех нужных нам секций.

PS для русской версии OpenOffice, я думаю, сами разберетесь.

Aug 7, 2010 - 1 minute read - Comments - life

Дачи президента не будет на п-ове Гамова?

По радио (Приморское радио) сообщили, что строительства резиденции президента на п-ове Гамова ни сейчас ни когда либо в будущем не будет (в т.ч. таки запросили экспертную оценку у ДВО РАН).

В интернетах подтверждения найти не могу пока, видать такие новости “неформат”, но если это так, то мне очень приятно.

Aug 4, 2010 - 1 minute read - Comments -

Конкурс "Системный администратор 2010"

Заполучил статус “ГУРУ”, но… с моей удачей, в розыгрыш не попал, не получил ни кружки ни футболки, только сертификат…

По странице правильных ответов у меня все 19 ответов верные (про творческие вопросы 20 и 21 там ничего нет, если только они в оценке как-то учавствовали, но я хз)

В общем, такие дела :) хотя конкурс туфтовый конечно.

Aug 4, 2010 - 15 minute read - Comments - туризм

Вот приехали мы на Путятин... (с)

Кто в теме, по поводу заголовка, - бурные продолжительные аплодисменты стоя :)

На конец июня - начало августа (07.30—08.1,2) сестренка провела агитационную работу: нужно ехать на о.Путятина, какая бы погода не была. Зная, что у меня наступила, малость, черная полоса во всяких начинаниях, до последнего никому не сообщал об окончательной идее поездки, не смотрел на прогноз погоды: дабы не сглазить.

о.Путятина, краткая историческая и географическая справка

Этот остров получил своё название в честь адмирала Путятина Е.В., возглавившего в октябре 1852 года первую русскую экспедицию из Кронштадта к берегам Японии. В состав экспедиции вошли фрегат “Паллада” и шхуна “Восток”, а целью похода было заключение дипломатических и торговых отношений России с Японией.

Остров Путятина расположен южнее города Фокино, недалеко от поселка Дунай. От материка остров отделяет четырехкилометровый пролив с постоянным прибрежным течением. Протяженность острова составляет 14 км при максимальной ширине 5 км и минимальной 1 км. В самой низменной, заболоченной области острова, почти на километровом пространстве, раскинулось озеро Гусиное.

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

На берегу бухты Назимова расположен поселок Путятин, основанный русским предпринимателем Старцевым, именем которого названа самая высокая гора острова. Его усилиями на острове были заложены обширные фруктовые сады, построен кирпичный завод, проложена железная дорога на конной тяге, велось активное строительство. Благодаря обширным торговым связям не только на внутреннем, но и на внешнем рынке, остров за несколько лет несказанно преобразился. До наших дней сохранились постройки тех лет, одичавшие потомки его фруктовых деревьев и добрая память в устных преданиях “аборигенов”. С чувством глубокой признательности неутомимому труженику на живописной сопке, неподалеку от поселка, был установлен бюст этому замечательному человеку.

На острове Путятина и вблизи него находятся 3 из 5 памятников природы. В первую очередь - это озеро Гусиное — естественный обширный водоем с пресной водой и несколькими плантациями чудесного лотоса, высоко чтимого в восточных странах.

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

На острове Путятина и вблизи него существует большое количество необычных объектов: скала Ирецкого, подводный грот у мыса Шулепникова, пещера, скалы Петух и Слон т.д. Развитие рекреационного комплекса городского округа позволит обеспечивать потребности российских и иностранных граждан в разнообразных туристических услугах.

На территории городского округа выявлено 3 месторождения полезных ископаемых с эксплуатационными запасами 6212,57 тыс.м3: «Морское» - производственная мощность по добыче строительного камня – 24,0 тыс.м3/год, диоритовых порфиритов – от 6 до 40 тыс.м3/год. «Тихоокеанское» - производственная мощность по добыче алевролитов 3,0 тыс.м3, аргиллитов – 3,0 тыс.м3; «Прибойное» – производственная мощность по добыче песка – 1,0 тыс.м3.

И вот четверг, дальше уже тянуть нельзя. Звоню Серёге, сообщаю, что едем на три дня, в не зависимости от погоды. Есть машина и 1 свободное место (не совсем, но при желании - впихнулись бы :)), но отъезд с угольной в 5 утра (дабы успеть на 9ти часовой паром и не терять полностью первый день), так что приезжай с ночевой в пятницу вечером… Пауза, решили окончательно созвониться в пятницу, где в итоге и получилось, что едем на двух машинах в количестве 6ти человек: Я, сестренка (Надя), Катя, Серёга, Таня, Жанна.

Первый экипаж, в составе: Серёга, Таня, Жанна, запланировал ехать в пятницу вечером, узнать о проблемах в пути (типа разрешения и т.п.((К слову сказать, теперь никаких разрешений не нужно (узнали в кассе парома), стоимость машины 1875 рублей с водителем, за пассажиров по 75 рублей с верху, для туристов проезд 75 рублей, дети до 7 лет бесплатно, ходят дополнительные коммерческие рейсы для машин, стоимость, вроде, 7500, раскидывается по количеству машин. Основное расписание будет в фотографиях, хотя оно и не поменялось с прошлого года))).

Ранним субботним утром произошла “встреча на Эльбе”: перезнакомились, кто не был знаком друг с другом, Надя с Серёгой поехали ставить машины на единственную стоянку в Дунае (после автостанции смотрим по левой стороне, почти перед самым съездом на грунтовку в сторону переправы). Я тем временем разогрел воды на кофей - устроить подобие завтрака. После произвели ревизию возможностей рюкзаков Тани и Жанны (ну… несколько они не соответствовали туристским понятиям :)), в результате, по крайней мере палатка (при помощи веревки и такой-то матери) была прикреплена к рюкзаку.

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

И вот долгожданная баржа, неторопясь грузимся, по обычаю залазим на корму, хоть и крапает дождик. 20 минут пути и мы на острове. На подходе дождь почти прекращается, что не могло не порадовать.

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

По дороге топаем, болтаем, я напеваю известный мне репертуар песенок, получается как обычно, но и оперные певцы на ходу, с рюкзаком за спиной, обычно не поют :) В результате ловко и незаметно пролетает почти вся дорога, и становится ребром финальный вопрос: идем на песчаный пляж или на каменный, мнения разделяются на две равные части, но в результате приходим к консенсусу - не понравится на каменном пляже, идем на песчаный…

И тут оказалось, что я просто плохой дипломат, достаточно было сказать - идем на пляж с крупным песком :) Хотя я пляжи по дну обычно оцениваю, ну да ладно, мотаем на ус, не пугаем человеков в следующий раз. Радость всех поднял и тот факт, что на пляже больше никого не было! Однако досталось и немного огорчения: ладно мусор намытый прибоем (хотя тоже дикость), но на стоянках же за собой убрать можно, не так тяжело тащить упакованный в мешки мусор, все равно он весит много легче того, что вы тащили сюда… Но это так, крик в пустоту, оставленные литровые бутылки водки много объясняют.

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

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

Пока она его доделывала, с Серёгой натаскали ещё камней покрупнее, одно бревнышко, поставили колья и натянули тент - импровизированная кухня-столовая-укрытие от солнца, а ещё и место ночлега для особо оторванных (Меня в первую ночь и меня и Тани во вторую), получилось на славу.

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

Тем временем меня чего-то опять начало малость тянуть в сон, это моё желание совпало с общественным: “Залезть в одну палатку, болтать и играть в игры”, я решил не поддерживать сообщество и забраться поспать. Сна как такового не вышло, поэтому выдавал через стенку свои комментарии по поводу игры “Контакт”.

Когда же игровой запал стал сходить на нет, туда же стал сходить и мой сон. Решил выбраться подышать воздухом… И сразу схватил такую зуботряску, какой давно не помню, тем не менее, малость одевшись, быстро пришёл в себя, решил вытаскивать пенку и спальник - спать под тентом. Народ тем временем расползался по своим спальным местам. Я же сходил помочил ноги в море, в большую кружку залил воды и засыпал туда полуспелого шиповника, устроить себе ночное (уже) чаепитие. Пока отвар готовился сон опять решил посетить мою голову, в результате, дождавшись полной готовности, отрубил газ и залег спать…

А дождик то пытался идти, то прекращал…

А комаров оказалось уйма и злющие все, как некормленые…

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

о.Аскольд, краткая историческая и георгафическая справка

Остров Аскольд административно относиться к городскому округу ЗАТО город Фокино. Отделен от материка и от соседнего острова Путятина одноименным проливом.Остров был известен еще морякам государства Бохай. Позднее его посещали китайские золотоискатели и добытчики морской капусты. В 1859 году остров исследовали и описали моряки клипера «Стрелок», давшие ему имя Маячный. В 1862 году полковником Бабкиным, остров был переименован в Аскольд, в честь одного из первых русских винтовых фрегатов «Аскольд».Постоянного населения нет, кроме смотрителей маяков и работников метеостанции.

История

Остров был известен еще морякам государства Бохай. Много раз суда с бохайскими послами проплывали мимо него в Японию. Его прекрасно знали китайские золотоискатели и добытчики морской капусты. У первых он носил называние Лефу, что можно перевести как Добычливый, вторые называли его Циндао, что означает — Зелёный остров. В 1859 г. моряки русского клипера «Стрелок», первыми начавшие описывать эти берега, назвали его Маячный, считая, что остров самой природой создан для этого. Соседний, расположенный севернее, получил имя графа Путятина.

Проливу, разделяющему острова, дали имя одного из первых русских винтовых фрегатов «Аскольд». Почти посредине пролива расположился островок из подводных и надводных скал. Самая высокая достигает 40 м. Они носят название камни Унковского. Скалы представляют большую навигационную опасность, и потому об их существовании моряков предупреждают два светящих навигационных знака.

Проводившая в 1862—63 гг. более подробное гидрографическое описание залива экспедиция подполковника Бабкина, посчитав, что название острова Маячный может ввести мореплавателей в заблуждение, дала ему название по проливу. С того времени он и носит имя варяжского князя Аскольда. В 1892 г. командование крепости Владивосток решило создать на острове постоянный наблюдательный пост, связав его со штабом телеграфной линией. Но главной задачей, которую поставил штаб крепости перед аскольдовцами, было наблюдение за попытками японцев поставить перед проливом Босфор Восточный минные заграждения.

Туманы, постоянно закрывающие подходы к нему, закрывали видимость наблюдателям крепости. Своей выгнутой стороной остров обращен к северу, а южная сторона, обращенная к морю, образует бухту которая носит имя клипера «Наездник». На ее берегу расположен приисковый поселок, построенный еще в 1876 г. золотопромышленником Кустером. Позднее, на сопке появилась метеостанция. И девушкам-гидронаблюдателям приходилось четыре раза в день совершать прогулки по лестнице. Триста метров вниз, триста метров вверх. Для защиты острова от высадки десанта было сооружено несколько дотов. Но это считалось маловероятным, так как все водное пространство перед ним обстреливала «Ворошиловская батарея».

Природа

В конце 19 века на должность управляющего прииском на острове Аскольд владелец пригласил польского ссыльнопоселенца Михаила Янковского. Кроме выполнения прямых обязанностей Янковский занялся разведением на острове пятнистых оленей. Стадо прекрасно акклиматизировалось и быстро увеличилось. В 1888 г. право на охоту на них было передано Владивостокскому обществу любителей охоты, с обязанностью заботы о воспроизведении стада. За 10 лет количество оленей выросло с 800 до 3000 голов, и очень долго Аскольд оставался единственным в мире питомником пятнистых оленей.

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

А небо тем временем становилось всё яснее и яснее, а море все более располагало залезть в него…

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

После последнего подъема на полянке сделали привальчик, далее последний аккорд и мы в лагере. А там нас уже поджидает приготовленный сайровый супчик и чай, а Серёга ещё дровишек подтянул. Дальше такая же размеренная пляжная жизнь, единственно, Надя пособирала мусор по пляжу, да снесла в одно место.

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

А кто-то просто любовался видами и светился от счастья.

Со временем все же малость промазали - взяли большой запас, день сейчас ещё длинный, так что, как начало холодать, остались трое самых стойких: Я, Таня, Жанна.

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

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

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

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

А вокруг уже была ночь.

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

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

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

А утро было сонное: проснулся достаточно рано, но вот открывать глаза и, тем более, вылазить из-под спальника организм крайне не хотел. Он даже на 100% не смог уговориться на это когда проснулась и вылезла из палатки Жанна. Но усилием воли таки поднял :) Ну и весь остальной лагерь начал показывать носы из палаток. Серёга, как самый морж, начал день с заплыва, я побрел собирать и мыть посуду, каждый занялся своим кемпинговым делом (загорать и вялится тоже дело на кемпинге, пока оно не причиняет никому неудобств :)).

Солнышко уже начинало кочегарить (хорошая смена кочегаров попалась, да) вовсю…

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

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

А время близится к моменту когда нужно собираться и топать на плашкоут… А так не хочется!

Тем не менее собираемся, отправление намечаем на 15.30 (время до переправы 2 часа, так, с запасиком). Оставляю до последнего тент, но когда одно из креплений срывает несильным порывом ветра (а простоял без приключений с первого дня), решаем что это знак и окончательно сворачиваемся.

На лагерь приятно посмотреть - не оставили ни одной соринки, люди человеки, поступайте так же!

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

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

PS правки и дополнения по ходу всплытия в воспоминаниях, первая пачка фото (в том числе и низкого качества): http://hatred.homelinux.net/~hatred/foto/2010.07.30-08.1,2_Putyatin.rar

PPS фото от Серёги: http://picasaweb.google.com/skoulik/iccwLF02