Hatred's Log Place

DON'T PANIC!

Sep 16, 2010 - 1 minute read - Comments - linux туризм maps

OpenSource #068

А в нем и моя очередная статья “QLandKarte GT как замена OziExplorer в GNU/Linux” (название откорректировано редактором, но не суть). Рассматривается вопрос использования данных, подготовленных для использования в OziExplorer (или созданных ими), коих на просторах интернетов премножество, в среде Linux, на примере QLandKarte GT.

Скачать: http://osa.samag.ru/get/OpenSource068.zip

Sep 15, 2010 - 2 minute read - Comments - life

WebMoney и Альфа Банк

Стоимость (полная) перевода WM -> Alfa-click - 2.8%, обратно - 1%

Привязка осуществляется через Альфа-Клик, предварительно в WM нужно получить формальный аттестат (http://passport.webmoney.ru), после чего нужно в секции “Мои документы” закачать сканы или снимки: * разворота паспорта с фотографией * разворота паспорта с пропиской * ИНН

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

Если возникнут проблемы, можно спросить в этой теме: Привязка к Альфа-банку.

Из вышеуказанной темы, уверяют, что для сверки используется информация о номере паспорта и ФИО, так что следите, что бы они были корректными (я, при заполнении анкеты в банке, нашел несколько, в т.ч. в имени, так что будьте бдительны).

Несколько ссылок: * http://webmoney.ru - сами вебмани * http://click.alfabank.ru - интернет банк Альфа-Клик * http://banks.webmoney.ru - отсюда, собственно производится операция по выводу денег в банки, после оформления, в Кипере получите счет, который оплатите (с комиссией 0.8%) и получите деньги на карточку. * http://passport.webmoney.ru - тут управляете своим сертификатом, получаете новый * http://forum.webmoney.ru - форумы, задаём вопросы. * http://alfabank.ru/retail/internet/webmoney/ - информация из первых рук о переводах WM-Alfa

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

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, я думаю, сами разберетесь.