
Dollars that make your program run faster
https://www.aivosto.com/articles/stringopt.html
Речь про «Mid$() vs Mid()», а не то, что вы подумали.
Dollars that make your program run faster
https://www.aivosto.com/articles/stringopt.html
Речь про «Mid$() vs Mid()», а не то, что вы подумали.
Попутно выяснила занятное. У функции DeviceIOControl(), которая позволяет давать команды устройствам и получать от них всякие данные (как раз через неё пишутся и читаются данные reparse point), есть такие параметры: входной буфер с размером, выходной буфер с размером, сколько было записано в выходной буфер, ну и ссылка на OVERLAPPED для асинхронной операции. Буферы опциональны в зависимости от устройства и команды, параметр, возвращающий количество записанного, – тоже, ну и OVERLAPPED. Ну, у меня при записи в reparse point операция синхронная и используется только входной буфер, поэтому в функцию передаю только входной буфер и его размер, а всё остальное – NULL. Ну и программа в результате вылетает. Оказалось, что, если параметр, принимающий OVERLAPPED, установлен в NULL, то параметр, принимающий количество записанного в выходной буфер, должен ссылаться на актуальную переменную, даже если выходной буфер – тоже NULL. Оказывается, Microsoft не только не добавила проверку этого параметра, но и использовала его значение где-то внутрях функции, о чём указала в документации. В общем, не делайте так =_=
Короче, написала я прототип программы, которая данные хранит в reparse point. И оно работает: появляется файл длиной ноль байт, который, поскольку система не знает, что это такое, можно только удалить. Написать код, который вытащит эти данные, разумеется, – задача тривиальная, тоесть для маскировки подходит мало, но тут именно что нужно писать код или искать очень специальную утилиту, ибо никакими блокнотами такие файлы не открываются.
А вот интересно... Можно ли сделать кастомную reparse point так, чтобы хранить в ней какие-то свои данные, не связанные с файловой системой? Типа как маскировка данных в файловых потоках, только ещё круче, что прямо код надо писать, чтобы вытащить эти данные.
// Возможно, этот пост содержит часть ответа на вопрос из предыдущего.
Написала код, который изучает симлинк (на самом деле – reparse point) и выдаёт то, на что симлинк ссылается. Проверила – работает. Почти приступила к применению, но тут заметила, что в некоторых случаях код работает неправильно, выдаёт странные результаты. Начала изучать двоичные данные, которые парсит программа, и поняла, что что-то с ними не так: одни поля налезают на другие, хотя в других случаях всё с полями нормально. Начала копаться в MSDN. Оказалось, что документация про всему этому есть, но какая-то туманная, везде недосказанность, функций всего ничего, объясняются только общие концепции. Продолжила копать и повторно открыла для себя раздел «Open Specifications», в котором предельно чётко описаны все структуры, которые в этих самых reparse points используются. И оказалось, что в MSDN была описана одна структура, а в реальности используются другие структуры, по одной на каждый тип симлинков. А та, что описана в MSDN – вообще для сторонних реализаций. В итоге код придётся переписывать и снова всё тестировать. Но я всё равно не понимаю, чего Microsoft так тряслись над этими reparse points так, словно это пентагоновский секрет?
Почему структура GUID не соответствует текстовому виду этого самого GUID?
Узнала, что JavaScript поддерживает запись двоичных чисел как «0b10101010». В смысле, в принципе поддерживает двоичные числа.
Не, я знаю, что For Each, не смотря на использование варианта, работает быстрее, чем просто For с индексом, но чтобы настолько... Коллекция, 240 тысяч элементов типа Long, с которым в цикле производятся действия (коллекция перегоняется в массив). For с индексом пережёвывает коллекцию за тридцать-сорок секунд. For Each проносится по коллекции за 0.12 секунд.
Научилась делать ботов-уведомляторов для телеграмки на VB. Документация по API, конечно, написана в лучших традициях Роберта Гейла. Особенно порадовало описание отправки картинок и файлов на сервер, типа, можно указать URL, можно указать ID, а можно «КАК БРОУЗЕР ЗАГРУЖАЕТ КАРТИНКИ НА САЙТ». Я час ломала голову, пока не додумалась, что оно в отправляемой форме хочет имя файла, даже если это имя потом нигде не будет использоваться.
Я тут пишу кое-что, и снова столкнулась с такими мерзкими, но неизбежными вещами, как байтовые буферы, в том числе запихнутые в строки. Всвязи с чем два наблюдения.
1. У VB нет встроенных механизмов, чтобы скопировать часть одного байтового буфера в другой. CopyMemory().
2. Строки в VB – юникодные, но могут быть ANSI, если хорошо попросить. Понять, в каком формате строка, очень трудно, но сам VB знает, что там внутри.
Разбирая старые завалы неожиданно поняла, что некоторые библиотеки, которые у меня, вроде как, актуальны, я написала в 2005 году. Например, библиотека для субклассинга окон, которую я использую то тут, то там, была скомпилирована 10.10.2005 и с тех пор не менялась.
В Windows можно выбрать локаль для пользователя, и от неё будет форматироваться всякое вроде чисел и дат. А чтобы форматировать оные числа и даты, есть ряд функций вроде GetNumberFormat() и GetDateFormat(). Они позволяют отформатировать что-то, используя собственную маску, используя системную маску или то, чем системную маску переопределил пользователь в региональных настройках. Конкретно дата-время форматируются двумя разными функциями, которые выполняют свою работу хорошо, но всё же один нюанс остаётся за кадром: порядок следования. Ну, тоесть, я с детства знаю, что сначала идёт дата, а потом время: возможно, в школе так научили. Но вот есть программы вроде Notepad2, которые сначала вставляют время, а потом – дату. И в локали нет ничего на эту тему, только отдельный формат даты и отдельный формат времени. И как быть? Вообще, есть какие-то правила на сей счёт?
Два часа билась над алгоритмом перевода химетриков в пиксели через миллиметры и дюймы. Пришлось даже писать для себя мини-гайд о сути операции деления. Совсем плохо стало у меня с математикой. Последствия коронки?
Фан фэкт: авторка отборного NTR по «Ragnarok Online» какое-то время была VB разработчицей. Возможно, это как-то связано.
Стряхнула пыль с подзабытого искусства писать апплеты панели управления Windows.
А! Чего я занялась сертификатами?
Я тут пытаюсь писать новую библиотеку для HTTP запросов, поскольку старая, использующая православный WinInet, начала не справляться с современными интернетами даже в современных виндах. Хотела заюзать WinHTTP, но и он тоже где-то позади прогресса.
Забавно, что сначала MS придумала одну библиотеку для интернетов, потом другую, потом внедрила их в другие библиотеки и технологии, а потом просто забила. Сейчас, если что-то и существует, то где-то в дотнете и не понятно, в каком состоянии.
Ну в итоге я и решила делать костыль с запуском wget на фоне, хоть это и не мой метод. С ним пока всё нормально, так что...
Ну и где-то во время тестов обнаружилось, что wget ругается на мои сайты, говоря, что у меня неправильный сертификат. Разработку пришлось отложить в сторону и заняться сертификатами.
Не люблю такие вложенные дела =_=
В поисках одного кода нашла модуль, который писала ещё на первой работе. Там проверялось имя компьютера на соответствие имени компьютера, за которым я работала. Ностальгия...
Зачем-то написала библиотеку, совместимую с RunDLL32.
Культура «пет-проектов» должна умереть.
Я за утилитарный подход: нужна тебе какая-то программа, чтобы делать то, что другие не могут или могут, но не так, как тебе нужно – открываешь среду разработки (или текстовый редактор), пишешь код, а потом его используешь. Со временем у тебя таких программ набирается тонна, и ты все их используешь с той или иной периодичностью, выпиливая баги и модифицируя под новые условия. Можешь даже делиться с народом удачными или потенциально общественно полезными программами.
Ну, типа как, не нравится тебе как дверца в шкафу весит – берёшь, перевешиваешь её и пользуешься. Можешь даже кому-то ещё перевесить, если кто нуждается.
В культуре же «пет-проектов» оные проекты предстают в виде эдакого особого объекта, который необходимо выдавить из себя и упорно заниматься им хотя бы раз в день.
Одни вопрошают, каким бы «пет-проектом» заняться, ибо ничего придумать не могут, а надо. Другие рекомендуют придумать себе «пет-проект» и регулярно заниматься им, чтобы потенциальный хээр видел, что ты – серьёзный кандидат, «пет-проектом» занимаешься, а не объебос какой-то. Третьи жалуются, что десяток «пет-проектов» не оставляют времени работу работать и личной жизнью заниматься.
Ну, вы же не ломаете с утра до ночи голову над вопросом, какой бы гвоздь куда-нибудь вбить, а потом ежедневно гнуть его по-всякому, чтобы однажды кому-то его показать и доказать, что ты серьёзный чел, с гнутым гвоздём в стенке, а не объебос какой-то.
Написала тестовую программу, которая парсит заголовки Win16 и Win32 программ, показывая интересные данные вроде версии подсистемы, типа подсистемы, контрольной суммы, имени и описания модуля, ну и так далее. А теперь не знаю, что делать со всем этим кодом.