<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://programmers.bbon.ru/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>Содружество Независимых Программистов</title>
		<link>https://programmers.bbon.ru/</link>
		<description>Содружество Независимых Программистов</description>
		<language>ru-ru</language>
		<lastBuildDate>Thu, 01 Apr 2021 12:21:02 +0300</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>Альфа</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=1077#p1077</link>
			<description>&lt;p&gt;54321&lt;/p&gt;</description>
			<author>mybb@mybb.ru (testUser)</author>
			<pubDate>Thu, 01 Apr 2021 12:21:02 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=1077#p1077</guid>
		</item>
		<item>
			<title>НОВЫЙ ФОРУМ</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=1071#p1071</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;Alex P. написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Сначала может быть не привычно, но через пару дней должно пройти.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;Я бы поменял стиль. Уж больно он вычурный и непривычный. Новичкам трудно будет с ориентироваться.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Pavia)</author>
			<pubDate>Thu, 12 Dec 2019 01:24:21 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=1071#p1071</guid>
		</item>
		<item>
			<title>Материалы по сокетам для программирования игровых серверов</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=1060#p1060</link>
			<description>&lt;p&gt;Перевод: &lt;a href=&quot;https://www.ozon.ru/context/detail/id/139644889/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Многопользовательские игры. Разработка сетевых приложений&lt;/a&gt;&lt;br /&gt;Оригинал: &lt;a href=&quot;https://www.amazon.com/Multiplayer-Game-Programming-Architecting-Networked-ebook/dp/B0189RXWJQ&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Multiplayer Game Programming: Architecting Networked Games&lt;/a&gt;&lt;br /&gt;Исходники примеров: &lt;a href=&quot;https://github.com/MultiplayerBook/MultiplayerBook&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://github.com/MultiplayerBook/MultiplayerBook&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Смотрел перевод, он вроде хороший. Но я читаю оригинал. Я пока только некоторые места данной книги посмотрел обзорно. На протяжении книги создаётся игра по локальной сети, где, как я понял, играешь за робота-кота, который что-то ловит. Цель поймать больше и набрать больше очков, чем соперники. Происходит действие игры в одном игровом мире, где каждый за себя и пытаешься выжить в конкурентной борьбе. Чёткого описания игрового процесса я не нашёл. Может я что-то не правильно понял. То что я точно понял, что для клиента и сервера используется C++. Для 2D графики используется библиотека SDL. Для сервера используется чистый Winsock (&lt;a href=&quot;https://ru.wikipedia.org/wiki/Winsock&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://ru.wikipedia.org/wiki/Winsock&lt;/a&gt;). Я использую для сервера и клиента C#. Клиента пишу OpenGL 3.0 и OpenTK. С помощью OpenTK можно создать окно из консольного приложения. Можно встроить OpenTK.GLControl в WPF и WinForms. Устанавливаются OpenTK и OpenTK.GLControl очень просто и очень быстро, через NuGet. Не нужно долго настраивать SDL2. В Xamarin встроена OpenTK, то есть можно написать на C# клиента для Android и iOS. В целом, я считаю, что C# вполне подходит для написания игровых серверов. Я много находил информации, что если есть небольшие отличия в скорости C# и C++, то эти отличия сходят на нет, потому что это пренебрежимо мало с сетевыми задержками, которые неизбежны даже при самой лучшей скорости соединения. Я за то, чтобы переписывать примеры книги на C#. C# намного более дружелюбный, мне он больше нравится. Тем более всегда есть возможность перейти на Unity, который является самым популярным движком. Можно использовать Unity, как клиент для C# TCP-сервера.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (8Observer8)</author>
			<pubDate>Tue, 10 Dec 2019 17:37:33 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=1060#p1060</guid>
		</item>
		<item>
			<title>php сессия [решено]</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=1045#p1045</link>
			<description>&lt;p&gt;Решено, спасибо за участие.&lt;br /&gt;в начале каждого php должна быть прописана строка&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;session_start();&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt; :rolleyes:&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Aleksandr H.)</author>
			<pubDate>Tue, 10 Dec 2019 09:53:27 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=1045#p1045</guid>
		</item>
		<item>
			<title>Переписываем примеры простых игр из туторалов на шейдерный OpenGL</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=1030#p1030</link>
			<description>&lt;p&gt;Я подумал, что это на статьи мало похоже, это ближе к обсуждению. Да, можно переместить.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (8Observer8)</author>
			<pubDate>Mon, 09 Dec 2019 12:53:02 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=1030#p1030</guid>
		</item>
		<item>
			<title>Не могу попасть на сайты антивирусов</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=1015#p1015</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;Баламут написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;А вот весь необходимый софт убьет все остальное время.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;Так а мой совет о чем?&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Alex P.)</author>
			<pubDate>Sat, 07 Dec 2019 00:50:36 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=1015#p1015</guid>
		</item>
		<item>
			<title>Обучающие ресурсы по математике для программистов графики и игр</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=1013#p1013</link>
			<description>&lt;p&gt;Изучаю математику, которая реализует скелетную анимацию по этой книге:&lt;/p&gt;
						&lt;p&gt;- 2011 - 02 - &lt;strong&gt;3D Graphics for Game Programming&lt;/strong&gt; - JungHyun Han - &lt;a href=&quot;https://www.amazon.com/Graphics-Game-Programming-JungHyun-Han/dp/1439827370&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Amazon&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Глава 11. Character Animation&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;http://uploads.ru/Z8XtN.png&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s9.uploads.ru/t/Z8XtN.png&quot; alt=&quot;http://s9.uploads.ru/t/Z8XtN.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;К этой главе можно добавить исходники загрузки скелетной анимации из файла .dae (Collada), созданной в бесплатном 3D редакторе Blender, из туториала: &lt;a href=&quot;https://www.youtube.com/watch?v=f3Cr8Yx3GGA&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;OpenGL Skeletal Animation Tutorial&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (8Observer8)</author>
			<pubDate>Fri, 06 Dec 2019 19:24:41 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=1013#p1013</guid>
		</item>
		<item>
			<title>Родительский контроль на смартфоне</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=993#p993</link>
			<description>&lt;p&gt;Логично, а то кто будет проверять, своим детям его ставят или другим людям.&lt;br /&gt;Ну и отношения с детьми все-таки должны быть открытыми.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (MihalNik)</author>
			<pubDate>Fri, 06 Dec 2019 08:44:42 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=993#p993</guid>
		</item>
		<item>
			<title>Хранение текстов для сайтов на русском и на английском</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=986#p986</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;Alex P. написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;там за БД отдельно платить надо, от 10$.&lt;/p&gt;
						&lt;p&gt;Хероку в целом хорош тем, что почти всё делают они, но стоит намного дороже обычных VPS (DigitalOcean, Vultr, AWS, ...) если не хватило бесплатного.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;Пока потренируюсь на бесплатном, чтобы поизучать TypeScript, MySQL и то что мне необходимо, а потом видно будет.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (8Observer8)</author>
			<pubDate>Thu, 05 Dec 2019 20:59:06 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=986#p986</guid>
		</item>
		<item>
			<title>Использование Makefile в веб-разработке</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=876#p876</link>
			<description>&lt;p&gt;Основное предназначение древней юниксовой утилиты make — сборка С/С++ программ. &lt;br /&gt;Но в последнее время набирает популярность еще одно — запуск команд в проектах, особенно в веб-разработке.&lt;/p&gt;
						&lt;p&gt;Обычно в любом проекте требуется выполнять какие-то команды. &lt;br /&gt;Например, из самого общего: запустить тесты, линтеры, веб-сервер.&lt;/p&gt;
						&lt;p&gt;Можно, конечно, просто записать их в документации, но её можно забыть обновить, да и неудобно всё время копировать или куда-то сохранять их на каждой машине (альясы, IDE, ...).&lt;/p&gt;
						&lt;p&gt;Многие добавляют команды в систему сборки или конфиг менеджера пакетов, которые уже есть в проекте (Gulp/Grunt, npm, Composer, ...). Но часто в проектах используется более одной такой системы (например, для backend и frontend) и команды оказываются в разных местах, потому что так проще по техническим причинам (например, не надо указывать полный путь к зависимости) или логичнее. Кроме того, в разных проектах используются разные технологии, и во всём этом легко запутаться.&lt;/p&gt;
						&lt;p&gt;Еще один вариант — скрипты на Bash или используемом в проекте языке (Python, JS, ...). Более гибко, но сложнее писать и читать, и тоже зависит от используемых технологий, неудобно тащить в проект Питон только для этого.&lt;/p&gt;
						&lt;p&gt;Решение этих проблем — использовать Makefile в качестве сборника команд. &lt;br /&gt;Создаем файл с именем &lt;strong&gt;Makefile&lt;/strong&gt; в корне проекта, и добавляем туда любые используемые команды, в том числе и вызовы команд других систем сборки.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 31.5em&quot;&gt;&lt;pre&gt;
    install:
    	composer install
    	npm install
    
    setup: install
    	cp -n .env.example .env || true
    
    start:
    	php -S localhost:8000 -t public
    
    test:
    	composer phpunit
    
    lint:
    	composer phpcs
    
    deploy:
    	git push heroku master&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;Теперь после git clone можно выполнить &lt;strong&gt;make setup&lt;/strong&gt; для подготовки свежескаченного проекта к работе, &lt;strong&gt;make start&lt;/strong&gt; для запуска веб-сервера, &lt;strong&gt;make lint test&lt;/strong&gt; для запуска линтера и тестов, и &lt;strong&gt;make deploy&lt;/strong&gt; для отправки изменений в продакшн.&lt;/p&gt;
						&lt;p&gt;Преимущества make:&lt;/p&gt;
						&lt;p&gt;- Как правило всегда доступен на Linux и MacOS (установлен по умолчанию или ставится со стандартными инструментами разработки). Обычно веб-разработчики и сидят на этих ОС.&lt;br /&gt;- Не надо ставить ничего дополнительного для самого запуска команд. Например, интерпретатор и утилиты языка, чтобы просто запустить Docker или Vagrant уже содержащий всё нужное.&lt;br /&gt;- Не зависит от языка, фреймворка, IDE и прочих инструментов.&lt;br /&gt;- Простой синтаксис (для таких задач), проще и понятнее Bash-скриптов. Нельзя добавить сложную логику в сам Makefile, поэтому он не превратится в нечитаемую кашу. Не смешивается с другими вещами, в отличии от конфига менеджера пакетов.&lt;br /&gt;- Удобно вызывать: &lt;span style=&quot;font-style: italic&quot;&gt;make &amp;lt;cmd&amp;gt;&lt;/span&gt; вместо какого-нибудь &lt;span style=&quot;font-style: italic&quot;&gt;npm run &amp;lt;cmd&amp;gt;&lt;/span&gt;. Доступен автокомплит по TAB в стандартных терминалах.&lt;br /&gt;- Самодокументирование. Всегда можно открыть Makefile и посмотреть актуальные команды, узнать что можно делать в этом проекте.&lt;br /&gt;- Не надо вспоминать что и как запустить при переключении между разными языками/технологиями.&lt;br /&gt;- Стабильность. Мейку не первый десяток лет и вряд ли он поменяется.&lt;/p&gt;
						&lt;p&gt;Недостатки:&lt;/p&gt;
						&lt;p&gt;- Недоступен на Windows. Можно взять make/nmake из MinGW/VS, но Windows не POSIX-совместимая ОС и некоторые команды из не-виндовых проектов не будут работать. Как вариант, WSL в вин10, &lt;a href=&quot;https://gist.github.com/evanwill/0207876c3243bbb6863e65ec5dc3f058&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Git Bash&lt;/a&gt;.&lt;br /&gt;- Некоторые особенности синтаксиса и работы. Отступы должны быть только TAB&#039;ами, а команды совпадающие с именами папок/файлов надо добавить в .PHONY.&lt;/p&gt;
						&lt;p&gt;Примеры в проектах:&lt;/p&gt;
						&lt;p&gt;- PHP Lumen/Laravel &lt;a href=&quot;https://github.com/AlexP11223/php-project-lvl3&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://github.com/AlexP11223/php-project-lvl3&lt;/a&gt;&lt;br /&gt;- Ruby, Python, Node.JS, Java, ... &lt;a href=&quot;https://github.com/Hexlet&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://github.com/Hexlet&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Больше инфы, краткое руководство с тонкостями и примерами: &lt;a href=&quot;https://ru.makefile.site&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://ru.makefile.site&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Alex P.)</author>
			<pubDate>Mon, 02 Dec 2019 14:31:50 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=876#p876</guid>
		</item>
		<item>
			<title>Обучающие материалы по разработке игр</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=872#p872</link>
			<description>&lt;p&gt;Хороший доклад о том, как сделать простой 2D платформер интересным.&lt;/p&gt;
						&lt;p&gt;2013 Jan Willem Nijman - &amp;quot;The art of screenshake&amp;quot;. Why is it that one game plays great and another, similar game feels terrible?&lt;/p&gt;
						&lt;p&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Alex P.)</author>
			<pubDate>Mon, 02 Dec 2019 11:53:45 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=872#p872</guid>
		</item>
		<item>
			<title>Запуск unit-тестов в песочнице и локально на TypeScript и Jasmine</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=862#p862</link>
			<description>&lt;p&gt;&lt;strong&gt;Запуск unit-тестов в песочнице и локально на TypeScript и Jasmine&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Цель примера. Допустим вы решаете задачи на ресурсах:&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;https://www.codewars.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;www.codewars.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.codesignal.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;www.codesignal.com&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;На данных ресурсах ко всем задачам даются unit-тесты. Вы хотите решать задачу локально, перенести unit-тесты с данных ресурсов в песочницы и на компьютер, редактировать и добавлять свои тесты, постить ссылки на свои примеры на форуме, отправлять ссылки друзьям. Берите исходники примера с GitHub, который тестирует сложение двух чисел. Команды запуска даны в описании: &lt;a href=&quot;https://github.com/8Observer8/sum-of-numbers-jasmine-typescript&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://github.com/8Observer8/sum-of-nu &amp;#8230; typescript&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Вы хотите продемонстрировать решение со своими unit-тестами, чтобы человек мог очень быстро, в два клика: открыть и запустить unit-тесты. Он может сделать Fork, изменить тесты (или код), добавить новые тесты, которые бы показывали вашу ошибку, либо отсутствие функциональности. Вы можете воспользоваться песочницами.&lt;/p&gt;
						&lt;p&gt;Пример в песочнице: &lt;a href=&quot;https://next.plnkr.co/edit/VNDDXLBIKVtzPNmv?preview&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://next.plnkr.co/edit/VNDDXLBIKVtzPNmv?preview&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Класс &amp;quot;Kata&amp;quot; содержит метод Add, который складывает два числа. В файле &amp;quot;Kata&amp;quot; описан один unit-тест:&lt;/p&gt;
						&lt;p&gt;Kata.ts&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 16.5em&quot;&gt;&lt;pre&gt;
export default class Kata
{
    public static Add(a: number, b: number): number
    {
        return a + b;
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;KataTests.ts&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 30em&quot;&gt;&lt;pre&gt;
import Kata from &amp;quot;../../src/client/Kata&amp;quot;;

describe(&amp;quot;KataTests&amp;quot;, () =&amp;gt;
{
    it(&amp;quot;AddTest&amp;quot;, () =&amp;gt;
    {
        // Arrange
        let expected = 10;

        // Act
        let actual = Kata.Add(5, 5);

        // Assert
        expect(actual).toEqual(expected);
    });
});
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (8Observer8)</author>
			<pubDate>Sun, 01 Dec 2019 20:49:28 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=862#p862</guid>
		</item>
		<item>
			<title>[РЕШЕНО] Программы в Delphi 7 и решение проблем с кодировкой</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=860#p860</link>
			<description>&lt;p&gt;Иногда так бывает, что надо скопировать текст/код, содержащий кириллические буквы, из редактора кода или текстовых полей разработанного приложения. Проблема состоит в том, что, когда такой текст вставляется в другие текстовые редакторы, кириллические символы вставляются в неверной кодировке. Например, такой код:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 13.5em&quot;&gt;&lt;pre&gt;// комментарии
procedure TForm1.FormCreate(Sender: TObject);
begin
 showMessage(&#039;Всё хорошо&#039;)
end;

end.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Может быть вставлен в таком виде:&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s8.hostingkartinok.com/uploads/images/2018/11/880ddd6506862606574dcc53a9df4437.png&quot; alt=&quot;https://s8.hostingkartinok.com/uploads/images/2018/11/880ddd6506862606574dcc53a9df4437.png&quot; /&gt;&lt;br /&gt;_________&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 20px&quot;&gt;&lt;span style=&quot;color: Green&quot;&gt;Несколько решений:&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 15px&quot;&gt;&lt;span style=&quot;color: Green&quot;&gt;Первое:&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Перед тем, как копировать текст, переключите язык ввода на русский. Всё должно скопироваться и вставиться нормально.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 15px&quot;&gt;&lt;span style=&quot;color: Green&quot;&gt;Второе:&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Переключение языка ввода перед копированием текста – пожалуй, рабочий вариант во всех случаях. Но он не всегда удобен в том плане, что конечному пользователю надо сообщать дополнительно (либо в справочной документации, либо на форме самого приложения) о необходимости переключения языка ввода. Можно переключать язык ввода автоматически перед работой с буфером обмена (далее - БО), но, как я говорил ранее, проблема возникает и тогда, когда происходит копирование из стороннего приложения в наше. Если способ отследить такое и существует, мне он неизвестен. Потом, переключение языка ввода без ведома пользователя -&amp;#160; в некотором роде моветон, с моей точки зрения, поэтому такой способ здесь не рассматривается.&lt;/p&gt;
						&lt;p&gt;Сейчас я расскажу о способе решения проблемы, который был найден мной в ходе разработки &lt;a href=&quot;http://www.programmersforum.ru/showthread.php?t=324454&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;своей небольшой программы&lt;/a&gt;.&lt;/p&gt;
						&lt;p&gt;Во-первых, вам нужно подключить модуль RusClipboard.pas (согласно информации в Интернете, автор - Игорь Цысь (Igoreha), igoreha@i.com.ua)&lt;br /&gt;Код модуля:&lt;/p&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Код модуля RusClipboard.pas&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;
unit RusClipboard;

interface

uses Clipbrd;

type
  TRusClipboard = class(TClipboard)
private
  procedure SetCodePage(const CodePage: longint);
public
  procedure Open; override;
  procedure Close; override;
end;

implementation

uses Windows;

{ TRusClipboard }

procedure TRusClipboard.Close;
begin
  SetCodePage($0419);
  inherited;
end;

procedure TRusClipboard.Open;
begin
  inherited;
  SetCodePage($0419);
end;

procedure TRusClipboard.SetCodePage(const CodePage: longint);
var
  Data: THandle;
  DataPtr: Pointer;
begin
  // Назначить кодовую страницу для буфера обмена
  Data:= GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, 4);
  try
    DataPtr := GlobalLock(Data);
    try
      Move(CodePage, DataPtr^, 4);
      SetClipboardData(CF_LOCALE, Data);
    finally
      GlobalUnlock(Data);
    end;
  except
    GlobalFree(Data);
  end;
end;

var
 NewClipboard: TClipboard;
 OldClipboard: TClipboard;

initialization
 NewClipboard := TRusClipboard.Create;
 OldClipboard := SetClipboard(NewClipboard);
 OldClipboard.Free;
end. &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Внимание: далее в тексте добавленные стоки отмечены конструкцией &amp;lt;----&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Говорят, его надо просто подключить к проекту. В секции uses укажите имя модуля – rusClipboard. Но у меня так не работало. Здесь может быть неясно, как его использовать. Хорошо, что я сразу догадался использовать класс, написанный в этом модуле – TRusClipboard. Значит, вторым шагом после подключения модуля будет создание переменной типа TRusClipboard в секции private класса вашей формы:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 16.5em&quot;&gt;&lt;pre&gt;type
  TForm1 = class(TForm)
    ...
  private
    { Private declarations }
    clipboard: TRusClipboard; // &amp;lt;----
  public
    { Public declarations }
  end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;В обработчике создания формы надо выделить для него память&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;procedure TForm1.FormCreate(Sender: TObject);
begin
  clipboard:=TRusClipboard.Create; // &amp;lt;---
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;А в обработчике закрытия формы память освободить:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  clipboard.Free; // &amp;lt;---
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Решая проблему кодировки при копировании символов, я заметил, что всё копируется нормально, если при помещении информации в БО просто обратиться к свойству asText переменной БО, то есть, clipboard.asText. Из этого следует, что нам нужен обработчик помещения (текстовой) информации в БО. В отличие от двух предыдущих, средства Delphi 7 не позволяют автоматически подготовить для него код, поэтому его надо написать самому. Для этого в секции private класса нашей формы надо записать заголовок обработчика:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 18em&quot;&gt;&lt;pre&gt;type
  TForm1 = class(TForm)
    ...
  private
    { Private declarations }
    clipboard: TRusClipboard;
    procedure drawClipboard(var AMsg: TWMDrawClipboard); message WM_DRAWCLIPBOARD; // &amp;lt;---
  public
    { Public declarations }
  end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Справа от заголовка процедуры располагается ключевое слово message, за которым следует имя обрабатываемого сообщения. Это означает, что эта процедура будет являться обработчиком сообщения о помещении в буфер обмена информации. Далее, в разделе implementation необходимо написать реализацию этого обработчика. Здесь я рекомендую поставить курсор на строку с заголовком этого обработчика и воспользоваться комбинацией клавиш CTRL+SHIFT+C. В этом случае IDE создаст для вас заготовку для обработчика автоматически. Как я говорил ранее, при помещении текста в БО, надо обратиться к свойству asText переменной clipboard. Таким образом, реализация обработчика будет иметь следующий код:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;procedure TForm1.drawClipboard(var AMsg: TWMDrawClipboard);
begin
  clipboard.AsText; // &amp;lt;---
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Я не разбирался, как работает класс БО в Delphi, и частности его дочерний TRusClipboard, поэтому для меня это – танцы с бубном, особенно, если учесть, что, asText – это не подпрограмма.&lt;/p&gt;
						&lt;p&gt;Чтобы это работало, нам надо разместить окно нашего приложения в цепочке наблюдателей БО. Для этого сначала мы создадим приватное поле с типом HWND:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 19.5em&quot;&gt;&lt;pre&gt;type
  TForm1 = class(TForm)
    ...
  private
    { Private declarations }
    clipboard: TRusClipboard;
    nextWindowHandle: HWND; // &amp;lt;---
    procedure drawClipboard(var AMsg: TWMDrawClipboard); message WM_DRAWCLIPBOARD;
  public
    { Public declarations }
  end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;а в обработчике создания формы вызовем функцию setClipboardViewer, которой передадим дескриптор главного окна программы. Эта функция размещает окно, дескриптор которого мы передаём, в цепочке наблюдателей БО, и возвращает дескриптор следующего окна в цепочке. Имеем:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 10.5em&quot;&gt;&lt;pre&gt;procedure TForm1.FormCreate(Sender: TObject);
begin
  clipboard:=TRusClipboard.Create;
  nextWindowHandle:=SetClipboardViewer(handle); // &amp;lt;---
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Обратите внимание на порядок строк в этом обработчике. Размещать окно в цепочке необходимо ПОСЛЕ выделения памяти для БО.&lt;/p&gt;
						&lt;p&gt;В обработчике закрытия формы нам надо изъять помещённое ранее окно из цепочки наблюдателей. Для этого вызывается функция changeClipboardChain. Она принимает два аргумента, первый из которых – дескриптор извлекаемого окна, а второй дескриптор замещающего окна. Мы его получали ранее, это окно, следующее за нашем в цепочке. Имеем:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 10.5em&quot;&gt;&lt;pre&gt;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  changeClipboardChain(handle, nextWindowHandle); // &amp;lt;---
  clipboard.Free;
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Я считаю, что возвращаемый результат этой функции нам не нужен в данном случае, поэтому я его ничему не присваиваю.&lt;/p&gt;
						&lt;p&gt;Все эти операции достаточно выполнить в модуле основной формы. Во всех остальных формах вашего проекта работа с БО также будет происходить корректно.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Важное замечание&lt;/strong&gt;&lt;br /&gt;Как я заметил, неприятность выше описанного метода заключается в том, что иногда при помещении текста в буфер обмена, появляется ошибка &amp;quot;Не могу открыть буфер обмена&amp;quot; (&amp;quot;can&#039;t open clipboard&amp;quot; или как-то так), при этом текст копируется без проблем.&lt;/p&gt;
						&lt;p&gt;Чтобы избежать появления этой ошибки, я советую тело обработчика помещения текста в буфер обмена обернуть в try/except.&lt;br /&gt;В секции except писать ничего не надо - текст копируется нормально, но задача состоит в том, чтобы избежать появления сообщения об ошибке.&lt;br /&gt;&lt;span style=&quot;color: Silver&quot;&gt;Возможно, это быдлокод, но лучшего / более красивого решения я пока не могу предложить.&lt;/span&gt;&lt;br /&gt;Таким образом, этот код будет выглядеть так:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 16.5em&quot;&gt;&lt;pre&gt;
procedure TForm1.drawClipboard(var AMsg: TWMDrawClipboard);
begin
  try
    clipboard.AsText;
  except
  end;
end;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;Демонстрацию работы данного способа я размещаю как в приложении, так и во внешней ссылке.&lt;/p&gt;
						&lt;p&gt;Ссылка на демо-проект на яндексДиске: &lt;a href=&quot;https://yadi.sk/d/uLvsgE_AARpLrA&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://yadi.sk/d/uLvsgE_AARpLrA&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;____________&lt;br /&gt;Ключевые слова для поиска темы&lt;br /&gt;Текст код из Делфи Delphi вставляется криво крокозябрами кракозябрами в испорченной неверной кодировке&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Вадим Мошев)</author>
			<pubDate>Sun, 01 Dec 2019 20:40:32 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=860#p860</guid>
		</item>
		<item>
			<title>Примеры решения задач на языке Turbo Pascal + численные методы</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=854#p854</link>
			<description>&lt;p&gt;&lt;strong&gt;Это не моя работа.&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Скачать документ (примеры) можно здесь: &lt;a href=&quot;https://yadi.sk/i/4Gj4fZlBPboKVg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Примеры решения задач на Turbo Pascal.doc&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;В документе приводятся примеры решения задач. Каждый пример состоит из описания алгоритма решения, блок-схемы решения и листинга программы.&lt;/p&gt;
						&lt;p&gt;Приведены решения задач по следующим темам:&lt;br /&gt;&lt;span style=&quot;font-style: italic&quot;&gt;Оператор присваивания&lt;br /&gt;Условный оператор&lt;br /&gt;Простейшие циклы&lt;br /&gt;Числовые ряды (вычисления суммы с заданной точностью или суммы N слагаемых)&lt;br /&gt;Функциональные ряды (то же самое, что и предыдущий пункт, но ряд представляет собой функцию от переменной)&lt;br /&gt;Задачи с использованием массивов&lt;br /&gt;Вложенные циклы&lt;br /&gt;Процедуры и функции&lt;br /&gt;Работа с матрицами (двумерные массивы)&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;В конце приводится список рекомендуемой литературы&lt;/p&gt;
						&lt;p&gt;___________________________________&lt;/p&gt;
						&lt;p&gt;Добавил некоторые примеры решения задач по численным методам на языке Turbo Pascal. Структура работ та же, что и выше. &lt;strong&gt;Опять же, работа не моя (и она не скачана в интернете)&lt;/strong&gt;.&lt;/p&gt;
						&lt;p&gt;Скачать примеры можно здесь: &lt;a href=&quot;https://yadi.sk/d/ehtQCjykkXmd3A&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Решение задач по вычислительным методам, Pascal (коды+Блок-схемы).zip&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Приведены решения задач по следующим темам:&lt;br /&gt;&lt;span style=&quot;font-style: italic&quot;&gt;Аппроксимация линейной зависимостью&lt;br /&gt;Аппроксимация полиномом&lt;br /&gt;двумерная интерполяция&lt;br /&gt;задача Коши для системы дифференциальных уравнений&lt;br /&gt;Интерполяция по формуле Лагранжа&lt;br /&gt;Оптимизация функции одной переменной&lt;br /&gt;Оптимизация функции двух переменных, метод градиента&lt;br /&gt;Оптимизация функции двух переменных, покоординатный спуск&lt;br /&gt;решение дифференциального уравнения, метод Рунге Кутта&lt;br /&gt;Решение СЛАУ методом Гаусса&lt;br /&gt;решение уравнения методом Ньютона&lt;br /&gt;Решение уравнения методом Хорд&lt;br /&gt;Решение уравнения, дихотомия&lt;br /&gt;Численное интегрирование — Гаусс и Симпсон&lt;br /&gt;Численное интегрирование — Прямоугольники и Трапеция&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;В этой теме задавать вопросы не нужно, для этого есть целый раздел.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Вадим Мошев)</author>
			<pubDate>Sun, 01 Dec 2019 19:21:13 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=854#p854</guid>
		</item>
		<item>
			<title>Запуск unit-тестов в песочнице и локально на Python и unittest</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=841#p841</link>
			<description>&lt;p&gt;Отмечу, если кому интересно, что мои личные цели применения Python очень ограничены:&lt;/p&gt;
						&lt;p&gt;- Написание плагинов для Blender для автоматизации 3D моделирования механизмов, конструкций и игровых объектов для моих будущих игр с мультиплееров (&lt;strong&gt;клинет&lt;/strong&gt;: WebGL/GLSL, TypeScript; &lt;strong&gt;сервер&lt;/strong&gt;: Node.js, Express, socket.io, TypeScript. Использую этот плагин для VSCode для отладки и выполнения по шагам, о котором я узнал из видео туториала: &lt;a href=&quot;https://www.youtube.com/watch?v=uahfuypQQ04&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Blender 2.8 Addon Development Tutorial for Beginners&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;- Написание плагинов для GIMP для автоматизации создания или обработки 2D изображений. Начинал с туториала: &lt;a href=&quot;https://habr.com/ru/post/135863/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Как написать дополнение для GIMP на языке Python&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;- Изучение написания unit-тестов, тренировка через решение задач с unit-тестами на ресурсах типа: codewars, codesignal. Изучения написания мок объектов для инжектирования зависимостей, таких как: временно нереализованные классы и внешние API (Blender API и GIMP API). В целом, навыки, которые можно перенести на TypeScript&lt;/p&gt;
						&lt;p&gt;Я пока что решил остановиться на двух языках: TypeScript и Python. Буду тренироваться делать, для начала, простые сетевые игры (крестики-нолики, карточные, морской бой и т.д.) с развёртыванием на бесплатном хостинге Heroku, который может развёртывать автоматически после push&#039;а на GitHub. Сейчас на GitHub можно бесплатно создавать приватные репозитории. Ну чё, народ, погнали!&lt;/p&gt;</description>
			<author>mybb@mybb.ru (8Observer8)</author>
			<pubDate>Sun, 01 Dec 2019 14:39:08 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=841#p841</guid>
		</item>
		<item>
			<title>Пример создания GUI приложения на Python. PySide2, Poetry, PyCharm</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=840#p840</link>
			<description>&lt;p&gt;Пример создания небольшого GUI хеллоу ворлда используя PySide2 (Qt) на Windows (кроссплатформенно).&lt;/p&gt;
						&lt;p&gt;Для установки зависимостей и создания virtualenv используется poetry &lt;a href=&quot;https://poetry.eustace.io/docs/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://poetry.eustace.io/docs/&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;В зависимостях есть всё нужное для работы скриптов.&lt;br /&gt;Графический редактор ui файлов (Qt Designer) устанавливается отдельно: либо инсталятором С++ Qt отсюда &lt;a href=&quot;https://www.qt.io/download&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.qt.io/download&lt;/a&gt; (кнопка справа про опенсорс), либо тут он доступен без всего лишнего &lt;a href=&quot;https://build-system.fman.io/qt-designer-download&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://build-system.fman.io/qt-designer-download&lt;/a&gt; (не пробовал).&lt;/p&gt;
						&lt;p&gt;Видео всего процесса. 5:49, без звука (в таком формате особо нечего говорить, цели полностью объяснить все основы не было):&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Код: &lt;a href=&quot;https://github.com/AlexP11223/pyside2_example&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://github.com/AlexP11223/pyside2_example&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Вместо генерации Питоновского кода из .ui файлов, их можно сразу загружать &lt;a href=&quot;https://doc.qt.io/qtforpython/tutorials/basictutorial/uifiles.html#loading-it-directly,&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://doc.qt.io/qtforpython/tutorials &amp;#8230; -directly,&lt;/a&gt; но мне так не особо понравилось. Может не разобрался, а может не допилили еще, Pyside2 недавно начали развивать, до этого PyQt5 был основным. Основные проблемы вроде были в том, что неудобно добавлять обработчики событий (нельзя просто создать метод с @Slot) и непонятно как переопределять методы (например paintEvent). Я находил какие-то решения, но они выглядели как-то сложно и/или добавляли другие проблемы. Ну и так не будет подсказок IDE про элементы виджета (self.ui.myMegaButton).&lt;/p&gt;
						&lt;p&gt;Вызовы pyside2-uic естественно можно автоматизировать кучей способов типа скриптов, Makefile, средств IDE. &lt;/p&gt;
						&lt;p&gt;В одном проекте я просто создал скрипт перегенирирующий все файлы и запускал его вручную когда надо:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;import inspect
import os
import re


def read_all_file_text(file_path, encoding=&#039;utf-8&#039;):
    with open(file_path, &#039;r&#039;, encoding=encoding) as f:
        return f.read()


def write_all_file_text(file_path, text, encoding=&#039;utf-8&#039;):
    with open(file_path, &#039;w&#039;, encoding=encoding) as f:
        return f.write(text)


dir_path = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
filenames = [f for f in os.listdir(dir_path) if f.endswith(&#039;.ui&#039;)]

for filename in filenames:
    input_path = os.path.join(dir_path, filename)
    output_path = os.path.join(dir_path, &#039;ui_&#039; + os.path.splitext(filename)[0] + &#039;.py&#039;)
    cmd = f&#039;pyside2-uic &amp;quot;{input_path}&amp;quot; &amp;gt; &amp;quot;{output_path}&amp;quot;&#039;
    print(cmd)
    ret = os.system(cmd)
    if ret != 0:
        print(f&#039;Exit code {ret}&#039;)
        continue

    # remove header
    src = read_all_file_text(output_path)
    clean_src = re.sub(r&#039;# Form implementation generated.+(# WARNING! All changes made in this file will be lost!)&#039;,
                       r&#039;\g&amp;lt;1&amp;gt;&#039;, src, flags=re.S)
    write_all_file_text(output_path, clean_src)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;#160; &amp;#160; &lt;br /&gt;Скрипт еще убирает коммент с датой потому что я коммитил их в Гит (конечно наверно лучше добавить их в .gitignore и просто генерировать после git clone и т.д., но в том случае так было удобнее по каким-то причинам).&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Alex P.)</author>
			<pubDate>Sun, 01 Dec 2019 14:17:10 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=840#p840</guid>
		</item>
		<item>
			<title>Тестовая тема</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=811#p811</link>
			<description>&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;uses jpeg;// Lazarus
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      jpeg: TJPEGImage;
      bmp: TBitmap;
    begin
      if  PictureDialog1.Execute then
      begin
        jpeg := TJPEGImage.Create;
        bmp := TBitmap.Create;
        try
          jpeg.LoadFromFile(PictureDialog1.FileName);
          bmp.Assign(jpeg);
          ADOTable1.Edit;                  // режим редактирования
          ADOTable1.FieldByName(&#039;Foto&#039;).Assign(bmp);//загрузка фото
          ADOTable1.Post;                  // сохраняем данные
        finally
          jpeg.Free;
          bmp.Free;
        end;
      end;
    end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (zvygin1964)</author>
			<pubDate>Sat, 30 Nov 2019 21:09:24 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=811#p811</guid>
		</item>
		<item>
			<title>Мини-статья: Песочницы для вопросов по кодингу игр на TypeScript</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=757#p757</link>
			<description>&lt;p&gt;Если что-то непонятно, то задавайте вопросы. Загорелись идеей реализовать что-то в песочницах из примеров выше, то делайте Fork, копируйте сюда результаты. Даже если цвет фона в примере нашли как поменять, тоже копируйте ссылку, что получилось. Не стесняйтесь, что вы что-то вроде как по мелочи изменили. Каждая мелочь - это шажок вперёд, а может и большой шаг.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (8Observer8)</author>
			<pubDate>Fri, 29 Nov 2019 22:11:17 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=757#p757</guid>
		</item>
		<item>
			<title>Регистрация</title>
			<link>https://programmers.bbon.ru/viewtopic.php?pid=728#p728</link>
			<description>&lt;p&gt;Мне пришло пару уведомлений. По моему именно тогда, когда в той теме кто-то отмечался во время моего отсутствия. Могу и ошибаться ) Благодаря WorldMaster нашел где можно отключить. То я просто забыл где вообще подписывался ))&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Аватар)</author>
			<pubDate>Fri, 29 Nov 2019 16:34:36 +0300</pubDate>
			<guid>https://programmers.bbon.ru/viewtopic.php?pid=728#p728</guid>
		</item>
	</channel>
</rss>
