Новые возможности PowerShell 5.0 Сергей Яремчук PS > Get-HotFix -Id KB2883200 PS > Get-Command -Module PowerShellGet PS > Find-Module xPSDesiredStateConfiguration PS > Install-Module xPSDesiredStateConfiguration PS > Get-Command -Module OneGet PS > Find-Package -Name net PS > Find-Package antivirus PS > Install-Package -Verbose DotNet4.5.1 PS > Get-Command -Module NetworkSwitch PS> $ip = "192.168.0.2" PS> $sessionOption = New-CimSessionOption -UseSsl -SkipCACheck -SkipCNCheck -SkipRevocationCheck PS> $s = New-CimSession -CN $ip -port 1234 -Auth Basic -Credential admin -SessionOption $sessionOption PS> Get-NetworkSwitchFeature -CimSession $s PS> Get-NetworkSwitchEthernetPort -CimSession $s | Format-Table InstanceID, ElementName, MaxSpeed, PortNumber, EnabledState PS> Disable-NetworkSwitchEthernetPort -PortNumber 1 -CimSession $s PS>Get-NetworkSwitchEthernetPort -PortNumber 1 -CimSession $s | FT InstanceID, ElementName, MaxSpeed, PortNumber, EnabledState ----------------------------------------------------------------------------------------------------------------- Устанавливаем Request Tracker Рашид Ачилов make fixdeps cpan[1]> o conf init /proxy/ cpan[2]> o conf commit # yum install gd # yum install libjpeg-turbo-devel libpng-devel freetype freetype-devel fontconfig fontconfig-devel # sudo rpm -Uvh http://elgis.argeo.org/repos/6/elgis-release-6-6_0.noarch.rpm # yum install libtiff4 # Database connection Set($DatabaseType, "mysql"); Set($DatabaseHost, "localhost"); Set($DatabaseUser, "rtracker"); Set($DatabasePassword, q{rtcoolpa$$w0rd}); Set($DatabaseName, q{rtracker}); Set($DatabaseAdmin, "root"); # Base configuration Set($rtname, "rtracker.shelton.int"); Set($Organization, "shelton.int"); Set($CorrespondAddress, "rtracker"); Set($CommentAddress, ''); Set($WebDomain, "rtracker.shelton.int"); Set($WebPath, ""); Set($WebBaseURL , "http://rtracker.shelton.int"); Set($Timezone, "Asia/Novosibirsk"); Set(@StaticRoots, ()); # Misc settings Set($AutoCreate, { Privileged => 1, }); Set($AutoCreateNonExternalUsers, 1); Set($WebDefaultStylesheet, "aileron"); Set($LogoURL, "http://www.sheltonsoft.ru/images/my_logo.png"); Set($LogoLinkURL, "http://sheltonsoft.ru"); Set($LogoAltText, "SheltonSoft LLC corporate logo"); Set($LogoImageHeight, 100); # Mail settings Set($SetOutgoingMailFrom, 1); Set($FriendlyFromLineFormat, "\"Заявки: %s\" <%s>"); # Authentication with Active Directory Set( @Plugins, qw(RT::Authen::ExternalAuth) ); Set($ExternalAuthPriority, [ 'My_LDAP' ]); Set($ExternalInfoPriority, [ 'My_LDAP' ]); Set($ExternalServiceUsesSSLorTLS, 0); Set($ExternalSettings, { 'My_LDAP' => { 'server' => '10.54.200.4', 'user' => 'ldap@SHELTON.NET', 'pass' => 'Qwerty123', 'base' => 'dc=shelton,dc=net', 'filter' => '(sAMAccountType=805306368)', 'd_filter' => '(&(sAMAccountType=805306368)(userAccountControl: 1.2.840.113556.1.4.803:=2))', 'tls' => 0, 'ssl_version' => 3, 'net_ldap_args' => [ version => 3, referrals => 0 ], 'group' => '', 'group_attr' => '', 'attr_match_list' => [ 'Name', 'EmailAddress', ], 'attr_map' => { 'Name' => 'sAMAccountName', 'EmailAddress' => 'mail', 'Organization' => 'company', 'RealName' => 'displayName', 'ExternalAuthId' => 'sAMAccountName', 'Gecos' => 'displayName', 'WorkPhone' => 'telephoneNumber', 'HomePhone' => 'homePhone', 'MobilePhone' => 'mobile', 'Address1' => 'streetAddress', 'Address2' => 'street', 'Comments' => 'description', 'City' => 'l', 'State' => 'st', 'Zip' => 'postalCode', 'Country' => 'co' } }, } ); sd: "|/opt/rt4/bin/rt-mailgate --queue General --action correspond --url http://rtracker.shelton.int/" # rpm --import http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6 # rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm # yum install mod_fcgid LoadModule fcgid_module /usr/lib64/httpd/modules/mod_fcgid.so # Use FastCGI to process .fcg .fcgi & .fpl scripts AddHandler fcgid-script fcg fcgi fpl # Sane place to put sockets and shared memory file FcgidIPCDir /var/run/mod_fcgid FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm FcgidMaxRequestLen 1073741824 ErrorLog /var/log/httpd/rtracker/httpd CustomLog /var/log/httpd/rtracker/access common LogLevel info AddDefaultCharset UTF-8 ScriptAlias / /opt/rt4/sbin/rt-server.fcgi/ DocumentRoot "/opt/rt4/share/html" Order allow,deny Allow from all Options +ExecCGI AddHandler fcgid-script fcgi ----------------------------------------------------------------------------------------------------------------- Установка и настройка Foreman. Знакомство с новым поколением Red Hat Network Денис Силаков # rpm -Uvh http://download.fedoraproject.org/pub/epel/5/i386/epel-release-6-8.noarch.rpm # yum-config-manager --enable rhel-6-server-optional-rpms rhel-server-rhscl-6-rpms # yum -y install http://yum.theforeman.org/releases/1.5/el6/x86_64/foreman-release.rpm # yum -y install foreman-installer # foreman-installer ----------------------------------------------------------------------------------------------------------------- Миграция пользовательских данных с помощью SCCM 2012 SP1 Сергей Болдин usmtutils.exe /verify d:\Migration\migration.mig scanstate.exe \\serv03\SCCM\XML /i:migapp.xml /i:migdocs.xml /o /nocompress loadstate.exe \\serv03\SCCM\XML /i:migapp.xml /i:migdocs.xml /v:13 scanstate.exe /genconfig:config.xml /i:migdocs.xml /i:migapp.xml ----------------------------------------------------------------------------------------------------------------- Сервис удаленного тестирования. Удаленный рабочий стол и Linux-консоль в окне браузера Максим Клецкин rdp 192.168.203.2 21122 Ke6jaicha drweb\user rdp 192.168.203.2 21120 Ke6jaicha drweb\user rdp 192.168.203.2 21150 Ke6jaicha drweb\user rdp 192.168.203.2 21125 Ke6jaicha drweb\user rdp 192.168.203.2 21123 Ke6jaicha drweb\user function login($url,$login,$pass){ $ch = curl_init(); // если соединяемся с https if(strtolower((substr($url,0,5))=='https')) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); } curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "username=".$login."&password=".$pass); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0(Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4"); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); $result=explode ("\n",$result); return $result['4']; } if (codepoint >= 0x0100 && codepoint <= 0x10FFFF) //return 0x01000000 | codepoint; return codepoint; /* j */ { .keysym = 0x006a, .scancode = 0x24, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 0x043E, .scancode = 0x24, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, /* k */ { .keysym = 0x006b, .scancode = 0x25, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 0x043B, .scancode = 0x25, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, ServerAdmin webmaster@localhost AddDefaultCharset UTF-8 DocumentRoot /usr/local/www/apache22/data/ RewriteLogLevel 1 RewriteLog "/var/log/apache2/rewrite.log" Options FollowSymLinks AllowOverride None Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all DirectoryIndex index.php index.html ProxyRequests off Proxyvia on # Pass for Guac Proxypass /user6/rdp http://127.0.0.1:8080/user6 ProxyPassReverse /user6/rdp http://127.0.0.1:8080/user6 Proxypass /user2/rdp http://127.0.0.1:8080/user2 ProxyPassReverse /user2/rdp http://127.0.0.1:8080/user2 Proxypass /user3/rdp http://127.0.0.1:8080/user3 ProxyPassReverse /user3/rdp http://127.0.0.1:8080/user3 Proxypass /user4/rdp http://127.0.0.1:8080/user4 ProxyPassReverse /user4/rdp http://127.0.0.1:8080/user4 Proxypass /user5/rdp http://127.0.0.1:8080/user5 ProxyPassReverse /user5/rdp http://127.0.0.1:8080/user5 Proxypass /user7/rdp http://127.0.0.1:8080/user7 ProxyPassReverse /user7/rdp http://127.0.0.1:8080/user7 Proxypass /user8/rdp http://127.0.0.1:8080/user8 ProxyPassReverse /user8/rdp http://127.0.0.1:8080/user8 Proxypass /user9/rdp http://127.0.0.1:8080/user9 ProxyPassReverse /user9/rdp http://127.0.0.1:8080/user9 Order deny,allow Allow from all #SSH proxy for user2 Proxypass "/user2/Linux CentOS 6 Internet Gateway/ssh" http://192.168.203.2:4200/ ProxyPassReverse "/user2/Linux CentOS 6 Internet Gateway/ssh" http://192.168.203.2:4200/ Proxypass "/user2/Office Shield/ssh" http://192.168.203.2:21193/ ProxyPassReverse "/user2/Office Shield/ssh" http://192.168.2032:21193/ Proxypass "/user2/Linux CentOS 6 server/ssh" http://192.168.203.2:21192/ ProxyPassReverse "/user2/Linux CentOS 6 server/ssh" http://192.168.203.2:21192/ <…> ProxyPreserveHost On ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, # error, crit, alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined ----------------------------------------------------------------------------------------------------------------- Настройка SRTP и TLS/SSL в Asterisk Сергей Яремчук tcpenable=yes tcpbindaddr=0.0.0.0 tlscertfile=/etc/asterisk/cert/asterisk.pem tlscafile=/etc/asterisk/cert/ca.crt tlsprivatekey=/var/lib/asterisk/keys/example.org.key tlsclientmethod=tlsv1 $ openssl s_client host localhost port 5061 transport=tls encryption=yes CLI> module show like res_srtp.so ----------------------------------------------------------------------------------------------------------------- Grunt – The JavaScript Task Runner Кирилл Сухов $ npm install grunt -g $ npm install grunt-cli -g $ grunt –version { "author" : "Geol", "name" : "myProject", "version" : "0.0.1", "devDependencies" : { "grunt" : ">= 0.4", "grunt-cli" : ">= 0.1.6", "grunt-contrib-cssmin" : ">=0.5.0", "grunt-contrib-uglify" : ">=0.2.0", "grunt-contrib-concat" : ">=0.1.3", "grunt-contrib-jshint" : "~0.10.0", "grunt-contrib-watch" : "*" } } $ npm install module.exports = function(grunt) { grunt.initConfig( jshint: {}, concat: {}, uglify: {}, ............ }); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); .............. grunt.registerTask('default', ['jshint', 'concat', 'uglify',...]); }; $ grunt jshint: { all: [ 'Gruntfile.js', 'index.js', 'main.js', 'app/*.js'] }, $ grunt jshint if (x = 2) { } concat: { main: { src: [ 'lib/*.js', 'app/*.js', 'index.js' 'main.js ], dest: 'scripts.js' } }, $ grunt concat uglify: { main: { files: { 'scripts.min.js': 'scripts.js' } } } $ grunt uglify uglify: { main: { files: { 'scripts.min.js': '<%= concat.main.dest %>' } } } $ grunt foo: { options: { .... }, block1: { …. }, block2: { src: [ .... ], dest: 'someScripts.js' } } concat: { options: { separator: ';' }, libs/*.js //все файлы с расширением .js из из папки libs app/**/*.js //все файлы с расширением .js из из папки app и подпапок любой вложенности concat: { src: [ '*.js', '*.css' ] } jshint: { all: ['*.js', 'app/*.js'] }, concat: { main: { src: [ '*.js', 'app/*.js', ], dest: 'scripts.js' } }, $ npm install grunt-contrib-imagemin "grunt-contrib-imagemin": "^0.7.1" grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-imagemin'); imagemin: { dynamic: { files: [{ expand: true, cwd: 'images/', src: ['**/*.{png,jpg,gif}'], dest: 'images/min/' }] } } $ grunt imagemin files: { 'dist/img.png': 'src/img.png', 'dist/img.jpg': 'src/img.jpg', 'dist/img.gif': 'src/img.gif' } npm install grunt-contrib-stylus --save-dev grunt.loadNpmTasks('grunt-contrib-imagemin'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-stylus'); .................................. grunt.registerTask('default'['jshint','concat','uglify','stylus']); stylus: { compile: { files: { 'css/main.css': 'stylus/main.styl', 'css/users.css': 'stylus/users.styl', 'css/bandsmain.css': 'stylus/bands.styl' } } } stylus: { compile: { files: { 'css/all.css': ['stylus/*.styl']; } } } $ npm install grunt-contrib-watch –save-dev "grunt-contrib-jshint": "~0.10.0", "grunt-contrib-watch": "^0.6.1" } } grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-watch'); concat: { main: { } } uglify: { main: { files: { ... } } }, watch: { scripts: { files: ['**/*.js'], tasks: ['concat', 'uglify'] } $ grunt watch watch: { scripts: { files: '**/*.js', tasks: ['generateFileManifest'], options: { event: ['added', 'deleted'], }, }, }, $ npm install grunt-contrib-connect --save-dev grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-connect'); connect: { testHost: { options: { port: 8000, hostname: '127.0.0.1', base: 'C:\Users\Geol\node\grunt', } } } $ grunt connect options: { port: 8000, hostname: '127.0.0.1', base: 'C:\Users\Geol\node\grunt', keepalive: true, } } } $ grunt connect ----------------------------------------------------------------------------------------------------------------- Очереди. Теория и практика. Часть 3. Сервер очередей Александр Календарев // открытие соединения $redis->connect('127.0.0.1', 6379); … //переводим объект в формат JSON $str_data = json_encode($data); // заносим данные в очередь $redis->lPush('photo_queue', $str_data); #include "credis.h" // включаем libcredis #include "jsmn.h" // включаем JSON парсер … // создаем соединение с redis REDIS rh = credis_connect(NULL, 6379, 2000); char *json = NULL; jsmntok_t tokens[8]; jsmn_parser parser; jsmn_init_parser(&parser); // инициализация JSON парсера … while (1) { // имеем бесконечный цикл опроса // извлекаем элемент из очереди credis_lpop(rh, "photo_queue", &json); // осуществляем разбор JSON строки int r = jsmn_parse(&parser, json, tokens, 256); int i; for (i=0; i < 4; i += 2){ if (strncmp(tokens[i].start, "url", 3 ) == 0){ … обработка элемента «url» } else if (strncmp(tokens[i].start, "desc", 4) == 0){ … обработка элемента «description» } else syslog(LOG_ERR,"JSON parse error: element %s ", tokens[i].start ); } // end for … // окончательная обработка данных и запись в БД } // end while credis_close(rh); return 0; $ redis-cli redis 127.0.0.1:6379> SUBSCRIBE messages $ redis-cli redis 127.0.0.1:6379> PUBLISH messages "Hello world!" // отправляем в очередь test данные $curl -X POST -d "value=foobar" http://localhost:8888/q/test $curl -X POST -d "value=foobar" http://localhost:8888/q/test // забираем данные из очереди test $curl http://localhost:8888/q/test { "count": 0, "value":"foobar", "key":"test:1" } $curl http://localhost:8888/stats/test array(SQL_INC_PHOTO, SQL_INC_AUTHOR), 'photo_id' => $photo_id, 'author_id' => $author_id, 'category_id' => $category_id ); $json_data = json_encode($data); //кладем данные в очередь $mc->set('sql_queue', $json_data, 0, 0); exec($sql); } function exec_inc_auhor( $id){ $sql = sprint('UPDATE author SET show = show+1 ↵ WHERE id=%d', $id); db::getInstance()->exec($sql); } … // открываем соединение с сервером $mc = memcache_connect('host', 21201); while ($is_finish) { // берем данные из очереди $json_data = $mc->get('sql_queue'); if ($json_data == NULL){ usleep(5000); // если данных нет, то ненадолго засыпаем continue; } // преобразуем JSON строку в массив $data = json_decode($json_data, 1); foreach( $data['sql_type'] as $type) { switch ( $type ) { case SQL_INC_PHOTO : exec_inc_photh( $data['photo_id'] ); break; case SQL_INC_AUTHOR : exec_inc_author( $data['author_id'] ); break; … default: syslog( LOG_ERR, "undefined sql type %d", $type); } } } mc->close($memcache_obj); // закрываем соединение с сервером db::getInstance()->close(); CONNECT login: passcode: ^@ SEND destination:/queue/sql {"type":1, "user_id":338750349, "category_id:13", "name":"Дорога в никуда"} ^@ SUBSCRIBE destination: /queue/sql ack: client ^@ UNSUBSCRIBE destination: /queue/sql ^@ MESSAGE subscription:sub-3 message-id:wm2si1tj-4 content-type: application/json destination:/queue/sql {"type":1, "user_id":338750349, "category_id:13", "name":"Дорога в никуда"} ^@ connect(); // открываем соединение $channel = new AMQPChannel($amqp); // открываем канал, на одном сокете можно открыть несколько каналов $ex = new AMQPExchange($сhannel); // объявляем класс точки обмена $ex->setType(AMQP_EX_TYPE_FANOUT); // задаем тип точки обмена fanout $ex->setName('amqp.fanout'); // задаем имя точки обмена $ex->declare(); // объявляем точку обмена, делается один раз и она активна, пока ее не удалим командой delete $queue = new AMQPQueue($channel); // объявляем класс очереди $queue->setName('my_messages'); // задаем имя очереди $queue->setFlags(AMQP_DURABLE); // задаем свойство очереди (прочная) $queue->declare(); // объявляем очередь, делается один раз и она активна, пока ее не удалим командой delete $queue->bind('amq.fanout', null); // привязываем очередь к точке обмена // $exchange->bind('amq.fanout', null); или, наоборот, точку обмена к очереди $amqp->disconnect(); // закрываем соединение connect(); // открываем соединение $channel = new AMQPChannel($amqp); // открываем канал // объявляем класс точки обмена $exchange = new AMQPExchange($сhannel); // публикуем сообщение // так как у нас обмен fanout, то ключ не нужен $exchange->publish('Hello Word!', null); // закрываем соединение $amqp->disconnect(); setName('my_messages'); //задаем имя // принимаем накопленные сообщения while($msg = $queue->get()!= NULL){ print_r($msg); // обрабатываем их $data = $msg->getBody(); // получаем тело сообщения } $amqp->disconnect(); // закрываем соединение setName('my_messages'); //задаем имя // функция callback обработчик сообщения, function processMessage($message, $queue) { echo $message->getBody(), PHP_EOL; } $queue->consume("processMessage"); "photo_add", // формируем JSON "data" => array("id" => $photo_id)); $queue ->useTube('mytube') // используем трубу mytube ->put(json_encode($job)); // кладем в нее задачу job // изъять задачу из очереди, делается в отдельном процессе создаем класс наш исполнитель $worker = new Worker($config); $queue->watch("mytube"); // наш класс наблюдает за трубой // как только в трубе появится задача, она изымается и выполняется while($job = $queue->reserve()) { // получение объекта из JSON $received = json_decode($job->getData(), true); // получение значения action $action = $received['action']; … $worker->$action($data); // выполнение метода action … // проверка результата выполнения if ($worker->result== ) $queue->delete($job); // удаление задачи из очереди else // считать задачу не выполненной $queue->bury($job); } ----------------------------------------------------------------------------------------------------------------- Использование API Яндекс.Метрика Ирина Чернова https://oauth.yandex.ru/authorize?response_type=token&client_id= $acess_token=740bc62844ff447fabdecdbf88c21b1c; http://api-metrika.yandex.ru/stat/traffic/summary.json?id=21898531&pretty=1&oauth_token=740bc62844ff447fabdecdbf88c21b1c&date1=20130407&date2=20130605 { name: "Иван", surname:"Иванов" } {"name"}; //Выводим на печать желаемые элементы массива echo "Фамилия: ".$data->{"surname"};; ?> save('php://output'); exit; ?> //Кладем авторизационный токен в переменную $acess_token="740bc62844ff447fabdecdbf88c21b1c"; //Кладем номер счетчика в переменную $metrikaid="21898531"; //Кладем в переменные даты конца и начала периода, за который мы хотим получить статистику в формате "YYYYMMDD". $datestart=20140101; $dateend=20140701; //Кладем в массив содержимое ответа на запрос к методу "traffic" $json_data = file_get_contents('http://api-metrika.yandex.ru/stat/traffic/summary.json?id='.$metrikaid.' &pretty=1&oauth_token='.$acess_token.' &date1='.$datestart.'&date2='.$dateend); $data=json_decode($json_data, true); //Кладем в переменные минимальное и максимальное количество визитов в день $minvisits=$data->{"min"}->{"visits"}; $maxvisits=$data->{"max"}->{"visits"}; //Задаем всем ячейкам активного листа формат "Общий" $objPHPExcel->getActiveSheet() ->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_GENERAL); //Размещаем данные в ячейках $objPHPExcel->setActiveSheetIndex(0) ->setCellValue("A1", "Минимальное число визитов"); $objPHPExcel->setActiveSheetIndex(0) ->setCellValue("B1", "Максимальное число визитов"); $objPHPExcel->setActiveSheetIndex(0) ->setCellValue("A2", $minvisits); $objPHPExcel->setActiveSheetIndex(0) ->setCellValue("B2", $maxvisits); #Отчет о распределении посетителей по странам мира //Создаем новый лист $objPHPExcel->createSheet(NULL, 1); //Делаем новый лист активным $objPHPExcel->setActiveSheetIndex(1); //Даем ему имя $objPHPExcel->getActiveSheet()->setTitle("Страны мира"); //Кладем результаты запроса к методу geo в массив $json_data = file_get_contents('http://api-metrika.yandex.ru/stat/traffic/geo.json?id=.$metrikaid.' &pretty=1&oauth_token='.$acess_token.' &date1='.$datestart.'&date2='.$dateend); $datacountry=json_decode($json_data, true); //Производим обход массива и помещаем в ячейки текущие значения свойств "country" и "id" $i=2; foreach ($datacountry as $item) { $cell1="A".$i; $cell2="B".$i; $celltext1=$item->{"country"}; $celltext2=$item->{"id"}; $objPHPExcel->setActiveSheetIndex(1) ->setCellValue($cell1, $celltext1); $objPHPExcel->setActiveSheetIndex(1) ->setCellValue($cell2, $celltext2); $i++; } https://beta.api-metrika.yandex.ru/stat/v1/data.csv?id=&metrics=ym:s:avgPageViews&dimensions=ym:s:operatingSystem&limit=5&oauth_token=<авторизационный токен> metrics=ym:s:avgPageViews&dimensions=ym:s:operatingSystem "SELECT avgPageViews FROM table GROUP BY operatingSystem" https://beta.api-metrika.yandex.ru/stat/v1/data.csv?id=2138128&preset=tech_browsers https://beta.api-metrika.yandex.ru/stat/v1/data.csv?id=&preset=tech_browsers&limit=5&oauth_token=<авторизационный токен> https://beta.api-metrika.yandex.ru/stat/v1/data?dimensions=ym:pv:broswer&metrics=ym:s:users&filters=ym:s:trafficSourceName=='Прямые заходы'&id=8&oauth_token=<авторизационный токен> ----------------------------------------------------------------------------------------------------------------- WebSockets – стандарт современного веба. Часть 2: Socket.io – веб сокеты для всех! Кирилл Сухов npm install socket.io var io = require('socket.io').listen(8080); io.sockets.on('connection', function (socket) { socket.emit('hello', 'hello from io!'); }); Клиент будет приблизительно таким: SocketIO Client $ node serverio.js var server = require('http').Server(); var io = require('socket.io')(server); io.on('connection', function(socket){ socket.on('event', function(data){ … }); … }); server.listen(8080); Введите ник: Функцию chatio реализуем следующим образом: function iochat(nick){ socket = io.connect('http://localhost:8080'); socket.on('connect', function () { socket.send(nick); socket.on('message', function (msg) { alert(msg); }); }); } var io = require('socket.io').listen(8080); io.sockets.on('connection', function (socket) { socket.on('message', function (msg) { var time = (new Date).toLocaleTimeString(); socket.send("Hello "+msg+"!"); socket.broadcast.send(time+" К нам присоединился "+msg); console.log(msg+" connect! "+time); }); function iochat(nick){ socket = io.connect('http://localhost:8080'); socket.on('connect', function () { socket.json.send({"type":"hello","nick" : nick}); socket.on('message', function (msg) { if(msg.type='hello' || 'announce'){ alert(msg.message); } }); }); socket.on('message', function (msg) { var time = (new Date).toLocaleTimeString(); if(msg.type == 'hello'){ socket.json.send({"type":"hello", "message":"Hello "+msg.nick+"!"}); socket.broadcast.json.send({"type":"announce", "message":time+" К нам присоединился "+msg.nick}); console.log(msg.nick+" connect! "+time); } }); Введите ник:
var io = require('socket.io').listen(8080); io.sockets.on('connection', function (socket) { socket.on('message', function (msg) { console.log(msg); var time = (new Date).toLocaleTimeString(); if(msg.type == 'hello'){ socket.json.send({"type":"hello", "message":"Hello "+msg.message+"!"}); socket.broadcast.json.send({"type":"announce", "message":time+" К нам присоединился "+msg.message}); console.log(msg.nick+" connect! "+time); } if(msg.type == 'message'){ console.log("test"); socket.broadcast.json.send({"type":"message", "message":msg.message}); } }); }); if(msg.type == 'hello'){ socket.emit('hello', {"message", "Hello"+msg.message+"!"}); socket.broadcast.emit("announce", {"message":time+ " К нам присоединился "+msg.message}); console.log(msg.nick+" connect! "+time); } if(msg.type == 'message'){ socket.broadcast.emit("post",{"message":msg.message}); } } socket.on('hello', function (msg) { alert(msg.message); }); socket.on('announce', function (msg) { alert(msg.message); }); socket.on('post', function (msg) { printMessage(msg.message, 0) }); }); } function iochat(nick){ socket = io.connect('http://localhost:8080'); socket.on('connect', function () { socket.emit('hello',nick); document.querySelector('#input').onclick = function(e) { var message = document.querySelector('#message').value; socket.emit('post',message); printMessage(message, 1); document.querySelector('#message').value = ''; } io.sockets.on('connection', function (socket) { socket.on('hello', function (nick) { var time = (new Date).toLocaleTimeString(); socket.json.emit('hello', { "message":"Hello "+nick+"!"}); socket.broadcast.emit("announce", { "message":time+" К нам присоединился "+nick}); console.log(nick+" connect! "+time); }); socket.on('post', function (message) { socket.broadcast.emit("post", message); }); }); socket.on('hello', function (nick) { time = (new Date).toLocaleTimeString(); socket.set("name", nick, function(){ socket.json.emit('hello', { "message":"Hello "+nick+"!"}); socket.broadcast.emit("announce", { "message":time+" К нам присоединился "+nick}); console.log(nick+" connect! "+time); }); }); socket.on('post', function (message) { var time = (new Date).toLocaleTimeString(); socket.get('name', function (err, name) { console.log(name+": "+message); message = name + ": " + message; socket.broadcast.emit("post", {"message": message}); }); }); document.querySelector('#startButton').onclick = function(){ iochat(document.getElementById('nickname').value); document.querySelector('#startButton').value = "Exit"; } function iochat(nick){ … socket.emit('hello',nick); var button = document.querySelector('#startButton'); button.onclick = function() { socket.disconnect(); } socket.on('disconnect', function () { time = (new Date).toLocaleTimeString(); socket.get('name', function (err, name) { socket.broadcast.emit("announce", { "message":time+" Нас покинул "+name}); console.log(name+" left "+time+"..."); }); }); var io = require('socket.io').listen(8080); var chat = io chat.of('/chat') chat.on('connection', function (socket) { socket.emit('a message', { that: 'only' , '/chat': 'will get' }); chat.emit('a message', { everyone: 'in' , '/chat': 'will get' }); }); var news = io news.of('/news') news.on('connection', function (socket) { socket.emit('item', { news: 'item' }); }); var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { setInterval(function () { socket.volatile.emit('alarm', 'Хватит чатиться!'); }); }, 10000); }); var io = require('socket.io').listen(8080); io.sockets.on('connection', function (socket) { socket.on('foo', function (name, fn) { fn('yes!'); }); }); var io = require('socket.io').listen(80); io.configure('production', function(){ io.enable('browser client etag'); io.set('log level', 1); io.set('transports', [ 'websocket' , 'flashsocket' , 'htmlfile' , 'xhr-polling' , 'jsonp-polling' ]); }); io.configure('development', function(){ io.set('transports', ['websocket']); }); $ export NODE_ENV=production io.configure(function(){ io.set('authorization', function(handshakeData, callback){ findbyIP(handshakeData.address.address, function(err, data) { if(err)return callback(err); if (data.authorized) { handshakeData.foo = 'bar'; for(var prop in data){ handshakeData[prop] = data[prop]; } callback(null, true); } else { callback(null, false); } }) }); }); ----------------------------------------------------------------------------------------------------------------- Моделирование – «наш» метод познания. Программа молекулярной динамики XMD Сергей Ильичев $ sudo apt-get install build-essential $ cd $ tar xzvf xmd-2.5.38.tar.gz $ ./configure $ make $ sudo make install $ sudo apt-get install xutils xutils-dev libxaw7-dev $ cd xmd-2.5.38/xmdview-1.1 $ sh ./Compile $ sudo cp ./xmdview /usr/local/bin Листинг 1. Содержимое файла diamond.txt box 5/4 5/4 5/4 fill particle 2 1 0 0 0 1 1/4 1/4 1/4 fill cell 0 1/2 1/2 1/2 0 1/2 1/2 1/2 0 fill go scale 3.57 write cor diamond.cor 0 1/2 1/2 1/2 0 1/2 1/2 1/2 0 $ cd nuzhny_katalog $ xmd diamond.txt $ xmdview diamond.cor -----------------------------------------------------------------------------------------------------------------