HP Network Node Manager i 9x. Разбираемся и устанавливаем Александр Тетюшев kernel.shmmax = 68719476736 net.core.rmem_max = 8388608 net.core.wmem_max = 8388608 # /sbin/sysctl –p soft nofile 4096 hard nofile 4096 # rpm --import hpPublicKey.pub # rpm --import hpPublicKey2012.pub # yum install java-1.6.0-openjdk # yum install compat-libstdc++-33-3.2.3-69.el6.x86_64 compat-libstdc++-33-3.2.3-69.el6.i686 glibc.i686 glibc.x86_64 libaio.x86_64 libXtst.x86_64 libXext.i686 libXi.x86_64 libXi.i686 perl-libs.i686 # tar xvf Software_HP_NNMi_Freemium_for_Linux_TB776-15513.tar.gz # ./setup.bin LAX_VM /usr/bin/java # tail -f /var/opt/OV/log/nnm/nnm-install-config.log # export PATH=/opt/OV/bin:/opt/OV/lbin:$PATH # ovstatus -v # /opt/OV/bin/ovstop -с # /opt/OV/Uninstall/NNM/setup.bin # rm -rf /etc/opt/OV /opt/OV /var/opt/OV # userdel -f nmsdbmgr nmsproc ----------------------------------------------------------------------------------------------------------------- VMware vSphere 5.5. Новые возможности и новые проблемы Александр Руденко vCenter Single Sign-On server (SSO) vSphere Web Client ----------------------------------------------------------------------------------------------------------------- Мониторинг серверов Hewlett-Packard с помощью Net::iLO Рашид Ачилов --- ILO.pm 2011-08-02 04:16:18.000000000 +0700 +++ ILO-my.pm 2013-08-19 11:49:13.000000000 +0700 @@ -635,6 +635,14 @@ $self->port(443); } + # Инициализировать поля mac01 – mac04, чтобы не выдавались сообщения о неинициализированных полях, + # если в сервере только две сетевые карты + $self->{mac01} = ""; + $self->{mac02} = ""; + $self->{mac03} = ""; + $self->{mac04} = ""; + $self->{macilo} = ""; + $self->{_version} = $options{version} || undef; $self->{_debug} = $options{debug} || '0'; @@ -1042,10 +1050,11 @@ $self->{_client} = IO::Socket::SSL->new( PeerAddr => "$address:$port", + SSL_verify_mode => SSL_VERIFY_NONE, ); if (!$self->{_client}) { - $self->error( "Unable to establish SSL connection with $address:$port [ " . IO::Socket::SSL::errstr() . "]" ); + $self->error( "Unable to establish SSL connection with $address:$port\n [" . IO::Socket::SSL::errstr() . "]" ); return; } use strict; use warnings; use strict 'refs'; use Nagios::Plugin; use Net::ILO; use vars qw( $VERSION $PROGNAME $timeout ); $VERSION = "1.00"; $PROGNAME = "check_ilo_fans"; our $p = Nagios::Plugin->new( usage => "Usage: %s [-H|--hostname=] [ -u|--username= ] [ -p|--password= ] [ -2|--ilo2 ] [ -3|--ilo3 ] [ -d|--data ] [ -t|--timeout=]", version => $VERSION, blurb => 'This plugin checks the fan status on a remote iLO2|3 device and will return OK, WARNING or CRITICAL. iLO(integrated Lights-Out) can be found on HP Proliant servers.' ); $p->add_arg(spec => 'hostname|H=s', help => qq{-H, --hostname=STRING Specify the hostname on the command line.}, ); $p->add_arg(spec => 'username|u=s', help => qq{-u, --username=STRING Specify the username on the command line.}, ); $p->add_arg(spec => 'password|p=s', help => qq{-p, --password=STRING Specify the password on the command line.}, ); $p->add_arg(spec => 'data|d', help => qq{-d, --data Enable data on output.}, ); $p->add_arg(spec => 'ilo2|2', help => qq{-2, --ilo2 Check iLO2 device.}, ); $p->add_arg(spec => 'ilo3|3', help => qq{-3, --ilo3 Check iLO3 device.}, ); $p->getopts; my $hostname = $p->opts->hostname; my $username = $p->opts->username; my $password = $p->opts->password; my $data = defined($p->opts->data) ? 1 : 0; my $ilo_verson = undef; $ilo_verson = 2 if ( defined($p->opts->ilo2) ); $ilo_verson = 3 if ( defined($p->opts->ilo3) ); unless ( defined($hostname) && defined($username) && defined($password) ) { $p->nagios_die("ERROR: Missing host, password and user."); } alarm $p->opts->timeout; # Подключиться к iLO my $ilo = Net::ILO->new ({ address => $hostname, username => $username, password => $password, version => $ilo_verson, }); my @faults = (); my $fans = $ilo->fans; # Массив со статусом вентиляторов. # Из него сформируется сообщение. my @msgfans; foreach my $fan (@$fans) { my $name = $fan->{name}; my $location = $fan->{location}; my $speed = $fan->{speed}; my $status = $fan->{status}; # Укоротить имя для отображения $name =~ s/Fan Block/Fan/; push @msgfans,"$name($location): $speed" . "%"; $name =~ s/ /_/g; push @faults, "$name: $status" unless ( $status =~ m/^OK$/i ); if ( $data ) { $p->add_perfdata(label => "$name($location)", value => $speed, uom => "%", ); } } # Формируем сообщения для завершения работы my $return = @faults ? "CRITICAL" : "OK"; my $message = @faults ? join '; ', @faults : "No faults detected"; # Создаем сообщение с данными о вентиляторах my $dfan = join(",", @msgfans); # Выходим с указанным статусом $p->nagios_exit( return_code => $return, message => "$message; $dfan", ); my @faults = (); my $temperatures = $ilo->temperatures; # Массив со статусом термодатчиков my @msgtemps; foreach my $sensor (@$temperatures) { my $name = $sensor->{name}; my $location = $sensor->{location}; my $value = $sensor->{value}; my $status = $sensor->{status}; my $caution = $sensor->{caution}; my $critical = $sensor->{critical}; push @msgtemps,"$name($location): $value" . "C"; $name =~ s/ /_/g; push @faults, "$name: $status" unless ( $status =~ m/^OK$/i ); if ( $data ) { $p->add_perfdata(label => "$name($location)", value => $value, uom => "", warning => $caution, critical => $critical, ); } } my @faults = (); # Сохраняем аппаратную идентификацию my $model = $ilo->model; my $serial = $ilo->serialID; my $biosdate = $ilo->biosdate; # Проверка блоков питания my $power_supplies = $ilo->power_supplies; foreach my $power (@$power_supplies) { my $name = $power->{name}; my $status = $power->{status}; $name =~ s/ /_/g; push @faults, "$name: $status" unless ( $status = ~ m/^OK$/i ); } # Сохраняем данные о потребляемой мощности my $epower = $ilo->power_consumption; my $msgpower = "Power consumption: " . $epower . "W"; # Передаем данные о производительности if ( $data ) { $p->add_perfdata(label => "Power", value => $epower, uom => "W", ); } # Сообщения для завершения my $return = @faults ? "CRITICAL" : "OK"; my $message = @faults ? join '; ', @faults : "No faults detected"; # Сообщаем статус и завершаем работу $p->nagios_exit( return_code => $return, message => "Model: $model, serial: $serial, BIOS date: $biosdate; $message" . "; $msgpower", ); # Команда 'check_ilo_power' define command{ command_name check_ilo_power command_line $USER1$/check_ilo_power.pl -H $HOSTADDRESS$ -u nagios -p blabla -2 -d -t 60 } # Команда 'check_ilo_fans' define command{ command_name check_ilo_fans command_line $USER1$/check_ilo_fans.pl -H $HOSTADDRESS$ -u nagios -p blabla -2 -d -t 30 } # Команда 'check_ilo_temp' define command{ command_name check_ilo_temp command_line $USER1$/check_ilo_temp.pl -H $HOSTADDRESS$ -u nagios -p blabla -2 -d -t 30 } # Описания сервисов cfg_dir=/usr/local/etc/nagios/services define service{ name generic-ilo-power-check use generic-service,popup-service service_description iLO Power Supply Check is_volatile 0 check_period 24x7 notification_period 24x7 notification_options c,r,w,u check_command check_ilo_power register 0 } define service{ name generic-ilo-fan-check use generic-service,popup-service service_description iLO Fan Speed Check is_volatile 0 check_period 24x7 notification_period 24x7 notification_options c,r,w,u check_command check_ilo_fans register 0 } define service{ name generic-ilo-temp-check use generic-service,popup-service service_description iLO Temperature Check is_volatile 0 check_period 24x7 notification_period 24x7 notification_options c,r,w,u check_command check_ilo_temp register 0 } # Шаблон сервиса с данными, отображаемыми во всплывающем окне define service{ name popup-service ; action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$' class='tips' rel='/pnp4nagios/popup?host=$HOSTNAME$&srv=$SERVICEDESC$ register 0 ; } define service{ use generic-ilo-power-check host_name novosib-vm contact_groups hardware-admins } define service{ use generic-ilo-fan-check host_name novosib-vm contact_groups hardware-admins } define service{ use generic-ilo-temp-check host_name novosib-vm contact_groups hardware-admins } my $cpus = $ilo->cpus; print "Number of CPUs: ", scalar @$cpus, "\n\n"; foreach my $cpu (@$cpus) { print " CPU: ", $cpu->{name}, " speed: ", $cpu->{speed}, “\n"; print " Cores: ", $cpu->{cores}, "\n"; } my $ramslots = $ilo->ramslots or die $ilo->error; print "DIMM slots: ", scalar @$ramslots, "\n\n"; foreach my $slot (@$ramslots) { print " Slot: ", $slot->{location}, "size: ", $slot->{size}, “\n"; print "Speed: ", $slot->{speed}, "\n" if defined $slot->{speed}; } my $ilo_mac = $ilo->macilo; print $ilo->fw_type; print $ilo->fw_version; print $ilo->fw_date; print $ilo->ssh_status; ----------------------------------------------------------------------------------------------------------------- Эпоха DOS vs эпохи UEFI. Взаимодополняющие антагонисты Антон Борисов /usr/local/qemu-1.6/bin/qemu-system-x86_64 –L Листинг 1. Определяем смещение внутри GPT-таблицы $ parted ./hdcblk (parted) Unit Unit? [compact]? B (parted) print (parted) quit load ext2_x64.efi mount blk3 fs1 fs1: dir ----------------------------------------------------------------------------------------------------------------- Автоматизируем реализацию товаровна основе «1С:Предприятие 8.2. Управление торговлей» Дмитрий Андриенко &НаСервере Процедура ОтчиститьРег() Набор = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей(); Набор.Записать(); КонецПроцедуры &НаКлиенте Процедура ОтчиститьРегисторШтрихКод(Команда) ОтчиститьРег(); КонецПроцедуры &НаКлиенте Процедура КомандаСформироватьТаблицу(Команда) ЗапросТаблицы(); КонецПроцедуры &НаСервере Процедура ЗапросТаблицы() Запрос = Новый Запрос("ВЫБРАТЬ | Номенклатура.Ссылка КАК Номенклатура, | Номенклатура.Артикул, | ХарактеристикиНоменклатуры.Ссылка КАК Характеристика, | Номенклатура.Код КАК Код, | ХарактеристикиНоменклатуры.Ссылка КАК Упаковка |ИЗ | Справочник.Номенклатура КАК Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры | ПО Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УпаковкиНоменклатуры КАК УпаковкиНоменклатуры | ПО УпаковкиНоменклатуры.Владелец = Номенклатура.Ссылка | И УпаковкиНоменклатуры.НоменклатураМногооборотнаяТара = Номенклатура.Ссылка |ГДЕ | НЕ Номенклатура.Ссылка.ЭтоГруппа | И Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)"); РезультатТаблицы = Запрос.Выполнить().Выгрузить(); Для Каждого Строка из РезультатТаблицы Цикл НоваяСтрока = Объект.Номенклатура.Добавить(); НоваяСтрока.Артикул = Строка.Артикул; НоваяСтрока.Номенклатура = Строка.Номенклатура; НоваяСтрока.Характеристика = Строка.Характеристика; НоваяСтрока.Код=Строка.Код; НоваяСтрока.Упаковка = Строка.Упаковка; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура ЗаписатьШрихКод(Команда) ЗаписатьШрихкодВРегистр(); КонецПроцедуры &НаСервере Процедура ЗаписатьШрихкодВРегистр() РезультатТаблицы = Объект.Номенклатура.Выгрузить(); Если РезультатТаблицы.Количество()>0 Тогда НомерСтроки = 0; НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей(); Для Каждого Строка Из РезультатТаблицы Цикл ТекДата = ТекущаяДата(); НоваяЗапись = НаборЗаписей.Добавить(); Код = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(Строка.Код); НоваяЗапись.Номенклатура = Строка.Номенклатура; Если ЭтоВесовойТовар(Строка.Номенклатура, Строка.Упаковка) Тогда НоваяЗапись.Штрихкод = СформироватьШтрихкодEAN13ВесовогоТовара(); Иначе НоваяЗапись.Штрихкод = СформироватьШтрихкодEAN13(); КонецЕсли; НоваяЗапись.Характеристика = Строка.Характеристика; НоваяЗапись.Период = ТекДата; НомерСтроки= НомерСтроки+1; НаборЗаписей.Записать(Истина); КонецЦикла; Сообщить("Штрихкоды записаны"); КонецЕсли; КонецПроцедуры &НаСервереБезКонтекста Функция ЭтоВесовойТовар(Номенклатура, Упаковка) Если ЗначениеЗаполнено(Упаковка) Тогда Если Упаковка.ЕдиницаИзмерения.ТипЕдиницыИзмерения = Перечисления.ТипыЕдиницИзмерения.Весовая Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; Иначе Если Номенклатура.ЕдиницаИзмерения.ТипЕдиницыИзмерения = Перечисления.ТипыЕдиницИзмерения.Весовая Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецЕсли; КонецФункции &НаСервереБезКонтекста Функция СформироватьШтрихкодEAN13() ПрефиксВнутреннегоШтрихкода = Формат(Константы.ПрефиксШтучногоШтрихкода.Получить(),"ЧЦ=2; ЧН=; ЧВН="); Возврат РегистрыСведений.ШтрихкодыНоменклатуры.СформироватьШтрихкодEAN13(РегистрыСведений.ШтрихкодыНоменклатуры.ПрефиксШтучногоТовара(), ПрефиксВнутреннегоШтрихкода); КонецФункции &НаСервереБезКонтекста Функция СформироватьШтрихкодEAN13ВесовогоТовара() ПрефиксВесовогоШтрихкода = Формат(Константы.ПрефиксВесовогоШтрихкода.Получить(),"ЧЦ=1; ЧН=; ЧВН="); Возврат РегистрыСведений.ШтрихкодыНоменклатуры.СформироватьШтрихкодВесовогоТовараEAN13(ПрефиксВесовогоШтрихкода); КонецФункции // Функция возвращает префикс штучного товара // Параметры: // Нет // Возвращаемое значение: // Строка Функция ПрефиксШтучногоТовара() Экспорт Возврат "0"; КонецФункции // Функция возвращает максимальное значение штрихкода // числом // Параметры: // ПрефиксШтучногоТовара – Строка // ПрефиксВнутреннегоШтрихкода – Строка // Возвращаемое значение: // Число Функция ПолучитьМаксимальноеЗначениеКодаШтрихкодаЧислом(ПрефиксШтучногоТовара, ПрефиксВнутреннегоШтрихкода) Экспорт Запрос = Новый Запрос(" |ВЫБРАТЬ | МАКСИМУМ(ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 5, 8)) КАК Код |ИЗ | РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры |ГДЕ | ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО ""2" + ПрефиксШтучногоТовара + ПрефиксВнутреннегоШтрихкода + "_________"" |"); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); ОписаниеТипаЧисла = Новый ОписаниеТипов("Число"); ЗначениеКодаЧислом = ОписаниеТипаЧисла.ПривестиЗначение(Выборка.Код); Возврат ЗначениеКодаЧислом; КонецФункции // Функция вычисляет контрольный символ кода EAN // Параметры: // Штрихкод – штрихкод (без контрольной цифры) // Тип - тип штрихкода: 13 - EAN13, 8 - EAN8 // Возвращаемое значение: // Контрольный символ штрихкода Функция КонтрольныйСимволEAN(ШтрихКод, Тип) Экспорт Четн = 0; Нечетн = 0; КоличествоИтераций = ?(Тип = 13, 6, 4); Для Индекс = 1 По КоличествоИтераций Цикл Если (Тип = 8) и (Индекс = КоличествоИтераций) Тогда Иначе Четн = Четн + Сред(ШтрихКод, 2 * Индекс, 1); КонецЕсли; Нечетн = Нечетн + Сред(ШтрихКод, 2 * Индекс - 1, 1); КонецЦикла; Если Тип = 13 Тогда Четн = Четн * 3; Иначе Нечетн = Нечетн * 3; КонецЕсли; КонтЦифра = 10 - (Четн + Нечетн) % 10; Возврат ?(КонтЦифра = 10, "0", Строка(КонтЦифра)); КонецФункции ----------------------------------------------------------------------------------------------------------------- Обмануть время. RunAsDate в помощь тестировщику Анна Сергеева (GetSystemTime, GetLocalTime, GetSystemTimeAsFileTime) RunAsDate.exe [ddmmyyyy] {hh:mm:ss} [Программа для запуска] {Параметры программы} void __fastcall TForm1::Timer1Timer(TObject *Sender) { ShortDateFormat = "d/m/yyyy"; Label1->Caption = DateToStr(Date()); } D:\BCB_prj\Date\Project1.exe D:\Test\RunAsDate.exe 07\11\2013 D:\BCB_prj\Date\Project2.exe ----------------------------------------------------------------------------------------------------------------- Тестирование приложений при разработке. Функциональное и модульное тестирование Михаил Ушаков PM> Install-Package NUnit using Microsoft.VisualStudio.TestTools.UnitTesting; PM> Install-Package RhinoMocks using Rhino.Mocks public interface IDatabaseManager { void ExecuteNonQuery(String statement); TResult ExecuteScalar (String statement); DataTable ExecuteDataTable(String statement); public String ConnectionString { get; } } public class SqlDatabaseManager : IDatabaseManager { public SqlDatabaseManager(String connectionString) { // ... } public void ExecuteNonQuery(String statement) { // ... } public TResult ExecuteScalar (String statement) { // ... } { // ... } public String ConnectionString { get; set; } public static String CreateDatabase(String server, String database, String user, String password) { // ... } public static Boolean DropDatabase(IDatabaseManager masterManager, String databaseName) { } public static Boolean CheckDatabase(IDatabaseManager masterManager, String databaseName) { } } [TestFixture] public class TestSqlDatabaseManager { [SetUp] public void SetUp() { // 1.1 Common assign _masterManager = new SqlDatabaseManager(Hostname, MasterDatabaseName); if(SqlDatabaseManager.CheckDatabase(_masterManager, TestDatabaseName)) SqlDatabaseManager.DropDatabase(_masterManager, TestDatabaseName); SqlDatabaseManager.CreateDatabase(_masterManager, TestDatabaseName, _databasePath); } [TearDown] public void TearDown() { if(SqlDatabaseManager.CheckDatabase(_masterManager, TestDatabaseName)) SqlDatabaseManager.DropDatabase(_masterManager, TestDatabaseName); } [Test] public void TestInsertDataToDatabase() { // 1.2 Specific assign _databaseManager = new SqlDatabaseManager(Hostname, DatabaseName); // 2 Act String createStructureScriptText = File.ReadAllText(Path.GetFullPath(CreateSampleDatabaseScript)); _databaseManager.ExecuteNonQuery(insertDataScriptText); String insertDataScriptText = File.ReadAllText(Path.GetFullPath(TestScriptsDirectory + ( InsertSampleDataScript)); _databaseManager.ExecuteNonQuery(insertDataScriptText); // 3 Assert Int32 quantity = _databaseManager.ExecuteScalar(SelectDataCountQuery); Assert.AreEqual(quantity, ExpectedQuantity, "Check if quantities are equal";) // 3 Other checks (check every row) } [Test] public void TestInsertDuplicateDataToDatabase() { _databaseManager = new SqlDatabaseManager(Hostname, DatabaseName); // ... } [Test] public void TestConnectWithValidAccount() { _databaseManager = new SqlDatabaseManager(Hostname, DatabaseName, AdminUser, Adminpassword); // ... } [Test] public void TestConnectWithInvalidAccount () { _databaseManager = new SqlDatabaseManager(Hostname, DatabaseName, BadUser, String.Empty); // ... } // ... + many-many test private const Int32 ExpectedQuantity = 8; private const String CreateTestTablesStatement = private const String TestDatabaseName = "TestDB4DatabaseManager"; private const String MasterDatabaseName = "master"; private const String BadUser = "unknown"; private const String AdminUser = "sa"; private const String AdminPassword = "password"; private const String TestScriptsDirectory = @"..\..\TestScripts"; private const String CreateSampleDatabaseScript = "CreateTestDatabase.sql"; private const String InsertSampleDataScript = "FillTestDatabase.sql"; private const String SelectDataCountQuery = "SELECT COUNT(*) FROM [dbo].[KnowTable1]"; private readonly String _databasePath = Path.GetFullPath(".");; private SqlDatabaseManager _masterManager; private SqlDatabaseManager _databaseManager; } Assert.AreEqual(1000, 1000.0, "Comparison of two numbers"); result = _reader.LoadSpectrumFromFile(spectrumSourceFile, _spectrum, out _description); Assert.IsTrue(result, "Check if result of spectrum load operation was successful"); MessbauerSpectrumProperties properties = _spectrum.CalculateBasicProperties(); Assert.IsNotNull(properties, "Check if calculation performed successfuly"); Assert.Greater(transformedSpectrum[0], 1000, "Must be grater at least than 1000"); Assert.IsTrue(counts.SequenceEqual(_spectrum.GetSpectrum()), "Check if contents of counts array are equal"); _testSpectrum1 = null; Assert.Throws(() => _subtractor = new MessbauerSpectrumSubtraction(_testSpectrum1, _testSpectrum2), "Must throw ArgumentException due to _testSpectrum1 is null"); _testSpectrum1 = new MessbauerSpectrum(); _testSpectrum2 = null; Assert.Throws(() => _subtractor = new MessbauerSpectrumSubtraction(_testSpectrum1, _testSpectrum2), "Must throw ArgumentException due to _testSpectrum2 is null"); _testSpectrum2 = new MessbauerSpectrum(); _testSpectrum1.SetMeasureMode(MessbauerChannelModes.ChannelMode256); Assert.Throws(() => _subtractor = new MessbauerSpectrumSubtraction(_testSpectrum1, _testSpectrum2), "Must throw ArgumentException due to _testSpectrum2 has less points then _TestSpectrum1"); _testSpectrum1.SetMeasureMode(MessbauerChannelModes.ChannelMode4096); Assert.Throws(() => _subtractor = new MessbauerSpectrumSubtraction(_testSpectrum1, _testSpectrum2, 0), "Must throw ArgumentException due to scale coefficient is 0"); [TestFixture] public class TestLoginManager { [SetUp] public void SetUp() { _mockedContext = _repository.StrictMock(); _mockedLogger = _repository.StrictMock(); _manager = new LoginManager(_mockedContext, _mockedLogger); // ... } private MockRepository _repository; private IModelContext _mockedContext; private ILog _mockedLogger; } [Test] public void TestGetLogins() { CleanData(); LoginEntity login1 = new LoginEntity(Guid.NewGuid(), "name", Guid.NewGuid(), Guid.NewGuid()); login1.Profile = new ProfileEntity(); login1.Realm = new RealmEntity(); LoginEntity login2 = new LoginEntity(Guid.NewGuid(), "name2", Guid.NewGuid(),Guid.NewGuid()); login2.Profile = new ProfileEntity(); login2.Realm = new RealmEntity(); LoginEntity login3 = new LoginEntity(Guid.NewGuid(), "name3", Guid.NewGuid(),Guid.NewGuid()); login3.Profile = new ProfileEntity(); login3.Realm = new RealmEntity(); LoginEntity login4 = new LoginEntity(Guid.NewGuid(), "name4", Guid.NewGuid(),Guid.NewGuid()); login4.Profile = new ProfileEntity(); login4.Realm = new RealmEntity(); _testLoginData.Add(login1); _testLoginData.Add(login2); _testLoginData.Add(login3); _testLoginData.Add(login4); using (_repository.Record()) using (_repository.Ordered()) { _mockedLogger.Info(GetLoginsLogMessage); Expect.Call(_mockedContext.Logins).Return(_testLoginData); } using (_repository.Playback()) { List logins = _manager.GetLogins().ToList(); Assert.AreEqual(logins.Count, _testLoginData.Count(), "Comparison of collections logins and _testLoginData sizes"); } } Expect.Call(() => _mockedNotifier.NotifyUserPasswordReset( Arg.Matches(realValue => realValue.Equals(_testLoginData[0].Profile)), Arg.Matches(realValue => realValue.Equals(_testLoginData[0].Name)), Arg.Matches(realValue => !String.IsNullOrEmpty(realValue)))); public DataTable ExecuteDataTable(String statement); ----------------------------------------------------------------------------------------------------------------- Индексы в MongoDb Александр Календарев db.< collection>. ensureIndex ({< field1 >:< sorting>, :< sorting>, ...}); db.users. ensureIndex ({"age": 1}); db.users. ensureIndex ({"salary":- 1}); db.users. ensureIndex ({"login": 1},{ "unique": true}); db.< collection >. dropIndex ({:, :, ...}); db.users.dropIndex({"age": 1}); > db.contacts.dropIndexes() db..find().explain() > db.users.find({level:3}).explain() > db.userss.find({out:3}).explain() > db.users.getIndexes() db.< collection >. find ( ... ). hint ( {< indexfield_1 >:1 , :1 , ...} ); db.< collection >. ensureIndex ({< field1 >:< sorting>,...}, {"background" : true}) ; db.users.find ({"sex" : 1, "city_id" : 78, "age" : {"$lt" : 27, "$gt" : 19}}); db.users. ensureIndex ({"sex" : 1, "city_id" : 1, "age" : 1 }); [1] db.users.find ({"sex" : 1, "city_id" : 78}) ; db.users. ensureIndex ({"sex" : 1, "age" : 1 }); db.users.find ({"sex" : 1, "age" : {"$lt" : 27, "$gt" : 19}}); db.users. ensureIndex ({"city_id" : 1, "dateCreate" : -1 }); db.users.find({"city_id" : 78, "dateCreate" : new Date().Time() }); db.users.find({"sex" : 1, "age" : {"$lt" : 25, "$gt" : 20} , "hobby" : "Путешествия" }); db.users.ensureIndex({"sex" : 1, "age" : 1 , "hobby" : 1 }); ----------------------------------------------------------------------------------------------------------------- Меньше кода, больше дохода. Часть 1. Создание проекта и конфигурирование Михаил Ушаков mvn archetype:generate -DarchetypeCatalog=http://tapestry.apache.org mvn jetty:run //для запуска на контейнере сервлетов jetty mvn tomcat:deploy UralMessbauerPortal tapestry.development-modules com.mushakov.uralsmessbauerportal.services.DevelopmentModule tapestry.qa-modules com.mushakov.uralsmessbauerportal.services.QaModule tapestry.execution-mode development org.apache.tapestry tapestry-hibernate ${tapestry-release-version} mysql mysql-connector-java 5.1.28 /dependency> org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql://localhost/UralsMessbauerPortal root password update true true @Inject MyJsonSerializer myJsonSerializer; public static void bind(ServiceBinder binder) { binder.bind(JsonSerializer.class, MyJsonSerializer.class); // other binders } configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en,ru,de"); configuration.add(SymbolConstants.CHARSET, "UTF-8"); configuration.add(SymbolConstants.DEFAULT_STYLESHEET, false); configuration.add(SymbolConstants.HOSTPORT_SECURE, httpsPort); //... private static final int httpsPort = 8443; ----------------------------------------------------------------------------------------------------------------- Сервер на платформе Node.js. HTTP и не только Кирилл Сухов var net = require('net'); var server = net.createServer( function(socket) { console.log('Соединение с '+socket.remoteAddress+":"+socket.remotePort); }).listen(8080); console.log('listening on port 8080'); $ node tcp2.js console.log('Соединение с '+socket.remoteAddress+":"+socket.remotePort); socket.write('Hello TCP!'); socket.end(); }).listen(8080); socket.write('Hello TCP!'); var i=0; while(socket){ i++; var m = i+''; socket.write(m); } socket.end(); socket.write('Hello TCP!'); //socket.end(); socket.on('data', function (data) { console.log(data.toString()); socket.write("Resived: "+data); socket.end(); }); socket.on('close', function () { console.log("Closed"); }); }).listen(8080); console.log('listening on port 8080'); socket.write('Hello TCP!\n'); // socket.end(); socket.on('data', function (data) { if(data == 'exit\n') { socket.end(); } else { console.log(data.toString()); socket.write("Resived: "+data); } }); socket.on('close', function () { console.log("Closed"); }); }).listen(8080); console.log('listening on port 8080'); C:\Users\Geol\Downloads>nc var net = require('net'); var clientSocket = new net.Socket(); clientSocket.setEncoding('utf8'); clientSocket.connect ('8080','localhost', function () { console.log('connected to server'); clientSocket.write('Hello'); }); clientSocket.on('data',function(data) { console.log(data); }); clientSocket.on('close',function() { console.log('Соединение закрыто'); }); C:\Users\Geol\node>node client.js } else { console.log(data.toString()); socket.write("Resived: "+data); } clientSocket.connect ('8080','localhost', function () { console.log('connected to server'); clientSocket.write('Hello',function(){ process.stdin.resume(); process.stdin.on('data', function (data) { clientSocket.write(data); }); }); }); C:\Users\Geol\node\tcp>node client.js C:\Users\Geol\node\tcp>node client.js C:\Users\Geol\node\tcp>node client.js C:\Users\Geol\node\tcp>node tcp1.js var net = require('net'); var clients =[]; var tcpServer = net.createServer( function(socket) { clients[clients.length++] = socket; console.log('Соединение с '+socket.remoteAddress+":"+socket.remotePort); clients.forEach( function(client){ client.write("Here: "+ ↵ socket.remoteAddress+ ↵ ":"+socket.remotePort); } ) socket.on('data', function (data) { console.log(data.toString()); clients.forEach( function(client){ client.write("Resived: "+data+" from: "+ socket.remoteAddress+":"+socket.remotePort); } ); }); }).listen(8081); console.log('listening on port 8081'); C:\Users\Geol\node\tcp>node client.js var net = require('net'); var http = require('http'); var httpServer; function httpStart(){ server = http.createServer(function (request, response) {; response.writeHead(200, {'Content-Type': 'text/html'}); response.end('

Hello Node!

'); ............................................... }).listen(8080); return server; } var tcpServer = net.createServer↵ ( function(socket) { socket.on('data', function (data) { if(data.toString() == 'start\r\n'){ httpServer = httpStart(); socket.write("Server started"); } if(data.toString() == 'stop\r\n') { httpStop(httpServer); socket.write("Server stoped"); } }); socket.on('close', function () { console.log("Closed"); }); }).listen(8081); var dgram = require('dgram'); var udpServer = dgram.createSocket("udp4"); udpServer.bind(8082); server.on ("message", function(msg, info) { console.log("Message: " + msg + " from " + info.address + ":" + info.port); }); var dgram = require('dgram'); var client = dgram.createSocket("udp4"); process.stdin.resume(); process.stdin.on('data', function (data) { console.log(data.toString('utf8')); client.send(data, 0, data.length, 8082, "localhost", function (err, bytes) { if (err) console.log('error: ' + err); else console.log('OK'); fp}); }); var http = require('http'); var server = http.createServer().listen(8080); server.on('request', function(request, response){ response.writeHead(200, {'Content-Type': 'text/html'}); response.end('

Hello HTTP!

'); }); server.on('request', function(request, response){ console.log(request.method); console.log(request.url); console.log(request.httpVersion); } C:\Users\Geol\node\http>node server.js server.on('request', function(request, response){ for(var header in request.headers) { console.log(header+": "+request.headers[header]); } } server.on('request', function(request, response){ console.log(request.socket.localPort); console.log(request.socket.writable); console.log(request.socket.domain); console.log(request.socket.address); }); var body = '

hello HTTP

'; response.writeHead(200, { 'Content-Length': body.length, 'Content-Type': 'text/plain' 'My-Header': 'Kill Al Humans!' }); if(url.parse.host != myhost){ response.writeHead(400}); } response.removeHeader("Content-Encoding"); response.setHeader("Content-Type", "text/html"); console.log(response.getHeader('content-type')); response.end('...', "utf8"); response.write("alarm", "utf8"); response.statusCode = 400; var http = require('http'); var param = { hostname: 'ya.ru', port: 80, method: 'POST' }; var req = http.request(param, function(res) { console.log('STATUS: ' + res.statusCode); res.on('data', function (chunk) { console.log('BODY: ' + chunk); }); }); req.on('error', function(e) { console.log('problem with request: ' + e.message); }); req.end(); C:\Users\Geol\node\http>node client.js port: 80, method: 'GET' }; C:\Users\Geol\node\http>node client.js var http = require('http'); var param = { hostname: 'www.cbr.ru', path: '/scripts/XML_daily.asp?date_req:01.11.2013', port: 80, method: 'GET' }; var req = http.request(param, function(res) { console.log('STATUS: ' + res.statusCode); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('BODY: ' + chunk); }); }); req.on('error', function(e) { console.log('problem with request: ' + e.message); }); console.log(get_data); req.end(); C:\Users\Geol\node\http>node client.js var http = require('http'); var post_data = 'date_req=01.11.2013'; var param = { hostname: 'www.cbr.ru', path: '/scripts/XML_daily.asp', port: 80, method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': post_data.length } }; var req = http.request(param, function(res) { console.log('STATUS: ' + res.statusCode); console.log('HEADERS: ' + JSON.stringify(res.headers)); res.on('data', function (chunk) { res.setEncoding('utf8'); console.log('BODY: ' + chunk); }); }); req.on('error', function(e) { console.log('problem with request: ' + e.message); }); req.write(post_data); req.end(); var https = require('https'); var fs = require('fs'); var options = { key: fs.readFileSync('keys/server.key'), cert: fs.readFileSync('keys/server.crt') }; https.createServer(options, function (req, res) { res.writeHead(200); res.end("Hello SSL world\n"); }).listen(8000); var https = require('https'); var options = { hostname: 'localhost', port: 8000, path: '/', method: 'GET' }; var req = https.request(options, function(res) { console.log("statusCode: ", res.statusCode); console.log("headers: ", res.headers); res.on('data', function(data) { process.stdout.write(data); }); }); req.end(); req.on('error', function(e) { console.error(e); }); node client.js ----------------------------------------------------------------------------------------------------------------- Блоки и контекст в Ruby, или Что стоит за идентификатором в данном окружении Иван Шихалев class Alpha attr_accessor :alpha def beta self.alpha = 1 alpha = 2 end end (вызов метода) do |(аргументы)| (какие-то действия) end (вызов метода) { |(аргументы)| (какие-то действия) } [1, 2, 3].each do |item| puts item end def do_smth if block_given? yield self end end def do_smth_else &block @smth = block do_smth &block end a = 'INIT' def alpha a ||= :a p [:alpha, a] end define_singleton_method :beta do a ||= :b p [:beta, a] end a = 'TEST' alpha beta $ ruby demo02.rb $ ruby demo02.rb a = 'A' b = 'B' 2.times do |a| b = a p [a, b] end p [a, b] $ ruby demo03.rb class Alpha def alpha end end a = Alpha.new a.define_singleton_method :beta do end p a p [a.class, a.class.instance_methods(false)] p [a.singleton_class, a.singleton_class.instance_methods(false)] p a.class.ancestors p a.singleton_class.ancestors $ ruby demo04.rb class Alpha @@alpha = 'A' def Alpha.alpha @@alpha end def set_alpha x @@alpha = x end end a = Alpha.new a.set_alpha 'X' p Alpha.alpha class Beta < Alpha @@alpha = 'B' end p Alpha.alpha $ ruby demo06.rb class Alpha class Beta end end b = Alpha::Beta.new class Alpha ALPHA = 'A' end module Beta ALPHA = 'B' class Gamma < Alpha def Gamma.alpha ALPHA end end end p Beta::Gamma.alpha p Beta::Gamma::ALPHA $ ruby demo07.rb class Alpha attr_accessor :alpha end alpha = 'a' x = 'x' a = Alpha.new a.alpha = 'A' a.instance_eval do p [alpha, x, self] self.alpha = x end p [alpha, x, a] $ ruby demo08.rb class Alpha end Alpha.instance_eval do def alpha end end Alpha.module_eval do def beta end end p [Alpha.methods(false), Alpha.instance_methods(false)] $ ruby demo09.rb class Alpha def name_method name define_singleton_method name do "name: #{name}" end end end a = Alpha.new a.name_method :alpha a.name_method :beta p [a.alpha, a.beta] $ ruby demo10.rb def get_binding local = 100 return binding end b = get_binding b.eval 'p local' a = :start t = Thread.new do sleep 1 Thread.exclusive { p a } end a = :continue t.join $a = :start fork do sleep 1 p $a end $a = :continue Process.wait ----------------------------------------------------------------------------------------------------------------- PowerShell: работа с Active Directory Иван Коробко # Название создаваемой группы $GroupName="..." # Путь к контейнеру, в котором будет создана группа $objOU=[ADSI]"LDAP://OU=...,DC=test,DC=domain,DC=ru" $objGroup = $objOU.Create("group", "CN=" + $GroupName) $objGroup.Put("sAMAccountName", $GroupName) $objGroup.SetInfo() $objS=[ADSISearcher]'' $objS.Filter="(&(objectclass=group))" $objS.SearchRoot=[ADSI]'' $result=$objS.FindAll() $result |% { if (([ADSI]$_.path).isCriticalSystemObject -eq $TRUE) {} else { $tempObj=[ADSI]$_.path $tempObj.put("grouptype","-2147483640") $tempObj.setinfo() Write-Host $tempObj.name } } $nameGrp = "grp" $obj=[ADSISearcher]"" $obj.SearchRoot = [ADSI]"" $obj.Filter = "(&(objectclass=group)(name=$nameGrp))" $objFrom = $obj.FindOne().getdirectoryentry().path $obj = [ADSI]$objFrom $obj.member $group='...' $obj=[adsisearcher]"" $obj.SearchRoot=[ADSI]'' $obj.Filter=("(&(objectclass=group)(name={0}))" -f $group) $rez=$obj.FindOne() $el=[ADSI]$rez.path $tmp="" $el.member |% { $k=[ADSI]("LDAP://{0}" -f $_) $tmp+=$k.name+[char]13 } $tmp| Out-File -FilePath grp_users.txt -Encoding Unicode $obj=[ADSISearcher]"" $obj.SearchRoot=[ADSI]"" $obj.Filter="(&(objectclass=person)(mail=*@domain.ru)(userAccountControl=512))" #(userAccountControl=512) $obj.Sort.PropertyName="samaccountname" $results=$obj.FindAll() $results.count ForEach ($result in $results) { $username=([ADSI]$result.path).distinguishedName $objS = [ADSI]"LDAP://CN=test,DC=domain,DC=test,DC=ru" $objs.PutEx(3,"member",@($UserName)) $objs.setinfo() } $objFrom = [ADSI]"LDAP://CN=Grp1,DC=domain,DC=test,DC=ru" $objFrom.member $objTo = [ADSI]"LDAP://CN=Grp2,DC=domain,DC=test,DC=ru" $objFrom.member |% { $objTo.PutEx(3,"member",@([string]$_)) $objTo.setinfo() } $objFrom = [ADSI]"LDAP://CN=User1,DC=domain,DC=test,DC=ru" $objFrom.memberof $objTo = [ADSI]"LDAP://CN=User2,DC=domain,DC=test,DC=ru" $objFrom.memberof |% { $mObj = [ADSI]"LDAP://$_" $mObj [string]($objTo.path) $mObj.PutEx(3,"member",@([string]($objTo.path).replace("LDAP://",""))) $mobj.setinfo() } ----------------------------------------------------------------------------------------------------------------- Качество программного кода. Позаботьтесь о долгой жизни ваших программных продуктов! Денис Силаков int son = 0; int daughter = 1; int father = 2; -----------------------------------------------------------------------------------------------------------------