Управление Xen/KVM с помощью ConVirt Сергей Яремчук $ sudo apt-cache show convirt | grep –i version $ sudo apt-get install python yelp python-rpm python-vte python-paramiko python-gtk2 python-xen-3.3 python-glade2 xen-utils ssh vncviewer socat uml-utilities dnsmasq mysql-server build-essential libdbd-mysql-perl libdbi-perl libhtml-template-perl ssh libxen3 vncviewer bridge-utils $ sudo apt-get install python-setuptools $ mysql -u root -p mysql> use mysql; mysql> update user set password=PASSWORD("convirt") where User="root"; mysql> flush privileges; mysql> quit sqlalchemy.url=mysql://root:convirt@localhost:3306/convirt?charset=utf8 $ mkdir ~/.ssh/ $ wget --no-cache http://www.convirture.com/downloads/convirt/2.0/convirt-install-2.0.tar.gz $ tar -xzf convirt-install-2.0.tar.gz $ sudo ./convirt-install/install/cms/scripts/install_dependencies $ sudo ./convirt-install/install/cms/scripts/install_convirt $ wget -c http://www.convirture.com/downloads/convirture-tools/2.0/convirture-tools-2.0.tar.gz $ tar xzvf convirture-tools-2.0.tar.gz $ cd convirture-tools-2.0/install/managed_server/scripts $ sudo ./convirt-tool --detect_only setup $ ./convirt-tool setup $ cd ~/convirt $ sudo ./convirt-ctl start ----------------------------------------------------------------------------------------------------------------- Эти загадочные роли FSMO Никита Панов @echo off REM REM Script to dump FSMO role owners on the server designated by %1 REM if ""=="%1" goto usage Ntdsutil roles Connections "Connect to server %1" Quit "select Operation Target" "List roles for connected server" Quit Quit Quit goto done :usage @echo Please provide the name of a domain controller (i.e. dumpfsmos MYDC) @echo. :done ----------------------------------------------------------------------------------------------------------------- LemonLDAP::NG. Единая аутентификация для веб-приложений Сергей Яремчук $ sudo apt-cache show lemonldap-ng | grep –i version $ sudo apt-get build-dep lemonldap-ng $ sudo apt-get install libconfig-inifiles-perl libnet-twitter-perl libnet-openid-consumer-perl libcrypt-openssl-x509-perl $ sudo apt-get install libapache2-mod-perl2 libapache2-reload-perl libbsd-resource-perl $ wget -c http://download.forge.objectweb.org/lemonldap/lemonldap-ng-1.0rc2.tar.gz $ wget –c http://forge.objectweb.org/svnsnapshots/lemonldap-svn-latest.tar.gz $ tar xzf lemonldap-ng-1.0rc2.tar.gz $ cd lemonldap-ng-1.0rc2 $ make $ sudo make configure $ make test $ sudo make install $ sudo nano /etc/apache2/apache2.conf … include /usr/local/lemonldap-ng/etc/portal-apache2.conf include /usr/local/lemonldap-ng/etc/handler-apache2.conf include /usr/local/lemonldap-ng/etc/manager-apache2.conf $ sudo a2enmod perl $ sudo service apache2 restart $ sudo ln-s /usr/local/lemonldap-ng/etc/lemonldap-ng.ini /etc/lemonldap-ng/ $ sed -i 's/example.com/ваш_домен/g' /etc/lemonldap-ng/apache2.conf /etc/lemonldap-ng/apps-list.xml /var/lib/lemonldap-ng/conf/lmConf-1 /etc/lemonldap-ng/apply.conf /var/lib/lemonldap-ng/test/index.p $ grep -iR example.com /usr/local/lemonldap-ng/* $ cd /usr/local/lemonldap-ng/ $ sed -i 's/example.com/ваш_домен/g' ./data/conf/lmConf-1 ./examples/portal/AuthLA/ressources/lemonsp-metadata.xml ./examples/portal/index_simple.pl ./handler/MyHandler.pm ./htdocs/manager/skins/default/manager.js $ cat /usr/local/lemonldap-ng/etc/for_etc_hosts $ sudo mv –v /usr/local/lemonldap-ng/etc/cron.d/lemonldap-ng /etc/cron.d/ ServerName application.com PerlRequire MyFile PerlHeaderParserHandler My::Package ProxyPass / http://server.com/ ProxyPassReverse / http://server.com/ ----------------------------------------------------------------------------------------------------------------- FP_Netmapper. Создаем схемы локальной сети Юрий Винник TNetObj = record dx, dy, id, Dev_ID: Integer; addr: String; fpid: Longint; end; TNetLink = record xc, y1c, y2c, id1, id2: Integer; fl_net: Byte; end; mysql -u root -p < ./fp_netmapper.sql GRANT SELECT,INSERT,DELETE,UPDATE ON freepinger.* TO 'freepinger'@'%' IDENTIFIED BY 'freepinger'; ----------------------------------------------------------------------------------------------------------------- Систем ПОТ много – выберите свою. Screen как средство персональной организации Игорь Штомпель sudo apt-get install alpine abook calcurse elinks finch newsbeuter note 01 hardstatus alwayslastline "%{yb} %c %H %=[ %w ] " 02 03 screen -t alpine 04 exec /usr/bin/alpine 05 06 screen -t abook 07 exec /usr/bin/abook 08 09 screen -t calcurse 10 exec /usr/bin/calcurse 11 12 screen -t note 13 exec /usr/bin/note 14 15 screen -t newsbeuter 16 exec /usr/bin/newsbeuter 17 18 screen -t nano 19 exec /usr/bin/nano 20 21 screen -t elinks 22 exec /usr/bin/elinks 23 24 screen -t finch 25 exec /usr/bin/finch 26 27 screen -t wget 28 29 select 0 exec /usr/bin/alpine Ivanov Ivan — Project A /FirstA/ /FirstA/FirstB /FirstA/ note1 cd FirstA cd FirstB $ newsbeuter -i feeds.xml $ newsbeuter browser elinks http://lkml.org/rss.php kernel linux www.samag.ru resize -h -l 25 ----------------------------------------------------------------------------------------------------------------- Access Based Enumeration. Установка и управление Иван Коробко Листинг 1. Объявление API-функции в VB.NET Public Class ABE ' Описание функции Declare Unicode Function NetShareSetInfo Lib "netapi32.dll" (ByVal ServerName As String, ByVal NetName As String, ByVal Level As Integer, ByVal Buf As IntPtr, ByRef Parm_Err As Integer) As Integer … End Class Листинг 2. Объявление структуры в VB.NET Public Structure _SHARE_INFO_1005 Public val As Integer End Structure Листинг 3. Функция для определения размера объекта Public Function VarPtr(ByVal e As Object) As Integer Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned) Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32 GC.Free() Return GC2 End Function Листинг 4. Функция для определения размера объекта Public Class Form1 ' Описание API-функции Declare Unicode Function NetShareSetInfo Lib "netapi32.dll" (ByVal servername As String, ByVal netname As String, ByVal level As Integer, ByVal buf As IntPtr, ByRef parm_err As Integer) As Integer ' Описание структуры Public Structure _SHARE_INFO_1005 Public val As Integer End Structure ' Описание глобальных переменных Public obj As _SHARE_INFO_1005 ' Определение размера данных в структуре Public Function VarPtr(ByVal e As Object) As Integer Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned) Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32 GC.Free() Return GC2 End Function ' Управление ABE Private Function ABE(ByVal Server As String, ByVal Share As String, ByVal Status As Boolean) As Integer Select Case Status Case True obj.val = &H800 ' Включение ABE Case False obj.val = &H0' Выключение ABE End Select Dim Err_Code As Integer = NetShareSetInfo(ServerNamePrivate, ShareName, 1005, VarPtr(obj), err) Return Err_Code End Function End Class Листинг 5. Создание удаленного сеанса на PowerShell от имени заданного пользователя # Настройка службы WinRM на рабочей станции winrm quickconfig # Назначение имени сервера $server = Esmiralda # Создание удаленного сеанса Invoke-Command -ComputerName $server -Credential "" -ScriptBlock {***} # *** — сценарий, который необходимо выполнить на удаленном компьютере Листинг 6. Вызов VB.NET вставки из PowerShell $provider = New-Object Microsoft.VisualBasic.VBCodeProvider $params = New-Object System.CodeDom.Compiler.CompilerParameters $params.GenerateInMemory = $True $refs = "System.dll","Microsoft.VisualBasic.dll" $params.ReferencedAssemblies.AddRange($refs) $txtCode = @" Imports Microsoft.VisualBasic.Interaction Class ClassName Sub mBox(a) MsgBox (a) End Sub End Class "@ $results = $provider.CompileAssemblyFromSource($params, ↵ $txtCode) $mAssembly = $results.CompiledAssembly $i = $mAssembly.CreateInstance("ClassName") $r = $i.mBox("Текстовое сообщение") Листинг 7. Сценарий, который включает или выключает ABE # Настройка WinRM на локальной рабочей станции winrm quickconfig # Определение значений имени сервера, сетевой папки, статуса ABE $server = "*****" $share="*****" $flag= 0 #True - Вкл ABE/False - Выкл ABE # Создание удаленного сеанса Invoke-Command -ComputerName $server -Credential "" -ScriptBlock { # Определение настроек компилятора $provider = New-Object Microsoft.VisualBasic. VBCodeProvider $params = New-Object System.CodeDom.Compiler. CompilerParameters $params.GenerateInMemory = $True # Список подгружаемых DLL-библиотек $refs = "System.dll","Microsoft.VisualBasic.dll", "mscorlib.dll" $params.ReferencedAssemblies.AddRange($refs) # Интерпретируемый программный код на VB.NET $txtCode = @" # Импорт пространств имен imports system imports System.Runtime.InteropServices imports microsoft.visualbasic.interaction # Описание класса Class Share # Объявление API-функции Declare Unicode Function NetShareSetInfo Lib "netapi32.dll" (ByVal servername As String, ByVal netname As String, ByVal level As Integer, ByVal buf As IntPtr, ByRef parm_err As Integer) As Integer # Объявление структуры Public Structure _SHARE_INFO_1005 Public val As Integer End Structure # Объявление глобальных переменных Public level As Integer = 1005 Public err As Integer Public obj As _SHARE_INFO_1005 # Пользовательская функция, управляющая ABE Function ABE(ByVal ServerNamePrivate As String, ByVal ShareName As String, ByVal Status As Boolean) As Integer dim obj As _SHARE_INFO_1005 Select Case Status case True obj.val = &H800 ' Включение ABE case False obj.val = &H0' Выключение ABE End Select Dim c As Integer = NetShareSetInfo(ServerNamePrivate, ShareName, 1005, VarPtr(obj), err) Return c End Function # Пользовательская функция для определения размера # структуры Function VarPtr(ByVal e As Object) As Integer Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned) Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32 GC.Free() Return GC2 End Function End Class "@ $txtcode # Компиляция и выполнение программного кода $results = $provider.CompileAssemblyFromSource($params, $txtCode) $mAssembly = $results.CompiledAssembly # Получение доступа к классу VB.NET $i = $mAssembly.CreateInstance("Share") # Вызов функции ABE в VB.NET, передача ей параметров $r = $i.ABE($server,$share,$flag) # Чтение и обработка возвращенного If (r –eq 0) {Write-Host "Работа завершена успешно."} Else {Write-Host "Некорректно заданы параметры."} } ----------------------------------------------------------------------------------------------------------------- Атаки из сети Интернет и методы борьбы с ними Юрий Денисов no ip http server no ip http secure-server access-list 99 permit 10.0.0.0 0.0.0.255 line vty 0 4 access-class 99 in login local logging alarm informational logging origin-id hostname logging facility local1 logging source-interface GigabitEthernet0/2.1 logging 10.0.0.2 ip cef ip route-cache flow ip flow ingress ip flow egress ip flow-export source INTERFACE ip flow-export version 5 ip flow-export destination X.X.X.X Core_7206VXR#show ip cache flow ip verify unicast reverse-path ip access-list extended ACL_IN deny ip X.X.X.X 0.0.0.255 any log permit ip any X.X.X.X 0.0.0.255 interface INTERFACE ip access-group ACL_IN in access-list 2000 permit icmp any any rate-limit output access-group 2000 64000 8000 8000 confirm-action transmit exceed-action drop access-list 100 permit tcp any X.X.X.X 0.0.0.255 ip tcp intercept list 100 ----------------------------------------------------------------------------------------------------------------- Генерация отчетов по текстовым шаблонам Алексей Вторников // Генератор отчетов по шаблону из текста // fplab@inbox.ru import java.util.*; public class ReportByTemplate { private ArrayList lines = new ArrayList (); // Шаблон private TreeMap parms = new TreeMap (); // Параметры private String buffer = ""; // Буфер шаблона private int pos = 0, // Позиция в строке len = 0, // Длина строки ch = 0; // Текущий символ private int parCnt = 0, // Количество параметров counter = 0; // Счетчик ПС // Загрузить шаблон public void loadTemplate (String str) { StringBuffer sb = new StringBuffer (); lines.clear (); buffer = str; pos = 0; len = buffer.length (); nextCh (); while (ch != -1) { switch (ch) { // Сформированную строку -> в список case '\n': lines.add (sb.toString ()); sb = new StringBuffer (); break; // Формировать дальше default : sb.append ((char)ch); break; } nextCh (); } } // Загрузить коллекцию параметров public void loadParameters (TreeMap p) { parCnt = p.size (); if (parCnt == 0) return; parms.clear (); for (int i = 0; i < parCnt; i++) { parms.put (i, p.get (i)); } } // Сформировать отчет public void createReport () { int numOfLines = lines.size (); // Инициализировать счетчик ПС counter = 0; // Шаблон пуст -> печатать нечего if (numOfLines == 0) return; // Перебор строк шаблона for (int i = 0; i < numOfLines; i++) { buffer = lines.get (i); if (buffer.indexOf ('#') < 0) { // Если в строке отсутствуют символы '#' -> напечатать эту строку out (buffer); } else { // Если в строке имеются символы '#' -> обработатьэту строку out (scanLine (buffer)); } } } // Вернуть строку, заполненную символами '.' private String fillByUndefined (int n) { StringBuffer b = new StringBuffer (); for (int i = 0; i < n; i++) { b.append ("."); } return b.toString (); } // Вернуть строку, заполненную символами ' ' private String fillBySpaces (int n) { StringBuffer b = new StringBuffer (); for (int i = 0; i < n; i++) { b.append (" "); } return b.toString (); } // Сканирование строки шаблона и формирование строки отчета private String scanLine (String str) { int posStart = 0, // Начало ПС posEnd = 0; // Конец ПС String value = ""; // Подставляемое значение StringBuffer sb = new StringBuffer (); // Буфер формирования строки // Инициализировать pos = 0; len = str.length (); ch = 0; // Посимвольное сканирование строки шаблона nextCh (); while (ch != -1) { posStart = posEnd = 0; switch (ch) { case '#': posStart = pos - 1; while (ch == '#') { sb.append ((char)ch); nextCh (); } // Прочитан символ (за '#') -> вернуть его // во входной поток pos--; posEnd = pos; // Количество ПС превышает // Количество параметров для подстановки if (counter > parCnt - 1) { value = fillByUndefined (posEnd - posStart); sb = sb.replace (posStart, posEnd, value); break; } // Заменить ПС значением value = parms.get (counter); if (value.length () > posEnd - posStart) { value = value.substring (0, posEnd - posStart); } if (value.length () < posEnd - posStart) { value = value + fillBySpaces (posEnd - posStart - value.length ()); } sb = sb.replace (posStart, posEnd, value); counter++; break; default : sb.append ((char)ch); break; } nextCh (); } return sb.toString (); } // Получить в переменную ch очередной символ из строки private void nextCh () {if (pos < len) ch = buffer.charAt (pos++); else ch = -1;} // Печать строки отчета private void out (String line) {System.out.println (line);} } value = parms.get (counter), import java.util.*; public class Card { private String template = "******************************************************************************\n" + "* Подразделение: ################################################ *\n" + "* Должность: ########################################################## *\n" + "* *\n" + "* Фамилия: ####################################### *\n" + "* Имя: ######################## *\n" + "* Отчество: ################################ *\n" + "* Дата рождения: ########## г. *\n" + "* Место рождения: ########################################################## *\n" + "* *\n" + "* Стаж работы: с ########## г. Оклад: ######## руб. Бонус: ### % *\n" + "* Телефон: #################### *\n" + "* *\n" + "* Дата составления анкеты: ########## г. *\n" + "******************************************************************************\n"; public Card () { ReportByTemplate rep = new ReportByTemplate (); TreeMap par = new TreeMap (); // Заполнить контейнер данными par.put (0, "Союз Меча и Орала"); par.put (1, "Особа, приближенная к императору"); par.put (2, "Воробьянинов"); par.put (3, "Ипполит"); par.put (4, "Матвеевич"); par.put (5, "01.10.1875"); par.put (6, "г.Старгород"); par.put (7, "13.04.1926"); par.put (8, "14000.00"); par.put (9, "150"); par.put (10, "нет данных"); par.put (11, "30.09.2010"); rep.loadTemplate (template); // Загрузить шаблон rep.loadParameters (par); // Загрузить данные rep.createReport (); // Сгенерировать отчет } public static void main (String [] args) {new Card ();} } Connection conn = null; ... // Выборка данных public void setData () { int key = 0; SimpleDateFormat f = new SimpleDateFormat ("dd.MM.yyyy", Locale.US); try { Statement st = conn.createStatement (); ResultSet rs = st.executeQuery («SELECT ... FROM table WHERE ..."); while (rs.next ()) { key = 0; par.put (key++, rs.getString (1).toString ()); par.put (key++, rs.getString (2).toString ()); par.put (key++, rs.getString (3).toString ()); par.put (key++, rs.getString (4).toString ()); par.put (key++, rs.getString (5).toString ()); par.put (key++, f.format (rs.getDate (6)).toString ()); par.put (key++, rs.getString (7).toString ()); par.put (key++, f.format (rs.getDate (8)).toString ()); par.put (key++, String.format ("%8.2f", rs.getDouble (9))); par.put (key++, rs.getString (10).toString ()); par.put (key++, rs.getString (11)); par.put (key++, f.format (rs.getDate (12)).toString ()); rep.loadParameters (par); rep.createReport (); } // Закрыть результирующее множество if (rs != null) { try {rs.close ();} catch (SQLException sqle) {} finally {rs = null;} } st.close (); } catch (SQLException sqle) {} } ----------------------------------------------------------------------------------------------------------------- Painkiller для администратора. Аудит файловой системы своим руками Андрей Понарев int main(int argc, char *argv[]) C:\some.exe a b Argv[0] = "C:\some.exe" Argv[1] = "a" Argv[2] = "b" BOOL ReadDirectoryChangesW(HANDLE hDirectory, LPVOID lpBuffer, DWORD nBufferLength, BOOL bWatchSubtree, DWORD dwNotifyFilter, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); HANDLE hDir = CreateFile(argv[1], FILE_LIST_DIRECTORY, FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); #define dwBuffSize 0xf000 BYTE *lpBuffer; DWORD dwReturnedBytes = 0; lpBuffer = (BYTE *)malloc(dwBuffSize); ReadDirectoryChangesW(hDir, lpBuffer, dwBuffSize, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_CREATION, &dwReturnedBytes, NULL, NULL); struct _FILE_NOTIFY_INFORMATION { DWORD NextEntryOffset; DWORD Action; DWORD FileNameLength; WCHAR FileName[1]; } DWORD dwSeek = 0; while(dwSeek < dwBuffSize) { PFILE_NOTIFY_INFORMATION pNotify = PFILE_NOTIFY_INFORMATION(smgNotify->lpBuffer + dwSeek); dwSeek += pNotify->NextEntryOffset; char * sName = new char[pNotify->FileNameLength/2+1]; pNotify->FileName[pNotify->FileNameLength/2] = 0; wtoc((WORD *)pNotify->FileName,sName); FILE *f = fopen(smgNotify->sOut,"a"); switch (pNotify->Action) { case FILE_ACTION_ADDED: fprintf(f,"'%s' was created\n",sName); break; case FILE_ACTION_REMOVED: fprintf(f,"'%s' was deleted\n",sName); break; case FILE_ACTION_MODIFIED: fprintf(f,"'%s' was modifed\n",sName); break; case FILE_ACTION_RENAMED_OLD_NAME: fprintf(f,"'%s' renamed to ",sName); break; case FILE_ACTION_RENAMED_NEW_NAME: fprintf(f,"'%s'\n",sName); break; } delete [] sName; fclose(f); if(pNotify->NextEntryOffset == 0) break; } void wtoc(WORD * w, char * c)//widechar to char { int i = 0; while (*(w+i)!=0) { *(c+i)=*(w+i); i++; } *(c+i)=0; } OVERLAPPED o = { }; o.hEvent = CreateEvent(0, FALSE, FALSE, 0); DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds); { DWORD dwWaitStatus = WaitForSingleObject(o.hEvent, 1000); … //любой код, какой хотим выполнять }while(dwWaitStatus != WAIT_OBJECT_0) …//обрабатываем lpBuffer DWORD SomeFunction(LPVOID p) { } HANDLE CreateThread(SEC_ATTRS SecurityAttributes, ULONG StackSize, SEC_THREAD_START StartFunction, PVOID ThreadParameter, ULONG CreationFlags, PULONG ThreadId); BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode); struct SOMETHING { HANDLE hDir; char *sOut; BYTE *lpBuffer; }; SOMETHING smgNotify; DWORD dwThreadID; HANDLE hThread CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&SomeFunction, (LPVOID)&smgNotify,0,&dwThreadID); TerminateThread(hThread,0); HANDLE hDir = CreateFile(…); If(hDir == 0) { return 0; } BYTE *lpBuffer = … If(lpBuffer == NULL) { CloseHandle(hDir); return 0; } HANDLE hThread = CreateThread(…); If(hThread == 0) { CloseHandle(hDir); Free(lpBuffer); Return 0; } class Buffer { private: BYTE *lpBuffer; public: Buffer() { this->lpBuffer = NULL; } SetSize(DWORD size) { this->lpBuffer = new BYTE[size]; } ~Buffer() { delete[] this->lpBuffer; } operator BYTE*() const { return this->lpBuffer; } }; class HandleToFolder { private: HANDLE hDir; public: HandleToFolder() { this->hDir=0; } ~HandleToFolder() { CloseHandle(this->hDir); } HandleToFolder& operator=(HANDLE orig) { CloseHandle(this->hDir); this->hDir = orig; return *this; } operator HANDLE() const { return this->hDir; } }; Struct SOMETHING { HandleToFolder hDir; char *sOut; Buffer lpBuffer; }; private: SOMETHING smgNotify; HANDLE hThread; Notifer(char * in, char * out) { this->smgNotify.hDir = CreateFile(in, …); if (this->smgNotify.hDir == 0) throw 1; this->smgNotify.sOut = out; this->smgNotify.lpBuffer.SetSize(dwBuffSize); if (this->smgNotify.lpBuffer == NULL) throw 2; DWORD dwThreadID; this->hThread = CreateThread(…); if (this->hThread == 0) throw 3; } ~Notifer() { TerminateThread(this->hThread,0); CloseHandle(this->hThread); } try { Notifer a(argv[1],argv[2]); } catch(int error) { switch (error) { case 1: MessageBox(0,"CreateFile","Error",MB_ICONERROR | MB_OK); return 0; case 2: MessageBox(0,"Malloc","Error",MB_ICONERROR | MB_OK); return 0; case 3: MessageBox(0,"CreateThread","Error",MB_ICONERROR | MB_OK); return 0; } } #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif ----------------------------------------------------------------------------------------------------------------- Шпаргалка для MySQL DBA. EXPLAIN – это просто Андрей Товстик select id from table; mysql> SELECT count(*) FROM salaries WHERE salary > 150000; mysql> SELECT count(*) FROM salaries WHERE salary > 150000 AND salary < 160000; mysql> EXPLAIN SELECT count(*) FROM salaries WHERE salary > 150000 AND salary < 160000; FOR EACH row r IN R DO FOR EACH row s IN S DO FOR EACH row t IN T DO IF r AND s AND t SATISFY some join condition THEN OUTPUT row SELECT * FROM salaries WHERE emp_no=10001 AND from_date='1986-06-26'; SELECT s.emp_no,e.first_name,e.last_name,s.salary,s.from_date,s.to_date FROM salaries as s LEFT JOIN employees as e ON s.emp_no=e.emp_no WHERE s.salary>155000; mysql> SELECT count(*) FROM salaries WHERE salary > 150000 AND salary < 160000; mysql> EXPLAIN SELECT count(*) FROM salaries WHERE salary > 150000 AND salary < 160000; SELECT emp_no,from_date FROM salaries; SELECT `db_1`.`sources`.id, `db_1`.`sources`.parent_id, db_2.`sources`.active FROM `db_1`.`sources` LEFT JOIN db_2.`sources` ON `db_1`.`sources`.name = db_2.`sources`.name WHERE db_1.`sources`.lng_id IN (1,9); mysql> SELECT e.first_name,e.last_name,s.salary FROM employees e LEFT JOIN salaries s ON e.emp_no=s.emp_no ORDER by e.first_name; mysql> EXPLAIN SELECT e.first_name,e.last_name,s.salary FROM employees e LEFT JOIN salaries s ON e.emp_no=s.emp_no ORDER by s.salary; ----------------------------------------------------------------------------------------------------------------- Дискреционное разграничение прав в Linux. Часть 1. Основные теоретические сведения Павел Закляков # service httpd start # ps aux|grep ^root|grep http # lsof -n -i|grep "USER\|2209" -----------------------------------------------------------------------------------------------------------------