Содержание статьи
- Q: Для решения самых разных задач я очень часто использую WinAPI-функции. Это лучший способ эмулировать активность в любом приложении, считывать нужные параметры из полей — короче говоря, автоматизировать все и вся. Каждый раз для этого приходится писать приложение (чаще всего на C++), что очень муторно. Нет ли более простого способа вызвать нужную функцию из определенной системной библиотеки?
- Q: Хочу купить читалку, но не знаю, какую выбрать. Одни понимают книги в формате FB2 (как и мой телефон), многие только ePub и так далее. Что лучше?
- Q: Каждый раз мучаюсь при попытке безопасно извлечь устройство. В каждом третьем случае этому препятствует какая-то программа, причем какое именно приложение лочит флешку — понятно далеко не всегда. Как быть?
- Q: Хочу реализовать на своем сайте авторизацию через популярные сервисы (Facebook, ВКонтакте, Google и так далее) без дополнительной регистрации. Как это проще всего сделать?
- Q: Есть задача – организовать emailрассылку по большому (действительно большому) списку получателей. Сначала хотел написать простой скрипт, который рассылал бы все с дедика через sendmail, но оценив объем (а это гигабайты трафика), понял, что этот вариант не подойдет. Как бы реализовал рассылку ты? Сразу хочу сказать, что речь идет о легитимной рассылке, это не спам.
- Q: Экспериментирую с альтернативными движками для хранения данных в MySQL. Проблемы возникают с установкой PBXT (primebase.org). Можете дать гарантированно работающий мануал?
- Q: Как проверить, разрешает ли провайдер использовать VPN-соединения?
- Q: Беремся за большой проект, предполагающий разработку клиентских приложений для разных мобильных платформ. Обеспечить всех разработчиков реальными устройствами мы не можем, поэтому ищу сейчас всевозможные эмуляторы. Реально ли с их помощью вести весь цикл отладки?
- Q: Все чаще и чаще встречаю довольно продвинутые проекты, которые используют Google Protocol Buffers. Объясни, в чем суть проекта? Чем он лучше XML?
- Q: Существует ли универсальное решение для Windows, позволяющее получить доступ к данным на разделах с различными файловыми системами, которые используются в Linux- и BSD-системах? Включая самые современные, вроде Ext4. Нет желания держать отдельные тулзы, скажем, для Ext2/3/4 и UFS/UFS2.
Есть вопросы — присылай на faq@real.xakep.ru
Q: Для решения самых разных задач я очень часто использую WinAPI-функции. Это лучший способ эмулировать активность в любом приложении, считывать нужные параметры из полей — короче говоря, автоматизировать все и вся. Каждый раз для этого приходится писать приложение (чаще всего на C++), что очень муторно. Нет ли более простого способа вызвать нужную функцию из определенной системной библиотеки?
A: С помощью WinAPI действительно можно творить чудеса. Мы все помним про самые первые трояны для WebMoney, которые как раз с помощью системных вызовов управляли WM Keeper’ом и эмулировали активность пользователя таким образом, чтобы его деньги при первом же запуске приложения переводились в нужном направлении. Концепт (само собой, он уже не работает ввиду современных защитных механизмов) хорошо описан в одной из наших старых статей (bit.ly/winapi_hack_webmoney). Но вернемся к вопросу. Чтобы вызвать произвольную системную функцию, необязательно писать код на том же С++ и компилировать его. Можно обойтись специальной утилитой winapiexec (rammichael.com/winapiexec), которая позволяет выполнить любые вызовы через командную строку. Синтаксис для запуска следующий:
winapiexec.exe library.dll@FunctionName 123
unicode_text "a space"
Можно последовательно выполнить несколько команд, указав их через запятую. Особенности ключей, передаваемых через командную строку, хорошо описаны в мануале winapiexec.
Приведу несколько простых примеров использования программы.
1. Запустим калькулятор и тут же удалим процесс из памяти: winapiexec.exe
CreateProcessW 0 calc 0 0 0 0x20 0
0 $a:0x44,,,,,,,,,,,,,,,, $b:16
, Sleep 1000 , TerminateProcess
$$:11@0 0
2. Отобразим таск-менеджер:
winapiexec.exe u@SendMessageW ( u@FindWindowW
Shell_TrayWnd 0 ) 0x111 420 0
3. Выведем через MessageBox путь до temp:
winapiexec.exe GetTempPathW 260
$b:520 , u@MessageBoxW 0 $$:3 $$:0
0x40
Много триков с системой, реализованных через WinAPI-функции, хорошо описаны в этой статье некого индийского программиста: codeproject.com/KB/miscctrl/Taskbar_Manipulation.aspx.
Q: Хочу купить читалку, но не знаю, какую выбрать. Одни понимают книги в формате FB2 (как и мой телефон), многие только ePub и так далее. Что лучше?
A: На самом деле, никакой разницы нет. FB2, ePub и другие форматы — лишь описание контейнера, в котором хранятся тексты, изображения и шрифты. И уж конечно, давно разработаны простые конвертеры между ними. Известный сервис fb2epub.com позволяет преобразовывать книжки из FB2 в ePub в два клика мыши. Есть более универсальные решения, которые поддерживают не два, а сразу множество книжных форматов. Я заморочился этим вопросом, когда купил себе Kindle от Amazon (все-таки $139, как ни крути, хорошая цена для отменной читалки с Wi-Fi на борту). Девайс предоставляет два варианта для получения книг: загрузка в специальном формате MOBI или же покупка в онлайн-магазине.
Чтобы перевести свою библиотеку в «родной» для Kindle формат я нашел утилиту Calibre (calibre-ebook.com). Примечательно то, что эта бесплатная кроссплатформенная утилита поддерживает практически любые форматы электронных книг и даже позволяет напрямую закачивать книги в ридеры с автоматической конвертацией.
Можно, например, взять всю свою библиотеку в FB2 и разом преобразовать в нужный формат, автоматически забросив книги на девайс.
Q: Каждый раз мучаюсь при попытке безопасно извлечь устройство. В каждом третьем случае этому препятствует какая-то программа, причем какое именно приложение лочит флешку — понятно далеко не всегда. Как быть?
A: Пожалуй, это главная причина, почему многие (в том числе и я) просто выдергивают флешку из компьютера. Пользоваться безопасным извлечением устройств в Windows – настоящая пытка. При этом я уже не раз поплатился за пренебрежение этим простым правилом, теряя ценные данные с внешнего накопителя. На самом деле, проблема легко решается с помощью утилит USB Safely Remove (safelyremove.com) или Zentimo (zentimo.com). Помимо общей продуманности (удобное меню с картинками устройств, отображение правильных имен девайсов, возможность скрыть ненужные тома), они (о чудо!) показывают приложения, которые мешают извлечь устройство и помогают снять лок. Почему такая очевидная и понятная опция не реализована в стандартном инструменте Windows, мне понять сложно.
Q: Хочу реализовать на своем сайте авторизацию через популярные сервисы (Facebook, ВКонтакте, Google и так далее) без дополнительной регистрации. Как это проще всего сделать?
A: Один из самых удобных из доступных на сегодняшний день вариантов —Lozinza (loginza.ru). Это сервис, который позволяет разработчикам и вебмастерам обеспечить аутентификацию на сайте через учетные записи популярных порталов (Яндекс, Google, Rambler, Mail.Ru, LiveJournal, etc), социальных сетей ВКонтакте и Facebook, а также через идентификаторы OpenID. Простое в освоении Loginza.API и наличие готовых решений на разных языках позволяют без особого труда воспользоваться сервисом уже сейчас. Есть плагины для разработчиков сайтов на WordPress, phpBB, Joomla, Cogear, Drupal и прочих. Форма входа Логинзы на текущий момент установлена более чем на 6 500 сайтов. Кстати, стартап недавно был приобретен Яндексом, а значит, у сервиса есть все шансы на самое быстрое развитие.
Q: Есть задача – организовать emailрассылку по большому (действительно большому) списку получателей. Сначала хотел написать простой скрипт, который рассылал бы все с дедика через sendmail, но оценив объем (а это гигабайты трафика), понял, что этот вариант не подойдет. Как бы реализовал рассылку ты? Сразу хочу сказать, что речь идет о легитимной рассылке, это не спам.
A: Если ни один из готовых сервисов для организации рассылок вроде subscribe.ru тебя не устраивает (что более чем вероятно), я вижу в твоей ситуации один вариант. Но зато какой современный и прогрессивный! Раз уж ожидается большой и сложно предсказуемый объем трафика, то надо переложить проблему на тех, у кого мощностей всегда предостаточно – облачных провайдеров. Известный и в последнее время все чаще упоминаемый нами Amazon сейчас проводит открытое бета-тестирование сервиса Amazon Simple Email Service (SES), который как раз и занимается доставкой электронной корреспонденции из облака. Понятно, что ни баснословный объем трафика, ни немыслимое количество писем для его мощностей не проблема.
Отправка тысячи сообщений стоит $0.10. Помимо этого придется платить за входящий и исходящий трафик (не больше $0.10 за Гб). Примеры скриптов доступны в разделе для разработчиков (bit.ly/amazon_ses_scripts), поэтому попробовать сервис в действии можно прямо сейчас. Интересно, насколько эффективны у компании механизмы борьбы со спамом, а то ведь с таким подходом и никакие ботнеты для рассылки будут не нужны :).
Q: Экспериментирую с альтернативными движками для хранения данных в MySQL. Проблемы возникают с установкой PBXT (primebase.org). Можете дать гарантированно работающий мануал?
А: Ниже рецепт от нашего эксперта в этой отрасли — Александра Лозовюка:
1. Сначала необходимо выяснить, где находится директория плагинов (подразумеваем, что MySQL 5.1 у тебя уже установлен). Для этого набери в консоли mysql-клиента:
show
variables like "%plugin%".
Можно также выполнить аналогичный SQL-запрос через phpMyAdmin. В ответ ты получишь что-то вроде /home/my-user/mysql/lib/mysql/plugin.
2. Скачай исходники плагина из Lanchpad (launchpad.net), используя Bazzar:
bzr branch lp:pbxt /tmp/pbxt-src
3. Далее приступаем к конфигурации:
./configure --with-mysql=<builddir>/<
mysql-src> --with-plugindir=
<mysql-dir>/lib/mysql/plugin
4. И, в конце концов, собираем проект:
make && make install.
5. Полученный модуль копируем в директорию плагинов и выполняем SQL-команду, чтобы подключить новый плагин:
INSTALL PLUGIN
pbxt SONAME 'libpbxt.so'
6. Теперь создаем таблицу, используя новый движок:
«CREATE TABLE t1 (c1 int,
c2 text) engine=pbxt;».
Или изменяем уже существующую: «ALTER TABLE t1 engine=pbxt».
Вуаля, теперь в качестве движка используется новомодный PBXT.
Q: Как проверить, разрешает ли провайдер использовать VPN-соединения?
А: Необходимо убедиться, что GRE-пакеты не блокируются. Сделать это можно на сайте itshidden.com — бесплатном VPN-сервисе, который как раз работает на PPTP. Если не работает, то, скорее всего, GRE-пакеты бло кируются. В этом случае можно попробовать OpenVPN или SSH-туннелирование.
Q: Беремся за большой проект, предполагающий разработку клиентских приложений для разных мобильных платформ. Обеспечить всех разработчиков реальными устройствами мы не можем, поэтому ищу сейчас всевозможные эмуляторы. Реально ли с их помощью вести весь цикл отладки?
A: Для отладки и тестирования разработок могут пригодиться два вида инструментов: эмуляторы и симуляторы. В чем разница? Все просто. Эмулятор — это программное средство, которое транслирует откомпилированный код с оригинальной архитектуры на платформу, где он фактически будет выполняться. В нашем случае эмулятор — это десктопное приложение, которое эмулирует железо мобильного устройства и работу его операционной системы, позволяя запускать и отлаживать приложения. Существуют также эмуляторы именно мобильных операционных систем (например, для Windows Mobile и Android), не привязанные к какому-то конкретному девайсу. Симулятор — менее сложное и менее полезное решение, которое лишь имитирует работу мобильного девайса и его ОС, но не эмулирует железо.
В любом случае, и эмуляторы, и симуляторы часто не предоставляют полной свободы для отладки приложений. Трудности могут возникнуть, например, при тестировании функций, использующих цифровой гироскоп.
В этом случае без реального устройства в большинстве случаев не обойтись. Так или иначе, ниже — небольшая подборка инструментов, которые могут тебе понадобиться.
- iOS Simulator — симулятор устройств, работающих под управлением мобильной ОС от Apple. Решение идет вместе со средой разработки XCode и доступно только для платформы Mac OS X: developer.apple.com/devcenter/ios/index.action;
- Android Emulator — эмулятор операционной системы Android версии 1.1, 1.5, 1.6, 2.0, 2.1, 2.2 & 2.3 (для работы необходимо скачать образы ОС и SDK): developer.android.com/guide/developing/tools/emulator.html;
- Samsung Galaxy Tab Add-on — cпециальный аддон для Android SDK, позволяющий эмулировать работу модного планшетника Samsung Galaxy Tab: innovator.samsungmobile.com/galaxyTab.do;
- HP webOS Emulator — эмулятор немногочисленных устройств от HP (Palm Pre, Palm Pixi, Palm Pixi Plus), поставляется вместе с SDK: developer.palm.com/index.php?id=1744;
- Nokia Symbian Emulators — эмулятор устройств, работающих под управлением Symbian: bit.ly/symbian_emulators;
- BlackBerry Simulators — cимулятор девайсов и ОC Blackberry: blackberry.com/developers/downloads/simulators;
- Windows Mobile 6.5 Emulator Images — образы эмуляторов WM6.5: bit.ly/WM65emulator;
- Windows Phone 7 Simulator — симулятор новой мобильной ОС от Microsoft, который работает в связке с Visual Studio: bit.ly/WP7simulator;
- Bada Simulator — симулятор ОС Bada от компании Samsung: bit.ly/Bada_simulator.
Q: Все чаще и чаще встречаю довольно продвинутые проекты, которые используют Google Protocol Buffers. Объясни, в чем суть проекта? Чем он лучше XML?
A: Protocol Buffers (буферы протоколов) — это не зависящий от языка и платформы, расширяемый способ разделять на серии структурированные данные. По своим задачам технология очень похожа на XML, только компактнее, быстрее и проще. Ты однажды определяешь, как должны быть структурированы данные, а потом используешь специально созданный исходный код для записи и чтения структурированных данных в\из различных потоков данных, используя разнообразные языки – Java, C++ или Python. Описание выполняется в специальных .proto-файлах:
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
В этом .proto-файле определяется формат описания человека. После этого мы можем легко использовать это определение для создания и манипулирования объектами.
Person person;
person.set_name("John Doe");
person.set_id(1234);
person.set_email(
"jdoe@example.com");
fstream output(
"myfile", ios::out | ios::binary);
person.SerializeToOstream(&output);
Чем это лучше XML? Использовать Protocol Buffers проще, в 10-20 раз быстрее и в 3-10 раз эффективнее в плане полученного объема. Есть конкретные примеры использования. Например, недавно бэкенд Twitter перешёл на Protocol Buffers. По заявлению разработчиков Twitter, база в триллион твитов на XML занимала десять петабайт вместо одного. Большое количество примеров и статей по теме ты найдешь на официальном сайте (code.google.com/p/protobuf).
Еще интересной разработкой в этой области является библиотека MessagePack (msgpack.org), которая тоже предназначена для сериализации данных. Она позволяет обмениваться структурированными данными между различными языками так же, как JSON, но, в отличие от последнего, результат получается меньше и быстрее. На сайте доступны модули для Ruby, Perl, Python, C/C++, Java, PHP, Haskell, Lua.
Q: Существует ли универсальное решение для Windows, позволяющее получить доступ к данным на разделах с различными файловыми системами, которые используются в Linux- и BSD-системах? Включая самые современные, вроде Ext4. Нет желания держать отдельные тулзы, скажем, для Ext2/3/4 и UFS/UFS2.
A: Мне больше всего по душе утилита R.Saver (rlab.ru/tools/rsaver.html). Основное назначение программы — восстановление данных с различных версий файловых систем FAT и NTFS. Но помимо этого утилита предоставляет доступ в режиме чтения к следующим файловым системам:
- Microsoft Windows: FAT и NTFS, включая FAT12, FAT16, FAT32, NTFS, NTFS5;
- Apple Mac OS: HFS, HFS+/HFSX;
- Linux: Ext2, Ext3, Ext4, ReiserFS, JFS и XFS;
- Unix, BSD, Sun Solaris: UFS и UFS2 (FFS), включая UFS с обратным порядком байтов, которая используется на Sparc/Power серверах.