@Linda-chan

Тег программизм в блоге Linda-chan

Linda-chan

В VB есть два вида деления: обычно и с отбрасыванием дробной части. Ну тоесть:

3 / 2 ==> 1,5
3 \ 2 ==> 1

Сегодня не могла понять, почему у меня при делении двух чисел вместо 255 получается 260. Вроде бы всё должно быть правильно. Были сомнения в точности одного из чисел, но там тогда получилось бы 256 или 254, но не такая разница. Поэкспериментировала, выяснила, что перед делением у чисел отбрасывается дробная часть, потом они делятся, и дробная часть отбрасывается снова. Вот и получилось. Честно говоря, обычно делю только целые числа и о такой особенности каждый раз очень хорошо забываю =_=

Linda-chan

VB6 любит твипы. OLE любит химетрики. GDI любит дюймы. Чтобы получить размер картинки в пикселях в StdPicture, нужно всё это конвертировать в миллиметры, потом в дюймы, потом узнавать, что там с DPI у экрана, и результат округлить. Круто же.

Linda-chan

Нашла в своей старой программе актуальное применение GoSub/Return.

Linda-chan

Вчера всю ночь воевала с интересным глюком в своих программах. Короче, есть программа CloudIM, которая использует всякие дропбоксы в качестве транспорта. Когда приходит сообщение, в трее начинает мигать иконка, как других мессенджерах. Кроме того, есть одна утилита, которая запускает на фоне другие утилиты и каждый этап показывает мигающими иконками в трее. Всё это прекрасно мигало в Windows XP, но оказалось, что в Windows 7 просто показывается первый «кадр». Сначала думала, что это как-то связано с тем, что на машину с Нанами, где запускались эти проги, я хожу по RDP, но и с монитором ничего не изменилось. Потом предположила, что это специально сделано в системе, чтобы программы не раздражали пользователя. Короче, начала разбираться. Для начала сделала простую программу, которая показывает окошко и при этом выводит иконку в трэй, а при закрытии окна – убирает иконку. Так же в окне была кнопка, которая меняет иконку на следующую, а сами иконки программа брала из стандартных (те, что выводятся в окнах сообщений вроде красного крестика – их можно специально получить, чтобы в твоей программе они соответствовали тому, что выдаёт система). Что интересно, программа работала нормально. Даже если зажать кнопку энтером, иконки всё равно очень быстро менялись, так что борьбу системы с раздражителями я отбросила. Тогда перешла к натурным испытаниям. Взяла ресурсы у CloudIM и начала использовать иконки оттуда вместо системных. И тут с самонирисованными иконками всё сломалось. Если очень упростить картину, то сначала программа добавляет иконку в трэй через Shell_NotifyIcon() с параметром NIM_ADD. А когда нужно мигать, эта функция вызывается с параметром NIM_MODIFY и манипулятором нужной иконки. Сами иконки заранее грузятся из ресурсов через LoadImage() с указанием размера 16x16 (вдруг есть другие). Так же проверяется, что у нас за система, и если что-то до Windows 2000, иконки выбираются 16-цветные. В итоге программа загружает две иконки и попеременно рисует их в трее. Но, как я уже сказала, всегда рисовалась только первая, а вторая – никогда, хотя куча тестового кода показывала, что все вызовы происходят, и даже в самом окне иконки рисуются нормально. Попутно выяснилось, что если иконка грузится с диска функцией VB6 LoadPicture(), то всё рисуется нормально, а вот LoadImage() даёт такой сбой. Впрочем, потом оказалось, что если LoadImage() вызвать с параметром LR_LOADFROMFILE, то происходит та же проблема. Что-то было не так с самой LoadImage(). Я проверяла кучу кода, поскольку она вызывалась не напрямую, а через прослойки. Попутно попробовала LoadIcon() (она грузит только иконки и только размера 32x32, растягивая и сжимая всё, что не соответствует, если альтернатив нет). Попутно я попыталась не подписывать екзешник, ибо в описании Shell_NotifyIcon() что-то было про подпись, но, правда, в контексте идентификации иконки не по паре «манипулятор родительского окна – ID иконки», а по GUID. Но и это не помогло. Потом обратила внимание на сами иконки. Дело в том, что CloudIM использовала две иконки. В одной (первый кадр) был конвертик 16x16 в вариантах 16 цветов и 256. А во второй была пустота (конвертик появлялся и исчезал при анимации), поэтому там было два изображения: 16x16 и 32x32 с одним только прозрачным фоном. Почему такие размеры? Возможно, я хотела заюзать пустоту где-то ещё, но не стала. Но главное, я сделала обе картинки двухцветными. Чтобы пустота не занимала лишнее место. Вот где-то тут всё и ломалось. Windows 98 прекрасно чередовала 16-цветную картинку и 2-цвентую. Windows XP прекрасно чередовала 256-цветную картинку и 2-цветную. А вот Windows 7 сломалась. Вывела первую, а вторую рисовать отказалась, причём ошибок функция Shell_NotifyIcon() не возвращала никаких. Просто в трее оставалась старая иконка. После того, как я пустую иконку привела в соответствие, всё начало мигать как полагается. В принципе, я сразу подумала, что что-то не так с иконками, и даже заметила различия в форматах, но меня смутила вторая программа, где никаких пустых иконок не было, все иконки однозначно в одном формате, ибо кадры выглядят одинаково, только один залит тёмным цветом, а второй – светлым. Там даже все иконки 16-цветные! Это мне и подпортило отладку. Поэтому, разобравшись с первой программой, я перешла ко второй. Проверила тамошние иконки, потом добавила их в ресурсы тестовой программы. И внезапно оказалось, что всё прекрасно мигает! Я запустила ту самую программу, и оказалось, что там тоже всё прекрасно мигает! Секрет оказался в цветах самих иконок и в длине этапов, которые они обозначали. Как я уже сказала выше, на каждом этапе запускалась утилита, которая что-то делала, а иконка показывала, что она что-то делает. Первый этап, как правило, занимал больше всего времени, а последующие выполнялись заметно быстрее. На машине с Windows XP для утилит работы было больше, а на Windows 7 – заметно меньше. Поэтому последующие этапы на Windows 7 проходили быстро, часто – быстрее времени смены кадра, а оно было примерно 250 мс. с поправкой на тормоза. Тоесть по факту иконка мигала только на первом этапе, а на последующих появлялся первый кадр и исчезал. Что же не так с первым этапом? Если посмотреть на стандартную 16-цветную палитру, то можно заметить там пары цветов типа тёмно-зелёного и светло-зелёного. Все пары образуются подобными значениями в разных компонентах. Тоесть чисто по цифрам там всё сбалансировано. Просто глаз разные цвета воспринимает по-разному. И если отличие светло-зелёного от тёмно-зелёного видно сразу, то тёмно-синий от светло-синего отличается не так разительно и в зависимости от настроек дисплюя может вообще не бросаться в глаза. И по счастливому стечению обстоятельств первый этап обозначался именно синим цветом. Тоесть оно мигало, но это было не заметно. Кстати, пока я испытывала вторую утилиту, внимательно вглядываясь в иконки, я словила ещё один странный глюк. Неожиданно иконка одного из этапов не пропала и в трее образовалось две иконки, которые ещё и жили каждая своей жизнью, хотя иконка должна быть одна: программа не создавала никаких дополнительных. Правда, тут всё было ещё проще: увлёкшись, я прозевала запуск этой утилиты по планировщику, и он пришёлся как раз на тестовый запуск, а проверку, не запущена ли уже копия программы, я сделать забыла.

Linda-chan

В очередной раз наткнулась.

# Quazi-ultra newer version! Now with RAR!
# REWRITE THIS WHOLE THING, BLYAT!!!

Linda-chan

Dysfunctional programming language.
via https://www.joelonsoftware....-first-billg-review/

Linda-chan

Понапишут говнокода, а потом рассказывают, что на путоне у них всё быстрее работает и не вылетает.
http://www.commitstrip.com/...the-end-of-the-road/

Linda-chan

Три часа упражнялась писать на ассемблере COM файлы, компилировать их, все дела. А потом выяснила, что DOS stub – это EXE файл, а не COM =_= И откуда я это взяла?

Linda-chan

Мы живём во времена, когда Дельфи – это ультрабыстро, ультраэффективно, ультракомпактно и почти не блевотно.

Linda-chan

Забавный путь у моего самописного скринсейвера. Сначала я написала его на VB5 по аналогии с примером от MS. Потом переписала на C, взяв за основу пример GUI болванки из VC++ 6. А теперь вот портировала на FreeBasic.

Linda-chan

Разработчик VirtualDub про Рэймонда Чена.

I love reading his blog because it's full of great information, but I hate reading it because every time I do I have to fix more bugs.

http://www.virtualdub.org/b...ivot/entry.php?id=57

Linda-chan

Как заставить панель управления показывать нормальное название скринсейвера, а не имя его екзешника:
https://stackoverflow.com/q...n-the-drop-down-list
Как всё же заставить панель управления показывать нормальное название скринсейвера, а не имя его екзешника:
https://stackoverflow.com/q...own-in-the-drop-down
Вот как раз столкнулась со вторым вариантом: всё есть, строка в ресурсах, файл в System32, а не работает. Оказалось, файл назывался DesktopScreenSaver.SCR. Переименовала в DesktopS.SCR, и тут же всё заработало как надо.

Linda-chan

Достать старые бэкапы, которые обычно делаю перед тем как начать вносить изменения в программу. Распаковать их. Последовательно сверять WinMerge, пытаясь понять, что изменилось. Наваять ченджлог.

Linda-chan

Почему на FB DOS приложение написать можно, Win32 приложение написать можно, а Win16 приложение – нет?

Linda-chan

Решила на FreeBasic написать простенькую программу. Уже в лёгком шоке. Оказывается, в FreeBasic нельзя просто взять и получить командную строку в оригинальном виде. Есть функция Command(), которая должна возвращать её, но на деле рантайм делает так. Сначала он парсит командную строку, разбивает на элементы и даёт доступ к результату через ARGC/ARGV хреновины. Потом при вызове Command() он СОБИРАЕТ ПОЛУЧЕННОЕ В ОДНУ СТРОКУ и возвращает. Тоесть это:

1 2 3 "4 5 6"

Превращается в это:

1 2 3 4 5 6

Более того, он без спросу, типа для совместимости с линупсом делает развёртывание масок на уровне самой программы, а не оболочки. Это:

*.txt

Превращается в это:

1.txt 2.txt 3.txt

Сюрприз, сюрприз! В доках сказано, как это непотребство выключить, но во-первых для каждой платформы это делается своим костылём, а во-вторых оно не работает.
Короче, действовать придётся, как водится, методом кишлака: GetCommandLine() и вычленением екзешника.

Linda-chan

Поборола в программе баг, который проявляется в Windows 98. Обратная совместимость at it's best!

Linda-chan

Печально, что в интернетах нынче днём с огнём не сыщешь инструкций по сетевой настройке вибишных ActiveX EXE в современных системах. В последний раз я это дело запускала в Windows 98 (и вроде бы в XP) через DCOM и Remote Automation, а сейчас никак не могу.

Linda-chan

Кстати, ранее я похожую фигню проворачивала с постилкой на Тумблер. API v2 в VB я не осилила, поэтому просто использовала генерирующийся для каждого запроса скрипт на Руби, где уже был клиент для Тумблера.

Linda-chan

Заработал постинг на Dreamwidth. Сначала они сделали форвардинг на HTTPS, и мой HTTP клиент для прог на VB отвалился (всё руки не дойдут переписать и добавить поддержку HTTPS). Не беда, взяла WinHTTP клиент. Но тут оказалось, что на DW ещё и шифрование подкрутили, а у меня XP. В принципе WinHTTP работает на Нанами, но мне лень запускать постилку на отдельной машине. Попробовала пару костылей, в том числе всёже запуск куска постилки на Нанами через DCOM, но что-то ничего не заработало. В итоге плюнула и запилила вызов WGet из программы. UNIX way, блеать! Осталась, конечно, пара недоработок, но продукт внутренний, и по ходу дела я доведу всё до ума.

Linda-chan

Сначала не могла понять, о чём ведут речь джентльмены в камментах:
http://juick.com/m/2952793#3
Всё же я никогда не привыкну к тому, что в светлом настоящем использование переменных без какого-либо объявления – норма и признак хорошего языка.

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.