Изучаем ETW и извлекаем профиты

Давненько у нас в бложеке не появлялось новых статей! Что ж, ETW, настало твое время!

Возможно, кто-то из вас и раньше сталкивался с этим сокращением - ETW. Что же это такое? Расшифровывается эта аббревиатура как Event Tracing for Windows. ETW - это системный компонент ОС Windows, который используется для диагностики, отладки и исследования производительности тех или иных частей ОС, а также приложений. Появился он где-то с Windows 2000, но полноценно его использовать стало возможным примерно с Windows Vista.

- А мне какое до этого дело? - спросите вы. А вот какое: в Windows несколько сотен (в Win10 - около тысячи) провайдеров событий, которые жаждут вам что-нибудь рассказать о своей работе, нужно лишь подписаться! Вот, например, как можно штатными средствами Windows посмотреть, что Internet Explorer отсылает по HTTP. А вот эти ребята сумели с помощью ETW поснифать, что пользователь набирает на своей USB-клавиатуре. И это все - безо всяких хуков, инжектов и драйверов! ETW просто пронизывает Windows, его использует и Event Viewer, и такие утилиты, как xPerf, и Visual Studio во время отладки приложения, чтобы отображать вам статистику потребляемой памяти и процессорного времени, и даже штатный Resource Monitor, который вы можете открыть из таскменеджера!

Уже интересно?

Читать далее «Изучаем ETW и извлекаем профиты»

Введение в Qt Quick 2 и QML

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

В какой-то из версий Qt (если не ошибаюсь, в 4.7) появилась возможность делать интерфейсы на декларативном языке QML 1.0 (и модуль QtDeclarative, определяющий всякие штуки для рисования интерфейсов), а в 5-й версии Qt появился QML 2.0 и QtQuick 2.0 (бывший QtDeclarative). Их я и стал изучать. В этой статье я расскажу об этих модулях в меру своих знаний, покажу пару несложных примеров их использования, а кто дочитает до конца статьи, получит еще один бонусный пример, который я написал, пока изучал библиотеку. :)

Читать далее «Введение в Qt Quick 2 и QML»

Редирект без HTTP Referer

redirect

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

Есть один самый надежный путь:
1. Переадресовываем пользователя на HTTPS-адрес.
2. Далее, если целевой адрес HTTP, то переадресовываем туда.
3. Иначе, переадресовываем на наш HTTP-адрес, а оттуда уже на целевой.

Эта схема гарантированно очистит Referer, однако, она достаточно муторная и иногда требует нескольких редиректов.

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

Читать далее «Редирект без HTTP Referer»

Библиотека для работы с Web на PHP

logo

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

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

Итак, вот основные фишки новой библиотеки в сравнении со старой (жирным отмечены самые интересные особенности):

Характеристика Websock2 Websock
PHP4 - +
Не требует cURL + +
HTTP + +
HTTPS + -
GET-и POST-запросы + +
Удобная работа с HTTP-заголовками + -
File uploads + -
Автоматическое отслеживание cookies + -
Автоматическая обработка HTTP-редиректов + -
Установка referer при редиректах + -
Basic-аутентификация + -
Digest-аутентификация + -
Автоматическая basic/digest аутентификация + -
Chunked encoding + +
GZIPped-содержимое + +
Deflated-содержимое + -
HTTP-прокси + +
HTTP-прокси в режиме HTTPS + -
SOCKS4-прокси + -
SOCKS4a-прокси + -
SOCKS5-прокси + +
Аутентификация прокси + +
Цепочки прокси + -
Отслеживание таймаутов операций + -
Сокеты через file и socket_*-функции + +
Перехват HTTP-редиректов + -
Перехват чтения HTTP-заголовков и содержимого + -
Скачивание/загрузка очень больших файлов + -
Сделано по RFC + -
Удобная архитектура, простая расширяемость + -

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

Скачать архив (библиотека + примеры + документация): Websock2
Просмотреть документацию и примеры использования

Пожелания и вопросы можно оставлять в комментариях к посту или на нашем форуме.

На GitHub

Отслеживание прогресса длительных операций в PHP

php

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

Лично мне пришлось столкнуться с такой задачей, когда я разрабатывал свой PHP Obfuscator версии 2. Процесс обфускации толстых PHP-скриптов (или их большого количества) может оказаться достаточно долгим, и пользователю приятно будет видеть прогресс выполнения работы.

Читать далее «Отслеживание прогресса длительных операций в PHP»

Фишечки PHP, о которых вы, скорее всего, не знали

php

Можете нас поздравить - это двухсотая запись в блоге! А теперь перейдем к статье.

Всем айтишникам известно, что PHP - очень простой язык с низким порогом вхождения. Простой скрипт на нем сможет написать даже тот, кто не особо разбирается в программировании и не знает большинства синтаксических особенностей языка и приемов разработки на нем. Я сейчас занимаюсь написанием новой версии своего старого проекта PHP Obfuscator. Я переписываю его с нуля, чтобы он поддерживал все самые современные фичи последних версий PHP. Старый обфускатор (1.5) уже и в подметки не годится новому, хотя тот еще не дописан. Так вот, когда пишешь что-то подобное, волей-неволей оказываешься вынужден изучать синтаксис языка в мельчайших подробностях и узнаешь все его особенности и возможности. Поэтому я хочу рассказать о таких интересных свойствах языка PHP, о которых большинство людей, которые пишут на нем код, даже не слышали. Это малоизвестные или совсем новые возможности. Может быть, кто-то начнет их применять, потому что какие-то из них могут оказаться реально полезными. Многие вещи из тех, о которых я собираюсь рассказать, упомянуты в документации на PHP, но какие-то совсем не документированы. Какие-то же факты вас, вероятно, даже удивят. Кроме того, я хочу отдельно рассказать про метапрограммирование в PHP.

Читать далее «Фишечки PHP, о которых вы, скорее всего, не знали»

Skype Preview — плагин предпросмотра ссылок в скайпе

skype

Сидел я как-то в одном уютном чатике в Skype, и тут одному из участников в голову пришла весьма интересная идея: сделать плагин для скайпа, который позволял бы просматривать содержимое тех ссылок, которые вкидываются в чат, без их открытия. "А почему бы и нет?", - подумал я. Можно открывать картинки в уменьшенном варианте, если ссылка указывает на изображение (в том числе анимированные). А если ссылка ведет на обычную html-страничку, то можно отображать ее заголовок. Забегая вперед, покажу, что получилось:

plugin

Читать далее «Skype Preview — плагин предпросмотра ссылок в скайпе»

Оптимизация PHP-скриптов: практические советы

coding

В этой статье речь пойдет о том, как оптимизировать какой-нибудь PHP-скрипт, чтобы он выполнялся как можно быстрее, затрачивая как можно меньше процессорного времени. Также я опишу некоторые простые техники оптимизации PHP-кода, которые я лично использовал, и которые принесли ощутимый результат. Я коснусь только вопроса оптимизации непосредственно PHP-кода и языка (без всяких оптимизаций запросов к БД, дополнительных расширений, кэширующих опкоды и т.д.). У меня такая задача появилась после написания одной из первых версий движка для проведения психологических тестов (расположен здесь). Скрипт был размещен на облачном хостинге, где веб-мастер платит деньги соразмерно величине израсходованных ресурсов, поэтому в моих интересах было оптимизировать скрипт таким образом, чтобы максимально снизить нагрузку.

Сразу скажу, что заниматься преждевременной оптимизацией не нужно. Стоит задуматься о переработке кода только в следующих случаях:
[+] ваш скрипт подолгу выполняется (например, делает какие-то занимающие длительное время операции в цикле);
[+] ваш скрипт очень часто выполняется (это был мой случай - иногда в день тест проходили порядка десяти тысяч человек - а это около миллиона обращений к скрипту в сутки);
[+] от используемых скриптом ресурсов зависит то, сколько денег вы платите. Если скрипт выполняется на обычном виртуальном хостинге и не превышает лимит нагрузки на процессор, то, скорее всего, можно и не париться;
[+] вы собираетесь массово распространять скрипт, и его будет использовать в конечном итоге множество людей, которым критично, сколько ресурсов скрипт потребляет.

Читать далее «Оптимизация PHP-скриптов: практические советы»

Психологический тест: история, итоги и статистика

unique_header

Вероятно, многие читатели блога знают, что я какое-то время назад ради интереса написал на PHP простенький движок, позволяющий проводить психологические тесты (и не только психологические). Работающий экземпляр размещен по адресу kaimi.io/projects/soul. Поначалу это был совсем простой скрипт, читающий конфигурацию тестов из XML и позволяющий пользователю отвечать на вопросы. В конце выдавались значения характеристик человека (вроде "задрот", "альфач" и т.д.) в процентах. Скрипт постепенно оброс новым функционалом, реализованным через плагины. Для лулзов был создан тест под названием "Социо-тест! Насколько ты задрот, битард и социофоб? Проверь себя!" (разумеется, я не имею никакого психологического образования, и всё делалось от балды и отлаживалось на себе, друзьях и знакомых). Однако, я, разумеется, не ожидал, что достаточно было один раз вбросить ссылку на него на какую-нибудь популярную имиджборду (например, 2ch), и дальше всё заработает само. Тред с тестом висел в топе несколько дней. Затем ссылку растащили по сети, и она стала появляться на таких популярных сайтах, как joyreactor.сс, dota2.ru, pikabu.ru, lurkmore.to и т.д. В Твиттере, ВКонтакте, ЖЖ и других соцсетях, а также на форумах пользователи стали делиться ссылкой на тест и результаты, что тоже прибавило посещений. Первую версию теста прошло 80 тысяч человек, были высказаны различные пожелания по его улучшению, и я решил доработать тест. Теперь актуальна новая версия, и на момент написания статьи ее прошло уже почти 250 тысяч человек! Это, пожалуй, первый проект, сделанный исключительно ради удовольствия и веселья, который помог окупить хостинг за несколько месяцев благодаря Google Ads.

Что касается движка, то постепенно были добавлены такие возможности, как рандомизация порядка ответов и вопросов, условные вопросы (которые задаются только при определенных ответах на предыдущие вопросы), получение подробного описания по каждой характеристике, вывод общего описания человека, расшаривание результатов теста, кеширование, темы и т.д. Была проведена достаточно основательная работа по оптимизации движка (про это можно написать отдельную статью). Сейчас еще остается недописанным GUI-редактор тестов. Вероятно, когда я его доделаю, я выложу и движок со всеми плагинами, и редактор.

И вот теперь, имея на руках почти 250 тысяч анонимных результатов этого теста, можно привести забавную статистику по самым интересным вопросам и характеристикам, которая наверняка вас повеселит. Для анализа всех результатов был написан еще один увесистый скрипт на PHP. Ну, хватит унылого текста, перейдем к диаграммам! Дальше идет большое количество картинок.

Читать далее «Психологический тест: история, итоги и статистика»

Получаем бесплатные купоны к разным иностранным магазинам

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

logo

Давным-давно я рылся в AppStore со своего iPod'а, и попалась мне на глаза забавная на первый взгляд игра Stop Those Fish, смысл которой сводился к тому, что вы, играя компанией медведей-рыбаков, должны глушить рыбу, которая атакует ваши лодки. Был и второй режим игры, доступный после окончания первого, но это уже неважно. Самым интересным оказалось то, что после прохождения каждого уровня на мой личный счет на неизвестном мне на тот момент сайте p4rc.com начислялись очки, если на iPod был включен Wi-Fi, разумеется. Я зарегистрировался на этом сайте и понял, что на эти самые очки можно покупать купоны по 25$ для самых разных американских интернет-магазинов, в том числе Amazon и Ebay (позже стали добавляться и купоны для британских магазинов, затем - билеты на премьеры в кинотеатрах США и т.д.). Один такой купон стоил 1500 очков (причем эти 1500 должны быть набраны в день, когда купон появился), и их набор честным игровым путем занимал больше часа. Новые акции на сайте появляются 1-2 раза в сутки, и во время каждой акции, как правило, доступно три двадцатипятидолларовых купона. Кто успел, тот и съел. Кроме того, за 500 очков можно было купить небольшие скидки и бонусы, доступные всегда. Сейчас на сайте доступно гораздо большее количество разнообразных наград меньших номиналов, но и стоят они дороже, например, карта iTunes на 10$ стоит аж 10000 очков, емана.

Читать далее «Получаем бесплатные купоны к разным иностранным магазинам»