Новые возможности 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