Началось всё с того, что я взял несколько сотен мегабайт музыки у моей девушки. Каково же было моё удивление, когда вместо фотографий альбомов, я обнаружил фотки подружек/одноклассниц/семьи. Задумался над тем, как же она выставляла все эти фотки. Сдаётся мне - каждую вручную через 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 всё ещё на операционном столе.
// Откликаться на дрэг пока не желает.
// Работа кипит.
Читать дальше
суббота, 30 мая 2009 г.
воскресенье, 24 мая 2009 г.
Google Chrome Tweaks
Не все настройки браузера Google Chome видны из интерфейса, некоторые вообще можно указать только при запуске. Решил собрать в одном месте все интересные особенности браузера Google Chrome. Когда составлю свою оптимальную конфигурацию, щадящую озу, но всё же функциональную - обязательно припишу снизу статьи.
1. Скрытие/отображение вкладок:
2. История в текущей вкладке:
3. Процессы и треды (ключи запуска)
4. Информация о браузере:
5. Все ключи запуска:
6. Горячие клавиши
Читать дальше
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.
Читать дальше
Есть желание сделать текст в статьях, видимый только на главной.
Он будет кратко обещать читателю содержимое остальной части.
И работать будет диаметрально-противоположно остальному тексту.
Структура:
1. Введение в тему статьи
2. Описание тела статьи
3. Тело статьи
На главной будут видны пункты 1 и 2.
На странице со статьёй будут только пункты 1 и 3.
Читать дальше
суббота, 16 мая 2009 г.
Чего мне не хватает в GIF
Все форматы изображений по-своему хороши.
Но помимо достоинств у каждого формата есть и недостатки.
Эта статья о том чего мне не хватает в формате GIF.
Рис. 1. Изображение содержит 173 кадра (44288 цветов)
Рис. 2. Изображение содержит 32 кадра.
З.Ы. Лучшее ПО для создания GIF анимаций: GIF Movie Gear
Рис. 3. Весит эта GIF анимация порядка 3МБ.
Читать дальше
Но помимо достоинств у каждого формата есть и недостатки.
Эта статья о том чего мне не хватает в формате 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] - удалил уже
Читать дальше
Оно в принципе понятно, 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.
Предложенный системой скрипт, я скачивать не стал.
Вместо этого, вставил в шаблон следующий код:
То есть, скопировал ссылку на генерацию скрипта.
Здесь и началось кое-что интересненькое . . .
Обратите внимание на ссылку:
Уж очень параметр, похож на мой майл: k06aaa@gmail.com
(Примечание: %21 == '!')
В коде генерированного скрипта (строка №2):
Забавно получается, зачем-то поменяли местами каждые 2 буквы.
Далее следуем за переменной "_2":
А нафига это было нужно? Я в раздумьях.
Анализ кода, более ничего необычного не выделил.
Всё как и ожидалось, эвент на нажатие клавиш, сравнение с Ctrl+Enter и т.д.
Читать дальше
Предложенный системой скрипт, я скачивать не стал.
Вместо этого, вставил в шаблон следующий код:
<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".
Читать дальше
Подписаться на:
Сообщения (Atom)