Портрет 4X_Pro
Был в Сети сегодня, 04:25
Мультиблог
4X_Pro
Кратко о себе: Web-разработчик. Пишу на PHP, Python, JavaScript. Знаю Ruby и Go, со студенческих времён более-менее помню C и asm. Linuxоид (использую Mint+LXDE). Сторонник IndieWeb.

Компьютерное

Переключение раскладки по CapsLock в Lubuntu

4X_Pro

Установил недавно Lubuntu и обнаружил, что настроить с помощью GUI переключение раскладки клавиатуры по CapsLock не получается. Стал искать решение, и нашел следующее:

Читать далее…

Light: быстрый броузер для старых компьютеров

4X_Pro
Все популярные современные броузеры (Firefox, Chrome, Edge) имеют большой недостаток: они потребляют оперативную память просто в огромных количествах. Поэтому я давно искал броузер, который с одной стороны, поддерживал бы современные стандарты, с другой, расходовал бы память очень аккуратно. Перепробовал довольно много: QupZilla, KMeleon, Netsurf, Midori, но ни один из них в полной мере не устраивал: либо по потребленю памяти они оставались сопоставимы с Яндекс.Браузером (который я использовал в качестве основного), либо не поддерживают JavaScript, что делает невозможным их использование в качестве основного рабочего инструмента.
В итоге остановился на броузере под названием Light. По сути дела он представляет собой Firefox, из которого удалены все редкоиспользуемые функции: печать, аудит ссылок, синхронизация, поддержка WebGL и т.п. Читать далее…

Регулярные выражения для выделения ссылок

4X_Pro

Недавно потребовалось сделать автоматическое обрамление ссылок в тег <a>. Хотя на первый взгляд, задача совершенно тривиальная, обнаружилось несколько подводных камней. Во-первых, не все пользователи указывают протокол (http:// или https:// в ссылках). Во-вторых, требовалось распознавать ссылки не только на домен, но и на конкретную страницу сайта или вовсе содержать параметры после знака ?. В-третьих, распознавать кириллические домены. Кроме этого, нужно было сделать так, чтобы уже корректно обрамленная в тег ссылка не обрамлялась повторно, а также обеспечить безопасность, предусмотрев защиту от XSS, а также свести к минимуму ложные срабатывания.

Исходя из этих требований, были приняты следующие решения:

Читать далее…

Генерация ключа для шифра Вернама с помощью хеш-функций

4X_Pro

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

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

В итоге я получил следующий алгоритм шифрования:

Читать далее…

Получаем курс валют с помощью PHP и SOAP

4X_Pro

Часто при работе с Интернет-магазинами требуется сделать так, чтобы курсы валют обновлялись автоматически. Делается это достаточно просто. На сайте 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-туннелирование

4X_Pro
Думаю, многие обладатели VDS сталкивались с такой проблемой: на VDS запущен MySQL, висящий только на localhost и недоступный снаружи из соображений безопасности, и нужно внести какие-то изменения в базу. Приходится либо подключаться по SSH и работать через консольный клиент (что далеко не всегда удобно), либо ставить phpMyAdmin. Но есть и другой способ: использовать SSH-туннелирование, и пробросить порт MySQL-сервера с VDS на локальный компьютер. Через командную строку это делается следующим образом:
ssh -L локальный_порт:localhost:удаленный_порт логин@сервер
где локальный порт — номер порт на домашнем компьютере, удаленный порт — порт на сервере.
То же самое можно сделать и через SSH-клиент PuTTY. Заходим там в настройках соединения в Connection/SSH/Tunnels, вводим в source port номер локального порта (например, 3307), в destanation — localhost и удаленный порт (localhost:3306), и нажимаем "Add". Соединяемся с сервером, запускаем на своем компьютере локальный  SQL-клиент (например, HeidiSQL) и в настройках соединения ставим localhost 3307. И все, база на VDS теперь так же легко доступна, как база на домашнем компьютере!

Загрузка JavaScript по имени класса

4X_Pro

В прошлом сообщении я рассказал о том, как сделать загрузку JavaScript и CSS полностью асинхронной на примере простого сайта всего с двумя файлами скриптов. На практике же гораздо чаще встречаются ситуации, когда на сайте используется несколько различных скриптов, причем они различаются для разных страниц сайта. Допустим, у нас есть сайт, на котором мы хотим показывать изображения в lightbox, страницы с формой комментария, для которых мы хотим показать WYSIWYG-редактор, и несколько форм, где нужно ввести дату. Рассмотрим несколько вариантов, как можно организовать загрузку скриптов. Читать далее…

HeadJS или полностью асинхронная загрузка сайта

4X_Pro

Один из самых важных показателей для современного сайта — как можно более быстрая загрузка и начало показа содержимого. Чтобы этого достичь, нужно устранить задержки, связанные с ожиданием подгрузки внешних ресурсов, сделав их асинхронными. Прежде я уже писал, как можно сделать асинхронными виджеты социальных сетей. Но недавно я нашел скрипт, который позволяет сделать асинхронной загрузку всех JavaScript и CSS-файлов, используемых на сайте. Называется он HeadJS, и кроме асинхронной загрузки имеет умеет еще делать feature detection, с помощью чего можно загружать скрипты выборочно в зависимости от возможностей устройства, с которого зашел пользователь. Читать далее…

Yaml Form Generator -- простое и быстро создание форм для PHP

4X_Pro

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

Читать далее…

Как скрыть уведомления в Skype

4X_Pro
Не раз сталкивался с тем, что когда я вхожу в какой-то многолюдный групповой чат в Skype, постоянно появляющиеся уведомления о новых сообщениях очень мешают. Сегодня узнал, что существует возможность их отключить: нужно ввести в окно сообщения команду /alertsoff (аналогично IRC), и уведомления в панели задач перестанут появляться. Включить их обратно можно с помощью /alertson.
Кроме того, существуют команды для управления групповым чатом: /setrole логин MASTER (сделать админом, может выполнять только админ), /showmembers (показать права участников), /kick, /kickban и еще несколько.

Страницы:
Задать вопрос

Здесь можно задать мне вопрос или спросить совета по любой теме, затронутой в блогах или на форуме. После того, как я отвечу, вопрос и ответ появятся в соответствующем разделе. Но не забываем, что я — сторонник slow life, поэтому каких-либо сроков ответов не обещаю. Самые интересные вопросы станут основой для новых тем на форуме или записей в блоге.
Сразу предупреждаю: глупости, провокации, троллинг и тому подобное летит прямо в /dev/null.