Виртуализация на уровне ОС. Теория и практика LXC Александр Руденко $ sudo apt-add-repository -y ppa:ubuntu-lxc/daily $ sudo apt-get update --quiet $ sudo apt-get install lxc $ sudo lxc-create -t ubuntu -n u-001 $ sudo lxc-start -n u-001 –d $ sudo lxc-console -n u-001 $ sudo lxc-attach -n u-001 $ sudo lxc-info -n u-001 или lxc-ls –fancy $ sudo ssh ubuntu@IP-из-lxc-info lxc-stop -n <имяКонтейнера> $ sudo lxc-freeze -n <имяКонтейнера> $ sudo apt-get install yum rpm $ sudo lxc-create -t ubuntu -n u001 -B Btrfs $ sudo Btrfs subvolume list /var/lib/lxc $ sudo lxc-create -t ubuntu -n u001 -B lvm --vgname <имяГруппыТомов> --fssize 5G --fstype <типФайловойСистемы> $ sudo lxc-snapshot -n u001 $ sudo lxc-snapshot -n u001 –L $ sudo lxc-snapshot -n u001 -r snap0 $ sudo lxc-snapshot -n u001 -r snap0 u002 $ sudo lxc-clone -o <существующийКонт.> -n <новыйКонт.> -B Btrfs $ sudo lxc-clone -o u001 -n u001-test -B overlayfs –s $ sudo Btrfs subvolume list /var/lib/lxc vi /etc/network/interfaces # мост для lxc auto br0 #имя моста и режим запуска iface br0 inet static bridge_ports eth0 # имя физического интерфейса «трубы» bridge_fd 0 address 192.168.5.10 netmask 255.255.255.0 gateway 192.168.5.1 dns-nameservers 192.168.5.11 # sudo vi /var/lib/lxc/<имяКонтейнера>/config # Тип сети lxc.network.type = veth # Сеть активна (up) или нет (down) lxc.network.link = br0 # Имя сетевого адаптера внутри контейнера lxc.network.name = eth0 # Имя сетевого адаптера для этого контейнера на хостовой # машине lxc.network.veth.pair = veth-u001 # IP-адрес контейнера lxc.network.ipv4 = 192.168.5.15/24 # Шлюз контейнера lxc.network.ipv4.gateway = 192.168.5.1 # mac-адрес адаптера lxc.network.hwaddr = 00:16:3e:81:27:8e $ sudo cd /proc/8897/root lxc-info –n <имяКонтейнера> $sudo vi /var/lib/lxc/<имяКонтейнера>/fstab /var/store var/store none bind,create=dir lxc.cgroup.memory.limit_in_bytes = 512M. # так можно ограничить контейнер одним, первым по счету ядром lxc.cgroup.cpuset.cpus = 0 # так будут выделены первое и второе ядра lxc.cgroup.cpuset.cpus = 0,1 # а так можно задать три ядра lxc.cgroup.cpuset.cpus = 0-2 # это для VM1 lxc.cgroup.cpu.shares = 512 # это для VM2 (1024 используется по умолчанию) lxc.cgroup.cpu.shares = 1024 # для VM1 lxc.cgroup.blkio.weight = 500 # для VM2 (это максимальное значение) lxc.cgroup.blkio.weight = 1000 ----------------------------------------------------------------------------------------------------------------- Установка Redmine и интеграция его с SVN Рашид Ачилов # mysql -u root -p # Enter password: # CREATE DATABASE redmine CHARACTER SET utf8; # CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password'; # GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost'; production: adapter: mysql2 database: redmine host: localhost username: root password: "my_password" encoding: utf8 # bundle install –without development test # rake generate_secret_token # env RAILS_ENV=production rake db:migrate # env RAILS_ENV=production rake redmine:load_default_data # ruby script/rails server webrick -e production production: email_delivery: delivery_method: :sendmail scm_subversion_command: /usr/local/bin/svn scm_mercurial_command: scm_git_command: scm_cvs_command: /usr/bin/cvs scm_bazaar_command: scm_darcs_command: config.time_zone = 'Novosibirsk' config.i18n.default_locale = :ru #Logger.new(PATH,NUM_FILES_TO_ROTATE,FILE_SIZE) config.logger = Logger.new('/var/log/production.log', 2, 1000000) config.logger.level = Logger::INFO # Пути, указанные passenger-install-apache2-module LoadModule passenger_module /usr/local/lib/ruby/gems/1.9/gems/passenger-4.0.29/buildout/apache2/mod_passenger.so PassengerRoot /usr/local/lib/ruby/gems/1.9/gems/passenger-4.0.29 PassengerDefaultRuby /usr/local/bin/ruby19 # Удалить некоторые HTTP-заголовки Header always unset "X-Powered-By" Header always unset "X-Rack-Cache" Header always unset "X-Content-Digest" Header always unset "X-Runtime" # Настройки Passenger PassengerMaxPoolSize 20 PassengerMaxInstancesPerApp 4 PassengerPoolIdleTime 3600 PassengerHighPerformance on PassengerStatThrottleRate 10 PassengerMaxPreloaderIdleTime 0 PassengerLogLevel 0 PassengerDebugLogFile /var/log/httpd/passenger RailsSpawnMethod smart RailsAppSpawnerIdleTime 86400 # Имя сервера ServerName redmine.deltahw.ru:80 LoadModule fcgid_module /usr/local/libexec/apache22/mod_fcgid.so # Использовать FastCGI для .fcg .fcgi & .fpl скриптов AddHandler fcgid-script fcg fcgi fpl FcgidIPCDir /var/run/mod_fcgid FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm Listen *:3000 ServerName redmine.deltahw.ru ServerAdmin rootp@deltahw.ru CustomLog /var/log/http/redmine/access common ErrorLog /var/log/http/redmine/httpd DocumentRoot /usr/local/www/vhosts/redmine/public/ # Если вы используете mod_fcgid и хотите загружать файлы объемом больше, чем 131072 байта, настройте параметр соответствующим образом # Данное значение позволяет загрузить файлы до 20 Мб MaxRequestLen 20971520 RailsEnv production Options Indexes ExecCGI FollowSymLinks Order deny,allow Deny from all Allow from 127.0.0.1 Allow from 170.70.70.1 Allow from 10.54.2.0/255.255.255.0 AllowOverride all # pip install -U redmine-auth # redmine-auth -g test.cfg import redmineauth DB_CONFIG = { "dbn" : "mysql", "host" : "127.0.0.1", "port" : 3306, "user" : "redmine", "pw" : "redpwd", "db" : "redmine_msk", } def check_password(environ, user, password): return redmineauth.check_password(DB_CONFIG, user, password) LoadModule wsgi_module /usr/local/libexec/apache22/mod_wsgi.so AuthType Basic AuthName "Redmine SVN repositories access" AuthBasicProvider wsgi WSGIAuthUserScript /etc/httpd/wsgi-auth.conf /usr/local/bin/wget -o /tmp/file1 "http://redm.deltahw.ru/sys/fetch_changesets?key=" /usr/local/www/vhosts/redmine/extra/svn/reposman.rb --redmine redmi.deltahw.ru --key=6DPMel7XfQgrsmdZuLfb --svn-dir /usr/local/share/svnroot --owner nobody --group www --url http://svn.deltahw.ru/svn-private/ ----------------------------------------------------------------------------------------------------------------- Запускаем внутренний чат Игорь Решетов security.provider.10=net.za.darkskies.security.sasl.SSPIProvider security.provider.1=sun.security.provider.Sun security.provider.2=sun.security.rsa.SunRsaSign security.provider.3=com.sun.net.ssl.internal.ssl.Provider security.provider.4=com.sun.crypto.provider.SunJCE security.provider.5=sun.security.jgss.SunProvider security.provider.6=com.sun.security.sasl.Provider security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI security.provider.8=sun.security.smartcardio.SunPCSC security.provider.9=sun.security.mscapi.SunMSCAPI ----------------------------------------------------------------------------------------------------------------- Сканер уязвимости OpenVAS Сергей Яремчук # apt-get dist-upgrade # apt-get upgrade # apt-get install openssh-server # gpg --homedir=/usr/local/etc/openvas/gnupg --delete-secret-keys 94094F5B # gpg --homedir=/usr/local/etc/openvas/gnupg --delete-keys 94094F5B # openvasmd --create-credentials-encryption-key # /etc/init.d/openvas-manager restart # openvas-nvt-sync # openvas-scapdata-sync # openvas-certdata-sync # openvassd # openvasmd --rebuild # killall openvassd # /etc/init.d/openvas-scanner restart # /etc/init.d/openvas-manager restart # /etc/init.d/openvas-administrator restart # /etc/init.d/greenbone-security-assistant restart ----------------------------------------------------------------------------------------------------------------- AIX Security Expert, или Как настроить безопасность AIX в один клик Анна Лагутина ls -l /etc/security/aixpert Maximum age for password: Specifies the maximum number of weeks (13 weeks) that a password is valid bos.rte.date,bos.rte.commands, bos.rte.security,bos.rte.shell, bos.rte.ILS /etc/security/aixpert/bin/chusrattr maxage=52 ALL lls_maxage Password policy rules aixpert –l high –n –o / etc/security/aixpert/custom//high_security.xml aixpert –f / etc/security/aixpert/custom/high_security.xml # aixpert -l low # echo $? # cat /etc/security/aixpert/log/FAILEDRULES.log Prereq rule for binaudit: Checks whether auditing is running or not /etc/security/aixpert/bin/prereqbinaudit # aixpert -l low ----------------------------------------------------------------------------------------------------------------- «1С:Розница 8.2». Настройка скидок по дисконтным картам Дмитрий Андриенко Если ЗначениеЗаполнено(ЭтотОбъект.ДисконтнаяКарта) Тогда // Проверка, есть ли у карты Зависимость (Ремомендатель) Флаг = 0; СписокРег = РегистрыСведений.ют_ПривязкаПоРекомендации.Выбрать(); Сообщить("Динамическое обновление"); Пока СписокРег.Следующий() = 1 Цикл Сообщить("Владелец = "+СписокРег.Карта+" Новый = "+СписокРег.ТекКарта); Сообщить(ЭтотОбъект.ДисконтнаяКарта.Наименование+" = "+СписокРег.ТекКарта); Если СокрЛП(ЭтотОбъект.ДисконтнаяКарта.Наименование) = СокрЛП(СписокРег.ТекКарта) Тогда Флаг = 1; а = СписокРег.ТекКарта.Наименование; с = СписокРег.Карта; Сообщить("+++!! Владелец = "+СписокРег.Карта+" Новый = "+СписокРег.ТекКарта+" а = "+а+"Флаг = "+флаг); КонецЕсли КонецЦикла; // Если найден, определяем уровни и зависимые карты, записываем во временную таблицу Если Флаг=1 Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ют_ПривязкаПоРекомендации.Регистратор, | ют_ПривязкаПоРекомендации.НомерСтроки, | ют_ПривязкаПоРекомендации.Карта, | ют_ПривязкаПоРекомендации.ТекКарта |ИЗ | РегистрСведений.ют_ПривязкаПоРекомендации КАК ют_ПривязкаПоРекомендации"; Результат = Запрос.Выполнить(); РегСтр2 = Результат.Выгрузить(); Отбор = Новый Структура(); ТабУровни = Новый ТаблицаЗначений; ТабУровни.Колонки.Добавить("Карта"); ТабУровни.Колонки.Добавить("Уровень"); Сообщить("Флаг = 1 б = "+с); сч = 1; Пока ЗначениеЗаполнено(с) Цикл Сообщить("ЗначениеЗаполнено = "+с); Стр = ТабУровни.Добавить(); Стр.Карта = с; Стр.Уровень = сч; Сч = сч + 1; Отбор.Очистить(); Отбор.Вставить("ТекКарта", с); Рез = РегСтр2.НайтиСтроки(Отбор); Если рез.Количество()>0 тогда с = Рез[0].Карта; Сообщить("с = "+с); а = с; Иначе с = Null; КонецЕсли КонецЦикла; //Расчет процентов и запись в регистр накоплений Отбор2 = Новый Структура(); СпрПр = Справочники.ют_ПроцентПоРекомендации; РегНак = РегистрыНакопления.ПродажиПоДисконтнымКартам; Движения.ют_ПроцентСРекомендаций.Записывать = Истина; Движения.ют_ПроцентСРекомендаций.Очистить(); Для Каждого стр1 Из ТабУровни Цикл Элем = СпрПр.НайтиПоРеквизиту("Уровень", стр1.Уровень); Сумма = Элем.Процент * ↵ ЭтотОбъект.СуммаДокумента / 100; Сообщить("Процент= "+стр1.Карта+" Уровень = "+стр1.Уровень+" Сумма "+ЭтотОбъект.СуммаДокумента+" Проц = "+Элем.Процент+" Сумма = "+сумма); Движения.ПродажиПоДисконтнымКартам.Записывать = Истина; Движение = Движения.ПродажиПоДисконтнымКартам.Добавить(); Движение.Период = Дата; Движение.ДисконтнаяКарта = стр1.Карта; Движение.Сумма = Сумма; КонецЦикла; КонецЕсли; КонецЕсли; ----------------------------------------------------------------------------------------------------------------- Праздничные котята от VK.com. kPHP – PHP со скоростью C++ Александр Календарев sudo apt-get install libzip-dev sudo apt-get install libssl-dev $cd 'kPHP-kdb/re2 $make $sudo make install make kPHP $objs/bin/kPHP2cpp $objs/bin/kPHP2cpp -I/test -d/test/output test.php $export kPHP_PATH=`pwd`/../../ $python2 kPHP.py test.php $./test $ python2 kPHP.py python2 kPHP.py -n kPHPt/test.php $ ./test -h ./test -H 8080 ----------------------------------------------------------------------------------------------------------------- CSS-препроцессоры – решение проблем стиля Кирилл Сухов #header { h1 { font-size: 26px; font-weight: bold; } p { font-size: 12px; a { text-decoration: none; &:hover { border-width: 1px } } } } #header { color: black; .navigation { font-size: 12px } .logo { width: 300px; &:hover { text-decoration: none } } } @main-color: #5B83AD; @light-color: (@ main-color + #111); #header { color: @ main-color; } #messageBox { color: @light-color; } @var: #CCCCCC; .class1 { @var: #000000; .class { @var: #FF0000; color: @var; @var: #0000FF; } color: @var; } .messageBox{ color: @var; } @myfont: Helvetica, Arial; @var: 'myfont'; h1 { font-family: @@var; } .messageBox{ @var: 3px; border:@var solid #00ff00; padding: @var * 3; margin: @var + 20; } @color: #5B83AD; div { color: @color; } div button { background: @color + #222222; border: 2px solid @color - #111111; }} #header { color: @color; border-color: desaturate(@color, 10%); } @base: #f04615; @width: 0.5; div { width: percentage(0.5); // returns `50%` color: saturate(@base, 5%); background-color: spin(lighten(@base, 25%), 8); } .messageBox{ -webkit-border-radius: 5px; -moz-border-radius: 5px; -o-border-radius: 5px; } .articleBox{ -webkit-border-radius: 5px; -moz-border-radius: 5px; -o-border-radius: 5px; } .rounded { -webkit-border-radius: 5px; -moz-border-radius: 5px; -o-border-radius: 5px; } .messageBox { .rounded; } .articleBox { .rounded; } .rounded(@r:5px) { -webkit-border-radius: @r; -moz-border-radius: @r; -o-border-radius: @r; } .messageBox { .rounded; } .articleBox { .rounded(3px); } .myborder(@width: 1px, @color: #000000){ border:@arguments; } div { .myborder(2px); } botton { .myborder( 1px,#FF0000) } @link-color: #428bca; .link { color: @link-color; } a:extend(.link) { font-weight: bold; } $ npm install less var less = require('less'); less.render('.class { width: (1 + 1) }', function (e, css) { console.log(css); }); $ node less.js @link-color: #428bca; .link { color: @link-color; } a:extend(.link) { font-weight: bold; } a { &:extend(.link); font-weight: bold; } var less = require('less'); fs = require('fs'); var template = "style.less"; var str = fs.readFileSync(template, 'utf8'); var parser = new(less.Parser)({ paths: ['.', './less'], filename: 'style.less' }); parser.parse(str, function (error, tree) { if (error) { console.log(error); } else { var cssMin = tree.toCSS({ compress: true }); console.log(cssMin); } }); C:\Users\Geol\node\less>node less.js { selectors: null, rules: [ { name: '@link-color', value: [Object], important: '', merge: undefined, index: 0, currentFileInfo: [Object], inline: false, variable: true }, { selectors: [Object], rules: [Object], _lookups: {}, strictImports: undefined }, { selectors: [Object], rules: [Object], _lookups: {}, strictImports: undefined }, { selectors: [Object], rules: [Object], _lookups: {}, strictImports: undefined } ], _lookups: {}, strictImports: undefined, root: true, firstRoot: true, toCSS: [Function] } body { font: 12px Helvetica, Arial, sans-serif; } a.button { -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } body font 12px Helvetica, Arial, sans-serif a.button -webkit-border-radius 5px -moz-border-radius 5px border-radius 5px textarea input background-color #fff &:hover background-color cyan /* This is Nested */ body padding 40px p text-align center text-decoration underline font-size 40px > a color blue &:hover color red -webkit-border-radius 5px -moz-border-radius 5px border-radius 5px border-radius() -webkit-border-radius arguments -moz-border-radius arguments border-radius arguments body font 12px Helvetica, Arial, sans-serif a.button border-radius 5px border-radius(n=5px) -webkit-border-radius n -moz-border-radius n border-radius n .messagebox border-radius() .button border-radius(3px) fonts = helvetica, arial, sans-serif body font 12px fonts p.tip font 10px fonts borderWith = 2px boxBorder = borderWith solid #FFCC00 div border boxBorder .Box width: w = 150px height: h = 80px margin-left: -(w / 2) margin-top: -(h / 2) .Box width: 150px height: 80px margin-left: -(@width / 2) margin-top: -(@height / 2) position() position: arguments z-index: 1 unless @z-index .Box1 z-index: 20 position: absolute .Box2 position: absolute invmargin(n) margin (- n) .messageBox invmargin(5px) add(a, b) a + b times(a, b) a * b .messageBox width: add(150px, 20) height: add(80px,20) margin-top: times(@height, 0.1) margins(n) n*15px n*10px n*15px n*10px .messageBox margin: margins(1) .alertBox margin-right: margins(2)[0] add(a, b) a + b times(a = 2, b = add(a,4)) a * b .messageBox margin-top: times(4) margin-left: times(4,2) margin-right: times() subtract(a, b) a - b .messageBox margin: subtract(b: 10, a: 25) compare(a, b) if a > b higher else if a < b lower else equal $ npm install stylus body font 12px Arial, sans-serif div.message_box -webkit-border-radius 5px -moz-border-radius 5px border-radius 5px var stylus = require('stylus'); fs = require('fs'); var template = "my.styl"; var str = fs.readFileSync(template, 'utf8'); stylus.render(str, function(err, css){ if (err) throw err; console.log(css); }); C:\Users\Geol\node\stylus>node stylus // Define a mixin border-radius() -webkit-border-radius arguments -moz-border-radius arguments border-radius arguments body padding 40px p text-align center text-decoration underline font-size 40px background blue color white border-radius 10 ----------------------------------------------------------------------------------------------------------------- Анимированная капча с использованием жестов рук Артем Шумилов; Андрей Филиппович this.rotateV = function(angle, idx) { idx = idx || 0; varrMatrix = new THREE.Matrix4(); if (idx == 0) { vMatrix.makeRotationAxis(hAxis, angle * Math.PI / 180); rMatrix.multiplyMatrices(hMatrix, vMatrix); }else { vartempMatrix = new THREE.Matrix4(); tempMatrix.makeRotationAxis(hAxis, angle * Math.PI / 180); rMatrix.multiplyMatrices(hMatrix, tempMatrix); } bones[idx].setRotationFromMatrix(rMatrix); }; -----------------------------------------------------------------------------------------------------------------