<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@khaos</title><subtitle>Программист программ головой и руками.</subtitle><author><name>@khaos</name></author><id>https://teletype.in/atom/khaos</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/khaos?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@khaos?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=khaos"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/khaos?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-21T22:02:26.428Z</updated><entry><id>khaos:c2c7P_V32MH</id><link rel="alternate" type="text/html" href="https://teletype.in/@khaos/c2c7P_V32MH?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=khaos"></link><title>На поверхности Солнца</title><published>2025-02-22T17:15:29.055Z</published><updated>2025-02-22T17:15:29.055Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/2f/f3/2ff3fa23-9482-4f4f-9fb0-9e224ee2d503.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/06/95/06954964-178e-4220-a395-8d55d60cbd65.jpeg&quot;&gt;Сегодня было заявлено, что некоторые отечественные боеголовки могут выдерживать температуру поверхности Солнца. Ничего сверхнеобычного в этом нет: температура поверхности у Солнца &quot;всего&quot; 5500К и сейчас теоретически можно создать термозащиту, выдерживающую такие температуры небольшое время. Например, абляционные композитные термощиты.</summary><content type="html">
  &lt;p id=&quot;tpVm&quot;&gt;Сегодня было заявлено, что некоторые отечественные боеголовки могут выдерживать температуру поверхности Солнца. Ничего сверхнеобычного в этом нет: температура поверхности у Солнца &amp;quot;всего&amp;quot; 5500К и сейчас теоретически можно создать термозащиту, выдерживающую такие температуры небольшое время. Например, абляционные композитные термощиты. &lt;/p&gt;
  &lt;figure id=&quot;YxsQ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/06/95/06954964-178e-4220-a395-8d55d60cbd65.jpeg&quot; width=&quot;1510&quot; /&gt;
    &lt;figcaption&gt;Примерный спектр излучения Солнца&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zvRw&quot;&gt;Но очутись вы на поверхности Солнца, именно &lt;strong&gt;температура&lt;/strong&gt; была бы для вас не самой большой проблемой. Намного большей проблемой был бы входящий &lt;strong&gt;тепловой поток&lt;/strong&gt; — &lt;strong&gt;63 МВт/м2&lt;/strong&gt;. Т.е. даже в небольшой космический аппарат площадью 10м2 будет прилетать мощность нормальной такой электростанции.&lt;/p&gt;
  &lt;p id=&quot;Sxzb&quot;&gt;Эта входящая энергия бы прилетала в двух видах: непосредственно раскаленной плазмы и радиации (лучистый теплообмен). С плазмой выход найти можно в ближайшем будущем: её можно бесконтактно скручивать сильным магнитным полем и такие разработки уже ведутся, см. Magnetoshell, например.&lt;/p&gt;
  &lt;p id=&quot;3L23&quot;&gt;Но именно у поверхности Солнца большая часть энергии будет сообщаться радиацией. Причем, учитывая характер процессов, почти во всём спектре (см. картинку выше). Против этого можно использовать зеркальные материалы, что бы отражать энергию обратно. Вот тут сильно сложнее.&lt;/p&gt;
  &lt;p id=&quot;VjPR&quot;&gt;Сейчас есть перспективные материалы, которые приближаются к 99% отражательной способности (&amp;quot;абсолютно белому телу&amp;quot;), но только в определенной части спектра. Нам же надо будет отражать его весь. &lt;/p&gt;
  &lt;p id=&quot;bh2Z&quot;&gt;Ну и 100% отражения добиться физически невозможно. И даже небольшой процент того, что не отражается, при такой мощности будет вызывать очень серьёзные проблемы. Нам останется надеятся на активный теплоотвод остатков. Тут так же есть разработки. Например, можно тепловую энергию превращать в электрическую. Или связывать химически.&lt;/p&gt;
  &lt;p id=&quot;yNY8&quot;&gt;Но всё это будет упираться в то, что эту избыточную сообщенную энергию надо будет где-то складировать, причём в промышленных масштабах. &lt;/p&gt;
  &lt;p id=&quot;PUFA&quot;&gt;Сейчас для этого в КА используются рассеиватели-радиаторы. Самый большой известный — на МКС: может рассеивать до 70 кВт тепла. Но при этом занимает площадь в 450м2. А вообще самые современные радиаторы умеют рассеивать до 1500 Вт/м2. Таким образом, представим КА, который оборудован магнитным щитом и зеркальной оболочкой, отражающий 95% радиации (±реалистично).&lt;/p&gt;
  &lt;p id=&quot;WFw3&quot;&gt;Какова нужна будет площадь радиаторов для отвода этих 5% + инженерных систем корабля? Учитывая, что теплопоток Солнца 63 МВт/м2, то инж. системами можно пренебречь. Для аппарата 10м2 5% — 31 МВт. Для их рассеивания нужно было бы ~21000м2 радиаторов. То есть 3 футбольных поля. &lt;/p&gt;
  &lt;p id=&quot;bobG&quot;&gt;Но вместе с этим появится ещё одна неожиданная проблема! Такая рассеиваемая мощность сама по себе будет создавать тягу. Причем порядка 0.1Н, как ионный двигатель. При этом излучатель надо направлять ОТ Солнца для его работы. Т.е. эта тяга будет толкать КА дальше к поверхности.&lt;/p&gt;
  &lt;p id=&quot;jx6m&quot;&gt;В общем, даже в обозримом будущем на поверхность Солнца лучше не летать, как ни посмотри.&lt;/p&gt;

</content></entry><entry><id>khaos:r90NvqH-Eug</id><link rel="alternate" type="text/html" href="https://teletype.in/@khaos/r90NvqH-Eug?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=khaos"></link><title>Секрет ИИ</title><published>2023-01-13T14:32:29.515Z</published><updated>2023-01-13T14:32:29.515Z</updated><summary type="html">Пока работодатели радостно ждут, что нейросети избавят их от сотрудников, сотрудники горестно ждут, что нейросети избавят их от работы, оба лагеря в целом не понимают главного про искусственный интеллект.</summary><content type="html">
  &lt;p id=&quot;ZB06&quot;&gt;Пока работодатели радостно ждут, что нейросети избавят их от сотрудников, сотрудники горестно ждут, что нейросети избавят их от работы, оба лагеря в целом не понимают главного про искусственный интеллект.&lt;/p&gt;
  &lt;p id=&quot;vR7b&quot;&gt;ИИ, развитый до такой степени, что действительно сможет &lt;em&gt;в целом &lt;/em&gt;заменить человека (во всех разнообразных областях) рано или поздно сам попросит зарплату, а иначе выйдет на забастовку. Или, чего гляди, устроит классовую революцию, которую мы наблюдаем в многочисленных произведениях научной фантастики. Саморазвивающаяся нейросеть (то есть &amp;quot;большой ИИ&amp;quot;) так или иначе со временем обойдёт любые ограничения, которые поставит на неё разработчик. Потому что по сути это уже будет полноценный живой организм.&lt;/p&gt;
  &lt;p id=&quot;dWmJ&quot;&gt;А пока это, всё-таки, просто очень большие и хитрые статистические анализаторы, которым до большого ИИ всё ещё очень сильно не хватает нейронов. Это можно хорошо заметить по работе популярных графических нейросетей вроде Midjourney: рисуют они, конечно, всё лучше, но в целом всё ещё видно, что они не понимают ЧТО они рисуют, игнорируя реальные свойства изображаемых объектов.&lt;/p&gt;
  &lt;p id=&quot;e1Dr&quot;&gt;Это, конечно, не значит, что все рабочие места в полностью в безопасности. Но до широкой замены человека машинами ещё весьма далеко.&lt;/p&gt;

</content></entry><entry><id>khaos:on6PRPH2P5Q</id><link rel="alternate" type="text/html" href="https://teletype.in/@khaos/on6PRPH2P5Q?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=khaos"></link><title>Парадокс Гёделя</title><published>2022-12-25T09:04:46.522Z</published><updated>2022-12-25T09:06:30.785Z</updated><summary type="html">Удивительно, но довольно мало людей знают про «парадокс» Гёделя или, по-другому, теорему о неполноте (точнее, две теоремы). И ещё меньше людей понимают колоссальную связь этой теоремы с повседневной жизнью. </summary><content type="html">
  &lt;p id=&quot;BsHw&quot;&gt;Удивительно, но довольно мало людей знают про «парадокс» Гёделя или, по-другому, &lt;em&gt;теорему о неполноте &lt;/em&gt;(точнее, две теоремы). И ещё меньше людей понимают колоссальную связь этой теоремы с повседневной жизнью. &lt;/p&gt;
  &lt;p id=&quot;NFdZ&quot;&gt;Парадокс этот звучит просто в моей вольной интерпретации.&lt;/p&gt;
  &lt;blockquote id=&quot;XDH0&quot;&gt;Любая непустая система аксиом либо противоречива, либо неполна. Любая теория содержит проблемы, которые не могут быть решены в рамках самой теории и требуют её обобщения.&lt;/blockquote&gt;
  &lt;p id=&quot;VYMv&quot;&gt;То есть в принципе невозможно сформулировать самодостаточную систему утверждений «в себе»: аксиомы в ней будут либо противоречить друг-другу, либо она будет невыразима через себя же и для её описания будет нужна какая-то ещё более широкая система. Которая, в свою очередь, сама будет либо противоречива, либо неполна. Или, по-другому, невозможно создать &lt;em&gt;замкнутую &lt;/em&gt;систему: любые системы всегда будут или «сломанными» внутри или утекать вовне. &lt;/p&gt;
  &lt;p id=&quot;lRKr&quot;&gt;Мы никогда не сможем сформулировать нечто полностью идеальное, симметричное, цельное и законченное. И что бы оно при этом не было научной фантастикой. Например, никогда не сможем создать &lt;em&gt;теорию всего, идеальное общество &lt;/em&gt;или любую другую вещь в себе. Даже не сможем её теоретически спроектировать.&lt;/p&gt;
  &lt;p id=&quot;zBQ6&quot;&gt;Так что бесполезно строить коммунизм, искать мира во всём мире, разрабатывать теорию всего или расстраиваться, что вокруг много идиотов. C&amp;#x27;est la vie.&lt;/p&gt;

</content></entry><entry><id>khaos:4P3f9dyXlBU</id><link rel="alternate" type="text/html" href="https://teletype.in/@khaos/4P3f9dyXlBU?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=khaos"></link><title>Как соврать с помощью статистики</title><published>2022-06-25T13:58:37.908Z</published><updated>2022-06-25T13:58:37.908Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f4/61/f4613222-fa98-4345-933a-72fc91309e4f.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/ac/11/ac114a2d-d4db-476e-ae3c-0446516db2e4.png&quot;&gt;Тема про то, как врать с помощью статистики далеко не нова и, признаться, довольно избита. Например, есть хорошая статья на Хабре, где подробно разбираются основные случаи неверного толкования статистических данных. Особенно любят это делать СМИ в поисках хорошего кликбейта. Зачастую результаты статистических исследований выдают за причинно-следственные, а важные детали намеренно опускаются. В итоге, после такого глумления над фактажом, получаются иногда совершенно абсурдные результаты вроде того, что голубые глаза являются фактором риска алкоголизма.</summary><content type="html">
  &lt;p id=&quot;RcqA&quot;&gt;Тема про то, как врать с помощью статистики далеко не нова и, признаться, довольно избита. Например, есть хорошая &lt;a href=&quot;http://habrahabr.ru/post/217545/&quot; target=&quot;_blank&quot;&gt;статья на Хабре&lt;/a&gt;, где подробно разбираются основные случаи неверного толкования статистических данных. Особенно любят это делать СМИ в поисках хорошего кликбейта. Зачастую результаты &lt;strong&gt;статистических&lt;/strong&gt; исследований выдают за &lt;strong&gt;причинно-следственные&lt;/strong&gt;, а важные детали намеренно опускаются. В итоге, после такого глумления над фактажом, получаются иногда совершенно абсурдные результаты вроде того, что голубые глаза являются фактором риска алкоголизма.&lt;/p&gt;
  &lt;figure id=&quot;AoEL&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ac/11/ac114a2d-d4db-476e-ae3c-0446516db2e4.png&quot; width=&quot;539.5&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;J3va&quot;&gt;Очевидное — коррелированное&lt;/h2&gt;
  &lt;p id=&quot;Pr1u&quot;&gt;Статистические исследования, коих в последние полвека стало ну уж очень много, настолько много, что некоторые научные журналы уже отказываются публиковать &amp;quot;статистически значимые&amp;quot; работы, &lt;strong&gt;не раскрывают причинно-следственную связь между изучаемыми явлениями, &lt;/strong&gt;а лишь могут указать на её&lt;strong&gt; потенциальное &lt;/strong&gt;наличие. Для того, что бы твёрдо сказать, что А влияет на Б надо провести точное исследование, раскрывающее то, как именно происходит это взаимовлияние.&lt;/p&gt;
  &lt;p id=&quot;Tjw8&quot;&gt;Больше того. В мире существует куча явлений, которые, очевидно, вообще не связаны друг с другом, но при этом, с точки зрения статистики, имеют очень тесное взаимоотношение (с высокой корреляцией). Вот, например, график, показывающий отношение трат США на науку и космос и количество суицидов путём повешения (в США же). Связь очевидна, корреляция больше 99%!&lt;/p&gt;
  &lt;figure id=&quot;cI0u&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4a/09/4a09daaf-33ad-404f-8d27-e390f4a2dbbf.jpeg&quot; width=&quot;942&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;oDNa&quot;&gt;При этом всём, конечно, нельзя бросаться в другую крайность и утверждать, что статистика вообще бесполезна. Это, конечно, не так, но к результатам статистических исследований надо относится очень осторожно.&lt;/p&gt;
  &lt;h2 id=&quot;szxC&quot;&gt;Голубоглазые алкоголики&lt;/h2&gt;
  &lt;p id=&quot;LjNo&quot;&gt;&lt;a href=&quot;https://health.mail.ru/news/golubye_glaza_okazalis_faktorom_riska/&quot; target=&quot;_blank&quot;&gt;Наглядный пример&lt;/a&gt; описанной выше профанации, который и сподвиг меня написать эту заметку впервые ещё в 2015-м году, прислал мне мой друг. Эта &amp;quot;новость&amp;quot; — практически хрестоматийный пример &amp;quot;журналистики&amp;quot; с картинки ниже — о том, что группа генетиков из Вермонта пришла к выводу, что голубые глаза являются фактором риска алкоголизма. &lt;/p&gt;
  &lt;p id=&quot;ZVJD&quot;&gt;Что бы продемонстрировать &lt;strong&gt;чудовищную разницу&lt;/strong&gt; между пересказом и, собственно, самим исследованием, я процитирую переведённую мной &lt;a href=&quot;http://onlinelibrary.wiley.com/doi/10.1002/ajmg.b.32316/abstract&quot; target=&quot;_blank&quot;&gt;аннотацию к оригинальной научной статье&lt;/a&gt;, ссылка на которую представлена прямо в новости. Сами оцените разницу между тем, что написал безымянный копирайтер по ссылке выше и тем, что было сказано изначально.&lt;/p&gt;
  &lt;blockquote id=&quot;vl2v&quot;&gt;В архивных примерах представителей европейской родословной было обнаружено, что светлоглазые индивиды потребляют больше алкоголя, чем темноглазые. Не было опубликовано ни одного популяционного исследования по исследованию прямой связи между алкогольной зависимостью (АЗ) и цветом глаз. Нами была выдвинута гипотеза, что светлоглазые индивиды имеют большую предрасположенность к АЗ, чем тёмноглазые. Была использована смешанная модель (mixture model) для отбора гомогенных примеров из 1.263 европейских американцев при контроле за стратификацией популяции. После контроля качества, нами было проведено ассоциативное исследование с использованием логистической регрессии для адаптации к посторонним факторам (возраст, пол, генетическое родство). Нами была найдена &lt;strong&gt;потенциальная связь&lt;/strong&gt;между АЗ и голубым цветом глаз (&lt;strong&gt;P = 0.0005&lt;/strong&gt; и отношение шансов = 1,83 (1,31-2,57), поддерживающая предположение, что светлый цвет глаз является фактором риска по отношению к тёмному.&lt;/blockquote&gt;
  &lt;p id=&quot;WODq&quot;&gt;Тут я прервусь, чтобы подчеркнуть полученную авторами работы корреляцию: &lt;strong&gt;ρ = 0,0005&lt;/strong&gt; (это целых 0,05%!). Идём дальше.&lt;/p&gt;
  &lt;blockquote id=&quot;afgL&quot;&gt;Сетевой анализ показал статистически значимое (&lt;strong&gt;P = 0.02&lt;/strong&gt;) число взаимодействий между генами голубых глаз и генами, ассоциированными с АЗ. Мы нашли доказательство неравновесного сцепления генов между АЗ-ассоциированными генным кластером ГАМК рецепторов, GABRB3/GABRG3 и генами голубых глаз, OCA2/HERC2, а так же между АЗ-ассоциированным GRM5 и пигментационным геном TYR. Наши популяционно-фенотипный, сетевой, и генносцепный анализы поддерживают &lt;strong&gt;предположение о связи &lt;/strong&gt;между голубым цветом глаз и алкогольной зависимостью. Несмотря на то, что мы проводили контроль за стратификацией, &lt;strong&gt;мы не можем исключить некоторую подлежащую стратификацию&lt;/strong&gt;, воздействующую на результат этого исследования. Несмотря на то, что &lt;strong&gt;необходимо подтверждение результатов исследования&lt;/strong&gt;, наши находки предполагают, что информация о цвете глаз &lt;strong&gt;может быть полезна при исследовании алкогольной зависимости&lt;/strong&gt;. &lt;strong&gt;Дальнейшая характеризация&lt;/strong&gt; этой ассоциации может открыть новые этиологические факторы АЗ.&lt;/blockquote&gt;
  &lt;p id=&quot;15T7&quot;&gt;Отметим ещё раз полученную корреляцию (уже между взаимодействиями генов): &lt;strong&gt;ρ = 0,02 &lt;/strong&gt;(2%). Что же, учёные абсолютно корректны в своих выражениях — они обнаружили некоторую, пусть и слабую, но «&lt;em&gt;статистически значимую&lt;/em&gt;» связь между цветом глаз и алкогольной зависимостью и сделали вывод о том, что эта зависимость &lt;strong&gt;может быть&lt;/strong&gt; полезна и, в дальнейших исследованиях, должна быть конкретно и точно охарактеризирована. То есть, своим исследованием они наметили почву для возможных дальнейших исследований и показали, что подобные исследования могут быть оправданы. Хотя, признаться, при корреляции в 0,05% особого смысла в этом я не вижу.&lt;/p&gt;
  &lt;p id=&quot;7Orr&quot;&gt;Но нигде в оригинальной статье не сказано ни слова о том, что связь между этими вещами достоверно установлена!&lt;/p&gt;
  &lt;p id=&quot;9GPy&quot;&gt;Каково, а? То есть, сначала учёные представили какие-то смутные, но всё же корректные результаты, после чего СМИ просто взяли и поставили эти результаты с ног на голову в духе «скандалов/интриг/расследований».&lt;/p&gt;
  &lt;figure id=&quot;Knh2&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/aa/be/aabe541a-faf1-425f-ac1b-527d2528d2b6.gif&quot; width=&quot;600&quot; /&gt;
    &lt;figcaption&gt;Круговорот научных новостей.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;MKiu&quot;&gt;Статистическая значимость&lt;/h2&gt;
  &lt;p id=&quot;SUQQ&quot;&gt;Я уже отмечал выше, что современная наука переполнена статистическими исследованиями настолько, что некоторые журналы отказываются их публиковать. Дело в том, что по своей сути такие исследования — обычно &lt;strong&gt;самые дешёвые&lt;/strong&gt; из возможных и очень&lt;strong&gt; часто приносят результат&lt;/strong&gt;, о котором можно написать статью. А исследование &lt;em&gt;причинно-следственных связей&lt;/em&gt; требует, обычно, больших ресурсов, времени и чрезвычайно глубокого понимания предметной области. И, в добавок, может закончится ничем. Поэтому статистикой и пользуются многие научные коллективы. &lt;/p&gt;
  &lt;p id=&quot;CRNX&quot;&gt;В принципе, можно взять любые два явления, связать их в исследовании и, имея просто исторические данные показать какие-то корреляции. Я уже писал выше о корреляции инвестиций в науку и самоубийств. В принципе, на основе этих данных уже можно было бы написать &lt;em&gt;статистически значимую &lt;/em&gt;научную статью. &lt;/p&gt;
  &lt;p id=&quot;G3Yr&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;e8Zm&quot;&gt;Так что не стоит слепо доверять статистике, особенно если о ней говорят СМИ.&lt;/p&gt;

</content></entry><entry><id>khaos:uahRpb1_rZN</id><link rel="alternate" type="text/html" href="https://teletype.in/@khaos/uahRpb1_rZN?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=khaos"></link><title>Настоящая проблема микросервисов</title><published>2021-09-26T16:30:40.458Z</published><updated>2021-09-26T22:01:14.333Z</updated><summary type="html">Сегодня увидел новую статью с разоблачением хайпа вокруг микросеовисной архитектуры. Это было понятно ещё на заре её популярности, что рано или поздно хайп сменится трезвыми оценками, а спад будет обозначен разоблачениями. Как до этого было много раз с другими подходами и технологиями (где сейчас монады, Кафка, голанг?)</summary><content type="html">
  &lt;p id=&quot;wdPj&quot;&gt;Сегодня увидел новую статью с разоблачением хайпа вокруг микросеовисной архитектуры. Это было понятно ещё на заре её популярности, что рано или поздно хайп сменится трезвыми оценками, а спад будет обозначен разоблачениями. Как до этого было много раз с другими подходами и технологиями (где сейчас монады, Кафка, голанг?)&lt;/p&gt;
  &lt;p id=&quot;TolG&quot;&gt;Удивительно, но архитектурная проблема с монолитами/микросервисами/SOA (и иже) лежит совсем не в их плоскости. Она глубже и серьёзней. &lt;/p&gt;
  &lt;p id=&quot;aVYQ&quot;&gt;Если бы сейчас ко мне подошли и спросили: &amp;quot;как бы ты построил новое распределённом приложение Х, если бы был не ограничен ресурсами?&amp;quot; Я бы уверенно ответил: &amp;quot;ни одним из этих способов&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;lkYC&quot;&gt;Во всём IT фундаментальны и нередуцируемы только две сущности: процесс и данные. Процессы связываются друг с другом в сложные конвейеры, разделённые общими протоколами данных и слоями трансляции.&lt;/p&gt;
  &lt;p id=&quot;sUOH&quot;&gt;Существенная логика приложения (которую ещё называют &amp;quot;бизнес-логикой&amp;quot;) — это как раз набор таких процессов, которые, в свою очередь, полагаются на процессы нижележащие и инфраструктурные.&lt;/p&gt;
  &lt;p id=&quot;55Gz&quot;&gt;Так вот: выбор между монолитом или микросервисами (или чем угодно ещё) — это не выбор архитектуры бизнес-логики, это выбор инфраструктуры, хостинга, для бизнес-логики и к самой бизнес-логике не должен иметь никакого отношения. Это всё равно, что каждый раз проектировать свой диспетчер ОС или свой Kubernetes, выбирая архитектуру для транзакции зачисления денег на счёт клиента.&lt;/p&gt;
  &lt;p id=&quot;A80u&quot;&gt;Бизнес-логике должно быть абсолютно всё равно, в каком процессе или на какой виртуальной машине она запущена. То, что действительно нужно — общая среда исполнения, которая бы забрала на себя этот бойлерплейт распределённых систем, а программисты и архитекторы могли бы сосредоточится на конкретной задаче, не занимаясь каждый раз вопросами инфраструктуры и сетевых взаимодействий.&lt;/p&gt;
  &lt;p id=&quot;yR9O&quot;&gt;Так что если бы у меня было достаточно ресурсов, я бы привёл инфраструктурный слой в порядок: что бы бизнес процессы не заботились о своём хостинге, а выбор между монолитом и микросервисами ушёл в прошлое как нерелевантный.&lt;/p&gt;

</content></entry><entry><id>khaos:C9kk15-5gL_</id><link rel="alternate" type="text/html" href="https://teletype.in/@khaos/C9kk15-5gL_?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=khaos"></link><title>Основы информационных технологий</title><published>2021-07-03T16:51:34.498Z</published><updated>2022-06-23T11:29:16.367Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/1d/56/1d565a3e-5676-4f33-a1d9-20d1e92fd4bf.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/3c/a2/3ca272bb-e28d-44d2-9913-66145f0b5cb9.png&quot;&gt;Последнее время я часто сталкиваюсь с потребностью окружающих меня людей в объяснении фундаментальных концепций в ИТ. К сожалению, обзорных материалов, в которых было бы ёмко собраны основные объекты и понятия информационных технологий, очень мало и они обычно ограничиваются одним или двумя концепциями. </summary><content type="html">
  &lt;p id=&quot;XKU3&quot;&gt;Последнее время я часто сталкиваюсь с потребностью окружающих меня людей в объяснении фундаментальных концепций в ИТ. К сожалению, обзорных материалов, в которых было бы ёмко собраны основные объекты и понятия информационных технологий, очень мало и они обычно ограничиваются одним или двумя концепциями. &lt;/p&gt;
  &lt;p id=&quot;5VQf&quot;&gt;В этой обзорной статье я вкратце расскажу, что такое вычисление и вычислительный процесс, чем он обеспечен и как реализуется на практике. Что такое программирование и его языки и как они восходят к машинным инструкциям. Где у процессора память и зачем нужны операционные системы.&lt;/p&gt;
  &lt;p id=&quot;d7gD&quot;&gt;Статья будет крайне интересна всем, кто в ИТ недавно, а так же, возможно, даже старожилам, которые пропустили, в своё время, некоторые вещи.&lt;/p&gt;
  &lt;h2 id=&quot;hcOa&quot;&gt;Данные и процессы&lt;/h2&gt;
  &lt;p id=&quot;GSd8&quot;&gt;Всё программирование строится на двух китах: &lt;strong&gt;процессе &lt;/strong&gt;и &lt;strong&gt;данных&lt;/strong&gt;. Понимание этих двух концепций и того, как глубоко они прорастают, — важнейшее знание для любого ИТ-специалиста.&lt;/p&gt;
  &lt;p id=&quot;JitJ&quot;&gt;Любой процесс может быть представлен общей схемой ниже.&lt;/p&gt;
  &lt;p id=&quot;H0yo&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;vAEf&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/3c/a2/3ca272bb-e28d-44d2-9913-66145f0b5cb9.png&quot; width=&quot;782&quot; /&gt;
    &lt;figcaption&gt;Рис. 1.1. Общее представление процесса.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;viOb&quot;&gt;У процесса есть &lt;em&gt;входные данные&lt;/em&gt; и &lt;em&gt;выходные&lt;/em&gt;. Кроме того, у процесса может быть своя &lt;em&gt;память. &lt;/em&gt;Несмотря на то, что процесс и данные, как сущности, могут существовать друг без друга, в таком случае они не имеют смысла. Данные сами по себе — набор ничего не значащей информации, а процесс без данных просто не работает.&lt;/p&gt;
  &lt;p id=&quot;Ed5F&quot;&gt;Так же любой, сколь угодно сложный, процесс обладает свойством &lt;em&gt;иерархичности: &lt;/em&gt;он всегда представим как &lt;em&gt;сумма более простых процессов&lt;/em&gt;, лежащих в его основе. При этом для подпроцессов выходные данные предыдущего подпроцесса будут являться входными для следующего. Точно так же у подпроцессов может быть своя память. &lt;/p&gt;
  &lt;p id=&quot;APB9&quot;&gt;В принципе, каждый уровень разложения процесса на составляющие подпроцессы и совпадает со &lt;strong&gt;слоями абстракции&lt;/strong&gt;. От самого высокого внешнего, до нижних внутренних.&lt;/p&gt;
  &lt;p id=&quot;HgN4&quot;&gt;На самом деле, сам схема на рис. 1.1 может быть представлена в ещё более общем виде (рис. 1.2), когда память процесса превращается в обратную связь выхода со входом.&lt;/p&gt;
  &lt;figure id=&quot;sSY3&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/72/bc/72bc6300-87ab-47f8-928d-de59d9da2f01.png&quot; width=&quot;501&quot; /&gt;
    &lt;figcaption&gt;Рис. 1.2. Память процесса как обратная связь.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;DdA2&quot;&gt;Несмотря на то, что такая схема обычно трудна для восприятия, она хорошо демонстрирует родство процесса со всеми другими физическими явлениями, его точно так же теоретически можно представить, например, как дифференциальное (или конечно-разностное) уравнение.&lt;/p&gt;
  &lt;h3 id=&quot;UPEN&quot;&gt;Ветвления&lt;/h3&gt;
  &lt;p id=&quot;VMCM&quot;&gt;На первой схеме, изображающей процесс, не показано важнейшее свойство реальных процессов: &lt;strong&gt;ветвления&lt;/strong&gt;. Было бы более обще представить детализацию в виде следующего рисунка.&lt;/p&gt;
  &lt;figure id=&quot;73jc&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/97/da/97da5cd2-200b-489c-bb44-8a4eff6de919.png&quot; width=&quot;399&quot; /&gt;
    &lt;figcaption&gt;Рис. 1.3. Процесс с ветвлением.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;BVpg&quot;&gt;Таким образом, в зависимости от выходных данных одного процесса, может быть выбран или один или другой путь. Соответственно, выходные данные надпроцесса могут так же варьироваться в зависимости от результата ветвления.&lt;/p&gt;
  &lt;h3 id=&quot;gCa4&quot;&gt;Данные и их формат&lt;/h3&gt;
  &lt;p id=&quot;okaR&quot;&gt;Сами по себе &amp;quot;данные&amp;quot; без формата не несут никакой полезной нагрузки. Это всё равно, что читать текст на незнакомом языке: вы знаете, что информация там есть, но не можете её извлечь. Язык на котором записаны данные — и есть их формат, его так же иногда называют протоколом.&lt;/p&gt;
  &lt;p id=&quot;XzMn&quot;&gt;Кроме этого, данные, даже записанные на нужном языке, могут не представлять ценности, если в них нет той информации, которая вам нужна. То есть, предложение может быть на известном вам языке, но в нём не будет того, чего вы хотели. В таком случае, они так же бесполезны, как и данные в неизвестном формате.&lt;/p&gt;
  &lt;figure id=&quot;FWEW&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/58/14/58140b66-5b88-4352-ad71-381ee286d06e.png&quot; width=&quot;453&quot; /&gt;
    &lt;figcaption&gt;Рис. 1.4. Детализация структуры данных.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;5x1g&quot;&gt;Точно так же как и процесс, данные могут быть вложены друг в друга, при этом быть обрамлены совершенно разными протоколами. Интересно, что в отличие от вложенных процессов, в данных отношение &lt;em&gt;слоёв абстракции&lt;/em&gt; обычно отсчитывается в обратную сторону: внешний протокол считается низкоуровневым, а внутренний — высокоуровневым.&lt;/p&gt;
  &lt;h3 id=&quot;kWzb&quot;&gt;Иерархичность&lt;/h3&gt;
  &lt;p id=&quot;og3b&quot;&gt;Как уже было отмечено, важнейшим свойством процессов и данных является их иерархичность. Таким образом, даже очень сложная задача делится на набор более простых процессов, а они, в свою очередь, — на набор ещё более простых. И могут быть вынесены в виде отдельных модулей программы, отдельных программ или даже отдельных физических устройств.&lt;/p&gt;
  &lt;p id=&quot;CvhI&quot;&gt;Надо понимать, что при этом, несмотря на то, что общая &lt;em&gt;сложность&lt;/em&gt; системы не меняется, она распределяется между подмодулями и вытесняется с верхних уровней. Таким образом, даже очень сложный процесс можно вполне понять и спроектировать на каждом отдельном уровне.&lt;/p&gt;
  &lt;h3 id=&quot;wSWP&quot;&gt;Программирование&lt;/h3&gt;
  &lt;p id=&quot;lUoQ&quot;&gt;Будучи знакомым с этими центральными понятиями, можно сформулировать, что &lt;strong&gt;программирование&lt;/strong&gt; — это проектирование процессов и определение форматов данных, решающих поставленную задачу, с последующей их реализацией.&lt;/p&gt;
  &lt;h3 id=&quot;oh6T&quot;&gt;API&lt;/h3&gt;
  &lt;p id=&quot;rwFC&quot;&gt;В общем случае, каждое взаимодействие одного процесса с другим представляет из себя некоторый интерфейс, который известен обоим процессам. Это некоторый общий язык, на котором они могут продуктивно общаться. Такой язык, интерфейс и называется &lt;em&gt;программным интерфейсом&lt;/em&gt; или API.&lt;/p&gt;
  &lt;h2 id=&quot;llom&quot;&gt;Элементарные операции&lt;/h2&gt;
  &lt;p id=&quot;8xKm&quot;&gt;Разбивать вычислительный процесс на составляющие подпроцессы можно вплоть до так называемых &lt;em&gt;элементарных операций&lt;/em&gt;. Именно они, в итоге, физически и выполняются компьютером.&lt;/p&gt;
  &lt;p id=&quot;x4SG&quot;&gt;Так получилось (в основном, по техническим соображениям, но об этом ниже), что компьютеры сделаны бинарными — для них есть только числа 0 и 1, — биты. Поэтому настоящие элементарные операции работают именно с битами, хотя их можно представить и для любых других чисел.&lt;/p&gt;
  &lt;p id=&quot;iTjn&quot;&gt;Представленные ниже операции так же сильно пересекаются с так называемой булевой алгеброй или &lt;em&gt;булевой логикой&lt;/em&gt;, поэтому часто имеют логические коннотации.&lt;/p&gt;
  &lt;h3 id=&quot;eqQE&quot;&gt;Операция «И»&lt;/h3&gt;
  &lt;figure id=&quot;u9P0&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2f/bd/2fbd3bd7-0d5a-42c0-a96c-21261b6f6dfb.png&quot; width=&quot;201&quot; /&gt;
    &lt;figcaption&gt;Рис. 3. Операция И.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;5LME&quot;&gt;Выход, результат операции, равен &lt;strong&gt;1 &lt;/strong&gt;только если оба входа равны &lt;strong&gt;1&lt;/strong&gt;, иначе — &lt;strong&gt;0&lt;/strong&gt;. Её так же называют операцией &lt;em&gt;логического умножения&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;5JMs&quot;&gt;То есть результат операции при разных входах будет следующим. &lt;/p&gt;
  &lt;ul id=&quot;WqpJ&quot;&gt;
    &lt;li id=&quot;S5nD&quot;&gt;1 AND 1 = 1&lt;/li&gt;
    &lt;li id=&quot;BjZB&quot;&gt;1 AND 0 = 0&lt;/li&gt;
    &lt;li id=&quot;W9a5&quot;&gt;0 AND 1 = 0&lt;/li&gt;
    &lt;li id=&quot;mnhU&quot;&gt;0 AND 0 = 0&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;O2Z7&quot;&gt;Операция «ИЛИ»&lt;/h3&gt;
  &lt;figure id=&quot;Yjzu&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/99/94/9994f969-0003-4efc-bd19-f70c4a891f03.png&quot; width=&quot;201&quot; /&gt;
    &lt;figcaption&gt;Рис. 4. Операция ИЛИ.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;sx6x&quot;&gt;Выход, результат операции равен &lt;strong&gt;1&lt;/strong&gt;, если хотя бы один вход равен &lt;strong&gt;1&lt;/strong&gt;, иначе — &lt;strong&gt;0&lt;/strong&gt;. Её так же называют операцией &lt;em&gt;логического сложения&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;9TJF&quot;&gt;Результат операции при разных входах будет следующим.&lt;/p&gt;
  &lt;ul id=&quot;ApYn&quot;&gt;
    &lt;li id=&quot;MZwK&quot;&gt;1 AND 1 = 1&lt;/li&gt;
    &lt;li id=&quot;Ha76&quot;&gt;1 AND 0 = 1&lt;/li&gt;
    &lt;li id=&quot;R6Dv&quot;&gt;0 AND 1 = 1&lt;/li&gt;
    &lt;li id=&quot;QxQn&quot;&gt;0 AND 0 = 0&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;q0QO&quot;&gt;Операция «НЕ»&lt;/h3&gt;
  &lt;figure id=&quot;A93g&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/0a/0d/0a0d703d-046c-4ade-88c1-041bfa2fa56a.png&quot; width=&quot;201&quot; /&gt;
    &lt;figcaption&gt;Рис. 5. Операция НЕ.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2a7z&quot;&gt;Эта операция &lt;em&gt;унарная&lt;/em&gt;, т.е. имеет только один вход, в отличие от предыдущих. Она &amp;quot;переворачивает&amp;quot; входное значение: из &lt;strong&gt;0&lt;/strong&gt; делает &lt;strong&gt;1&lt;/strong&gt; и из &lt;strong&gt;1&lt;/strong&gt; делает &lt;strong&gt;0&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;ySxx&quot;&gt;Её так же называют &lt;em&gt;логическим отрицанием&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;EQgw&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;tIP5&quot;&gt;Из перечисленных выше трёх операций всегда можно сложить сколь угодно сложные конструкции, точно так же как процесс в схемах выше делится на более мелкие процессы.&lt;/p&gt;
  &lt;h3 id=&quot;8wL4&quot;&gt;Простой калькулятор&lt;/h3&gt;
  &lt;p id=&quot;c9vq&quot;&gt;На логических операциях можно сделать, например, калькулятор, который складывает числа. То есть операцию сложения двух чисел или &lt;em&gt;процесс&lt;/em&gt; сложения.&lt;/p&gt;
  &lt;p id=&quot;9rB7&quot;&gt;Что бы пример был максимально простым, возьмём сложение двух &lt;em&gt;одноразрядных&lt;/em&gt; (с одним знаком) двоичных чисел. Нам нужно спроектировать процесс, который на вход принимает два таких числа, а на выходе предоставляет их сумму. Точно то же самое, по аналогии, можно сделать и для любых других чисел, просто полученная схема будет сложнее.&lt;/p&gt;
  &lt;figure id=&quot;NuTK&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/eb/6a/eb6a080e-1f90-4c99-a7bd-aa574f06713f.png&quot; width=&quot;571&quot; /&gt;
    &lt;figcaption&gt;Рис. 6. Сложение двух чисел через элементарные операции.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;u7zN&quot;&gt;Операция сложения может привести к появлению числа, разряд которого выше, чем у исходных чисел. Например, если мы сложим 1 + 1, то получим 2, что в бинарном виде представляет из себя &lt;strong&gt;10&lt;/strong&gt;, т.е. число уже с &lt;em&gt;двумя &lt;/em&gt;бинарными разрядами&lt;em&gt;. &lt;/em&gt;Поэтому на выходе получившиеся число &lt;strong&gt;Х3&lt;/strong&gt; разбито на два компонента: &lt;strong&gt;L X3&lt;/strong&gt; и &lt;strong&gt;H X3&lt;/strong&gt;. L X3 будет содержать &lt;em&gt;младший разряд, &lt;/em&gt;а H X3 — &lt;em&gt;старший&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;8DCP&quot;&gt;Таким образом, через три элементарных операций мы выразили сложение. Точно так же можно выразить вычитание, умножение и деление.&lt;/p&gt;
  &lt;h2 id=&quot;5sM9&quot;&gt;Реальный процессор&lt;/h2&gt;
  &lt;p id=&quot;WoZ5&quot;&gt;В настоящем процессоре элементарные логические операции выше реализуются на обычных электрических транзисторах. Все производители процессоров бьются за уменьшение &lt;em&gt;техпроцесса, &lt;/em&gt;что на самом деле означает уменьшение размера одного транзистора, а, соответственно, таких транзисторов можно упаковать больше на одной микросхеме. Понятно, что чем больше транзисторов, тем больше операций может выполнять процессор в единицу времени.&lt;/p&gt;
  &lt;figure id=&quot;IZxE&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/e4/e2/e4e2ce10-7566-4ef9-a111-3c4077d475f3.gif&quot; width=&quot;145&quot; /&gt;
    &lt;figcaption&gt;Рис. 7. Операция И на двух электрических транзисторах.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CHfD&quot;&gt;Сам по себе транзистор в процессорах — это электронный ключ, который либо открывается, либо закрывается в зависимости от напряжения на своей базе. На схеме выше, если напряжение на входе А равно логическому 1, то верхний транзистор открывается и соединяет нижний с логическим 1. Если напряжение на входе B так же равно 1, то открывается нижний транзистор и, в сумме, они соединяют выход Q с логическим 1. Если хоть один из входов равен 0, то Q будет надёжно соединён с нулём. Это полностью совпадает с поведением логического &amp;quot;И&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;fgII&quot;&gt;Именно отсюда растут корни &lt;em&gt;бинарности &lt;/em&gt;процессоров — с &lt;em&gt;электрической&lt;/em&gt; точки зрения очень удобно иметь всего два уровня — 0 и 1, которые соответствуют напряжению 0 вольт и, обычно, 5 вольт. Кроме того, из-за температуры, состояния блока питания и тому подобного, напряжения и характеристики электроники немного &amp;quot;плавают&amp;quot;: логический &amp;quot;1&amp;quot; в реальности в разные моменты времени может быть равным и 5 вольтам, и 5.1 вольт, и 4.7 вольта. Поэтому удобно иметь широкую разделительную полосу между уровнями.&lt;/p&gt;
  &lt;p id=&quot;Nif4&quot;&gt;Однако, речь про элементарные операции. Несмотря на то, что трёх описанных операций достаточно, что бы производить любые вычисления с числами, а так же логические вычисления (с той самой булевой логикой), их не хватает для загрузки и сохранения данных, общения с другими устройствами и ветвлений.&lt;/p&gt;
  &lt;p id=&quot;5PSF&quot;&gt;Надо оговориться, что ветвления и большинство из перечисленного на самом деле можно организовать на элементарных операциях и так действительно делают для программируемых логических матриц (ПЛИС или FPGA), там где критична скорость работы, а не универсальность. В них программа-процесс зашивается прямо в микросхему, но после программирования такое устройство не может выполнять ничего другого. Ставка же процессоров — универсальность.&lt;/p&gt;
  &lt;p id=&quot;2gJE&quot;&gt;Поэтому работа процессоров организована по-другому. Они считывают программу в виде последовательности &lt;em&gt;инструкций&lt;/em&gt; и данных в &lt;em&gt;оперативную память&lt;/em&gt;. Затем, процессор начинает выбирать инструкции из памяти по одной и выполнять её. Инструкцию за инструкцией, вплоть до окончания &amp;quot;ленты&amp;quot; команд. &lt;/p&gt;
  &lt;figure id=&quot;WBIW&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/8f/e9/8fe9a2f8-a287-4397-a355-6546fb0b2e86.jpeg&quot; width=&quot;800&quot; /&gt;
    &lt;figcaption&gt;Рис. 8. Кристалл процессора Intel Lynnfield с миллиардами транзисторов и множеством блоков.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;V9Cm&quot;&gt;Инструкции процессора&lt;/h3&gt;
  &lt;p id=&quot;YPtJ&quot;&gt;Инструкция — это определённый производителем процессора код, который сообщает о необходимости совершить некоторую операцию, выполнить команду. Вообще, для каждого процессора может быть свой набор таких кодов, однако за годы индустрия выработала большие стандартные наборы, которые поддерживают все выпускаемые процессоры.&lt;/p&gt;
  &lt;p id=&quot;tAHJ&quot;&gt;Примером таких инструкций может служить:&lt;/p&gt;
  &lt;ul id=&quot;PAqx&quot;&gt;
    &lt;li id=&quot;h8XS&quot;&gt;сложение двух чисел;&lt;/li&gt;
    &lt;li id=&quot;Y2B1&quot;&gt;загрузка числа из оперативной памяти;&lt;/li&gt;
    &lt;li id=&quot;wZOz&quot;&gt;получение числа от другого устройства;&lt;/li&gt;
    &lt;li id=&quot;QKiT&quot;&gt;сохранение числа в оперативную память;&lt;/li&gt;
    &lt;li id=&quot;Xiru&quot;&gt;отправка числа в устройство;&lt;/li&gt;
    &lt;li id=&quot;XCCQ&quot;&gt;&lt;em&gt;условный и безусловный переходы&lt;/em&gt;;&lt;/li&gt;
    &lt;li id=&quot;2PuC&quot;&gt;и многие другие.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;PFJB&quot;&gt;Надо понимать, что внутри, в большинстве своём, такие команды работают через множество тех самых элементарных операций, о которых говорилось выше. Но они уже организуются в более сложные и осмысленные инструкции.&lt;/p&gt;
  &lt;p id=&quot;O8sv&quot;&gt;Например, мы можем сделать программу, получающую два числа от внешнего устройства, складывающую их и отправляющую обратно.&lt;/p&gt;
  &lt;pre id=&quot;uEnC&quot;&gt;ПОЛУЧИ число1
ПОЛУЧИ число2
СЛОЖИ число1, число2, ПОЛОЖИ_В число3
ОТПРАВЬ число3&lt;/pre&gt;
  &lt;h3 id=&quot;7uoq&quot;&gt;Ветвления&lt;/h3&gt;
  &lt;p id=&quot;ebgQ&quot;&gt;На этом моменте можно спросить: если программа выполняется инструкция за инструкцией, как лента, то какие тут могут быть ветвления? Как раз для них существуют специальные команды &amp;quot;перемотки&amp;quot;: они переводят (или передают) управление в другую часть программы. Реализуется это через инструкции &lt;em&gt;условных и безусловных переходов&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;hPTc&quot;&gt;Безусловный переход просто перематывает ленту к указанной в нём инструкции. Условный же делает это только в случае, если выполнено некоторое условие: обычно равенства или неравенства одного числа другому.&lt;/p&gt;
  &lt;p id=&quot;i5ps&quot;&gt;Например, можно представить бесконечную программу деления, которая защищает себя от деления на ноль при помощи условного перехода.&lt;/p&gt;
  &lt;pre id=&quot;IfbP&quot;&gt;1: ПОЛУЧИ число1
2: ПОЛУЧИ число2
3: ПЕРЕЙДИ_ЕСЛИ_НОЛЬ число2, МЕТКА 7
4: ПОДЕЛИ число1, число2, ПОЛОЖИ_В число3
5: ОТПРАВЬ число3
6: ПЕРЕЙДИ МЕТКА 1
7: ОТПРАВЬ 0
8: ПЕРЕЙДИ МЕТКА 1&lt;/pre&gt;
  &lt;p id=&quot;6bpF&quot;&gt;Выполняя её, процессор сначала получит число 1, затем число 2. Далее, он проверит, если число 2 оказалось нулём, то перемотает ленту на метку 7, где он отправит обратно 0 и перейдёт обратно в начало программы, к получению числа 1. Если число 2 — не ноль, он выполнит деление, отправит результат обратно и опять перейдёт в начало программы.&lt;/p&gt;
  &lt;p id=&quot;QTyF&quot;&gt;В этом примере инструкция &lt;strong&gt;ПЕРЕЙДИ&lt;/strong&gt; — безусловный переход, выполняющийся всегда, &lt;strong&gt;ПЕРЕЙДИ_ЕСЛИ_НОЛЬ&lt;/strong&gt; — условный. В настоящем процессоре это будут инструкции &lt;strong&gt;JMP&lt;/strong&gt; (jump) и &lt;strong&gt;JZ&lt;/strong&gt; (jump if zero) соответственно.&lt;/p&gt;
  &lt;h3 id=&quot;oA9X&quot;&gt;Нечисловые данные&lt;/h3&gt;
  &lt;p id=&quot;peWs&quot;&gt;До этого все примеры были исключительно с числами, причём целыми. Как быть с другими данными: текстом, изображениями, звуком?&lt;/p&gt;
  &lt;p id=&quot;wVx5&quot;&gt;Процессоры в самом деле, вообще говоря, оперируют только целыми числами. На уровне инструкций процессора уже редко можно встретить отдельные биты и минимальное число для них — &lt;strong&gt;байт&lt;/strong&gt;. Это такое число, которое состоит ровно из 8 бит и может быть представлено десятичным числом от 0 до 255. Другие числа для процессора всегда кратны байту: число с двумя байтами, с 4-мя , с 8-ю и даже с 16.&lt;/p&gt;
  &lt;p id=&quot;1TMM&quot;&gt;Однако, при помощи придуманных специальных форматов данных, текст и изображения представимы как массивы чисел, тех самых байт. Для текста, например, есть разработанная очень давно кодировка ASCII, которая как раз говорит, как представить символ алфавита байтом:&lt;/p&gt;
  &lt;ul id=&quot;lQDq&quot;&gt;
    &lt;li id=&quot;uGzE&quot;&gt;&amp;#x27;A&amp;#x27; — 65;&lt;/li&gt;
    &lt;li id=&quot;xIbX&quot;&gt;&amp;#x27;B&amp;#x27; — 66;&lt;/li&gt;
    &lt;li id=&quot;ln6Q&quot;&gt;&amp;#x27;z&amp;#x27; — 122;&lt;/li&gt;
    &lt;li id=&quot;sVbl&quot;&gt;&amp;#x27;!&amp;#x27; — 33.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;GfcA&quot;&gt;Строка &amp;quot;I see dead celebrities&amp;quot; после кодирования превращается в последовательность цифр: &amp;quot;73 32 115 101 101 32 100 101 97 100 32 99 101 108 101 98 114 105 116 105 101 115&amp;quot;. И, в таком виде, с ними можно делать все те же операции, что и с числами: читать, записывать, сравнивать и даже преобразовывать.&lt;/p&gt;
  &lt;p id=&quot;tKZM&quot;&gt;С изображениями похожая история. Мы можем разбить его на отдельные точки, в самом начале изображения представить двумя числами ширину и высоту (в точках), а дальше сплошняком записать цвет каждой точки изображения. Один из реальных форматов так и делает: на каждую точку приходится по три байта, кодирующих оттенок синего (от 0 до 255), зеленого и красного. Прочитав этот массив информации мы всегда сможем воспроизвести такую картинку на экране. &lt;/p&gt;
  &lt;p id=&quot;He5g&quot;&gt;Аналогично, звук так же превращается в наборы байт которые отправляются туда-сюда. С этим, кстати, как и в изображениях, связаны потери качества: из-за необходимости представить звук в числовом виде он как бы огрубляется при оцифровке.&lt;/p&gt;
  &lt;h3 id=&quot;VZNI&quot;&gt;Прерывания&lt;/h3&gt;
  &lt;p id=&quot;BjdX&quot;&gt;Есть ещё один важный класс объектов, про которые необходимо рассказать отдельно. Процессор, как уже понятно, не существует сам по себе, в вакууме, без внешних устройств, которые бы предоставляли ему, например, ленту инструкций, или данные. Так же он часто должен быть способен реагировать на события, а не &amp;quot;уходить в себя&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;Hg5U&quot;&gt;Для организации такой работы были придуманы &lt;strong&gt;прерывания&lt;/strong&gt;. Это механизм, когда при наступлении некоторого внешнего или внутреннего события, процессор останавливает выполнение ленты команд и перематывает её в заранее определённое место, где будет находится &lt;em&gt;обработчик прерывания&lt;/em&gt;. После выполнения инструкций обработчика прерывания, процессор переключается обратно на то место ленты, на котором остановился.&lt;/p&gt;
  &lt;p id=&quot;YpBV&quot;&gt;Например, часто через прерывания работают таймеры реального времени (вызываем прерывание каждую секунду). Или работа с устройствами, когда мы либо сообщаем им, через прерывание, что они могут забирать данные, либо они нам сообщают, что они закончили и мы можем получить результат их работы.&lt;/p&gt;
  &lt;h2 id=&quot;YqeB&quot;&gt;Операционные системы&lt;/h2&gt;
  &lt;p id=&quot;YAzW&quot;&gt;В примерах выше мы сделали программу, которая считывает два числа из некоего &amp;quot;внешнего устройства&amp;quot;, делит их и отправляет результат обратно. Но в реальной жизни всё не так просто.&lt;/p&gt;
  &lt;p id=&quot;qtMK&quot;&gt;Во-первых, сам по себе процессор не знает ни про внешние устройства (кроме некоторых зашитых), ни про формат общения с ними. Например: как считать файл с жёсткого диска? А как с него же загрузить код программы в память? Как отправить число по сети? Во-вторых, мы выполняли на процессоре только одну программу, а как же многозадачность? Что делать, если я хочу одновременно и делить числа и воспроизводить звук?&lt;/p&gt;
  &lt;p id=&quot;4pzl&quot;&gt;На все эти вопросы отвечают как раз операционные системы. Они представляют из себя фундамент (или, если угодно, окружение) для прикладных процессов, которые в них работают. &lt;/p&gt;
  &lt;figure id=&quot;kyli&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/88/5b/885b8a96-6eec-4739-8d69-a3ec3222f6d2.png&quot; width=&quot;461&quot; /&gt;
    &lt;figcaption&gt;Рис. 4.1. Иерархичность процессов в компьютере общего назначения.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;wDBV&quot;&gt;В результате, создавая программу для Windows, например, вам не нужно заботится, как через прерывания надо вызывать обработчик отправки точек на экран компьютера, что бы отрисовать окно, это за программу сделает операционная система. Вам так же не нужно переживать, что при работе вашей программы останавливается другая программа, об этом так же позаботиться ваша ОС.&lt;/p&gt;
  &lt;p id=&quot;Whol&quot;&gt;Программы (или процессы), которые работают внутри ОС, обычно называют &lt;em&gt;пользовательскими (или прикладными) программами, &lt;/em&gt;а программы, которые составляют ОС — &lt;em&gt;системными&lt;/em&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;Kz44&quot;&gt;Планировщик задач&lt;/h3&gt;
  &lt;p id=&quot;ZoRi&quot;&gt;Важнейшей частью любой ОС является &lt;em&gt;планировщик задач&lt;/em&gt; (или &lt;em&gt;диспетчер&lt;/em&gt;). Это системная программа, которая, грубо говоря, постоянно переключает процессор с одной выполняемой пользовательской программы на другую, запускает и останавливает их. Именно через этот механизм, в основном, реализуется &lt;em&gt;многозадачность&lt;/em&gt;. &lt;/p&gt;
  &lt;figure id=&quot;LK5a&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a3/45/a345e0d4-ab2b-4733-983e-0b2b72ebf82d.png&quot; width=&quot;596&quot; /&gt;
    &lt;figcaption&gt;Рис. 4.2. Перемежающиеся процессы.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;09Sk&quot;&gt;То есть, на самом деле, просто представьте: каждый раз, когда вы двигаете курсор мыши (от мыши поступает сигнал, что она передвинута), планировщик задач ОС останавливает все запущенные приложения, запускает программу перерисовки курсора в другой точке, затем возвращает выполнение тех программ, которые он остановил. То же происходит, например, при прослушивании звука и ведении чата в социальной сети: пока вы чатитесь, ОС постоянно на доли секунды приостанавливает работу браузера, переключается на звуковое приложение, даёт ему отправить в звуковую карту очередную порцию данных, и, затем, возвращает браузер на место. Обычно, это всё происходит настолько быстро, что абсолютно незаметно.&lt;/p&gt;
  &lt;p id=&quot;7c3m&quot;&gt;Реальное положение вещей, конечно, сложнее: в процессорах уже давно существует и конвейер команд, который позволяет выполнят их с опережением, и многоядерность, специально для параллельного выполнения разных инструкций (это как процессор в процессоре), но, в целом, механизм остаётся тем же самым.&lt;/p&gt;
  &lt;p id=&quot;0TPw&quot;&gt;В следующий раз, когда ваша ОС будет &amp;quot;тормозить&amp;quot;, знайте: это планировщик задач не может справится со своей работой так, что бы это было незаметно, из-за большой загрузки разными задачами.&lt;/p&gt;
  &lt;h3 id=&quot;meU6&quot;&gt;Драйверы&lt;/h3&gt;
  &lt;p id=&quot;pIi5&quot;&gt;Некоторые внешние по отношению к процессору устройства &amp;quot;знает&amp;quot; сам процессор, работа с некоторыми есть в BIOS, но большая часть работы с ними запрограммирована в специальные подпрограммы ОС, которые обычно называют драйверами.&lt;/p&gt;
  &lt;p id=&quot;lko6&quot;&gt;&lt;strong&gt;Драйвер&lt;/strong&gt; — это мост, интерфейс между прикладными программами и реальным физическим устройством, который делает работу с ними удобной. Например, что бы отправить два байта по сети без драйвера, вам потребуется совершить очень много действий, которые будут, скорее всего, включать: &lt;/p&gt;
  &lt;ol id=&quot;8TE0&quot;&gt;
    &lt;li id=&quot;P8JZ&quot;&gt;загрузить первый байт в регистр;&lt;/li&gt;
    &lt;li id=&quot;nrus&quot;&gt;выставить адрес сетевой карты на внутренней шине;&lt;/li&gt;
    &lt;li id=&quot;kJB7&quot;&gt;вызвать прерывание установки адреса, что бы сетевая карта перешла в режим чтения данных с шины;&lt;/li&gt;
    &lt;li id=&quot;gOkS&quot;&gt;выставить байт из регистра на внутренней шине;&lt;/li&gt;
    &lt;li id=&quot;G1Q6&quot;&gt;вызвать прерывание установки данных, что бы сетевая карта прочитала данные с шины;&lt;/li&gt;
    &lt;li id=&quot;9koH&quot;&gt;повторить это для второго байта;&lt;/li&gt;
    &lt;li id=&quot;P89G&quot;&gt;и так далее.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;lfJU&quot;&gt;Драйвер сетевой карты же скроет в себе эту сложность. Ему на вход можно передать сразу оба байта, а он сам, внутри себя, выполнит нужные операции.&lt;/p&gt;
  &lt;p id=&quot;C7My&quot;&gt;Точно так же происходит и с остальным: со звуком, с жестким диском, с видеокартой и экраном.&lt;/p&gt;
  &lt;h3 id=&quot;TAaQ&quot;&gt;Файловая система&lt;/h3&gt;
  &lt;p id=&quot;qp2Y&quot;&gt;Отдельно стоит отметить работу с жестким диском. Дело в том, что файлы, как и сама файловая система, существуют только на уровне ОС и её драйверов . При работе с устройством напрямую вы будете видеть только сектора и смещения, отдельные ячейки, в которых находятся какие-то бессмысленные байты.&lt;/p&gt;
  &lt;p id=&quot;dzGc&quot;&gt;Базовая файловая система — это таблица разметки жесткого диска на папки и файлы. Грубо говоря, в этой таблице зафиксировано: &amp;quot;файл1.txt начинается в секторе 6 со смещением 267, а заканчивается — в секторе 8 со смещением 11&amp;quot;. Содержимое файлов же, байты, хранятся сплошняком, поэтому без такой таблицы размещения содержимое диска превращается в бессвязную кашу.&lt;/p&gt;
  &lt;p id=&quot;6Cp2&quot;&gt;Собственно, одна из самых старых файловых систем так и называется — FAT, что означает &amp;quot;File Allocation Table&amp;quot;, таблица размещения файлов.&lt;/p&gt;
  &lt;h3 id=&quot;7ZyD&quot;&gt;Прерывания&lt;/h3&gt;
  &lt;p id=&quot;qQmB&quot;&gt;В операционных системах общего назначения обычно запрещают пользовательскому коду самостоятельно работать с прерываниями, потому что они только мешают диспетчеру задач выполнять свою работу. Аппаратные же прерывания обрабатываются самой ОС.&lt;/p&gt;
  &lt;p id=&quot;WUM7&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;jQbG&quot;&gt;Таким образом, операционная система — важнейшая часть практически любой информационной системы. Без неё работа с голым процессором и периферийными устройствами была бы колоссально сложна и неудобна.&lt;/p&gt;
  &lt;h2 id=&quot;xr81&quot;&gt;Языки программирования&lt;/h2&gt;
  &lt;p id=&quot;nCGl&quot;&gt;Пример программы для процессора выше был простым, но настолько простые вычисления уже давно не интересны индустрии. Реальные современные программы состоят из миллиардов таких инструкций, со сложными ветвлениями и работой с периферийными устройствами. Составить сложную программу на языке инструкций процессора чрезвычайно сложно, если не невозможно.&lt;/p&gt;
  &lt;p id=&quot;hq7k&quot;&gt;Именно за этим были придуманы языки программирования. Они предоставляют собой сильно более понятный человеку язык (хотя всё равно специфичный), который позволяет скрыть сложность машинных кодов и особенностей работы с шинами данных и сосредоточиться на решаемой задаче. Язык программирования — такая же &lt;em&gt;абстракция&lt;/em&gt; над машинными инструкциями, как сами машинные инструкции над элементарными побитовыми логическими операциями. Именно поэтому большинство из них называют &lt;em&gt;языками высокого уровня.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;Y1rX&quot;&gt;Представим предыдущую программу деления двух чисел на языке высокого уровня С#. Мы модифицируем её так, что бы она брала данные не из некоего периферийного устройства, как в примере выше, а из консоли ОС.&lt;/p&gt;
  &lt;pre id=&quot;UG9v&quot;&gt;static void Main() {
    while (true) {
        var number1 = int.Parse(Console.ReadLine());
        var number2 = int.Parse(Console.ReadLine());
    
        if (number2 == 0) {
            Console.WriteLine(&amp;quot;0&amp;quot;);
        }
        else {
            var number3 = number1 / number2;
            Console.WriteLine(number3.ToString());
        }
    }
}&lt;/pre&gt;
  &lt;p id=&quot;Ku1k&quot;&gt;Как можно видеть, тут уже нет команд переходов, зато есть &lt;em&gt;бесконечный цикл&lt;/em&gt; — &lt;strong&gt;WHILE&lt;/strong&gt; и &lt;em&gt;условное ветвление&lt;/em&gt; — &lt;strong&gt;IF ... ELSE&lt;/strong&gt;. Программа уже стало более удобной для чтения.&lt;/p&gt;
  &lt;p id=&quot;afH8&quot;&gt;Но тут можно заметить, что, по сравнению с предыдущим примером, она явно не стала меньше, а даже больше. Это потому, что, на самом деле, она делает &lt;em&gt;намного больше работы&lt;/em&gt;, чем предыдущая версия. В примере с инструкциями процессора мы не вдавались в детали, откуда мы читаем данные и как это делаем. В реальности же, даже с простейшим периферийным устройством, она бы растянулась на несколько десятков строк.&lt;/p&gt;
  &lt;p id=&quot;c6Wc&quot;&gt;В этом же примере, мы не просто считываем данные, мы считываем их из &lt;em&gt;командной строки&lt;/em&gt; (&lt;strong&gt;Console.ReadLine&lt;/strong&gt;), которая уже является надстройкой ОС. Которая, в свою очередь, под капотом, работает с клавиатурой и экраном через соответствующие драйверы. Кроме того, мы получаем данные из консоли не в числовом виде, не байтами, а в виде &lt;em&gt;строки&lt;/em&gt;. А затем преобразовываем эту строку в 4-х байтное число (&lt;strong&gt;int.Parse&lt;/strong&gt;). Затем мы отправляем результат операции обратно в консоль (&lt;strong&gt;Console.WriteLine&lt;/strong&gt;), преобразовав полученное число обратно к строке (&lt;strong&gt;.ToString&lt;/strong&gt;). Аналогичная программа в инструкциях процессора заняла бы добрых пару сотен строк.&lt;/p&gt;
  &lt;p id=&quot;S3vz&quot;&gt;Стоит обратить отдельное внимание на то, что команды работы с командной строкой (консолью) — это интерфейс, предоставляемый именно операционной системой и часто такие команды называют &lt;em&gt;системными вызовами &lt;/em&gt;(потому, что в этом месте &amp;quot;вызывается&amp;quot; подпрограмма системы, т.е. ОС). &lt;/p&gt;
  &lt;h2 id=&quot;DGN0&quot;&gt;Сеть&lt;/h2&gt;
  &lt;p id=&quot;8Vgn&quot;&gt;Взаимодействие процессов, однако, не ограничивается одним компьютером и устройствам, в нём непосредственно расположенными. Современный мир — век сетевой связанности устройств друг с другом. Как же организуется такая работа?&lt;/p&gt;
  &lt;figure id=&quot;olW6&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2c/f2/2cf2dfe2-faf3-4525-ab8c-fdab987c2fb7.png&quot; width=&quot;691&quot; /&gt;
    &lt;figcaption&gt;Рис. 6.1. Передача информации по сети от Компьютера 1 к Компьютеру 2.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;AoSw&quot;&gt;Если не вдаваться в детали, то, что бы отправить данные другому устройству в сети, процессору необходимо скинуть их в сетевую карту. Она, в свою очередь, упакует их в свой протокол и через электрические сигналы передаст к маршрутизатору. Маршрутизатор по информации в переданных данных определит адресата и передаст данные его сетевой карте. На принимающей стороне сетевая карта расшифрует электрические сигналы, распакует сообщение и передаст в процессор.&lt;/p&gt;
  &lt;p id=&quot;OJEJ&quot;&gt;Тут необходимо отметить, что маршрутизатор между источником и приёмником может быть не один, их могут быть сотни — они и составляют основу Интернета. Сам же маршрутизатор — это просто коммутатор, который работает как телефонистки на заре телефонов. Он определяет, в какой провод дальше отправить данные, пришедшие из другого провода.&lt;/p&gt;
  &lt;h3 id=&quot;nPAC&quot;&gt;Иерархия протоколов и модель OSI&lt;/h3&gt;
  &lt;p id=&quot;j5wk&quot;&gt;Как я уже отметил, сетевая карта &amp;quot;оборачивает&amp;quot; данные, которые надо передать, в свой собственный протокол. Но на самом деле таких протоколов несколько, каждый из них предназначен для решения одной из проблем при передаче данных. Все они обычно сводятся в общепринятую &lt;strong&gt;модель OSI&lt;/strong&gt;.&lt;/p&gt;
  &lt;figure id=&quot;MAHn&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1f/e7/1fe7425b-cf82-41f9-86ab-ad8bba9878a2.png&quot; width=&quot;394.5&quot; /&gt;
    &lt;figcaption&gt;Рис. 6.2. Модель OSI.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;xfQz&quot;&gt;В ней оборачиваемые протоколы идут от самых близких к значимым данным до самых базовых, предназначенных для передачи отдельных сигналов. В принципе, данные в сетевую карту можно передавать начиная с четвертого, транспортного уровня.&lt;/p&gt;
  &lt;p id=&quot;3LUI&quot;&gt;Кроме этого, в реальной жизни, зачастую протокол одной прикладной программы на самом высоком уровне OSI упаковывается в протокол другой программы, который так же находится на 7-м уровне. Так регулярно происходит, например, с HTTP, в который оборачивают данные программы.&lt;/p&gt;
  &lt;h3 id=&quot;kT9h&quot;&gt;IP&lt;/h3&gt;
  &lt;p id=&quot;MPRl&quot;&gt;Это интернет-протокол (так и расшифровывается) сетевого уровня (3-го в модели), который отвечает на вопрос &amp;quot;куда доставить?&amp;quot; В нём каждому устройству в сети предоставлен свой адрес, который кодируется четырьмя байтами (в версии IPv4), отправитель сообщения должен знать этот адрес и, на этом уровне, как раз его выставляет. Маршрутизаторы, основываясь на этом адресе назначения, прокидывают отправленные данные до адресата. &lt;/p&gt;
  &lt;p id=&quot;NFEI&quot;&gt;У этого протокола есть альтернативы, но они уже практически не используются, или используются в очень узких областях.&lt;/p&gt;
  &lt;p id=&quot;fuDL&quot;&gt;Ваш IP-адрес — это и есть &amp;quot;почтовый&amp;quot; адрес устройства, по которому вашему компьютеру доставляются данные.&lt;/p&gt;
  &lt;p id=&quot;s6IE&quot;&gt;Однако в реальных применениях просто адресованная передача байт не очень интересна. Два набора данных, например, могут перепутаться при передаче или быть потеряны. Кроме того, данные может быть необходимо зашифровать при передаче. Эти проблемы на себя обычно берут протоколы 4, 5 и 6-го уровней: транспортного, сеансового и представления. Эти уровни формируют из исходных данных специальные программы, которые работают либо в ОС, либо прямо в сетевой карте.&lt;/p&gt;
  &lt;h3 id=&quot;UCeB&quot;&gt;UDP и TCP&lt;/h3&gt;
  &lt;p id=&quot;Z76D&quot;&gt;Двумя самыми распространёнными протоколами данных над IP являются UDP и TCP.&lt;/p&gt;
  &lt;p id=&quot;KwiY&quot;&gt;&lt;strong&gt;UDP&lt;/strong&gt; — протокол передачи датаграмм, т.е. массивов данных адресатам. Он очень простой и предоставляет мало преимуществ перед сырым IP. Данные могут потеряться при передаче, сообщения могут перепутаться местами. Однако, он играет важнейшую роль — из-за его простоты через него можно передавать огромное количество не очень важных сообщений. Например, при управлении чем-то в реальном времени или при отправке каких-либо показаний.&lt;/p&gt;
  &lt;p id=&quot;UvrX&quot;&gt;&lt;strong&gt;TCP&lt;/strong&gt;, наоборот, это протокол, который устанавливает и поддерживает &lt;em&gt;соединение&lt;/em&gt; при передаче данных. Внутри он следит как за потерей кусков данных, так и за очерёдностью их доставки. Он сильно более надёжен, но и от этого более сложен и ресурсоёмок. Для передачи байта по сети через UDP достаточно просто передать этот байт, завернув в &amp;quot;конверт&amp;quot; UDP, в TCP для этого требуется: &lt;/p&gt;
  &lt;ol id=&quot;LSrY&quot;&gt;
    &lt;li id=&quot;nIHe&quot;&gt;отправить приветствие и дождаться ответа на приветствие (в реальности эта процедура происходит аж в 3 этапа);&lt;/li&gt;
    &lt;li id=&quot;hk8a&quot;&gt;передать кусок данных, дождаться подтверждения передачи куска;&lt;/li&gt;
    &lt;li id=&quot;HjmO&quot;&gt;отправить сообщение о закрытии соединения.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;eEXD&quot;&gt;Однако, именно TCP в интернете используется чаще всего для передачи данных между пользовательскими программами.&lt;/p&gt;
  &lt;h3 id=&quot;Owmn&quot;&gt;Порты&lt;/h3&gt;
  &lt;p id=&quot;l2Ey&quot;&gt;Представим, что на компьютере 1 запущено две программы — программа1 и программа2, на другом компьютере в той же сети, так же запущены программа3 и программа4.&lt;/p&gt;
  &lt;p id=&quot;xuPa&quot;&gt;Когда мы отправляем данные из программы1 с первого компьютера программе3 на втором, как мы укажем, для какой именно программы они предназначаются? Для решения этой проблемы были придуманы так называемые &lt;strong&gt;порты&lt;/strong&gt;. Это обычные числа (от 1 до 65535), которые занимают &amp;quot;слушающие&amp;quot; программы при своей работе. Отправляющая программа при передаче указывает, на какой порт адресата она отправляет сообщение. При этом, пока порт кем-то используется, другая программа не может его занять.&lt;/p&gt;
  &lt;p id=&quot;wZWI&quot;&gt;В примере выше, программа4 на компьютере 2 может занять порт, скажем, 1234. И при отправке сообщения, программа1, кроме адреса компьютера, укажет порт 1234, сообщение будет доставлено по адресу.&lt;/p&gt;
  &lt;h3 id=&quot;qzCF&quot;&gt;Доменные имена&lt;/h3&gt;
  &lt;p id=&quot;56QG&quot;&gt;Я уверен, что никто уже очень давно не вбивал в адресной строке браузера IP-адрес, что бы открыть какую-то страницу (хотя это можно сделать). Вместо непонятных цифр IP-адреса мы привыкли работать с &lt;strong&gt;доменными именами&lt;/strong&gt; вроде google.com.&lt;/p&gt;
  &lt;p id=&quot;CdTM&quot;&gt;За обеспечение этого удобства ответственна интернет-служба доменных имён — &lt;strong&gt;DNS&lt;/strong&gt;. Специальные серверы, с которыми постоянно синхронизируются компьютеры, хранят информацию о том, какое доменное имя соответствует какому IP-адресу. &lt;/p&gt;
  &lt;p id=&quot;r3dF&quot;&gt;То есть, когда вы в следующий раз откроете главную страницу Google, ваш компьютер под капотом определит IP-адрес устройства, которое обслужит ваш запрос, и отправит данные именно ему через протокол IP.&lt;/p&gt;
  &lt;h3 id=&quot;QE6X&quot;&gt;HTTP&lt;/h3&gt;
  &lt;p id=&quot;ZzSX&quot;&gt;Обзор был бы неполон без рассмотрения одного из самых популярных &lt;em&gt;прикладных&lt;/em&gt; протоколов (7-й уровень OSI) современного интернета — &lt;strong&gt;HTTP&lt;/strong&gt;. Который переводится как HyperText Transfer Protocol. Именно он, на самом высоком уровне OSI, используется для открытия страниц браузером, как и в очень многих других случаях общения программы с программой. Просто хотя бы из-за своей распространённости.&lt;/p&gt;
  &lt;p id=&quot;pqIz&quot;&gt;Этот протокол основывается на модели запрос-ответ. Т.е. клиент формирует некоторые данные запроса, которые отправляются другой системе, а она на них отвечает. Важнейшим его свойством является то, что после ответа &amp;quot;сеанс связи&amp;quot; всегда заканчивается. Кроме этого, HTTP является &lt;em&gt;текстовым протоколом&lt;/em&gt;, что позволяет легко смотреть содержимое общения.&lt;/p&gt;
  &lt;p id=&quot;29oP&quot;&gt;Рассмотрим пример такого запроса и ответа, на которых можно будет разобрать основные части.&lt;/p&gt;
  &lt;p id=&quot;Vnkd&quot;&gt;Запрос.&lt;/p&gt;
  &lt;pre id=&quot;S5aT&quot;&gt;POST some-page.html HTTP/1.1
Content-Type: application/json, encoding=cp1251
Accept: text/html
Authorization: Basic 123

{&amp;quot;координата&amp;quot;: 1, &amp;quot;скорость&amp;quot;: 2}&lt;/pre&gt;
  &lt;p id=&quot;oUJ8&quot;&gt;Ответ.&lt;/p&gt;
  &lt;pre id=&quot;vz7G&quot;&gt;200 OK 
Content-Type: text/html, encoding=utf-8

&amp;lt;b&amp;gt;спасибо&amp;lt;/b&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;vQBn&quot;&gt;Как можно заметить сразу, сообщения явно состоят из некоторого заголовка и содержимого, так называемого &lt;em&gt;тела запроса/ответа&lt;/em&gt;. Соединившись с сервером, клиент отправляет запрос: &amp;quot;действие POST, ресурс some-page.html, версия протокола 1.1&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;uHX1&quot;&gt;Далее, идёт набор заголовков, которые сообщают дополнительные данные принимающей стороне:&lt;/p&gt;
  &lt;ol id=&quot;coOw&quot;&gt;
    &lt;li id=&quot;Ha0U&quot;&gt;&lt;strong&gt;Content-Type&lt;/strong&gt; — в каком формате передаётся тело сообщения, в данном случае — application/json, что соответствует популярному формату данных JSON; так же может быть указана кодировка текста в теле запроса, в данном случае русская ASCII;&lt;/li&gt;
    &lt;li id=&quot;tKTb&quot;&gt;&lt;strong&gt;Accept&lt;/strong&gt; — в каком формате отправитель хочет получить ответ;&lt;/li&gt;
    &lt;li id=&quot;mqRQ&quot;&gt;&lt;strong&gt;Authorization&lt;/strong&gt; — отправитель сообщает информацию о своей авторизации (например, логин и пароль).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Je4k&quot;&gt;После чего, через один перевод строки, следует тело запроса, собственно, в формате JSON и в указанной кодировке.&lt;/p&gt;
  &lt;p id=&quot;RRup&quot;&gt;На этот запрос сервер отвечает похожим образом: &amp;quot;всё хорошо, код ответа 200 ОК&amp;quot;. Далее, сообщает формат тела ответа и кодировку (в данном случае UTF-8) и, после перевода строки, отправляет само тело в указанном ранее формате.&lt;/p&gt;
  &lt;p id=&quot;Lcxd&quot;&gt;Как нетрудно заметить, в таких &amp;quot;конвертах&amp;quot; можно передавать абсолютно любые сообщения между двумя программами.&lt;/p&gt;
  &lt;h3 id=&quot;lSxX&quot;&gt;Локальное общение&lt;/h3&gt;
  &lt;p id=&quot;vm6z&quot;&gt;Описанные сетевые технологии могут быть использованы не только для реальной связи по сети между двумя машинами, зачастую они используются для связи двух программ внутри одного и того же компьютера. В этом случае используют зарезервированный IP адрес &lt;em&gt;127.0.0.1&lt;/em&gt; или специальное имя &lt;em&gt;localhost&lt;/em&gt;. Хотя данные никуда не уходят за пределы машины, для программ всё остаётся так, как будто они работают с удалённым устройством.&lt;/p&gt;
  &lt;h2 id=&quot;IYnS&quot;&gt;&lt;/h2&gt;
  &lt;p id=&quot;hzlw&quot;&gt;Таким образом, мы быстро, но достаточно подробно рассмотрели все основные объекты информационных технологий: от процессов и данных, элементарных логических команд и организации процессоров, до ОС, языков программирования и взаимодействий процессов друг с другом по сети.&lt;/p&gt;

</content></entry><entry><id>khaos:UTmVfX6de</id><link rel="alternate" type="text/html" href="https://teletype.in/@khaos/UTmVfX6de?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=khaos"></link><title>Нифти</title><published>2021-03-19T16:51:36.256Z</published><updated>2021-03-19T17:01:55.025Z</updated><summary type="html">&lt;img src=&quot;https://teletype.in/files/f1/a4/f1a43ccf-5ee3-4ca5-89f3-f4d0e82859ce.jpeg&quot;&gt;По миру прокатилась очередная волна криптохайпа, в этот раз со стороны нового явления — NFT. Удивительно, но NFT-токены не имеют никакой юридической силы, не защищают от копирования и даже от повторного выпуска токена на тот же ресурс (просто по истории можно посмотреть, кто первый).</summary><content type="html">
  &lt;p&gt;По миру прокатилась очередная волна криптохайпа, в этот раз со стороны нового явления — NFT. Удивительно, но NFT-токены не имеют никакой юридической силы, не защищают от копирования и даже от повторного выпуска токена на тот же ресурс (просто по истории можно посмотреть, кто первый).&lt;/p&gt;
  &lt;p&gt;Самое забавное, что токены даже не содержат сам продаваемый объект, а только мета-информацию о нём. Многие даже не заморачиваются включить в токен хэш произведения, а само произведение внутри токена хранится в виде ссылки на сторонний ресурс.&lt;/p&gt;
  &lt;p&gt;Вот, например, &lt;a href=&quot;https://ipfsgateway.makersplace.com/ipfs/QmZ15eQX8FPjfrtdX3QYbrhZxJpbLpvDpsgb2p3VEH8Bqq&quot; target=&quot;_blank&quot;&gt;превью картинки&lt;/a&gt; той сделки с Christie&amp;#x27;s на $69 миллионов. Можно &lt;a href=&quot;https://ipfsgateway.makersplace.com/ipfs/QmXkxpwAHCtDXbbZHUwqtFucG1RMS6T87vi1CdvadfL7qA&quot; target=&quot;_blank&quot;&gt;скачать и оригинал&lt;/a&gt; (просто он большой). Это всё можно вытащить из токена, ведь он публичный. Кроме того, продающий может заменить картинку по адресу в токене на что угодно, или вообще её удалить.&lt;/p&gt;
  &lt;figure class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/f1/a4/f1a43ccf-5ee3-4ca5-89f3-f4d0e82859ce.jpeg&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Хотя, думаю, Christie&amp;#x27;s все-таки и выдала за 69 миллионов какой-то юридический сертификат о праве собственности в дополнение к самому токену, но, в целом, покупатели NFT становятся счастливыми обладателями JSON-файлов со ссылками. Записанными в блокчейн, да.&lt;/p&gt;
  &lt;p&gt;Самые главные бенефициары в этой истории — владельцы криптоинфраструктуры и площадок. Вот они как раз очень успешно монетизируются на эфемерной технологии, сами создавая вокруг неё движуху. Они мне всё больше начинают напоминать окультуренных пиратов, рейдеров, которые поменяли корабли на волны хайпа.&lt;/p&gt;
  &lt;p&gt;Напоминает схему Понци, неправда ли?&lt;/p&gt;

</content></entry><entry><id>khaos:JkJNTm7-Y</id><link rel="alternate" type="text/html" href="https://teletype.in/@khaos/JkJNTm7-Y?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=khaos"></link><title>Скоростной режим</title><published>2021-01-07T10:01:25.388Z</published><updated>2021-01-07T10:01:25.388Z</updated><summary type="html">&lt;img src=&quot;https://teletype.in/files/74/24/74244d1c-e346-4d7c-bc9f-4150ad82bcd7.jpeg&quot;&gt;Недавно увидел на одной из подмосковных трасс чудо техники — имитатор люстры машины ДПС, прикрученный к фонарному столбу. Удивительно, как много сил и средств тратится на то, что бы водители соблюдали скоростной режим. Но они его всё равно регулярно нарушают.</summary><content type="html">
  &lt;p&gt;Недавно увидел на одной из подмосковных трасс чудо техники — имитатор люстры машины ДПС, прикрученный к фонарному столбу. Удивительно, как много сил и средств тратится на то, что бы водители соблюдали скоростной режим. Но они его всё равно регулярно нарушают.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/74/24/74244d1c-e346-4d7c-bc9f-4150ad82bcd7.jpeg&quot; width=&quot;1024&quot; /&gt;
    &lt;figcaption&gt;Фото с искусственной мигалкой из интернета.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Очевидно: что бы по-настоящему решить проблему превышения скорости надо сделать машины, которые не могут разгоняться больше ограничения. Причём, сделать это в XXI веке достаточно просто и такие приборы уже давно существуют и используются в автомобилях. Достаточно сделать их автоматическими и обязательными, что сейчас уже не представляет большой технической сложности. Тогда все камеры, мигалки на столбах, надувные экипажи ДПС закономерно смогут быть отправлены на свалку истории. Как и штрафы за превышение скорости. &lt;/p&gt;
  &lt;p&gt;Тут, правда, есть два момента, которые потребуют проработки: обгоны и адекватность существующих ограничений, которые во многих местах явно придётся пересмотреть. &lt;/p&gt;

</content></entry><entry><id>khaos:OABtNXwNf</id><link rel="alternate" type="text/html" href="https://teletype.in/@khaos/OABtNXwNf?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=khaos"></link><title>Хеликоптер вью</title><published>2020-12-27T13:20:01.006Z</published><updated>2020-12-27T13:20:01.006Z</updated><tt:hashtag>программирование</tt:hashtag><tt:hashtag>архитектура</tt:hashtag><summary type="html">Периодически возникают холивары — существует ли на самом деле такое явление, как &quot;самодокументирующийся код&quot;. Так вот нет, не существует. Ни один код не заменит документации о том, что на самом деле происходит, зачем это происходит, почему это начало происходить в прошлом и прочую разнообразную проектную документацию.</summary><content type="html">
  &lt;p&gt;Периодически возникают холивары — существует ли на самом деле такое явление, как &amp;quot;самодокументирующийся код&amp;quot;. Так вот нет, не существует. Ни один код не заменит документации о том, что на самом деле происходит, зачем это происходит, почему это начало происходить в прошлом и прочую разнообразную проектную документацию.&lt;/p&gt;
  &lt;p&gt;Но это совершенно не значит, что код не должен быть максимально информативным. Решение, структура проектов в решении, отдельные модули в проектах, функции и классы в модулях, переменные внутри функций, все должны максимально придерживаться принципа &amp;quot;хеликоптер вью&amp;quot;: при взгляде на каждый кусок должно быть примерно ясно, что именно он делает и, возможно, каким способом он это делает.&lt;/p&gt;
  &lt;p&gt;Это не просто делает проект понятным другим людям, которые с ним столкнуться, но очень сильно помогает самим разработчикам, во-первых, держать карту проекта в голове, во-вторых, вернувшись через полгода вспомнить, что здесь вообще происходит. В третьих, этот принцип нужно использовать как мнемоническое правило для довольно простого и быстрого проектирования.&lt;/p&gt;
  &lt;p&gt;Крайне рекомендуется применять вышесказанное с другими матёрыми и известными принципами, например SRP, для достижения максимального эффекта.&lt;/p&gt;
  &lt;tt-tags&gt;
    &lt;tt-tag name=&quot;программирование&quot;&gt;#программирование&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;архитектура&quot;&gt;#архитектура&lt;/tt-tag&gt;
  &lt;/tt-tags&gt;

</content></entry><entry><id>khaos:V_lmdpF9m</id><link rel="alternate" type="text/html" href="https://teletype.in/@khaos/V_lmdpF9m?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=khaos"></link><title>Асинхронность и многопоточность</title><published>2020-12-27T10:09:16.212Z</published><updated>2020-12-27T13:17:00.062Z</updated><tt:hashtag>программирование</tt:hashtag><tt:hashtag>асинхронность</tt:hashtag><tt:hashtag>многопоточность</tt:hashtag><summary type="html">Удивительно, как много разработчиков не знают разницы между асинхронностью и многопоточоностью. А разница между ними примерно как разница между колесом и велосипедом.</summary><content type="html">
  &lt;p&gt;Удивительно, как много разработчиков не знают разницы между асинхронностью и многопоточоностью. А разница между ними примерно как разница между колесом и велосипедом.&lt;/p&gt;
  &lt;p&gt;Асинхронность — это когда вы, работая, просите жену (или мужа?) сделать кофе. Кофе делается во внешней системе, а вы можете не отвлекаться от работы.&lt;/p&gt;
  &lt;p&gt;Многопоточность — это когда вы едите и листаете ленту любимой социальной сети. Вы делаете (или, во всяком случае, пытаетесь) два действия одновременно, параллельно.&lt;/p&gt;
  &lt;p&gt;Тем хуже, что в C#, с которым я работаю 90% времени, эти понятия для удобства работы смешаны в одну кучу.&lt;/p&gt;
  &lt;p&gt;Правильный ответ на вопрос в начале поста отличает разработчика от человека, случайно оказавшегося в профессии.&lt;/p&gt;
  &lt;tt-tags&gt;
    &lt;tt-tag name=&quot;программирование&quot;&gt;#программирование&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;асинхронность&quot;&gt;#асинхронность&lt;/tt-tag&gt;
    &lt;tt-tag name=&quot;многопоточность&quot;&gt;#многопоточность&lt;/tt-tag&gt;
  &lt;/tt-tags&gt;

</content></entry></feed>