Технология MEDV. Виртуализация в Windows 7 Андрей Бирюков netsh http add sslcert ipport=0.0.0.0:8443 certhash-07665a5dbabb6effbed332f0af6db1a8c8a3096cappid-{00000000-0000-0000-0000-000000000000} ----------------------------------------------------------------------------------------------------------------- Кодирование. Введение в системное программирование. Часть 3 Алексей Барабанов ssh staff@target sudo cmd1 cat | ssh staff@target "cat >cmd.$$" ssh staff@target "bash cmd.$$" ssh staff@target "screen -S scr$$ -dm \"bash cmd.$$\"" myhostname = mail.example.com mydomain = example.com myorigin = $mydomain inet_interfaces = all mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain mynetworks = 192.168.0.0/24, 127.0.0.0/8 relay_domains = home_mailbox = Maildir/ sudo postconf -e myhostname=mail.example.com postconf myhostname sudo service postfix restart rpm -q postfix yum install postfix Листинг 1. Скрипт автоматический настройки postfix null=/dev/null cnf0=/etc/postfix/main.cf.$$ pconf=/usr/sbin/postconf chkc=/sbin/chkconfig abort() { echo $1 ; exit -1 ; } abort2() { mv $cnf0 /etc/postfix/main.cf ; abort "$1" ; } cnt=0 # счетчик срабатываний checkconf() { $pconf $1 | awk 'BEGIN{FS="= "} {print $2}' | grep "^$2$" >$null ; } fixconf() { local t ; t=$2 ; [ -n "$t" ] || t=" " checkconf $1 $t || { sudo $pconf -e "$1=$t" checkconf $1 $t || abort2 не могу настроить $1 cnt=$((cnt+1)) } } # 1- проверка зависимостей grep CentOS /etc/redhat-release >$null 2>&1 || abort использовать только в CentOS # 2- проверка пакетов rpm -q postfix >$null || { sudo yum install postfix rpm -q postfix || abort не могу поставить postfix cnt=$((cnt+1)) } # 3- проверка параметров sudo cp /etc/postfix/main.cf $cnf0 fixconf myhostname mail.example.com fixconf mydomain example.com fixconf myorigin "\$mydomain" fixconf inet_interfaces all fixconf mydestination "\$myhostname,localhost.\$mydomain,localhost,\$mydomain" fixconf mynetworks "192.168.0.0/24,127.0.0.0/8" fixconf relay_domains fixconf home_mailbox Maildir/ # 4- проверка активности LC_ALL=C $chkc --list postfix | grep $(runlevel | awk '{print $2}'):on >$null || { sudo $chkc postfix on LC_ALL=C $chkc --list postfix | grep $(runlevel | awk '{print $2}'):on >$null || \ abort2 не могу активировать postfix cnt=$((cnt+1)) } # 5- рестарт зависимых процессов [ $cnt -gt 0 ] && sudo /sbin/service postfix restart >$null 2>&1 # 6- проверка зависимых процессов sudo /sbin/service postfix status | grep pid >$null || { mv $cnf0 /etc/postfix/main.cf sudo /sbin/service postfix restart >$null 2>&1 sudo /sbin/service postfix status | grep pid >$null && abort установки не верны # 7- система в неопределенном состоянии echo срочно вызывайте из отпуска настоящего сисадмина ; exit -2 } # 8- успешное завершение rm $cnf0 echo smtp-сервер postfix настроен ; exit 0 tld=example.com fixconf myhostname mail.$tld fixconf mydomain $tld ----------------------------------------------------------------------------------------------------------------- Взгляд на ext4. Не новое, но хорошо доработанное старое Андрей Пешеходов /* * Каждый узел (листовой, индексный или корневой) * начинается с этого заголовка */ struct ext4_extent_header { /* в будущем возможны несколько форматов узлов, * тогда пригодится этот magic */ __le16 eh_magic; /* количество элементов */ __le16 eh_entries; /* максимально элементов */ __le16 eh_max; /* глубина дерева, начиная с этого уровня */ __le16 eh_depth; /* номер поколения дерева */ __le32 eh_generation; }; /* * Структура индекса в дереве экстентов: */ struct ext4_extent_idx { /* индекс покрывает логические блоки, * начиная с этого */ __le32 ei_block; /* указатель на блок следующего уровня * (младшие 32 бита) */ __le32 ei_leaf_lo; /* (старшие 16 бит) */ __le16 ei_leaf_hi; __u16 ei_unused; }; /* * Экстент ext4 */ struct ext4_extent { /* логическое начало экстента */ __le32 ee_block; /* длина экстента в блоках */ __le16 ee_len; /* физическое начало экстента (старшие 16 бит) */ __le16 ee_start_hi; /* (младшие 32 бита) */ __le32 ee_start_lo; }; /* Дисковый inode ext4s */ struct ext4_inode { /* флаги доступа и типа */ __le16 i_mode; /* с */ __le16 i_uid; /* размер в байтах */ __le32 i_size_lo; /* время доступа */ __le32 i_atime; /* время модификации inode */ __le32 i_ctime; /* время модификации данных файла */ __le32 i_mtime; /* время удаления */ __le32 i_dtime; /* младшие 16 бит GID владельца */ __le16 i_gid; /* количество ссылок на inode */ __le16 i_links_count; /* количество блоков (младшие биты) */ __le32 i_blocks_lo; /* флаги */ __le32 i_flags; union { struct { /* младшие 32 бита версии */ __le32 l_i_version; } linux1; struct { /* не Linux */ __u32 h_i_translator; } hurd1; struct { /* не Linux */ __u32 m_i_reserved1; } masix1; } osd1; /* указатели на блоки данных файла */ __le32 i_block[EXT4_N_BLOCKS]; /* номер поколения (для NFS) */ __le32 i_generation; /* указатель на ACL (младшие биты) */ __le32 i_file_acl_lo; __le32 i_size_high; /* не используется */ __le32 i_obso_faddr; union { struct { /* количество блоков (старшие биты) */ __le16 l_i_blocks_high; /* указатель на ACL (старшие биты) */ __le16 l_i_file_acl_high; /* старшие 16 бит UID владельца */ __le16 l_i_uid_high; /* старшие 16 бит GID владельца */ __le16 l_i_gid_high; __u32 l_i_reserved2; } linux2; struct { /* не Linux */ __le16 h_i_reserved1; __u16 h_i_mode_high; __u16 h_i_uid_high; __u16 h_i_gid_high; __u32 h_i_author; } hurd2; struct { /* не Linux */ __le16 h_i_reserved1; __le16 m_i_file_acl_high; __u32 m_i_reserved2[2]; } masix2; } osd2; __le16 i_extra_isize; __le16 i_pad1; /* время модификации inode (наносекунды) */ __le32 i_ctime_extra; /* время модификации i-данных файла (наносекунды) */ __le32 i_mtime_extra; /* время доступа (наносекунды) */ __le32 i_atime_extra; /* время создания файла */ __le32 i_crtime; /* время создания файла (наносекунды) */ __le32 i_crtime_extra; /* старшие 32 бита версии */ __le32 i_version_hi; }; sudo tune2fs -j [device] fsck.ext3 -pfy [device] tune2fs -O extents,uninit_bg,dir_index [device] fsck.ext4 -yfpD /dev/sdc1 ----------------------------------------------------------------------------------------------------------------- Что «под капотом»? Работа с HDD и файловыми системами из консоли Игорь Штомпель LBA = ((c * H + h) * S) + s - 1 df df -h df -- help mkfs -t ext3 /dev/sda1 mount -t ext3 /dev/sda1 /mnt/sda1 umount /dev/sda1 umount -l /dev/sda1 /dev/sda1 /mnt/sda1 ext3 defaults 1 1 dd if=/dev/cdrom of=/home/user/image.iso mkisofs -R -J -input-charset utf8 -o /home/user/image.iso /dev/cdrom mount -t iso9660 -o loop /home/user/image.iso /mnt/cdrom ls -l /dev/ram* mkfs -t ext3 /dev/ram1 65536 mkdir -p /mount/ramdisk && mount /dev/ram1 /mount/ramdisk -o defaults,rw tune2fs -l /dev/sda1 dumpe2fs /dev/sda1 tune2fs -m 0 /dev/sda1 tune2fs -j /dev/sda1 mount /dev/sda1 /mnt/sda1 -t ext3 -o [data=writeback / data=ordered / journal] fsck -a /dev/sda1 fsck -r /dev/sda1 fsck -A debugfs /dev/sda1 help debugfs stats apt-get install lde lde /dev/sda2 fdisk /dev/sda fsck -r /dev/sda1 badblocks /dev/sda1 swapon /dev/sda5 /dev/sda5 none swap sw 0 0 swapoff /dev/sda5 du > inf_hd.txt du -h du -h -- summarize du -h -- summarize /var hdparm -a 1024 /dev/sda hdparm -g /dev/sda hdparm -i /dev/sda hdparm -H /dev/sda # Тайминги чтения с устройства и кэша устройства hdparm -Tt /dev/sda ----------------------------------------------------------------------------------------------------------------- Миграция без проблем. Еще раз о Windows Server 2008 R2 Никита Панов SmigDeploy.exe /package /architecture amd64 /os WS03 /path SmigDeploy.exe /package /architecture X86 /os WS03 /path dcdiag /test:dns /s: dnslint /ad /s /v netsh dhcp server export C:\<имя_файла.txt> all ----------------------------------------------------------------------------------------------------------------- WDS поможет. Установка операционных систем. Часть 2 Андрей Бирюков CopyPe x86 e:\DiscoverImages\Winpe copy /y E:\DiscoverImages\Win2008Discover.WIM E:\DiscoverImages\WinPE\ISO\Sources\Boot.wim oscdimg –n –b E:\DiscoverImages\WinPE\ISO\Boot\etfsboot.com E:\DiscoverImages\WinPE\ISO E:\DiscoverImages\MyDiscoverImage.ISO ----------------------------------------------------------------------------------------------------------------- Проект одного человека. Централизованное управление при помощи Cfengine Сергей Яремчук $ sudo apt-get install libdb4.6 libdb4.6-dev libssl0.9.8 libc6 libpcre3 bison flex $ wget –с http://www.cfengine.org/tarballs/cfengine-3.0.2.tar.gz $ mkdir cfengine $ cd cfengine $ svn checkout https://svn.iu.hio.no/projects/cfengine-3/trunk $ sudo mkdir -p /var/cfengine/masterfiles $ sudo cp /usr/local/share/doc/cfengine/*.cf /var/cfengine/masterfiles $ sudo /usr/local/sbin/cf-key $ sudo ls /var/cfengine/ppkeys/ $ sudo /usr/local/share/doc/cfengine/inputs/*.cf /var/cfengine/inputs $ whereis cf-promises $ sudo cp /usr/local/sbin/cf-promises /var/cfengine/bin $ sudo ln -s /usr/local/sbin/cf-promises /var/cfengine/bin $ cd /var/cfengine/masterfiles $ sudo /usr/local/sbin/cf-agent --bootstrap type: class:: "promiser" -> { "promisee1", "promisee2", ... } attribute_1 => value_1, … attribute_2 => value_n. # cf-promises -v ubuntu_hardy&Yr2010&(Monday| Friday)&Night&Min05 $ whereis cf-promises $ cat unit_helloworld.cf # Объявляем глобальный набор классов control body common control { bundlesequence => { "hello" }; # Определение класса } # Локальная коллекция hello, ориентированная на агентов bundle agent hello { reports: # Тип отчеты linux:: # Класс linux "Hello world!"; # Выводимые данные } $ sudo cf-promises –d 3 –r –f /var/cfengines/inputs/unit_helloworld.cf "service" slist => { "ssh", "apache", "mysql" }; body agent control { # Минимальное время (в минутах) перед проверкой, наличие новых правил ifelapsed => "15"; # Expireafter – максимальное время ожидания завершения перестроек, по умолчанию 120 минут } mailto => "mail@example.org"; smtpserver => "localhost"; body server control { Allowconnects => { "127.0.0.1" , "::1", "192.168.17.100" , "192.168.1.0/24" }; Allowallconnects => { "127.0.0.1" , "::1", "192.168.17.100" , "192.168.1.0/24" }; # Слушать только на определенном интерфейсе bindtointerface => "192.168.17.1"; Trustkeysfrom => { "127.0.0.1" , "::1" ... }; } $ cf-serverd -v $ netstat -an | grep 5308 Trustkeysfrom => { "127.0.0.1" , "::1", "192.168.17.100" …. }; skipverify => { "192.168.17.*" }; bundle server access_rules() { access: "/var/cfengine/masterfiles" deny => { "192.168.17.200" }; admit => { "192.168.17.*" }; roles: ".*" authorize => { "root" }; } /* Exact match means single file to admit */ if (strcmp(ap->path,"/") == 0 ) { res=true; } body runagent control { hosts => { "127.0.0.1", "example.com:5308", …. }; } body executor control { # Задержка запуска cf-agent, может потребоваться для завершения копирования файлов политик splaytime => "1"; mailto => "mail@example.org"; smtpserver => "localhost"; mailmaxlines => "100"; schedule => { "Min00_05" }; # Собственно расписание # Журналирование в syslog executorfacility => { "LOG_DAEMON" }; } # Команда запуска bundle agent executor { processes: "cf-execf" "cf-execf" restart_class => "start_cfexecd"; commands: start_cfexecd:: "/usr/local/sbin/cf-execd"; } body common control { inputs => { "update.cf", "site.cf", "library.cf" , "cf-execd.cf" # Добавили }; } ----------------------------------------------------------------------------------------------------------------- Разговор на «ты». Репликация Active Directory Илья Рудь; Константин Леонтьев #Вместо server1.itband.ru вы укажете FQDN вашего сервера repadmin /kcc server1.itband.ru #Если имя сайта было изменено, "Default-First-Site-Name" заменяется реальным именем repadmin /kccsite: "Default-First-Site-Name" repadmin /replicate server2.itband.ru server1. itband.ru dc=itband,dc=ru Repadmin /syncall /AeS repadmin /showutdvec dc1 dc=lab,dc=itband,dc=ru repadmin /showmeta "CN=Федя Рашпин,OU=testou,DC=lab,DC=itband,DC=ru" ----------------------------------------------------------------------------------------------------------------- Спасительный протокол. DNSSEC-расширение к DNS для повышения безопасности Сергей Яремчук example.com. 7200 IN DNSKEY 256 3 5 (открытый ключ) host.example.com. 7200 IN RRSIG A 5 3 7200 20091110090150 (20091103182315 13173 example.com. raR/8vMh37yX…..6LOsE1TqzqPJ # Сигнатура в Base64) $ dig +retry=1 +dnssec +multiline +trace se $ ssh-keygen -r Eagle.roysdon.net -f /etc/ssh/ssh_host_rsa_key $ dig +adflag SSHFP Eagle.roysdon.net. @atlt-dnssec-trial.s3woodstock.ga.atlanta.comcast.net. $ sudo apt-get install bind9 options { # Активируется поддержка DNSSEC dnssec-enable yes; # Включается только для неавторитативного сервера dnssec-validation yes; }; zone "se." { type forward; forwarders { 212.247.7.228; }; }; trusted-keys { # зона se "se." 257 3 5 4w6RVY0ciZ/a8t1xy5FIxkg2U95ZV5VuLtwmx2rgtAbx BACzTKrqYIpJ6LYSmjdQ3or+ZiO2tEMr53EwAjA6GKrf qQ2S1y7Rblz2kaS6PK2Gh5MOCufhGozUhPQSGFTn/mV8 H9hlQptfcFCpFZrQQDAQqFAyxQginDgrwSripBk= # Далее аналогично добавляются ключи и для других зон, например для 4x4.org "4x4.org" 256 3 5 "BEAAAAOxYIG/de/sEWGkMlMw/+WZHw72QMNAdC bneozk4BU4OCAbv9krBFnk52CZ67QPEfDMwV0k12Hr6sXkgZgeBpRV"; }; options { dnssec-lookaside . trust-anchor dlv.isc.org.; }; logging { channel dnssec_log { file "log/dnssec" size 20m; print-time yes; print-category yes; print-severity yes; severity debug 3; }; category dnssec { dnssec_log; }; } $ sudo rndc reconfig $ sudo rndc flush > dig @127.0.0.1 4x4.org +retry=1 +dnssec +multiline dnssec-keygen –a алгоритм –b длина –n тип имя_домена $ dnssec-keygen –a RSASHA1 –b 1024 –n ZONE example.com $ dnssec-keygen –r /dev/random -a RSASHA1 –b 1024 -n ZONE -f KSK example.com $ cat Kexample.com+004+10141.key $ cat Kexample.com +*.key >> /etc/bind/zones/db.example.com dnssecsignzone [o zonename] [N INCREMENT] [k KSK.key] zonefile [ZSK.key] $ dnssecsignzone o example.com k Kexample.com.+004+34980 /etc/bind/zones/db.example.com Kexample.com.+004+10141 zone "example.com" { type master; file "/etc/bind/zones/db.example.com "; }; # dnssec-configure -s -b $ maketestzone example.com ----------------------------------------------------------------------------------------------------------------- SourceForge. Кузница проектов с открытым кодом Семен Есилевский ssh -t USER,PROJECT@shell.sourceforge.net create adminrepo --checkout svn rm -rf /svnroot/PROJECT/* adminrepo --save svn scp file.zip user,myproject@frs.sourceforge.net:/home/frs/project/m/my/myproject/Rel_1 scp file.html user,myproject@web.sourceforge.net: mysqldump --host=mysql-{LETTER}.sourceforge.net --user={LETTER}{GROUP ID}admin -p --opt {LETTER}{GROUP ID}_{DATABASENAME} | gzip --fast > dumpfile.mysql.gz ----------------------------------------------------------------------------------------------------------------- Расширяем возможности. PowerShell: другие языки программирования Иван Коробко Листинг 1. Выполнение сценария на VBScript из PowerShell $sc = New-Object –comObject ScriptControl $sc.Language = 'VBScript' $txtCode = @" MsgBox "Тестовое сообщение" "@ $sc.AddCode($txtCode) $sc.CodeObject Листинг 2. Пример передачи параметра из PowerShell в VBScript вставку function call_vbs($p1) { $sc = New-Object -comObject ScriptControl $sc.Language = 'VBScript' $ txtCode = @" str1="{0}" MsgBox str1 "@ $sc.AddCode($($code -f $p1)) $sc.CodeObject } call_vbs("Тестовое сообщение") Листинг 3. Передача и возвращение параметров между VBScript и PowerShell $sc = New-Object -comObject ScriptControl $sc.Language = 'VBScript' $txtCode = @" Function test(a,b) test = a+b end Function "@ $sc.AddCode($txtCode) $a=2 $b=5 $result = $sc.Eval("test($a,$b)") write-host $result Листинг 4а. Вызов VBS-файла из PowerShell $txt = "Тестовое сообщение" cscript.exe test.vbs $txt Листинг 4б. Файл test.vbs Set obj = Wscript.Arguments MsgBox obj(0) Листинг 5. Вызов 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 = @" Class mBox Sub Main() Microsoft.VisualBasic.Interaction.MsgBox ("Тестовое сообщение") End Sub End class "@ $results = $provider.CompileAssemblyFromSource($params, $txtCode) $mAssembly = $results.CompiledAssembly $i = $mAssembly.CreateInstance("mBox") $r = $i.main() Листинг 6. Передача параметров функции из PowerShell в VB.NET вставку $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 = @" Class mBox Sub showString (str) Microsoft.VisualBasic.Interaction.MsgBox (str) End Sub End class "@ $results = $provider.CompileAssemblyFromSource($params, $txtCode) $mAssembly = $results.CompiledAssembly $i = $mAssembly.CreateInstance("mBox") $r = $i.showString("Тестовое сообщение") Листинг 7. Передача и возвращение параметров между 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 = @" Class Summ Function Summa (x ,y ) Dim s As integer = x +y Summa = s End Function End class "@ $a=2 $b=5 $results = $provider.CompileAssemblyFromSource($params, $txtCode) $mAssembly = $results.CompiledAssembly $i = $mAssembly.CreateInstance("Summ") $result = $i.Summa($a,$b) Write-Host $result Листинг 8. Вызов API-функции из 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 = @" Class mBox Declare Auto Function MyMessageBox Lib "user32.dll" Alias "MessageBox" _ (ByVal hWnd as Integer, ByVal msg as String, ByVal Caption as String, ByVal Tpe as Integer) As Integer Sub Main() MyMessageBox(0, "Текстовое сообщение", "", 0) End Sub End class "@ $results = $provider.CompileAssemblyFromSource($params, $txtCode) $mAssembly = $results.CompiledAssembly $i = $mAssembly.CreateInstance("mBox") $r = $i.main() ----------------------------------------------------------------------------------------------------------------- Google Web Toolkit – современное средство создания Rich Internet Application Кирилл Сухов ant hosted ant build C:\www\gwt>webAppCreator -out MailBoxes com.samag.MailBoxes //Создание кнопки final Button sendButton = new Button("Send"); // Привязка её к таблице стилей sendButton.addStyleName("sendButton"); // Добавление в панель приложения RootPanel.get("sendButtonContainer").add(sendButton); class MyHandler implements ClickHandler, KeyUpHandler { public void onClick(ClickEvent event) { sendNameToServer(); } ........................................... } MyHandler handler = new MyHandler(); sendButton.addClickHandler(handler);
Please enter your name:
Please enter your name:
final Button sendButton = new Button("Send"); final Button resButton = new Button("Reset"); RootPanel.get("sendButtonContainer").add(sendButton); RootPanel.get("resContainer").add(resButton); resButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { nameField.setText(""); sendButton.setFocus(true); } }); final Grid mailGrid = new Grid(1,5); mailGrid.setTitle("mailboxes"); import com.google.gwt.user.client.ui.Grid; mailGrid.setText(0, 0, "ID"); mailGrid.setText(0, 1, "Name"); mailGrid.setText(0, 2, "Email"); mailGrid.setText(0, 3, "Activity"); this.getUsers(mailGrid); private void getUsers(Grid grid) { int rows; int newRow; String rid; rows=grid.getRowCount(); newRow=grid.insertRow(rows); grid.setText(newRow, 0, "1"); grid.setText(newRow, 1, "Ivfnov"); grid.setText(newRow,2, "ivanov@gwt.ru"); grid.setText(newRow, 3, "On"); rows=grid.getRowCount(); newRow=grid.insertRow(rows); grid.setText(newRow, 0, "2"); grid.setText(newRow, 1, "Sidorov"); grid.setText(newRow, 2, "sidorov@gwt.ru"); grid.setText(newRow, 3, "On");
RootPanel.get("mailTable").add(mailGrid); mailGrid.setStyleName("emailTables"); emailTables{ font-size: 120%; line-height: 1em; background: url(images/hborder.gif) repeat-x; } package com.samag.client; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Grid; public class delButton extends Button { public delButton(final Grid grid,final int row) { super("Delete", new ClickHandler() { public void onClick(ClickEvent event) { Window.alert("Удаляем ряд"+row); grid.removeRow(row); } }); } } newRow=grid.insertRow(rows); grid.setText(newRow, 0, "1"); grid.setText(newRow, 1, "Иванов"); grid.setText(newRow,2, "ivanov@gwt.ru"); grid.setText(newRow, 3, "On"); grid.setWidget(newRow, 4, new delButton(grid,1)); package com.samag.client; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.ToggleButton; import com.google.gwt.user.client.Window; public class ActiveButton extends ToggleButton { public ActiveButton(final Grid grid, int turn) { super("On", "Off"); if(turn!=1){ this.setDown(true); } public void onClick(ClickEvent event) { Window.alert("Меняем активность"); } } newRow=grid.insertRow(rows); grid.setText(newRow, 0, "1"); grid.setText(newRow, 1, "Ivanov"); grid.setText(newRow,2, "ivanov@gwt.ru"); grid.setWidget(newRow, 3, new ActiveButton(grid,1)); grid.setWidget(newRow, 4, new delButton(grid,1)); final TextBox Name = new TextBox(); final TextBox Email = new TextBox(); final CheckBox Activity = new CheckBox(); Activity.setValue(true); int rows=mailGrid.getRowCount(); int newRow=mailGrid.insertRow(rows); mailGrid.setWidget(newRow, 1, Name); mailGrid.setWidget(newRow, 2, Email); mailGrid.setWidget(newRow, 3, Activity); mailGrid.setWidget(newRow, 4, new Button("Add", new ClickHandler() { public void onClick(ClickEvent event) { this.addRow(mailGrid,Name.getValue(),Email.getValue(),Activity.getValue()); } private void addRow(Grid mailGrid,String uName, String uEmail, Boolean uActivity) { if(uName.isEmpty() && uEmail.isEmpty()){ Window.alert("Не все параметры заполнены!"); return; } int rows=mailGrid.getRowCount(); String rid=String.valueOf(Integer.parseInt(mailGrid.getText(rows-2, 0))+1); int newRow=mailGrid.insertRow(rows-1); mailGrid.setText(newRow, 0, rid); mailGrid.setText(newRow, 1, uName); mailGrid.setText(newRow, 2, uEmail); int turn = 0; if(uActivity.booleanValue()){ turn = 1; } ActiveButton uActive = new ActiveButton(mailGrid,turn); mailGrid.setWidget(newRow, 3, uActive); mailGrid.setWidget(newRow, 4, new delButton(mailGrid,newRow)); } ----------------------------------------------------------------------------------------------------------------- Три в одном. Управление Linux с помощью LIRC Олег Воронин $ sudo modprobe lirc_serial $ sudo modprobe lirc_serial io=0x2f8 irq=3 $ modinfo lirc_serial $ sudo modprobe lirc_serial $ sudo setserial /dev/ttyS0 uart none /dev/ttyS0 uart none setserial /dev/ttyS0 uart none $ sudo modprobe lirc_sir io=0x2f8 $ lsmod | grep lirc options lirc_serial io=0x2f8 type=0 $ sudo xmode2 -d /dev/lirc0 #Пульт, можно вписать любое название REMOTE="panasonic" #Список автоматически загружаемых модулей REMOTE_MODULES="lirc_sir" #Драйвер (см.таблицу /usr/share/doc/lirc/html/table.html) REMOTE_DRIVER="default" #Устройство, с которого считывать сигнал REMOTE_DEVICE="/dev/lirc0" REMOTE_SOCKET="" REMOTE_LIRCD_CONF="" REMOTE_LIRCD_ARGS="" #Передатчик TRANSMITTER="None" TRANSMITTER_MODULES="" TRANSMITTER_DRIVER="" TRANSMITTER_DEVICE="" TRANSMITTER_SOCKET="" TRANSMITTER_LIRCD_CONF="" TRANSMITTER_LIRCD_ARGS="" #Запускать lircd? START_LIRCD="true" #Автоматически загружать модули LOAD_MODULES="true" $ sudo irrecord -d /dev/lirc0 lg.conf -n $ sudo service lirc start $ irw begin prog = ... remote = ... button = ... [button = ...] repeat = ... delay = ... config = ... [config = ...] mode = ... flags = ... end begin mode ... end mode begin flags = startup_mode mode = browser end include ~/.lirc/xawtv $ mplayer -input cmdlist begin remote = panas prog = mplayer button = operate config = quit end begin remote = panas prog = mplayer button = reset config = vo_fullscreen end begin remote = panas prog = mplayer button = up config = volume +10 repeat = 1 end begin remote = panas prog = mplayer button = down config = volume -10 repeat = 1 end begin remote = panas prog = mplayer button = pause config = pause end begin remote = panas prog = mplayer button = ff config = seek +30 0 repeat = 1 end begin remote = panas prog = mplayer button = rew config = seek -30 0 repeat = 1 end begin remote = panas button = vtr/tv prog = irexec config = gmplayer & end $ irexec -d begin remote = panas button = display prog = irxevent config = Key F CurrentWindow end [shift-][numlock-][ctrl-][alt-][meta-][mod3-][mod4-][scrlock-]Keyname config = Button 1 15 95 Mplayer $ irxevent -d begin remote = panas button = display prog = irexec config = xdotool key ctrl+alt+n end #!/bin/sh # Activate Firefox and paste the clipboard contents into the url bar wid=`xdotool search --title "Mozilla Firefox"` xdotool windowactivate $wid sleep 0.2 xdotool key "ctrl+j" xdotool key "BackSpace" xdotool key "ctrl+v" START_LIRCMD="true" PROTOCOL ACCELERATOR ACTIVATE