Демон BSD на острове пингвинов. Прибавляем и убавляем с LVM Рашид Ачилов # pvcreate /dev/sdb1 # vgdisplay # vgextend vg_windycat /dev/sdb1 # lvscan # lvextend /dev/vg_windycat/lv_tmp /dev/sdb1 # lvextend -l +50%PVS /dev/vg_windycat/lv_tmp /dev/sdb1 # resize2fs /dev/vg_windycat/lv_tmp # echo 1 > /sys/bus/scsi/devices/2\:0\:0\:0/rescan # partprobe # hdparm -z /dev/sda # blockdev --rereadpt /dev/sda # echo 1 > /sys/block/sda/device/rescan # lvresize -r -L -20G /dev/vg_windycat/lv_tmp # vgdisplay -v # vgreduce vg_windycat /dev/sdb1 # pvmove /dev/sdb1 /53a70e91-e9415eb2-cc54-386077f0a18b/vmdisks/windycat # ls -la # Extent description RW 251658240 VMFS "windycat_1-flat.vmdk" # vmkfstools -i windycat_1.vmdk -d thin temp.vmdk # vmkfstools -i temp.vmdk -d thin windycat_1.vmdk # vmkfstools -K windycat_1.vmdk # vgrename vg_windycat vg_mycoolname # vgrename Zvlifi-Ep3t-e0Ng-U42h-o0ye-KHu1-nl7Ns4 VolGroup00_tmp # mount -o rw,remount / # lvrename /dev/vg_windycat/lv_tmp vg_windycat/lv_blabla # lvrename vg_windycat lv_tmp lv_blabla # vgcfgrestore -l vg_windycat # vgcfgrestore -f /etc/lvm/backup/vg_windycat vg_windycat -------------------------------- Облачная операционная система OpenStack. Часть 4. Сервис блочного хранилища OpenStack Cinder Андрей Маркелов # vgcreate cinder-volumes /dev/vdb1 # yum -y install openstack-cinder # cp /usr/share/cinder/cinder-dist.conf /etc/cinder/cinder.conf # cat /etc/cinder/cinder.conf # crudini --set /etc/cinder/cinder.conf DEFAULT rabbit_userid guest # crudini --set /etc/cinder/cinder.conf DEFAULT rabbit_password guest # crudini --set /etc/cinder/cinder.conf DEFAULT rabbit_host localhost # crudini --set /etc/cinder/cinder.conf keystone_authtoken admin_tenant_name service # crudini --set /etc/cinder/cinder.conf keystone_authtoken admin_user cinder # crudini --set /etc/cinder/cinder.conf keystone_authtoken admin_password openstack # crudini --set /etc/cinder/cinder.conf DEFAULT volume_group cinder-volumes # openstack-db --init --service cinder # source keystonerc_admin # keystone user-create --name cinder --pass openstack # keystone user-role-add --user cinder --role admin --tenant service # keystone service-create --name=cinder --type=volume --description="OpenStack Block Storage" # keystone service-create --name=cinderv2 --type=volumev2 --description="OpenStack Block Storage" # keystone endpoint-create --service-id 6bc993971e854a63a6b0ad3c807ceaff --publicurl http://os1.test.local:8776/v1/%\(tenant_id\)s --internalurl http://os1.test.local:8776/v1/%\(tenant_id\)s --adminurl http://os1.test.local:8776/v1/%\(tenant_id\)s # keystone endpoint-create --service-id 2c091c9fca3841f28fa67376f1be3f9e --publicurl http://os1.test.local:8776/v2/%\(tenant_id\)s --internalurl http://os1.test.local:8776/v2/%\(tenant_id\)s --adminurl http://os1.test.local:8776/v2/%\(tenant_id\)s # yum -y install targetcli # crudini --set /etc/cinder/cinder.conf DEFAULT iscsi_ip_address 192.168.122.101 # systemctl enable target # systemctl start target # systemctl enable openstack-cinder-api # systemctl enable openstack-cinder-scheduler # systemctl enable openstack-cinder-volume # openstack-service start cinder # cinder service-list # cinder create --display-name testvol1 1 # cinder list # vgs # lvs $ nova volume-attach myinstance1 82711b99-cce1-45e4-8b7e-b91301d65dc8 /dev/vdb $ cinder list -------------------------------- LXD – управляем контейнерами Linux. Знакомимся с альтернативой Docker от разработчиков LXC Денис Силаков $ sudo apt-get install lxd nova-compute-lxd $ systemctl start lxd $ systemctl enable lxd $ lxc remote add images images.linuxcontainers.org $ lxc image list images: $ lxd-images import lxc ubuntu trusty amd64 --alias Ubuntu $ lxc launch ubuntu vm1 $ lxc launch images:ubuntu/trusty/amd64 vm2 $ lxc list $ lxc exec vm1 -- /bin/bash $ lxc file pull vm1/var/log/messages ~/vm1_logs $ lxc remote add serv2 my.server.net $ lxc start serv2:vm1 $ lxc move host1:vm1 host2:vm1 -------------------------------- Функция DNS Policies в Windows Server 2016 Technical Preview Сергей Яремчук PS> Add-DnsServerClientSubnet -Name "LocalSubnet" -IPv4Subnet 192.168.0.0/24 PS> Add-DnsServerZoneScope -ZoneName "example.com" -Name "LocalZoneScope" PS> Add-DnsServerResourceRecord -ZoneName "example.com" -A -Name "www" -IPv4Address "192.168.0.1" -ZoneScope "LocalZoneScope" PS> Add-DnsServerResourceRecord -ZoneName "example.com" -A -Name "www" -IPv4Address "172.1.1.1" PS> Add-DnsServerQueryResolutionPolicy -Name "LocalPolicy" -Action ALLOW -ClientSubnet "eq,LocalSubnet" -ZoneScope "LocalZoneScope,1" -ZoneName "example.com" PS> Get-DnsServerQueryResolutionPolicy -ZoneName "example.com" PS> Add-DnsServerClientSubnet -Name "AllowedSubnet" -IPv4Subnet 192.168.0.0/24 PS> Add-DnsServerZoneTransferPolicy -Name "AllowedSubnetPolicy" -Action IGNORE -ClientSubnet "ne,AllowedSubnet" -PassThru PS> Remove-DnsServerZoneTransferPolicy -Name "AllowedSubnet" –PassThru -------------------------------- Расширяем функциональность 1С:Предприятия. Часть 1. Внешние компоненты COM Олег Филиппов, switch(lMethodNum) { case methEnable: … if (pAsyncEvent) { who = csSource; what = csMessage; data = csData; pAsyncEvent->ExternalEvent(who, what, data); } #include "AddIn.h" CAddIn* pAddIn; public: void Event(BSTR Sourse, BSTR Message, BSTR Data); ... void CAddIn::Event(BSTR Sourse, BSTR Message, BSTR Data) { pAsyncEvent->ExternalEvent(Sourse, Message, Data); } pAsyncEvent = m_iAsyncEvent; ПодключитьВнешнююКомпоненту("C:\ReleaseMinSize\AddInComol.dll", "Comp", ТипВнешнейКомпоненты.COM); ПодключитьВнешнююКомпоненту("ВнешняяОбработка.Тест.Макет.ВК", " Comp", ТипВнешнейКомпоненты. COM); Компонента = Новый("AddIn.Comp.AddInComol"); Компонента = Новый COMОбъект("AddIn.MyClass"); -------------------------------- Опыт секционирования таблиц в Oracle. Часть 1. Создание секционированных таблиц Валерий Михеичев SELECT OWNER, TABLE_NAME, COLUMN_NAME, VIRTUAL_COLUMN, DATA_TYPE, DATA_DEFAULT FROM ALL_TAB_COLS WHERE OWNER='ИМЯ СХЕМЫ' AND TABLE_NAME='ИМЯ ТАБЛИЦЫ'; CREATE TABLE AIF.HISTLG ( ISN NUMBER, UPDATED DATE) TABLESPACE HSTDATA PARTITION BY RANGE (UPDATED) (PARTITION PARTMM_2015_01 VALUES LESS THAN (TO_DATE('01.01.2015','DD.MM.YYYY')) COMPRESS, PARTITION PARTMM_2015_02 VALUES LESS THAN (TO_DATE('01.02.2015','DD.MM.YYYY')), PARTITION PARTMM_2015_03 VALUES LESS THAN (TO_DATE('01.03.2015','DD.MM.YYYY')), PARTITION PARTMM_MAX VALUES LESS THAN (MAXVALUE) ) ENABLE ROW MOVEMENT; SELECT * FROM ALL_TAB_PARTITIONS WHERE TABLE_NAME=’ИМЯ ТАБЛИЦЫ’ AND TABLE_OWNER=’ИМЯ СХЕМЫ’ ORDER BY PARTITION_POSITION; SELECT * FROM ИМЯ_СХЕМЫ.ИМЯ_ТАБЛИЦЫ PARTITION (ИМЯ СЕКЦИИ); CREATE TABLE AIF.HISTLG ( ISN NUMBER, UPDATED DATE) TABLESPACE HSTDATA PARTITION BY RANGE (ISN) (PARTITION PARTISN_01 VALUES LESS THAN (1000), PARTITION PARTISN_02 VALUES LESS THAN (2000), PARTITION PARTISN_03 VALUES LESS THAN (3000), PARTITION PARTISN_MAX VALUES LESS THAN (MAXVALUE) ) ENABLE ROW MOVEMENT; --диапазон новой секции ALTER TABLE AIF.HISTLG SPLIT PARTITION PARTMM_MAX AT (TO_DATE('01.01.2016','DD.MM.YYYY')) INTO (PARTITION PARTMM_2016_01 , --имя новой секции PARTITION P_MAX) UPDATE GLOBAL INDEXES; CREATE TABLE AIF.HISTLG ( ISN NUMBER, UPDATED DATE) TABLESPACE HSTDATA PARTITION BY RANGE (UPDATED) INTERVAL (INTERVAL '1' MONTH) (PARTITION PARTMM_01 VALUES LESS THAN (TO_DATE('01.01.2015','DD.MM.YYYY')) ) ENABLE ROW MOVEMENT; CREATE TABLE AIF.HISTLG ( ISN NUMBER, UPDATED DATE) TABLESPACE HSTDATA PARTITION BY RANGE (ISN) INTERVAL(1000) (PARTITION PARTISN_01 VALUES LESS THAN (1000) ) ENABLE ROW MOVEMENT; --виртуальный столбец CREATE TABLE AIF.AGREEM (ISN NUMBER,UPDATED DATE, PARTID AS (TO_NUMBER(TO_CHAR(UPDATED,'MM'))) ) PARTITION BY LIST(PARTID) ( PARTITION PART_1 VALUES (1), PARTITION PART_2 VALUES (2), … PARTITION PART_12 VALUES (12)); ALTER TABLE ИМЯ_СХЕМЫ.ИМЯ_ТАБЛИЦЫ MODIFY PARTITION ИМЯ_СЕКЦИИ SHRINK SPACE CASCADE; ALTER TABLE ИМЯ_СХЕМЫ.ИМЯ_ТАБЛИЦЫ MOVE PARTITION ИМЯ_СЕКЦИИ TABLESPACE ИМЯ_ТАБЛИЧНОГО_ПРОСТРАНСТВА NOLOGGING; CREATE TABLE AIF.LISTIN (TASKISN NUMBER, OBJISN NUMBER, PARAM NUMBER, CONSTRAINT PK_LISTIN PRIMARY KEY(TASKISN,OBJISN,OBJROWID,PARAM) ) ORGANIZATION INDEX INCLUDING PARAM OVERFLOW PARTITION BY HASH (TASKISN) PARTITIONS 16 SELECT P.TABLE_OWNER, P.TABLE_NAME,P.PARTITION_POSITION POS, P.PARTITION_NAME, P.HIGH_VALUE, P.SEGMENT_CREATED, (SELECT ROUND(S.BYTES/1024/1024,1) FROM DBA_SEGMENTS S WHERE S.OWNER=P.TABLE_OWNER AND S.SEGMENT_NAME=P.TABLE_NAME AND S.PARTITION_NAME=P.PARTITION_NAME) MB FROM DBA_TAB_PARTITIONS P WHERE TABLE_OWNER='ИМЯ СХЕМЫ' AND TABLE_NAME='ИМЯ ТАБЛИЦЫ' ORDER BY PARTITION_POSITION; CREATE TABLE AIF.PAY_ORD_RECORD ( ISN NUMBER, PAY_DATA DATE, PAYER_NAME VARCHAR2(255), STATUS NUMBER ) TABLESPACE HSTDATA PARTITION BY RANGE (PAY_DATA) INTERVAL (INTERVAL '1' MONTH) SUBPARTITION BY LIST (STATUS) SUBPARTITION TEMPLATE ( SUBPARTITION STATUS_0 VALUES (0) TABLESPACE TRDATA1, SUBPARTITION STATUS_1 VALUES (1) TABLESPACE TRDATA2, SUBPARTITION STATUS_2 VALUES (2) TABLESPACE TRDATA3 ) (PARTITION P_2015_01 VALUES LESS THAN(TO_DATE('01.01.2015','DD.MM.YYYY'))) ENABLE ROW MOVEMENT; SELECT P.TABLE_OWNER, P.TABLE_NAME, P.PARTITION_NAME, P.PARTITION_POSITION, P.HIGH_VALUE, P.SUBPARTITION_COUNT, S.SUBPARTITION_NAME, S.HIGH_VALUE, S.SUBPARTITION_POSITION SUB_POS, S.TABLESPACE_NAME, S.SEGMENT_CREATED FROM ALL_TAB_PARTITIONS P, ALL_TAB_SUBPARTITIONS S WHERE P.TABLE_OWNER=S.TABLE_OWNER AND P.TABLE_NAME=S.TABLE_NAME AND P.PARTITION_NAME=S.PARTITION_NAME AND P.TABLE_OWNER='AIF' AND P.TABLE_NAME='PAY_ORD_RECORD' ORDER BY P.PARTITION_POSITION, S.SUBPARTITION_POSITION; CREATE TABLE AIF.PAY_ORD_RECORD_SYS (ISN NUMBER, PAY_DATA DATE, PAYER_NAME VARCHAR2(255), STATUS NUMBER) PARTITION BY SYSTEM (PARTITION P1, PARTITION P2, PARTITION P3); SELECT * FROM ALL_TAB_PARTITIONS WHERE TABLE_NAME='PAY_ORD_RECORD_SYS'; SELECT PARTITIONING_TYPE FROM ALL_PART_TABLES WHERE TABLE_NAME='PAY_ORD_RECORD_SYS'; -------------------------------- Готовимся к переходу на PHP 7 Александр Майоров $b) ? 1:0 ); } function mysort($a, $b) { return $a <=> $b; } function ($match) use (&$tokenStream) { $tokenStream[] = ['T_VARIABLE', $match[0]]; }, '~=~' => function ($match) use (&$tokenStream) { $tokenStream[] = ['T_ASSIGN', $match[0]]; }, '~[\d]+~' => function ($match) use (&$tokenStream) { $tokenStream[] = ['T_NUM', $match[0]]; }, '~;~' => function ($match) use (&$tokenStream) { $tokenStream[] = ['T_TERMINATE_STMT', $match[0]]; }, '~//.*~' => function ($match) use (&$tokenStream) { $tokenStream[] = ['T_COMMENT', $match[0]]; } ], $input ); _foo; }; $f1 = Closure::bind($cb1, null, 'Foo'); $f2 = Closure::bind($cb2, new Foo,'Foo'); var_dump( $f1() ); var_dump( $f2() ); _foo} and $msg"; }; $obj = new Foo(); $result = $closure->call($obj, 'some message'); var_dump($result); forEach(function($index, $item) { // some code }); toUpper(); // call the toUpper() method on the string 'string' $props['name']; // PHP 5.6 $someObj->{$props['name']}; // PHP 7 {$someObj->$props}['name']; -------------------------------- TypeScript для PHP-разработчика. Как писать на JavaScript большие приложения и не сойти с ума Александр Майоров let say = (def:string):string => `TypeScript is ${def}!`; say('pretty amazing') var say = function (def) { return ("TypeScript is " + def + "!"); }; say('pretty amazing'); (function() { var say; say = (function(_this) { return function(def) { return "TypeScript is " + def + "!"; }; })(this); say('pretty amazing'); }).call(this); var gvstr; var _this = this; // Babel делает так же var say = function (def) { return _this.gvstr = "T..." + def + "!" }; say('pretty amazing'); enum Color { Red, Green, Blue } var color :Color = Color.Green; var Color; (function (Color) { Color[Color["Red"] = 0] = "Red"; Color[Color["Green"]= 1] = "Green"; Color[Color["Blue"] = 2] = "Blue"; })(Color || (Color = {})); var color = 1; const enum Color { Red, Green, Blue } var color :Color = Color.Green; var c = 1; const TRAIN_TYPE_A = 1; const TRAIN_TYPE_B = 2; class Train { public static $someFlag = TRAIN_TYPE_B; protected $_seatsCount = 0; function __construct($i) { $this->setSeatsCount($i); var_dump('Call Train'); } public function getSeatsCount() { return $this->_seatsCount; } public function setSeatsCount($i) { return $this->_seatsCount = $i; } } class Sapsan extends Train { function __construct() { parent::__construct(59); var_dump('Call Sapsan'); } } $Sapsan1 = new Sapsan(); var_dump($Sapsan1->getSeatsCount()); var_dump(Sapsan::$someFlag); var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } __.prototype = b.prototype; d.prototype = new __(); }; var var_dump = console.log.bind(this); var TRAIN_TYPE_A = 1; var TRAIN_TYPE_B = 2; var Train = (function () { function Train(i) { this._seatsCount = 0; this.setSeatsCount(i); var_dump('Call Train'); } Train.prototype.getSeatsCount = function () { return this._seatsCount; }; Train.prototype.setSeatsCount = function (i) { return this._seatsCount = i; }; Train.someFlag = 1; return Train; })(); var Sapsan = (function (_super) { __extends(Sapsan, _super); function Sapsan() { _super.call(this, 59); var_dump('Call Sapsan'); } return Sapsan; })(Train); var Sapsan1 = new Sapsan(); var_dump(Sapsan1.getSeatsCount()); var_dump(Sapsan.someFlag); const TRAIN_TYPE_A = 1; const TRAIN_TYPE_B = 2; class Train { public static $someFlag = TRAIN_TYPE_B; protected $_seatsCount = 0; constructor($i) { this.setSeatsCount($i); var_dump('Call Train'); } public getSeatsCount() { return this.$_seatsCount; } public setSeatsCount($i) { return this.$_seatsCount = $i; } } class Sapsan extends Train { constructor() { super(59); var_dump('Call Sapsan'); } } var $Sapsan1 = new Sapsan(); var_dump($Sapsan1.getSeatsCount()); var_dump($Sapsan.someFlag); const TRAIN_TYPE_A = 1; const TRAIN_TYPE_B = 2; class Train { public static someFlag: number = TRAIN_TYPE_B; protected _seatsCount: number = 0; constructor(i: number) { this.setSeatsCount(i: number); var_dump('Call Train'); } public getSeatsCount(): number { return this._seatsCount; } public setSeatsCount(i: number): number { return this._seatsCount = i; } } class Sapsan extends Train { constructor() { super(59); var_dump('Call Sapsan'); } } var Sapsan1:Sapsan = new Sapsan(); var_dump(Sapsan1.getSeatsCount()); var_dump(Sapsan.someFlag); // PHP 7 function add(int $a, int $b): int { return $a + $b; } type int = number; function add(a: int, b: int): int { return a + b; } interface iTemplate { function setVariable($key, $val); function getHtml($template); } class Template implements iTemplate { private $vars = []; public function setVariable($key, $val) { $this->vars[$key] = $val; } public function getHtml($template) { $tpl = ''; // some do with template return $tpl; } } interface iTemplate { setVariable(key:string, val:any): void; getHtml(template:string): string; } class Template implements iTemplate { private vars:Object = {}; public setVariable(key:string, val:any): void { this.vars[key] = val; } public getHtml(template:string): string { var tpl; // some do with template return tpl; } } { public function __construct(private T $data) {} public function get(): T { return $this->data; } public function set(T $x): void { $this->data = $x;} } function createStringStore(string $data): Store { $store = new Store($data); // Some do with $store return $store; } $stringStore = createStringStore('Hello world'); // TypeScript var stringStore:Store = null; class Store { public constructor(private data:T) {} public get(): T { return this.data; } public set(x:T): void { this.data = x; } } function createStringStore(data:string): Store { var store:Store = new Store(data); // Some do with $store return store; } stringStore = createStringStore('Hello world'); -------------------------------- Секреты механизмов подпрограмм: параметры и локальные переменные Алексей Вторников // Наибольшее из двух целых int max (int a, int b) { if (a > b) return a; else return b; } // Обмен значениями переменных int a, b; ... void change () { int temp; temp = a; a = b; b = temp; } // Наибольшее из двух целых int max (int a, int b) { int temp; if (a > b) temp = a; else temp = b; return temp; } int maxValue = max (4, 9); int maxValue = max (-4, -9); double mySubroutine (int a, boolean b, double f) {...} int [] processArray (String [] lines) {...}