...

среда, 7 августа 2013 г.

[Из песочницы] Как я писал модуль обновления на C#

Я пишу программы на C# для фирмы, где их использует несколько сотен человек. Время от времени добавляются новые функции и встаёт проблема обновления версий.

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


image


Честно, мне самому не очень нравятся приложения, которые вечно скачивают обновления, но в моём случае проще автоматизировать этот процесс, чем писать должностные инструкции и заставлять коллег скачивать обновления вручную (а потом бегать по всем этажам и делать это самому).



Цели




Прежде чем начать работу над этим проектом, я сформулировал цели, которым должен удовлетворять будущий модуль авто-обновления.

  1. Обновление должно происходить автоматически при наличии новой версии.

  2. После обновления программа должна автоматически перезапуститься.

  3. После обновления имя программы должно сохраниться прежним.

  4. Модуль должен встраиваться в ехе-файл проекта.




И в чём, казалось бы, проблема? Проверил наличие новой версии. Скачал файл. Запустил. Всё!

Задача становится немного запутанной из-за того, что запущенный ехе-файл не может сам себя удалять или переименовывать, это должен делать другой процесс при закрытой программе.


А для выполнения всех необходимых действий в рамках одной программы:



  • скачать новую версию,

  • удалить старую программу,

  • переименовать скачанный файл


– необходимо несколько раз её перезапускать, чтобы последовательно выполнять перечисленные действия.

Блок-схема




Чтобы прояснить, на каком этапе что нужно делать, я составил блок-схему всего процесса.

По собственному опыту знаю, что на составление схемы требуется час, а экономится день.

image

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


Этапы




На блок-схеме выделены три этапа процесса обновления.

Этап А. Программа запущена в обычном режиме (без ключей).

get up_version

Считываем и проверяем номер версии на сервере.


my_version == up_version?

Если серверная версия совпадает с нашей – пропускаем модуль обновления.


download new.name.exe

Закачиваем новую программу в файл new.name.exe.


% % %% % %

Ожидаем окончание процесса загрузки.


start new.name.exe /u

После окончания загрузки запускаем скачанный файл.


Закрываем программу, чтобы потом её удалить.


Этап Б. Программа запущенна с ключом /u.

del name.exe

Удаляем программу name.exe.


copy new.name.exe name.exe

Копируем new.name.exe в name.exe.


start name.exe /d

Запускаем name.exe с ключом /d.


Закрываем программу, чтобы потом её удалить.


Этап Ц. Программа запущенна с ключом /d:

del new.name.exe

Удаляем временную копию программы new.name.exe


Запускаем основную программу.


Теперь переходим к практической части, как я это всё реализовал в классе на C#.


Основные поля данных




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

// Текущая версия проекта, доступная для всего проекта
public static string my_version = "1.23";

// Ссылки на txt-файл версии, на exe-файл программы и на сайт
private string url_version = "http://localhost/version.txt";
private string url_program = "http://localhost/program.exe";
private string url_foruser = "http://localhost/index.php";

private string my_filename; // Имя файла запущенной программы
private string up_filename; // Имя временного файла для загрузки обновления

private bool is_download; // Признак, что началось скачивание обновления
private bool is_skipped; // Признак, что обновление не требуется или закончено


Запуск!




Работа модуля начинается с его запуска. В каком месте программы это сделать лучше всего? Я перепробовал разные варианты, и самым удачным мне показался вариант его запуска из файла Program.cs

static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

// Инициализация и запуск модуля обновления
FormUpdate up = new FormUpdate();

if (up.download()) // Если началось скачивание
Application.Run(up); // … ожидаем его окончания

if (up.skipped()) // Обновление не требуется или закончено
Application.Run(new Form1()); // … запускаем основную программу
}


Вся логика модуля обновления выполняется в конструкторе, без визуального отображения. Форма отображается только в процессе скачивания файла.


Метод download() информирует о том, что на этапе «А» началось асинхронное скачивание новой версии программы, в связи с чем нужно отобразить визуальную форму, на которой размещён ProgressBar с текстовым полем, и ждать завершения процесса. Остальные этапы обновления выполняются «молча» и отображение формы пропускается.


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


Конструктор




Напишем конструктор класса, который по аргументам командной строки установит, на каком этапе обновления мы находимся, и вызовет соответствующие методы класса.

private FormUpdater()
{
// Получаем имя запущенной программы (без полного пути)
my_filename = get_exec_filename ();

// Формируем имя временного файла
up_filename = "new." + my_filename;

// Получаем аргументы командной строки
string [] keys = Environment.GetCommandLineArgs();

if (keys.Length < 3) // Этап А. Аргументов нет – проверим версию на сервере
do_check_update ();
else
{
if (keys[1] == "/u") // Этап Б. Запущена новая версия из временного файла
do_copy_downloaded_program (keys [2]);

if (keys[1] == "/d") // Этап Ц. Осталось удалить временный файл.
do_delete_old_program (keys [2]);
}
}


Несколько слов о вспомогательном методе get_exec_filename(). В C# можно получить имя запущенного файла только с полным путём. Для изъятия чистого имени файла я написал свой метод, который разбивает путь на части по символу «\» и возвращает последнюю его часть – искомое имя файла.



private string get_exec_filename()
{
string fullname = Application.ExecutablePath;
// Например: D:\Work\Projects\Name.exe
string[] split = { "\\" };
string[] parts = fullname.Split(split, StringSplitOptions.None);
// Получим массив из 4 элементов: D: , Work , Projects , Name.exe

if (parts.Length > 0)
return parts[parts.Length - 1]; // Последний элемент = искомое имя файла
return "";
}


Остальные методы, которые вызываются из конструктора, будут рассмотрены на соответствующих этапах.


Этап «А»




Метод do_check_update() проверяет наличие обновления на сервере и, в зависимости от результата, либо запускает процесс обновления, либо разрешает запуск основной программы.

private void do_check_update()
{
// получаем номер версии программы на сервере
string up_version = get_server_version();

if (my_version == up_version) // Если обновление не нужно
{
is_download = false; // Пропускаем скачивание
is_skipped = true; // Пропускаем модуль обновления
} else
do_download_update (); // Запускаем скачивание новой версии
}


Метод get_server_version() использует стандартный метод класса WebClient для считывания номера версии.

Если номер версии не считывается, логично предположить, что обновление тоже не удастся скачать, поэтому будем считать, что обновления нет.



private string get_server_version()
{
try {
WebClient webClient = new WebClient();
return webClient.DownloadString(url_version).Trim();
} catch { // Если номер версии не можем получить,
return my_version; // то программу даже и не будем пытаться.
}
}


Метод do_download_update() отображает экранную форму и запускает асинхронную загрузку обновлённого файла программы.



private void do_download_update ()
{
InitializeComponent(); // Инициализация формы
label_status.Text = "Скачивается файл: " + url_program;
download_file (); // Начинаем скачивание
is_download = true; // Будем ждать завершение процесса
is_skipped = false; // Основную программу не нужно запускать
}


Метод download_file() запускает асинхронное скачивание и подключает два события:

для отображения прогресса и для завершения этапа загрузки файла.



private void download_file ()
{
try
{
WebClient webClient = new WebClient();
// Создаём обработчики событий продвижения прогресса и его окончания
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);

// Начинаем скачивание
webClient.DownloadFileAsync(new Uri(url_program), up_filename);
}
catch (Exception ex)
{ // В случае ошибки выводим сообщение и предлагаем скачать вручную
error(ex.Message + " " + filename);
}
}


В случае ошибки вызывается метод error(), который отображает текст ошибки и предлагает скачать файл самостоятельно, в этом случае будет запущен браузер и открыта соответствующая страница. Текст этого метода, думаю, можно опустить.


Из этапа «А» осталось реализовать обработку двух событий:

изменение прогресса скачивания и обработку его окончания.


Метод изменения прогресса написан тривиально.



private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
progress_download.Value = e.ProgressPercentage;
}


По завершению скачивания необходимо перейти к этапу «Б» и завершить работу.



private void Completed(object sender, AsyncCompletedEventArgs e)
{
run_program(up_filename, "/u \"" + my_filename + "\"");
this.Close ();
}


Обратите внимание, что кроме ключа /u в программу передаётся исходное имя программы, чтобы вновь запущенная программа знала, как переименовывать файл, согласно 3-ей цели: после обновления имя программы должно сохраниться прежним.


Имя файла в параметре командной строки необходимо заключать в кавычки на случай наличия в нём пробелов.


Поля метода is_download, is_skipped в этом методе устанавливать не нужно, так как этап их проверки в файле Program.cs был пройден сразу после запуска скачивания.


Метод для запуска программы может выглядеть следующим образом.



private void run_program(string filename, string keys)
{
try
{ // Использование системных методов для запуска программы
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.WorkingDirectory = Application.StartupPath;
proc.StartInfo.FileName = filename;
proc.StartInfo.Arguments = keys; // Аргументы командной строки
proc.Start(); // Запускаем!
}
catch (Exception ex)
{
error(ex.Message + " " + filename);
}
}


Итак, с этапом «А» мы разобрались.


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


Этап «Б»




Переходим к этапу «Б», он будет значительно проще. Из конструктора вызывается метод do_copy_downloaded_program(string filename), который копирует загруженную версию программы на место старой.

void do_copy_downloaded_program(string filename)
{
try_to_delete_file(filename); // Удаляем файл со старой версией программы
try
{ // Копируем скачанный файл в оригинальное имя файла
File.Copy(my_filename, filename);

// Запускаем этап «Ц»
run_program(filename, "/d \"" + my_filename + "\"");
is_download = false; // Форма не отображается
is_skipped = false; // Обновление ещё не закончено
}
catch (Exception ex)
{
error(ex.Message + " " + filename);
}
}


Несколько слов о методе try_to_delete_file(string filename). Может оказаться так, что мы пытаемся удалить файл, который ещё заблокирован не до конца завершённым процессом предыдущей программы. Этот метод пытается удалять файл несколько раз подряд в течении нескольких секунд с небольшими задержками.



private void try_to_delete_file(string filename)
{
int loop = 10; // Количество попыток
while (--loop > 0 && File.Exists(filename))
try {
File.Delete(filename);
} catch {
Thread.Sleep(200); // Небольшая задержка
}
}


Этап «Ц»




Остался последний, самый короткий этап «Ц», который удаляет «мусор» и запускает основную программу. Для этой цели из конструктора вызывается метод do_delete_old_program(string filename).

void do_delete_old_program(string filename)
{
try_to_delete_file(filename);
is_download = false; // Форма не отображается
is_skipped = true; // Обновление отработало, запускайте!
}


Если версия программы на сервере не будет совпадать с записанной версией в текстовом файле, то при каждом запуске будет повторно загружаться «новая» версия. После этого программа всё-таки будет запущена невзирая на различие версий: по блок-схеме на этапе «Ц» версия программы уже не проверяется. Так и должно быть! Дополнительная проверка на этом этапе рискует зациклить процесс скачивания навечно…


Кстати, эту «фишку» можно использовать для запуска программы без проверки наличия обновлений, достаточно её запускать с ключом «/u».


Заключение




Построенный таким образом модуль обновления удовлетворяет всем целям, сформулированным в начале статьи:

  1. Обновление скачивается только при наличии новой версии.

  2. Обновлённая программа автоматически запускается после скачивания.

  3. Предусмотрен механизм сохранения исходного имени файла программы.

  4. Модуль сделан не отдельной программой, а встроен в файл проекта.


Работа модуля продемонстрирована на следующем рисунке.

image


Также могу продемонстрировать работу модуля на собственной программе изучения английских слов на слух. Скачать «старую» версию «Звуковых карточек» можно здесь: http://www.DoubleEnglish.ru/soft/old.ListenCards.exe


Исходный код модуля обновления в тестовом проекте можно скачать здесь:

http://www.fformula.net/docs/updater/updater.zip


Спасибо за внимание.

Волосатов Евгений.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Sylph: Глубокие Stub-ы для тестов от создателей PHPixie, или как конвертировать массив в класс


сегодня в 22:00


Юнит тестинг Sylph

Одной из самых нужных вещей при написании юнит тестов является создание mock-ов и stub-ов для объектов которые используются тестируемым классом. Здесь стоит упомянуть о важном отличии: если «mock» является исходным объектом в котором замены одна или несколько методов, то «stub» это некий фейк который полностью заменяет исходный объект. в зависимости от сценария иногда намного легче создать стаб чем сделать подходящий mock. В этой статья я покажу как эффективно и быстро создавать стабы используя небольшой класс Sylph от создателей фреймворка PHPixie.


Иногда случаются случаи когда тестируемый метод использует глубокие проперти объекта например:



class Fairy{

public $name;
protected $home_tree;

public function __construct($name, $home_tree){
$this->name = $name;
$this->home_tree = $home_tree;
}

// фея дружит со всеми зайками которые живут в ее лесе
// и белками в ее дереве
public function get_friends(){
$friends = $this->home_tree->num_squirrels;
$friends += $this->home_tree->forest->num_animals('bunny'));
return $friends;
}


При написании теста для такого класса пришлось бы мокать классы Tree и Forest, связывать их друг с другом и передавать в конструктор. И все ради вызова одной функции.


Sylph позволяет сделать это намного проще, используя простые ассоциированные массивы и анонимные функции. В нашем случае мы могли бы описать $home_tree как:



$sylph = new \PHPixie\Sylph();

$home_tree = $sylph->cast(array(
'num_squirrels' => 5,
'forest' => $sylph->cast(array(
'num_animals' => function($animal){
if($animal == 'bunny')
return 4;

throw new \Exception('Animal not found');
}
))
));


Такой подход имеет ряд преимуществ, в первую очередь намного лучшая читабельность и лаконичность.

Кстати использование анонимных функций позволяет делать довольно интересные операции, например менять параметры на лету:




$num_bunnies = 5;

$bunnies = $sylph->cast(array(
'add' => function($new) use($num_bunnies){
return $new + $num_bunnies;
}
));

$bunnies->add(1); // 6
$bunnies->add(2); // 7

$num_bunnies = 2;

$bunnies->add(1); // 3
$bunnies->add(2); // 4


Как всегда разработчики PHPixie стараются найти самое простое решение проблемы.





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


[Из песочницы] Взаимодействие php-soap на linux с авторизацией по сертификатам с использованием алгоритмов ГОСТ

С криптографией я сталкивался ранее, приходилось разворачивать удостоверяющий центр на КриптоПро в свое время, так что общие представления о том что такое закрытые и открытые ключи и сертификаты у меня имелось, но вот о том как все это работает в Linux представления особого не было.

Встала задача обеспечить взаимодействие со службами РосМинздрава, а именно — с федеральным регистром медработников по протоколу SOAP. Со стороны клиента система на CentOS и работающими службами на PHP, со стороны сервера — SOAP-сервис с авторизацией по сертификатам с использованием ГОСТ алгоритмов. В наличии была флешка с закрытым ключом, сформированным удостоверяющим центром РосМинздрава и сертификат этого ключа.

После анализа ситуации по использованию ГОСТ алгоритмов шифрования в мире Linux выяснено что за последние годы здесь есть хорошее движение вперед, но все таки не совсем все хорошо. Итак, для того чтобы заставить расширение php-soap прозрачно понимать алгоритмы ГОСТ, а также использовать сертификаты и ключи выданные РосМинздравом нужно сделать следующее:

1. Обновить в дистрибутиве библиотеку OpenSSL до версии не ниже 1.0.1с и настроить поддержку ГОСТ.

2. Преобразовать выданный ключ и сертификат в формат, понятный OpenSSL. Проверить работу OpenSSL.

3. Подправить расширение OpenSSL в PHP и перекомпилировать сам PHP. Протестировать работу SOAP на PHP.


Итак, приступим. Данные дистрибутива, установленного php и библиотеки openssl:



# lsb_release -a
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description: CentOS release 6.4 (Final)
Release: 6.4
Codename: Final

# yum list installed | grep php
php.x86_64 5.3.3-22.el6 @base
php-cli.x86_64 5.3.3-22.el6 @base
php-common.x86_64 5.3.3-22.el6 @base
php-dba.x86_64 5.3.3-22.el6 @base
php-devel.x86_64 5.3.3-22.el6 @base
php-imap.x86_64 5.3.3-22.el6 @base
php-ldap.x86_64 5.3.3-22.el6 @base
php-lessphp.noarch 0.3.9-1.el6 @epel
php-mbstring.x86_64 5.3.3-22.el6 @base
php-mcrypt.x86_64 5.3.3-1.el6 @epel
php-odbc.x86_64 5.3.3-22.el6 @base
php-pdo.x86_64 5.3.3-22.el6 @base
php-pear.noarch 1:1.9.4-4.el6 @base
php-pgsql.x86_64 5.3.3-22.el6 @base
php-process.x86_64 5.3.3-22.el6 @base
php-shout.x86_64 0.9.2-6.el6 @epel
php-soap.x86_64 5.3.3-22.el6 @base
php-xml.x86_64 5.3.3-22.el6 @base
php-xmlrpc.x86_64 5.3.3-22.el6 @base

# yum list installed | grep openssl
openssl.x86_64 1.0.0-27.el6_4.2 @updates
openssl-devel.x86_64 1.0.0-27.el6_4.2 @updates




Обновление библиотеки OpenSSL



Метод собирать «из исходников» и засорять систему — не наш метод. Поэтому лучший вариант — найти готовый пакет, и я его нашел в репозитории axivo:

# rpm -ivh --nosignature http://rpm.axivo.com/redhat/axivo-release-6-1.noarch.rpm
# yum --enablerepo=axivo update openssl




Проверяем установленную версию OpenSSL:

# openssl version
OpenSSL 1.0.1e 11 Feb 2013




Далее необходимо настроить библиотеку на использование алгоритмов ГОСТ, для этого редактируем файл настроек который лежит по адресу /etc/pki/tls/openssl.cnf, добавив в самое начало файла строку:

openssl_conf = openssl_def




и в самый конец файла:

[openssl_def]
engines=engine_section

[engine_section]
gost=gost_section

[gost_section]
engine_id=gost
default_algorithms=ALL
CRYPT_PARAMS=id-Gost28147-89-CryptoPro-A-ParamSet




После внесенных изменений проверяем, видит ли OpenSSL алгоритмы ГОСТ:

#openssl ciphers | tr ":" "\n" | grep GOST
GOST2001-GOST89-GOST89
GOST94-GOST89-GOST89




Преобразуем выданный ключ и сертификат в формат, понятный OpenSSL



Для этого нам понадобится Windows машина с установленным CryptoPRO CSP 3.6. Я его слил с сайта разработчика (там дается демонстрационный режим режим на 3 месяца).

Первое что делаем — экспортируем ключевой контейнер в реестр средствами КриптоПро. Для этого открываем КриптоПро из панели управления Windows. Вставляем наш ключевой носитель в компьютер. Для обычной флешки убеждаемся, что у нас среди считывателей на вкладке «Оборудование» есть «Все съемные диски» и «Реестр». Если у вас не обычная флешка а что-то типа РуТокен либо Etoken либо другой носитель — необходимо наличие его драйверов и библиотеки для использования в КриптоПро (Его должно быть видно в разделе «Настроить Считыватели» на той же вкладке).

Далее переходим на вкладку «Сервис» и нажимаем «Копировать», нажимаем «Обзор» и выбираем среди списка свой ключевой контейнер. Если его там вдруг не находим — то возвращаемся к предыдущему параграфу и все проверяем. Далее вводим осмысленное имя нового ключевого контейнера, нажимаем «Готово» и в качестве носителя в появившемся окне выбираем «Реестр». Новый пароль на контейнер не ставим.

Теперь нам нужно установить сертификат в новый контейнер. На вкладке «Сервис» в КриптоПро нажимаем кнопку «Установить личный Сертификат», указываем файл с нашим сертификатом, нажимаем «Далее», выбираем только что созданный нами контейнер и не забываем галочку «Установить сертификат в контейнер».

Для того чтобы экспортировать данный сертификат в формате PKSC#12 вместе с закрытым ключом — нам понадобится сторонняя утилита. Которую можно либо купить здесь либо найти на просторах интернета по имени p12fromgostcsp. Запускаем данную утилиту, выбираем наш сертификат, пароль оставляем пустым и сохраняем его в файл mycert.p12.

Копируем полученный сертификат на linux-машину. Проверяем, что в сертификате у нас есть оба ключа — закрытый и открытый:



# openssl pkcs12 -in mycert.p12 -nodes




На запрос пароля просто нажимаем Enter. И смотрим наличие строк BEGIN CERTIFICATE и BEGIN PRIVATE KEY. Если строки есть то все в порядке. Преобразуем полученный сертификат в формат PEM:

# openssl pkcs12 -in mycert.p12 -out mycert.pem -nodes -clcerts




Если вам нужна не только авторизация по клиентскому сертификату, но и также проверка валидности самого сервера — вам понадобится корневой сертификат удостоверяющего центра. Его можно просто через Windows открыть и сохранить в формате DER в кодировке X.509 (Со вкладки «Состав» при просмотре сертификата), так как закрытого ключа он не содержит. Затем преобразовать его в PEM формат через OpenSSL.

# openssl x509 -inform DER -in cacert.cer -outform PEM -out cacert.pem




Где cacert.cer — имя исходного файла с корневым сертификатом. Проверить коннект с сервером с использованием сертификатов можно через OpenSSL командой:

# openssl s_client -connect service.rosminzdrav.ru:443 -CAfile cacert.pem -cert mycert.pem




В итоге, если все сделано верно, у вас должен получится вот такой вывод в конце:

New, TLSv1/SSLv3, Cipher is GOST2001-GOST89-GOST89
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : GOST2001-GOST89-GOST89
Session-ID: ***
Session-ID-ctx:
Master-Key: ***
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1375875984
Timeout : 300 (sec)
Verify return code: 0 (ok)




Правка и перекомпиляция PHP



Основная проблема заключается в том, что для того чтобы OpenSSL использовала файл конфигурации по умолчанию (именно там у нас прописаны настройки для алгоритмов ГОСТ) перед ее использованием необходимо вызвать функцию OPENSSL_config(NULL). В расширении PHP OpenSSL этого не сделано, поэтому модуль PHP-SOAP при использовании SSL-соединения не видит алгоритмов ГОСТ. Кстати, тоже самое касается и других библиотек, например curl. Ее тоже нужно патчить если вы собираетесь с ней работать.

Итак приступим. Для того чтобы нам поправить OpenSSL необходимо перекомпилировать весь PHP, так как в CentOS расширение OpenSSL сделано не модулем.

Подготавливаем среду для сборки пакетов:

# yum install rpm-build redhat-rpm-config
# mkdir /root/rpmbuild
# cd /root/rpmbuild
# mkdir BUILD RPMS SOURCES SPECS SRPMS
# mkdir RPMS/{i386,i486,i586,i686,noarch,athlon}




Качаем исходники PHP и устанавливаем их:

# wget http://vault.centos.org/6.4/os/Source/SPackages/php-5.3.3-22.el6.src.rpm
# rpm -ivh php-5.3.3-22.el6.src.rpm




Переходим в папку SOURCES и извлекаем php, делаем копию папки с иходниками:

# cd SOURCES
# tar xvjf php-5.3.3.tar.bz2
# cp php-5.3.3 php-5.3.3p -R




Правим файл php-5.3.3p/ext/openssl/openssl.c:

Находим строку SSL_library_init(); (у меня это строка № 985) и прописываем перед ней

OPENSSL_config(NULL);.

Переходим в папку SOURCES и формируем патч:

# diff -uNr php-5.3.3/ php-5.3.3p/ > php-5.3.3-gostfix.patch




В результате получится файл со следующим содержимым:

diff -uNr php-5.3.3/ext/openssl/openssl.c php-5.3.3p/ext/openssl/openssl.c
--- php-5.3.3/ext/openssl/openssl.c 2010-06-26 20:03:39.000000000 +0400
+++ php-5.3.3p/ext/openssl/openssl.c 2013-08-07 11:32:41.944581280 +0400
@@ -981,7 +981,7 @@
le_key = zend_register_list_destructors_ex(php_pkey_free, NULL, "OpenSSL key", module_number);
le_x509 = zend_register_list_destructors_ex(php_x509_free, NULL, "OpenSSL X.509", module_number);
le_csr = zend_register_list_destructors_ex(php_csr_free, NULL, "OpenSSL X.509 CSR", module_number);
-
+ OPENSSL_config(NULL);
SSL_library_init();
OpenSSL_add_all_ciphers();
OpenSSL_add_all_digests();




Теперь нужно заставить сборщик использовать наш патч. Правила сборки описаны в файле SPEC/php.spec. Открываем его и после строки описания патчей (у меня это строка начинающаяся на Patch230) вставляем строку с описанием нового патча:

Patch231: php-5.3.3-gostfix.patch




Также прописываем вызов данного патча перед сборкой, для этого ищем строки начинающиеся на %patch и в конце них прописываем

%patch231 -p1




Сохраняем файл. Перед сборкой пакета ставим все зависимости для сборки:

# yum install bzip2-devel db4-devel gmp-devel httpd-devel pam-devel sqlite-devel pcre-devel libedit-devel libtool-ltdl-devel libc-client-devel cyrus-sasl-devel openldap-devel mysql-devel postgresql-devel libxml2-devel net-snmp-devel libxslt-devel libxml2-devel libXpm-devel libpng-devel freetype-devel libtidy-devel aspell-devel recode-devel libicu-devel enchant-devel net-snmp




Далее приступаем к сборке, из папки rpmbuld запускаем команду:

rpmbuild -ba SPECS/php.spec




Сборка занимает продолжительное время, и в случае если все прошло хорошо, в папке RPMS/{Ваша_архитектура} появятся готовые rpm_пакеты.

Для архитектуры x86_64:

# ls RPMS/x86_64/
php-5.3.3-22.el6.x86_64.rpm
php-devel-5.3.3-22.el6.x86_64.rpm
php-intl-5.3.3-22.el6.x86_64.rpm
php-pgsql-5.3.3-22.el6.x86_64.rpm
php-tidy-5.3.3-22.el6.x86_64.rpm
php-bcmath-5.3.3-22.el6.x86_64.rpm
php-embedded-5.3.3-22.el6.x86_64.rpm
php-ldap-5.3.3-22.el6.x86_64.rpm
php-process-5.3.3-22.el6.x86_64.rpm
php-xml-5.3.3-22.el6.x86_64.rpm
php-cli-5.3.3-22.el6.x86_64.rpm
php-enchant-5.3.3-22.el6.x86_64.rpm
php-mbstring-5.3.3-22.el6.x86_64.rpm
php-pspell-5.3.3-22.el6.x86_64.rpm p
hp-xmlrpc-5.3.3-22.el6.x86_64.rpm
php-common-5.3.3-22.el6.x86_64.rpm
php-fpm-5.3.3-22.el6.x86_64.rpm
php-mysql-5.3.3-22.el6.x86_64.rpm
php-recode-5.3.3-22.el6.x86_64.rpm
php-zts-5.3.3-22.el6.x86_64.rpm
php-dba-5.3.3-22.el6.x86_64.rpm
php-gd-5.3.3-22.el6.x86_64.rpm
php-odbc-5.3.3-22.el6.x86_64.rpm
php-snmp-5.3.3-22.el6.x86_64.rpm
php-debuginfo-5.3.3-22.el6.x86_64.rpm
php-imap-5.3.3-22.el6.x86_64.rpm
php-pdo-5.3.3-22.el6.x86_64.rpm
php-soap-5.3.3-22.el6.x86_64.rpm




Теперь можем установить все это «добро» поверх уже установленного php с заменой:

rpm -Uvh --replacepkgs --replacefiles RPMS/x86_64/*




Далее проверяем работу php-soap. Для примера можно использовать такой код (пример для сервиса «Федеральный регистр медработников»):

<?php
class GetEmployees
{
public $ogrn;
}
$cert="/mycert.pem";
//Сертификат
$wsdl="https://service.rosminzdrav.ru/MedStaffIntegration/MedStaff.svc?wsdl"; //Адрес wdsl сервиса
$loc = "https://service.rosminzdrav.ru/MedStaffIntegration/medstaff.svc/basic";
//Адрес точки доступа
$sp = new SoapClient($wsdl,array(
'local_cert' => $cert,
'trace' => 1,
'exceptions' => 1,
'soap_version' => SOAP_1_1,
'location' =>$loc,
));
$emp = new GetEmployees;
$emp->ogrn = '1022303554570';
try{
$data = $sp->GetEmployees($emp);
print_r($data);
} catch (SoapFault $e) {
echo "<h2>Exception Error!</h2>";
echo $sp->__getLastRequest();
echo get_class($e);
echo $e->getMessage();
}




Если все прошло успешно никаких ошибок не возникнет и PHP-SOAP без проблем заработает.

Далее если необходимо можно также подправить библиотеку curl, сделать проверку сертификата сервера и вообще все операции которые допустимы для SSL-соединений вплоть до поднятия своего веб сервера с авторизацией по сертификатам с алгоритмами ГОСТ.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


В Chrome можно узнать сохраненные пароли


сегодня в 20:43


Большинство браузеров спрашивают, хотите ли вы сохранить пароль, чтобы в следующий раз, когда вы будете серфить вэб, вам было проще авторизоваться на сайте. Конечно, хотелось бы, чтобы сохраненные пароли были бы запрятаны так, чтобы никто не смог до них добраться, однако же в Хроме, как оказалось, найти их очень просто.



Как показал разработчик Эллиотт Кембер (Elliott Kember), чтобы добраться до списка сохраненных паролей, нужно всего-навсего перейти по адресу «chrome://settings/passwords» (или просто найти страницу управления паролями в расширенных настроках) и кликнуть на любой из сохраненных паролей. Рядом со звездочками будет кнопка «Показать». Стоит ее нажать, как секретное слово будет раскрыто. Главный по безопасности в команде разработчиков Хрома Джастин Шу (Justin Shuh), отвечая на различные комментарии по этому поводу, заявил, что если кто-то смог войти в операционную систему под учетной записью пользователя, то он, теоретически, и так может добраться до ваших паролей и кучи иной ценной информации множеством других способов. Безусловно, теперь Гугл выпустит обновление, которое на самом деле будет скрывать пароли. А до тех пор держите свои ноутбуки подальше от друзей, которые при малейшей возможности загадят вам аккаунт на Фейсбуке.

Источник: www.engadget.com/2013/08/07/chrome-saved-passwords/





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


[recovery mode] Trace — трэкер для экстремалов

Что такое Trace?


Каждый день на Kickstarter появляются проекты, гаджеты, способные изменить мир. Некоторые из них с успехом преодолевают установленную планку, а некоторые так и не набирают заветных десятков тысяч долларов для запуска. Trace из тех, кто только набирает обороты, но уже ясно, что план они точно перевыполнят.


Наверно каждому из вас знакомо то чувство, когда приземляешь какой-нибудь крутой трюк или покоряешь высоченную волну на сёрфе, а «свидетелей» рядом нет. Рассказываешь об этом друзьям — вроде бы и поверили, но все равно найдется такой, который считает свой трюк круче, а волну выше. Так вот, Trace — это девайс, который крепится к вашему инвентарю и начинает считать абсолютно все данные по заезду: высота прыжка, амплитуда, количество оборотов и много другое, и позволяет моментально отправить друзьям всю информацию из вашего облака, чтобы похвастаться. Вы даже можете устроить соревнования в режиме реального времени.



image


Этот маленький трэкер использует инерциальные сенсоры и GPS технологию, и способен распознать абсолютно любой трюк, будь то прыжок с 6-метровой скалы с переворотом или тройной kickflip на скейте через лестницу в 10 ступенек.

Немного технических характеристик:



  • Bluetooth 4.0

  • 9-осевые сенсоры

  • собственный процессор

  • диаметр — 5см, высота — 2.2см

  • аккумулятор на 7 часов

  • Водонепроницаемый, удароустойчивый

  • клеится к любой твердой поверхности

  • передает GPX Data




Создатели постарались не обидеть ни один из экстремальных видов спорта, поэтому устройство работает на скейтбордах, сноубордах, лыжах, сёрфе. В общем, к чему прикрепите, то и будет считать. После заезда устройство формирует “#SESSIONSHEET” — детальный отчет о поездке. Его можно отправить друзьям, но только тем, у кого уже есть аналогичное приложение. В будущем сделают и интеграцию с соц.сетями.

image


Вот только приложений для трэкинга пока всего три — “replay Surf”, “Replay Snow”, “Replay Skate”, но их количество обещают увеличить. Все приложения есть на iOS и Android. Так, например, выглядит приложение для сёрферов:


image


Надо заметить, что в копилке успешных проектов фаундеров «Trace» числится AlpineReplay — крупнейшая соревновательная платформа для лыжников и сноубордистов, насчитывающая 2.5млн прыжков в 43 странах мира. Проект Trace стартовал всего неделю назад, но они уже успели собрать более $56.000 из необходимых $150.000. Не факт, что дотянут до $1млн, но до 500.000 баксов должны. Впереди еще целых 37 дней. Напоследок посмотрите видео как это все работает (без перевода):



This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Особенности игрового рынка в Китае — часть 3

В конце июня мне случилось сопровождать вице-президента Азии в Unity Technologies Джона Гудейла в его поездке в Петербург. Я знал о нашем подразделении Unity Games China и о свежеанонсированной поддержке Tizen, поэтому сделал все чтобы впечатлить Джона проектами русских разработчиков и вообще атмосферой российского игропрома, надеялся настроить плодотворное общение с нашими Азиатскими офисами.

Я тогда сильно удивился — буквально у всех вокруг, больших и маленьких, уже был опыт работы с Китаем, но не было хоть сколько-нибудь положительных результатов.


«Удается договориться максимум на 5% от доходов, но в итоге непонятно, как забрать даже тот обещанный мизер, не выходит получить аналитику, данные о пользователях, по сути, любую информацию о своем же приложении», — примерная мысль наших собеседников. В худшем случае в одном из сотен магазинов приложений появлялось приложение-клон, а на том конце переставали отвечать на звонки и письма.


«Китай — это как Евросоюз, но в Азии: 23 провинции, 4 муниципалитета, 5 автономных регионов, 2 региона особого порядка администрирования. Люди разной культуры, с разными языками, регионы очень разного уровня развития, — объясняет руководитель Unity Games China Аллен Фу, — порядка половины населения в 1.3 миллиарда живут в городах, а более 40 крупнейших городов находятся в развивающихся регионах».


Рынок мобильного контента переполнен компаниями-посредниками, готовыми помочь вывести ваше приложение на рынок. «В Китае более 400 магазинов приложений для Android, мы хотим охватить только лучшие — топ-20, — рассказывает Эндрю Тан, руководитель Unity Games China, — но обычно разработчику предлагают 3-5% от доходов, может быть 7%, если повезет. Но мы смогли добиться более благоприятных условий — 20%, иногда больше, потому что мы смогли договориться с топовыми провайдерами, мы разговариваем на уровне высшего менеджмента. Теперь мы можем предложить хорошие условия создателям игр. Западному человеку сложно понять, что посредники забирают не 20-30%, а 80-90%, но это особенности Китайского рынка. Огромный рынок позволяет извлечь существенную выгоду и с 10% от дохода,»


Если посчитать учетные записи мобильных операторов, получится впечатляющая цифра в 1.1 млрд. Порядка половины абонентов выходят с телефона в интернет, у 20% есть доступ к 3G-сетям.





Продажи смартфонов в Китае. Источник: Enfodesk Research





Активными геймерами Китайский информационный центр сети интернет считает 286 миллионов мобильных пользователей. Калькулятор и здравый смысл приходят к выводу: у 2/3 потенциальной геймерской аудитории быстрого мобильного интернета нет.

«Чаще всего у людей только 2G, — подтверждает Бобо Бо, коммьюнити менеджер Unity Technologies China, — поэтому очень важно, чтобы игра была маленькая, чем меньше тем лучше, иначе люди не могут ее скачать. У большинства строгие лимиты на мобильный траффик, а Wi-Fi-сетей не так много вокруг».


Эту картину органично дополняет следующая цифра от уже знакомого нам источника: 72.4% игроков никогда не платили за игры или контент в играх.


И тем не менее, рынок мобильных игр в Китае в 2012 году по разным оценкам составляет от 521 млн. до 960 млн. долларов США. Согласитесь, даже небольшая часть этого пирога стоит усилий.



«Очень важно сделать процесс оплаты максимально быстрым, без заполнения форм и ввода номеров, лучше всего работает оплата через SMS-сервисы, пусть и приходится платить дань оператору, — делится опытом Аллен Фу, — но часто выбор системы оплаты диктуется магазином приложений. Мы собрали специальный SDK, поддерживающий топовые системы биллинга, в большинстве случаев мы можем обеспечить оплату одной кнопкой — это очень важно в Китае».


Платные приложения, даже если они стоят $0.99, в Китае «не работают», отчасти из-за развитого пиратства, отчасти из-за отсутствия удобной и безопасной системы оплаты банковскими картами. Более того, 59.6% геймеров заявляют, что не видят смысл платить за игры, когда вокруг так много бесплатных игр, зато охотно платят за внутриигровой контент — таковой собирает 90.6% всех платежей.



Резюмируем все три части моего повествования цифрами от Пекинской студии Linekong. 34% доходов от Unity-игры Легенда о Короле (王者之剑) приносят пользователи iOS, и 66% приходит от Android: 26% через Qihoo 360, 18% через 91 Mobile, 11% через собственные каналы компании и оставшиеся 11% составляют платежи из других каналов.


«В Китае самое главное скорость работы, если вы не выпустите ваше приложение на рынок Китая первыми, оно будет скопировано и тогда вы вообще ничего не получите» — улыбается Аллен Фу на прощание.


Особенности игрового рынка в Китае — часть 1

Особенности игрового рынка в Китае — часть 2

Мой блог на инглише (в том числе про Китай и ChinaJoy)


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


[Из песочницы] Планшетный компьютер и тахеометрия

О тахеометрической съемке и её оптимизации




Обзорные сведения



Тахеометрическая съемка является самым распространенным видом наземных топографических съемок, применяемых при инженерных изысканиях объектов строительства. Высокая производительность тахеометрических съемок обеспечивается тем, что все измерения, необходимые для определения пространственных координат характерных точек местности, выполняют комплексно с использованием одного геодезического прибора – теодолита-тахеометра. При этом положение снимаемой точки местности в плане определяют измерением полярных координат: измеряется горизонтальный угол между направлениями на одну из соседних точек съемочного обоснования и снимаемую точку и измеряют расстояние от точки нитяным дальномером или лазерным дальномером электронного тахеометра. Высотное положение точек определяют методом тригонометрического нивелирования. Важным достоинством тахеометрической съемки является то, что при высокой производительности полевых работ, существенную долю объема работ по подготовке топографических планов местности и цифровых моделей местности удается перенести в камеральные условия.

Мне в голову пришла идея модернизировать подход к классической съемке, тем самым сделать её более наглядной и рациональной.
О съемке на примере



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

Ускорить процесс топографической съемки и повысить степень точности возможно путем частичного проведения камеральных работ непосредственно на объекте съемки при использовании сразу нескольких приборов: можно наглядно рассматривать результат работы, уточнять расположение объектов на плане, сравнивать уже ранее проведенные результаты съемки с составляемым планом, безошибочно выполнять цели работы с уточнением деталей и исправлением недочетов на месте.

Производить контроль и расчеты ведомостей можно с помощью систем автоматического проектирования (САПР), установленных на планшетный персональный компьютер (ППК). Использовать планшетный персональный компьютер актуально по причине его компактности и малого расхода заряда батареи, что обеспечивает продолжительное время автономной работы в полевых условиях. Так же ускорить процесс съемки позволяет использование одновременно нескольких приборов: двух и более тахеометров, тахеометра и нивелира в комбинации с RTK приемниками. Такой подход к топографической съемке удобен при съемках сложной пересеченной местности, когда целесообразно проводить одновременно съемку нескольких его частей. К таким объектам можно отнести линейные объекты различной конфигурации и величины.


В качестве примера можно рассмотреть проект магистрального газопровода. Для составления рабочих чертежей производят полевое трассирование трубопровода с измерением и закреплением углов поворота, разбивкой и нивелированием пикетажа, съемкой пересечений и переходов. Реперы размещают по трассе через 2-3 км вблизи больших углов поворота. Целесообразнее их устанавливать на продолжении стороны трассы на расстоянии 10-15 км от вершины угла. Все реперы в плановом положении привязывают к трассе. Саму трассу привязывают к геодезическим пунктам не реже, чем через 50 км. Для проектирования мест пересечения трубопроводом рек, оврагов, каналов, дорог дополнительно проводят подробную съемку этих мест в масштабе 1:500 или 1:1000. Одновременно с трассированием трубопровода производят изыскания и съемку площадок головных сооружений и промежуточных станций в масштабе 1:500. На основаниях полевого трассирования составляют план трассы трубопровода в масштабах 1:5000 и 1:10000, а так же продольный профиль трассы. Точная и детальная съемка, разбивка траншеи необходима для производства земляных работ, технология которых зависит от того, каким оборудованием будут выполняться эти работы, и целесообразна во избежание лишних экономических затрат при проведении земляных работ. [2, с.450-452]


К вопросу об оптимизации



На данном примере ясно видно, какое расстояние необходимо преодолевать съемочной бригаде в ходе съемки. А если овраг? А если тайга? А если овраг в тайге?

Такого рода изменения в способе съемки значительно упрощают работу, а именно есть возможность:


  • уменьшить объемы работы по устранению ошибок и недочетов можно сразу на месте, наглядно рассмотрев ход работы на планшетном компьютере

  • при необходимости сравнить результат с проведенной ранее съемкой.

  • разделить территорию на части и работать одновременно с несколькими из них: с двух концов газопровода или с двух сторон оврага, реки, холма.




Схематично методику проведения работы можно изобразить следующим образом (рис.1):

image

Рис.1. Схематичное изображение методики проведения съемки

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

Загружаемые данные отображаются в виде:


  • таблицы, которая включает подробную информацию по точкам, измерениям и результатам их обработки, уравнивания, а так же другую информацию;

  • карты-плана, которая включает графическое отображение выполненных измерений;

  • сеансов глобальной навигационной спутниковой системы (ГНСС) наблюдений на точках, которые включают графическое отображение сеансов наблюдений с указанием информации по каждому наблюдаемому спутнику;

  • САПР, которая включает отображение координатной сетки, настройки картографической подложки и выбора подписей для точек;




Для работы на ППК не выгодно использовать энергозатратные модули преобразования и обработки данных. Ломаные линии, образованные соединением снятых точек, преобразуются в ряд Фурье с помощью sFFT (Sparse Fast Fourier Transform), который при выполнении некоторых задач может быть в десятки или сотни раз быстрее классического быстрого преобразования Фурье (БПФ). Такой подход позволяет качественно и экономно использовать ресурсы ППК, соблюдая точность при построении цифровой модели местности. [3]

В качестве программного обеспечения можно использовать свободную кроссплатформенную геоинформационную систему Quantum GIS. Использование именно этой платформы обусловлено её доступностью, большим количеством функций, инструментами GPS для импорта и экспорта данных в формате GPX и тем, что QGIS может быть адаптирован к особым потребностям с помощью расширяемой архитектуры модулей: QGIS предоставляет библиотеки, которые могут использоваться для создания модулей, в том числе, модуля непрерывной передачи данных с геодезического прибора на ППК. Создание отдельных приложений осуществляется на языках программирования C++ или Python. На данный момент существует версия QGIS 1.7.4, доступная на операционных системах Windows SE, Linux и UNIX. [4]


Важным вопросом является метод взаимодействия и способ обеспечения совместной работы ППК и нескольких геодезических приборов, обеспечение их взаимодействия. Для трансляции данных с геодезического прибора на ППК можно использовать Python-микроконтроллер pyMCU v1.0. Использование микроконтроллера, использующего язык программирования Python, упрощает задачу синхронизирования выбранного программного обеспечения и геодезического прибора. Микроконтроллер pyMCU содержит микрочип PIC 16F1939, имеющий 13 цифровых пинов ввода-вывода, 6 аналоговых, 5 10-битных ШИМ пинов, и 16-контактный LCD интерфейс. Интерфейс USB использует стандартный USB FTDI на чипе UART FT232R. Драйверы и модуль Python доступны для Windows, OSX и Linux. [5]


Результат съемки фиксируется и корректируется в журнале (таблице) на ППК с расчетом поправок, оператор своевременно вносит коррективы в работу съемочной бригады и оформляет работу в соответствии с необходимыми требованиями. По окончании работы составляется отчет, готовый план (карта), записанный в определенном формате, в электронном виде передается заказчику и направляется в фонд. Данная методика ускоряет процесс топографической съемки, снижает стоимость прибора, позволяет одновременно использовать сразу несколько приборов в процессе съемки местности, безошибочно выполнять большой объем работы в сравнительно короткие сроки, позволяет одновременно выполнять несколько задач (нивелирование и съемка местности), повышает мобильность съемочной бригады и качество съемки, предоставляет возможность удобного ведения учета земель и обновления информации об угодьях и земельных участках.


Заключение



В данной статье я в общих чертах постарался описать новый подход к проведению съемки местности. Разумеется, что каждая глава требует детального разбора, поэтому не буду останавливаться на достигнутом, будет продолжение.

Библиографический список:



  1. Инженерная геодезия: Учебник/ Г.А. Федотов. – 4-е изд., стер., — М.: Высш. шк., 2007. – 463 с.: ил.

  2. Инженерная геодезия: учебник для студ. высш. учеб. заведений/ [Е.Б. Клюшин, М.И. Киселев, Д.Ш. Михелев, В.Д. Фельдман]; под ред. Д.Ш.

  3. [Электронный ресурс]: Sparse Fast Fourier Transform. – Режим доступа: www.fftw.org/

  4. [Электронный ресурс]: Quantum GIS. – Режим доступа: gis-lab.info/docs/qgis/user_guide/qgis-1.7.0_user_guide_ru.pdf

  5. [Электронный ресурс]: pyMCU. – Режим доступа: www.pymcu.com/overview.html


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


ASP.NET 2.0 Login control + MySQL, VS2008, авторизация пользователей на сайте

Штатные средства ASP.NET позволяют упростить процесс разграничения прав доступа пользователей к тем или иным страницам сайта. Речь о использовании Login control совместно с MySQL базой данных для авторизации пользователей на ASP.NET сайте. После успешной авторизации будет производиться перенаправление на разные страницы, соответствующие заданным ролям некоторых директорий проекта.



Штатные контролы вкладки Login панели инструментов позволяют реализовать всё, что связано с авторизацией пользователей. Данные о пользователях хранятся в базе данных, в частности в MySQL. Причём нужные таблицы базы данных будут созданы автоматически. Контролы самостоятельно взаимодействуют с базой данных, т.е. в частных случаях не придётся писать дополнительный код.


Элементы управления входом ASP.NET работают используя обычный текст через HTTP. Для обеспечения безопасности можно использовать HTTPS с шифрованием протокола SSL.


Описание задачи можно пропустить, тут оно для красного словца.

Текущая задача заключается в разграничении прав доступа для четырёх категорий пользователей. 0* 1* 2* 3*. 0* я категория наивысшая, позволяет создавать любые подчинённые категории. Такая же схема предусмотрена и для остальных категорий. Для каждой категории предусмотрен свой набор страниц. Добавить пользователя может только уже существующий пользователь, обладающий соответствующими правами. Т.е. самостоятельной регистрации пользователей не будет. Страница с высшим приоритетом будет включать все подчинённые, иметь возможность просмотреть, изменить все настройки подчинённых страниц.

Пользователи категории 3* будут иметь возможность только просматривать данные, с минимальным набором функционала. Пользователи категории 2* будут иметь все возможности 3*й категории + специализированные настройки, содержать дерево/список пользователей 3*й категории, возможность создавать, удалять пользователей 3*й категории. Пользователи 2*й и 0*й категории также будут включать все подчинённые категории и иметь возможность менять любые настройки подчинённых пользователей.


Всё это пока фантазии. В статье будет рассмотрена реализация авторизации для четырёх папок, каждая из которых будет содержать свою .aspx страницу.


Полагаем, что проект web приложения или web сайта уже создан. VS2008 framework 3.5. Создана страница Login.aspx и на неё помещён контрол login.


Visual Studio 2012 поддерживается версиями MySQL Connector/Net 6.6 и выше

Visual Studio 2010 поддерживается версиями MySQL Connector/Net 6.3.2 и выше, приложения использующие ранние версии Connector могут использоваться с Visual Studio 2010 через .NET 2.x framework.

Visual Studio 2008 поддерживается только MySQL Connector/Net 6.4.


С официального сайта MySQL качаем библиотеки Connector/Net 6.4.6 для .NET & MONO mysql-connector-net-6.4.6-noinstall.zip и для windows mysql-connector-net-6.4.6.msi.


Устанавливаем mysql-connector-net-6.4.6.msi, это в том числе настроит конфигурацию файлов:



C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config




Это важный момент, т.к. по началу, по рекомендации с некоторой статьи, начал редактировать machine.config v2 вручную, не устанавливая .msi. Иконки MySQL Website Configuration Tool пока не будет, появиться при последующих настройках.

Если для VS2008 установить не ту версию mysql-connector, то можно наблюдать следующую ошибку, при запуске ASP.NET Configuration -> Security/Безопасность -> Пошаговый мастер настройки безопасности



Произошла ошибка. Вернитесь на предыдущую страницу и повторите попытку.

Следующее сообщение может помочь при диагностике проблемы: Невозможно загрузить файл или сборку "MySql.Web, Version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" или один из зависимых от них компонентов. Не удается найти указанный файл. в System.RuntimeTypeHandle._GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName) в System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) в System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) в System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) в System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) в System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, XmlNode node, Boolean checkAptcaBit, Boolean ignoreCase)




Копируем следующиве .dll из v2(mysql-connector-net-6.4.6-noinstall.zip) директории архива в bin директорию проекта web приложения:

V2\mysql.data.dll

V2\mysql.web.dll

Добавляем references на MySql.Data и MySql.Web.


В web.config добавляем:



<!--
<connectionStrings/>
-->
<connectionStrings>
<remove name="LocalMySqlServer"/>
<add name="LocalMySqlServer" connectionString="Server=sta.tic.ip4.adr; Database=MySQLBaseName; uid=user; pwd=password;" providerName="MySql.Data.MySqlClient"/>
</connectionStrings>




Проект разрабатываем под виндой, работать он будет под FreeBSD+apache2+mono. Чтобы всё было “по настоящему”, на реальном FreeBSD сервере с внешним статическим IP создаём MySql55 базу данных и пользователя с паролем. Соответственно настройка файервола и проброс портов при необходимости. Таблицы будут созданы позже и автоматически. Конечно, MySQL базу данных открываем для всего интернета только на время и для отладки.

Создаём базу данных и пользователя:

# mysql -u root -p
Enter password:
mysql> create database MySQLBaseName;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE USER 'user'@'sta.tic.ip4.adr' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON MySQLBaseName.* TO 'user'@'sta.tic.ip4.adr' IDENTIFIED BY 'password' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit




Проверяем возможность подключения с VS2008 Vista к удалённой MySql базе данных:

На страницу Login добавляем Label ErrorL, в которую будем выводить какие-либо отладочные сообщения текущей страницы. Если возникают какие либо проблемы с подключением к базе данных, то процедура попытки подключения займёт секунд 10 и потом вывод ошибки.


Теперь в Login.aspx.cs в Page_Load добавляем:



using MySql.Data;
using MySql.Data.MySqlClient;

protected void Page_Load(object sender, EventArgs e)
{
//Проверяем соединение с удалённой MySql
string CommandText = "";
string Connect = "Database=MySQLBaseName;Data Source=sta.tic.ip4.adr;User Id=user;Password=password";
MySqlConnection myConnection = new MySqlConnection(Connect);
MySqlCommand myCommand = new MySqlCommand(CommandText, myConnection);
try
{
myConnection.Open();
string dd = myConnection.Database;
string dd1 = myConnection.DataSource;
string dd2 = myConnection.ServerVersion;
ConnectionState cs = myConnection.State;

myConnection.Close();
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 0: ErrorL.Text = "Error 0. Cannot connect to server"; break;
case 1045: ErrorL.Text = "Error 1045. Invalid username/password, please try again"; break;
case 1042: ErrorL.Text = "Error 1042. Unable to connect to any of the specified MySQL hosts"; break;
}
}
}




В строку Connect подставляем свои значения.

Запускаем на пошаговый прогон с меткой в Page_Load, и в случае успешного подключения myConnection.Open(); выполниться сразу, и в нижеследующих переменных будут соответствующие значения. Считаем, что база данных и доступ к ней настроен.


В свойствах контрола Login прописываем параметр:

MembershipProvider = MySQLMembershipProvider


Чтобы появилась иконка MySQL Website Configuration Tool нужно настроить Data Connections в Server Explorer. Server Explorer -> Data Connections -> Add Connection… ->



Server name в текущем случае это статический IPv4 адрес удалённого сервера с MySQL.

Теперь, рядом с иконкой зелёного круга с молотком, должна появиться иконка MySQL Website Configuration Tool круг неоднородного светло синего цвета, с белым крестом из изображений ключа и наверно отвёртки, как на изображении ниже.


Через MySQL Website Configuration Tool можно задать/поменять много нужных параметров. По контексту можно разобраться, для чего нужны те или иные настройки.


Через Web Administration Tools настраиваем первых пользователей и распределяем роли и права доступа. Здесь же происходит автоматическая настройка нужных таблиц MySql базы данных. Далее, при штатном функционировании сайта, в реализуемой задаче, пользователей будут добавлять другие пользователи.


Создаём 4ре директории в каталоге проекта:

…/dir/a0

…/dir/a1

…/dir/a2

…/dir/a3

Доступ к страницам ASP.NET ограничивается путем помещения их в защищенную папку.


На вкладке ASP.NET Configuration -> поставщик, должно быть так:



На вкладке безопасность, используя мастер настройки безопасности, сопоставляем папку и ранее созданную роль. Для удобства, имя папки = имя роли. Затем сопоставляем созданных пользователей ранее созданным ролям. Т.е. нужно назначить папке роль и включить в роль нужных, ранее созданных пользователей.


Посмотрим на таблицы базы данных на сервере:

# mysql -u root -p

Enter password:

mysql> use MySQLBaseName;

mysql> SHOW TABLES;

+--------------------------+

| Tables_in_MySQLBaseName |

+--------------------------+

| my_aspnet_applications |

| my_aspnet_membership |

| my_aspnet_profiles |

| my_aspnet_roles |

| my_aspnet_schemaversion |

| my_aspnet_sessioncleanup |

| my_aspnet_sessions |

| my_aspnet_users |

| my_aspnet_usersinroles |

+--------------------------+

9 rows in set (0.00 sec)

mysql> quit


Т.е. на удалённом сервере таблицы для ранее созданной базы данных автоматически созданы.

То же самое можно посмотреть в Server Explorer -> Data Connection.


Т.к. нужно, чтобы для каждой роли вход происходил на свою страницу a0.aspx, a1.aspx, a2.aspx, a3.aspx. То задаём Event контролу Login, после успешного входа, переход на соответствующую страницу:



protected void Login1_LoggedIn(object sender, EventArgs e)
{
if (Roles.IsUserInRole(Login1.UserName, "a0")) { Response.Redirect("~/dir/a0/a0.aspx"); return; }
if (Roles.IsUserInRole(Login1.UserName, "a1")) { Response.Redirect("~/dir/a1/a1.aspx"); return; }
if (Roles.IsUserInRole(Login1.UserName, "a2")) { Response.Redirect("~/dir/a2/a2.aspx"); return; }
if (Roles.IsUserInRole(Login1.UserName, "a3")) { Response.Redirect("~/dir/a3/a3.aspx"); return; }
}




Запускаем проект, вводим имя пароль и наблюдаем переход на соответствующую страницу.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


TechTalks by Dev-Pro.net


сегодня в 18:21


imageЧто такое Tech Talk?

TechTalk — это возможность с пользой провести время после работы, получить новую информацию, послушать доклады на актуальные технические темы, встретить единомышленников и познакомиться с новыми людьми. TechTalk — это небольшой технический семинар, на который можно прийти в качестве слушателя или выступить самому. TechTalk — это дружеская атмосфера, приятная обстановка и хорошее настроение.


Организатором TechTalk выступает компания Dev-Pro.net


Мы организовали уже 3 мероприятия:



  • TechTalk #1 — .Net — 18 апреля, 2013

  • TechTalk #2 — Java — 16 мая, 2013

  • TechTalk #3 — PHP — 11 июля, 2013




Предстоящее событие будет посвященно Python — 15 августа, 2013 в «Харьков Палас»

Web-site: techtalk.dev-pro.net/

e-mail: techtalk@dev-pro.net


Связаться с нами:

Галина Шакирова — HR Director

+38 (063) 711-1508

Елизавета Горейко — Event Manager

+38 (093) 299-1617


Вход на TechTalk свободный, регистрация обязательно, так как это позволяет нам лучше подготовиться к встрече.

Всегда рады видеть вас, ваших друзей и коллег на TechTalk.





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Квест, как дипломный проект

Думаю, большинству программистов хотелось написать свою игрушку. Кому-то хотелось реализовать свой RPG мир, кто-то грезил своей стрелялкой, а вот я всегда хотел сделать свой квест.

Примерно год назад с предложением поучаствовать в дипломном проекте ко мне обратилась подруга, непосредственно приблизившаяся к защите. У меня давно зрела идея реализовать собственный квест, но все как-то не доходили руки, да и знакомые художники, готовые помочь в реализации этой идеи отсутствовали. Но именно в этот момент, я понял, что пора вытащить соображения и опыт в этом направлении и заняться написанием своей игры более серьезно. Собственно, в качестве дипломного проекта и было предложено реализовать свою игру.


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


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





Выбор жанра




В жанр квестов я влюбился c моей первой игры — Broken Sword 2. Колоритные персонажи, продуманный, захватывающий сюжет, оригинальный юмор — этим мне запомнились игры этого жанра в их золотую пору. Естественно, как и у любого программиста у меня давно зрело желание написать свою игру, но постоянно что-то мешало: отсутствие сюжета, художника или желания. В момент, когда ко мне обратилась подруга, я решил, что откладывать больше нельзя и пора браться за дело!

В первую очередь были изучены материалы по квесто-производству, доступные в интернете. Часть статей я уже публиковал: Как написать Адвенчуру? и Механика головоломок в адвенчурах. Могу добавить пару отличных работ по гейм дизайну: Fundamentals of Game Design, Advanced game design, The Art of Game Design. Конечно, было море пересмотренных ресурсов и материалов, но эти оказали и пара других (перевод которых, надеюсь, я представлю в ближайшем времени) наибольшее влияния.


За образцы, конечно, были взята классика жанра: Broken Sword, Diskworld, Botanicula, Machinarium, etc. Изначально, игра планировалась куда более взрослой, но, в итоге, все пришло к детской, мультяшной графике. Такой выбор, конечно, обусловлен персональными предпочтениями художника, а также тем фактом, что подходящее детское произведение, на которое можно было бы опереться значительно проще найти.


Работа над игрой




Выбор движка



В первую очередь встала задача выбора игрового движка, соответствующего ряду критериев:


  • Открытый для модификаций

  • Простая и понятная реализация

  • Ориентированность на жанр




В качестве кандидатов попали следующие проекты:

В итоге, после анализа существующих решений выбор пал на Alpaca Engine. Несмотря на то, что проект достаточно давно не обновлялся, движок (хотя, это не движок в классическом понимании этого термина, а скорее просто шаблон, по которому пишется игра) оказался вполне удобоваримым для целей написания квеста. Конечно, не хватало многих интересных фич (Parallax Layering, сплошной, смещаемый уровень), но их было решено реализовать самостоятельно, в случае если останется время. Но, конечно, при написании диплома времени всегда не хватает…


Сюжет



Изначально мне хотелось сделать жесткую игру с уникальным сюжетом в стиле хорора (Sublustrum, The Black Mirror, Still life, etc), но быстро стало ясно, что сценаристы не зря едят свой хлеб и было решено последовать совету Пабло Пикассо. По сути, в сюжете для квеста должны присутствовать следующие критерии: поле для загадок, интересная и захватывающая история. В итоге, за основу было выбрано произведение Филипа Пулмана «Золотой компас» из трилогии темные начала.
Разработка персонажа



С разработкой персонажа не возникло серьезных проблем. Несколько пробных вариантов:



И Лира со статичным деймоном готова:


Окружение



Изначально планировалось ограничится одной комнатой и не расползаться мыслью по древу:



Но уже после первых этапов работы стало ясно, что количество предметов на одну сцену крайне выросло и без разделения не обойтись. В первую очередь провели декомпозицию по существующим головоломкам с базовыми скетчами:



Дальше, ориентируясь на классические британские интерьеры был воссоздан кабинет:



Загадки



В квестах существует достаточно много типов загадок, есть даже свои паттерны, но из-за ограничения по времени мы решили остановиться на следующих типах загадок:

В целом, ничего уникального, классический набор задач из золотой эры квестов. Дальше, игровые головоломки были проиллюстрированы комиксами:



Результаты




После того, как идея, движок и стилевое оформление было выбрано (а это заняло примерно три месяца), реализация не заставила себя долго ждать. Конечно, пришлось столкнуться с рядом проблем в существующем движке и порыться в его содержании, но ведь в этом и состоит работа инженера.

Получился, конечно, не квест мирового уровня, но на мой взгляд очень достойная работа, особенно для не IT специалиста:


P. S. Девушка успешно защитилась на отлично!


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Джон Кармак покидает id Software и присоединяется к Oculus


сегодня в 18:58



image



Сегодня руководство Oculus сообщило неожиданную новость: не нуждающийся в представлении Джон Кармак официально присоединяется к команде создателей Oculus Rift в качестве главного технического директора (CTO). Кармак покинул основанную им студию id Software. Когда именно бывший глава студии отправился в отставку, не уточняется. Издательство Bethesda, которому принадлежит id Software, подтвердило эту информацию, однако заверило, что на игры, над которыми сейчас работает студия, отставка Кармака не повлияет.

Джон Кармак давно известен как страстный поклонник устройств Oculus Rift. Именно он представил прототип стереовизора на выставке E3 в 2012 году и анонсировал первую игру, которая получила поддержку устройства — Doom 3 BFG Edition.



На всякий случай, ссылка на пост о том, что такое очки виртуальной реальности Oculus Rift.


Источник: Kickstarter, oculusvr.com, lenta.ru





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Сюрприз от Microsoft, или кто такой PCBP для России


сегодня в 18:15



В Windows 8 Apps Store для каждой игры необходимо указать минимальный возраст, с которого в нее можно играть. Также там есть возможность загрузить сертификаты, которые подтверждают указанный возраст. Для некоторых стран такой сертификат есть обязательным, то есть без него нельзя распространять приложение в указанной стране. Совсем недавно к Корее, Южной Африке, Бразилии и Тайвани была добавлена Россия. Теперь чтобы распространять приложение на территории России необходимо предоставить сертификат PCBP.


Но как? В документации Microsoft такого сертификата и в помине нет.


Дальше больше про такой сертификат не знает ни Google, ни даже техническая поддержка Microsoft.


Переписка с технической поддержкой
You: And I noticed that Russia also requires the certificate now.

James: Thanks for the extra information.

James: However, Russia is nor list within the following MSDN article, I am not aware of the certificate organisation that is required for this market.

James: msdn.microsoft.com/en-us/library/windows/apps/hh694080.aspx

You: Just a moment I will send you screenshoot

James: Ok, thank you.

You: dl.dropboxusercontent.com/u/3830689/winscreen.png

You: This is screen from dashboard

James: Thank you for the screenshot. Since the app is currently in certification, this information is not accessible to me at this time.

James: You mentioned that only Brazil and Russia were the new markets/countries that you have added for this update.

You: OK but what about the Russian cretificat. I did not managed to find any info in MSDN nor in Google nor in Russian local news.

James: I'm afraid that I am also unable to locate any relevant info on this type of certificate for you. My apologies.





Без сертификата приложение было отклонено. А как его получить никто не знает. Возможно кто то из пользователей Хабра уже смог прояснить ситуацию?


UPD: На почту отписался сотрудник Microsoft. Сказал, что им очень жаль, что я не могу найти информацию. Пообещал, что до пятницы они мне пришлют разъяснение.






1869


2






Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


10 способов защиты авторского права

Привет, Хабр.

Обучающая платформа LendWings готовится к совместной работе с одним правильным Бизнес-Ангелом из Беларуси и мы решили перенести запуск на 1-е сентября, чтобы MVP не был в совсем сыром состоянии.


Ближе к запуску, мы обязательно расскажем про весь процесс оформления наших отношений с инвестором и участниками команды, опишем как решали проблемы и готовили проект.


Перед включением боевого режима, я расскажу о нескольких интересных курсах и авторах, с которыми мы планируем работу. Начну с довольно простого, но актуального материала.


Речь пойдет о бесплатном курсе по защите интеллектуальной собственности от друга проекта — Лена Смита.





Лен Смит (Len Smith) — владелец компании Copyrighting On Demand, специалист по защите авторских прав, копирайтингу и продажам в сети. Лен Смит – профессионал с 20-ти летним опытом, тренер по продажам для многих стартапов, а также партнер и друг крупнейших мировых компаний. Среди его клиентов – Vodafone, The Financing Leasing Association, Lloyds и многие другие.


В своем курсе “Защита интеллектуальной собственности” он раскрывает основные приемы защиты и дает несколько интересных советов.


Я попрошу Хабр ознакомиться с превью и несколькими главами из курса, которые были переработаны автором специально для LendWings и переведены нашей командой.


Я постарался выбрать самое интересное, а весь курс целиком будет доступен на нашей платформе в бесплатном доступе.



Надеюсь, вы найдете для себя полезную информацию. Я должен еще раз подчеркнуть, что все изложенное мною – это лишь исключительно мое мнение и основано на моем личном опыте в этой сфере. И эта информация практически бесполезна для тех, кто юридически подкован. Но, как мы знаем, таких людей на практике очень мало. Мои лекции это лишь краткий, но легко усваиваемый курс по защите ваших прав. А еще я использую приемы, которые не подскажет вам ни одна юридическая компания в мире.


С наилучшими пожеланиями, Лен Смит.



10 способов защиты авторского права


Авторское право защищает производное интеллектуального труда: контент вебсайта, программное обеспечение, кино, аудиозаписи, статьи, художественные и научные работы.


Авторское право не позволяет другим людям использовать продукт вашей творческой деятельности без вашего разрешения. Оно позволяет вам требовать плату за право использования вашего продукта.


Исключения


1. Идеи (сюжет романа)

2. Чистые факты

3. Все, что не зафиксировано (находится в чьей-то голове, и не сохранено на носителях информации)

4. Короткие названия: имена, заглавия, или маркетинговые лозунги


Чтобы защитить вашу работу авторским правом не нужно никаких длительных приготовлений, как в случае с патентом. Вы просто должны сохранить вашу работу на любом материальном информационном носителе и использовать следующую подпись после любой вашей работы:


Copyright © ваше имя, дата или © ваше имя, дата


Казалось бы все просто. Но обратная сторона медали заключается в том, что доказать именно ваше авторство крайне сложно.


Я бы хотел поделиться несколькими советами, которые могут быть вам полезны:


1. “Простое неопровержимое доказательство”


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


Вы берете плод своего интеллектуального труда, указываете нужную символику защиты авторских прав, относите на почту на любом информационном носителе, желательно как можно более долговечном, покупаете конверт и … отправляете письмо самому себе.


На вашем конверте будет стоять штамп почтовой службы с датой.


Этот конверт будет являться неопровержимым доказательством вашего авторства в любом суде мира, в то время как тяжбы по похищению интеллектуальной собственности с веб-сайтов могут длиться годами.


2. “Влиятельный знакомый”


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


3. “Челночная дипломатия”


Данный метод не совсем честный с правовой точки зрения, но эффективный. Я раскрою вам данный способ, рассказав небольшую историю:


Однажды, серфя по интернету я наткнулся на свой сайт. На нем были мои материалы, мои услуги и продукты и даже моя фотография. Но другое доменное имя и другие реквизиты. Я начал «копать»: нашел один из электронных ящиков моего противника, нашел контакты его хостера и платежных систем, которые использовал злоумышленник, но на мои письма и требования никто не отреагировал. Такое бывает, если злоумышленники используют откровенно пиратских абузоустойчивых хостеров. Я понял что ситуация практически тупиковая. И вот что я предпринял:


1. Я составил письмо со всеми требованиями “закона об авторском праве в цифровую эпоху” (dmca). Письмо было подписано мной, заверено, обосновано и содержало контактную информацию.

2. Я подделал в фотошопе письмо от влиятельной американской правительственной организации, в котором говорилось, что некоторые материалы, размещенные на моем сайте, в частности, статьи для правительственных сайтов, могут быть искажены и использованы злоумышленниками во вред национальной безопасности. И теоретически это могло быть правдой.

3. Я передал информацию в платежную систему, которую использовал пират, вместе с поддельным скриншотом ответа хостера.

4. Дождался испуганной реакции платежной системы и отправил материалы вместе с “чистым” ответом платежной системы — хостеру.

5. Написал на личный ящик злоумышленника, что его кошельки арестованы, и можете не обращаться за помощью к хостеру, потому что даже удаление материалов, не спасает ситуацию.

6. Далее я написал еще одно письмо хостеру, в котором я сослался на закон, который не освобождает от ответственности, если нарушитель удалит материалы, с припиской, что единственным выходом из ситуации будет полное удаление веб-сайта.

7. На следующий день сайт перестал существовать.


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


Я был защищен, и при этом, создал достаточно правдоподобную легенду, которой вполне хватило, чтобы убедить хостера закрыть сайт и платежную систему — кошельки своего клиента.


Прошу заметить, что в случае борьбы против злоумышленника, который размещает свой сайт на сервере “белой” хостинг компании, вам достаточно пройти первый пункт и ваши требования будут обязаны выполнить.


8. ISBN


Что такое ISBN? Это международный стандартный книжный номер. Это официальная, международно-признанная форма регистрации, которую используют издатели, книготорговцы и библиотеки для заказа, составления списков и складского учета.


По сути это просто инвентарный номер. Но я знаю некоторых самоиздающихся писателей-романистов, которые защищали свои работы при помощи этого номера.


9. Компании, предлагающие регистрацию авторских прав


В большинстве стран не существует государственных и или полугосударственных органов, регистрирующих авторские права. Исключением являются Соединенные Штаты Америки. У них есть сайт www. сopyright.gov


В Великобритании есть ведомство интеллектуальной собственности — www.ipo.gov.uk — это невероятно полезный сайт, но он не выполняет функции регистратора.


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


Если вы решили заручиться поддержкой он-лайн регистратора, я советую вам проверить гарантии, которые они предлагают. Стоить такая услуга вам будет примерно 50-60 долларов за пять лет регистрации. И по сути, их работа заключается в том, чтобы по первому вашему требованию приступить к работе по первым трем, вышеописанным пунктам.


10. Специализированные онлайн сервисы


В связи с ростом популярности и значения музыкальной индустрии появился целый ряд компаний, предлагающий услуги по удалению пиратского контента. Они стали настолько популярными и успешными, что даже книгоиздатели активно пользуются их услугами.


В отличие от компаний, о которых мы говорили раньше, предлагающих регистрацию авторских прав, они предлагают более активные действия по защите ваших материалов. Вместо того чтобы просто регистрировать ваши авторские права, они активно ведут борьбу по недопущению распространения вашего материала в сети. Некоторые пошли еще дальше. Без вашего непосредственного участия и принятия вами решений, они круглосуточно следят за возможным явлением нарушения ваших прав. Поиск в интернете предоставит вам огромный выбор подобного рода компаний.


Я могу порекомендовать только одну, так как я писал детальный обзор этой компании и беседовал с ее управляющими – это Линкбастерс. Они утверждают, что удаляют 99% пиратского контента с файлообменников и 70% с торрент-сайтов. Проверьте их работу, но прежде чем примите решение, проанализируйте и другие компании предоставляющие такие услуги.


Я надеюсь, эти 10 шагов будут вам полезны.


Сражайтесь и побеждайте!

image


P.s. Проект LendWings просит вас присылать нам на почту lendwings@lendwings.com (или хотя бы оставлять в комментариях) имена своих любимых русских или западных авторов, либо топовых экспертов из любой области, и мы попробуем договориться с ними о записи обучающих курсов для наших пользователей. Наведший на правильную цель — получит курс бесплатно!


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html