суббота, 30 мая 2009 г.

DropHandler (не доделал пока)

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

1. Рождение идеи

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

2. Разведка обстановки

Сказано - сделано. Пошли копать под MS Explorer. Хватаю мышой JPG и тащу на MP3. И что я вижу? мп3-шке абсолютно пофигу все мои старания. Она просто прикидывается фоном, даже слушать не хочет ни про какую жпг. Погодите, а на кого вообще можно другие файлы перетаскивать? Метод простой проверки показал: EXE, CMD, COM, BAT, JS, VBS и конечно же фолдеры. Интересно знать, почему они реагируют на drag&drop, а остальные нет.

За ответом на этот вопрос идём в реестр в ветвь HKCR. Находим папку "HKCR/.exe", её значение по умолчанию "exefile". Теперь находим папку "HKCR/exefile" и видим всю информацию о возможных действиях с ехе-файлами. Бросается в глаза папка "HKCR/exefile/shellex/DropHandler", её имя говорит само за себя. Обработчик бросания - дословный перевод. Значение по умолчанию у этой ветви реестра - странный набор символов через дефис, заключённый в фигурные скобки. Где-то я такие уже видел . . .

А! Точно! В ветке "HKCR/CLSID" полным полно таких. CLSID - как пить дать Class ID. Внутри найденной ветви реестра видим путь к shell32.dll и еще один непонятный ключик ThreadingModel со значением Apartment. Теперь нам понятно, при перетаскивании любого объекта файловой системы на ехе-файл, будет вызываться один из методов динамической библиотеки shell32.dll

3. Принятие первичных мер

Создаём ветвь реестра "HKCR/.mp3/shellex/DropHandler" со значением по умолчанию как и у ехе-шника. Смотрим, что изменилось в проводнике. Хватаем картинку и тащим на мп3. И вот оно! MP3 файл выделяется как и EXE при натаскивании на него файла. Ну чтож, отпускаем. Как и ожидалось открылся плеер по умолчанию и стал проигрывать нашу песню. Ну а чего мы ещё хотели установив мп3-шке DropHandler от ехе-шки? Следующим этапом по логике вещей должно стать создание своего собственного DropHandler-а и получение его собственного CLSID.

4. Ныряем с головой

Ни разу ничего похожего не делал. Погуглил-погуглил и определился. Следует в MSVC создать проект ATL, как DLL. CLSID свежесозданной длл-ки я обнаружил прямо в исходном коде. Он сгенерировался в процессе создания проекта. Теперь следует найти в исходниках(а их не мало уже) основной класс и пронаследовать его от IDropHandler и IPersistFile. Придётся поставить порядка 12-ти методов-заглушек и только необходимые нам наделить логикой. Каждый раз при перекомпиляции проекта студия создаёт необходимые ветви реестра в "HKCR/CLSID" и "HKCR/AppID". Только внутри они пустые, я каждый раз заполнял их по примеру стандартного DropHandler-а shell32.dll. (А надо ли это было?)

// DropHandler всё ещё на операционном столе.
// Откликаться на дрэг пока не желает.
// Работа кипит.

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

воскресенье, 24 мая 2009 г.

Google Chrome Tweaks

Не все настройки браузера Google Chome видны из интерфейса, некоторые вообще можно указать только при запуске. Решил собрать в одном месте все интересные особенности браузера Google Chrome. Когда составлю свою оптимальную конфигурацию, щадящую озу, но всё же функциональную - обязательно припишу снизу статьи.

1. Скрытие/отображение вкладок:
Ctrl + B


2. История в текущей вкладке:
зажать кнопку мыши на кнопке "назад"


3. Процессы и треды (ключи запуска)
–process-per-tab
–process-per-site
–single-process


4. Информация о браузере:
about:version и about: - версия браузера
about:plugins - плагины
about:histograms - гистограммы
about:dns - DNS адреса
about:cache - кэш
view-cache:stats - статистика по кэшу
about:memory - Статистика по памяти
about:crash - Опаньки . . .


5. Все ключи запуска:
-disable-hang-monitor
-disable-metrics
-disable-metrics-reporting
-assert-test
-renderer-assert-test
-crash-test
-renderer-crash-test
-renderer-startup-dialog
-plugin-startup-dialog
-testshell-startup-dialog
-plugin-launcher
-channeltesting-channel
-homepagestart-renderers-manuallyrenderer
-renderer-pathplugin
-single-process
-process-per-tab
-process-per-site
-in-process-plugins
-no-sandbox
-safe-plugins
-trusted-plugins
-test-sandbox
-user-data-dir
-appupload-file
-dom-automation
-plugin-pathjs-flags
-geoidlangdebug-children
-wait-for-debugger-children
-log-filter-prefix
-enable-logging
-dump-histograms-on-exit
-disable-logging
-remote-shell-port
-uninstallomnibox-popup-count
-automation-channel
-restore-last-session
-record-mode
-playback-mode
-no-events
-hide-icons
-show-icons
-make-default-browser
-proxy-server
-dns-log-details
-dns-prefetch-disable
-debug-print
-allow-all-activex
-disable-dev-tools
-always-enable-dev-tools
-memory-model
-tab-count-to-load-on-session-restore
-memory-profile
-enable-file-cookies
-start-maximized
-enable-watchdogfirst-run
-message-loop-strategy
-message-loop-histogrammer
-importsilent-dump-on-dcheck
-disable-prompt-on-repost
-disable-popup-blocking
-disable-javascript
-disable-java
-disable-plugins
-disable-images
-use-lf-heap
-new-http


6. Горячие клавиши

[Ctrl + T] - Открыть новую вкладку
[CTRL + W] - Закрыть текущую вкладку
[Ctrl + Shift + T] - Открыть последнюю закрытую вкладку
[Ctrl + N] - Новое окно(не вкладка)
[Ctrl + Shift + N] - Открыть окно с режимом инкогнито
[Ctrl + L] - Выделить URL страницы(перейти в строку адреса)
[Ctrl + R] - Перезагрузить страницу
[Ctrl + U] - Смотреть исходный код страницы
[Ctrl + H] - Читать историю
[Ctrl + J] - Страница ваших загрузок
[Shift + Esc] - Дипетчер задач

[Ctrl + F] - Поиск текста на странице
[Ctrl + G] - Искать дальше
[Ctrl + P] - Печать страницы
[Ctrl + D] - Добавить страницу в закладки
[Ctrl + E / Ctrl + K] - Поиск с помощью Гугла
[Ctrl + "+" / Ctrl + MouseUp] - Приблизить
[CTRL + "-" / CTRL + MouseDown] - Отдалить



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

вторник, 19 мая 2009 г.

Обрывки статей

Наконец-то сделал в блоге "обрывки"/начала статей на главной странице. Я использовал способ, описанный здесь.
Есть желание сделать текст в статьях, видимый только на главной.
Он будет кратко обещать читателю содержимое остальной части.
И работать будет диаметрально-противоположно остальному тексту.

Структура:
1. Введение в тему статьи
2. Описание тела статьи
3. Тело статьи

На главной будут видны пункты 1 и 2.
На странице со статьёй будут только пункты 1 и 3.
Читать дальше

суббота, 16 мая 2009 г.

Чего мне не хватает в GIF

Все форматы изображений по-своему хороши.
Но помимо достоинств у каждого формата есть и недостатки.
Эта статья о том чего мне не хватает в формате GIF.

Ну почему нет поддержки многоцветных изображений (более 8 бит на точку)? Я не имею ввиду различные извращения с поочерёдной прорисовкой областей картинки и получением таким образом картинок из 512, 1024, ... 8192, ... цветов(рис. 1). Конечно, заметен момент прорисовки из-за времени загрузки, но такой "костыль" имеет место быть. А ведь можно было сжимать отдельные битовые плоскости. То есть каждую из трёх цветовых компонент (Red, Green, Blue) отдельно как 8-битовую картинку. Для равномерной подкачки из интернета хранить и сжимать изображение построчно (имеются ввиду строки пикселей в изображении). На мой взгляд - это явное упущение.



Рис. 1. Изображение содержит 173 кадра (44288 цветов)


Очень жаль что нет возможности алгоритмически задать порядок следования кадров. Ведь как было бы хорошо, имея набор кадров в GIF-файле задать порядок их следования специальным образом. Стало бы возможным создать начало, повторяющуюся N раз середину и хвост. Как вам такой вариант задания порядка кадров(см. ниже)?

1,2,3,[10:4,5,6,7],8,9,10
1,2,3 - Начало анимации из кадров 1-3
[10:4,5,6,7] - Цикл из кадров 4-7 на 10 итераций
8,9,10 - Хвост анимации из кадров 8-10

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



Рис. 2. Изображение содержит 32 кадра.


З.Ы. Лучшее ПО для создания GIF анимаций: GIF Movie Gear


Рис. 3. Весит эта GIF анимация порядка 3МБ.


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

понедельник, 11 мая 2009 г.

Жизнь с чистого листа . . .

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

Оно в принципе понятно, 512МБ ОЗУ ( -64МБ для видюхи) ...
Решил снести винду и поставить снова лицуху ХР.
Обновил её по полной программе.

Вот софт, установленный мною в первую очередь:
1) Google Chrome 1.0.154.65
2) WinRAR 3.90 Beta 1
3) Alcohol 120%
4) μTorrent 1.8.2
5) QIP 2005, Build 8092
6) TVersity Pro 1.5
7) Avira AntiVir Desktop
8) K-Lite Codec Pack 4.8.2 Full
9) iTunes 8.1.1.10 + QuickTime 7.6
10) Adobe Reader 9.1
11) Java JRE 6 Update 13 + Java JDK 6 Update 13
12) Sony Ericsson SDK 2.5.0.3 for the Java™ ME Platform
13) MS Visual Studio 2008 (Free ISIC license)
14) MSDN
15) Microsoft Platform SDK
16) Qt SDK by Nokia v2009.02 (open source)
17) Boost C++ Libraries

Вторая волна:
1) Irfan Viewer 4.23 + All plugins
2) Notepad++ 5.3.1
3) Unlocker 1.8.7
4) Launchy 2.1.2
5) Gif Movie Gear 4.2
6) Half-open limit fix 4.0

Под прицелом:
1) 1by1 1.67
2) [xplorer2] - удалил уже


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

суббота, 9 мая 2009 г.

Orphus [Орфус]

Установил себе в блог систему Orphus. Теперь Вы можете ещё удобнее сообщать мне об ошибках, которые мозолят вам глаза. Вам нужно лишь выделить мышкой ошибку и нажать Ctrl+Enter. Далее выскочит диалог Orphus-a.

Предложенный системой скрипт, я скачивать не стал.
Вместо этого, вставил в шаблон следующий код:
<script src='http://orphus.ru/ru/orphus.js?email=%210ka6aag@amlic.mo' type='text/javascript'/>

То есть, скопировал ссылку на генерацию скрипта.
Здесь и началось кое-что интересненькое . . .

Обратите внимание на ссылку:
http://orphus.ru/ru/orphus.js?email=%210ka6aag@amlic.mo

Уж очень параметр, похож на мой майл: k06aaa@gmail.com
(Примечание: %21 == '!')

0ka6aag@amlic.mo
k06aaa@gmail.com


В коде генерированного скрипта (строка №2):
var _2 = "!0ka6aag@amlic.mo";


Забавно получается, зачем-то поменяли местами каждые 2 буквы.
Далее следуем за переменной "_2":
var _12 = function()
{
if(_2.substr(0,1) == "!")
{
_2 = _2.substr(1).replace(/(.)(.)/g,"$2$1");
}
...
};


А нафига это было нужно? Я в раздумьях.
Анализ кода, более ничего необычного не выделил.
Всё как и ожидалось, эвент на нажатие клавиш, сравнение с Ctrl+Enter и т.д.



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

вторник, 5 мая 2009 г.

Qt 4.5.1 и кириллица в URL

1. Суть проблемы


Столкнулся с проблемой кириллицы в Qt SDK by Nokia 2009.02 (open source) под Windows. Ссылки на файлы с кириллическими именами не работают. Приведу пример неработающего кода и способ решения проблемы.

2. Неработающий код


Сперва укажем в какой кодировке мы набираем исходный код. У меня это Win-1251.
QTextCodec::setCodecForTr(
QTextCodec::codecForName("Windows-1251") );

Создадим экземпляр класса QLabel, на него положим HTML ссылку:
QLabel label( tr("<a href=\"файлик.doc\">link</a>") );

Включим автоматическое открытие ссылок через QDesktopServices::openUrl():
label.setOpenExternalLinks( true );

Ну и само собой, при клике по ссылке ничего не происходит. Совсем ничего. (Или я что-то не так делаю?)

3. Вариант решения проблемы


Как вариант, создадим свой слот обработки клика по линку:
void linkClick(QString str)
{
QString path = "file:///" + qApp->arguments()[0];
path = path.left( path.lastIndexOf('\\')+1 );
QDesktopServices::openUrl( path + str );
}

Соединяем сигнал label-а с нашим слотом:
connect( label, SIGNAL(linkActivated(QString),
this, SLOT(linkClick(QString)) );

Не забываем выключить автоматическое открытие линков:
label.setOpenExternalLinks( false );

Теперь при клике по ссылке будет вызываться наша функция. И теперь всё работает.

Весьма странно. Почему без "file:///" не работает? почему не работает по относительному пути?

Зарегистрирован в task-tracker как "the issue number #253955".

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