рдореБрдЭреЗ рдЖрдкрдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдЬрдм рдореБрдЭреЗ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рддреЛ рдмреБрдЦрд╛рд░ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдкреВрд░реА рд╡реЗрд╢реНрдпрд╛рд╡реГрддреНрддрд┐ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдЕрдореВрд░реНрдд рдореЙрдбрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдЙрдбрд╝рддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рдФрд░ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЦрд╛рд▓реА рдЪрд╛рджрд░ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЖрдВрд╕реВ рдмрд╣рд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдк рдкреВрд░реЗ рдХрдВрдХрд╛рд▓ рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдмрд╕ рдЬрд░реВрд░рдд рд╣реИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд░реАрдврд╝ рд▓рд┐рдЦреЗрдВред
рдиреАрдЪреЗ "NULL рдкреНрд░реЛрдЬреЗрдХреНрдЯ" рд╣реИ, рдмрд╣реБрдд рд╣реА рд░реАрдврд╝ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдореЗрд░реЗ рд╕рд╛рдеред
рдпрд╣ рдкреЛрд╕реНрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрднрд╡реА рд╣реИрдВ рдФрд░ рдЬреЛ рд╕реАрдзреЗ рд╕реА ++ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдПрдХ рд╣реА рдЙрджреНрджреЗрд╢реНрдп рд╣реИ - рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдиреАрдВрд╡ рджреЗрдирд╛ред
рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ
рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
- рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░
- рд╕реАрдореЗрдХ рд╕реЙрд▓реНрдпреВрд╢рд┐рдиреЛрд╡ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ
- рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢реБрд░реВ рдФрд░ рдмрдВрдж рдХрд░реЛ
- рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
- рдЖрдк рдХрдВрд╕реЛрд▓ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реИрд╕реЗ рднреА, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдкрдирд╛ рд▓реЙрдЧрд░ рд╣реЛрддрд╛ рд╣реИ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлреЙрд░реНрдо рдХреА рдХреБрдВрдЬреА = рдорд╛рди рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
- рдмрдврд╝рд╛рд╡рд╛ рдХреЗ рдмрд┐рдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛? рдирд╣реАрдВ, рд╕реБрдирд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП рддреБрд░рдВрдд рдмрдврд╝рд╛рд╡рд╛ рджреЗрдВ
- рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗред рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд░реАрдврд╝ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВред
рджреБрдирд┐рдпрд╛ рдкрд░ рдХрдмреНрдЬрд╛ рд╕рдорд╛рд░реЛрд╣ рдмрдирд╛рддреЗ рд╣реИрдВ
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░
. тФЬтФАтФА CMakeLists.txt тФЬтФАтФА gen_eclipse.sh тФЬтФАтФА include тФВ тФЬтФАтФА logger.h тФВ тФЬтФАтФА mediator.h тФВ тФЬтФАтФА pid.h тФВ тФЬтФАтФА program_options.h тФВ тФЬтФАтФА thread.h тФВ тФФтФАтФА version.h тФЬтФАтФА package.sh тФЬтФАтФА src тФВ тФЬтФАтФА logger.cpp тФВ тФЬтФАтФА main.cpp тФВ тФЬтФАтФА mediator.cpp тФВ тФЬтФАтФА pid.cpp тФВ тФЬтФАтФА program_options.cpp тФВ тФФтФАтФА version.cpp тФЬтФАтФА start.sh тФЬтФАтФА stop.sh тФФтФАтФА version.sh
рд╕реЛрд▓реНрдпреБрд╢рд┐рди рдЬрдирд░реЗрдЯрд░
Gen_eclipse.sh рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдбрд┐рдмрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рд╕рдорд╛рдзрд╛рди рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдФрд░ cmake рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рднреА рд╕реЗрдЯ рдХрд░реЗрдВред рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рд▓рд┐рдирдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╡рд┐рдХрд╛рд╕ рдЖрдорддреМрд░ рдкрд░ рдПрдХреНрд▓рд┐рдкреНрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдирд╛рдо gen_eclipse рд╣реИред рд▓реЗрдХрд┐рди рджреЛрд╕реНрддреЛрдВ Cmake рдФрд░ рдЧреНрд░рд╣рдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдирд╛рдиреЗ рдореЗрдВ рдореИрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд░рд╣рд╛ред рдПрдХреНрд▓рд┐рдкреНрд╕ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдореЗрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рддреЛ рд░рд┐рд▓реАрдЬрд╝ рдпрд╛ рдбрд┐рдмрдЧ рдХрд░реЗрдВ, рдФрд░ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢рд╛рдорд┐рд▓ рдФрд░ src рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВред
gen_eclipse.sh #!/bin/bash ROOT_DIR=$PWD BUILD_DIR=$PWD/"build" BUILD_DIR_R=$BUILD_DIR/release BUILD_DIR_D=$BUILD_DIR/debug mkdir -p $BUILD_DIR mkdir -p $BUILD_DIR_R mkdir -p $BUILD_DIR_D if [ -d $BUILD_DIR_R ]; then if [ -f $BUILD_DIR_R/CMakeCache.txt ]; then rm $BUILD_DIR_R/CMakeCache.txt fi fi if [ -d $BUILD_DIR_D ]; then if [ -f $BUILD_DIR_D/CMakeCache.txt ]; then rm $BUILD_DIR_D/CMakeCache.txt fi fi echo "[[ Generate Release solution]]" cd $BUILD_DIR_R cmake -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE:STRING="Release" --build $BUILD_DIR_R ../../ echo echo "[[ Generate Debug solution]]" cd $BUILD_DIR_D cmake -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE:STRING="Debug" --build $BUILD_DIR_D ../../ cd $ROOT_DIR ./version.sh
рд╕рдВрд╕реНрдХрд░рдг
рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рддреЛрдбрд╝рдлреЛрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд╢реЛрдзрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ: MAJOR.MINOR.REVISIONред рдкрд╣рд▓реЗ рджреЛ рдорд╛рди рд╣реИрдВрдбрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рддреАрд╕рд░рд╛ svn рд╕рдВрд╢реЛрдзрди рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рддреЛрдбрд╝рдлреЛрдбрд╝ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЧреНрд░рд╛рд╣рдХ рд╕рд┐рд░реНрдл рд░рд┐рд╡реАрдЬрди рдирдВрдмрд░ рдирд╣реАрдВ рджреЗ рдкрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ
REVISION=`LANG=C svn info | grep "Last Changed Rev:" | sed s/"Last Changed Rev":\ //` if [[ "$REVISION" == "" ]]; then echo "Cannot recognize number of revision" exit 1 fi ... VER_CPP=src/version.cpp echo "#include \"version.h\"" > $VER_CPP echo "const char* VERSION = \"$VERSION\";" >> $VER_CPP
рд▓рд┐рдкрд┐рдпрд╛рдБ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ, рдЯреВрдЯрддреА рд╣реИрдВ
рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рднреА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЬрд┐рдиреНрд╣реЗрдВ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдерд╛, рдпреЗ рд╕рд░реНрд╡рд░, рдмрдбрд╝реЗ рдФрд░ рдЫреЛрдЯреЗ рдереЗред рдЙрдирдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпреЗ рд╕реЗрд╡рд╛рдПрдВ рд╣реИрдВред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП init.d рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рдФрд░ рдмрдВрдж рдХрд░рдирд╛ рдкреНрд░рдерд╛ рд╣реИред рд▓реЗрдХрд┐рди! рдореЗрд░реЗ рдкрд╛рд╕ рдХрднреА рднреА рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдерд╛ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдПрдХрд▓ рд╕рд░реНрд╡рд░ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдкреАрдЖрдИрдбреА тАЛтАЛрдлрд╝рд╛рдЗрд▓ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рд╕реНрдЯрд╛рд░реНрдЯ рд╕реНрдЯреЙрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрднреНрдпрд╛рд╕ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВред
рд╢рдЯрдбрд╛рдЙрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реНрд▓реЛ рд╕рд░реНрд╡рд░ рд╢рдЯрдбрд╛рдЙрди рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рддрд░реНрдХ рд╣реИред
рдкреБрдирд╢реНрдЪред рд╕реНрдЯреЙрдк.рд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╕рдВрд╕реНрдХрд░рдг рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдЖрдВрджреНрд░реЗрдИ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж
Package.sh
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреИрдХреЗрдЬ.рд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдкрд░реНрдпрд╛рдкреНрдд рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкреИрдХреЗрдЬ рдмрдирд╛рдирд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдпрд╣ рдПрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдмреНрд░реЗрдХ рд╕реНрдЯрд╛рд░реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рдпрдВ рдФрд░ рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реИред
рдХрд╛рд░реНрдпрд╛рддреНрдордХ
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд╕реАрдзреЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЖрдорддреМрд░ рдкрд░ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП:
- рдкрд╣рд▓реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓
- рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХрд╛ рд╕рд░рд▓ рддрд░реАрдХрд╛
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд░реЛрдХрдиреЗ рдХреА рдХреНрд╖рдорддрд╛
рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
рдкрд╣рд▓реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдРрд╕реЗ рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИред рдЕрдм рдореИрдВ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдХреНрдпреЛрдВ рд╣реИрдВред
рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдореИрдВ рд▓реЙрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреНрдпреЛрдВ? рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд▓реЙрдиреНрдЪ рдПрдХ рдЕрд▓рдЧ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреБрд░рд╛рдиреЗ рд▓реЙрдЧ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдпрджрд┐ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреИрд╕реЗ? рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
PID рдлрд╝рд╛рдЗрд▓ред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рддреБрд░рдВрдд 2 рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢реБрд░реВ рдФрд░ рдмрдВрдж рдХрд░реЛред рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдЗрдирд┐рдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдЬреЛ рд╕реНрдЯреЙрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рджреЛ рд╕реЗ рдПрдХ рдмрд╛рд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдореИрдВ рдПрдХ conf рдлрд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ :: program_options
program_options.cpp void ProgramOptions::load(int argc, char* argv[]) { options_description desc("Allowed options"); desc.add_options() ("help,h", "produce help message") ("config,c", value<std::string>(&conf_file)->default_value(std::string(CONF_FILE)), "set configuration file") ("logdir,l", value<std::string>(&log_dir)->default_value(std::string(LOG_DIR)), "set log directory") ("pidfile,p", value<std::string>(&pid_file)->default_value(std::string(PID_FILE)), "set pid file") ; variables_map vm; store(parse_command_line(argc, argv, desc), vm); notify(vm); if (vm.count("help")) { std::cout << desc << "\n"; exit(0); } std::cout << "Will be used the next options:" << std::endl << "CONF_FILE = " << conf_file << std::endl << "LOG_DIR = " << log_dir << std::endl << "PID_DIR = " << pid_file << std::endl ; }
рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред
./projectnull -h
рдЕрдиреБрдордд рд╡рд┐рдХрд▓реНрдк:
-h [--help] рдорджрдж рд╕рдВрджреЗрд╢ рдХрд╛ рдЙрддреНрдкрд╛рджрди
-c [--config] arg (= project.conf) рд╕реЗрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓
-l [--logdir] arg (= log) рд╕реЗрдЯ рд▓реЙрдЧ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╣реИ
-p [--pidfile] arg (= project.pid) pid рдлрд╝рд╛рдЗрд▓ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ
рд▓реЙрдЧрд┐рдВрдЧ
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓реЙрдЧрд░ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдкрдиреА рдореЗрдВ рдпрд╣ рдЕрдкрдирд╛ рд╣реИред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдиреЛрдЯ рдФрд░ рддреНрд░реБрдЯрд┐ рдореЛрдб рдореЗрдВ рдХрдВрд╕реЛрд▓ рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдХреЗрд╡рд▓ рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЬреЛ рдореБрдЭреЗ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рд╡рд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреНрд░рд┐рдВрдЯрдл рдЬреИрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реЗ рд╕рд╛рде рд╕рд╣рдордд рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд┐рдВрдЯрдл рдорд╣рд╛рди рд╣реИред рдореИрдВрдиреЗ рдмрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓реЙрдЧрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ред
logger.h #define ENTRY __PRETTY_FUNCTION__ #define LOG_0(s) ; #define LOG_1(s) Log::note(ENTRY, s) #define LOG_2(s, p1) Log::note(ENTRY, s, p1) #define LOG_3(s, p1, p2) Log::note(ENTRY, s, p1, p2) #define LOG_4(s, p1, p2, p3) Log::note(ENTRY, s, p1, p2, p3) #define LOG_5(s, p1, p2, p3, p4) Log::note(ENTRY, s, p1, p2, p3, p4) #define LOG_X(x,s,p1,p2,p3,p4,FUNC, ...) FUNC #define LOG(...) LOG_X(,##__VA_ARGS__,\ LOG_5(__VA_ARGS__),\ LOG_4(__VA_ARGS__),\ LOG_3(__VA_ARGS__),\ LOG_2(__VA_ARGS__),\ LOG_1(__VA_ARGS__),\ LOG_0(__VA_ARGS__)\ )
LOG("Appication started, version: %s (%s)", VERSION, BUILD_TYPE);
рдЖрдЙрдЯрдкреБрдЯ:
[рдПрди] [рдЗрдВрдЯ рдореБрдЦреНрдп (рдЗрдВрдЯ, рдЪрд╛рд░ **)] рдореВрд▓реНрдпрд╛рдВрдХрди рд╢реБрд░реВ рдХрд┐рдпрд╛, рд╕рдВрд╕реНрдХрд░рдг: рез.реж.рей (RELEASE)
рдмрдВрдж
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рд╕рд╣реА рд╕реНрдЯреЙрдк рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдХреНрд╕рд░ рднреБрд▓рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдкрд╣рд▓реЗ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдореЗрдВ рдПрдХ рд╕рд╣реА рд╕реНрдЯреЙрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕рдВрднрд╡ рдХрд╛рдо рд╣реИред рдПрдХ рдФрд░ рдмрд╛рдд, рдпрджрд┐ рдЖрдк рд╢реБрд░реВ рд╕реЗ рд╣реА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рдгрдиреАрддрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рддреНрд░рд╛рд╕рджреА рдмрди рдЬрд╛рддреА рд╣реИред рдореИрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╕реНрдЯреЙрдк рдХрдорд╛рдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд╕рдПрдордПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рдЙрдкрдЧреНрд░рд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╖реНрдХреГрдд рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдмрд╕ рдХреБрдЫ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдореИрдВ рд╕рд╣реА рд╕реНрдЯреЙрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВред
void Mediator::wait_exit() { LOG("Set up waiting exit"); sigset_t set; int sig; sigemptyset(&set); sigaddset(&set, SIGINT); sigaddset(&set, SIGQUIT); sigaddset(&set, SIGTERM); sigaddset(&set, SIGTSTP); sigprocmask(SIG_BLOCK, &set, NULL); sigwait(&set, &sig); switch (sig) { case SIGINT: case SIGQUIT: case SIGTERM: case SIGTSTP: LOG("Catched signal to stopping application"); stop(); break; } }
рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд╡рд╣ рдореБрдЦреНрдп рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛_рдПрдХреНрд╕рд┐рдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ, рд╕рднреА рд╕рдХреНрд░рд┐рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рджред
LOG("Appication started, version: %s (%s)", VERSION, BUILD_TYPE); { Mediator mediator; mediator.start(); mediator.wait_exit(); } LOG("Applicatiom stopped");
рдЗрди рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЧрд▓рдд рдЙрдкрдпреЛрдЧ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдордЬреАрджреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛рдпрд┐рдд (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд) рдХрд┐рдпрд╛ рд╣реИред
рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд░рдЪрдирд╛
рддреЛ рд╣рдо рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ "рдордзреНрдпрд╕реНрде" рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдмреЗрд╢рдХ, рдЗрд╕рдХреЗ рд╕рднреА рдорд╣рд┐рдорд╛ рдореЗрдВ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрднреА рддрдХ рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИред
class Mediator: public Thread { public: Mediator(); virtual ~Mediator(); void wait_exit(); private: virtual void run(); void load_app_configuration(); void create_pid(); private: Pid pid_; };
рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЛ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдРрд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдереНрд░реЗрдб рд╕реЗ рдЕрд▓рдЧ рд╡рд░реНрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
class Thread { public: void start() {th_ = boost::thread(boost::bind(&Thread::run, this));} void stop() {th_.interrupt(); th_.join();} virtual ~Thread(){} private: virtual void run() = 0; private: boost::thread th_; };
рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕рд┐рдВрдЧрд▓ рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯ рдФрд░ рд╕реНрдЯреЙрдк рдкреНрд░реЛрд╕реЗрд╕ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╣реИред
рдХреЛрд╖
рдкрд░рд┐рдпреЛрдЬрдирд╛ Google рдХреЛрдб рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд▓рд╛рд▓рдЪреА рд╣реВрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╕рднреА рдХреЗ рд▓рд┐рдП рдкрд╣реБрдВрдЪ рдХреИрд╕реЗ рдЦреЛрд▓реЗрдВред рдпрджрд┐ рдЖрдк рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдирд╛ рдЬреА-рдИрдореЗрд▓ рд▓рд┐рдЦреЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред
svn checkout http://project-null.googlecode.com/svn/trunk/ project-null-read-only
рдХреБрдЫ рд╢рдмреНрдж ...
рдЗрд╕ рдЕрдиреБрднрд╡ рдХреЛ рдПрдХ рдареЛрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд▓рдЧрднрдЧ рджреЛ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдЖрдпрд╛ рдерд╛, рдЕрдЧрд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЬрд┐рд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдФрд░ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓реЗрдЦрди рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рдЗрд╕ рдирддреАрдЬреЗ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдорд┐рд▓реА рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рд╣рд░ рдмрд╛рд░ рд╕рднреА рдиреБрдХрд╕рд╛рдиреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрд╕реА рд╕рдорд╛рдзрд╛рди рдкрд░ рдЖрддреЗ рд╣реИрдВ рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛, рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореБрдЭреЗ рдкреАрдбрд╝рд╛ рд╣реБрдИ, рд▓реЗрдХрд┐рди рд╢рд┐рдХреНрд╖рдХ рдФрд░ рдПрдХ рдЧрд┐рд▓рд╛рд╕ рдкрд╛рдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреГрд╖реНрдЯрд╛рдВрдд рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд╣рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рд▓реЗрдЦ рдПрдХ рдкреИрд╕реЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕рдХреА рд╕рд▓рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдкреБрдирд╢реНрдЪред рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдкреАрдЖрдИрдбреА тАЛтАЛрдлрд╝рд╛рдЗрд▓ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЪреЗрдХ рдЬреЛрдбрд╝реЗред рдорд╛рдорд▓реЛрдВ рдХреЛ рдПрдХ рдкреАрдЖрдИрдбреА тАЛтАЛрдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ, рдкреАрдЖрдИрдбреА тАЛтАЛрдлрд╝рд╛рдЗрд▓ рдЦрд╛рд▓реА рд╣реИред