Управляем объектами в Active Directory Часть 2 Иван Коробко Value=VarType(VarName) Листинг 1. Шаблон использования функции VarType() 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn 'Определение имени домена Set oRoot = GetObject("LDAP://rootDSE") LdapDomain = "LDAP://" & oRoot.Get("DefaultNamingContext") 'составление и обработка SQL–запроса Query = "SELECT ПЕРЕМЕННАЯ FROM '" & LdapDomain & "' WHERE objectclass='group' and name='Test'" Set st = objConn.Execute(Query) 'Вывод результата типа данных переменной wscript.echo VarType(st.Fields("ПЕРЕМЕННАЯ").Value) Листинг 2а. Чтение значений типа Long с помощью функции GetObject() Set obj = GetObject("LDAP://CN=Test,OU=Group,DC=msk,DC=ru") Wscript.Echo obj.sAMAccountType Листинг 2б. Чтение значения строковых параметров с помощью ADODB–соединения 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn 'Составление и обработка SQL–запроса Query = "SELECT sAMAccountType FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'" Set st = objConn.Execute(Query) 'Вывод результата wscript.echo st.Fields("sAMAccountType").Value YYYYMMDDHHMMSS.MS Z Листинг 3а. Чтение параметров в формате UTC–Time 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn 'Составление и обработка SQL–запроса Query = "SELECT createTimeStamp FROM 'LDAP://CN=Ivan\, Petrov,CN=Users,DC=msk,DC=ru'" Set st = objConn.Execute(Query) 'Вывод результата wscript.echo vartype(st.Fields("createTimeStamp").Value) wscript.echo (st.Fields("createTimeStamp").Value) Листинг 3б. Чтение параметров в формате UTC–Time ' Только для параметров whenCreated, whenChanged set objUser = GetObject("LDAP://CN=Ivan\,Petrov,CN=Users,DC=msk,DC=ru") WScript.echo objUser.Get("whenCreated") Листинг 4а. Чтение значения строковых параметров Set obj = GetObject("LDAP://CN=Test,OU=Group,DC=msk,DC=ru") Wscript.Echo obj.cn Листинг 4б. Чтение значения строковых параметров с помощью ADODB–соединения 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn 'Составление и обработка SQL–запроса Query = "SELECT cn FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'" Set st = objConn.Execute(Query) 'Вывод результата wscript.echo st.Fields("cn").Value Листинг 5. Получение значения типа Object Set obj = GetObject("LDAP://CN=Ivan\,Petrov,CN=Users,DC=msk,DC=ru") Set objUSN = obj.Get("uSNChanged") Wscript.Echo Abs(objUSN.HighPart * 2^32 + objUSN.LowPart) Листинг 6. Чтение параметра lastLogonTimestamp (accountExpires, lastLogon, pwdLastSet) Set obj = GetObject("LDAP://CN=Ivan\,Petrov,CN=Users,DC=msk,DC=ru") Set objUSN = obj.Get("lastLogonTimestamp") Wscript.Echo ConvertTime(objUSN) Function ConvertTime(objDate) Set objShell = CreateObject("Wscript.Shell") Key="HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias" TempKey = objShell.RegRead(Key) If (VarType(TempKey) = 3) Then Temp = TempKey ElseIf (VarType(TempKey)=12) Then Temp = 0 For k = 0 To UBound(TempKey) Temp = Temp + (TempKey(k) * 256^k) Next End If lngHigh = objDate.HighPart lngLow = objDate.LowPart If (lngLow < 0) Then lngHigh = lngHigh + 1 End If If (lngHigh = 0) And (lngLow = 0 ) Then dtmDate = #1/1/1601# Else dtmDate = #1/1/1601# + (((lngHigh * (2 ^ 32))+ lngLow)/6/10^8 - Temp)/1440 End If ConvertTime=dtmDate End Function Листинг 7. Чтение массива строк с помощью ADODB–соединения 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn 'составление и обработка SQL–запроса Query = "SELECT OBJECTCLASS FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'" Set st = objConn.Execute(Query) 'Вывод результата For each el in st.Fields("OBJECTCLASS").Value wscript.echo el Next Листинг 8. Рекомендуемый сценарий чтения данных из AD 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn 'Составление и обработка SQL–запроса Query = "SELECT description, cn FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'" Set st = objConn.Execute(Query) 'Вывод результата wscript.echo st.Fields("cn").Value temp = "" if VarType(st.Fields("description").Value)>8192 then For Each description In st.Fields("description ").Value temp = temp + description Next Else temp = "Поле description пусто" End If Wscrit.Echo temp ----------------------------------------------------------------------------------------------------------------- Что представляет собой система мониторинга GroundWork Monitor Сергей Яремчук include=C:\NRPE_NT\bin\V2_nrpe_commands.cfg dont_blame_nrpe=1 C:\nrpe_nt\bin>nrpe_nt -i C:\nrpe_nt\bin>net start nrpe_nt > cscript //nologo C:\NRPE_NT\Plugins\V2\verify_wmi_status.vbs -h 127.0.0.1 > cscript //nologo check_disks_percentage_space_used.vbs -h 127.0.0.1 -inst * -w 40 -c 60 # /usr/local/groundwork/nagios/libexec/check_nrpe -H 192.168.1.5 -c show_os -a 127.0.0.1 ----------------------------------------------------------------------------------------------------------------- Настраиваем связку Apache + PHP + MySQL на базе ОС OpenBSD 4.3 Максим Гришков # pkg_add -v mysql-server # /usr/local/bin/mysql_install_db # /usr/local/bin/mysqld_safe & # /usr/local/bin/mysql_secure_installation # mkdir -p /var/www/var/run/mysql # ln -f /var/run/mysql/mysql.sock /var/www/var/run/mysql/mysql.sock mysqld=YES if [ X"${mysqld}" == X"YES" -a -x /usr/local/bin/mysqld_safe ]; then echo -n " mysqld"; /usr/local/bin/mysqld_safe --user=_mysql --log --open-files-limit=256 & for i in 1 2 3 4 5 6; do if [ -S /var/run/mysql/mysql.sock ]; then break else sleep 1 echo -n "." fi done # # Создаем MySQL-сокет в chroot-окружении Apache mkdir -p /var/www/var/run/mysql sleep 2 ln -f /var/run/mysql/mysql.sock /var/www/var/run/mysql/mysql.sock fi # pkg_add -v php5-core # ln -s /var/www/conf/modules.sample/php5.conf /var/www/conf/modules #mkdir /var/www/tmp #chown www:www /var/www/tmp # pkg_add -v php5-mysql # ln -fs /var/www/conf/php5.sample/mysql.ini /var/www/conf/php5/mysql.ini cat extension=mysql.so > /var/www/conf/php5.sample/mysql.ini # pkg_add -v php5-mcrypt # ln -fs /var/www/conf/php5.sample/mcrypt.ini /var/www/conf/php5/mcrypt.ini # pkg_add -v php5-mhash # /usr/local/bin/mysql_install_db httpd_flags="" # for normal use: "" (or "-DSSL" after reading ssl(8)) ----------------------------------------------------------------------------------------------------------------- Btrfs от Oracle: наш ответ ZFS Андрей Пешеходов /* * Суперблок btrfs — по сути, список всех B-деревьев пула */ struct btrfs_super_block { u8 csum[BTRFS_CSUM_SIZE]; /* контрольная сумма */ u8 fsid[16]; /* UUID файловой системы */ __le64 bytenr; /* номер этого блока */ __le64 flags; __le64 magic; /* 8 байт, "_B5RfS_M" */ __le64 generation; /* ID транзакции */ __le64 root; /* указатель на дерево корней */ __le64 chunk_root; /* указатель на дерево сегментов */ __le64 total_bytes; /* размер ФС в байтах */ __le64 bytes_used; /* использовано байт */ __le64 root_dir_objectid; /* objectid корневого каталога */ __le64 num_devices; /* количество устройств в пуле */ __le32 sectorsize; /* размер сектора */ __le32 nodesize; /* размер узла дерева */ __le32 leafsize; /* размер листа дерева */ __le32 stripesize; __le32 sys_chunk_array_size; u8 root_level; /* глубина основного дерева ФС */ u8 chunk_root_level; /* глубина дерева сегментов */ struct btrfs_dev_item dev_item; /* дескриптор этого устройства */ char label[BTRFS_LABEL_SIZE]; /* символьная метка ФС */ u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE]; }; struct btrfs_dev_item { __le64 devid; /* ID устройства */ __le64 total_bytes; /* размер устройства */ __le64 bytes_used; /* использовано байт */ __le32 io_align; /* оптимальное выравнивание */ __le32 io_width; /* оптимальная пропускная способность */ __le32 sector_size; /* размер сектора дика */ __le64 type; /* тип устройства */ __le32 dev_group; /* информация о группе */ u8 seek_speed; /* скорость перемещения головки диска */ u8 bandwidth; /* максимальная полоса пропускания */ u8 uuid[BTRFS_UUID_SIZE]; /* UUID файловой системы, которой принадлежит диск */ }; /* * Каждый блок дерева (листовой или внутренний) начинается с заголовка блока */ struct btrfs_header { u8 csum[BTRFS_CSUM_SIZE]; /* контрольная сумма блока */ u8 fsid[BTRFS_FSID_SIZE]; /* UUID файловой системы, содержащий блок */ __le64 bytenr; /* адрес блока на диске */ __le64 flags; u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; /* UUID дерева сегментов (см. ниже) */ __le64 generation; /* ID транзакции */ __le64 owner; /* ссылка на родителя блока */ __le32 nritems; /* количество итемов в блоке */ u8 level; /* уровень блока в дереве */ }; /* Ключ */ struct btrfs_key { u64 objectid; u8 type; u64 offset; }; /* Итем */ struct btrfs_item { struct btrfs_disk_key key; /* Ключ */ __le32 offset; /* Смещение пакета данных в листе */ __le32 size; /* Длина пакета данных */ }; struct btrfs_inode_item { __le64 generation; /* ID транзакции создания файла */ __le64 size; /* Размер файла в байтах */ __le64 nblocks; /* Количество занимаемых блоков */ __le64 block_group; /* Предпочитаемая группа блоков */ __le32 nlink; /* Счетчик ссылок на файл */ __le32 uid; /* UID владельца */ __le32 gid; /* GID владельца */ __le32 mode; /* Маска типа и прав доступа */ __le64 rdev; /* [minor:major] для устройств */ __le16 flags; /* Флаги */ __le16 compat_flags; /* Флаги */ struct btrfs_timespec atime; /* Времена доступа, модификации, и т. д. */ struct btrfs_timespec ctime; struct btrfs_timespec mtime; struct btrfs_timespec otime; }; struct btrfs_file_extent_item { __le64 generation; u8 type; /* * Дисковое пространство, используемое экстентом. * Блоки конторольных сумм включены */ __le64 disk_bytenr; __le64 disk_num_bytes; /* * Логиическое смещение данного экстента в файле * (без учета блоков контрольных сумм). Это позволяет * экстент-итему указывать в середину существующего * экстента, разделяя его между двумя снапшотами * (если в новом снапшоте изменились данные) */ __le64 offset; /* Логическое количество блоков (без учета контрольных сумм)*/ __le64 num_bytes; }; struct btrfs_block_group_item { __le64 used; /* использовано блоков */ __le64 chunk_objectid; /* objectid соответствующего сегмента */ __le64 flags; /* флаги */ } struct btrfs_extent_ref { __le64 root; /* objectid корня субтома */ __le64 generation; /* номер поколения дерева, владеющего ссылкой */ __le64 objectid; /* objectid файла, владеющего ссылкой */ __le64 offset; /* смещение в файле */ }; struct btrfs_root_item { struct btrfs_inode_item inode; /* inode-описатель */ __le64 root_dirid; /* obhectid основного дерева субтома */ __le64 bytenr; /* размер */ __le64 byte_limit; /* квота */ __le64 bytes_used; /* использовано байт */ __le32 flags; __le32 refs; /* количество ссылок */ struct btrfs_disk_key drop_progress; u8 drop_level; u8 level; }; make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD modules make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD modules_install make make install modprobe btrfs mkfs.btrfs /dev/sda1 mount -t btrfs /dev/sda1 /mnt/test mount -t btrfs /dev/sda1 /mnt/test -o subvol=. btrfsctl -s new_subvol /mnt/test btrfsctl -s new_subvol_snap /mnt/test/new_subvol btrfsctl -r +4g /mnt/test mkfs.btrfs /dev/sda1 /dev/sda2 mkfs.btrfs -m raid0 /dev/sda1 /dev/sda2 mkfs.btrfs -m raid1 /dev/sda1 /dev/sda2 mkfs.btrfs -m single /dev/sda1 btrfsctl -a btrfsctl -A /dev/sda1 mount -t btrfs /dev/sda1 /mnt/test -o subvol=. btrfs-vol -a /dev/sda3 /mnt/test btrfs-vol -b /mnt/test cd btrfs-progs make convert ./btrfs-convert /dev/sda4 mount -t btrfs /dev/sda4 /mnt/test -o subvol=ext2_saved mount -t ext3 -o loop /mnt/test/image /mnt/ext3 umount /mnt/ext3 umount /mnt/test btrfs-convert -r /dev/sda4 ----------------------------------------------------------------------------------------------------------------- Технологический журнал «1С:Предприятие 8.1» Андрей Луконькин ----------------------------------------------------------------------------------------------------------------- Дефекты проектирования Intel Core 2 Duo. Аналитический обзор с точки зрения безопасности Крис Касперски Листинг 1. Псевдокод команды BSF с «узаконенной» ошибкой IF SRC = 0 THEN ZF := 1; DEST is undefined; ELSE ZF := 0; temp := 0; WHILE Bit(SRC, temp) = 0 DO temp := temp + 1; DEST := temp; OD; FI; ----------------------------------------------------------------------------------------------------------------- Корпоративный информационный портал, который построил Джек Антон Борисов mysql> create database html_data charset = utf8; mysql> grant select, insert, update, delete, create, drop on html_data.* to 'jbossuser'@'localhost'; mysql> grant select, insert, update, delete, create, drop on html_data.* to 'jbossuser'@'192.168.194.128'; mysql> grant select, insert, update, delete, create, drop on html_data.* to 'jbossuser'@'192.168.194.1' identified by 'jboss'; ab@abc:~> mysql -u jbossuser html_data mysql> create table news (id integer not null auto_increment, `text` text, primary key (id)) charset = utf8; PortalDS jdbc:mysql://127.0.0.1:3306/jbossportal?useServerPrepStmts=false&jdbcCompliantTruncation=false com.mysql.jdbc.Driver jbossdb jbossdb [mysqld] character_set_server=utf8 mysql> show variables like 'character%'; mysql> show variables like 'collation%'; $ $JBOSS_HOME/bin/run.sh --host 192.168.194.1 # /usr/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 / com.plumtree.portlet.portlets.GooglePortlet key NC8jGG8c+SYzP3IuclPD+a0lFjAj87Yd package org.jboss.portlet.hello; import javax.portlet.GenericPortlet; import javax.portlet.PortletException; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.portlet.UnavailableException; import java.io.IOException; import java.io.PrintWriter; public class HelloWorldPortlet extends GenericPortlet { protected void doView(RenderRequest rRequest, RenderResponse rResponse) throws PortletException, IOException, UnavailableException { rResponse.setContentType("text/html"); PrintWriter writer = rResponse.getWriter(); writer.write("Hello World!"); writer.close(); } } 1 package org.jboss.portlet.samplesql; 2 import javax.portlet.GenericPortlet; 3 import javax.portlet.PortletException; 4 import javax.portlet.RenderRequest; 5 import javax.portlet.RenderResponse; 6 import javax.portlet.UnavailableException; 7 import java.io.IOException; 8 import java.io.PrintWriter; 9 import java.sql.*; 10 import java.util.Properties; 11 public class SampleSQLPortlet extends GenericPortlet 12 { 13 Connection conn = null; 14 String url = "jdbc:mysql://localhost:3306/"; 15 String userName = "jbossuser"; 16 String password = ""; 17 public void init() 18 { 19 } 20 protected void doView(RenderRequest rRequest, RenderResponse rResponse) throws PortletException, IOException, UnavailableException 21 { 22 rResponse.setContentType("text/html"); 23 PrintWriter writer = rResponse.getWriter(); 24 try 25 { 26 Class.forName ? ("com.mysql.jdbc.Driver").newInstance ( ); 27 conn = DriverManager.getConnection (url, userName, password); 28 Statement s = conn.createStatement ( ); 29 s.executeQuery ("SELECT * from html_data.news order by id"); 30 ResultSet rs = s.getResultSet ( ); 31 while (rs.next ( )) 32 { 33 int uid = rs.getInt (1); 34 String name = rs.getString(2); 35 String name3 = name.replaceAll("\n", "
"); 36 writer.println("NewsID: " + uid + ", content: " + name3 + "

"); 37 writer.flush(); 38 } 39 rs.close ( ); 40 s.close ( ); 41 } catch (Exception e) { System.err.println("Cannot connect to server" + e); 42 } 43 finally 44 { 45 if (conn != null) 46 { 47 try 48 { 49 conn.close ( ); 50 } catch (Exception e) { /* ignore close errors */ } 51 } 52 writer.println("
(TM) BoldText"); 53 writer.close(); 54 } 55 } 56 } "SELECT * from html_data.news order by id" ant clean; ant #body { background-image: url(images/portal_background.gif); background-repeat: repeat-x; background-color: #d5d9be; margin: 0px; padding: 0px; font-family: Georgia, "Times New Roman", Times, serif; font-size: 12px; color: #353634; } ----------------------------------------------------------------------------------------------------------------- Оцениваем технологию Adobe AIR Александр Майоров majorsoft.ru.example.HiPeople main HiPeople! 0.1 MajoRSofT index.html <transparent>false</transparent> <visible>true</visible> <minimizable>true</minimizable> <maximizable>false</maximizable> <resizable>false</resizable> <width>600</width> <height>400</height> <x>200</x> <y>200</y> <minSize>400 200</minSize> <maxSize>1280 1024</maxSize> </initialWindow> <icon> <image16x16>icons/AIRApp_16.png</image16x16> <image32x32>icons/AIRApp_32.png</image32x32> <image48x48>icons/AIRApp_48.png</image48x48> <image128x128>icons/AIRApp_128.png</image128x128> </icon> </application> <html><head> <link href="/css/main.css" rel="stylesheet" type="text/css"> <title>My first application
Hi, people!
adl descriptor.xml @echo off C:\AirSDK\bin\adl.exe descriptor.xml pause
Empty...
4) function readLocalFile(name) { name || alert('Empty file name!'); var file = new air.File("app:/" + name); var content = ''; if (file.exists) { var fp = new air.FileStream(); fp.open(file, air.FileMode.READ); if (fp.bytesAvailable > 0) { content = fp.readUTFBytes(fp.bytesAvailable); } fp.close(); return content; } else { return "File " + name + " not exists!"; } } var file = new air.File("app:/" + name); var file = air.File.applicationDirectory.resolvePath(name); var file = air.File.desktopDirectory.resolvePath(name); function openUrlInStandartBrowser(url) { air.navigateToURL( new air.URLRequest(url) ); } Open link in browser var target = null; function init() { target = document.getElementById('target'); target.addEventListener("dragover", dragOver); target.addEventListener("drop", dropHandler); }
Drag & Drop
function dragOver(event) { event.preventDefault(); } function onComplete(event) { target.innerHTML = "UploadComplete!"; } function dropHandler(event) { var request = new air.URLRequest("http://majorsoft.ru/air_test_upload.php"); request.method = air.URLRequestMethod.POST; var files = event.dataTransfer.getData("application/x-vnd.adobe.air.file-list"); for (i in files) { files[i].addEventListener(air.Event.COMPLETE, onComplete); files[i].upload(request, "uploadedFile"); // Вывод сообщений в консоль для контроля работы. В финальной версии эта строка не нужна air.trace("File " + files[i].name + " is upload..."); } } C:\AirSDK\bin\adt -certificate -cn SelfSigned -ou Dev -o "HiPeople" -c US 2048-RSA MyCert.pfx 123 C:\AirSDK\bin\adt -package -storetype pkcs12 -keystore MyCert.pfx HiPeople.air descriptor.xml index.html js/main.js css/main.css air/AIRAliases.js LocalFile.txt icons/*.pn ----------------------------------------------------------------------------------------------------------------- PHP-GTK – вторая попытка Кирилл Сухов $ cvs -d :pserver:cvsread@cvs.php.net:/repository login $ cvs -d :pserver:cvsread@cvs.php.net:/repository co -r PHP_5_2 php-src $ cd php-src $ ./buildconf $ ./configure --prefix=/opt/php5_2 —disable-cgi $ make $ su $ make install $ echo extension=php_gtk2.so >> /opt/php5_2/lib/php.ini $ /opt/php5_2/bin/php-config --extension-dir | xargs echo 'extension_dir=' >> /opt/php5_2/lib/php.ini $ cd .. $ cvs -d :pserver:cvsread@cvs.php.net:/repository co php-gtk $ cd php-gtk $ ./buildconf --with-phpize=/opt/php5_2/bin/phpize $ ./configure --with-php-config=/opt/php5_2/bin/php-config $ make $ make install $ ln -s /opt/php5_2/bin/php /usr/bin/php-gtk extension=php_gtk2.so $ ln -s /opt/php5_2/bin/php /usr/bin/php-gtk set_title('hello php-gtk2'); $wnd->set_default_size(200,300); $pixbuf = $wnd->render_icon( Gtk::STOCK_EXECUTE, Gtk::ICON_SIZE_DIALOG ); $wnd->set_icon($pixbuf); $wnd->connect_simple('destroy', array('gtk', 'main_quit')); $lblHello = new GtkLabel("Yes!\r\n'Hello php-gtk2!'"); $wnd->add($lblHello); $wnd->show_all(); Gtk::main(); ?> $ php test.phpw $wnd = new GtkWindow(); $wnd->set_title('php-gtk2'); //заголовок $wnd->set_default_size(200,300); //размер $pixbuf = $wnd->render_icon( Gtk::STOCK_EXECUTE, Gtk::ICON_SIZE_DIALOG ); $wnd->set_icon($pixbuf); $wnd->connect_simple('destroy', array('gtk', 'main_quit')); $lblHello = new GtkLabel("Yes!\n'Hello php-gtk2!"); $wnd->add($lblHello); $wnd->show_all(); Gtk::main(); $button = new GtkButton('press me'); $button->set_relief(Gtk::RELIEF_HALF); $wnd->add($button); $wnd->set_icon($pixbuf); $wnd->connect_simple('destroy', array('gtk', 'main_quit')); $box = new GtkVBox(); $box->set_spacing(4); // Добавляем кнопку $button = new GtkButton('press me'); $button->set_relief(Gtk::RELIEF_HALF); // Добавляем надпись $lbl = new GtkLabel(date('Y-m-d h:i:s')); // Пакуем $box->pack_start($button, false,true,10); $box->pack_start($lbl, true, true); // Помещаем бокс в окно $wnd->add($box); function foo(GtkLabel $lbl){ $lbl->set_text(date('Y-m-d h:i:s')); } $button->connect_simple('clicked', 'foo',$ll); $window = new GtkWindow(); $window->set_title("GtkHBox and GtkVBox packing demonstration"); $window->set_position(Gtk::WIN_POS_CENTER); $window->connect_simple("destroy", array("gtk", "main_quit")); $window->set_default_size(400,400) ; $window->show(); $window->show_all(); Gtk::main(); $vbox = new GtkVBox(false, 5); $window->add($vbox); $label = new GtkLabel(); $label->set_text("My daily"); $label->set_justify(Gtk::JUSTIFY_LEFT); $vbox->pack_start($label, true, true, 5); $hbbox = new GtkHButtonBox(); $hbbox->set_layout(Gtk::BUTTONBOX_SPREAD); $hbbox->set_spacing(15); $button1 = new GtkButton('Exit'); $button2 = new GtkButton('Add'); $button3 = new GtkButton('Clean'); $hbbox->add($button1) $hbbox->add($button2); $hbbox->add($button3); $vbox->pack_end($hbbox); $vpane = new GtkHPaned(); $vpane->set_border_width(5); $vbox->pack_end($vpane); $left = new GtkFrame(); $day=new GtkCalendar(); $left->add($day); $left->set_shadow_type(Gtk::SHADOW_IN); $vpane->add1($left); $textBuffer = new GtkTextBuffer(); $textBuffer->set_text(date('Y-m-d h:i:s')); $text = new GtkTextView(); $text->set_buffer($textBuffer); $text->set_editable(false); $entry= new GtkEntry(); $r_vbox = new GtkVBox(false, 5); $r_vbox->pack_end($entry); $r_vbox->pack_end($text); $right = new GtkFrame(); $right->add($r_vbox); $right->set_shadow_type(Gtk::SHADOW_IN); $vpane->add2($right); $day->connect_simple('day-selected', 'get_day', $day, $textBuffer); function get_day(GtkCalendar $d,GtkTextBuffer $bf){ $f_name=get_file_name($d); if(file_exists('text/'.$f_name)){ $content=file_get_contents('text/'.$f_name); } else{ $content='No notes'; } $bf->set_text($content); } function get_file_name(GtkCalendar $d){ $data=$d->get_date(); return join('-',$data); } $button2->connect_simple('clicked', "add_note", $day,$entry, $textBuffer); function add_note(GtkCalendar $d,GtkEntry $entry,GtkTextBuffer $bf){ $f_name=get_file_name($d); if(!is_file('text/'.$f_name)){ file_put_contents('text/'.$f_name, $entry->get_text()); }else{ $fd=fopen('text/'.$f_name,'a+'); fwrite($fd,"\n".$entry->get_text()); fclose($fd); } $content=file_get_contents('text/'.$f_name); $bf->set_text($content); } $button3->connect_simple('clicked', "clean_note", $day, $textBuffer); function clean_note(GtkCalendar $d,GtkTextBuffer $bf){ $f_name=get_file_name($d); if(is_file('text/'.$f_name)){ unlink('text/'.$f_name) ; } $bf->set_text('No notes'); } $button1->connect_simple('clicked', array("gtk", "main_quit")); get_date(); return join('-',$data); } // Получаем запись из файла и помещаем её на текстовое поле function get_day(GtkCalendar $d,GtkTextBuffer $bf){ $f_name=get_file_name($d); if(file_exists('text/'.$f_name)){ $content=file_get_contents('text/'.$f_name); }else{ $content='No notes'; } $bf->set_text($content); } // Добавляем запись function add_note(GtkCalendar $d,GtkEntry $entry,GtkTextBuffer $bf){ $f_name=get_file_name($d); if(!is_file('text/'.$f_name)){ file_put_contents('text/'.$f_name, $entry->get_text()); }else{ $fd=fopen('text/'.$f_name,'a+'); fwrite($fd,"\n".$entry->get_text()); fclose($fd); } $content=file_get_contents('text/'.$f_name); $bf->set_text($content); } // Уничтожаем запись function clean_note(GtkCalendar $d,GtkTextBuffer $bf){ $f_name=get_file_name($d); if(is_file('text/'.$f_name)){ unlink('text/'.$f_name) ; } $bf->set_text('No notes'); } $window = new GtkWindow(); $window->set_title("GtkHBox and GtkVBox packing demonstration"); $window->set_position(Gtk::WIN_POS_CENTER); $window->connect_simple("destroy", array("gtk", "main_quit")); $window->set_default_size(400,400) ; $window->show(); $vbox = new GtkVBox(false, 5); $window->add($vbox); $label = new GtkLabel(); $label->set_text("My daily"); $label->set_justify(Gtk::JUSTIFY_LEFT); $vbox->pack_start($label, true, true, 5); $label->show(); $hbbox = new GtkHButtonBox(); $hbbox->set_layout(Gtk::BUTTONBOX_SPREAD); $hbbox->set_spacing(15); $button1 = new GtkButton('Exit'); $button2 = new GtkButton('Add'); $button3 = new GtkButton('Clean'); $hbbox->add($button1); $hbbox->add($button2); $hbbox->add($button3); $vbox->pack_end($hbbox); $vpane = new GtkHPaned(); $vpane->set_border_width(5); $left = new GtkFrame(); $day=new GtkCalendar(); $left->add($day); $left->set_shadow_type(Gtk::SHADOW_IN); $vpane->add1($left); $textBuffer = new GtkTextBuffer(); $textBuffer->set_text(date('Y-m-d h:i:s')); $text = new GtkTextView(); $text->set_buffer($textBuffer); $text->set_editable(true); $entry= new GtkEntry(); $right = new GtkFrame(); $r_vbox = new GtkVBox(false, 5); $r_vbox->pack_end($entry); $r_vbox->pack_end($text); $right->add($r_vbox); //$right->add($text); $right->set_shadow_type(Gtk::SHADOW_IN); $vpane->add2($right); $vbox->pack_end($vpane); $button1->connect_simple('clicked', array("gtk", "main_quit")); $button2->connect_simple('clicked', "add_note", $day,$entry, $textBuffer); $button3->connect_simple('clicked', "clean_note", $day, $textBuffer); $day->connect_simple('day-selected', 'get_day', $day, $textBuffer); $window->show_all(); Gtk::main(); ?> set_submenu($fmenu); $mbar->add($file); $view = new GtkMenuItem('_View'); $vmenu = new GtkMenu(); $view->set_submenu($vmenu); $mbar->add($view); $edit = new GtkMenuItem('_Edit'); $emenu = new GtkMenu(); $edit->set_submenu($emenu); $mbar->add($edit); $mode = new GtkMenuItem('_Status'); $mmenu = new GtkMenu(); $mode->set_submenu($mmenu); $mbar->add($mode); // Теперь создаём пункты подменю для каждого пункта // в особо тяжких случаях разделяем пункты сепараторами меню «File» $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_NEW)); $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_OPEN)); $fmenu->add(new GtkSeparatorMenuItem()); $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_SAVE)); $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_SAVE_AS)); $fmenu->add(new GtkSeparatorMenuItem()); $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_QUIT)); // Меню вид $vmenu->add(new GtkImageMenuItem(Gtk::STOCK_SORT_ASCENDING)); $vmenu->add(new GtkImageMenuItem(Gtk::STOCK_ZOOM_FIT)); // Меню редактирования $emenu->add(new GtkImageMenuItem(Gtk::STOCK_COPY)); $emenu->add(new GtkImageMenuItem(Gtk::STOCK_CUT)); $emenu->add(new GtkImageMenuItem(Gtk::STOCK_PASTE)); // Меню статуса $mmenu->add(new GtkImageMenuItem(Gtk::STOCK_APPLY)); $mmenu->add(new GtkImageMenuItem(Gtk::STOCK_CONVERT)); $vbox = new GtkVBox(); $vbox->pack_start($mbar,false); // Создаём окно $wnd = new GtkWindow(); $wnd->connect_simple('destroy', array('gtk', 'main_quit')); $wnd->set_default_size(400,200); // Создаём древовидную структуру $store = new GtkTreeStore(64, 32); // Создаём «ветви» первого уровня (первый параметр-идентификатор // родительского элемента. В данном случае равен NULL) $support = $store->append(null, array('Support servise', 1)); $www = $store->append(null, array('Internet', 2)); $c1 = $store->append(null, array('1C', 1)); // Создаём дочерние элементы $store->append($c1, array('Stuff', 8)); $store->append($www, array('Site', 2)); $store->append($www, array('Ithernet', 12)); $store->append($support, array('Workstantions', 4)); // Создаём отображение дерева $tview = new GtkTreeView($store); $tview->set_enable_tree_lines(enabled); $cell_renderer = new GtkCellRendererText(); // Добавляем заголовки $tview->append_column(new GtkTreeViewColumn('Department', $cell_renderer, 'text', 0)); $tview->append_column(new GtkTreeViewColumn('Problems', $cell_renderer, 'text', 1)); // Разворачиваем дерево $tview->expand_all(); $vbox->pack_start($tview,false); // Помещаем его в окно и делаем видимым $wnd->add($vbox); $wnd->show_all(); Gtk::main(); ?> True Glade GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True False True False 0 True True True True GTK_POS_TOP False False True Hellow Glade! False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 False True True ………………………………………….. False 0 tab ………………………………………………. tab 0 True True get_widget('wndClose'); $window->connect_simple('destroy', array('Gtk', 'main_quit')); $button = $glade->get_widget('btnClose'); $button->connect_simple('clicked', 'onClickButton'); function onClickButton() { echo "button clicked!\r\n"; Gtk::main_quit(); }Gtk::main(); ?> -----------------------------------------------------------------------------------------------------------------