boost::any изнутри

boost::any позволяет хранить переменные различных типов без явного указания типа, например так:

view plainprint?
double dl = 1.2; 
std::string str = "aa"; 
 
boost::any a = dl; 
boost::any b = str; 
boost::any c = 232; 
 
std::vector<boost::any> v; 
// v.push_back("dddd"); так поступать нельзя 
v.push_back(std::string("dddd")); 
v.push_back(45.23); 
v.push_back(4); 
 
for(unsigned i=0;i < v.size();i++) 
   std::cout << v[i].type().name() << std::endl; 

В том, что boost::any позволяет создавать вектор "зоопарка-элементов" нет ничего удивительного. Реализация этого класса предельна проста - он просто напросто хранит указатель на класс-холдер конкретного типа. Самое примечательное, что есть в boost::any - это шаблонный конструктор и шаблонный оператор присваивания:

view plainprint?
class any 

public: 
   //... 
   template<typename ValueType> 
   any(const ValueType& value) 
     : content(new holder<ValueType>(value)) 
     // holder<ValueType> - реализация хранителя для конкретного типа 
   {} 
   //... 
   template<typename ValueType> 
   any& operator=(const ValueType& rhs) 
   { 
      any(rhs).swap(*this); 
      return *this; 
   } 
   //... 
   private: 
      // интерфейсный классс для хранителя 
      placeholder * content; 
}; 

Сразу же надо уточнить, что шаблонный конструктор и шаблонный оператор присваивания не могут быть конструктором копирования и оператором присваивания (их нужно определять отдельно). Эти шаблонные методы позволяют производить присваивание и инициализацию объекта класса boost::any без явного указания типа. Такой подход очень удобен и применяется в stl-контейнерах и различных smart-pointer'ах. Есть даже такая идеома - Coercion by Member Template.

Тип содержимого указывается только при получения значения из контейнера типа. Для этого boost предоставляет шаблонную функцию boost::any_cast, которая сранивает желаемый и реальный типы на основании std::type_info, и в зависимости от результата либо получает конкретное значение у холдера, используя static_cast, либо бросает исключение.

Вот так вот просто и красиво решается задача хранения значений различного типа в одном контейнере.

ЗЫ: забыл как пишется изнутри, вместе или раздельно... :)

 

Читать далее »

  • OLTP первые проблемы
  • Интересная штука- индексируемые свойства С# и Pascal(Delphi)
  • Внешне указатели, сокеты внутри
  • PasDoc, ROBODoc, DocBook. Документирование кода в Delphi

    Некоторое время назад передо мной стоял выбор средства документирования исходных текстов на Dephi.

    Документировать код во внешних файлах весьма трудоемкая задача. Вопрос синхронизации кода и документации весьма важен и потому средства типа MS Word, OpenOffice.org и даже Help & Manual не подходят однозначно.

    Программисты Java имеют хорошую утилиту javadoc, позволяющую генерировать документацию прямо по вставленным в код комментариям особого формата. Существует такой аналог и для Delphi: pasdoc
    ROBOdoc - еще одна подобная утилита, но этот вариант я отбросил сразу из-за неоправданно усложненного синтаксиса и слишком большей расхожести с javadoc. Да и общая ориентация утилиты несколько отталкивала. Немаловажным фактором являлось и то, что языком написания был C, а значит могли быть трудности с пониманием работы и исправлением ошибок.

    Pasdoc – это OpenSource программное обеспечение распространяемое под GNU Public license. Тоесть вы можете делать с программой и кодом все, что угодно, кроме присвоения авторских прав ;-)

    Долгое время pasdoc'у вменяли в вину то, что он не способен генерировать формат DocBook. Собственно DocBook не являться конечным форматом документации и в чистом виде не используется.
    DocBooc - SGML или XML (проще говоря — популярный набор тегов), предназначенное для разметки документов, такое же, как HTML для разметки веб-документов. (C) Wikipedia
    DocBook – интересен тем, что позволяет вести единый файл документации и получать документы или их части в различных форматах: html, pdf, WinHelp, CHM.
    На самом деле, это неправда. Вернее, полуправда :-) Написание документации в этом формате занятие весьма утомительное без специальных средств предоставляющих сервис: форматирования исходного кода, проверки синтаксиса, проверки правописания и тому подобного.

    «В чем сила, брат ...?» (С) Брат 2. ... «А сила она в XML...» (C) ХЗ
    Сила DocBook'а в XSL схемах которые поддерживаться сообществом и являться инструкциями для процессоров преобразующих XML файл в другой тестовый файл.

    Судите сами.
    HTML: DocBook > XSL схема > процессор > HTML
    WinHelp: DocBook > XSL схема > процессор > файлы проекта для MS HelpWorckshop> MS HelpWorckshop компилятор>HLP
    PDF: DocBook > XSL схема > процессор > XSL-FO>Форматировщик (Apache FOP, XEP etc.)>PDF

    Ключевым звеном являются набор схем, которые только подготавливают необходимые входные файлы. Тоесть, теоретически можно написать схему которая бы на выходе дала исходные коды приложения на Dephi и сразу же скомпилировать утилиту показывающую справку как приложение %-)

    Почему я решил написать статью.
    PasDoc объявил о поддержке формата SimpleXML!
    Для «тех кто в танке», прошу прощения, поясню. На выходе утилита выдаст структурированный XML вашего кода. А теперь вернемся на пару строк вверх и в схему вместо DocBook поставим SimpleXML. Что получим ? Ну практически ничего, потому как DocBook XSLStylesheet ничего не знают о SimpleXML.
    Поскольку я математик, то вспоминается:
    Физику и математику ставится задача: написать алгоритм кипячения воды в чайнике на газовой плите.
    Ответ одинаковый у обоих: Налить воду, зажечь огонь, поставить на него чайник и ждать.
    Теперь усложним задачу: в чайнике уже есть вода.
    Физик: зажечь огонь, поставить на него чайник и ждать.
    Математик: вылить воду, задача сводиться к предыдущей.

    Получаем: SimpleXML>XSL-SimpleXML2DocBook> Processor>DocBook –> а для DocBook задача у на уже решена.
    Упреждая вопросы: почему не pasdoc > DocBook, отвечаю, что не DocBook это довольно мощная и развитая система и не всякому проекту подходит по масштабам. Потому гораздо эффективней иметь «сырой» XML и уже из него получать форматирование DocBook.

    Существует и второй метод решения задачи. SimpleXML2>XSLMyStyleSheet>...
    Создать собственные схемы преобразования. Может быть и трудоемко, но получим возможность конвертировать прямо в формат внутреннего Wiki например.
    IMHO написать свои схемы проще чем изучить теги DocBook.

    Для тех, кто все таки дочитал до этой строки скажу, что SimpleXML не доступен в версии 0.10.0 и необходимо взять сборку с SVN. SimpleXML еще не совсем доработан. Для простоты показа примеров выкладываю скомпилированную мною версию и включаю ее в архив.

    Архив содержит пример преобразования извлеченного из pas файла xml в html. Используется java-based процессор Saxon и Apache Ant. Потому приодеться установить Java.
    Можно поспорить в выборе процессора. Существует XSLProc, он чуть быстрее, но и слабее потому, что не поддерживает XSL 2.0

    Почему я выбрал Saxon, потому, что он пока единственный, кто поддерживает XSL 2.0, хотя я могу и ошибаться. К тому же он прекрасно интегрируется c Ant, а почему я выбираю Ant читайте тут(ссылка на статью в блоге).

    Призываю энтузиастов владеющих XSL присоединяться разработке схем для других форматов :-)

    З.Ы. Фактически pasdoc может выбросить все форматы и оставить только xml %-) Тоесть оставить только функции извлечения данных из исходных текстов Delphi.
    Задача трансформации в другие форматы у нас уже решена ... :-)

    З.Ы. З.Ы Будучи на разработчиком Delphi CodeGear (Borland) я бы не изобретал системы справки, а просто внедрил pasdoc и генерировал бы справку на лету в отдельном окне прямо в IDE как это реализовано в Lazarus.

    Ссылки:
    Пример к статье

    http://pasdoc.sipsolutions.net/
    http://www.xs4all.nl/~rfsber/Robo/robodoc.html
    http://docbook.sourceforge.net/
    Автодокументация исходников посредством PasDoc

    Copyright 2007 Roman V. Babenko http://romanvbabenko.blogspot.com, http://devrona.com

  • Генераторы кода
  • Пригодятся каждому Delphi проекту
  • Метрики ООП проектирования
  • Требования к ПО - аналитик

    по Вигерсу

    Аналитик требований — это основное лицо, отвечающее за сбор, анализ, документирование и проверку требование к проекту. Это основной коммуникативный канал между группой клиентов и командой разработчиков.

    Определить бизнес-требования. «Зачем мы начинаем этот проект?»

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

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

    интервью;
    семинары;
    анализ документов;
    опросы;
    посещение рабочих мест клиентов;
    анализ бизнес-процессов;
    анализ документооборота и задач;
    списки событий;
    анализ конкурирующих продуктов;
    исследование существующих систем;
    ретроспективы развития предыдущего проекта.
    Анализировать требования. Ищите производные требования, логически проистекающие из запросов клиентов, а также невысказанные ожидания, которые, как считают клиенты, и так будут реализованы. Сразу же проясните неясные и неубедительные слова, порождающее двусмысленность. Выявите конфликтующие требования и области, требующие подробной детализации. Определите функциональные требования с такой степенью подробности, которая необходима разработчикам.

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

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

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

    Обеспечить расстановку приоритетов требований. Аналитик обеспечивает общение и взаимодействие различных классов пользователей с разработчиками, что позволяет расставить приоритеты.

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

    Необходимые навыки

    умения слушать, задавать вопросы, навыки анализа, создавать комфортные условия общения, наблюдательность, межличностное общение

    Навыки написания документации. Основной итог процесса создания требований — письменная спецификация с информацией для клиентов, отдела маркетинга и технического персонала. Аналитик должен отлично владеть языком и ясно выражать сложные идеи.

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

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

    Творческий подход. Аналитик — не просто клерк, записывающий все высказывания клиентов. Лучшие аналитики изобретают требования (Robertson, 2002). Они предлагают инновационные функции продуктов, новые рыночные возможности и возможности для бизнеса и думают, как удивить и удовлетворить своих клиентов.

    Читать далее »

  • Требования к ПО - определения
  • Адаптивное планирование
  • Эпоха систем, терпимых к изменениям
  • Интеграция VPN-сервера mpd4 с доменом на базе Samba 3 при посредничестве freeradius

    Последовательность действий:

    Пропатчить исходники и собрать новое ядро FreeBSD.
    Установить и настроить в отдельной клетке (jail) samba как члена домена.
    Установить в той же клетке freeradius и настроить на взаимодействие с локальным samba.
    Установить в основной системе mpd4 и настроить авторизацию посредством ранее установленного freeradius.
    Проверка работоспособности.
    Бонус.

    1. Сборка ядра FreeBSD.
    1.1. В моем случае ядро было собрано с приведенными ниже опциями
    options         NETGRAPH

    options         NETGRAPH_ETHER

    options         NETGRAPH_NETFLOW

    options         NETGRAPH_SOCKET

    options         NETGRAPH_TEE

    options         NETGRAPH_MPPC_ENCRYPTION

    options         NETGRAPH_MPPC_COMPRESSION

    options         NETGRAPH_BPF

    options         NETGRAPH_IFACE

    options         NETGRAPH_KSOCKET

    options         NETGRAPH_PPP

    options         NETGRAPH_PPTPGRE

    options         NETGRAPH_TCPMSS

    options         NETGRAPH_VJC

    options         NETGRAPH_ONE2MANY

    options         NETGRAPH_RFC1490

    options         NETGRAPH_TTY

    options         NETGRAPH_UI

    1.2. Перед сборкой ядро следует пропатчить, чтобы задействовать сжатие данных (опция NETGRAPH_MPPC_COMPRESSION).
    Патч без проблем ложится на исходники ядра версий 6.x и 7.0-RC3 (патч лежит тут: http://www.mavhome.dp.ua/MPPC/).
    Краткая инструкция по сборке:
    1.2.1. Скачать архив и распаковать его содержимое в /usr/src/sys/net.
    1.2.2. Изменить директорию на /usr/src/sys/modules/netgraph/mppc.
    1.2.3. В Makefile изменить линию
        NETGRAPH_MPPC_COMPRESSION?=     0

    на
        NETGRAPH_MPPC_COMPRESSION?=     1

    1.2.4. Перейти в директорию /usr/src и запустить компиляцию ядра
    # make kernel KERNCONF=YOUR-KERNEL

    1.2.5. После успешной компиляции и установки перезагрузить систему
    # shutdown -r now

    2. Установка Samba 3 (на момент установки версия: samba-3.0.26a_1,1).
    2.2. Создаем отдельную клетку и устанавливаем туда Samba 3 из портов.
    2.3. Конфигурационный файл smb.conf
    [global]

           dos charset = cp866

           unix charset = koi8-r

           display charset = koi8-r

           workgroup = CMYK

           server string = Samba Server

           interfaces = SELF-INTERFACE-IP/24

           bind interfaces only = Yes

           security = DOMAIN

           auth methods = winbind

           password server = PDC-SERVER-NAME

           log file = /var/log/samba/log.%m

           max log size = 50000

           load printers = No

           show add printer wizard = No

           dns proxy = No

           wins proxy = Yes

           wins server = PDC-SERVER-IP

           idmap uid = 10000-20000

           idmap gid = 10000-20000

           winbind enum users = Yes

           winbind enum groups = Yes

           winbind use default domain = Yes

           winbind refresh tickets = Yes

           hosts allow = 192.168.0.

           case sensitive = No

           hide unreadable = Yes

    2.4. Редактируем файл /etc/nsswitch.conf
    passwd: files winbind

    group: files winbind

    2.5. Вводим samba в домен.
    # net rpc join -S PDC-SERVER-NAME -I PDC-SERVER-IP -U Administrator%password

    2.6. В файл /etc/rc.conf добавляем: winbindd_enable="YES"

    3. Устанавливаем freeradius из портов (версия: freeradius-1.1.7_2).
    3.1. Настраиваем freeradius. В /usr/local/etc/raddb редактируем конфиги:
    3.1.1. radiusd.conf
    prefix = /usr/local

    exec_prefix = ${prefix}

    sysconfdir = ${prefix}/etc

    localstatedir = /var

    sbindir = ${exec_prefix}/sbin

    logdir = /var/log

    raddbdir = ${sysconfdir}/raddb

    radacctdir = ${logdir}/radacct

    confdir = ${raddbdir}

    run_dir = ${localstatedir}/run/radiusd

    log_file = ${logdir}/radius.log

    libdir = ${exec_prefix}/lib

    pidfile = ${run_dir}/radiusd.pid

    # user = nobody

    # group = nobody

    max_request_time = 30

    delete_blocked_requests = no

    cleanup_delay = 5

    max_requests = 1024
    listen {

           ipaddr = SELF-INTERFACE-IP

           port = 0

           type = auth

    }
    hostname_lookups = no

    allow_core_dumps = no

    regular_expressions = yes

    extended_expressions = yes

    log_stripped_names = no

    log_auth = yes

    log_auth_badpass = yes

    log_auth_goodpass = yes

    usercollide = no

    lower_user = no

    lower_pass = no

    nospace_user = no

    nospace_pass = no

    checkrad = ${sbindir}/checkrad
    security {

           max_attributes = 200

           reject_delay = 1

           status_server = no

    }
    proxy_requests = no

    $INCLUDE ${confdir}/clients.conf

    snmp = no

    $INCLUDE ${confdir}/snmp.conf
    thread pool {

           start_servers = 5

           max_servers = 32

           min_spare_servers = 3

           max_spare_servers = 10

           max_requests_per_server = 0

    }
    modules {

           pap {

                   encryption_scheme = crypt

           }
           chap {

                   authtype = CHAP

           }
           pam {

                   pam_auth = radiusd

           }
           unix {

                   cache = no

                   cache_reload = 600

                   radwtmp = ${logdir}/radwtmp

           }
           $INCLUDE ${confdir}/eap.conf
           mschap {

                   authtype = MS-CHAP

                   use_mppe = yes

                   require_encryption = yes

                   require_strong = yes

                   with_ntdomain_hack = yes

                   # Так как требовалось  предоставлять доступ

                   # только  отдельным пользователям домена, я

                   # создал группу "Remote Access Users" и ука-

                   # зал SID созданной группы в параметре

                   # --require-membership-of=SID-or-Name

                   ntlm_auth  = "/usr/local/bin/ntlm_auth --require-membership-of=S-1-5-21-952150225-1155300134-1448941184-21001 --request-nt-key --username=%{Stripped-User-Name:-%{User-Name:-None}} --challenge=%{mschap:Challenge:-00} --nt-response=%{mschap:NT-Response:-00}"

           }
           preprocess {

                   huntgroups = ${confdir}/huntgroups

                   hints = ${confdir}/hints

                   with_ascend_hack = no

                   ascend_channels_per_line = 23

                   with_ntdomain_hack = no

                   with_specialix_jetstream_hack = no

                   with_cisco_vsa_hack = no

           }
           files {

                   usersfile = ${confdir}/users

                   acctusersfile = ${confdir}/acct_users

                   preproxy_usersfile = ${confdir}/preproxy_users

                   compat = no

           }
           detail {

                   detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d

                   detailperm = 0600

           }
           detail auth_log {

                   detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d

                   detailperm = 0600

           }
           detail reply_log {

                   detailfile = ${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d

                   detailperm = 0600

           }
           detail pre_proxy_log {

                   detailfile = ${radacctdir}/%{Client-IP-Address}/pre-proxy-detail-%Y%m%d

                   detailperm = 0600

           }
           detail post_proxy_log {

                   detailfile = ${radacctdir}/%{Client-IP-Address}/post-proxy-detail-%Y%m%d

                   detailperm = 0600

           }
           acct_unique {

                   key  = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port"

           }
           # $INCLUDE ${confdir}/sql.conf
           radutmp {

                   filename = ${logdir}/radutmp

                   username = %{User-Name}

                   case_sensitive = yes

                   check_with_nas = yes

                   perm = 0600

                   callerid = "yes"

           }
           radutmp sradutmp {

                   filename = ${logdir}/sradutmp

                   perm = 0644

                   callerid = "no"

           }
           attr_filter {

                   attrsfile = ${confdir}/attrs

           }
           counter daily {

                   filename = ${raddbdir}/db.daily

                   key = User-Name

                   count-attribute = Acct-Session-Time

                   reset = daily

                   counter-name = Daily-Session-Time

                   check-name = Max-Daily-Session

                   allowed-servicetype = Framed-User

                   cache-size = 5000

           }
           always fail {

                   rcode = fail

           }
           always reject {

                   rcode = reject

           }
           always ok {

                   rcode = ok

                   simulcount = 0

                   mpp = no

           }
           expr {

           }
           digest {

           }
           exec {

                   wait = yes

                   input_pairs = request

           }
           ippool main_pool {

                   # указанные ниже параметры фиктивны, т.к. выдаваемые

                   # IP адреса прописаны в настройках mpd4

                   range-start = 192.168.1.230

                   range-stop = 192.168.1.250

                   netmask = 255.255.255.0
                   cache-size = 800

                   session-db = ${raddbdir}/db.ippool

                   ip-index = ${raddbdir}/db.ipindex

                   override = no

                   maximum-timeout = 0

           }

    }
    instantiate {

    }
    authorize {

           preprocess

           auth_log

           attr_filter

           mschap

           eap

    }
    authenticate {

           Auth-Type PAP {

                   pap

           }
           Auth-Type CHAP {

                   chap

           }
           Auth-Type MS-CHAP {

                   mschap

           }

           pam

           eap

    }
    preacct {

           preprocess

           acct_unique

           files

    }
    accounting {

           detail

           main_pool

    }
    session {

           radutmp

    }
    post-auth {

           main_pool

           reply_log

    }
    pre-proxy {

    }
    post-proxy {

           eap

    }

    3.1.2. clients.conf
    client SELF-INTERFACE-IP {

           secret          = password-change-me

           shortname       = localhost

           nastype         = other

    }

    3.1.3. users
    # Добавить в конец файла

    DEFAULT Auth-Type := MS-CHAP

           Service-Type = Framed-User,

           Framed-Protocol = PPP,

           Framed-IP-Address = 192.168.0.161+,

           Framed-IP-Netmask = 255.255.255.255

    3.1.4. acct_users
    DEFAULT

           Service-Type == Framed-User,

           Service-Type == Login-User,

           Login-Service == Telnet,

           Login-Service == Rlogin,

           Login-Service == TCP-Clear,

           Login-TCP-Port <= 65536,

           Framed-IP-Address == 255.255.255.254,

           Framed-IP-Netmask == 255.255.255.255,

           Framed-Protocol == PPP,

           Framed-Protocol == SLIP,

           Framed-Compression == Van-Jacobson-TCP-IP,

           Framed-MTU >= 576,

           Framed-Filter-ID =* ANY,

           Reply-Message =* ANY,

           Proxy-State =* ANY,

           Session-Timeout <= 28800,

           Idle-Timeout <= 600,

           Port-Limit <= 2

    3.1.5. naslist
    localhost               local           portslave

    SELF-INTERFACE-IP       local           portslave

    Остальные файлы остаются без изменений.

    3.2. В /etc/rc.conf прописать
    radiusd_enable="YES"

    4. Настройка mpd4 (версия: mpd-4.4)
    4.1. В основной системе из портов устанавливаем mpd4.
    4.2. Правим mpd.conf
    default:

           load pptp0

           load pptp1

           load pptp2
    pptp0:

           new -i ng0 pptp0 pptp0

           set ipcp ranges GW-IP-ADDR/32 NG0-IP-ADDR/32

           load pptp_standart
    pptp1:

           new -i ng1 pptp1 pptp1

           set ipcp ranges GW-IP-ADDR/32 NG1-IP-ADDR/32

           load pptp_standart
    pptp2:

           new -i ng2 pptp2 pptp2

           set ipcp ranges GW-IP-ADDR/32 NG2-IP-ADDR/32

           load pptp_standart
    pptp_standart:

           set iface disable on-demand

           set bundle enable multilink

           set bundle yes crypt-reqd

           set bundle enable compression

           set link yes acfcomp protocomp

           set link no pap chap

           set link enable chap

           set link keep-alive 60 180

           set ipcp yes vjcomp

           set ipcp dns DNS-IP

           set ipcp nbns PDC-SERVER-IP

           set iface enable proxy-arp

           set ccp yes mppc

           set ccp yes mpp-e40

           set ccp yes mpp-e56

           set ccp yes mpp-e128

           set ccp yes mpp-stateless

           set ccp yes mppe-policy

           set pptp self 0.0.0.0

           set pptp enable incoming

           set pptp disable originate

           set pptp enable always-ack

           set pptp disable windowing
           set iface mtu 1460

           set link mtu 1460
           set radius server FREERADIUS-JAIL-IP password-change-me 1812 1813

           set radius timeout 10

           set radius retries 3

           set auth enable radius-auth

    4.3. mpd.links
    pptp0:

           set link type pptp

    pptp1:

           set link type pptp

    pptp2:

           set link type pptp

    4.4. Создаем пустой файл mpd.secret
    # touch mpd.secret

    4.5. В /etc/rc.conf основной системы вписываем
    mpd_enable="YES"

    5. Проверка работы.
    5.1. Запускаем в клетке:
    # /usr/local/etc/rc.d/samba start

    # /usr/local/etc/rc.d/radiusd start

    5.2. Запускаем mpd4 в основной системе:

    # /usr/local/etc/rc.d/mpd4 start

    5.3. Пробуем соединиться с впн-сервером.
    5.4. Для выявления проблем с mpd4 требуется запустить mpd4 без параметров
    # mpd4

    5.5. freeradius ведет лог в файле /var/log/radius.log. Так же его можно запустить с отладочном режиме
    # radiusd -A -X
    6. С виндовых клиентов (с Windows XP например), после соединения с сервером VPN, можно шариться в рабочих компьютерах домена. Для этого требуется назначить домен рабочей группой компьютера и указать его на форме соединения как домен входа.

    ---------
    Подробные данные о состоянии спортивных объектов в регионе Южный Урал, а также конкретно в г. Челябинск, можно найти на ресурсе Polit74.ru. На сайте также можно обнаружить развернутые новости Челябинска и мнения горожан по тому или иному вопросу.

  • Монтирование разделов при запуске Jail
  • Интересная штука- индексируемые свойства С# и Pascal(Delphi)
  • Настраиваем GPRS-интернет соединение через bluetooth
  • Новый аппет для Superkaramba.
     

    На выходных получилось переделать свой апплет для Суперкарамбы. А сегодня я разместил его на замечательном ресурсе КДЕ-шников: www.kde-look.org. Предыдущий вариант (который был сделан для Celeron) доступен для ознакомления и скачивания здесь.

    В основном это связяно с заменой процессора Celeron на Pentium D, в котором 2 ядра. Ну и конечно же сразу возникло желание мониторить загрузку этих ядер по-отдельности. В добавок я обнаружил как можно "забацать" календарь в Superkaramba и сделать окошко для оперативных заметок, ну и в ообщем, вот что получилось:

    Апплет доступен для свободного скачивания/использования и редактирования вот здесь.

    Для полноценной работы будут необходимы установленные и настроенные программы в системе: lm-sensors, hddtemp, а так же KDE-приложения KdiskFree, KSystemLog (если они не были установлены заранее).

    Вероятнее всего, какие-то датчики сразу не будут показывать значения. Это связано с различием в железе. Для настройки данного аплета "под себя", необходимо будет подправить сам файл темы Full_mon_30.theme В нем я разместил коментарии для более удобного редактирования. И не забываем про полезную команду sensors:
    $ sensors

    it8712-isa-0290

    Adapter: ISA adapter

    VCore 1: +1.15 V  (min =  +0.00 V, max =  +4.08 V)

    VCore 2: +1.79 V  (min =  +0.00 V, max =  +4.08 V)

    +3.3V:  +3.28 V  (min =  +0.00 V, max =  +4.08 V)

    +5V:  +6.85 V  (min =  +0.00 V, max =  +6.85 V)   ALARM

    +12V:  +11.90 V  (min =  +0.00 V, max = +16.32 V)

    -12V:  -8.46 V  (min = -27.36 V, max =  +3.93 V)

    -5V:  -5.12 V  (min = -13.64 V, max =  +4.03 V)

    Stdby:  +6.85 V  (min =  +0.00 V, max =  +6.85 V)   ALARM

    VBat:  +4.08 V

    fan1:  3068 RPM  (min =  664 RPM, div = 8)

    fan2:  922 RPM  (min =    0 RPM, div = 8)

    fan3:  0 RPM  (min =    0 RPM, div = 8)

    M/B Temp:   +43°C  (low  =  +127°C, high =   +90°C)   sensor = thermistor

    CPU Temp:   -2°C  (low  =  +127°C, high =  +127°C)   sensor = thermistor

    Temp3:        +40°C  (low  =  +127°C, high =   +90°C)   sensor = diode

    $
    В вышеприведенном примере, я выделил красным цветом имена датчиков, которые я использую у себя для мониторинга в этом аплете. Их можно найти в файле Full_mon_30.theme, и заменить на "свои".

    Сетевая карта в этой теме указана как eth0, какой интерфейс используется у вас можно узнать командой ifconfig из консоли. Ну и, конечно, подставить вместо моего значения если отличается.

    Да, чуть не забыл - иконки на этом аплете запускают приложения! Не забываем на них кликать. Если же вдруг, кликается но не запускается, то проверяем закреплен ли сам апплет на десктопе, или нет. Сделать это можно, нажав правую кнопку мыши на апплете. Менюшка должна выглядеть как на рисунке ниже:

    Вроде бы как все.
    Надеюсь будет полезно!

    **********
    О том, есть ли смысл сегодня тратить деньги на прогоны по каталогам поведает ресурс SEO-тематики Liveseo.org.

    Общеизвестно, что наиболее девственный и продолжительный целебный эффект оказывает натуральная косметика аюрведа без химических добавок. Приобрести различные органические препараты для ухода за телом, лицом или волосами вам поможет магазин профессиональной косметики Herbals.ru.

  • No related posts
  • Внешне указатели, сокеты внутри

    Программирование сетевых и многозадачных приложений довольно трудная задача, так как в данной области довольно часто возникают нетривиальные ошибки, которые очень редко проявляются и их очень затруднительно воспроизвести. Типичный пример - потеря соединения. Пусть у нас имеется следующий код:
    #define COMMAND_PORT 2021

    //Функция обработки принятого соединения
    void* ProcessConnection(void*p){
       /*делаем что-нибудь полезное*/
       int rval=0;
       close(*((int*)p));
       pthread_exit((void*)rval);
    }

    //
    int main(int argc,char**argv){
     //создаем сокет
     int sd = socket( PF_INET, SOCK_STREAM, 0 );
     if ( sd == -1 ) {
         perror( "Error create socket: " );
         return EXIT_FAILURE;
     }

     struct sockaddr_in addr;
     bzero( &addr, sizeof( addr ) );
     addr.sin_family = AF_INET;
     addr.sin_port = htons( COMMAND_PORT );
     addr.sin_addr.s_addr = INADDR_ANY;
     int addr_size = sizeof( struct sockaddr_in );

     //привязываем адрес к сокету
     if ( bind( sd, ( struct sockaddr * ) & addr, addr_size ) != 0 ) {
         perror( "Error assigning address to socket: " );
         return EXIT_FAILURE;
     }

     //выражаем готовность принимать запросы на соединеие
     if ( listen( sd, 5 ) != 0 ) {
         perror( "Error create listener queue: " );
         return EXIT_FAILURE;
     }

     //далее извлекаем запросы на соединение и для обработки
     //каждого такого соединения создаем поток
     while ( 1 ) {
      int cld=accept(sd,(struct sockaddr*)&addr,(socklen_t*)&addr_size);
      if ( cld ==-1 ) {
          perror("Error accepting with client: ");
          return EXIT_FAILURE;
      } else {

      pthread_t tchild;
      if(pthread_create(&tchild,NULL,&ProcessConnection,(void*)&cld )!= 0){
          perror("Error create thread: " );
          close( cld );
          return EXIT_FAILURE;
      }

      }// if-else
     }// while
     return EXIT_SUCCESS;
    }

    На первый взгляд этот код не содержит ошибок и будет работать правильно в большинстве случаев. Но при большой нагрузке на этот сервер часть соединений будет утеряна. Почему? Если обратить внимание на следующую строчку
    pthread_create( &tchild, NULL, &ProcessConnection,(void*) &cld );

    то можно увидеть, что файловый дескриптор созданный accept(); передается в обрабатывающую функцию не по значению, а по адресу. В действительности неизвестно как операционная система распланирует выполнение потоков и вполне возможно что поток обработки соединения начнет выполнятся тогда, когда будет принят следующий запрос на соединение. А поскольку передается адрес дескриптора, то в данном случае первое принятое соединение будет потеряно (кроме того дескриптор не будет закрыт). Более того возможно возникновение ситуации когда два потока будут обрабатывать одно и то же соединение, что естественно ничего хорошего не принесет. Решение как всегда лежит на поверхности: следует изменить чуть-чуть функцию обработки соединения и передавать не адрес дескриптора а его значение:
    //Функция обработки принятого соединения
    void* ProcessConnection(void*p){
       /*делаем что-нибудь полезное*/
       int rval=0;
       close((int)p);
       pthread_exit((void*)rval);
    }
    int main(int argc,char**argv){
     /*.........*/
     //далее извлекаем запросы на соединение и для обработки
     //каждого такого соединения создаем поток
     while ( 1 ) {
      int cld=accept(sd,(struct sockaddr*)&addr,(socklen_t*)&addr_size);
      if ( cld ==-1 ) {
         perror("Error accepting with client: ");
         return EXIT_FAILURE;
      } else {

      pthread_t tchild;
      if(pthread_create(&tchild,NULL,&ProcessConnection,(void*)cld )!= 0) {
         perror("Error create thread: " );
         close( cld );
         return EXIT_FAILURE;
      }

      }//if-esle
     }//while
     /*.........*/
    }
    [Qt собирается долго-долго]

    5. Последний шаг - установка переменных окружения:

    QTPATH - путь к директории Qt;
    QMAKESPEC - шаблон для qmake, ставим win32-msvc2005;
    Path - добавляем Qt\bin.

  • Интересная штука- индексируемые свойства С# и Pascal(Delphi)
  • Сказки Java and Web-services
  • OLTP первые проблемы
  • Delphi 2007 (часть III - FastMM)

    Введение

    О чем речь

    Ниже речь пойдет о FastMM - менеджере парамяти для Delphi for win32. Я поделюсь опытом использования данного продукта и покажу, какие можно получать выгоды от него.

    Предполагается, что FastMM используется для отладки приложения. Это важно, т.к. FastMM, работающий в режиме отладки, серьезно тормозит выполнение программы.

    Версии дельфи, для которых применим материал

    Материал применим как для BDS2006, так и для Delphi2007 (возможно, что и для более ранных версий дельфи - я не проверял).

    История FastMM

    Насколько я понимаю, данный манагер памяти был алтернативным манагером до Delphi2005 включительно. Т.е. можно было скачать FastMM (он свободный, где брать - см. ниже) и включить его в свой проект, заменив штатный манагер. Начиная с BDS2006 FastMM уже включен в Delphi.

    По сравнению с ранее существовавшим манагером FastMM обладает следующими достоинствами:
    Он быстрее.
    Он предоставляет сервисные функции для отладки и поиска утечек памяти.

    Естественно FastMM включается не только в программы, создаваемый разработчиком, но и в саму IDE. Насколько я понимаю одной из причин резкого ускорения работы IDE при переходе от BDS2005 к BDS2006 был именно FastMM.

    Проблемы

    Проблема в том, что:
    В Delphi FastMM включается только как манагер памяти и как упрощенный поисковик утечек памяти.
    В Delphi в настоящий момент полностью отсутствует документация по поводу FastMM (есть соответствующий репорт - http://qc.codegear.com/wc/qcmain.aspx?d=27105, который уже открыт автором FastMM).

    При этом никто не машает скачать полную версию FastMM и заменить ею "штатный" FastMM, который есть в Delphi, настроив заменяющий FastMM таким образом, чтобы получать максимальную выгоду от сервисных функций в процессе отладки.

    Использование FastMM

    Где брать

    FastMM хостится на http://www.sourceforge.net. Вот точная ссылка на страницу проекта: http://sourceforge.net/projects/fastmm.

    Далее идете по ссылке Download FastMM. и скачиваете версию 4.x. В настоящий момент последней версией является 4.78.

    Как устанавливать

    Устанавливать собственно и не надо ничего. Есть три файла, которые вам необходимы:
    FastMM4.pas
    FastMM4Messages.pas
    FastMM4Options.inc

    Кладете их в каталог проекта (или в путях, прописанных в Library Path в настройках Delphi) и подключаете первым модулем проекта FastMM4.

    В случае, если используются runtime пакеты, то FastMM4, естественно не нужно подключать в пакеты - только в главное приложение.

    NB Как использовать FastMM для DLL я не знаю, ибо не разбирался. Но в файле FastMM4Options.inc есть очень много комментариев по поводу настройки FastMM. Скорее всего там можно выяснить этот вопрос.

    Настройка FastMM

    FastMM настраивается посредством опций условной компиляции, задаваемых в файле FastMM4Options.inc. Опции снабжены подробными комментариями. Я для своих задач сделал следующие изменения:
    Убрал комментарии для опций UseRuntimePackages, FullDebugMode, ClearLogFileOnStartup.
    Закомментировал опцию RequireDebuggerPresenceForLeakReporting.

    NB При использовании FastMM с опцией FullDebugMode в каталоге проекта должна быть библиотека FastMM_FullDebugMode.dll, которая есть в поставке FastMM как в виде исходников, так и в виде скомпилированного файла. Подробнее см. каталог FastMM478.zip \FullDebugMode DLL.

    Настройки проекта

    При возникновении нештатных ситуаций FastMM показывает стек вызовов, приведший к ошибке. Для того, чтобы стек вызовов содержал имена функций и строк в исходном коде нужно в параметрах проекта (и runtime пакетов, если они используются) на закладке Linker в секции Map File выставить опцию Detailed.

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

    Цель примера показать, что в стеке вызовов, приведшего к утечке памяти будут методы TMyClass.Execute() и TMyClass.fProcess() с точным указанием номера строки исходного кода.

    program Project1;

    {$APPTYPE CONSOLE}

    uses

      FastMM4,Classes,SysUtils;

    type

       TMyClass = class

          public procedure Execute();

          strict private procedure fProcess();

       end;

    procedure TMyClass.Execute();

    begin

       fProcess();

    end;

    procedure TMyClass.fProcess();

    var

       L: TList;

    begin

       L := TList.Create();

    end;

    var

       MC: TMyClass;

    begin

       MC := TMyClass.Create();

       try

          MC.Execute();

       finally

          MC.Free();

       end;

    end.

    Еси выполнить данную программу, то, во-первых, при завершении программы будет выведено сообщение о том, что были утечки, во-вторых, в каталоге программы будет создан файл Project1_MemoryManager_EventLog.txt, в котором будет представлена более подробная информация об утечке памяти.

    В частности будет представлена следующая информация:
    Stack trace of when this block was allocated (return addresses):

    402DBE [system.pas][System][System.@GetMem][2648]

    4036EF [system.pas][System][System.TObject.NewInstance][8824]

    40399A [system.pas][System][System.@ClassCreate][9489]

    403724 [system.pas][System][System.TObject.Create][8839]

    403A08 [system.pas][System][System.@AfterConstruction][9537]

    414935 [E:\temp\_Borland\FieldTest\01\Project1.dpr][Project1][Project1.TMyClass.fProcess][18]

    41491B [E:\temp\_Borland\FieldTest\01\Project1.dpr][Project1][Project1.TMyClass.Execute][12]

    4152FD

    794589A5 [ProcessIdToSessionId]

    The block is currently used for an object of class: TList

    Видно, что здесь, во-первых, указан класс, объект которого "утек", во-вторых, указан стек вызовов, приведший к утечке.

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

    NB В какой-то момент может показаться ошибкой, что в стек иногда попадают лишние методы. Я не силен в архитектуре возбуждения исключений, поэтому могу только передать слова автора FastMM: "Я пользовался функцией построения стека, которая реализована в JEDI". От себя замечу, что именно этой функцией пользуется сама IDE в BDS2006 и Delphi2007. Наверное, стоит спокойно относится к лишним методам - лишь бы нужные методы не пропадали.

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

    Такой функционал - еще одна сервисная функция, предоставляемая FastMM.

    В отладочном режиме (т.е. если включена опция условной компиляции FullDebugMode) FastMM при удалении объекта "портит" память, занимаемую ранее объектом, таким образом, что при следующей попытке вызывать виртуальный метод удаленного объекта FastMM возбуждает исключение.

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

    Ниже представлен пример отслеживания момента повторного удаления объекта (деструктор тоже виртуальный метод).
    program Project1;

    {$APPTYPE CONSOLE}

    uses

      FastMM4;

    type

       TMyClass = class

       end;

    var

       MC: TMyClass;

    procedure Proc1;

    begin

       MC := TMyClass.Create();

    end;

    procedure Proc2;

    begin

       MC.Free();

    end;

    procedure Proc3;

    begin

       MC.Free();

    end;

    begin

       Proc1;

       Proc2;

       Proc3;

    end.

    Запустите проект.

    Во-первых, вы получите сообщение о том, что была попытка вызывать виртуальный метод удаленного объекта.

    Во-вторых, в файле Project1_MemoryManager_EventLog.txt можно посмотреть:
    Стек вызовов при создании объекта.
    Стек вызовов при удалении объекта.
    Стек вызовов при попытке вызывать виртуальный метод объекта (в текущем примере это тот же деструктор).

    ИМХО весьма полезно может быть.

    Заключение

    При анализе файла FastMM4Options.inc можно найти некоторые другие сервисные функции. Я с ними не разбирался, но, очевидно, что они также могут быть полезны при отладке.

    _________
    К BTL-методам продвижения товара относятся такие способы привлечение внимания покупателя, как дегустация и подарок за покупку. Об остальных методах вам расскажет Btl агенство «ART department», которое можно найти в сети по адресу Art-dept.ru.

    CandyLife.ru - все про клевую жизнь: крутые тачки, самые последние гаджеты, новости мира моды и все звезды, рецензии фильмов, афиша, описание гламурных мест Москвы: рестораны, клубы.

  • Пригодятся каждому Delphi проекту
  • Четвертый день коференции Code
  • Интересная штука- индексируемые свойства С# и Pascal(Delphi)
  • Инвестиции в моделирование

    Давно хотел решить вопрос с моделированием. Главная предпосылка - моделирование все равно должно быть. Если проект это не три формы и две таблицы - нужно моделировать. Приверженцы гибкого моделирования говорят: "Моделировать чтобы понять." Мне же хочется большего. Хочется на основе моделей получить код. И современные средства моделирования неплохо с этим справляются. Посмотрите на Together в сочетании с C++, C# и Java!

    Т.е. можно добавить к "моделируйте чтобы понять", если это возможно "моделируйте, что построить код!". Вспоминаю как я пытался избежать построения моделей в ERWin в институте. Мне казалось, что это рисование ничего больше рисунка не принесет. Хорошо, что преподаватель вовремя объяснил, что это не только рисование а еще и гибко настраиваемая генерация DDL кода. И плюс к тому же обратное проектирование из DDL-скриптов и работающих БД, практически всех популярных производителей (Oracle, IBM, MS). С тех пор с ERWin я не расстаюсь. Даже когда предметная область ясна и не нужно "моделировать чтобы понять". Я прежде всего моделирую чтобы построить.

    UML не был слишком востребован в моей практике. Наверное из-за специфики приложений, ориентированных на ввод данных, где 80% приложения это получение списка и простые операции вставки, редактирования и удаления.

    К тому же для Delphi до некторого времени не поддерживалось ни прямое ни обратное проектирование. Существовал для Rational Rose RoseDelphiLink, но ожидаемого успеха он не приносил. Вообще во времена 2000-2001 Rose был довольно бедный на предмет генерации - не понимал реализацию - только заголовки методов, и можно было абсолютно чесно бояться что что-то испортится в процессе синхронизации. Кстати как там сейчас обстоят дела не знаю, надеюсь IBM исправила этот недостаток, по крайней мере для Java

    Программы моделирования изменились с появлением Together с философией, что это не просто модели - модели и код это лишь разные представление одного и того же. Т.е. можно смотреть на код, можно на модель. Когда вы будете изменять код - автоматически будет изменяться модель, а когда менять модель - будет изменяться и код. И все это на довольно серьезном уровне даже диаграмм взаимодействия, где с выбранной вами степенью детализации прорисованы циклы и операторы (и все это можно двигать!)

    Многие люди хотят облегчить себе жизнь при помощи моделирования. Особенно, когда моделирование неотъемлемая часть процесса разработки. В пользе моделировании СУБД я уверен на все 100%. Если вы еще не делаете этого настоятельно рекомендую - переход от модели к реализации с минимальными усилиями - моделирование окупается на все 100%.
    Вообще OLTP приложения довольно просты, и можно пойти дальше. Используя модель данных (или физическую реализацию объектов СУБД) можно даже попытаться автоматически построить большую часть приложения, работающего с ней. Например предварительные сиквелы для всех объектов, формы списков и формы ввода данных ..

    Кто начал с объектов и UML моделирования тоже может получить огромные выгоды прямо сейчас. Вопрос до конца пока не исследован мной, но кое что успел посмотреть.

    Delphi и MDA for Net мало чего могу сказать и возможно мои знания уже не отвечают действительности - не исследовал должным образом - просто это цельная технология со своими плюсами и должно быть свойственными ограничениями. Стратегии хранения объектов в БД поддерживаются различные, автоформы есть, визуальное связывание есть. Есть также поддержка OCL и состояний. Поддержка унаследованных реляционных БД. Пугает, как обычно для объектных реализаций БД, способ управления жизнью объектов, хранение и оперативная память, и главное что делать при модификации объектной модели - как построить например обновления схемы СУБД без потери данных.

    Привлекательно смотрится Hibernate с реализациями для двух самых популярных платформ Java и .Net. Хочется отметить что Hibernate меня например пугает меньше чем MDA - вы остаетесь в привычном объектом мире и если вам нужно постоянное хранение объектов используется ORM Hibernate - просто прячется слой хранения.
    - Моделируем предметную область и получаем модель на языке программирования.
    - Автоматически строим по объектной модели схему СУБД
    либо
    - по готовой схеме СУБД строим объектную модель, что тоже довольно неплхо смотрится для поддержки унаследованных БД
    - по мере развития приложения можно повторять генерацию, а можно изменять карты отображения объектов СУБД в объекты языка программирования.
    Т.е. вам не нужно отвлекаться на слой хранения даных - эти штуки вас от него абстрагируют - в идеале избавляют от целой трети работы (представление <-> логика <-> храниение)!

    ------------

    Основное направление деятельности московской фирмы «Кумба» - строительство домов из бруса по типовому или индивидуальному проекту.

  • Hibernate in Action
  • OASIS UBL
  • JSF погружение
  • Глобус в Линуксе.
     

    Как-то потребовалось срочно взглянуть на географическую карту или глобус. Проблемы бы не было, будь под рукой Интернет с великолепным GoogleMaps. Но в off-line нужно было искать альтернативный путь (бумажного источника под рукой тоже не было).

    Поиск, установка.
    Без сомнения репозиторий Kubuntu содержит просто огромное количество программ на (наверное) все случаи жизни. Поиск по пакетам выдал, что в системе доступен общий карто-географический виджет:
    marble - generic geographical map widget
    Тут же установил его командой:
    sudo apt-get install marble
    Он зависит от таких вещей как:

    gpsd
    libc6 (>= 2.6-1)
    libgcc1 (>= 1:4.2.1)
    libqt4-core (>= 4.3.1)
    libqt4-gui (>= 4.3.1)
    libstdc++6 (>= 4.2.1)
    marble-data
    .. и если они еще не установлены в системе, то при установке накатятся автоматом. Ну все - установили.
    Запуск.
    В Меню - Образование - Другие науки появилась иконка Marble - Desktop Globe. Запускаем - тишина! Ага, че-то ему надо. Идем в консоль, и запускаем оттуда (чтобы посмотреть на сообщения от самой программы):
    $ marble

    marble: error while loading shared libraries: libgps.so.15:

    cannot open shared object file: No such file or directory
    Ну все ясно - нету GPS-библиотеки, которую ему очень нужно. И хотя у меня нету этого самого GPS, программа без оной работать не хотит. Посмотрим, что у нас есть:
    $ ls /usr/lib/ | grep libgps

    libgps.so.16

    libgps.so.16.0.0
    Итак, у нас есть библиотека с индексом 16, ну а 15-ую тогда с имитируем для программы:
    $ sudo ln -s /usr/lib/libgps.so.16 /usr/lib/libgps.so.15
    теперь проверим..
    $ ls /usr/lib/ | grep libgps

    libgps.so.15

    libgps.so.16

    libgps.so.16.0.0

    Ага, вот она и появилась. Ну что же, пробуем:
    $ marble

    Setting map theme to : /usr/share/marble/data/maps/earth/srtm/srtm.dgml

    Detected maximum tile level that contains data: 4

    MaxTileLevel: 5

    Use workaround: 0

    "Loading Default Placemark Cache File:/usr/share/marble/data/placemarks/cityplacemarks.cache"

    "Loading Default Placemark Cache File:/usr/share/marble/data/placemarks/baseplacemarks.cache"

    "Loading Default Placemark Cache File:/usr/share/marble/data/placemarks/elevplacemarks.cache"
    .. а на экране, в это время, появилась вот такая картинка:

    Вот и все. Все прекрасно работает! Удобство работы, примерно, как в GoogleMaps (или точнее как в GoogleEarth)- все комфортно делается мышкой.

    М-м-м.. прикольная вещица. Если есть коннект с Интернетом, то тогда можно будет еще получать массу справочной информации.

    P.S. Теперь прогу можно запускать и с меню.

    0-0-0-0-0-0-0

    Proxy-сервер за 5 минут!
     

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

    Выбор.
    Как говорил Нео из К/ф "Матрица": "У людей всегда есть выбор". Вот я недолго думая набрал в консоли команду (с правами root-a):
    aptitude search proxy
    ... и увидел в ответ несколько десятков альтернатив. Ха! Кто же сомневался-то?! Время было сильно ограничено на экспериментальную составляющую процесса, и я спросил у своего коллеги совета по данному вопросу. На что он мне сказал, что как-то юзал легкий незатейливый Proxy-сервер, с несложной, хотя и своеобразной конфигурацией. Имя этой проги

    ffproxy (A light and customizable http(s) proxy server with ipv6 support)
    "Поднимаем" proxy-сервер.
    Ну сказано-сделано. Командой в консоли установим его (с правами root-a):
    apt-get install ffproxy
    Далее его нужно сконфигурировать, и для начала определимся, какие параметры для конфигурации нам потребуются:

    IP-адрес хоста (хостов), которым разрешим выход в И-Нет
    Port, который будет слушать наш Proxy (иначе порт нашего прокси-сервера)
    Forvard Proxy:Port - это если наш комп сам уже находится за прокси-сервером
    ... вот, собственно и все!
    :)

    Конфигурируем.
    Основной конфигурационный каталог этой программы - /etc/ffproxy. Там основной конфиг-файл ffproxy.conf, в котором я указал лишь 2 значения: listen port, и Forward Proxy с его Port (т.к. сам нахожусь за прокси-сервером). Но если наш компьютер сразу смотрит в Интернет, тогда соответствующие forward_proxy и forward_proxy_port строчки (они на скриншоте подчеркнуты красным) должны быть закомментарены значком #.

    В моем случае,как на картинке выше, указан прокси за которым я сам нахожусь 161.9.0.1 с портом 800. А мой комп уже сам становится прокси-сервером (IP-адрес моей машины) с портом 8080 (тоже, как по-умолчанию). Например, если IP моего компа 161.9.0.10, то для подключаемых компьютеров через меня, прокси-сервер будет указываться как 161.9.0.10:8080.

    Я покажу подключение хоста к моему прокси-серверу на примере компьютера, работающей под виртуальной машиной VirtualBox, на моем же компе, и имеющий IP адрес 10.0.0.1. Чтобы добавить разрешенный хост в мой прокси-сервер, должен править конфигурационные файлы, расположенные в каталоге:
    /etc/ffproxy/db/
    Там для нас представляют интерес только три файла (если мы не настраиваем ни фильтрации, и ничего другого):

    access.dyndns - если мы указываем DNS-имя добавляемого хоста(компьютера)
    access.host - если мы указываем имя компьютера
    access.ip - если мы указываем конкретный IP-адрес
    Я правил файл access.ip, где просто указывал IP-адрес своей виртуальной хост-машины 10.0.0.1:

    Вот здесь и кроется та самая "своеобразная конфигурация" :) Строка должна начинаться с ^, а заканчиваться $. И перед каждой разделительной точкой IP-адреса нужно ставить обратный слеш \

    Сложностей, в общем-то никаких. Если что нужно особенное, то смотрим заготовленные примеры в файлах конфигурации - все, в принципе, понятно.

    После каждого редактирования конфигурационных файлов, сам ffproxy нужно перезапускать. Делается это командой (с правами root-a):
    /etc/init.d/ffproxy restart
    А вообще его (наш прокси-сервер) можно запускать, останавливать, перегружать...
    # /etc/init.d/ffproxy {start|stop|restart|reload|force-reload}

    Заключение.
    В общем таким несложным способом можно быстро поднять прокси-сервер для компьютеров своей сети. У меня на это ушло порядка 20 минут - пока я узнавал у своего знакомого что да как, потом искал, где была оЧеПятка.
    Хотя на все-про-все времени нужно минут 5: с момента установки, до момента работы нашего маленького прокси-сервера!
    :)
    Конечно, это не сравнится с Winsows-коллегой UserGate, имеющей классный графический интерфейс и мощный функционал, но для ОС Линукс я таких программ пока не знаю. Если кто в курсе, дайте знать - интересно!

  • ftp-proxy в freebsd
  • Сброс буфера системных сообщений FreeBSD
  • vsftpd и пользователи из базы LDAP.
  • Qt (version 4.3.4 OpenSource) + MSVC 2005

    1. Распаковываем архив с исходниками куда удобно, например, в C:\Qt.

    2. Запускаем терминал (с предустановленными MSVC переменными окружения):

    Start -> All Programms -> Microsoft Visual Studio 2005 -> Visual Studio Tools -> Visual Studio 2005 Command Promt
    3. Переходим в директорию с Qt и выполняем команду:
    configure.exe -platform win32-msvc
    Прим.:
    в принципе, можно просто запустить configure.exe - тогда всё будет по-умолчанию, но у меня параллельно установлена версия Qt+MinGW, поэтому configure автоматом цепляется за g++ (из-за установленных при установке Qt+MinGW системных переменных окружения), так что лучше указывать руками платформу-компилятор для сборки.

    Так же можно посмотреть большое количество различных опций сборки Qt при помощи команды configure.exe --help.

    4. Следующий шаг - непосредственно сборка, одна команда:
    nmake

    -----------
    Клуб Вольво. Club Volvo.

    Фан-клуб автомобилей Volvo подскажет вам, где располагается ближайший в вашей местности автосалон Вольво, а также станция технического обслуживания моделей шведской марки.

  • Новости CodeGear за декабрь 2007
  • Using .NET Controls from WinAPI/MFC/WTL applications (Part 1)
  • MSF на Intuit.ru