<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://afterless.mybb.ru/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>продленка</title>
		<link>https://afterless.mybb.ru/</link>
		<description>продленка</description>
		<language>ru-ru</language>
		<lastBuildDate>Fri, 07 Apr 2023 12:59:09 +0300</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>BoomBox – быстрый путь к мечте!</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=15#p15</link>
			<description>&lt;p&gt;&lt;a href=&quot;https://ibb.co/xSZxNPy&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://i.ibb.co/wNt5f3T/IMG-20230403-124422.jpg&quot; alt=&quot;https://i.ibb.co/wNt5f3T/IMG-20230403-124422.jpg&quot; /&gt;&lt;/a&gt; Новый маркетинг от проекта Profit Box с двух- и трехместными столами. &lt;a href=&quot;https://t.me/TrafficBoosters2_bot?start=mentor_575804412&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://t.me/TrafficBoosters2_bot?start &amp;#8230; _575804412&lt;/a&gt;&amp;#160; &amp;#160;Выход в безубыток с первого закрытого места, быстрый выход на миллион. Покупайте любой уровень и любое место, все остальное не важно. Важно то, что вы в любом случае получаете бонусы. Так работает инновационный маркетинг нового поколения. Перейти: &lt;a href=&quot;https://is.gd/DMjasF&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://is.gd/DMjasF&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (hwsyfjrebt)</author>
			<pubDate>Fri, 07 Apr 2023 12:59:09 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=15#p15</guid>
		</item>
		<item>
			<title>Игра лотерея: Колесо Удачи</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=14#p14</link>
			<description>&lt;p&gt;Новинка 2023г! Игра лотерея:Колесо Удачи Отныне выиграть много и быстро для тебя станет легко. Перейдите по ссылке и введите свои данные в форму подписки:&amp;#160; &lt;a href=&quot;http://rouletka.top/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://rouletka.top/&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (hwsyfjrebt)</author>
			<pubDate>Wed, 29 Mar 2023 12:14:43 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=14#p14</guid>
		</item>
		<item>
			<title>Бесплатные торговые сигналы о пампах крипты: 100% профит гарантирован</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=13#p13</link>
			<description>&lt;p&gt;[left]&lt;a href=&quot;https://wampi.ru/image/RljJy76&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://im.wampi.ru/2023/03/15/Article-photo.jpg&quot; alt=&quot;https://im.wampi.ru/2023/03/15/Article-photo.jpg&quot; /&gt;&lt;/a&gt;&amp;#160; &amp;#160;Наша команда инвесторов и аналитиков рынка криптовалют предоставляет бесплатную информацию о предстоящих пампах крипты. Смотрите: &lt;a href=&quot;https://youtu.be/0YsKfr1YmHA&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://youtu.be/0YsKfr1YmHA&lt;/a&gt; 1. Канал для торговли монетами в паре с Биткойнами &lt;a href=&quot;https://t.me/s/cryptopumpsignalsbinanceteam&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://t.me/s/cryptopumpsignalsbinanceteam&lt;/a&gt; 2. Канал для торговли в паре с USDT &lt;a href=&quot;https://t.me/s/usdt_Crypto_pump_signals_Binance&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://t.me/s/usdt_Crypto_pump_signals_Binance&lt;/a&gt; В обоих каналах мы предоставляем подробные отчеты о достижении каждой из пяти целей криптопампа с указанием периода времени, затраченного на это с момента публикации сигнала Также, в качестве подтверждения публикуемой нами инсайдерской информации, предоставляем скриншот сигнала, который был опубликован заблаговременно до начала пампа для VIP-членов Клуба Трейдеров Здесь вы можете найти статистику и отчеты &lt;a href=&quot;https://t.me/s/crypto_signals_binance_pump/39751&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://t.me/s/crypto_signals_binance_pump/39751&lt;/a&gt; по всем прокачанным монетам за несколько лет Всю эту информацию вы можете проверить здесь: &lt;a href=&quot;https://cryptopumpnews.com/ru/free-pump-crypto-trading-signals/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://cryptopumpnews.com/ru/free-pump &amp;#8230; g-signals/&lt;/a&gt; и провести сравнительную аналитическую работу, чтобы убедиться, что &amp;quot;Crypto Pump Signals for Binance&amp;quot; является единственным источником абсолютно точной и безубыточной информации для торговли криптовалютами на Binance&amp;#160; [LEFT][LEFT]&lt;/p&gt;</description>
			<author>mybb@mybb.ru (hwsyfjrebt)</author>
			<pubDate>Thu, 16 Mar 2023 06:28:50 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=13#p13</guid>
		</item>
		<item>
			<title>Приходите на интенсив «Таро: 3D взгляд»</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=12#p12</link>
			<description>&lt;p&gt;Жизнь –удивительна. И только мы сами можем на нее воздействовать. Не знаете, куда двигаться дальше? Не знаете, что нужно менять? Хотите найти выходв том, что сейчас происходит? Я Инна Авалон – таролог с 20-летним стажем. Маг 15 аркана. Помогу наладить собственную жизнь, определить собственные ориентиры для развития и обрести благополучие 11 апреля стартует интенсив «Таро: 3D взгляд», на котором Вы: -Получите все ответы на жизненно важные вопросы. - Сможете привести себя в комфортное состояние- Пересмотрите свои активы - Узнаете, чего еще Вам не хватает для движения вперед - Узнаете КУДА и КАК двигаться дальше Для кого подходит интенсив? -Для тех , кто в Таро давно Для тех, кто в Таро недавно Прямые эфиры будут идти на закрытой платформе. Вас ждет : -Общий чат.- Записи занятий.- Домашние занятия.- Обратная связь.- Много ПРАКТИКИ Зарегистрироваться Вы можете по ссылке: &lt;a href=&quot;https://byyf111.wixsite.com/website1631&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://byyf111.wixsite.com/website1631&lt;/a&gt; Перейти &lt;a href=&quot;https://is.gd/GmeoP0&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://is.gd/GmeoP0&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (exolmmdogo)</author>
			<pubDate>Tue, 12 Apr 2022 00:54:37 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=12#p12</guid>
		</item>
		<item>
			<title>Чувствуете тревогу и неуверенность в завтрашнем дне?</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=11#p11</link>
			<description>&lt;p&gt;Жизнь –удивительна. И только мы сами можем на нее повлиять . Не знаете, куда идти дальше ? Не понимаете, что нужно менять? Хотите разобраться в том, что сейчас происходит? Я Инна Авалон – являюсь тарологом с 20-летним стажем. Маг 15 аркана. Помогу наладить собственную жизнь, определить ориентиры для своего развития и обрести благополучие 11 апреля стартует мой интенсив «Таро: 3D взгляд», на котором Вы: -Получите ответы на все жизненно важные вопросы. - Сможете привести себя в комфортное состояние- Пересмотрите свои активы - Узнаете, чего еще Вам не хватает для движения вперед - Поймете КУДА и КАК двигаться дальше Для кого подходит интенсив? -Для тех , кто в Таро давно Для тех, кто в Таро недавно Прямые эфиры будут идти на закрытой платформе. Вас ожидает: -Общий чат.- Записи занятий.- Домашние занятия.- Будет обратная связь.- Много ПРАКТИКИ Регистрация по ссылке: &lt;a href=&quot;https://byyf111.wixsite.com/website1631&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://byyf111.wixsite.com/website1631&lt;/a&gt; Перейти &lt;a href=&quot;https://is.gd/GmeoP0&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://is.gd/GmeoP0&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (hwsyfjrebt)</author>
			<pubDate>Tue, 12 Apr 2022 00:52:13 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=11#p11</guid>
		</item>
		<item>
			<title>Настройка маршрутизации с помощью iproute2 и iptables</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=10#p10</link>
			<description>&lt;p&gt;Ресурсов локальной сети часто не достаточно для нужд пользователей. Поэтому необходимо наладить связь между соседними локальными сетями, а так же с внешней&amp;#160; -- глобальной сетью.&lt;/p&gt;
						&lt;p&gt;Рассмотрим настройку маршрутизации между локальными сетями и во внешнюю сеть -- интернет.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;0. Подготовка&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Используем две виртуальные машины с установленным tinycore linux -- server, client. &lt;/p&gt;
						&lt;p&gt;Server и client подключены к одной виртуальной сети -- VLAN 31. &lt;/p&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Для трансляции адресов (NAT) на server установим iptables.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;1. Настройка шлюза&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Для маршрутизации во внешнюю или соседнюю сеть шлюз должен иметь сетевой интерфейс связанный с этими сетями.&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! Для этого можно использовать отдельный интерфейс или уже имеющийся интерфейс, имеющий несколько сетевых настроек.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Server уже имеет интерфейс eth0 подключенный к локальной сети имеющей выход в интернет.&lt;/p&gt;
						&lt;p&gt;Для пересылки сообщений в соседнюю сеть на шлюзе необходимо включить форвардинг (forwarding)&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;&amp;gt; echo 1 &amp;gt; sudo tee /proc/sys/net/ipv4/ip_forward&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;2. Настройка маршрутизации во внешнюю сеть&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Для упрощения настроек маршрутизации достаточно на каждом узле добавить только один маршрут -- до шлюза в внешнюю сеть. Таким образом пути в другие сети необходимо будет настраивать только на одном узле -- шлюзе.&lt;/p&gt;
						&lt;p&gt;Настроим сетевой интерфейс для связи маршрутизации всех неизвестных путей через шлюз во внешнюю сеть.&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! Если в сети работает DHCP-сервер, то интерфейс уже настроен.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;server&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Настроим сетевой интерфейс во внешней сети на server-е и добавим маршрут по-умолчанию до внешнего шлюза в сеть интернет&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;
# ip address add 192.168.1.31/24 dev eth0
# ip route add default via 192.168.1.1 via eth0
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;Проверим связь с глобальной сетью &amp;quot;Интернет&amp;quot;:&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/Dxh6F.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s6.uploads.ru/t/Dxh6F.jpg&quot; alt=&quot;http://s6.uploads.ru/t/Dxh6F.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;client&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Добавим маршрут по умолчанию на client до server&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: 7.5em&quot;&gt;&lt;pre&gt;
# ip route add default via 192.168.31.1 dev eth0.31
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! Если на физическом интерфейсе eth0 уже есть маршрут по умолчанию, его надо удалить:&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;# ip route del default&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;Теперь все сообщения в другие сети будут передаваться через server:&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/BsmcD.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s8.uploads.ru/t/BsmcD.jpg&quot; alt=&quot;http://s8.uploads.ru/t/BsmcD.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Видно, что все сообщения внешним узлам направляются через server. Но, так как на не настроена обратная маршрутизация, ответы на сообщения не возвращаются.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;3. Настройка маршрутизации между сетями&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Для настройки маршрутизации между сетями необходимо на каждом шлюзе добавить путь в соседнюю сеть сеть через соответствующий шлюз.&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! Если настроить пути только на одном шлюзе, то сообщения будут перенаправляться через шлюз в соответствующие сети, но ответ не сможет вернуться, так как пути обратно нет. Поэтому ответные сообщения client-у в предыдущем примере не проходят обратно через server.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;Так как путь до шлюза другой сети на сервере уже добавлен как маршрут по-умолчанию, то добавлять новый путь не нужно.&lt;/p&gt;
						&lt;p&gt;Добавить путь в локальную сеть на внешнем шлюзе часто невозможно, поэтому необходимо использовать трансляцию адресов (NAT), что бы подменять адреса локальных узлов на адрес шлюза, через который будут отправляться и возвращаться сообщения.&lt;/p&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;server&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;добавим новое правило в iptables, в котором будем подменять адрес источника пакета на адрес server-а (DNAT) для всех исходящих пакетов.&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;&amp;gt; iptables -t nat -A POSROUTING -j MASQUERADE&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;client&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теперь клиент имее доступ во внешную сеть и глобальную сеть интернет.&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/zP3WM.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://sf.uploads.ru/t/zP3WM.jpg&quot; alt=&quot;http://sf.uploads.ru/t/zP3WM.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Видно, что сообщения доходят до внешнего сервера доменной зоны chuvsu.ru, а дальше протокол ICMP блокируется.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
			<author>mybb@mybb.ru (admin)</author>
			<pubDate>Fri, 21 Apr 2017 07:24:11 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=10#p10</guid>
		</item>
		<item>
			<title>Стековый интерпретатор</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=9#p9</link>
			<description>&lt;p&gt;Стековый вычислитель -- вычислительное устройство выполняющее операций над элементами стека. Данные ВычМ удобны для вычисления выражений в постфиксной форме, так как на прямую интерпретируют выражения, и не требуют дополнительных регистров для хранения промежуточных результатов.&lt;/p&gt;
						&lt;p&gt;Рассмотрим описание стекового интерпретатора с таблицей символов и переходами.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Интерпретатор состоит из следующих частей.&lt;/p&gt;
						&lt;p&gt;STACK -- стек. Для реализации достаточно массива чисел с операциями push, pop, top.&lt;/p&gt;
						&lt;p&gt;SYMTAB -- таблица символов. Реализуется хеш-таблицей или массивом чисел, хранящим значение символа по соответствующему индексу&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! Переход от имен к индексам осуществляет компилятор.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;PROG -- программа. Массив чисел, где каждый элемент обозначает: число, символ или операцию, в зависимости от места.&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! Так как символы и операции можно закодировать числами, то для представления программы достаточно числового вектора.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;POS -- курсор. Индекс очередного интерпретируемого элемента.&lt;/p&gt;
						&lt;p&gt;Набор операций выполняемой интерпретатором:&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! В скобках указано выталкиваемое содержимое стека, слева направо&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; - nop (&amp;lt;val&amp;gt;) -- не выполнять операцию, вытолкнуть содержимое стека,&lt;br /&gt;&amp;#160; - lit, &amp;lt;val&amp;gt; -- интерпретировать следующий элемент как литерал и добавить его в стек,&lt;br /&gt;&amp;#160; - set (sym, val) -- интерпретировать первый элемент стека как символ и в SYMTAB установить его значение равное второму элементу, &lt;br /&gt;&amp;#160; - get (sym) -- интерпретировать верхний элемент как символ и заменить его на его значение из SYMTAB&lt;br /&gt;&amp;#160; - if (else, then, cond) -- если третий элемент не равен 0, то оставить в стеке второй элемент, иначе первый&lt;br /&gt;&amp;#160; - jmp (pos) -- изменить значение POS на значение элемента стека&lt;br /&gt;&amp;#160; - add/sub/mul/div/mod (&amp;lt;val1&amp;gt;, &amp;lt;val2&amp;gt;) -- арифметические операции, первого элемента над вторым&lt;br /&gt;&amp;#160; - not/and/or/xor -- побитовые операции&lt;br /&gt;&amp;#160; - eq/ne/gt/lt/ge/le -- сравнения первого операнда со вторым&lt;/p&gt;
						&lt;p&gt;&amp;#160; - halt -- остановка машины, если оператор не распознан.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Реализация на javascript&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;

var prog = [
	1,0x48, 1,0, 3,
	1,0x65, 1,0, 3,
	1,0x6c, 1,0, 3,
	1,0x6c, 1,0, 3,
	1,0x6f, 1,0, 3,
	-1];//программа выводящая hello


function run(){
	var stack= new Array();
	var symtab = new Array();
	var pos=0;

run:while(true){
    let b = prog[pos++];
    if(b === undefined) break;

    switch(b){
    case 0:{//nop (&amp;lt;val&amp;gt;)
    	stack.pop();
    }break;
    case 1:{//lit &amp;lt;val&amp;gt;
    	stack.push(prog[pos++]);
    }break;
    case 2:{//cp (&amp;lt;val&amp;gt;)
    	stack.push(stack[stack.length-1]);
    }break;
    case 3:{//set (&amp;lt;sym&amp;gt;,&amp;lt;val&amp;gt;)
    	let sym = stack.pop();
    	let val = stack.pop();
    	if(sym == 0) console.log(val+&amp;quot;\t(&amp;quot;+ String.fromCharCode(val) +&amp;quot;)&amp;quot;);//OUT
    	else symtab[sym] = val;
    }break;
    case 4:{//get (&amp;lt;sym&amp;gt;)
    	let sym = stack.pop();
    	if(sym == 0) stack.push(parseInt(prompt()));//IN
    	else stack.push(symtab[sym]);
    }break;
    case 6:{//ifr (&amp;lt;else&amp;gt;, &amp;lt;then&amp;gt;, &amp;lt;cond&amp;gt;)
    	let els = stack.pop();
    	let thn = stack.pop();
    	let cond = stack.pop();
    	if(cond != 0) stack.push(thn);
    	else stack.push(els);
    }break;
    case 7:{//jmp (&amp;lt;pos&amp;gt;)
    	pos = stack.pop();
    }break;

    case 11:{//add (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	stack.push(a+b);
    }break;
    case 12:{//sub (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	stack.push(b-a);
    }break;
    case 13:{//mul (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	stack.push(a*b);
    }break;
    case 14:{//div (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	stack.push(b/a);
    }break;
    case 15:{//add (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	stack.push(a % b);
    }break;

    case 21:{//not (&amp;lt;opn1&amp;gt;)
    	let a = stack.pop();
    	stack.push(~a);
    }break;
    case 22:{//and (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	stack.push(a &amp;amp; b);
    }break;
    case 23:{//or (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	stack.push(a | b);
    }break;
    case 24:{//xor (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	stack.push(a ^ b);
    }break;

    case 31:{//eq (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	if(a == b)
        stack.push(1);
    	else
        stack.push(0);
    }break;
    case 32:{//ne (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	if(a != b)
        stack.push(1);
    	else
        stack.push(0);
    }break;
    case 33:{//gt (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	if(a &amp;gt; b)
        stack.push(1);
    	else
        stack.push(0);
    }break;
    case 34:{//lt (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	if(a &amp;lt; b)
        stack.push(1);
    	else
        stack.push(0);
    }break;
    case 35:{//ge (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	if(a &amp;gt;= b)
        stack.push(1);
    	else
        stack.push(0);
    }break;
    case 36:{//le (&amp;lt;opn1&amp;gt;, &amp;lt;opn2&amp;gt;)
    	let a = stack.pop();
    	let b = stack.pop();
    	if(a &amp;lt;= b)
        stack.push(1);
    	else
        stack.push(0);
    }break;
    default: break run;//halt
    }

	}

}

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (admin)</author>
			<pubDate>Mon, 17 Apr 2017 16:59:00 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=9#p9</guid>
		</item>
		<item>
			<title>Динамическая настройка сети с помощью dnsmasq</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=8#p8</link>
			<description>&lt;p&gt;При подключении к сети новому узлу необходимо задать как минимум ip-адрес и маску. Дополнительно необходимы маршруты в другие сети и адреса локальных сетевых сервисов и других узлов. Для решения этих проблем существуют протоколы -- dhcp и dns. &lt;br /&gt;!!!Для упрощения настроек сети и отладки, на клиентских машинах существует только один путь -- путь по умолчанию до основного сетевого шлюза локальной сети.&lt;/p&gt;
						&lt;p&gt;Рассмотрим динамическую настройку сети с помощью dnsmasq.&lt;/p&gt;
						&lt;p&gt;Dnsmasq — легковесный и быстроконфигурируемый рекурсивный, кэширующий и локальный DNS-сервер, а так же DHCP- и TFTP-сервер.&amp;#160; &lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;0. Подготовка&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Используем две виртуальные машины с tinycore linux -- server и client. &lt;/p&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Сервер&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Установим dnsmasq.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Клиент&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Отключим автозапуск dhcp-клиента или уберем статические настройки сетевого интерфейса.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;1. Настройка dnsmasq&lt;/span&gt;&lt;/p&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Сервер&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Сконфигурируем dnsmasq для динамической раздачи ip-адресов, маршрута по-умолчанию и разрешения имен локального домена.&lt;br /&gt;dnsmasq.conf:&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: 27em&quot;&gt;&lt;pre&gt;
interface=eth0.31    # интерфейс для обслуживания

no-resolv    # не использовать внешние dns-сервера
no-poll    # не следить за обновлением resolv

local=/test/    # локальный домен test

expand-hosts    # дописывать неполные доменные имена
domain=test    # домен по-умолчанию

dhcp-range=192.168.31.100,192.168.31.200,255.255.255.0    # диапазон динамических адресов
dhcp-host=80:00:00:00:31:01,192.168.31.1    # статический ip-адрес выдаваемый по mac-адресу
dhcp-host=80:00:00:00:31:02,192.168.31.2
dhcp-option=option:router,192.168.31.1    # маршрут по-умолчанию
&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;
&amp;gt; echo &amp;quot;192.168.31.1    server server.test&amp;quot; | sudo tee -a /etc/hosts
&amp;gt; echo &amp;quot;192.168.31.2    client client.test&amp;quot; | sudo tee -a /etc/hosts
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;2. Запуск сервиса&lt;/span&gt;&lt;/p&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Сервер&lt;/strong&gt;&lt;/span&gt;&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: 9em&quot;&gt;&lt;pre&gt;
# ip address add 192.168.31.1/24 dev eth0.31
# ip link set up dev eth0.31
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;Сделаем dnsmasq первым dns-сервером:&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;&amp;gt;echo &amp;quot;nameserver 127.0.0.1&amp;quot; | cat /etc/resolv.conf | sudo tee /etc/resolv.conf&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;Cоздадим lease-файл для хранения выданных ip-адресов:&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;&amp;gt; touch /var/cache/dnsmasq.leases&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;Запустим dnsmasq в отладочном режиме с созданным конфигурационным файлом:&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;&amp;gt;dnsmasq -d -C dnsmasq.conf -l /var/cache/dnsmasq.leases&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://sd.uploads.ru/89Fnx.jpg&quot; alt=&quot;http://sd.uploads.ru/89Fnx.jpg&quot; /&gt;&lt;br /&gt;как видно настройки успешно считались&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;3. Проверка сервиса&lt;/span&gt;&lt;/p&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Клиент&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Изначально сетевые настройки сконфигурированы при запуске&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://sf.uploads.ru/lCFE1.jpg&quot; alt=&quot;http://sf.uploads.ru/lCFE1.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Запустим встроенный dhcp-клиент&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s1.uploads.ru/ULIcD.jpg&quot; alt=&quot;http://s1.uploads.ru/ULIcD.jpg&quot; /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Сервер&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;На сервере отобразился диалог dhcp-сервера с dhcp-клиентом:&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s4.uploads.ru/XduAP.jpg&quot; alt=&quot;http://s4.uploads.ru/XduAP.jpg&quot; /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Клиент&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Проверим сетевые настройки&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s2.uploads.ru/dwE5m.jpg&quot; alt=&quot;http://s2.uploads.ru/dwE5m.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Проверим работу сервиса разрешения имен&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s1.uploads.ru/yH5N3.jpg&quot; alt=&quot;http://s1.uploads.ru/yH5N3.jpg&quot; /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
			<author>mybb@mybb.ru (admin)</author>
			<pubDate>Mon, 17 Apr 2017 14:50:40 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=8#p8</guid>
		</item>
		<item>
			<title>Настройка сети с помощью iproute2</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=7#p7</link>
			<description>&lt;p&gt;Настройка сети в ОС может осуществляться 3 способами: &lt;br /&gt;&amp;#160; статически через конфигурационные файлы при инициализации,&lt;br /&gt;&amp;#160; вручную, через интерфейс сетевой подсистемы,&lt;br /&gt;&amp;#160; динамически, через протокол dhcp&lt;/p&gt;
						&lt;p&gt;iproute2 -- это набор утилит унифицирующие управление параметрами сетевых устройств в ядре Linux. Он заменяет классические утилиты:&amp;#160; ifconfig, route, arp, netstat, и предлагает унифицированный и более логичный синтаксис команд настройки.&lt;/p&gt;
						&lt;p&gt;Настроим сеть между клиентом и сервером используя iproute2.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;0. Подготовка&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Используем две виртуальные машины с tinycore linux -- server и client. Обе виртуальные машины подключены к общей сети через мостовое соединение. &lt;/p&gt;
						&lt;p&gt;На обе машины установим пакет iproute2. &lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;1. Vlan*&lt;/span&gt;&lt;br /&gt;* Данный шаг можно пропустить&lt;/p&gt;
						&lt;p&gt;Для изоляции машин от узлов и сервисов существующей сети создадим vlan.&lt;/p&gt;&lt;table style=&quot;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;server, client&lt;/strong&gt;&lt;/span&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;
modprobe 8021q    # подключим модуль ядра
ip link add link eth0 name eth0.31 type vlan id 31    # создадим виртуальный сетевой интерфейс к vlan с номером 31 через eth0
&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: 7.5em&quot;&gt;&lt;pre&gt;
&amp;gt; ip link show
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;a href=&quot;http://uploads.ru/YgflS.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s1.uploads.ru/t/YgflS.jpg&quot; alt=&quot;http://s1.uploads.ru/t/YgflS.jpg&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;2. Настройка сетевого интерфейса&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Зададим mac-адрес, ip-адрес и маску сети.&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! В virtualbox есть проблемы при смене mac-адреса из виртуальной машины.&lt;br /&gt;&lt;a href=&quot;https://superuser.com/questions/1069522/change-mac-address-of-virtualbox-host-only-ethernet-adapter-on-host&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://superuser.com/questions/1069522 &amp;#8230; er-on-host&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;server&lt;/strong&gt;&lt;/span&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: 10.5em&quot;&gt;&lt;pre&gt;
&amp;gt; ip link set dev eth0.31 address 08:00:00:00:31:01    # изменение mac-адреса
&amp;gt; ip address add 192.168.31.1/24 dev eth0.31    # добавление сетевого адреса
&amp;gt; ip link set up dev eth0.31    # включение сетевого интерфейса
&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: 7.5em&quot;&gt;&lt;pre&gt;
&amp;gt; ip address show
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://uploads.ru/1goW3.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s1.uploads.ru/t/1goW3.jpg&quot; alt=&quot;http://s1.uploads.ru/t/1goW3.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;client&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Настройка аналогична server, только адрес узла -- 2.&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;
&amp;gt; ip link set dev eth0.31 address 08:00:00:00:31:02
&amp;gt; ip address add 192.168.31.2/24 dev eth0.31
&amp;gt; ip link set up dev eth0.31
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;3. Проверка правильности настроек&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Проверим работоспособность настроенной сети.&lt;/p&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;client&lt;/strong&gt;&lt;/span&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: 7.5em&quot;&gt;&lt;pre&gt;
&amp;gt; ping 192.168.31.1
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://uploads.ru/NO0bd.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s3.uploads.ru/t/NO0bd.jpg&quot; alt=&quot;http://s3.uploads.ru/t/NO0bd.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Как видно обмен сообщениями ICMP через vlan успешно осуществляется&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
			<author>mybb@mybb.ru (admin)</author>
			<pubDate>Sun, 16 Apr 2017 09:33:09 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=7#p7</guid>
		</item>
		<item>
			<title>bareboot code</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=6#p6</link>
			<description>&lt;p&gt;Запуск своего кода во время загрузки позволяет полностью контролировать работу компьютера, давая полную свободу действий. Рассмотрим процесс создания и запуска &amp;quot;голого&amp;quot; кода.&lt;/p&gt;
						&lt;p&gt;При создании загрузочного кода необходимо учитывать следующие особенности:&lt;br /&gt; -&amp;#160; 16 битный «реальный режим»&lt;br /&gt; -&amp;#160; mbr-код только 446 байт&lt;br /&gt; -&amp;#160; нет системных вызовов и функций ОС, нет библиотек (только статические)&lt;br /&gt; -&amp;#160; есть(эмулируются) прерывания bios&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;1. Hello world&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;В интернете существует множество примеров кода для вывода строки. Так как в дальнейшем этот код станет основной системного загрузчика и других программ, то будем сразу использовать язык программирования си. &lt;/p&gt;
						&lt;p&gt;helloboot.c:&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;
void putch(char ch){                      // функция вывода символа на экран в текстовом режиме
    asm(                                  // ассемблерная вставка, для вызова прерываний bios
&amp;quot;	mov	$0x0e, %ah	&amp;quot;&amp;quot;\n&amp;quot;
&amp;quot;	mov	%[ch], %%al	&amp;quot;&amp;quot;\n&amp;quot;
&amp;quot;	int	$0x10    &amp;quot;&amp;quot;\n&amp;quot;
:
: [ch]&amp;quot;g&amp;quot;(ch)
	);
}

void __attribute__((noreturn)) main() {  // главная функция, которая не завершается
    char *hello=&amp;quot;hello world&amp;quot;;
    char *p = hello;
    while(*p!=0) putch(*p++);            // вывод по символам

    while (1);                           // бесконечное ожидание
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;2. Сборка&lt;/span&gt;&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: 4.5em&quot;&gt;&lt;pre&gt;&amp;gt; gcc -m16 -ffreestanding -fno-builtin -Os -c -o helloboot.o helloboot.c&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;-m16 -- для создания 16 битного кода&lt;br /&gt;-ffreestanding -- код произвольной структуры&lt;br /&gt;-fno-builtin -- не использовать встроенные функции&lt;br /&gt;-Os -- оптимизировать размер&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: 4.5em&quot;&gt;&lt;pre&gt;&amp;gt; ld --oformat binary -Ttext 0x7c00 -e main -o helloboot.bin helloboot.o&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;--oformat binary -- создать образ состоящий только из кода и данных, размещенных последовательно&lt;br /&gt;-Ttext 0x7c00 -- виртуальный адрес начала размещения кода, куда загрузчик передает управление&lt;br /&gt;-e main -- точка входа в программу&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;3. Проверка кода&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Используя утилиты binutills, можно убедиться в правильности создания образа.&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;
&amp;gt;objdump -b binary -m i8086 -x -D -s helloboot.bin
helloboot.bin:     file format binary
helloboot.bin
architecture: UNKNOWN!, flags 0x00000000:

start address 0x00000000

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .data         00000079  00000000  00000000  00000000  2**0
                  CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
no symbols


Contents of section .data:
 0000 66556689 e56683ec 0467668b 45086788  fUf..f...gf.E.g.
 0010 45fcb40e 678a45fc cd109066 c966c366  E...g.E....f.f.f
 0020 556689e5 6683ec10 6766c745 f86d7c00  Uf..f...gf.E.m|.
 0030 0067668b 45f86766 8945fceb 2267668b  .gf.E.gf.E..&amp;quot;gf.
 0040 45fc6766 8d500167 668955fc 678a0066  E.gf.P.gf.U.g..f
 0050 0fbec066 5066e8a5 ffffff66 83c40467  ...fPf.....f...g
 0060 668b45fc 678a0084 c075d2eb fe68656c  f.E.g....u...hel
 0070 6c6f2077 6f726c64 00                 lo world.       

Disassembly of section .data:

00000000 &amp;lt;.data&amp;gt;:
   0:	66 55                	push   %ebp
   2:	66 89 e5             	mov    %esp,%ebp
   5:	66 83 ec 04          	sub    $0x4,%esp
   9:	67 66 8b 45 08       	mov    0x8(%ebp),%eax
   e:	67 88 45 fc          	mov    %al,-0x4(%ebp)
  12:	b4 0e                	mov    $0xe,%ah
  14:	67 8a 45 fc          	mov    -0x4(%ebp),%al
  18:	cd 10                	int    $0x10
  1a:	90                   	nop
  1b:	66 c9                	leavel 
  1d:	66 c3                	retl   
  1f:	66 55                	push   %ebp
  21:	66 89 e5             	mov    %esp,%ebp
  24:	66 83 ec 10          	sub    $0x10,%esp
  28:	67 66 c7 45 f8 6d 7c 	movl   $0x7c6d,-0x8(%ebp)
  2f:	00 00 
  31:	67 66 8b 45 f8       	mov    -0x8(%ebp),%eax
  36:	67 66 89 45 fc       	mov    %eax,-0x4(%ebp)
  3b:	eb 22                	jmp    0x5f
  3d:	67 66 8b 45 fc       	mov    -0x4(%ebp),%eax
  42:	67 66 8d 50 01       	lea    0x1(%eax),%edx
  47:	67 66 89 55 fc       	mov    %edx,-0x4(%ebp)
  4c:	67 8a 00             	mov    (%eax),%al
  4f:	66 0f be c0          	movsbl %al,%eax
  53:	66 50                	push   %eax
  55:	66 e8 a5 ff ff ff    	calll  0x0
  5b:	66 83 c4 04          	add    $0x4,%esp
  5f:	67 66 8b 45 fc       	mov    -0x4(%ebp),%eax
  64:	67 8a 00             	mov    (%eax),%al
  67:	84 c0                	test   %al,%al
  69:	75 d2                	jne    0x3d
  6b:	eb fe                	jmp    0x6b
  6d:	68 65 6c             	push   $0x6c65
  70:	6c                   	insb   (%dx),%es:(%di)
  71:	6f                   	outsw  %ds:(%si),(%dx)
  72:	20 77 6f             	and    %dh,0x6f(%bx)
  75:	72 6c                	jb     0xe3
  77:	64                   	fs
	...
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;Так же перед использованием загрузочного образа, необходимо убедиться, что его размер не превышает 446 байт:&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;
&amp;gt;size --target binary helloboot.bin
   text	   data	    bss	    dec	    hex	filename
      0	     65	      0	     65	     41	helloboot.bin
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;4. Запуск кода&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Тестирование и отладку загружаемого кода, удобнее делать используя виртуальную машину.&lt;br /&gt;Если разработка уже идет из виртуальной машины, то необходимо подключить новый виртуальный диск на несколько мегабайт, и создать разметку mbr с помощью fdisk или parted.&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!!Иначе, лучше тогда создать новый виртуальный фиксированного размера в формате vhd, с файлом которого можно работать как с содержимым обычного диска.&lt;/p&gt;&lt;/blockquote&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: 4.5em&quot;&gt;&lt;pre&gt;&amp;gt;dd if=helloboot.bin of=/dev/sdb&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;Перезагрузимся и выберем новый диск для загрузки:&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/3RbIV.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s2.uploads.ru/t/3RbIV.jpg&quot; alt=&quot;http://s2.uploads.ru/t/3RbIV.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/Fu1pA.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s2.uploads.ru/t/Fu1pA.jpg&quot; alt=&quot;http://s2.uploads.ru/t/Fu1pA.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Видно, что код выполнился и вывел на экран строку.&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! При использовании виртуальной машины qemu, существует возможность отлаживать выполняемый код через gdb.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (admin)</author>
			<pubDate>Sat, 08 Apr 2017 22:35:14 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=6#p6</guid>
		</item>
		<item>
			<title>Динамическая маршрутизация в bird по RIP</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=5#p5</link>
			<description>&lt;p&gt;The BIRD Internet Routing Daemon (bird) -- служба(демон) динамической маршрутизации, поддерживающий множество протоколов динамической маршрутизации.&lt;/p&gt;
						&lt;p&gt;Рассмотрим применение bird для динамической маршрутизации по протоколу RIP.&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! Протокол RIP устарел и не рекомендуется к применению.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;0. Подготовка&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Используем две идентичные виртуальные машины с установленным tinycore linux -- tinycore_1 и tinycore_2. Обе виртуальные машины подключены к общей сети через мостовое соединение. На обе машины установим bird.&lt;br /&gt;Начальные настройки:&lt;/p&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;tinycore_1&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/RmLSc.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s1.uploads.ru/t/RmLSc.jpg&quot; alt=&quot;http://s1.uploads.ru/t/RmLSc.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;tinycore_2&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/B8iJz.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s4.uploads.ru/t/B8iJz.jpg&quot; alt=&quot;http://s4.uploads.ru/t/B8iJz.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;1. Установка и настройка bird&lt;/span&gt;&lt;/p&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;tinycore_1&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;1.1) Установим готовый пакет bird&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/gyP8K.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s3.uploads.ru/t/gyP8K.jpg&quot; alt=&quot;http://s3.uploads.ru/t/gyP8K.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;1.2) Создадим конфигурационный файл bird.conf:&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;
protocol kernel { # взаимодействие с таблицей маршрутизации ОС
	persist; # сохранять маршруты после завершения bird
	scan time 20; # время проверки в секундах
	export all; # анонсировать маршруты
}

protocol device { # настройки для всех протоколов
	scan time 10; # время обновления в секундах
}

protocol static { # статичные маршруты
	route 192.168.111.0/24 via 192.168.1.111;
}

protocol rip { # настройки RIP
	debug all; # режим отладки
	interface &amp;quot;eth*&amp;quot;; # (address ip; mode multicast|broadcast; version 1|2;) сетевой интерфейс для настройки 
	export all; # анонсировать маршруты
	import all; # обновлять маршруты
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! Если маршруты не обновляются, измените используемую интерфейсом multicast-группу или замените ее на широковещательную, или смените версию протокола на rip1.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;tinycore_2&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;1.3) На tinycore шаги такие же -- 1.1, 1.2, кроме строки со статическим маршрутом.&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;
...
	route 192.168.222.0/24 via 192.168.1.222;
...
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;2. Запуск и проверка bird&lt;/span&gt;&lt;/p&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;tinycore_1&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;2.1) Запустим bird в отладочном режиме с созданным конфигурационным файлом:&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;&amp;gt; sudo bird -d -c bird.conf&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;&lt;a href=&quot;http://uploads.ru/L1Sev.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s5.uploads.ru/t/L1Sev.jpg&quot; alt=&quot;http://s5.uploads.ru/t/L1Sev.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Из вывода можно заметить:&lt;br /&gt; -&amp;#160; bird успешно заработал&lt;br /&gt; -&amp;#160; был добавлен статический маршрут&lt;br /&gt; -&amp;#160; rip протокол начал обмениваться рассылкой через интерфейс eth0 с портом 520, в режиме multicast с группой 224.0.0.9&lt;br /&gt;[/list]&lt;/p&gt;
						&lt;p&gt;2.2) Переключившись в консоль tty2 можно проверить результаты с помощью команды просмотра таблицы маршрутизации -- route, и консоли bird -- birdc.&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;
&amp;gt; birdc
: show route
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://uploads.ru/QvT3u.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s2.uploads.ru/t/QvT3u.jpg&quot; alt=&quot;http://s2.uploads.ru/t/QvT3u.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;В таблицу маршрутизации был добавлен статический маршрут.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;tinycore_2&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;2.3) Запустим bird на второй машине&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/aAjt6.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://sa.uploads.ru/t/aAjt6.jpg&quot; alt=&quot;http://sa.uploads.ru/t/aAjt6.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Видно, что произошел обмен маршрутами и в дальнейшем, до их изменения, они будут отвергаться -- garbage.&lt;/p&gt;
						&lt;p&gt;2.4) Проверим содержимое таблицы маршрутизации:&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/tSAnr.jpg&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/tSAnr.jpg&quot; alt=&quot;http://s9.uploads.ru/t/tSAnr.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Видно, что от tinycore_1(192.168.1.168) был получен новый маршрут и вернулся уже существующий.&lt;/p&gt;
						&lt;p&gt;2.5) Измерив трафик между tinycore_1 и tinycore_2 можно&amp;#160; оценить нагрузку на сеть. Для небольшой таблицы маршрутизации из примера: около 240 байт/мин.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;??? Заменить картинки текстом&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (admin)</author>
			<pubDate>Sat, 08 Apr 2017 08:09:37 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=5#p5</guid>
		</item>
		<item>
			<title>[1.1 Controllers]</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=4#p4</link>
			<description>&lt;p&gt;Для взаимодействием с пользователем компьютерной игре нужно отслеживать состояния контроллеров: кнопки, мышь, регуляторы и т.п. Для унификации используется единая структура для хранения текущего состояния контроллеров, которая обновляться при изменении состояний контроллов.&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! При обработке ввода, кажется вполне естественным сразу выполнять нужные действия, по событиям от контроллеров, а не сохранять их в структуре. Однако это усложняет логику работы игры (=&amp;gt;framework/main), разбрасывая действия по всей программе. Так при создании игры сложнее тетриса получается мешанина из обработчиков, в каждом из которых приходиться учитывать действия остальных.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;Рассмотрим реализацию на javascript+html5. Для хранения состояний будем использовать ассоциативный массив -- controllers: ключ -- имя контролла, значение -- его состояние. В input хранятся, только те контроллы, которые нужны игре. Например:&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: 21em&quot;&gt;&lt;pre&gt;
var controllers = {
	w:0,
	s:0,
	a:0,
	d:0,
	mouse1:0,
	mouse2:0,
	mouse3:0,
	mousePos:0,
};
&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: 13.5em&quot;&gt;&lt;pre&gt;
function input(ctr, val){
    if(controllers[ctr] !== undefined){
        controllers[ctr] = val;
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;На javascript+html5 изначально доступно два контроллера -- клавиатура и мышь.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;Клавиатура.&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Для учета текущего состояния кнопки, достаточно хранить либо 0, либо 1. Комбинации нажатий кнопок определяются по установленным 1 в input.&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! Фиксировать клики или двойные клики, мало полезно, так как не учитывает как давно они произошли.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;Для того, что бы элемент-контейнер мог перехватывать нажатия клавиш необходимо установить его свойство tabIndex=1 и добавить обработчики событий:&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;
addEventListener(&amp;quot;keydown&amp;quot;, function(event){gp_input(event.key,1);});
addEventListener(&amp;quot;keyup&amp;quot;, function(event){gp_input(event.key,0);});
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;Мышь.&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Кроме состояний кнопок мыши, необходимо сохранять точку в которой было нажатие, и позицию мыши. Вместо хранения 1, будем хранить структуру содержащую координаты мыши во время нажатия на кнопку. Текущие координаты, хранятся в специальном поле, если мышь находится в пределах игрового фрема.&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: 12em&quot;&gt;&lt;pre&gt;
addEventListener(&amp;quot;mousedown&amp;quot;, function(event){gp_input(&amp;quot;mouse&amp;quot;+event.which,{x:event.clientX,y:event.clientY});});
addEventListener(&amp;quot;mouseup&amp;quot;, function(event){gp_input(&amp;quot;mouse&amp;quot;+event.which,0);});
addEventListener(&#039;mousemove&#039;, function(event){gp_input(&amp;quot;mousePos&amp;quot;,{x:event.clientX,y:event.clientY});});
addEventListener(&#039;mouseleave&#039;, function(event){gp_input(&amp;quot;mousePos&amp;quot;,0);});
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;??? добавить захват мыши, если возможно в html5&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;При инициализации фрейма, необходимо учитывать какие обработчики нужны. Для этого используем значения маски-фильтра -- INPUTMASK и заодно инициализируем ассоциативный массив:&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;
var INPUTMASK={keyb:[&#039;w&#039;,&#039;s&#039;],mouseBtn:[1,2],mousePos:1};

gp.tabIndex=1;
if(INPUTMASK.keyb!==undefined){
    gp.addEventListener(&amp;quot;keydown&amp;quot;, function(event){gp_input(event.key,1);});
    gp.addEventListener(&amp;quot;keyup&amp;quot;, function(event){gp_input(event.key,0);});
    INPUTMASK.keyb.forEach((e)=&amp;gt;{
        gp_Controllers[e] = 0;
    });
}
if(INPUTMASK.mouseBtn!==undefined){
    gp.addEventListener(&amp;quot;mousedown&amp;quot;, function(event){gp_input(&amp;quot;mouse&amp;quot;+event.which,{x:event.clientX,y:event.clientY});});
    gp.addEventListener(&amp;quot;mouseup&amp;quot;, function(event){gp_input(&amp;quot;mouse&amp;quot;+event.which,0);});
    INPUTMASK.mouseBtn.forEach((e)=&amp;gt;{
        gp_Controllers[&amp;quot;mouse&amp;quot;+e] = 0;
    });
}
if(INPUTMASK.mousePos!==undefined){
    gp.addEventListener(&#039;mousemove&#039;, function(event){gp_input(&amp;quot;mousePos&amp;quot;,{x:event.clientX,y:event.clientY});});
    gp.addEventListener(&#039;mouseleave&#039;, function(event){gp_input(&amp;quot;mousePos&amp;quot;,0);});
    gp_Controllers[&amp;quot;mousePos&amp;quot;] = 0;
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&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;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;

const WIDTH = 640;
const HEIGHT = 480;
var INPUTMASK={keyb:null,mouseBtn:[1],mousePos:null};

var gp_Controllers = {
};
var gp_CanvasContex;


function gp_input(ctr, val){
    if(gp_Controllers[ctr] !== undefined){
        gp_Controllers[ctr] = val;
    }
}

function gp_draw(image, x, y){
    gp_CanvasContex.drawImage(image, x, y);
}

function gp_clear(){
    gp_CanvasContex.clearRect(0,0,WIDTH, HEIGHT);
}

function gp_play(sound){
    sound.load();
    sound.play();
}


function gp_init(){
    var gp = document.getElementById(&amp;quot;gamePanel&amp;quot;);

    gp.tabIndex=1;
    if(INPUTMASK.keyb!==null){
        gp.addEventListener(&amp;quot;keydown&amp;quot;, function(event){gp_input(event.key,1);});
        gp.addEventListener(&amp;quot;keyup&amp;quot;, function(event){gp_input(event.key,0);});
        INPUTMASK.keyb.forEach((e)=&amp;gt;{
            gp_Controllers[e] = 0;
        });
    }
    if(INPUTMASK.mouseBtn!==null){
        gp.addEventListener(&amp;quot;mousedown&amp;quot;, function(event){gp_input(&amp;quot;mouse&amp;quot;+event.which,{x:event.clientX,y:event.clientY});});
        gp.addEventListener(&amp;quot;mouseup&amp;quot;, function(event){gp_input(&amp;quot;mouse&amp;quot;+event.which,0);});
        INPUTMASK.mouseBtn.forEach((e)=&amp;gt;{
            gp_Controllers[&amp;quot;mouse&amp;quot;+e] = 0;
        });
    }
    if(INPUTMASK.mousePos!==null){
        gp.addEventListener(&#039;mousemove&#039;, function(event){gp_input(&amp;quot;mousePos&amp;quot;,{x:event.clientX,y:event.clientY});});
        gp.addEventListener(&#039;mouseleave&#039;, function(event){gp_input(&amp;quot;mousePos&amp;quot;,0);});
        gp_Controllers[&amp;quot;mousePos&amp;quot;] = 0;
    }

    var canvas = document.createElement(&amp;quot;canvas&amp;quot;);
    canvas.id = &amp;quot;gameCanvas&amp;quot;;
    canvas.width = WIDTH;
    canvas.height = HEIGHT;
    canvas.style=&amp;quot;background-color:black;&amp;quot;;
    gp.appendChild(canvas);
    gp_CanvasContex = canvas.getContext(&#039;2d&#039;);
}

function main(){
    gp_init();
    document.getElementById(&#039;snd1&#039;).load();

    gp_clear();
    var dx=10,dy=10;
    var x=10,y=10;
    window.setInterval(()=&amp;gt;{
        gp_draw(document.getElementById(&#039;img1&#039;),x,y);
        gp_play(document.getElementById(&#039;snd1&#039;));

        if(gp_Controllers[&#039;mouse1&#039;]!=0){
            dx = (x &amp;gt; gp_Controllers[&#039;mouse1&#039;].x)? -10:10;
            dy = (y &amp;gt; gp_Controllers[&#039;mouse1&#039;].y)? -10:10;
        }

        x+=dx;y+=dy;
        if(x&amp;gt;WIDTH || y &amp;gt; HEIGHT){
            gp_clear();
            x=10;y=10;
        }
    },1000);

}
    &amp;lt;/script&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;button onclick=&amp;quot;main();&amp;quot;&amp;gt;start&amp;lt;/button&amp;gt;
    &amp;lt;div class=&amp;quot;gamepanel&amp;quot; id=&amp;quot;gamePanel&amp;quot;&amp;gt;
        &amp;lt;img id=&amp;quot;img1&amp;quot; style=&amp;quot;display:none;&amp;quot; src=&amp;quot;http://vt.chuvsu.ru/misc/favicon.ico&amp;quot;&amp;gt;
        &amp;lt;audio id=&amp;quot;snd1&amp;quot; src=&amp;quot;http://www.sounds.beachware.com/2illionzayp3may/ovbzl/PIECES.mp3&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (admin)</author>
			<pubDate>Wed, 05 Apr 2017 21:21:46 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=4#p4</guid>
		</item>
		<item>
			<title>Сплиттер</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=3#p3</link>
			<description>&lt;p&gt;Сплиттер -- простейший лексический анализатор разбивающий входной текст на слова (токенайзер).&lt;/p&gt;
						&lt;p&gt;У данного типа анализаторов есть следующие проблемы -- разделение подряд идущих слов и группировка в текстовые блоки состоящие из мелких слов. Первая не &lt;em class=&quot;bbuline&quot;&gt;&lt;span style=&quot;font-style: italic&quot;&gt;???решаема???&lt;/span&gt;&lt;/em&gt;, из-за особенностей работы сплиттера. Вторая может быть решена с помощью эскейп-последовательностей. Но при это появляется проблема экранирования вложенных эскейп-символов и символов-экранирования. Попробуем решить данную проблему используя два эскейп-символа -- открывающий и закрывающий.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&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;
&amp;lt;S&amp;gt;::=&amp;lt;text&amp;gt; #eoln

&amp;lt;text&amp;gt;::=
    | &amp;lt;token&amp;gt;
    | &amp;lt;token&amp;gt; &amp;lt;delims&amp;gt; &amp;lt;text&amp;gt;    ;последовательность
    | &amp;lt;delims&amp;gt; &amp;lt;text&amp;gt;

&amp;lt;token&amp;gt;::=
    | &amp;lt;word&amp;gt;    ;слово
    | #beg &amp;lt;group&amp;gt; #end    ;группировка
    | #beg &amp;lt;group&amp;gt;
    | #beg #end
    | #beg
    | &amp;lt;word&amp;gt; &amp;lt;token&amp;gt;    ;конкатенация

&amp;lt;word&amp;gt;::=
    | #!DELIM_BEG_EOLN
    | #!DELIM_BEG_EOLN &amp;lt;word&amp;gt;

&amp;lt;group&amp;gt;::=
    | #!END_EOLN
    | #!END_EOLN &amp;lt;group&amp;gt;

&amp;lt;delims&amp;gt;::=
    | #delim
    | #delim &amp;lt;delims&amp;gt;

#delim::    ;разделители
#eoln::    ;конец строки
#beg::    ;начало группы
#end::    ;конец группы
#!END_EOLN::    ;все, кроме символа конца группы и конца строки
#!DELIM_BEG_EOLN::    ;все, кроме символов начала группы и символов разделителя и конца строки
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&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;
&amp;lt;S&amp;gt;::=&amp;lt;text&amp;gt; #eoln

&amp;lt;text&amp;gt;::=
    | &amp;lt;token&amp;gt; !out(tok), tok=&amp;quot;&amp;quot;!
    | &amp;lt;token&amp;gt; !out(tok), tok=&amp;quot;&amp;quot;! &amp;lt;delims&amp;gt; &amp;lt;text&amp;gt;
    | &amp;lt;delims&amp;gt; &amp;lt;text&amp;gt;

&amp;lt;token&amp;gt;::=
    | &amp;lt;word&amp;gt;    ;слово
    | #beg &amp;lt;group&amp;gt; #end
    | #beg &amp;lt;group&amp;gt;
    | #beg #end
    | #beg
    | &amp;lt;word&amp;gt; &amp;lt;token&amp;gt;

&amp;lt;word&amp;gt;::=
    | #!DELIM_BEG_EOLN !tok+=ch!
    | #!DELIM_BEG_EOLN !tok+=ch! &amp;lt;word&amp;gt;

&amp;lt;group&amp;gt;::=
    | #!END_EOLN !tok+=ch!
    | #!END_EOLN !tok+=ch! &amp;lt;group&amp;gt;

&amp;lt;delims&amp;gt;::=
    | #delim
    | #delim &amp;lt;delims&amp;gt;

#delim::
#eoln::
#beg::
#end::
#!END_EOLN::
#!DELIM_BEG_EOLN::
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;После преобразования в недетерменированный конечный автомат:&lt;/p&gt;
						&lt;p&gt;После минимизации и оптимизации:&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/znpdb.png&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://sd.uploads.ru/t/znpdb.png&quot; alt=&quot;http://sd.uploads.ru/t/znpdb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;После преобразования в детерминированный конечный автомат:&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/oDc8P.png&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://sg.uploads.ru/t/oDc8P.png&quot; alt=&quot;http://sg.uploads.ru/t/oDc8P.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Сравните с построенным вручную:&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/IdasC.png&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s7.uploads.ru/t/IdasC.png&quot; alt=&quot;http://s7.uploads.ru/t/IdasC.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;TODO:перерисовать&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;TODO:добавить действия&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Реализация на javascript.&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;
function splitter(input, delims=&amp;quot; \t\n&amp;quot;, beg=&#039;&amp;lt;&#039;, end=&#039;&amp;gt;&#039;){
    var output = [];

    var tok=&amp;quot;&amp;quot;;
    var state=0;
    var pos=0;
    while(state != -1){
        let ch = (pos&amp;lt;input.length)?input[pos++]:0;
        switch(state){
            case 0:
                if(ch == beg){
                    state = 2;
                }else if(ch === 0){
                    state = -1;
                }else if(delims.indexOf(ch)!=-1){
                    state = 0;
                }else{
                    tok+=ch;
                    state = 1;
                }
                break;
            case 1:
                if(ch == beg){
                    state = 2;
                }else if(ch === 0){
                    output.push(tok);
                    state = -1;
                }else if(delims.indexOf(ch)!=-1){
                    output.push(tok);tok=&amp;quot;&amp;quot;;
                    state = 0;
                }else{
                    tok+=ch;
                    state = 1;
                }
                break;
            case 2:
                if(ch == end){
                    state = 1;
                }else if(ch === 0){
                    output.push(tok);
                    state = -1;
                }else{
                    tok+=ch;
                    state = 2;
                }
                break;
        }
    }

    return output;
}
&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: 7.5em&quot;&gt;&lt;pre&gt;splitter(&amp;quot;abc 123   \t &amp;lt; &amp;gt;  &amp;lt;&amp;lt;&amp;gt; &amp;gt;  123&amp;lt;456&amp;gt; &amp;quot;);
Array [ &amp;quot;abc&amp;quot;, &amp;quot;123&amp;quot;, &amp;quot; &amp;quot;, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;, &amp;quot;123456&amp;quot; ]
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (admin)</author>
			<pubDate>Mon, 03 Apr 2017 18:40:16 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=3#p3</guid>
		</item>
		<item>
			<title>[1. игровой фрейм]</title>
			<link>https://afterless.mybb.ru/viewtopic.php?pid=2#p2</link>
			<description>&lt;p&gt;Ключевой элемент игры -- игровой фрейм, через который осуществляется взаимодействия игрока с игрой.&lt;br /&gt;Необходимые возможности:&lt;br /&gt; - инициализация,&lt;br /&gt; - отображение изображения в заданной позиции и очистка,&amp;#160; &lt;br /&gt; - воспроизведение звуков,&lt;br /&gt; - слежение за состоянием контроллеров и проверка текущего состояния.&lt;/p&gt;
						&lt;p&gt;Так же необходимы объекты для хранения и манипулирования ресурсами:&lt;br /&gt; - картинки,&lt;br /&gt; - аудио-семплы,&lt;br /&gt; - состояние контролла.&lt;/p&gt;
						&lt;p&gt;Для демонстрации будем использовать javascript c html5, так как у него есть все необходимые возможности и не надо организовывать среду для сборки проекта. Демка проверялась на firefox 52.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Для хранения картинок и семплов используем стандартные теги &amp;lt;img&amp;gt; и &amp;lt;audio&amp;gt;. &lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;TODO в дальнейшем лучше перейти на ImageData и AudioBuffer -- для&amp;#160; создания спецэффектов (physics/spec.effects)&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;??? к сожалению нет способа взаимного преобразования &amp;lt;audio&amp;gt; и AudioBuffer&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;Состояния контроллов -- либо единственное значение, либо структура с соответствующими полями.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Для вывода изображения во фрейме используется метод Canvas -- drawImage(image, x, y), а для очистки --&amp;#160; clearRect(0,0,WIDTH, HEIGHT);&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! можно использовать стили для размещения в нужной позиции, но для множества мелких повторяющихся изображений это не эффективно&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Используя &amp;lt;audio&amp;gt; воспроизвести звук можно с помощью метода play().&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! повторный вызов, до завершения предыдущего, будет проигнорирован, поэтому нужен метод перезагрузки -- load()&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!? из-за защиты в браузере, без инициации воспроизведения пользователем, семплы не будут воспроизводиться&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;TODO необходимо переделать на вывод по каналам, и цикличное воспроизведение&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Слежение за вводом можно осуществить с помощью запоминания событий от контроллов в ассоциативном массиве -- input[{ctr:va}l]. Проверка состояния -- проверка значения соответствующего контролла -- input[ctr]. &lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;!!! Подробнее в (framework/controllers)&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Для инициализации фрема задаются размеры канвы, отслеживаемые контроллы. При инициализации создается &amp;lt;canvas&amp;gt; заданного размера и устанавливаются обработчики на нужные события -- addEventListener(event, handler()). После инициализации &lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;TODO в дальнейшем добавить инициализацию звуковых каналов&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&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;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;

const WIDTH = 640;
const HEIGHT = 480;


var gp_Inputs = {
};

function gp_input(ctr, val){
    if(gp_Inputs[ctr] !== undefined){
        gp_Inputs[ctr] = val;
    }
}

var gp_CanvasContex;
function gp_draw(image, x, y){
    gp_CanvasContex.drawImage(image, x, y);
}

function gp_clear(){
    gp_CanvasContex.clearRect(0,0,WIDTH, HEIGHT);
}

function gp_play(sound){
    sound.load();
    sound.play();
}


function gp_init(){
    var gp = document.getElementById(&amp;quot;gamePanel&amp;quot;);

    //init event listeners

    var canvas = document.createElement(&amp;quot;canvas&amp;quot;);
    canvas.id = &amp;quot;gameCanvas&amp;quot;;
    canvas.width = WIDTH;
    canvas.height = HEIGHT;
    canvas.style=&amp;quot;background-color:black;&amp;quot;;
    gp.appendChild(canvas);
    gp_CanvasContex = canvas.getContext(&#039;2d&#039;);
}

function main(){
    gp_init();

    //resource load
    document.getElementById(&#039;snd1&#039;).load();

    gp_clear();
    var x=10,y=10;
    window.setInterval(()=&amp;gt;{
        gp_draw(document.getElementById(&#039;img1&#039;),x,y);
        gp_play(document.getElementById(&#039;snd1&#039;));

        x+=10;y+=10;
        if(x &amp;gt; WIDTH || y &amp;gt; HEIGHT){
            gp_clear();
            x=10;y=10;
        }
    },1000);

}
    &amp;lt;/script&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;button onclick=&amp;quot;main();&amp;quot;&amp;gt;start&amp;lt;/button&amp;gt;
    &amp;lt;div class=&amp;quot;gamepanel&amp;quot; id=&amp;quot;gamePanel&amp;quot;&amp;gt;
        &amp;lt;img id=&amp;quot;img1&amp;quot; style=&amp;quot;display:none;&amp;quot; src=&amp;quot;http://vt.chuvsu.ru/misc/favicon.ico&amp;quot;&amp;gt;
        &amp;lt;audio id=&amp;quot;snd1&amp;quot; src=&amp;quot;http://www.sounds.beachware.com/2illionzayp3may/ovbzl/PIECES.mp3&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;hr /&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;TODO оформить в виде модуля&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;TODO отделить вывод изображений, звуков, инициализация ресурсов&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box hide-box term-login&quot;&gt;&lt;cite&gt;Скрытый текст:&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Для просмотра скрытого текста - &lt;a href=&quot;/login.php&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;войдите&lt;/a&gt; или &lt;a rel=&quot;nofollow&quot; href=&quot;/register.php&quot; target=&quot;_blank&quot;&gt;зарегистрируйтесь&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (admin)</author>
			<pubDate>Mon, 27 Mar 2017 15:21:14 +0300</pubDate>
			<guid>https://afterless.mybb.ru/viewtopic.php?pid=2#p2</guid>
		</item>
	</channel>
</rss>
