mabu
программирование Все эти новые версии .Net поддерживают ещё больше архитектур, теперь и линукс, и всякие ARM64, и МАС, и IpHone, но они не могут справиться с такой простой задачей как работать на WinXP, просто удивительно!
mabu
программирование Спойлер: программа 2048 байт

Обновил программу, которая скачивает страницу сайта и выводит в стандартный поток вывода: теперь можно указать URL в параметре (да, теперь адрес https//www.lindachan.net/ не будет жестоко зашит в программе, надеюсь, линдочан не будет сильно возмущаться). Вывод можно перенаправить в файл. Конечно, скачивает не только html‐страницы, но вообще любой файл.

Цель программы: уложиться в минималистичное количество байт средствами компилятора, без модификации екзешника. Пока влез в 2048 байт, с некоторыми хитростями. Например, объединил секции .text и .data, IID и CLSID задал вручную иначе они уходят в секцию .rdata.

Секция .idata не захотела объединяться с остальными секциями, чудеса какие‐то. Но это объединение не уменьшило бы размер, потому что .idata заполнена, итак уже 512 байт. Забавно, вызов какой‐ниибудь новой функции добавит её в таблицу импорта — и секция .idata переполнится и будет занимать уже не 512, а 1024 байта, что увеличит екзешник, который теперь будет окажется 2560 байт.

Программа консольная, можно сделать и GUI, но тогда будет пожирнее и помаслянистее, чем 2048 байт сейчас.

Ссылка на исходный код:
github.com

Релиз:
github.com
Linda-chan
программизм QuickBasic от QBasic помимо наличия компилятора отличается ещё и возможностью запилить проект из нескольких модулей. Как-то раньше не требовалось пилить программы из нескольких модулей на QB ^^'
Linda-chan
DOS программизм В порыве ностальгии научилась на QuickBasic получать PSP программы, а оттуда – блок с переменными окружения. Говорят, что за ним находится имя текущего екзешника, но пока это работает только в DOSBox.
mabu
программирование В отладочных целях заполняю выделенную память плохой едой: байтами BA AD F0 0D.
Bad Food, плохая еда.
Так делает Корпорация Микрософт, в отладочных версиях.
Ещё иногда заполняют выделенную память мёртвой говядиной DE AD BE AF.
janPona
программирование rust Начал изучать язык Rust. В прошлый раз было как-то боязно начинать из-за его низкоуровневости и концепции владения. А сейчас как-то сравнительно легко вкурил её, потому что понял, для чего она нужна.

Дико зашли растовские enum-ы и паттерн матчинг, напомнило функциональщину (я такое ещё помню из Elm). Очень в тайпскрипте этого дела не хватает.

На редкость приятное ощущение изучения нового языка, когда гордишься собственноручно написанной консольной программой уровня лабораторки для 1 курса.
Linda-chan
программизм В программизме самое сложное – рассматривая очень старый, местами неказистый, код, не думать, что человек, который его писал – не очень умный человек, а вот сейчас-то у тебя опыта больше и такую фигню ты больше писать не будешь. Короче, есть такая функция, GetLongPathName(). Думает она то же, что и GetShortPathName(), но в обратную сторону. В Windows 9x и NT4 её не было, и народ там страдал. Функция полезна, например, тем, что позволяет сделать регистр символов в произвольном имени файла как оно на самом деле на диске. Но в Windows 9x её нет, как и в NT4, а описание GetShortPathName() рекомендует использовать FindFirstFile() для нужного нам эффекта. Поскольку эта функция возвращает не прямо полное имя файла, а только имя без пути, нужно пробежаться по всему имени файла и для каждого компонента применить эту функцию. Муторно, но реализуемо, что я и сделала в далёком 2013 году на Цэ. Но вот мне потребовалось то же самое на FreeBasic, и, глядя на тот код, стало грустно. Решила написать заново. Получилось довольно ловко, хитро и гораздо компактнее. И всё заработало! Но потом полезли нюансы, каждый из которых надо было учесть, что влекло увеличение кода и потерю ловкости. Но самое печальное – не было всего этого в коде на Цэ, и из него не лезли все эти нюансы! Короче, пострадала, попечалилась и портировала код на FB, заодно отловив один баг. И вроде не такой уж и неуклюжий код то был, тоже ловкий, просто большая часть непонятного мусора – управление строками. В итоге у меня снова всё работает под Windows 9x и, что немаловажно, на NT4.
Linda-chan
Windows программизм Есть такая функция FindFirstFile(), которой передаём имя файла или путь с масками. В ответ получаем набор найденных файлов, точнее, данные о первом найденном файле и манипулятор, которым можно перечислить остальные элементы набора. Забавное случается, если попытаться передать функции имя каталога с слэшем на конце. Функция прекрасно что-то находит, возвращает манипулятор и данные, только вот в данных – пустота, всё по нулям. Что именно она там находит, я так и не выяснила. GetLastError() возвращает ERROR_FILE_NOT_FOUND, FindNextFile() говорит, что файлов не осталось.
ndtimofeev
программирование А есть какой-нибудь инструмент для выбора цветов? Нужно в рантайме указать цвет фона, цвета соседей и получить на выходе что-то что будет смотреться относительно контрастным на их фоне и в идеале не особо заставлять смотрящего страдать.
Linda-chan
Windows программизм Есть такие функции как GetOpenFileName() и GetSaveFileName(), которые выводят диалоги открытия и сохранения файла. Они могут показывать диалог в новом стиле и диалог в старом стиле (как в Windows 3.xx). При чём флаг OFN_EXPLORER прямо не влияет на выбор вида диалога, и в обычных ситуациях всегда показывается новый диалог независимо от этого флага. Чтобы показать старый диалог, нужно не только не указать этот флаг, но и подкинуть функции хук, который будет всегда возвращать FALSE (тоесть сигнализировать, что сообщение должна обработать библиотека, а не код хука). Это присказка. Сказка в том, что в Windows 2000 и Windows XP новым был диалог с панелькой неких предопределённых папок слева (которые правились через TweakUI). В Windows Vista диалог переделали, и в левую часть впилили дерево каталогов, а сверху убрали раскрывающийся список с деревом каталогов, впилив вместо него хитрый текстбокс с путём к текущему каталогу. И все нормально написанные программы в новой системе тут же начали показывать новый диалог, если, конечно не использовали хитрые шаблоны. Но я заметила, что были программы, которые выводили диалог, выглядящий как в Windows XP. Экспериментируя, я выяснила, что флаг OFN_EX_NOPLACESBAR, который в предыдущих версиях системы отрубал сайдбар слева и превращал диалог в такой, какой был в Windows 9x или NT4. В Windows Vista и выше оно работает примерно так же, и диалог даже начинает выглядеть примерно так же. Но это всё равно не то. Оказалось, что для того чтобы получить диалог как в XP. нужно провернуть тот же трюк, как со старым диалогом: указываем флаг OFN_EXPLORER и подкидываем такой же хук (что характерно, прототип у старого и нового хука одинаковый, но оба задокументированы отдельно друг от друга). И получаем немного ностальгии.
Linda-chan
программизм windows_95 Забавное. Есть функция ExpandEnvironmentStrings(), которая берёт строку и разворачивает в ней переменные окружения. Работает она типично: сначала запускаем, передавая NULL вместо приёмного буфера и 0 в качестве длины этого буфера, получаем нужный размер буфера и запускаем второй раз с подготовленным приёмным буфером. Некоторые функции, работающие по этому принципу, NULL не хотят, но там можно просто пустой буфер передать (хоть указатель на int с нуликом). Windows 95 возмутилась и тому, и тому варианту, GetLastError() указывает на ошибку в параметрах, хотя более поздние версии работают нормально. Выяснилось, что нулевой длины буфер функция не принимает, поэтому пришлось первый вызов делать с буфером длиной два символа, и тогда всё заработало, как надо.
mabu
программирование Получил IPv6‐адрес от сотового оперятора. Раздал вайфай с телефона, компьютер тоже получил IPv6‐адрес.
Запустил вебсервер на компе и проверил: гагл его видит.
Я даже порты никакие не перенаправлял, как это обычно происходит на роутёрах с IPv4.
Linda-chan
программизм windows_95 IsDebuggerPresent
Windows NT – Yes
Win95 – No
А в Windows 98 точно добавили. Забавно, что в той справке (которая как раз во времена Windows 95 была выпущена, win32.hlp) import library не указана, а указано в самом тексте:
This function is exported from KERNEL32.DLL.
janPona
программирование Решил перейти на разработку в контейнере. Ибо ну его нахуй, NPM сейчас заразный — пострашнее коронавируса.
Вот эта штука, например, куки ворует: github.com
А в будущем вообще можно подцепить шифровальщика
mabu
программирование Теги для оформления

* `<var>` переменные, параметры функций, константы (казалось бы), математические переменные, переменные в формулах в физике;
* `<code>` имена функций, ключевые слова, лексемы;
* `<cite>` название произведения, например: книги, статьи, эссе, стихотворения, партитуры, песни, сценарии, фильмы, телешоу, игры, скульптуры, картины, театральные постановки, пьесы, оперы, мюзиклы, выставки, отчёта по судебному делу, компьютерные программы и так далее;
* `<cite>` имена файлов (заголовочные файлы) как источник API‐функций программы, библиотеки (вот это Я сам придумал, возможно Я не прав);
* `<dfn>` определение термина или понятия, в атрибуте title даём определение;
* `<dl>`, `<dt>`, `<dd>` список терминов, корпорация Микрософт размечает парметры функций в справке;
* `<kbd>` сочетания клавиш, названия команд и вообще всё что нужно вводить с клавиатуры, голосом, жестами;
* `<samp>` вывод программ, консольный вывод;
* `<abbr>` аббревиатуры, расшифровка в атрибуте title;
* `<address>` блок с контактной информацией, адреса, электропочта, мессенджеры, ссылки на сайты и соцсети;
* `<code>` код;
* `<del>` удалённый текст;
* `<ins>` добавленный текст;
* `<mark>` меченый текст, «обратить внимание», HighLight‐текст;
* `<figure>` врезка;
* `<figcaption>` заголовок (подпись) врезки;
mabu
программирование Каким тегом размечать имена файлов в html?
Я понял, что можно использовать тег <cite>:

Элемент <cite> представляет название произведения, например: книги, статьи, эссе, стихотворения, партитуры, песни, сценарии, фильмы, телешоу, игры, скульптуры, картины, театральные постановки, пьесы, оперы, мюзиклы, выставки, отчёта по судебному делу, компьютерные программы и так далее. Это может быть работа, которая цитируется или на которую ссылаются подробно (источник литературы), или это может быть просто работа, которая упоминается мимоходом.
Файлы на компьютере — это произведения, а заголовочные файлы или файлы справки — источники литературы для статьи, следовательно, имена файлов допустимо оборачивать в тег <cite>.
mabu
программирование Хорошим трюком можно признать привычку написания прототипа на другом языке программирования. Не том, на котором будет писаться игра. В этом случае вам обязательно придется переписать его прежде, чем он попадет в настоящую игру.
mabu
программирование Идея применения бинарного поиска к нахождению «невозможных» (таких, которых «этого не может быть!») ошибок. Ошибок в сложном коде, который выглядит корректно, но таковым не является. Все просто: удалите половину кода. Запустите и проверьте, появляется ли ошибка. Нет? Значит ошибка была в удалённом коде. Верните его на место, удалите половину от этой половины. Посмотрите, появляется ли ошибка. И так далее (идею вы поняли, да?).
egplife
programming oberon GitHub, [03.10.21 04:54]
🔨 1 new commit (https://github.com/BIOORGANICOBERON/BIOORGANICOBERON/compare/27cddbbbd325...26ebe8795159) to BIOORGANICOBERON:ARXIPSIXIKA:

26ebe87 (https://github.com/BIOORGANICOBERON/BIOORGANICOBERON/commit/26ebe87951593111a63f1ac6ed97e69c236d2aca): OBERON SEED BASE FUNDAMENT PLATFORM by egp
janPona
программирование говнолямбдинг Ну вот я и фуллстек у себя на работе. Пока нормальные люди увольняются, я, как жёлтый пёсик "this is fine", никуда не спешу из горящего дома.

Почему-то про serverless вообще и AWS Lambda в частности бытует стереотип, что это такая несерьёзная фигнюшка, для которой код можно писать как курица лапой (как петух куском помёта, на деле). Мол, оно же для этого и создано, пиши грязно, деплой быстро, посасывай смузи. Ну или что там принято посасывать.

И пишут лямбдочки в виде лапшей на 1500 строк каждая, деплоят в прод (руками, разумеется, CI — для тру́сов), а потом увольняются.

Веселуха начинается, когда что-то ломается, и это надо дописать или усовершенствовать.

И начинаются прикольные моменты, например, когда метод, называющийся parseEmail, на самом деле принимает распаршенный email и кладёт его во внешний сервис, а не делает то, в честь чего, вообще-то, назван. Или вроде десятка файлов в папке models. Пустых файлов.

И никакой типизации, Typescript для лохов же, ты чо, пёс, в лямбда-мирке свои законы. Нам воле будешь типизировать, а тут пацаны.

Ни тестов, мать бы их растак, ни даже возможности их толком прикрутить, не выкорчевав под корень весь код.

А ещё создаётся впечатление, что трушные aws-лямбдаёбы разрабатывают сразу в облаке. То есть, у них нет режима, когда ты пишешь код и запускаешь его на своём компе. Хорошо, что я не трушный, а то бы тоже: написал пять строчек, деплой, ещё строчку поправил, ещё деплой и т.д.

Стартап это наверное очень весело. Но не для тех, кто приходит потом.
Linda-chan
программизм Пока мы ломали копья вокруг FreeBasic и FASM, случилась X Y проблема.

Как оно было? Моя библиотека (которую используют почти все мои программы, написанные на VB6) содержала пару функций для записи сообщений в журнал Windows, так же она содержала ресурс с шаблоном сообщения, который использует системный просмотрщик событий, ну и прописывалась источником этих самых шаблонов (источник событий). В Windows NT4/2000/XP всё работало офигенно: события пишутся, выводятся, замечательно. В x64 Windows 7 выяснилось, что просмотрщик не видит шаблона. Запись в реестре есть, файл есть, шаблонов нет.

«Разные разрядности!» – решила я и даже как-то не подумала посмотреть, что там с другими истониками. Тоесть x64 система почему-то не видит ресурсов в x86 DLL.

Однажды у меня дошли руки до сооружения отдельной DLL с ресурсом для x86 систем и отдельной – для x64 систем. Тоесть при установке программы копируем нужный файлик, и система его радостно использует. Исходную библиотеку я пишу на FreeBasic (предыдущая версия была вообще на VC++ 6), ну и эти ресурсные я решила запилить на FreeBasic.

Тут же появилось две проблемы. Во-первых тяжёлый фрибишный рантайм, впиливающийся в код библиотеки (у VB рантайм, например, хранится в легендарном MSVBVM60.DLL). Оказалось, что чтобы его искоренить, нужно всю компиляцию делать руками и городить костыли. А во-вторых, компиляторы, поставляемые с FreeBasic работают по принципу «Делаю бинарник только своей разрядности». Тоесть x86 бинарник делается x86 версией компилятора, x64 – x64 версией компилятора, а под линупс (if any) вообще под линупсом надо собирать. А я на XP :}

И тут вспомнился, собственно, FASM, который по своей природе не содержит рантаймов (ассемблер же) и собирает где угодно какой угодно бинарник (ассемблер же). Им я и сделала нормальные ресурные DLL.

А потом я задумалась, как их устанавливать. В реестре, в записи источника событий не указывается отдельно разрядность. Но что если просмотрщик будет не той же разрядности, что и система? Начала экспериментировать на x64 системе.

И тут я сделала два важных открытия. Во-первых, источник событий для моих программ прописывался без пути, просто именем файла. А во-вторых, он лежал в SysWOW64, поскольку x86. Иными словами, просмотрщик не то что не мог загрузить ресурс, он тупо не находил файл там, где ожидал его увидеть – в System32. Когда я прописала абсолютный путь, все события сразу же начали показываться нормально и с x86 DLL. А когда я посмотрела, как событие VB6 рантайма прописано по соседству, то нашла там запись в духе «C:\Windows\SysWOW64\msvbvm60.dll».

Всё это время я решала не ту задачу. Настоящим решением должно стать прописывание полного пути к DLL для новой библиотеки (при установке программы, которая её использует) и создание симлинка в System32 для старой (там код я поправить уже не могу).
Linda-chan
программизм йумор This function dates back to Windows 3.1, back when a powerful computer had 4MB of memory, and your typical computer had much less. Software development kits cost thousands of dollars, and the expectation was that if you bought one, it was because you were a professional developer who understood how the system worked down to a very low level. Programming was hard because nobody expected it to be easy.devblogs.microsoft.com
Linda-chan
программизм Одна из приятных особенностей использования FASM заключается в том, что чтобы сделать x64 бинарник, не нужно запускать x64 компилятор на x64 системе. Достаточно указать в исходнике, что это будет за бинарник, и нужный код будет сделан даже на x86 системе.
Linda-chan
программизм Пыталась сделать на FreeBasic resource only DLL (источник сообщений журнала событий Windows). Собственное, мне нужно было две версии: x86 и x64 для разных версий Windows. Делалось это весьма просто, но несмотря на отсутствие какого-либо кода в единственном BAS файле, FB писал в екзешник рантайм и всё такое. Пыталась побороть это ручной компиляцией без рантайма. А потом вдруг вспомнила, что у меня же есть FASM, у которого по понятным причинам нет никакого рантайма. Так я снова вернулась к ассемблеру =_=
mabu
программирование Пишу игру. У нас есть сцена, на которой расставлены игровые объекты. И есть экран монитора, на который проецируются эти объекты. Игровые объекты расставлены по координатам относительно сцены, но когда сцена визуализируется на экране, то уже имеют экранные координаты. Экранные координаты объекта вычисляются как произведение матрицы проекции на координаты объекта на сцене.
С другой стороны игрок взаимодействует с экраном монитора: щелчки и перемещения мыши имеют экранные координаты, поэтому чтобы понять по какому объекты шликнул игрок необходимо экранные координаты перевести обратно в координаты сцены.
janPona
программирование радиот умпутун благодушнило Не так давно Бобук и Умпутун сказали, а Грей подтвердил, что «адекватный фронтэндщик на фреймворке никогда не станет писать, даже большое приложение. Давно же уже есть веб-компоненты». Они там в своём манямирке совсем, я гляжу, упоролись.

Да, блэт:

— адекватный ДБА никогда не заюзает постгрес, есть же файловая система. Складывай данные в JSON, напиши собственный индекс, хватит душить слона;

— адекватный девопс никогда не заюзает докер, линукс ведь умеет в контейнеризацию на уровне ядра;

— адекватный сисадмин никогда не будет ставить операционную систему. Есть CPU, прекрасно умеющий выполнять машинный код — к чему лишний тормозной оверхеад?

— адекватный криптовалютчик никогда не свяжется ни с программным, ни с аппаратным блокчейном, ведь что такое блокчейн? Математическая абстракция! Можно ведь вообще майнить валюту в голове, там же её обменивать и тратить. Ну или, если памяти не хватает, то в тетрадке. Математику, что ли, забыли уже?

— адекватный стрелок не станет заводить себе пистолет. Есть патрон, есть молоток — бей вторым по первому, зачем вокруг этого выстраивать ненужную механическую надстройку?
janPona
программирование мемуары Начало: juick.com

6. На теперешнем месте работы (уже не "Биззабо") ситуация не многим лучше. Мне вроде дали большой огород, в котором я могу копаться и выращивать всё, что я захочу, но не дали воды для полива. То есть, я инициативный, проактивный разработчик, я сейчас по своей инициативе взялся упорядочивать огромный сквозной кусок бизнес-логики, пронизывающий кучу подсистем. Эта работа признана нужной, мне рукоплещут, вроде бы всё классно.

Но! В моей работе сейчас возникли блокеры, которые зависят не от меня. И никто добровольно их решать не будет. Там просто нет таких дураков, которые, вместо того, чтобы конвейерно закрывать таски, будут работать на перспективу, как я. Там все — большие унылые задницы, греющие свою табуретку. Я к тому, что мои инициативы всегда и везде воспринимаются примерно одинаково: «чувак, это просто ОФИГЕННО! Да, мы будем этим пользоваться, нам этого ТАК ДАВНО не хватало!!! Просто отвал башки!». Но когда я после этих дифирамбов скромно прошу их присоединиться к моему проекту (опенсорсному, например, или просто внутреннему проекту в области рационализации), то у всех ВСЕГДА находятся дела поважнее. В 100% случаев. Сука.