Виртуализация на уровне ОС. Теория и практика OpenVZ Александр Руденко # wget -P /etc/yum.repos.d/ http://ftp.openvz.org/openvz.repo # rpm --import http://ftp.openvz.org/RPM-GPG-Key-OpenVZ # yum install vzkernel net.ipv4.ip_forward = 1 net.ipv6.conf.default.forwarding = 1 net.ipv6.conf.all.forwarding = 1 net.ipv4.conf.default.proxy_arp = 0 net.ipv4.conf.all.rp_filter = 1 kernel.sysrq = 1 net.ipv4.conf.default.send_redirects = 1 net.ipv4.conf.all.send_redirects = 0 # echo "SELINUX=disabled" > /etc/sysconfig/selinux # yum install vzctl vzquota ploop # cd /vz/template/cache/ # wget http://download.openvz.org/template/precreated/ubuntu-13.10-x86_64.tar.gz # vzctl create 101 --ostemplate ubuntu-13.10-x86_64 # vzctl set 101 --hostname u101 --save # vzctl set 101 --ipadd 10.200.77.45 --save # vzctl set 101 --nameserver 10.200.77.10 --save cp /etc/apt/sources.list /vz/private/101/etc/apt/sources.listcp /etc/resolv.conf /vz/private/101/etc/resolv.conf # vzctl set 101 --name ubuntu101 --save # vzctl start ubuntu101 # vzctl set 101 --userpasswd root:123456 # ssh -l ubuntu 10.200.77.45 # vzctl enter 101 # vzlist # vzctl exec 101 cat /etc/resolv.conf # vzctl exec 101 ifdown venet0 # vzctl create 101 --ostemplate ubuntu-13.10-x86_64 --layout ploop --diskspace 4G # vzctl set 101 --diskspace 10G --save # vzctl convert 101 --layout ploop # vzctl snapshot 101 --name SNAP01 --description pred install # vzctl snapshot-list 101 # vzctl snapshot-switch 101 --id 89e469a8-47b7-41a5-bbd3-5bf3312521d8 # vzctl set 103 --netdev_add eth2 --save # vzmigrate <имяПринимающегоХоста> 101 # vzmigrate --online <имяПринимающегоХоста> 101 # wget -O - http://ovz-web-panel.googlecode.com/svn/installer/ai.sh | sh http://<имя-сервера>:3000 ----------------------------------------------------------------------------------------------------------------- Изоляция процессов с помощью LXC на примере со Skype Александр Хрюкин $ sudo apt-get install lxc cgroup-lite $ lxc-checkconfig $ cat /etc/lxc/lxc-usernet fedya veth lxcbr0 10 $ lxc-create -t download -n skyper -- -d ubuntu -r trusty -a i386 $ vim ~/.local/share/lxc/skyper/config lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir lxc.mount.entry = /dev/video0 dev/video0 none bind,optional,create=file lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir lxc.hook.pre-start =/home/fedya/.local/share/lxc/skyper/setup-pulse.sh #!/bin/sh PULSE_PATH=$LXC_ROOTFS_PATH/home/ubuntu/.pulse_socket if [ ! -e "$PULSE_PATH" ] || [ -z "$(lsof -n $PULSE_PATH 2>&1)" ]; then pactl load-module module-native-protocol-unix auth-anonymous=1 socket=$PULSE_PATH fi $ sudo chown -R 1000:1000 ~/.local/share/lxc/skyper/rootfs/home/ubuntu $ lxc-start -n skyper –d $ lxc-attach -n skyper -- umount /tmp/.X11-unix $ lxc-attach -n skyper -- sudo sh -c 'echo "deb http://archive.canonical.com/ quantal partner" >> /etc/apt/sources.list' $ lxc-attach -n skyper -- apt-get update $ lxc-attach -n skyper -- apt-get dist-upgrade –y $ lxc-attach -n skyper -- apt-get install wget ubuntu-artwork $ dmz-cursor-theme ca-certificates pulseaudio –y $ lxc-attach -n skyper -- apt-get install skype $ lxc-attach -n skyper -- apt-get -f install –y $ echo "disable-shm=yes" | lxc-attach -n skyper -- sudo -u ubuntu tee /home/ubuntu/.pulse/client.conf $ lxc-stop -n skyper $ lxc-start -n skyper -d $ lxc-attach --clear-env -n skyper -- sudo -u ubuntu –i env DISPLAY=$DISPLAY PULSE_SERVER=/home/ubuntu/.pulse_socket skype. ----------------------------------------------------------------------------------------------------------------- Акулы в океане SIP-телефонии. Анализ трафика с помощью Wireshark Анна Сергеева имя@IР-адрес имя@домен имя@хост Nтелефона@шлюз ----------------------------------------------------------------------------------------------------------------- Очереди как структуры данных. Теория и практика Александр Календарев struct { void* pred; // указатель на предыдущий элемент void* next; // указатель на следующий элемент data_t data; // данные или указатель на данные (data_t*) }; struct cmd_t { int id; // номер команды time_t time; // время исполнения TAILQ_ENTRY(cmd_t) link; // структура элемента очереди }; typrdef struct cmd_t cmd_t; TAILQ_HEAD(, cmd_t) cmd_queue; // объявление очереди // инициализация мьютекса pthread_mutex cmd_mutex = PTHREAD_MUTEX_INITIALIZER; // инициализация условной переменной pthread_cond_t cmd_cond = PTHREAD_COND_INITIALIZER; pthread_mutex queue_mutex = PTHREAD_MUTEX_INITIALIZER; TAILQ_INIT(&cmd_queue); // инициализация очереди ... // переменная is_process=1, при получении сигнала устанавливается в 0 while ( is_process ) { ... // обработка входного соединения // условие, по которому мы делаем запись в БД if (cmd == CMD_LOG) { // выделяем память под элемент очереди cmd_t* cmd_item = calloc(1,sizeof(cmd_t)); // и заполняем структуру данными cmd_item->id = CMD_LOG; cmd_item->time = time(NULL); // запираем очередь, чтобы не потерять данные pthread_mutex_lock(&queue_mutex) // записываем в конец очереди TAILQ_INSERT_TAIL(&cmd_queue, cmd_item, link); // открываем очередь, теперь из нее можно извлекать элементы pthread_mutex_unlock(&queue_mutex) // оповещаем поток Б, что в очереди есть данные pthread_cond_signal(&cmd_cond); } } // продолжаем цикл, пока не получим SIG_TERM, в котором обработчик is_process=0 // инициализация соединения с БД и прочие команды для соединения с БД mysql_init(); ... // в цикле ожидаем события, пока is_process=1, по сигналу завершения устанавливается в 0 while ( is_process ) { pthread_mutex_lock(&cmd_mutex); // ожидаем сигнала от потока А pthread_cond_wait(&cmd_cond, &cmd_mutex); pthread_mutex_unlock(&cmd_mutex); cmd_t * cmd_item; // выбираем первый элемент while ((cmd_item = TAILQ_FIRST(&cmd_queue))!= NULL ) { pthread_mutex_lock(cmd_mutex) // запираем очередь // удаляем элемент из очереди TAILQ_REMOVE (&cmd_queue, cmd_item, link); // открываем очередь, теперь в нее можно добавлять новые элементы pthread_mutex_unlock(cmd_mutex) ... // Подготавливаем данные для записи в БД mysql_query(mysql, query); // пишем в БД // освобождаем память, аллоцируемую в элемент очереди в потоке А free(cmd_item); } // продолжаем цикл, пока в очереди находятся элементы } // продолжаем цикл, пока не получим SIG_TERM, в котором обработчик is_process установит в 0 pthread_cond_t cmd_cond = PTHREAD_COND_INITIALIZER; pthread_mutex queue_mutex = PTHREAD_MUTEX_INITIALIZER; Поток A: TAILQ_INIT(&cmd_queue); // инициализация очереди ... // переменная is_process=1, при получении сигнала // устанавливается в 0 while ( is_process ) { ... // обработка входного соединения // условие, по которому мы делаем запись в БД if (cmd == CMD_LOG) { // выделяем память под элемент очереди cmd_t* cmd_item = calloc(1,sizeof(cmd_t)); // и заполняем структуру данными cmd_item->id = CMD_LOG; cmd_item->time = time(NULL); // запираем очередь, чтобы не потерять данные pthread_mutex_lock(&queue_mutex) // записываем в конец очереди TAILQ_INSERT_TAIL(&cmd_queue, cmd_item, link); // открываем очередь, теперь из нее можно извлекать // элементы pthread_mutex_unlock(&queue_mutex) // оповещаем поток Б, что в очереди есть данные pthread_cond_signal(&cmd_cond); } } // продолжаем цикл, пока не получим SIG_TERM, в котором // обработчик is_process=0 Поток B: // инициализация соединения с БД и прочие команды // для соединения с БД mysql_init(); ... // в цикле ожидаем события, пока is_process=1, по сигналу // завершения устанавливается в 0 while ( is_process ) { pthread_mutex_lock(&cmd_mutex); // ожидаем сигнала от потока А pthread_cond_wait(&cmd_cond, &cmd_mutex); pthread_mutex_unlock(&cmd_mutex); cmd_t * cmd_item; // выбираем первый элемент while ((cmd_item = TAILQ_FIRST(&cmd_queue))!= NULL ) { pthread_mutex_lock(cmd_mutex) // запираем очередь // удаляем элемент из очереди TAILQ_REMOVE (&cmd_queue, cmd_item, link); // открываем очередь, теперь в нее можно добавлять // новые элементы pthread_mutex_unlock(cmd_mutex) ... // Подготавливаем данные для записи в БД mysql_query(mysql, query); // пишем в БД // освобождаем память, аллоцируемую в элемент // очереди в потоке А free(cmd_item); } // продолжаем цикл, пока в очереди находятся элементы } // продолжаем цикл, пока не получим SIG_TERM, в котором // обработчик is_process установит в 0 По окончании работы нашего демона, перед выходом из приложения, не забываем очистить всю очередь: // выбираем первый элемент while ((cmd_item = TAILQ_FIRST(&cmd_queue))!= NULL ) { // удаляем его из очереди TAILQ_REMOVE (&cmd_queue, cmd_item, link); free(cmd_item); // освобождаем память } цикл продолжается, пока очередь не станет пустой ----------------------------------------------------------------------------------------------------------------- WebSockets-стандарт современного веба. Часть 1 Кирилл Сухов npm install ws var WebSocketServer = new require('ws'); var webSocketServer = new WebSocketServer.Server({port: 8080}); webSocketServer.on('connection',function(ws){ console.log("Новое соединение"); }) var WebSocketServer = new require('ws'); var wss = new WebSocketServer.Server({port: 8080}); var clients = []; wss.on('connection', function(ws) { var id = clients.length; clients[id] = ws; console.log("Новое соединение № "+id); clients[id].send("Приветвуем! ваш идентификатор "+id); console.log(clients); for (var key in clients) { if(key!=id){ clients[key].send("К нам присоеденился № "+id); } } }) onload = function(){ // создаем соединение var ws = new WebSocket("ws://localhost:8080"); ws.onmessage = function(event){ alert(event.data); } }
ws.onmessage = function(event){ alert(event.data); } document.forms.push.onsubmit = function() { ws.send(this.message.value); return false; }; } wss.on('connection', function(ws) { var id = clients.length; clients[id] = ws; console.log("Новое соединение № "+id); clients[id].send("Приветствуем! ваш идентификатор "+id); for (var key in clients) { if(key!=id){ clients[key].send("К нам присоединился № "+id); } } ws.on('message', function(message) { console.log('получено сообщение ' + message); for (var key in clients) { if(key!=id){ clients[key].send(message); } } }) }) var WebSocketServer = new require('ws'); var wss = new WebSocketServer.Server({port: 8080}); var clients = []; wss.on('connection', function(ws) { var id = clients.length; clients[id] = ws; console.log("Новое соединение № "+id); clients[id].send(JSON.stringify( { type: 'hello', message: "Приветствуем! ваш идентификатор "+id, data: id} )); for (var key in clients) { if(key!=id){ console.log("send"); clients[key].send(JSON.stringify({type: 'info', message:"К нам присоединился № "+id})); } } ws.on('message', function(message) { console.log('получено сообщение ' + message); for (var key in clients) { clients[key].send(JSON.stringify( { type: 'message', message: message, author: id} )); } }) })
onload= function(){ ......................................................... var target = document.getElementById("target"); target.ondrop = function(e) { target.style.backgroundColor = "#fff"; try { e.preventDefault(); handleFileDrop(e.dataTransfer.files[0]); return false; } catch(err) { console.log(err); } } target.ondragover = function(e) { e.preventDefault(); target.style.backgroundColor = "#6fff41"; } target.ondragleave = function() { target.style.backgroundColor = "#fff"; } function handleFileDrop(file) { var reader = new FileReader(); reader.readAsArrayBuffer(file); reader.onload = function() { ws.send(reader.result); } } }

Переместите картинку на прямоугольник

var reader = new FileReader(); reader.readAsArrayBuffer(file); reader.onload = function() { ws.send(reader.result); } ws.on('message', function(message) { if(typeof message ==='object'){ for (var key in clients) { clients[key].send(message); } } else { for (var key in clients) { clients[key].send(JSON.stringify( { type: 'message', message: message, author: id} )); } } }) }) ws.onmessage = function(event) { if(typeof event.data === 'object'){ var blob = event.data; if (window.webkitURL) { URL = webkitURL; } var uri = URL.createObjectURL(blob); var img = document.createElement("img"); img.src = uri; document.getElementById('subscribe').appendChild(img); } else{ var message = JSON.parse(event.data); var text = ""; switch (message.type) { case "info": { ----------------------------------------------------------------------------------------------------------------- Использование API Яндекс.Спеллер. Готовые рецепты для веб-разработчика Ирина Чернова //Подключаем основной скрипт к веб-странице