Консольная утилита imgupload

Выпущена консольная утилита imgupload 0.2.6, предназначенная для загрузки файлов на хостинги, основанная на ядре Image Uploader 1.3.2.

Исправлены ошибки в deb-пакете. Установочный пакет для Ubuntu поддерживает версии системы начиная с Ubuntu 14.04 (i386 и amd64).

Скачать архив для Windows и Debian-пакеты вы можете на странице загрузок.  

Знания никогда не бывают лишними, или как Unchecky с Punto Switcher-ом не подружились

Иногда я мысленно ругаю себя за то, что бесцельно трачу время в интернете в поисках новых идей и интересуюсь всем подряд. Особенно я люблю интересоваться тем, что происходит в разных open-source и freeware проектах.

Буквально вчера мое внимание привлекла программа Unchecky, которая снимает всякие "галочки" в различных инсталляторах, не позволяя нежелательным приложениям устанавливаться. Про эту программу я знал давно, благодаря Хабру, и хоть она у меня не установлена, и в её эффективности я сомневаюсь, мне захотелось более подробно ознакомиться с её сайтом. Мне было интересно узнать, какие отзывы о ней пишут другие пользователи, поэтому зашел на ее баг-трекер. 

Мое внимание привлек этот баг http://unchecky.userecho.com/topic/819469-unchecky-conflict-with-browsers-and-windows-7-64-bit/

И вот уже сегодня получаю от пользователя жалобу на глюки при отображении окна Image Uploader под бетой Windows 10:

Unchecky bugs

По специфике артефактов видно, что Unchecky (возможно, в сочетании с Punto Switcher) негативно влияет на отображение диалоговых окон winapi (а в Image Uploader они используются повсеместно для построения интерфейса, в т.ч. используются вложенные диалоги). В других окнах такие глюки не наблюдаются. Видимо, автор перемудрил со своими хуками.

В общем, я с недоверием отношусь к программам с закрытым кодом, которые создают сомнительные сервисы и внедряют свои DLL в другие процессы, пусть и с декларируемой благой целью. Хуки - эта такая хрупкая вещь, которая при неграмотном использовании может привести к непредвиденным последствиям. Что интересно, программа Unchecky не смогла справиться со своей основной задачей - не смогла снять галочки Яндекса при установке Punto Switcher, с которым она конфликтует, чем доказала неэффективность такого подхода в борьбе с нерадивыми производителями программного обеспечения. В конце концов, создатели инсталляторов перейдут на использование элементов GUI, которые не создают нативных win32-контролов. Существует множество фреймворков, которые сами рисуют окна с нуля. И автору придется писать нереальные костыли, чтобы справиться с поставленной задачей. Правда, на помощь может прийти т.н. Acessibility и UI Automation, но ненадолго.

Так моя любознательность позволила мне сэкономить несколько часов на выявления бага не в моем коде и под операционной системой, которая у меня не установлена.

Как передать множество файлов одной команде из контекстного меню проводника Windows

You can archive it with my program called singleinstance (sourcecode).
No shell extensions involved.

The main idea is that one instance of my program will be launched per file you have selected. It is checking if another instance of singleinstance program is running, and using Inter-Process Communication to notify the existing instance that other files have been selected.

Do not forget to set option MultiSelectModel=Player, otherwise number of files will be limited.

Usage:

Usage: singleinstance.exe "%1" {command} $files [arguments]

Optional arguments for singleinstance (not passed to command):

--si-timeout {time to wait in msecs}

Sample registry file:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge]
"MultiSelectModel"="Player"

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge\Command]
@="\"d:\\singleinstance.exe\" %1 \"C:\\Program Files\\Perforce\\p4merge.exe\" $files --si-timeout 400"

Что должен знать идеальный C++ программист в вакууме

У нас в России зачастую неадекватные требования к программистам. 

Вот как могла бы выглядеть идеальная вакансия С++ программиста:

1. C++, стандарт, Страустрап/D&E/Джосаттис/Вандервуд, Дьюхэрст/Мейерс/Саттер, RAII, правило трех, exception-

safety, Александреску/Абрахамс-Гуртовой, type erasure, CRTP, NVI, SFINAE, Koenig lookup, Duff's device, Boost, Сик-Ламсдейн/Карлссон, TR1, TR on C++ performance, тест Степанова, forwarding problem, SPECS, C++0x

2. Компиляторы, особенности реализации стандарта, ограничения реализации, интринсики, отличия стандартных библиотек (контейнеры, rand), ABI, реализация виртуальных функций, виртуального наследования, исключений, RTTI, switch, указателей на функции и методы; оптимизации, copy elision (RVO, NRVO), sizeof на различных платформах, дефайны компилятора и среды, __declspec, ключи компилятора, empty-base optimization, статическая и динамическая линковка, манглинг, распределенная компиляция, precompiled header, single compilation unit, (strict) aliasing/restrict, inline/_forceinline, volatile

3. Мультитредность, обедающие философы, deadlock/race condition/starvation, атомарность, lock инструкции процессора, CAS или LL/SC, wait/lock/obstruction-free, ABA problem, написание lock-free контейнеров, spin-lock, TLS/per-thread data, OpenMP, MPI, map-reduce, critical section/mutex/semaphore/condition variable, WaitForSingleObject/WaitForMultipleObjects, green thread/coroutine, pthreads

4. Язык ассемблера x86, Зубков/Хайд/Дреппер/Касперски/Фог/Абраш, AT&T и Intel-синтаксис, masm32, макросы, стек, куча/менеджеры кучи, соглашения вызова, hex-коды, машинное представление данных, IEEE754, little/big endian, SIMD, аппаратные исключения, прерывания, виртуальная память, реверсинг, срыв стека и кучи, return oriented programming, alphanumeric shellcode, L1/L2/RAM/page fault и их тайминг

5. Аппаратное обеспечение, Хоровиц-Хилл, полупроводниковая электроника/спинтроника/фотоника, транзистор, схемотехника, микрокод, технология создания процессоров, VID/PID, Verilog/VHDL/SystemC, Arduino, устройства памяти (ROM → EEPROM, RAM, SSD, HDD, DVD), RISC/CISC, Flynn's taxonomy ([SM]I[SM]D), принстонский и гарвардский подход, архитектуры процессоров, архитектуры x86

6. Процессоры, конвейеризация, hyper-threading, out-of-order execution, спекулятивное исполнение, branch predict, префетчинг, множественный ассоциативный кэш, кэш-линия/кэш-промах, такты, кольца защиты, память в мультипроцессорных системах, тайминг памяти

7. Дискретная математика, K2, теорема Поста, схемы, конечные автоматы, клеточные автоматы, ДКА и НДКА

8. Вычислимость, машина Тьюринга, нормальные алгоритмы Маркова, машина Поста, диофантовы уравнения Матиясевича, лямбда-функции Черча, частично рекурсивные функции Клини, комбинаторное программирование Шейнфинкеля, Brainfuck, эквивалентность тьюринговых трясин, проблема останова и самоприменимости, счетность множества вычислимых функций, RAM-машина, алгоритм Тарского, SAT/SMT-солверы, теория формальных систем

9. Языки программирования, грамматики, иерархия Хомского, теорема Майхилла-Нероуда, лемма о накачке и лемма Огдена, алгебра Клини, НДКА -> ДКА, алгоритмически неразрешимые задачи в формальных языках, Драгонбук, Фридл, регекспы и их сложность, PCRE/POSIX RE, БНФ, Boost.Spirit + Karma + Qi/Ragel, LL, LR/SLR/LALR/GLR, PEG/packrat, yacc/bison/flex/antlr, статический анализ кода, компиляция/декомпиляция/обфускация/деобфускация, Clang/LLVM/XMLVM, GCCXML, OpenC++, построение виртуальных машин, JiT/AoT/GC, DSL/DSEL

10. Алгоритмы и комбинаторная оптимизация, Кормен/Скиена/Седжвик/Кнут/Ахо-Хопкрофт-Ульман/Пападимитриу/Шрайвер-Голдберг/Препарата-Шеймос, структуры данных, алгоритмы, сложность и символы Ландау, классы сложности, NP-полные задачи, графы и деревья, потоки в сетях, матрица Кирхгофа, деревья поиска (особенно RB-дерево и B-дерево), occlusion detection, куча, хэш-таблицы и идеальный хэш, сети Петри, алгоритм русского крестьянина, метод Карацубы и матричное умножение Винограда-Штрассена, сортировки, жадные алгоритмы и матроиды, динамическое программирование, линейное программирование, diff-алгоритмы, рандомизированные алгоритмы и алгоритмы нечеткого поиска, псевдослучайные числа, нечеткая логика

11. Машинное обучение, машинное зрение, OpenCV, image processing, OCR, фильтры Собеля, каскад Хоара, введение в психофизиологию зрения, TreeNet, нейросети, сети Кохонена, генетические алгоритмы, муравьиные алгоритмы, information retrieval/data mining/natural language processing, алгоритмы оптимизации, SVM, gradient boosting, метод отжига, hill climbing, подходы к моделированию AI

12. Численные методы, метод Гаусса, интер- и экстраполяция, сплайны, МНК, метод Эйлера и Рунге-Кутты, дихотомия/метод Ньютона, метод Симпсона, метод Монте-Карло, метод Галеркина, QR и LU-декомпозиция, FFT/STFT, сходимость и устойчивость

13. Теория информации, сжатие, Хаффман, RLE, LZ, коды коррекции ошибок, информационная энтропия, формула Шеннона, сложность Колмогорова

14. Криптография, Ященко, симметричная, асимметричная, Диффи-Хеллман, RSA, DES, AES, эллиптические кривые, хэширование (MD5, SHA, CRCn), DHT, криптостойкость, криптоатаки, WEP/WPA/WPA2 и атаки на них, цифровая подпись и сертификаты, HTTPS/SSL, доказательство с нулевым разглашением

15. Математика, Кнут-Грэхем-Паташник/Зорич/Винберг, матан, линал, комплан, функан, диффгем, теория чисел, дифуры/интуры/урчпы/вариационное исчисление/оптимальное управление, производящие функции, ряды, комбинаторика, теорвер/матстат/слупы/теория массового обслуживания, цепи Маркова, интегральные преобразования (Фурье, Лаплас, вейвлет), NZQRCHOS, матпакеты (Mathematica, Maple)

16.Архитектура и стиль кода, Макконнелл/Фаулер/Лебланк/Гамма/Александреску-Саттер, защитное программирование, паттерны, GRASP, UML, OOP/OOD/OOA, правило Лисков, метрики кода

17. Тестирование, юнит-тесты, функциональное, нагрузочное, интеграционное тестирование, тестирование UI

18. Инструментальные средства разработки, IDE, IntelliSense, отладчики (VS/Olly/WinDbg/kdb/gdb) и трейсеры (strace/ltrace), valgrind, системы контроля версий (SVN, GIT), merge/branch/trunk, системы именования файлов и бранчей, continuous integration, ant, code coverage, статический анализ, профайлинг, lint, багтрекеры, документирование кода, сборщики кода типа cmake

19. Фреймворки, Qt, moc и метаинформация, концепция слот-сигнал, Саммерфилд-Бланшет/Шлее, PoCo, промышленные библиотеки: GMP, i18n, lapack, fftw, pcre

20. Операционные системы, Рихтер/Соломон-Руссинович/Робачевский/Вахалия/Стивенс/Linux Kernel Internals, менеджер памяти, менеджер кучи и ее устройство (LAL/LFH/slab), менеджер процессов, context switch, реальный и защищенный режим, исполнимые файлы (PE/ELF/Mach), объекты ядра, отладочные механизмы (strace/ptrace/dtrace/pydbg, Debug API) и минидампы, bash, сетевой стек и высокопроизводительные сервера, netgraph, CR0, IPC, оконная подсистема, система безопасности: ACE/ACL и права доступа, технологии виртуализации, RTOS (QNX), программирование драйверов, IRQL, IRP, файловые системы, BigTable, NDIS/miniport/FS drivers/filter driver, Mm-, Io-, Ldr-функции, DKOM и руткиты, GDT/IDT/SDT, ядра Windows/Linux/BSD, POSIX

21. COM, OLE/ActiveX/COM+, ATL, Роджерсон/Таварес, апартменты, моникеры, дополнительные ключевые слова VC++, DCOM RPC, CORBA, TAO

22. Сеть, OSI, Ethernet, TCP/IP, TCP window, алгоритм Нейгла, сокеты, Protocol buffers/Thrift/Avro/ASN.1, AMQP, ICMP, роутинг, ARP, атака Митника, syn flood, HTTP/FTP, P2P, DHCP, SMB/NBNS, IRC/XMPP, POP3/SMTP/ESMTP/IMAP, DNS, WiFi/WiMax/GSM/CDMA/EDGE/Bluetooth, ACE, Wireshark

23. Графика, алгоритм Брезенхема, цветовые модели, трассировка лучей vs полигональная графика, OpenGL/GLSL/Open Inventor, DirectX/DirectShow/DirectAudio/HLSL, stencil/depth/alpha-test, графический конвейер в DirectX 11, шейдеры, модели освещения (Фонг), пропускная способность, fillrate, OpenCL/CUDA, ландшафты, лоды, тени, текстурирование и фильтрация, антиалиасинг, HDR, tone mapping

24. Базы данных, Грубер, ANSI SQL, T-SQL, ODBC, MySQL/PostgreSQL/MS SQL/BDB/SQLite/Sphinx, хранимые процедуры, триггеры, алгебра Кодда/А, Tutorial D, нормальные формы, оптимизация и выполнение запросов, структуры данных индексов, транзакции и ACID, CAP-теорема Брюера, NoSQL, key-value storage, шардинг, ORM (C++ ODB), ERD, OLAP

25. Прикладное программирование, C#/F#/Nemerle, Шилдт/Троелсен/Рихтер, генерики, yield, linq/plinq, рефлексия, AST, WCF, WinForms/WPF/Silverlight, AOP, фреймворки логгирования, .NET assembly

26. Функциональное программирование, Haskell/Ocaml/Scheme/Alice или Oz, SICP/TaPL/YAHT/Purely Functional Data Structures/Харрисон-Филд, HOF (map/fold/filter), монады, тайпклассы, АТД, система типов Хиндли-Милнера, ленивость/энергичность, логическое программирование (Prolog или Mercury), конкурентное программирование (Erlang или Oz)

27. Проектирование GUI, Раскин, юзабилити, основы дизайна и типографики, закон Фиттса, основы верстки, LaTeX

Resharper C++, впечатления

Поставил сие чудо от Jetbrains. Не перестаю восхищаться тем, что создают наши ребята.

Никогда не думал, что разработка на С++ в IDE может быть так же удобна, как, например, разработка на C# или Java.

Статья на хабре: http://habrahabr.ru/company/JetBrains/blog/255151/

Хотя, конечно, мои проекты не содержат какой-то сложной работы с шаблонами или фичами C++11, тем не менее, я очень доволен. По сравнению со стандартным IntelliSense или VisualAssist X, небо и земля. С++ разработчики более не могут считать себя обделенными.

Порадовала возможность настроить до мелочей Naming style для генерируемого кода и подсказок:

Reshaper Options

Не обошлось и без небольшой ложки дегтя. Resharper периодически зависал при регенерации кэша на моем проекте, пришлось отправить репорт вместе с архивом проекта в YouTrack. На удивление оперативно починили (в тот же вечер). Но есть положительная сторона: попутно я узнал, как искать дедлоки в .NET приложениях (чужих :)) с помощью WinDBG (по этой статье).

Ссылки на разные open source проекты на C++

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

Решил дать ссылки на разные опен-сурс проекты, которые меня когда-то заинтересовали, откуда я черпал идеи, или даже код.

InfraRecorder - CD/DVD burning solution for Microsoft Windows.
Автор программы  - Christian Kindahl, он также написал кросс-платформенную библиотеку ckCore.
Код у него очень чистый, GUI, также как в Image Uploader, написан с использованием библиотеки WTL. Не секрет, что идея начальной страницы (welcome page) для Image Uploader-a у меня возникла после использования этой программы. 

ShareX - is an open source program that lets you take screenshots or screencasts of any selected area.
Хорошая программа, объединила в себе бывшие ZScreen, ZUploader, ShareXMod, Greenshot. Но у неё есть фатальный недостаток (для меня) - написана на .NET. Однако, это не помешало мне позаимствовать оттуда кое-что.

Chromium - этот браузер все знают.
Когда мне хочется почитать красивый, чистый код на С++, я иду туда. Кое-что я позаимствовал и оттуда.

MPC-HC  - is an extremely light-weight, open source media player for Windows
Несмотря на то, что интерфейс и юзабилити этого плеера мне категорически не нравятся (по убогости они соревнуются с VLC), и я предпочитаю пользоваться проприетарным корейским плеером PotPlayer (который, если не ошибаюсь, был включен в Зал Позора библиотеки FFmpeg), мне этот проект показался интересным. Интересен, в первую очередь, из-за использования DirectShow. Для GUI использует библиотеку MFC, которая очень похожа на WTL.

TortoiseSVN - an SVN client, implemented as a Windows shell extension.
Хотя мир уже захватил Git, этот клиент верой и правдой служил мне многие годы. Некоторые наработки (в частности, работу с иконками) для написания shell-extension для IU я позаимствовал оттуда.

WinDjView - быстрая и компактная программа для просмотра файлов DJVU. Написана с использованием MFC. 
Мне она просто нравится. Ничего лишнего. (Разве что предлагает установить богомерзкий Яндекс.Бар в инсталляторе).

Protocol Buffers - язык описания данных, предложенный Google, как альтернатива XML. Protocol Buffers проще, компактнее и быстрее чем XML. Никак руки не дойдут использовать эту библиотеку в каком-нибудь проекте. 

Ну и просто полезная ссылка для C++ разработчиков:

Google C++ Style Guide - гайд, которого я частично придерживаюсь. Позволяет сделать код более читаемым и легко поддерживаемым, ограничивает тот хаос и вседозволенность, которые есть в C++.

Следующая страница >