Денис Силаков Промышленная виртуализация с помощью Virtuozzo 7 # prlctl create СentOS --vmtype ct --ostemplate centos-7-x86_64 # yum install -y ubuntu-14.04-x86_64-ez # vzpkg create cache ubuntu-14.04-x86_64 # prlctl create Ubuntu --vmtype ct --ostemplate ubuntu-14.04-x86_64 # prlctl start Ubuntu # prlctl enter # prlctl set CentOS --memsize 1G --cpus 1 # prlctl set UbuntuVz7 --device-set hdd0 --size 100G # prlctl set CentOS --description «My first CentOS container» # prlctl list CentOS -o description -------------------------------------------------------------------- Андрей Маркелов Основы облачного хранилища данных Ceph Часть 2. Установка кластера # yum -y update # yum -y install epel-release # systemctl stop firewalld.service # systemctl disable firewalld.service [root@ceph1 ~]# useradd cephinstall [root@ceph1 ~]# passwd cephinstall [root@ceph1 ~]# cat << EOF >/etc/sudoers.d/cephinstall > cephinstall ALL = (root) NOPASSWD:ALL > Defaults:cephinstall !requiretty > EOF [root@ceph1 ~]# chmod 0440 /etc/sudoers.d/cephinstall [root@ceph1 ~]# su - cephinstall [cephinstall@ceph1 ~]$ ssh-keygen [cephinstall@ceph1 ~]$ ssh-copy-id cephinstall@ceph1 [cephinstall@ceph1 ~]$ ssh-copy-id cephinstall@ceph2 [cephinstall@ceph1 ~]$ ssh-copy-id cephinstall@ceph3 Host ceph1 Hostname ceph1 User cephinstall Host ceph2 Hostname ceph2 User cephinstall Host ceph3 Hostname ceph3 User cephinstall [cephinstall@ceph1 test-cluster]$ chmod 600 /home/cephinstall/.ssh/config [cephinstall@ceph1 ~]$ mkdir test-cluster [cephinstall@ceph1 ~]$ cd test-cluster [cephinstall@ceph1 test-cluster]$ ceph-deploy new ceph1 [cephinstall@ceph1 test-cluster]$ ls public_network = 192.168.122.11/24 cluster_network = 192.168.222.11/24 osd_pool_default_size = 2 osd_pool_default_min_size = 1 [root@ceph2 ~]# tail -f /var/log/messages [cephinstall@ceph1 test-cluster]$ ceph-deploy install ceph1 ceph2 ceph3 [cephinstall@ceph1 test-cluster]$ ceph-deploy purgedata ceph1 ceph2 ceph3 [cephinstall@ceph1 test-cluster]$ ceph-deploy forgetkeys [cephinstall@ceph1 test-cluster]$ ceph-deploy mon create-initial [cephinstall@ceph1 test-cluster]$ ceph-deploy disk zap ceph2:vdb ceph2:vdc ceph2:vdd [cephinstall@ceph1 test-cluster]$ ceph-deploy osd prepare ceph2:vdb ceph2:vdc ceph2:vdd [root@ceph2 ~]# fdisk -l /dev/vdb # yum -y install ceph ceph-radosgw $ uuidgen fsid = 1d618cdf-c648-4e9c-8aed-c170577a5d83 mon initial members = ceph1 mon host = 192.168.122.11 [root@ceph1 ~]# ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *' [root@ceph1 ~]# ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow' [root@ceph1 ~]# ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring [root@ceph1 ~]# monmaptool --create --add ceph1 192.168.122.11 --fsid 1d618cdf-c648-4e9c-8aed-c170577a5d83 /tmp/monmap [root@ceph1 ~]# monmaptool --print /tmp/monmap [root@ceph1 ~]# mkdir /var/lib/ceph/mon/ceph-ceph1/ [root@ceph1 ~]# ceph-mon --mkfs -i ceph1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring [root@ceph1 ~]# ls /var/lib/ceph/mon/ceph-ceph1/ keyring store.db 1 [global] 2 fsid = 1d618cdf-c648-4e9c-8aed-c170577a5d83 3 mon initial members = ceph1 4 mon host = 192.168.122.11 5 public network = 192.168.122.0/24 6 auth cluster required = cephx 7 auth service required = cephx 8 auth client required = cephx 9 osd journal size = 1024 10 osd pool default size = 2 11 osd pool default min size = 1 12 osd pool default pg num = 128 13 osd pool default pgp num = 128 [mon.ceph1] host = ceph1 mon addr = 192.168.122.11:6789 [root@ceph1 ~]# touch /var/lib/ceph/mon/ceph-ceph1/done [root@ceph1 ~]# /etc/init.d/ceph start mon.ceph1 [root@ceph1 ~]# ceph osd lspools [root@ceph1 ~]# ceph -s | grep mon [root@ceph2 ~]# mkfs.xfs /dev/vdb1 [root@ceph2 ~]# mkdir /var/lib/ceph/osd/ceph-0 [root@ceph2 ~]# echo "/dev/vdb1 /var/lib/ceph/osd/ceph-0 xfs defaults 0 1" >> /etc/fstab [root@ceph2 ~]# mount –a [osd.0] host = ceph2 ... [osd.5] host = ceph3 [root@ceph3 ~]# ceph osd create [root@ceph3 ~]# ceph-osd -i 5 --mkfs --mkkey [root@ceph3 ~]# ceph auth add osd.5 osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/ceph-5/keyring ceph auth list [root@ceph2 ~]# ceph --cluster ceph osd crush add-bucket ceph2 host [root@ceph2 ~]# ceph osd crush move ceph2 root=default [root@ceph1 ~]# ceph osd tree [root@ceph3 ~]# ceph osd crush add osd.5 1.0 host=ceph3 [root@ceph1 ~]# ceph -s [root@ceph1 ~]# ceph df ---------------------------------------------------------------------------------- Даниил Прахин Удаленный мониторинг Linux-серверов с GKrellM $ wget https://dl.fedoraproject.org/pub/epel/ epel-release-latest-6.noarch.rpm $ sudo rpm –i epel-release-latest-6.noarch.rpm $ sudo yum install gkrellm-daemon $ sudo service gkrellmd start C:\Program Files\GKrellM\bin\gkrellm.exe --server server-name --port port-number --------------------------------------------------------------------------- Александр Свириденко Особенности удаления файлов с внешней SD-карты в Android Листинг 1. Код класса FileMediaUtils.java import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.MediaStore; public class FileMediaUtils { private static Uri getFileUri(Context context, final String fullname) { Uri uri = null; Cursor cursor = null; ContentResolver contentResolver = null; try { contentResolver=context.getContentResolver(); if (contentResolver == null) return null; uri= MediaStore.Files.getContentUri("external"); String[] projection = new String[2]; projection[0] = "_id"; projection[1] = "_data"; String selection = "_data = ? "; String[] selectionParams = new String[1]; selectionParams[0] = fullname; String sortOrder = "_id"; cursor=contentResolver.query(uri, projection, selection, selectionParams, sortOrder); if (cursor!=null) { try { if (cursor.getCount() > 0) { cursor.moveToFirst(); int dataColumn = cursor.getColumnIndex("_data"); String s = cursor. getString(dataColumn); if (!s.equals(fullname)) return null; int idColumn = cursor.getColumnIndex("_id"); long id = cursor.getLong(idColumn); uri= MediaStore.Files. getContentUri("external",id); } else { ContentValues contentValues=new ContentValues(); contentValues.put("_data",fullname); uri = MediaStore.Files. getContentUri("external"); uri = contentResolver. insert(uri,contentValues); } } catch (Throwable e) { uri = null; } finally { cursor.close(); } } } catch (Throwable e) { uri=null; } return uri; } public static boolean deleteMTPFile(Context context, final String fullname) { Uri uri=getFileUri(context,fullname); if (uri==null) { return false; } try { ContentResolver resolver=context. getContentResolver(); ContentValues contentValues = new ContentValues(); int media_type = 4; contentValues.put("media_type", media_type); resolver.update(uri, contentValues, null, null); return resolver.delete(uri, null, null) > 0; } catch (Throwable e) { } return false; } } boolean res = true; res=file.delete(); if (!res) { FileMediaUtils.deleteMTPFile(context, file.getAbsolutePath()); } if(file.exists()) { ... } ---------------------------------------------------------------------------- Рашид Ачилов Построение корпоративных VPN Часть 9. VPN, IPSec и Linux -A INPUT -p esp -j ACCEPT -A OUTPUT -p esp -j ACCEPT -A INPUT -p udp -m multiport --source-ports 500,4500 -j ACCEPT -A OUTPUT -p udp -m multiport --destination-ports 500,4500 -j ACCEPT create vpnsubnets hash:net family inet hashsize 1024 maxelem 65536 add vpnsubnets 10.87.1.0/24 add vpnsubnets 10.42.1.0/24 add vpnsubnets 10.14.1.0/24 add vpnsubnets 10.54.1.0/24 -A INPUT -m set --match-set vpnsubnets src -j ACCEPT -A OUTPUT -m set --match-set vpnsubnets dst -j ACCEPT -A FORWARD -m set --match-set vpnsubnets src -j ACCEPT # tcpdump -i eth0 -n esp or port 4500 or port 500 -A INPUT -m policy --dir in --pol ipsec --mode tunnel --proto esp -j LOG --log-prefix "IPSec dir in input packet " -A OUTPUT -m policy --dir out --pol ipsec --mode tunnel --proto esp -j LOG --log-prefix "IPSec dir out output packet" -A OUTPUT -p udp -m multiport --destination-port 500,4500 -j TRACE -A PREROUTING -p udp -m multiport --destination-port 500,4500 -j TRACE -A OUTPUT -p esp -j TRACE -A PREROUTING -p esp -j TRACE -A INPUT -m set --match-set vpnsubnets src -j LOG --log-prefix "VPN subnets input " -A OUTPUT -m set --match-set vpnsubnets dst -j LOG --log-prefix "VPN subnets output " # cat /proc/net/xfrm_stat -A POSTROUTING -o eth0 -m policy --dir out --pol ipsec -j ACCEPT -A POSTROUTING -o eth0 -j SNAT --to-source 212.20.5.9 -A PREROUTING -i eth0 -m set --match-set vpnsubnets src -j ACCEPT -A PREROUTING -i eth0 -m set --match-set rfc1918 src -j MARK --set-mark 1 -A INPUT -m mark --mark 1 -j DROP # ip xfrm policy list # ip xfrm state list # swanctl –l [achilov@Kaktus] /ip ipsec installed-sa print # setkey –D # ipsec status ------------------------------------------------------------------- Сергей Болдин Инструменты для SCCM 2012 R2 ContentLibraryTransfer.exe -SourceDrive <диск-источник> -TargetDrive <диск-получатель> --------------------------------------------------------------------- Александр Пичкасов Управление почтовыми ящиками Exchange 2013 Листинг 1 # Входные параметры для выполнения param([string]$server="localhost", [int]$port=110, [string]$username, [string]$password) # Функция посимвольной передачи строки подготовленному # объекту сетевого сокета function write-stream([System.Net.Sockets.NetworkStream] $ns, [String]$s) { Write-Host Write-Host "-> $s" $arr = "$s`r`n".ToCharArray() $ns.Write($arr, 0, $arr.Length) } $client = New-Object System.Net.Sockets.TcpClient $client.Connect($server,$port) $stream = $client.GetStream() $sreader = New-Object System.IO.StreamReader($client.GetStream()) $rl = $sreader.ReadLine() Write-Host "Connect to $server on port $port" if ($rl -notlike "+OK*"){throw "Unable to connect: $rl"} else{$rl} write-stream $stream "user $username" $sreader.ReadLine() write-stream $stream "pass $password" $rl = $sreader.ReadLine() if ($rl -notlike "+OK*"){throw "Unable to login: $rl"} else{$rl} write-stream $stream "stat" $rl = $sreader.ReadLine() if ($rl -match "^\+OK (\d+) (\d+)") { $rl $msgs,$bytes = $matches[1],$matches[2] Write-Host "View top of each message." -foreground yellow If ($msgs –ne 0) { foreach ($i in 1..$msgs) { write-stream $stream "top $i 1" do { $rl = $sreader.ReadLine() if (($rl -like "subject:*") -or ($rl -like "from:*") -or ($rl -like "to:*")) {write-host $rl -foreground green} else {write-host $rl} } while ($rl -ne "." ) } } Write-Host "Summary: $bytes bytes in $msgs messages" –foregrount yellow } write-stream $Stream "quit" Write-Host PS> Start-Service msex*pop* Листинг 2 $setname = 'First','Second','Third' foreach ($namedb in $setname) {New-MailboxDatabase -name "MDBTest_$namedb" -LogFolderPath "c:\$namedb\logfld\" -EdbFilePath "c:\$namedb\$namedb.edb" -Server (hostname)} foreach ($namedb in $setname) {Mount-Database "MDBTest_$namedb"} $pass = ConvertTo-SecureString 'Pa$$w0rd' -AsPlainText –Force $ad0=(Get-AcceptedDomain)[0] New-Mailbox -Name "Adriano" -LastName "Guerra" -Database "MDBTest_First" -Password $pass -ResetPasswordOnNextLogon $false -DisplayName "Adriano Guerra" -Alias adriano -UserPrincipalName "adriano@$ad0" # Почтовый ящик в службе каталогов Active Directory: Get-Mailbox "adriano@$ad0" # Почтовый ящик в почтовой базе: Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} Листинг 3 .\ViewPOP3Mailbox.ps1 –username adriano –password 'Pa$$w0rd' # Почтовый ящик в службе каталогов Active Directory: Get-Mailbox "adriano@$ad0" | ft DisplayName,Database # Почтовый ящик в почтовой базе: Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft DisplayName,Database Листинг 4 Get-Mailbox adriano | New-MoveRequest –TargetDatabase "MDBTest_Second" –BatchName "Move_adriano" -CompletedRequestAgeLimit 0 Do {Start-Sleep 1} While (Get-MoveRequest -BatchName "Move_adriano") # Почтовый ящик в службе каталогов Active Directory: Get-Mailbox "adriano@$ad0" | ft DisplayName,Database # Структуры почтового ящика в почтовых базах: Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft DisplayName,Database Листинг 5 # Структуры почтового ящика в почтовых базах: Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft DisplayName,Database,ItemCount Send-MailMessage -SmtpServer localhost -From "administrator@$ad0" -To "adriano@$ad0" -Subject "Test active mailbox" .\ViewPOP3Mailbox.ps1 -username adriano -password 'Pa$$w0rd' # Изменения в структурах почтового ящика: Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft DisplayName,Database,ItemCount Листинг 6 # Структуры почтового ящика в почтовых базах: Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft DisplayName,Database,ItemCount Get-Mailbox "adriano@$ad0" | Set-Mailbox -Database MDBTest_Third –Force .\ViewPOP3Mailbox.ps1 -username adriano -password 'Pa$$w0rd' # Структуры почтового ящика в почтовых базах: Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft DisplayName,Database,ItemCount # Почтовый ящик в службе каталогов Active Directory: Get-Mailbox "adriano@$ad0" | ft DisplayName,Database PS> Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft DisplayName,Database,DisconnectReason Листинг 7 #Исходное состояние почтовых ящиков Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft DisplayName,Database,DisconnectReason #Отключение почтового ящика Get-Mailbox adriano | Disable-Mailbox -Confirm:$false Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft DisplayName,Database,DisconnectReason #Попытка подключения ящика в состоянии SoftDeleted Connect-Mailbox -Identity "Adriano Guerra" -User "adriano@$ad0" -Database MDBTest_First #Подключение почтового ящика в состоянии Disabled Connect-Mailbox -Identity "Adriano Guerra" -User "adriano@$ad0" -Database MDBTest_Second Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft DisplayName,Database,DisconnectReason #Повторное отключение почтового ящика Get-Mailbox adriano | Disable-Mailbox -Confirm:$false #Включение поддержки почты для учетной записи Enable-Mailbox -Identity "adriano@$ad0" -Alias adriano –Database MDBTest_Second Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft –a DisplayName,Database,DisconnectReason, MailboxGuid #Восстановление сообщений в активный почтовый ящик: #1.из почтового ящика в состоянии Disabled New-MailboxRestoreRequest -SourceDatabase MDBTest_Third -SourceStoreMailbox "Adriano Guerra" -AllowLegacyDNMismatch -TargetMailbox "adriano@$ad0" #2.из почтового ящика в состоянии SoftDeleted New-MailboxRestoreRequest -SourceDatabase MDBTest_First -SourceStoreMailbox "Adriano Guerra" -AllowLegacyDNMismatch -TargetMailbox "adriano@$ad0" #3.из почтового ящика в той же базе, с отличающимся Guid # Опция –AllowLegacyDNMismatch требуется, поскольку mailbox создан вновь и ему присвоен новый Guid $mbxguid = (Get-MailboxDatabase mdbtest_second | Get-MailboxStatistics | ? {$_.displayname -like "adriano*" -and $_.disconnectreason -eq "disabled"}).mailboxguid New-MailboxRestoreRequest -SourceDatabase MDBTest_Second -SourceStoreMailbox $mbxguid –AllowLegacyDNMismatch -TargetMailbox "adriano@$ad0" #Свойства структур почтового ящика в базах Get-MailboxDatabase | Get-MailboxStatistics | ? {$_.displayname -like "adriano*"} | ft –a DisplayName,Database,Itemcount, DisconnectReason,MailboxGuid Листинг 8 fsutil file createnew c:\attach5mb.bin 5000000 foreach ($i in 1..10) {Send-MailMessage -SmtpServer localhost -From "administrator@$ad0" -To "adriano@$ad0" -Subject "Test message n.$i with 5mb attachment" –Attachments c:\attach5mb.bin} Листинг 9 #*Имитация* резервного копирования и восстановления базы Dismount-Database MDBTest_Second –Confirm:$false Copy-Item C:\Second\* C:\second_restored -Recurse Mount-Database MDBTest_Second #Отправка сообщений после резервного копирования foreach ($i in 11..15) {Send-MailMessage -SmtpServer localhost -From "administrator@$ad0" -To "adriano@$ad0" -Subject "Delta mail message n.$i with 5mb attachment" –Attachments c:\attach5mb.bin} #*Имитация* повреждения почтовой базы MDBTest_Second Dismount-Database MDBTest_Second –Confirm:$false #Создание аварийной почтовой базы New-MailboxDatabase –name "MDBTest_Second_Dialtone" -LogFolderPath "c:\Second_Dialtone\logfld\" -EdbFilePath "c:\Second_Dialtone\Second_Dialtone.edb" -Server (hostname) #Переключение почтовых ящиков на аварийную базу Get-Mailbox -Database MDBTest_Second | Set-Mailbox -Database MDBtest_Second_Dialtone –Force #Монтирование аварийной почтовой базы и проверка доступа Mount-Database MDBTest_Second_Dialtone .\ViewPOP3Mailbox.ps1 -username adriano -password 'Pa$$w0rd' #Отправка сообщений после переключения на аварийную базу foreach ($i in 16..18) {Send-MailMessage -SmtpServer localhost -From "administrator@$ad0" -To "adriano@$ad0" -Subject "Dialtone database mail message n.$i with 5mb attachment" –Attachments c:\attach5mb.bin} #Изменение конфигурации исходной базы Move-DatabasePath “MDBTest_Second” –ConfigurationOnly -LogFolderPath "c:\Second_Restored\logfld\" -EdbFilePath "c:\Second_Restored\Second.edb" –Force –Confirm:$false #Копирование журналов транзакций Copy-Item c:\Second\logfld\E02*.log c:\Second_Restored\logfld #Возвращение почтовых ящиков в исходную базу Get-Mailbox –Database "MDBTest_Second_Dialtone" | Set-Mailbox -Database "MDBTest_Second" -Force #Монтирование почтовой базы и проверка доступности Mount-Database "MDBTest_Second" .\ViewPOP3Mailbox.ps1 -username adriano -password 'Pa$$w0rd' #Удаление аварийной базы Remove-MailboxDatabase “MDBTest_Second_Dialtone” #Создание почтовой базы восстановления на основе #существующих файлов аварийной базы New-MailboxDatabase -Recovery –name "MDBTest_Second_Recovery" -LogFolderPath "c:\Second_Dialtone\logfld_recovery\" -EdbFilePath "c:\Second_Dialtone\Second_Dialtone.edb" -Server (hostname) #Восстановление почтового ящика с уникальным Guid $mbxguid = (Get-Mailbox adriano).exchangeguid New-MailboxRestoreRequest -SourceDatabase MDBTest_Second -SourceStoreMailbox $mbxguid -AllowLegacyDNMismatch -TargetMailbox "adriano@$ad0” #Просмотр результата восстановлений .\ViewPOP3Mailbox.ps1 -username adriano -password 'Pa$$w0rd' Листинг 10 #Отправка тестовых сообщений foreach ($i in 21..25) {Send-MailMessage -SmtpServer localhost -From "administrator@$ad0" -To "adriano@$ad0" -Subject "Test mail message n.$i with 5mb attachment" –Attachments c:\attach5mb.bin} #Создание реплики почтовой базы #Временное отключение почтовой базы Dismount-Database mdbtest_second –Confirm:$false #Создание и подключение теневой копии $sco1 = (gwmi -List Win32_ShadowCopy).Create( "C:\", "ClientAccessible") $sco2 = gwmi Win32_ShadowCopy | ? {$_.ID -eq $sco1.ShadowID} $scdevice = $sco2.DeviceObject + "\" cmd /c mklink /d c:\shadow_copy $scdevice #Усечение журналов транзакций исходной базы eseutil.exe /r e02 /d C:\second_restored\second.edb -l C:\second_restored\logfld /t #Подключение почтовой базы Mount-Database mdbtest_second New-Item c:\Second_Replica -Type directory Copy-Item C:\shadow_copy\second_restored\* C:\Second_Replica -Recurse –Force #Отключение теневой копии cmd /c rmdir c:\shadow_copy #Отправка порции сообщений foreach ($i in 26..28) {Send-MailMessage -SmtpServer localhost -From "administrator@$ad0" -To "adriano@$ad0" -Subject "Delta mail message n.$i with 5mb attachment" –Attachments c:\attach5mb.bin} #*Имитация* повреждения почтовой базы MDBTest_Second Dismount-Database mdbtest_second –Confirm:$false #Восстановление работоспособности: #1. Копирование недостающих журналов транзакций Copy-Item C:\second_restored\logfld\e02*.log C:\Second_Replica\logfld #2. Перенастройка почтовой базы на использование альтернативных файлов Move-DatabasePath "mdbtest_second" -ConfigurationOnly -EdbFilePath C:\Second_Replica\second.edb -LogFolderPath C:\Second_Replica\logfld #3. Монтирование базы и проверка доступности Mount-Database mdbtest_second .\ViewPOP3Mailbox.ps1 -username adriano -password 'Pa$$w0rd' --------------------------------------------------------------------- Валерий Михеичев Мониторинг блокировок в Oracle Часть 2. Практический опыт диагностики блокировок Select --кого блокируют s1.sid is_sid,s1.serial# is_serial#, s1.username is_username, s1.schemaname is_schemaname, s1.osuser is_osuser, s1.program is_program, s1.state is_state, s1.sql_exec_start is_sql_exec_start, s1.sql_id is_sid, (select v.sql_text from v$sql v where v.sql_id=s1.sql_id and rownum=1) is_sql_text, -- кто блокируют s2.sid who_sid, s2.serial# who_serial#, s2.username who_usename, s2.schemaname who_schemaname, s2.osuser who_osuaser, s2.program who_program, s2.state who_state, s2.sql_exec_start who_sql_start, s2.sql_id who_sql_id, (select v.sql_text from v$sql v where v.sql_id=s2.sql_id and rownum=1) who_sql_text from v$session s1, v$session s2 where s1.blocking_session=s2.sid; Листинг 1. Диагностический запрос блокировок двух сессий с определением имени заблокированной таблицы и имени хранимой процедуры с заблокированной DML-операцией Select a.* from (select --кого блокируют s2.sid is_sid,s2.serial# is_serial#, s2.seconds_in_wait is_seconds_in_wait, i2.type is_type, i2.lmode is_mode, i2.request is_request,s2.username, (select o.owner||'.'||object_name from dba_objects o where o.object_id=v2.object_id) is_obj_lock, trim(substr((select o.object_name from dba_objects o where o.object_id=v2.object_id),1,30)) is_table, (select sql_text from v$sql v where v.sql_id=s2.sql_id and rownum=1) is_sql_text, (select min(lower(p.object_type)||'=>'||p.owner||'.'||p.object_name) from dba_objects p where p.object_id=(select v.program_id from v$sql v where v.sql_id=s2.sql_id and rownum=1) and rownum=1) is_plsql_object, (select v.program_line# from v$sql v where v.sql_id=s2.sql_id and rownum=1) is_program_line, -- кто блокирует s1.sid who_sid, s1.serial# who_serial,s1.seconds_in_wait who_seconds_in_wait, i1.type who_type, i1.lmode who_lmode, i1.request who_request, s1.username who_username, (select o.owner||'.'||object_name from dba_objects o where o.object_id=v1.object_id) who_obj_lock, (select sql_text from v$sql v where v.sql_id=s1.sql_id and rownum=1) who_sql_text from v$lock i2,v$session s2, v$lock i1,v$session s1, v$locked_object v1,v$locked_object v2 where i1.block = 1 and i2.request > 0 and i1.id1 =i2.id1 and i1.id2 = i2.id2 and s1.sid =i1.sid and s2.sid=i2.sid and s2.blocking_session=s1.sid and v1.session_id =s1.sid and v2.session_id =s2.sid) a where a.is_obj_lock=a.who_obj_lock and instr(trim(upper(a.is_sql_text)),a.is_table)>0 and (upper(a.is_sql_text) like 'UPDATE%' or upper(a.is_sql_text) like 'DELETE%' or upper(a.is_sql_text) like 'INSERT%' or upper(a.is_sql_text) like '%FOR UPDATE%' or upper(is_sql_text) like 'MERGE%' or upper(who_sql_text) like 'CREATE_INDEX%') Select * from v$sql_monitor where sid=who_sid and session_serial#=who_serial# order by sql_exec_start, key. Select v.* v$sql_plan_monitor v where v.key=key. Select s1.sid is_sid, s2.sid who_sid, s3.sid who_who_sid, s4.sid who_who_who_sid from v$session s1,v$session s2,v$session s3,v$session s4 where s1.blocking_session=s2.sid and s2.blocking_session=s3.sid and s3.blocking_session=s4.sid(+) order by 2,1 ------------------------------------------------------------------------- Андрей Пахомов Современное клиент-серверное приложение для платформы Android compile 'com.squareup.retrofit:retrofit:2.0.0-SNAPSHOT' compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' http://api.openweathermap.org/data/2.5/forecast/daily?q=Moscow,ru&units=metric&cnt=7&appid=uniq_id public interface RequestAPI { ... @GET("/data/2.5/forecast/daily") Call loadForecast(@Query("q") String city, @Query("units") String units, @Query("cnt") String cnt, @Query("appid") String appid); {"city":{"id":524901,"name":"Moscow","coord":{…}, "country":"RU",…}, … list":[{"dt":1448182800, "temp":{"day":5.58,"night":5.42,…}, "… "weather":[{…"main":"Snow","icon":"13d"}], "speed":2.06,…}, {"dt":1448269200, …]} @SerializedName("city") @Expose private CityData city = new CityData(); public class CityData{ @SerializedName("name") @Expose public String cityName;...} @SerializedName("list") @Expose public List dayData=new ArrayList(); @SerializedName("temp") @Expose public Temp tempInfo = new Temp(); @SerializedName("weather") @Expose public List weatherInfo = new ArrayList(); … final Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://api.openweathermap.org") .addConverterFactory(GsonConverterFactory.create()) .build(); compile 'com.android.support:cardview-v7:23.0.+' public class DayFrct { String dayTemp; String nightTemp; String image; … public DayFrct(String date, …) {this.image=image; this.dayTemp=dayTemp;…} compile 'com.android.support:recyclerview-v7:23.0.+' public class FrcstAdapter extends RecyclerView.Adapter { List days; FrcstAdapter(List days) {this.days = days;} public class Frcst extends RecyclerView.ViewHolder { ImageView NDImage; TextView dayForecast; ... Frcst(View itemView) { super(itemView); nightForecast = (TextView)itemView.findViewById(R.id.ndF2); date = (TextView)itemView.findViewById(R.id.date);…} public Frcst onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.next_day, viewGroup, false); Frcst frcstViewHolder = new Frcst(v); return frcstViewHolder;} public int getItemCount() { return days.size();} public void onBindViewHolder(final Frcst itemVH, int i) { itemVH.dayForecast.setText("Day: "+ days.get(i).getDayTemp()+"C");...} ------------------------------------------------------ Александр Календарев RabbitMQ. Вырастаем из штанишек Пример 1. Создание очереди, обмена и их привязки друг к другу connect(); $channel = new AMQPChannel($rabbit); $exchange = new AMQPExchange($channel); $exchange->setFlags(AMQP_DURABLE); $exchange->setName('to_worker'); $exchange->setType(AMQP_EX_TYPE_DIRECT); $exchange->declare(); $queue = new AMQPQueue($channel); $queue->setFlags(AMQP_DURABLE); $queue->setName('worker'); $queue->declare(); $queue->bind('to_worker', 'work'); Пример 2. Отправка сообщения получателю connect(); $channel = new AMQPChannel($rabbit); $exchange = new AMQPExchange($channel); $exchange->setFlags(AMQP_DURABLE); $exchange->setName('to_worker'); // отправка сообщения $exchange->publish($data,'work',0, ['delivery_mode'=>2, 'content_type'=> 'application/json', 'content_encoding'=>'utf8'] ); Пример 3. Асинхронный прием сообщения методом GET connect(); $channel = new AMQPChannel($rabbit); $queue = new AMQPQueue($channel); $queue->setName('worker'); // организуем цикл работы задачи на 10 мин, чтобы избежать // утечек памяти каждые 10 мин по крону запускаем новую задачу $t = time() + 10 * 60; $sleep = 100; // задаем промежуток засыпания while ( $t < time() ) { $msg = $queue->get(AMQP_AUTOACK); if ($msg != false) { // тут происходит обработка сообщения var_dump($msg->getBody()); } usleep($sleep); } $rabbit->disconnect(); Пример 4. Синхронный прием сообщения, метод CONSUME //фyнкция обработки сообщения function processMessage($envelope, $queue) { echo 'Message: ',$envelope->getBody(),PHP_EOL; $queue->ack( $envelope->getDeliveryTag() ); } //основной код try { $rabbit = new AMQPConnection(); } catch (AMEQConnectionException $e) { die('Connection abort'); } $res = $rabbit->connect(); $channel = new AMQPChannel($rabbit); $queue = new AMQPQueue($channel); $queue->setName('workers'); $queue->consume("processMessage"); Пример 5. Мониторинг длины очереди import pika connection = None try: connection = pika.BlockingConnection() except Exception as err: print -1 quit() channel = connection.channel() msg = channel.basic_get(queue="worker", no_ack=False) connection.close() if msg[0] == None: print 0 quit() print msg[0].message_count Пример 6. Тип обмена fanout, объявление обмена $rabbit = new AMQPConnection(); $res = $rabbit->connect(); $channel = new AMQPChannel($rabbit); $exchange = new AMQPExchange($channel); // задаем имя обмену $exchange->setName('mfanout'); // задаем тип fanout $exchange->setType(AMQP_EX_TYPE_FANOUT); // объявляем обмен $exchange->declare(); Пример 7. Связь очереди и обмена типа fanout $res = $rabbit->connect(); $сhannel = new AMQPChannel($rabbit); $queue = new AMQPQueue($сhannel); // задаем имя очереди $queue->setName('consume'); // объявляем очередь $queue->declare(); // связываем очередь и обмен $queue->bind('mfanout', ''); // значение поля ключ не используется $queue->setName('consume'); Пример 8. Задание флага эксклюзивного режима для очереди $queue->setName('consume'); $queue->setFlags(AMQP_EXCLUSIVE); $queue->declare(); $php consume.php Пример 9. Привязка обмена сразу к нескольким очередям $queue = new AMQPQueue($сhannel); $queue->setName('worker'); $queue->bind('to_worker', 'logs'); $queue->bind('to_worker', 'jobs'); $sudo rabbitmqctl list_bindings Пример 10. Реализация распределения сообщений для типа обмена topic $exchange = new AMQPExchange($channel); // задаем имя обмену $exchange->setName('quotation'); // задаем тип topic $exchange->setType(AMQP_EX_TYPE_TOPIC); // объявляем обмен $exchange->declare(); $queue = new AMQPQueue($сhannel); $queue->setName('RTSB'); $queue->declare(); $queue->bind('quotation', 'RTSB.*'); $queue->setName('Gazprom'); $queue->declare(); $queue->bind('quotation', '*.gazprom'); $queue->setName('Oil'); $queue->declare(); $queue->bind('quotation', '*.oil.*'); Пример 11. Задание обмена типа headers $ex = new AMQPExchange($channel); $ex->setType(AMQP_EX_TYPE_HEADERS); // задаем тип headers $ex->setName('tracer'); $ex->declare(); Пример 12. Связь обмена типа headers и очереди import pika connection = pika.BlockingConnection() ch = connection.channel() ch.queue_bind(exchange='tracer', queue='worker', arguments={'operation': 'log', 'x-match':'any'}) $ sudo rabbitmqctl list_bindings Пример 13. Публикация сообщения с заданием заголовков $exchange = new AMQPExchange($channel); $exchange->setName('tracer'); $data = json_encode([1,2,3, rand(0, 1000)]); // задаем необходимый заголовок $headers = ['operation' => 'log']; // задаем аргументы $args = ['delivery_mode'=>2, 'content_type'=> 'text/json', 'headers' => $headers ]; // публикуем сообщение $exchange->publish($data,'tracer',0,$args); Пример 14. Создание связи очереди с обменом типа headers import pika connection = None try: connection = pika.BlockingConnection() except Exception as err: print 'AMQP connection error' quit() ch = connection.channel() ch.queue_declare(queue='traces') ch.queue_bind(exchange='tracer', queue='tracer', arguments={'operation': 'trace', 'x-match':'any'}) Пример 15. Дублированный обмен. Создаем связь между очередями и обменом по одному ключу $queue = new AMQPQueue($сhannel); $queue->setName('Queue1'); $queue->declare(); $queue->bind('ex1', 'key'); $queue->setName('Queue2'); $queue->declare(); $queue->bind('ex1', 'key'); Пример 16. Создание связи между двумя обменами $exchange = new AMQPExchange($channel); $exchange->setName('to_worker'); $exchange->setType(AMQP_EX_TYPE_FANOUT); // объявляем обмен to_worker $exchange->declare(); // связываем его с очередью $exchange->bind('worker', '' ); // объявляем обмен tracer $exchange->setName('tracer'); $exchange->setType(AMQP_EX_TYPE_HEADERS); $exchange->declare(); // возвращаемся к обмену to_worker $exchange->setName('to_worker'); // связываем его с обменом tracer $exchange->bind('tracer', '' ); // далее обмен tracer можно связать с «архивными» очередями // и делать между ними перенаправления по заголовкам. $channel = new AMQPChannel($rabbit); $exchange = new AMQPExchange($channel); $exchange->setFlags(AMQP_DURABLE); $exchange->setName('to_worker'); $exchange->setType(AMQP_EX_TYPE_DIRECT); $exchange->declare(); $queue = new AMQPQueue($channel); $queue->setFlags(AMQP_AUTODELETE); $queue->setName('worker'); $queue->declare(); $queue->bind('to_worker', 'work'); $queue->setFlags(AMQP_DURABLE); $queue->setName('garbage'); $queue->declare(); $queue->bind('to_worker', 'work'); Пример 17. Создание очереди-корзины $queue->setName('worker'); $queue->delete(); $queue->setArgument('x-dead-letter-exchange','garbage'); $queue->declare(); $queue->bind('to_worker', 'work'); $ java -cp rabbitmq-client.jar:commons-io-1.2.jar: commons-cli-1.1.jar com.rabbitmq.tools.Tracer677 $rabbit = new AMQPConnection(array('host' => '127.0.0.1', 'port' => '5677')); ------------------------------------------------------------------------- Олег Филиппов Разрабатываем биржевого робота Часть 2. Использование пакета MATLAB Data = Income(:,1:5) Targets=Income(:,6) nnstart ------------------------------------------------------------------------- Анна Сергеева Первые шаги в тестировании Инсталлируем и конфигурируем JMeter java –version set HEAP=-Xms512m -Xmx512m set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m set HEAP=-Xms512m -Xmx2048m set NEW=-XX:NewSize=128m -XX:MaxNewSize=1024m jmeter -n -t myScript.jmx -------------------------------------------------------------------------- Алексей Вторников Трудный путь наверх public class Josephus { public Josephus () { int q = 40, delta = 3; System.out.println (josephus (q, delta)); } int josephus (int n, int k) { return josephus (n, k, 1); } int josephus (int n, int k, int startingPoint) { if (n == 1) return 1; int newSp = (startingPoint + k - 2) % n + 1; int survivor = josephus (n - 1, k, newSp); if (survivor < newSp) { return survivor; } else { return survivor + 1; } } public static void main (String [] args) { new Josephus (); } } ---------------------------