- Перово, Москва, Россия
- me@4xpro.ru
- x4_pro
- XXXXPro
Новости сайта в Telegram
t.me/4x_proКомпьютерное
Упрощаем разделение тем в PunBB
Наконец, мне это надоело, и я решил немного подредактировать исходный код moderate.php (который лежит в корне). Читать далее…
Преобразование PSD в TIFF с сохранением слоев
Обновление TextCMS до версии 1.01
Переключение раскладки по CapsLock в Lubuntu
Установил недавно Lubuntu и обнаружил, что настроить с помощью GUI переключение раскладки клавиатуры по CapsLock не получается. Стал искать решение, и нашел следующее:
Читать далее…Light: быстрый броузер для старых компьютеров
В итоге остановился на броузере под названием Light. По сути дела он представляет собой Firefox, из которого удалены все редкоиспользуемые функции: печать, аудит ссылок, синхронизация, поддержка WebGL и т.п. Читать далее…
Регулярные выражения для выделения ссылок
Недавно потребовалось сделать автоматическое обрамление ссылок в тег <a>. Хотя на первый взгляд, задача совершенно тривиальная, обнаружилось несколько подводных камней. Во-первых, не все пользователи указывают протокол (http:// или https:// в ссылках). Во-вторых, требовалось распознавать ссылки не только на домен, но и на конкретную страницу сайта или вовсе содержать параметры после знака ?. В-третьих, распознавать кириллические домены. Кроме этого, нужно было сделать так, чтобы уже корректно обрамленная в тег ссылка не обрамлялась повторно, а также обеспечить безопасность, предусмотрев защиту от XSS, а также свести к минимуму ложные срабатывания.
Исходя из этих требований, были приняты следующие решения:
Читать далее…Генерация ключа для шифра Вернама с помощью хеш-функций
Недавно прочитал в Wikipedia про шифр Вернама, который теоретически взломать невозможно. Узнал оттуда, что на практике он не используется из-за того, что для него требуется генерировать случайный ключ, равный по длине самому сообщению, который не будет ни повторяться, ни повторно использоваться. И тогда возникла мысль: а что если использовать для генерации такого ключа криптографические хеш-функции. В этом случае взяв некоторое начальное значение (мастер-ключ), взять хеш от получившейся последовательности и зашифровать им первый блок (длина которого равна длине хеш-функции) сообщения, затем добавить получившееся значение к мастер-ключу и случайному числу, и зашифровать следующий блок и т.д. В результате получаем, что ключ для шифрования каждого следующего блока однозначно и просто генерируется из предыдущего при знании мастер-ключа, но получить мастер-ключ из хеша является сложной задачей в виду необратимости хеш-функций.
Однако у шифра Вернама есть еще одно требование: ключ должен использоваться однократно. Чтобы обеспечить это, при шифровании добавим к мастер-ключу достаточно длинное случайное число, которое будет уникальным для каждого шифруемого сообщения. При этом возникает необходимость как-то сохранить или передать это случайное число для того, чтобы можно было расшифровать сообщение. Очевидно, что сохранять его в открытом виде нельзя, но можно наложить на него мастер-ключ с помощью операции "исключающее ИЛИ", и добавить получившийся результат в начало или конец сообщения. При расшифровке при знании мастер-ключа это случайное значение можно будет снова легко получить, тогда как без знания оказываемся перед необходимостью сделать исключающее ИЛИ для двух неизвестных величин.
В итоге я получил следующий алгоритм шифрования:
Читать далее…Получаем курс валют с помощью PHP и SOAP
Часто при работе с Интернет-магазинами требуется сделать так, чтобы курсы валют обновлялись автоматически. Делается это достаточно просто. На сайте cbr.ru (Центрального Банка РФ) предусмотрено несколько Web-сервисов, работающих по протоколу SOAP и выдающих необходимую информацию. Итак, вот простой код, который получает информацию о курсе евро:
$wsdl = 'http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL'; // указываем адрес WSDL-описания SOAP-сервиса, оттуда PHP возьмет информацию о доступных методах и их параметрах
try {
$euro_to = 0;
$cbr = new SoapClient($wsdl,array('soap_version'=> SOAP_1_2, 'exceptions'=>true)); // создаем клиент для подключения к SOAP-сервису
$date = $cbr->GetLatestDateTime(); // получаем последнюю дату, за которую есть курс
// можно, ко формировать ее вручную, но нужно учитывать, что по выходным и праздникам торги не проводятся, поэтому лучше сделать так
$result = $cbr->GetCursOnDateXML(array('On_date'=>$date->GetLatestDateTimeResult)); //запрашиваем данные о курсах за указанную дату в формате XML
// к сожалению, возможности запросить курс отдельной валюты не предусмотрено, поэтому придется пройтись циклом по всем полученным
if ($result->GetCursOnDateXMLResult->any) { // если в ответе сервера есть XML с курсами валют
$xml = new SimpleXMLElement($result->GetCursOnDateXMLResult->any); // открываем его как XML-объект
foreach ($xml->ValuteCursOnDate as $currency) { // и начинаем обходить
if ($currency->VchCode=='EUR') { // VchCode содержит код валюты, для евро это EUR, для доллара — USD
$euro_to = floatval($currency->Vcurs); // цена за указанное в Vnom количество валюты
$euro_from = $currency->Vnom; // для доллара и евро количество равно единице, для других валют может отличаться
// чтобы получить реальный курс за одну единицу валюты, нужно разделить $currency->Vcurs на $currency->Vnom
}
}
if ($euro_to!=0) {
// здесь можно вставить код, который обновляет данные в магазине
}
}
else echo 'Error!';
}
catch (Exception $e) { // на всякий случай обработчик ошибок
echo 'Error: '.$e->getMessage();
}
Доступ к MySQL на VDS через SSH-туннелирование
ssh -L локальный_порт:localhost:удаленный_порт логин@сервергде локальный порт — номер порт на домашнем компьютере, удаленный порт — порт на сервере.
То же самое можно сделать и через SSH-клиент PuTTY. Заходим там в настройках соединения в Connection/SSH/Tunnels, вводим в source port номер локального порта (например, 3307), в destanation — localhost и удаленный порт (localhost:3306), и нажимаем "Add". Соединяемся с сервером, запускаем на своем компьютере локальный SQL-клиент (например, HeidiSQL) и в настройках соединения ставим localhost 3307. И все, база на VDS теперь так же легко доступна, как база на домашнем компьютере!
Загрузка JavaScript по имени класса
В прошлом сообщении я рассказал о том, как сделать загрузку JavaScript и CSS полностью асинхронной на примере простого сайта всего с двумя файлами скриптов. На практике же гораздо чаще встречаются ситуации, когда на сайте используется несколько различных скриптов, причем они различаются для разных страниц сайта. Допустим, у нас есть сайт, на котором мы хотим показывать изображения в lightbox, страницы с формой комментария, для которых мы хотим показать WYSIWYG-редактор, и несколько форм, где нужно ввести дату. Рассмотрим несколько вариантов, как можно организовать загрузку скриптов. Читать далее…