tag:blogger.com,1999:blog-86241700095136209622024-03-19T11:48:43.593+03:00Парсер ХабраВас тоже достает, когда автор переносит топик в черновик?Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.comBlogger65751125tag:blogger.com,1999:blog-8624170009513620962.post-20601368423631840152021-12-12T23:36:00.001+03:002021-12-12T23:36:36.665+03:00[Перевод] Как я провалил 5 хобби-проектов за 6 лет и заработал 0 долларов<div><img src="https://habr.com/img/image-loader.svg" height="70%" data-src="https://habrastorage.org/webt/zj/vo/bz/zjvobzhi1lli1grof9mbkyyzzmm.png" data-width="70%" /></div>
<br />
Это история о том, как я мечтал создать генерирующий прибыль онлайн-проект, стремясь к финансовой независимости и творческой свободе. Спустя пять лет ни один из моих проектов не достиг успеха и это по-прежнему остаётся мечтой. Позвольте мне подробно рассказать о своих провалившихся проектах.<br />
Всё началось с игры. Все любят игры, правда? Представьте, каково это — писать собственную! Это было бы так увлекательно!
<p>В 2015 году мы вместе с моим другом решили создать мобильную игру на iOS: Planetoid. Если вкратце, это была основанная на графах стратегия, в которой игрок должен захватить все планеты, стреляя снарядами. Вот видео того, как она выглядела:</p>
<br />
На её создание мы потратили больше года, работая по вечерам и в выходные. Мы всё сделали сами: дизайн, музыку, уровни и т.п. Наконец, мы выпустили её в ноябре 2016 года как платное приложение. К сожалению, людям не захотелось за неё платить. За два месяца не было ни одной продажи.<br />
Есть ли другие способы монетизации приложения? Конечно — это реклама. Мы решили интегрировать рекламу и издать бесплатную игру. Спустя несколько месяцев набралось 300 установок. Нас как будто холодной водой окатили — мы потратили столько времени на игру и в неё почти никто не сыграл.
<p>Но ладно, ведь это наш первый опыт! Мы многому научились, принимая по пути хорошие и плохие решения.</p>
<ul>
<li>Мы получили опыт создания с нуля приложения и его издания в App Store. Это были очень ценные навыки, учитывая, что я начал свою профессиональную карьеру как iOS-разработчик.</li>
<li>Игра была написана на Objective-C с использованием SpriteKit. В то время Swift с каждым релизом значительно менялся, поэтому кодить на Obj-C было отличной идеей. Мы сэкономили кучу времени на том, что не нужно было выполнять миграцию кода под новые версии Swift.</li>
<li>Маркетинга почти не было. Мы написали об игре на известных ресурсах типа Reddit или Hacker News, и надеялись, что App Store сделает за нас всю работу. Но он не сделал. Planetoid просто утонула во множестве других приложений App Store.</li>
</ul>
<br />
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/zj/vo/bz/zjvobzhi1lli1grof9mbkyyzzmm.png" /></div>
<br />
Я был разочарован результатами выпуска Planetoid и решил подойти к новому проекту с другой стороны.
<p>На этот раз я планировал создать приложение трекинга времени для macOS. Сначала я задизайнил его в Zeplin. Затем создал лэндинг со списком рассылки для своего следующего приложения. Я захотел прорекламировать его и проверить, найдутся ли люди, желающие подписаться на список рассылки. Также я интегрировал Google Analytics, чтобы проверить, посещает ли кто-нибудь сайт, и запустил небольшую рекламную кампанию в Google Ads.</p>
<p>Спустя 3 месяца рекламной кампании и маркетинга на список рассылки подписалось 5 человек. Это было ниже ожиданного мной и я забросил проект.</p>
<br />
На этот раз я захотел создать что-то только для себя.
<p>Одно из моих хобби — игра на гитаре. Я хотел создал минималистичное и функциональное приложение-метроном. Идея заключалась в том, чтобы использовать минимально возможное количество кнопок и управлять приложением свайпами, получая при каждом изменении тактильную обратную связь.</p>
<p>К сожалению, на этот раз мотивация исчерпалась довольно быстро. Я был немного уставшим после предыдущих проектов. Кроме того, я нашёл в App Store приложение, отвечавшее всем моим потребностям, поэтому забросил и этот проект.</p>
<div><img src="https://habrastorage.org/r/w780q1/webt/sc/bw/dc/scbwdcdd3zn9lscjrwiwr75vwym.jpeg" data-src="https://habrastorage.org/webt/sc/bw/dc/scbwdcdd3zn9lscjrwiwr75vwym.jpeg" data-blurred="true" /></div>
<br />
После этих проектов я был вымотан. Меня больше не радовала работа над хобби-проектами.
<p>Параллельное выполнение рабочих обязанностей и работа над хобби-проектами — непростая задача, она может привести к выгоранию. И меня это тоже немного коснулось. Мне нужен был перерыв.</p>
<p>Настало время подзарядить свои батарейки и вернуться к инди-хакингу только тогда, когда он точно будет меня радовать. И для этого понадобилось почти 2 года.</p>
<br />
И вновь за старое. Сентябрь 2019 года. Чтобы отдохнуть, мне потребовалось прилично времени, но оно того стоило. Меня снова радовали хобби-проекты.
<p>В конце 2019 года я изучал рынок недвижимости. Проблема заключалась в том, что поисками жилья можно заниматься на множестве разных сайтов. Кроме того, рынок был настолько перегрет, что казалось невозможным купить квартиру на вторичном рынке. Выгодные предложения в буквальном смысле уходили за считанные часы.</p>
<p>Я захотел разработать инструмент для мониторинга новых предложений, чтобы он уведомлял меня о появлении интересных вариантов. План заключался в том, что я указываю такие параметры, как цена, площадь жилья, район, ключевые слова и т.п., и на их основании приложение присылает уведомление.</p>
<p>Ещё один проект лично для меня с определённым потенциалом монетизации.</p>
<p>Я начал разрабатывать веб-скрейперы для сбора данных. Потратил на это около двух недель и внезапно осознал уровень сложности. Объём работы был слишком велик для одного человека.</p>
<p>Поискав в Интернете, я решил купить один из готовых инструментов и забросил проект. Мне не хотелось снова выгореть.</p>
<p>Заметка на будущее: выбирать что-то простое, доступное для создания одним человеком.</p>
<br />
В этот раз моей основной целью было изучение чего-то нового в процессе работы. Я выбрал Ruby on Rails. Это отличный фреймворк для быстрой разработки веб-сайтов. Кроме того, я хотел развить свои навыки веб-разработки. После этого проекта я надеялся пополнить свой инструментарий для будущих идей.
<p>Я начал разрабатывать ещё один портал с вакансиями. На этот раз я планировал создать веб-сайт только с предложениями работы от ИТ-компаний, занимающихся разработкой продуктов. Я потратил на его создание 6 месяцев, занимаясь в свободное после работы время. Сайт был запущен в октябре 2020 года.</p>
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/-w/xb/nh/-wxbnhjns-9bceycjxtusbe9dji.png" /></div>
<br />
Я провёл простейший маркетинг: связывался с компаниями на LinkedIn, публиковал посты на ресурсах типа Reddit и Hacker News. Спустя несколько недель мне удалось получить одно объявление о вакансии от одной из компаний. Остальные объявления я скрейпил из разных источников и вручную проверял их.
<p>Стоит упомянуть, что публикация объявлений была бесплатной. Узнав, о возможных сложностях с налогами, я решил сделать веб-сайт бесплатным, пока количество объявлений не станет значительным.</p>
<p>К сожалению, он не получил популярности и я закрыл его в мае 2021 года. Но цель проекта была достигнута:</p>
<ul>
<li>Я изучил основы Ruby on Rails и Renderer, улучшил свои навыки в фронтенд-разработке.</li>
<li>Изучил различные способы получения платежей.</li>
<li>Узнал, как работать с налогами в хобби-проектах, когда ты являешься гражданином ЕС.</li>
</ul>
<br />
После всех этих проектов я многое узнал о себе и о том, что меня мотивирует (и не мотивирует).
<p>У меня по-прежнему много идей, но теперь я более аккуратно подхожу к выбору новых проектов.</p>
<p>Во-первых, при выборе следующего проекта мне нужно искать маленькую идею, которую можно реализовать силами одного человека. Необходимо максимально урезать масштаб работ.</p>
<p>Нужно приблизительно прикидывать время, необходимое для выпуска MVP. Это должно занимать не больше 3 недель, учитывая, что у меня есть повседневная работа и я могу трудиться над проектом только в свободное время. Если по прикидкам время окажется больше, то нужно попытаться найти самый быстрый способ разработки MVP. Существует множество не требующих кодинга инструментов, способных ускорить разработку. Например, посмотрите, что <a href="https://twitter.com/ImSamThompson/status/1449518979387576323">удалось создать</a> Сэмюэлу Томпсону за один день!</p>
<blockquote readability="6">У меня появилась бизнес-идея, которую, похоже, я смогу разработать за 24 часа и получить за 30 дней MRR до пяти тысяч долларов…
<p>Опубликовать ли мне огромный пост с описанием всего процесса работы??</p>
<ul>
<li>Создание MVP за один вечер</li>
<li>Первоначальное исследование рынка</li>
<li>Органический маркетинг</li>
<li>Тестирование платной рекламы</li>
</ul>
<br />
Это будет безумный эксперимент…</blockquote>
<br />
Увеличение количества пользователей сильно мотивирует. Попытайтесь выпустить проект как можно скорее, чтобы получить первые отзывы и раннюю дозу свежей мотивации.
<p>Вот и всё, это вся история моих провалившихся проектов. Скрещу пальцы, надеясь на успех следующего.</p>
<p>Если хотите следить за моими приключениями и попытками заработать первые деньги на хобби-проектах, то подписывайтесь на мой Twitter: <a href="https://twitter.com/kwcodes">https://twitter.com/kwcodes</a></p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com15tag:blogger.com,1999:blog-8624170009513620962.post-37816255713638100552021-12-12T22:36:00.001+03:002021-12-12T22:36:36.218+03:00Биологи описали, как гидра отращивает утерянные части, регулируя эпигенетику<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/a93/c92/5bb/a93c925bbb15830a71f16cf3eec91b1c.jpg" width="1000" height="667" data-src="https://habrastorage.org/getpro/habr/upload_files/a93/c92/5bb/a93c925bbb15830a71f16cf3eec91b1c.jpg" data-blurred="true" /></figure>
<p>Биологи из Калифорнийского университета <a href="https://academic.oup.com/gbe/article/13/12/evab221/6455029" rel="noopener noreferrer nofollow">изучили и описали</a> экспрессию генов во время регенерации головы у гидры. Они выяснили, что изменения в структуре эпигенетических меток играют ключевую роль в процессе регенерации головы у этих животных. Открытие, надеются ученые, поможет разобраться в важных аспектах эволюции, таких как образование нервной системы.</p>
<p>Гидры являются одним из примеров «бессмертных» существ. Стволовые клетки гидры, если они полностью не уничтожены в пищеварительной системе хищника или не сожжены, могут воспроизводиться бесконечно. Исследования показали, что этот процесс происходит за счет эпигенетических факторов — того, где находятся гены, как они регулируются и взаимодействуют с окружающей средой и с другими участками генома. </p>
<p>Команда ученых под руководством научного сотрудника Калифорнийского университета Айде Масиас-Муньос провела серию опытов, в ходе которых они наблюдали, как как менялась динамика экспрессии генов гидр в ходе регенерации. Они выяснили, что регенераций головы гидры сопровождается значительными изменениями в структуре белковой обертки нескольких сотен генов, которые управляют делением и миграцией клеток животного, и, следовательно, повышением или понижением их активности.</p>
<p>Изменения были обнаружены в структуре белковой обертки ДНК в участках Ks1, EDIL3 и ZFN681 и рядом с генами из семейства Wnt. Ученые пришли к выводу, что эти сегменты генома имеют ведущее значение в формировании конечностей. Наблюдения также показали, что процессы регенерации головы гидры и почкования оказались совершенно разными. </p>
<p>«Программа регенерации оказалась значительно сложнее почкования. Очевидно, что программы формирования тканей тела появились еще до того, как разделились предки гидр и всех других многоклеточных животных», — <a href="https://www.sciencealert.com/a-hydra-s-incredible-ability-to-regrow-its-own-head-relies-on-this-key-mechanism" rel="noopener noreferrer nofollow">заявила Масиас-Муньос.</a></p>
<p>Это открытие открывает новые возможности для выяснения ключевых аспектов эволюции животных, таких как формирование нервной системы. Кроме того, команда надеется, что с его помощью в будущем регенерацию можно будет запустить и в теле человека.</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-91159201664526931352021-12-12T21:36:00.001+03:002021-12-12T21:36:50.399+03:00Безракетный запуск в космос: орбитальный магнитный трамплин часть 2Продолжаем разбираться с магнитным трамплином, <a href="https://habr.com/ru/post/593363/">в прошлой статье</a> мы разобрались с массой неодимовых магнитов на трамплине (600 тонн) и грузопотоком (2% от массы в одну сторону по одной полосе и 200 миллионов тонн в месяц при одновременном потоке в 2 стороны, когда одни грузы ускоряются на Луну, а другие тормозят с Луны).
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/9c/ur/dz/9curdzaiycevs04doyibxvt18nk.png" /></div>
<br />
Магнитный трамплин сам по себе является лишь аккумулятором импульса, который забирает/передаёт импульс грузам с 99,99% КПД, но пока посылок с Луны и других планет не ожидается нам нужен поток в одну сторону, чтобы превратить аккумулятор в ускоритель, его нужно накачивать импульсом. Существует множество способов получения импульса, находясь на орбите Земли — в сотни раз более эффективным, чем ракеты на химическом топливе, и одним из них является солнечный парус. У света есть импульс и при падении + отражении света от зеркала = зеркало будет получать ускорение.
<h2><span>▍ Сколько импульса даёт солнечный парус</span></h2>
<br />
Давление солнечного света на Земной орбите 9,1·10^−6 Н/м<img src="https://habrastorage.org/getpro/habr/formulas/413/68c/5fd/41368c5fd9bea6d1c727710d70bdb587.svg" alt="$^2$" data-tex="inline" />, (4,55 падающий свет + ~4,55 отражённый свет):
<p><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/kq/xm/3y/kqxm3ysyfzekbnfjceb8ppaekc0.png" /><br />
<i><span><a href="https://scask.ru/d_book_msp.php?id=13">Левантовский В.И. Механика космического полёта в элементарном изложении</a></span></i></p>
<p>В качестве паруса, давайте возьмём обычную кухонную фольгу и примерно посчитаем на сколько это «мощно»:</p>
<p><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/2w/sb/6a/2wsb6a1h_9lyo5mc_q8t7iszu0o.png" /></p>
<p>1 м<img src="https://habrastorage.org/getpro/habr/formulas/413/68c/5fd/41368c5fd9bea6d1c727710d70bdb587.svg" alt="$^2$" data-tex="inline" /> фольги 11 мкм будет весить 0,0297 кг, умножаем на силу 9*10^-6 = 0,0003 м/с<img src="https://habrastorage.org/getpro/habr/formulas/413/68c/5fd/41368c5fd9bea6d1c727710d70bdb587.svg" alt="$^2$" data-tex="inline" /> = фольга, отражающая солнечный свет, будет ускорятся на 0,3 миллиметра в секунду за секунду. При массе паруса 1 кг (33,7 кв.м) и ускорении с 8000 м/с до 8000,0003 м/с парус получит 2,4 Джоуля за секунду (эффективность имеет зависимость от соотношения массы паруса и общей массой всей системы, но при массе паруса больше 10% от общей массы, отличие будет небольшое).</p>
<div class="spoiler" role="button" tabindex="0"><b class="spoiler_title">Немного печали</b>
<div class="spoiler_text"><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/qm/98/8w/qm988w1tohme5g3i9skivmzl78q.png" /><br /></div>
</div>
<br />
1 кг кухонной фольги производит 2,4 Дж*с, а чтобы отправить на Луну 1 кг нужно ~64 000 000 Дж, столько импульса парус произведёт за ~10 месяцев (308 дней), но это при идеальном направлении паруса, когда свет отражается на 180 градусов и парус получает двойной импульс света (поглощение+отражение), а освещённая площадь паруса максимальна, под углом 40-50 градусов, КПД паруса упадёт до ~33%, но изменение угла отражения имеет и свои плюсы, главный из которых — это возможность ставить паруса друг за другом (вдоль дороги, а не поперёк).
<p><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/fu/wm/vk/fuwmvk16rtegkeekadjhseoow3k.png" /></p>
<p>С точки зрения «энергии» (в кавычках — потому что энергия и импульс разные вещи), нас интересует только ускорение вперёд — по направлению движения, потому что ускорение с 8 000 м/с до 8 000,0003 м/с вперёд — это 2,4 джоуля, а ускорение с 0 до 0,0003 м/с вправо — это ноль целых, хрен десятых джоулей, и поэтому под углом 40 градусов мы получим всего 98,5 «Ньютон», а если бы мы отражали свет на 180 градусов, то мы бы получили 2 раза по 100 «Ньютон», и ещё бы увеличилась площадь зеркала в 1,55 раза и мы могли бы получили 2 раза по 155 «Ньютон» = 310, против 98,5 = КПД ~32%.</p>
<p>Таким образом, ускорение будет в ~3 раза меньше чем было при 100% КПД = понадобится в 3 раза больше времени и 1 кг кухонной фольги сможет отправлять на Луну 1 кг каждые ~2,75 года – негусто, ионные двигатели будут в 10-20 раз мощнее (быстрее создают импульс), но они требуют рабочее тело и электричество, поэтому с учётом простоты конструкции, отсутствие рабочего тела и практически бесконечным сроком службы всё же солнечный парус неплохой вариант. К тому же, чтобы отправить 1 кг на Луну с помощью ракеты требуется ~47 кг «топлива» и тогда 1 кг кухонной фольги будет экономить 1 кг «топлива» за 3 недели. По-моему весьма ни плохо для кухонной фольги, а экспериментальный солнечный парус IKAROS, запущенный в 2010 году, имел плёнку в 2 раза менее плотную, чем алюминий и был в 1,5 раза тоньше = в 3 раза мощнее.</p>
<p>Существует ещё несколько способов бестопливного ускорения на орбите Земли, можно отталкиваться от магнитного поля Земли, но хотя вся дорога и состоит из магнитов, само магнитное поле Земли очень слабое, а 2 магнита суммируются по самому слабому магниту и если вы не магнит, то вам совершенно плевать какая сила у неодимового магнита — человек с магнитами не взаимодействует, вернее магнит может намагнитить человека и взаимодействовать уже с намагниченным человеком (МРТ), но Земля это совершенно не то, чьё магнитное поле могут увеличить 600 тонн магнитов и её магнитное поле в сто тысяч раз слабее поля неодимового магнита, вернее сила магнита всё же имеет значение — чем сильнее магнит, тем дальше «распространяется» его поле, но гораздо большее значение имеет форма самого магнита, для взаимодействия с Землёй нужны длинные магниты с длинными полюсами, а для магнитной левитации нужны максимально плоские магниты с плоскими полюсами и тогда бОльшая часть плотности магнитного поля будет сконцентрирована в нескольких миллиметрах от магнита. В общем, магниты для левитации не эффективны для взаимодействия с Землёй, к тому же, чтобы получать стабильное ускорение в одну сторону, придётся либо вращать сами магниты на дороге, либо дорогу целиком — что достаточно проблематично в связи с приливным захватом трамплина. Можно конечно использовать и обычные провода под напряжением, но провода имеют сопротивление и будут «сжигать» кучу энергии, либо нужны сверхпроводники… В общем это в любом случае потребует отдельную «конструкцию» с весьма сомнительным КПД, солнечные панели на МКС дают 29 Ватт и при 100% КПД преобразования мы бы получили 29 Дж*секунду с 1 кг солнечных панелей, против ~0,8 джоулей с килограмма кухонной фольги.</p>
<p>Гораздо более интересный способ ускорения — это использование приливных сил, если что-то на орбите вращается вокруг своей оси быстрее, чем оно делает оборот вокруг Земли, то его вращение замедляется, а высота орбиты увеличивается и наоборот, если что то вращается медленнее, то высота орбиты уменьшается а скорость вращения увеличивается (приливной захват), но тут тоже понадобится отдельная конструкция достаточно большой массы. Вообще, приливные силы это достаточно большая тема и подробно рассмотрим мы их в другой раз, а пока самое главное, что при разнице высот 640 км (полукруглая дорога) приливные силы на краях составят 0,76 м/с<img src="https://habrastorage.org/getpro/habr/formulas/413/68c/5fd/41368c5fd9bea6d1c727710d70bdb587.svg" alt="$^2$" data-tex="inline" /> и их легко выдержит обычный крановый трос, ну не то чтобы прям совсем легко, масса стальных тросов составит половину от общей массы дороги, но главное что ничего невозможного там нет, при этом приливные силы дают и огромные возможности по стабилизации и поглощении колебаний.</p>
<p>В общем, главное — аккумулятор может работать в режиме ускорителя с 0 в одну сторону, даже если посылок «сверху» не ожидается и он может стать первым орбитальным сооружением для начала колонизации Луны и других планет.</p>
<h2><span>▍ Маневрирование солнечным парусом</span></h2>
<br />
С точки зрения манёвров, вам могло показаться, что боковой солнечный ветер будет постоянно толкать парус в одну и ту же сторону и постоянно смещать наклон орбиты, но это не совсем так. Двигаясь по орбите (близкой к круглой), гравитация всегда меняет все импульсы на полностью противоположные за пол-оборота, например: если бы на одной стороне планеты мы двигались вперёд со скоростью 8 км/с, солнечный ветер дул бы нам в спину и ускорял по направлению движения, то на другой стороне орбиты, мы бы двигались на встречу ветру и Солнце бы нас тормозило — и это происходит во всех 3-х измерениях. Для наглядности давайте возьмём большую орбиту с большим мгновенным толчком «влево»:
<p><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/b8/gk/o3/b8gko3h12zikxwlb4gflk6t5wrw.png" /></p>
<p>И примерно то же самое происходит и при ускорении вниз:</p>
<p><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/du/vr/15/duvr15fmuc0mmdj6upqkfwn6znm.png" /></p>
<p>Вертикальное ускорение важно с точки зрения отправки груза, потому что при выбросе груза вверх, аккумулятор будет получать вертикальную «отдачу» направленную вниз, но это не является проблемой, потому что запускать грузы можно на противоположных точках орбиты (днём и ночью), а само вертикальное ускорение является именно ускорением, оно увеличивает общую энергию орбиты и от ускорения вниз — нельзя «упасть» с орбиты (вернее есть допустимый диапазон, запуск ~1% от общей массы аккумулятора, причём этот диапазон обновляется уже через четверть оборота вокруг Земли = ~24 минуты), «упасть» с орбиты можно только от потери импульса и эти потери будут равны импульсу, который забрал груз при отправке его на Луну (ускорение до ~11,2 км/с), а при приёме груза с Луны импульс будет увеличиваться (торможение с ~11,2 км/с)(КПД передачи импульса магнитами больше 99,99%). С наклоном, траекториями и временем полёта разберёмся чуть позднее, а пока ограничимся лишь тем фактом, что полёт на Луну по самой неудобной траектории отличается от идеальной на 340 м/с — когда при подлёте к Луне вы двигаетесь 170 м/с на неё, а она двигается 1 км/с на вас (при идеальной траектории — вы двигаетесь в одном направлении), в «ракетном эквиваленте» — это сжечь 10% массы. Причём, из-за эффекта Оберта, скорость «удара об поверхность» Луны составит 2680 м/с при ужасной траектории и 2516 м/с при идеальной (разница 166 м/с).</p>
<p>Итак, вернёмся к «паразитной» боковой тяге, в первые 45 минут она будет создавать ускорение в одну сторону — «вправо», а следующие 45 минут на противоположной стороне орбиты она будет ускорять в другую сторону — «влево» = среднее ускорение может быть нулевым, наклон орбиты конечно будет немного «ходить туда/сюда», но за 45 минут суммарное ускорение будет меньше 1 миллиметра в секунду и это крайне маленькой диапазон.</p>
<p>Но… суммарное боковое ускорение может и не быть нулевым, как вы возможно заметили по картинке с парусом, при отражении света под углом 40 градусов, возникает «отрицательная» боковая тяга 17,3 «Ньютон», которая вычитается из тяги, возникающей при поглощении света, 100 «Ньютон» = 82,7 «Ньютон», но если отражать свет под углом 50 градусов, то эти 17,3 «Ньютон» будут добавляться к 100 = 117,3 «Ньютон» (соотношение с тягой вперёд при этом не изменится и составит те же 98,5 к 17,3»), к тому же при угле 50 градусов на 19% увеличится и площадь паруса, и в абсолютном выражении боковая тяга составит уже 139 «Ньютон» на 56,3 «Ньютон» больше, чем под углом 40 градусов. И таким образом, парус может создавать положительное боковое ускорение и менять наклон орбиты в любую сторону, либо просто держать орбиту и компенсировать внешние воздействия.</p>
<p>К слову, МКС для удержания своей орбиты тратит ~50 м/с скорости («сжигает» 1% своей массы) в год! Возмущения орбиты — это крайне маленькие энергии даже по ракетным меркам, при этом большинство воздействий периодические и в сумме по энергии дают ноль, например, сегодня Луна тянет в одну сторону, а через 14 дней в противоположную, и так же будет влиять магнитное поле Земли и неоднородность поверхности, с ними даже не обязательно бороться, просто орбита будет медленно смещаться в течение многих лет, а разница в траекториях при полёте на Луну достаточно маленькая (на 180 градусов орбиту и за миллион лет не развернёт). Хотя парус и сможет удерживать орбиту близкой к идеальной, но за это придётся платить поворотами паруса = уменьшение тяги вперёд = упущенная выгода, поэтому можно и не держать идеальную орбиту, а с точки зрения «стыковки», значение имеет не сама орбита, а предсказуемость этой орбиты и точные координаты дороги в конкретный момент времени. При нахождении дороги на полярной орбите попасть на неё можно будет практически из любой точки планеты, 1 раз в сутки она будет пролетать рядом с вами максимум в 1250 километрах или 125 км 1 раз за 10 суток (зависит от широты и периода).</p>
<p>Чтобы попасть на дорогу (высота 400 км) нужно «прыгнуть» вверх со скоростью 1,7 км/с (~2,2 км/с с учётом гравитационных потерь для ракеты), а весь полёт до дороги будет длиться около 5 минут, и за это время никакие воздействия не сдвинут дорогу даже на миллиметр (даже если Солнце внезапно исчезнет, то дорога за 5 минут сместится на несколько нанометров). Если разгоняться с помощью ракеты, то при прошлых параметрах одиночного груза = 100 кг (количество грузов ~ 400 в секунду, максимальная общая масса грузов ~2% от массы аккумулятора при отправке в одну сторону или ~200 миллионов тонн в месяц при одновременном потоке в 2 стороны по 2 полосам, одна ускоряет = другая тормозит), при удельном импульсе 3,5 км/с общая масса ракеты составит 190 кг (из них 100 кг груз) и такие маленькие ракеты можно запускать с воздушных шаров на высоте 30-40 километров.</p>
<p><img src="https://habrastorage.org/r/w780q1/webt/dj/kr/og/djkrogvje2wl6rd2de7xzsxgics.jpeg" data-src="https://habrastorage.org/webt/dj/kr/og/djkrogvje2wl6rd2de7xzsxgics.jpeg" data-blurred="true" /><br />
<i><span><a href="https://ru.wikipedia.org/wiki/Red_Bull_Stratos">Прыжок человека из стратосферы, рекорд высоты 41,4 км (Алан Юстас)</a></span></i></p>
<p>На высоте 30 км давление атмосферы уже в 80 раз меньше чем на поверхности =98,75% атмосферы находится внизу, а чем меньше атмосферы — тем меньше воздействий способных отклонить траекторию полёта = более точное баллистическое попадание = меньше расходов на манёвры. К тому же для такого маленького ускорения не обязательно использовать ракеты с высоким удельным импульсом. При уменьшении удельного импульса понадобится больше топлива (при УИ 2 км/с понадобится 200 кг топлива, на 100 кг груза), но топливо у ракеты почти ничего не стоит, основную цену составляют двигатели ракеты, а чем выше УИ, тем сложнее двигатель и тем меньше вариантов топливных пар и наоборот, с УИ 2 км/с можно сжигать практически всё что угодно, удельный импульс зависит от энергии сгорания топлива и удельный импульс в 2 раза меньше означает, что при сгорании выделяется в 4 раза меньше энергии и если сравнить с метан+кислород= УИ 3,5 км/с, то для УИ 2 км/с энергия сгорания должна быть в 3 раза меньше, а в 3 раза «хуже» метана горят дрова — до 2,2 км/с можно разогнаться вообще на всём что хоть как-то горит, хоть на дровах, хоть на перекиси водорода, хоть на закиси азота. Ракетные двигатели с низким удельным импульсом гораздо проще, например, перекись водорода — это вообще монотопливо и его не нужно ни с чем смешивать = не нужны насосы, хранится при комнатной температуре, а купить можно в ближайшей аптеке. Первая ступень ракеты Falcon 9 разгоняется до ~4 км/с и тормозит потом тоже с ~4 км/с, а чем меньше скорость, тем меньше тормозить и тем меньше температура при торможении об атмосферу, при скорости 1,7 км/с можно вообще полностью затормозить об атмосферу и приземлиться на парашюте. Поэтому хоть для запуска и понадобится ракета, но это будет далеко не та ракета, которая выводит спутники на орбиту и тут дело не столько в массе, сколько в простоте суборбитальных ракет.</p>
<h2><span>▍ Безопасность</span></h2>
<blockquote><i>Что если в аккумулятор попадёт космический мусор?</i></blockquote>
Если в аккумулятор попадёт даже Челябинский метеорит, то будет примерно то же самое что если бы Челябинский метеорит упал на дорогу от Москвы до Питера (700 км) — придётся ремонтировать пару сотен метров дороги. Даже если бы дорога могла развалиться на 2 части, то ни одна из этих частей не «упала» бы на Землю, и в теории, они бы начали летать на разных орбитах и однажды они бы обязательно оказались рядом и их можно было бы «поймать» и опять соединить. Но дорога не может развалиться на несколько частей, потому что основную конструктивную нагрузку будут создавать приливные силы и сцепление дороги должно быть не горизонтальное (первый километр сцеплен со вторым километром), а вертикальное (первый/нижний километр привязан к последнему/верхнему) и конструктивно дорога будет похожа на подвесной мост (нижняя часть «висит» на верхней), а образование «дыры» в дороге, на конструкцию целиком повлияет очень слабо.<br />
<blockquote><i>А что если магниты внезапно сломаются и поезд коснётся дороги на скорости 8 000 м/с?</i></blockquote>
Поезд не обязательно должен «ехать» по дороге сверху, поезд с таким же успехом может «цепляться» к дороге снизу, как на канатных дорогах.
<p><img src="https://habrastorage.org/r/w780q1/webt/14/cj/yz/14cjyz2uygudr_demi5c5ccn8kk.jpeg" data-src="https://habrastorage.org/webt/14/cj/yz/14cjyz2uygudr_demi5c5ccn8kk.jpeg" data-blurred="true" /></p>
<p>При таком устройстве, если что-то пойдёт не так — груз может просто отцепиться от крепления, он начнёт отдаляться от дороги и сам груз в столкновении участвовать не будет и в теории, он может даже не пострадать. Тоже самое нужно будет сделать и всем последующим грузам, находящимся на дороге в данный момент, и поэтому, ситуации когда сотни машин влетают друг в друга на скорости 28 000 км/ч возникнуть не может, более того, большая часть осколков от столкновения тоже будет вылетать снизу и общие разрушения будут весьма локальны, и придётся ремонтировать пару сотен метров.</p>
<p>В общем, глобально, дорога очень устойчива к разрушениям.</p>
<h2><span>▍ Экономика</span></h2>
<br />
Масса магнитов у маленького грузового трамплина 600 тонн (грузы по 100 кг), с учётом кухонной фольги и стальных тросов общая масса будет около 2 000 тонн. При сегодняшних ценах (62 млн. USD за 22,8 тонны на Falcon 9 = 87 запусков) цена вывода на орбиту такой массы будет ~5,2 млрд USD — вообще копейки (при Лунной программе 60-х годов США потратили ~400 млрд в сегодняшних ценах). Конечно сама орбитальная сборка тоже будет стоить денег и даже скорее всего в десятки раз дороже, чем просто вывод такой массы на орбиту, но главное — ничего невозможного здесь нет. Даже если строительство в сумме будет стоить как Лунная программа США 60-х годов, то сегодня такими ресурсами обладают даже некоторые миллиардеры. А ещё сегодня есть УзбекКосмос.
<p><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/i4/yp/0c/i4yp0cmpywl2bgjqifopb5efcva.png" /><br />
<i><span>Узбеккосмос: <a href="https://uzspace.uz/oz">официальный сайт</a></span></i></p>
<p>При этом, после постройки такого трамплина на Луну можно будет отравлять миллиард тонн в год (длина трамплина на орбите Луны составит всего 22,5 километра).</p>
<h2><span>▍ Сравнение с другими «ускорителями»</span></h2>
<br />
Одним из самых энергоэффективных сооружений для выхода на орбиту является космический лифт. И если проигнорировать то, что космический лифт требует фантастической удельной прочности (трос длиной ~35 000 километров должен выдерживать прежде всего собственный вес) и при текущих технологиях лифт невозможен (вернее он возможен из любых материалов, но при удельной прочности стали — масса троса будет больше массы видимой вселенной), тогда космический лифт…
<p><i>Продолжение следует</i>…</p>
<p>Постараюсь дописать следующую часть в течение недели.</p>
<p><a href="https://habr.com/ru/post/593363/">Прошлая часть статьи</a></p>
<p><a href="https://ruvds.com/ru-rub/news/read/151?utm_source=habr&utm_medium=article&utm_campaign=%D0%90%D0%92%D0%A2%D0%9E%D0%A0&utm_content=%D0%A2%D0%95%D0%9C%D0%90"><img src="https://habrastorage.org/r/w780q1/webt/kg/hq/9z/kghq9za934md5ceo14bxovinlgy.jpeg" data-src="https://habrastorage.org/webt/kg/hq/9z/kghq9za934md5ceo14bxovinlgy.jpeg" data-blurred="true" /></a></p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-70359163402666421952021-12-12T20:36:00.001+03:002021-12-12T20:36:37.223+03:00Исследователи безопасности предупреждают о мине замедленного действия из 300 тыс. маршрутизаторов MikroTik<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/f4e/bb6/9d2/f4ebb69d2d094eea1aaef0d57211c534.jpg" width="976" height="636" data-src="https://habrastorage.org/getpro/habr/upload_files/f4e/bb6/9d2/f4ebb69d2d094eea1aaef0d57211c534.jpg" data-blurred="true" /></figure>
<p>Несколько сотен тысяч роутеров латвийской компании MikroTik уязвимы для удаленных атак. Уязвимости могут включать устройства в ботнеты, которые крадут данные пользователей и проводят DDoS-атаки.</p>
<p>Эксперты из компании Eclypsium <a href="https://eclypsium.com/2021/12/09/when-honey-bees-become-murder-hornets/" rel="noopener noreferrer nofollow">обнаружили 300 000 роутеров,</a> подверженных уязвимостям CVE-2018-14847, CVE-2019-3977 и CVE-2019-3978 высокой степени опасности. Они отмечают, что, хотя производитель выпустил исправления, значительная часть пользователей еще не установила их.</p>
<p>«Учитывая проблемы обновления MikroTik, существует огромное количество устройств 2018 и 2019 годов выпуска, подверженных уязвимостям, — написали исследователи Eclypsium в блоге. — В совокупности это дает злоумышленникам множество возможностей получить полный контроль над мощными устройствами для проведения атак».</p>
<p>В начале 2018 года «Лаборатория Касперского» заявила, что вредоносное ПО Slingshot, которое оставалось незамеченным в течение шести лет, первоначально распространялось через маршрутизаторы MikroTik. ПО загружало вредоносные файлы с уязвимых роутеров, используя Winbox — служебную программу настройки MikroTik. Несколько месяцев спустя исследователи из компании Trustwave обнаружили две вредоносные кампании, связанные с роутерами MikroTik. В том же 2018 году китайская компания Netlab 360 сообщила, что тысячи маршрутизаторов MikroTik были включены в ботнет вредоносным ПО, эксплуатирующим уязвимость CVE-2018-14847.</span></p>
<p>Eclypsium выпустила инструмент, с помощью которого пользователи могут определить, уязвим и их роутер MikroTik или, возможно, уже заражен. Компания напоминает, что лучший способ защитить устройство — установить последнюю версию прошивки.</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-89507491735454953772021-12-12T19:36:00.001+03:002021-12-12T19:36:04.971+03:00Закат эпохи алгоритма MD5?<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/113/080/d66/113080d661452e390cacb3f79802bd07.jpg" width="640" height="480" data-src="https://habrastorage.org/getpro/habr/upload_files/113/080/d66/113080d661452e390cacb3f79802bd07.jpg" data-blurred="true" /></figure>
<h2>Вспомним про хеш</h2>
<p><a href="https://ru.wikipedia.org/wiki/%D0%A5%D0%B5%D1%88-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F" rel="noopener noreferrer nofollow">Хеш-функция</a> — функция, осуществляющая преобразование массива входных данных произвольной длины в выходную битовую строку установленной длины, выполняемое определенным алгоритмом. Преобразование, производимое хеш-функцией, называется хешированием. Результат преобразования называется <strong>хешем</strong>.</p>
<p>Хеш-функции применяются в следующих случаях:</p>
<ul readability="7.9009523809524">
<li readability="-0.40277777777778">
<p>При построении <a href="https://ru.wikipedia.org/wiki/%D0%90%D1%81%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2" rel="noopener noreferrer nofollow">ассоциативных массивов</a>.</p>
</li>
<li readability="0">
<p>При поиске дубликатов в последовательностях наборов данных.</p>
</li>
<li readability="0">
<p>При построении уникальных идентификаторов для наборов данных.</p>
</li>
<li readability="1.7383966244726">
<p>При вычислении <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%83%D0%BC%D0%BC%D0%B0" rel="noopener noreferrer nofollow">контрольных сумм</a> от данных для последующего обнаружения в них ошибок, возникающих при хранении и передаче данных.</p>
</li>
<li readability="3">
<p>При сохранении паролей в системах защиты в виде хеш-кода (для восстановления пароля по хеш-коду требуется функция, являющаяся обратной по отношению к использованной хеш-функции).</p>
</li>
<li readability="1">
<p>При выработке электронной подписи (на практике часто подписывается не само сообщение, а его хеш-образ).</p>
</li>
</ul>
<details class="spoiler" readability="6.5">
<summary>Контрольная сумма</summary>
<div class="spoiler__content" readability="43">
<p>С точки зрения математики, контрольная сумма является результатом хеш-функции, используемой для вычисления <em>контрольного кода</em> — небольшого количества бит внутри большого блока данных, например, сетевого пакета или блока компьютерного файла, применяемого для обнаружения ошибок при передаче или хранении информации. Значение контрольной суммы добавляется в конец блока данных непосредственно перед началом передачи или записи данных на какой-либо носитель информации. Впоследствии оно проверяется для подтверждения целостности данных. Популярность использования контрольных сумм для проверки целостности данных обусловлена тем, что подобная проверка просто реализуема в двоичном цифровом оборудовании, легко анализируется и хорошо подходит для обнаружения общих ошибок, вызванных наличием шума в каналах передачи данных.</p>
</div>
</details>
<p><strong>MD5</strong> — алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института в 1991 году. Предназначен для создания контрольных сумм или «отпечатков» сообщения произвольной длины и последующей проверки их подлинности. Алгоритм MD5 основан на алгоритме MD4.</p>
<h2>Как работает протокол?</h2>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/853/c96/d65/853c96d658e0174d76452b48c854075e.jpg" width="600" height="400" data-src="https://habrastorage.org/getpro/habr/upload_files/853/c96/d65/853c96d658e0174d76452b48c854075e.jpg" data-blurred="true" /></figure>
<p><a href="https://www.internet-technologies.ru/articles/newbie/heshirovanie-i-rasshifrovka-md5-hesh-koda.html" rel="noopener noreferrer nofollow">Утилита md5sum</a>, предназначенная для хеширования данных заданного файла по алгоритму MD5, возвращает строку. Она состоит из 32 цифр в шестнадцатеричной системе счисления (<em>016f8e458c8f89ef75fa7a78265a0025</em>).</p>
<p>То есть хеш, полученный от функции, работа которой основана на этом алгоритме, выдает строку в 16 байт (128) бит. И эта строка включает в себя 16 шестнадцатеричных чисел. При этом изменение хотя бы одного ее символа приведет к последующему бесповоротному изменению значений всех остальных битов строки.</p>
<p> В <a href="https://habr.com/ru/post/534038/" rel="noopener noreferrer nofollow">данном алгоритме</a> предполагается наличие 5 шагов, а именно:</p>
<ol readability="2">
<li readability="-1">
<p>Выравнивание потока</p>
</li>
<li readability="-1">
<p>Добавление длины сообщения</p>
</li>
<li readability="-1">
<p>Инициализация буфера</p>
</li>
<li readability="-1">
<p>Вычисление в цикле</p>
</li>
<li readability="-1">
<p>Результат вычислений</p>
</li>
</ol>
<p><em>На первом шаге</em> “Выравнивание потока” сначала дописывают единичный бит в конец потока, затем необходимое число нулевых бит. Входные данные выравниваются так, чтобы их новый размер был сравним с 448 по модулю 512. Выравнивание происходит, даже если длина уже сравнима с 448.</p>
<p><em>На втором шаге</em> в оставшиеся 64 бита дописывают 64-битное представление длины данных до выравнивания. Сначала записывают младшие 4 байта. Если длина превосходит <img class="formula inline" source="2^{64}-1," alt="2^{64}-1," src="https://habrastorage.org/getpro/habr/upload_files/fbe/4d1/eee/fbe4d1eee033e7c9b67c1e9a64269765.svg" /> то дописывают только младшие биты. После этого длина потока станет кратной 512. Вычисления будут основываться на представлении этого потока данных в виде массива слов по 512 бит.</p>
<p><em>На третьем</em> для вычислений используются четыре переменные размером 32 бита и задаются начальные значения в 16-ричном виде. В этих переменных будут храниться результаты промежуточных вычислений.</p>
<p>Во время <em>4-го шага</em> “Вычисление в цикле” происходит 4 раунда, в которых сохраняются значения, оставшиеся после операций над предыдущими блоками. После всех операций суммируются результаты двух последних циклов. Раундов в MD5 стало 4 вместо 3 в MD4. Добавилась новая константа для того, чтобы свести к минимуму влияние входного сообщения. В каждом раунде на каждом шаге и каждый раз константа разная. Она суммируется с результатом и блоком данных. Результат каждого шага складывается с результатом предыдущего шага. Из-за этого происходит более быстрое изменение результата. Изменился порядок работы с входными словами в раундах 2 и 3.</p>
<p>В итоге <em>на 5-ом шаге</em> мы получим результат вычислений, который находится в буфере <img class="formula inline" source="-" alt="-" src="https://habrastorage.org/getpro/habr/upload_files/4be/dc2/86d/4bedc286d0f436b82205fb49fed0e1bf.svg" />это и есть хеш. Если выводить побайтово, начиная с младшего байта первой переменной и закончив старшим байтом последней, то мы получим MD5-хеш. </p>
<h2>Уязвимости MD5</h2>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/74f/faa/a7e/74ffaaa7e664686d9b826a2b454d700c.jpg" width="800" height="400" data-src="https://habrastorage.org/getpro/habr/upload_files/74f/faa/a7e/74ffaaa7e664686d9b826a2b454d700c.jpg" data-blurred="true" /></figure>
<p>Алгоритм MD5 уязвим к некоторым атакам. Например, возможно создание двух сообщений с одинаковой хеш-суммой, поэтому его использование не рекомендуется в проектах.</p>
<p>На данный момент существуют несколько видов <em>взлома хешей</em> MD5 — подбора сообщения с заданным хешем:</p>
<p>При этом методы перебора по словарю и brute-force могут использоваться для взлома хеша других хеш-функций (с небольшими изменениями алгоритма). RainbowCrack требует предварительной подготовки радужных таблиц, которые создаются для заранее определённой хеш-функции. Поиск коллизий специфичен для каждого алгоритма. Рассмотрим каждый вид «взлома» по отдельности.</p>
<h3>Атаки переборного типа</h3>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" height="788" data-src="https://habrastorage.org/getpro/habr/upload_files/6f8/de9/581/6f8de95813b5a58b14664635d1d98808.png" data-width="1446" /></figure>
<p>В криптографии <em>атака полного перебора</em> или исчерпывающий поиск ключей <img class="formula inline" source="-" alt="-" src="https://habrastorage.org/getpro/habr/upload_files/f3f/0ee/039/f3f0ee039d9f24dff3b941168650cb3c.svg" />это стратегия, которая теоретически может быть использована против любых зашифрованных данных. Злоумышленник, который не может воспользоваться слабостью в системе шифрования, реализовывает атаку подобного типа. Она включает в себя систематическую проверку всех возможных ключей, пока не будет найден правильный. В худшем случае для взлома сообщения потребуется задействовать всю вычислительную мощность. </p>
<p><em>Перебор по словарю</em> — атака на систему защиты, применяющая метод полного перебора предполагаемых паролей, используемых для аутентификации, осуществляемого путём последовательного пересмотра всех слов (паролей в чистом виде) определённого вида и длины из словаря с целью последующего взлома системы и получения доступа к секретной информации.</p>
<p>Как видно из определения, атаки по словарю являются атаками полного перебора. Единственное отличие состоит в том, что данные атаки обычно более эффективны так как становится не нужным перебирать все комбинации символов, чтобы добиться успеха. Злоумышленники используют обширные списки наиболее часто используемых паролей таких как, имена домашних животных, вымышленных персонажей или конкретно характерных слов из словаря – отсюда и название атаки. Однако если пароль действительно уникален (не является комбинацией слов), атака по словарю не сработает. В этом случае использование атаки полного перебора <img class="formula inline" source="-" alt="-" src="https://habrastorage.org/getpro/habr/upload_files/7b8/8c3/3a6/7b88c33a60dc9f76d82840f3ae67ca3b.svg" />единственный вариант.</p>
<p>Для полного перебора или перебора по словарю можно использовать программы PasswordsPro, MD5BFCPF, John the Ripper. Для перебора по словарю существуют <a href="http://cryptowiki.net/index.php?title=MD5" rel="noopener noreferrer nofollow">готовые словари</a>.</p>
<h3>RainbowCrack</h3>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/115/df3/986/115df398634f68a254b5ac8b52f524c7.jpg" width="1000" height="350" data-src="https://habrastorage.org/getpro/habr/upload_files/115/df3/986/115df398634f68a254b5ac8b52f524c7.jpg" data-blurred="true" /></figure>
<p>Это ещё один метод взлома хеша. Он основан на генерировании большого количества хешей из набора символов, чтобы по получившейся базе вести поиск заданного хеша.</p>
<p><em>Радужные таблицы</em> состоят из хеш-цепочек и более эффективны, чем предыдущий упомянутый тип атак, поскольку они оптимизируют требования к хранению, хотя поиск выполняется немного медленнее. Радужные таблицы отличаются от хеш-таблиц тем, что они создаются с использованием как хеш-функций, так и функций редукции.</p>
<p>Цепочки хешей — метод для уменьшения требования к объёму памяти. Главная идея — определение функции редукции <em>R</em>, которая сопоставляет значениям хеша значения из таблицы. Стоит отметить, что <em>R</em> не является обращением хеш-функции.</p>
<p>Радужные таблицы являются развитием идеи таблицы хеш-цепочек. Функции редукции применяются по очереди, перемежаясь с функцией хеширования.</p>
<p>Использование последовательностей функций редукции изменяет способ поиска по таблице. Поскольку хеш может быть найден в любом месте цепочки, необходимо сгенерировать несколько различных цепочек.</p>
<p>Существует множество систем взлома паролей и веб-сайтов, которые используют подобные таблицы. Основная идея данного метода — достижение компромисса между временем поиска по таблице и занимаемой памятью. Конечно, использование радужных таблиц не гарантирует 100% успеха взлома систем паролей. Но чем больше набор символов, используемый для создания радужной таблицы, и чем продолжительнее хеш-цепочки, тем больше будет шансов получить доступ к базе данных исходных паролей.</p>
<h3>Коллизии MD5</h3>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/2e5/232/c8c/2e5232c8c46cd39402dff75cb88abf04.jpg" width="1024" height="768" data-src="https://habrastorage.org/getpro/habr/upload_files/2e5/232/c8c/2e5232c8c46cd39402dff75cb88abf04.jpg" data-blurred="true" /></figure>
<p><em>Коллизия хеш-функции</em> — это получение одинакового значения функции для разных сообщений и идентичного начального буфера. В отличие от коллизий, псевдоколлизии определяются как равные значения хеша для разных значений начального буфера, причём сами сообщения могут совпадать или отличаться. В 1996 году Ганс Доббертин нашёл псевдоколлизии в MD5, используя определённые инициализирующие векторы, отличные от стандартных. Оказалось, что можно для известного сообщения построить второе такое, что оно будет иметь такой же хеш, как и исходное. С точки зрения математики, это означает следующее:</p>
<img class="formula" source="MD5(I_V, L_1) = MD5(I_V, L_2)," alt="MD5(I_V, L_1) = MD5(I_V, L_2)," src="https://habrastorage.org/getpro/habr/upload_files/775/57e/7da/77557e7dafdd3ec7bd7c9fe0e4a919f4.svg" width="259" height="22" />
<p>где <img class="formula inline" source="I_V" alt="I_V" src="https://habrastorage.org/getpro/habr/upload_files/a90/829/480/a90829480dae064e22ab1e3cc64837a6.svg" />— начальное значение буфера, а <img class="formula inline" source="L_1" alt="L_1" src="https://habrastorage.org/getpro/habr/upload_files/e4d/cda/912/e4dcda9121515f1bf437d9f07fbe3f65.svg" />и <img class="formula inline" source="L_2" alt="L_2" src="https://habrastorage.org/getpro/habr/upload_files/315/69e/5a5/31569e5a5f7124ab1fdcfe3ca08156ee.svg" />— различные сообщения.</p>
<p>MD5 был тщательно изучен криптографическим сообществом с момента его первоначального выпуска и до 2004 года демонстрировал лишь незначительные недостатки. Однако летом 2004 года криптографы Ван Сяоюнь и Фэн Дэнго продемонстрировали алгоритм способный генерировать MD5-коллизии с использованием стандартного <em>вектора инициализации</em>.</p>
<p>Позже данный алгоритм был усовершенствован, как следствие время поиска пары сообщений значительно уменьшилось, что позволило находить коллизии с приемлемой вычислительной сложностью. Как оказалось, в MD5 вопрос коллизий не решается.</p>
<h2>Безопасное использование MD5</h2>
<p>MD5 – до сих пор является одним из самых распространенных способов защитить информацию в сфере прикладных исследований, а также в области разработки веб-приложений. Хеш необходимо обезопасить от всевозможных хакерских атак.</p>
<h3>Информационная энтропия</h3>
<figure class=""><img src="https://habr.com/img/image-loader.svg" alt="Энтропия" title="Энтропия" height="82" data-src="https://habrastorage.org/getpro/habr/upload_files/f92/68a/d7b/f9268ad7b996434bc503dc39c700adec.png" data-width="319" />
<figcaption>Энтропия</figcaption>
</figure>
<p>Надежность и сложность пароля в сфере информационных технологий обычно измеряется в терминах теории информации. Чем выше <em>информационная энтропия</em>, тем надежнее пароль и, следовательно, тем труднее его взломать.</p>
<p>Чем длиннее пароль и чем больше набор символов, из которого он получен, тем он надежнее. Правда вместо количества попыток, которые необходимо предпринять для угадывания пароля, принято вычислять логарифм по основанию 2 от этого числа, и полученное значение называется количеством «битов энтропии» в пароле. При увеличении длины пароля на один бит количество возможных паролей удвоится, что сделает задачу атакующего в два раза сложнее. В среднем, атакующий должен будет проверить половину из всех возможных паролей до того, как найдет правильный. В качестве наилучшей практики должно выполняться предварительное требование: приложение настаивает на том, чтобы пользователь использовал надежный пароль в процессе регистрации.</p>
<h3>Добавление “соли” к паролю</h3>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/f08/224/e3f/f08224e3fb144cef94aa50a58910d446.jpeg" width="585" height="351" data-src="https://habrastorage.org/getpro/habr/upload_files/f08/224/e3f/f08224e3fb144cef94aa50a58910d446.jpeg" data-blurred="true" /></figure>
<p>Одна из наиболее распространенных причин успешных атак заключается в том, что компании не используют <em>добавление соли к исходному паролю</em>. Это значительно облегчает хакерам взлом системы с помощью атак типа радужных таблиц, особенно учитывая тот факт, что многие пользователи используют очень распространенные, простые пароли, имеющие одинаковые хеши.</p>
<p><strong>Соль</strong><img class="formula inline" source="-" alt="-" src="https://habrastorage.org/getpro/habr/upload_files/be2/f4f/213/be2f4f2132b470ee1f7bc5be361dc91d.svg" />это вторичный фрагмент информации, состоящий из строки символов, которые добавляются к открытому тексту (исходному паролю пользователя), а затем хешируется. <em>Соление</em> делает пароли более устойчивыми к атакам типа радужных таблиц, так как подобный пароль будет иметь более высокую информационную энтропию и, следовательно, менее вероятное существование в предварительно вычисленных радужных таблицах. Как правило, соль должна быть не менее 48 бит. </p>
<h2>Декодирование кода MD5</h2>
<p>Иногда при работе с компьютером или поврежденными базами данных требуется декодировать зашифрованное с помощью MD5 значение хеша.</p>
<p>Удобнее всего использовать специализированные ресурсы, предоставляющие возможность сделать это online:</p>
<ul readability="2.344262295082">
<li readability="0.95121951219512">
<p><a href="http://md5.web-max.ca" rel="noopener noreferrer nofollow">md5.web-max.ca</a> <img class="formula inline" source="-" alt="-" src="https://habrastorage.org/getpro/habr/upload_files/68b/5c6/344/68b5c63444b7b8f23ce7817d1676c33b.svg" />данный сервис обладает простым и понятным интерфейсом. Для получения декодированного значения нужно ввести хеш и заполнить поле проверочной капчи;</p>
</li>
<li readability="-0.69811320754717">
<p><a href="http://md5decrypter.com" rel="noopener noreferrer nofollow">md5decrypter.com</a> <img class="formula inline" source="-" alt="-" src="https://habrastorage.org/getpro/habr/upload_files/10f/68d/c86/10f68dc8666a00db59619d7c72aaa672.svg" />аналогичный сервис;</p>
</li>
<li readability="1.9407407407407">
<p><a href="http://msurf.ru" rel="noopener noreferrer nofollow">msurf.ru</a> <img class="formula inline" source="-" alt="-" src="https://habrastorage.org/getpro/habr/upload_files/9be/094/b51/9be094b516de96baaa2b5eb91eea1c41.svg" />данный ресурс имеет простой русскоязычный интерфейс. Его функционал позволяет не только расшифровывать значения хеш-кодов, но и создавать их.</p>
</li>
</ul>
<figure class=""><img src="https://habr.com/img/image-loader.svg" height="327" data-src="https://habrastorage.org/getpro/habr/upload_files/e13/840/68f/e1384068f70cde7c11293b5a88f32bde.png" data-width="320" /></figure>
<p>Если присмотреться к значениям декодинга, то становится понятно, что процесс расшифровки <em>почти не дает результатов.</em> Эти ресурсы представляют собой одну или несколько объединенных между собой баз данных, в которые занесены расшифровки самых простых слов.</p>
<p>При этом данные декодирования хеша MD5 даже такой распространенной части пароля, как «админ», нашлись лишь в одной базе. Поэтому хеши паролей, состоящих из более сложных и длинных комбинаций символов, практически невозможно расшифровать.</p>
<p>Создание хеша MD5 является односторонним процессом. Поэтому не подразумевает обратного декодирования первоначального значения. </p>
<h2>Заключение</h2>
<p>Как уже отмечалось ранее, основная задача любой функции хеширования сообщений <img class="formula inline" source="-" alt="-" src="https://habrastorage.org/getpro/habr/upload_files/b16/d7f/d64/b16d7fd641e9da774e5b4f7f6c453ec8.svg" />производить образы, которые можно считать относительно случайными. Чтобы считаться криптографически безопасной, хэш-функция должна отвечать двум основным требованиям. Во-первых, злоумышленник не может сгенерировать сообщение, соответствующее определенному хеш-значению. Во-вторых, невозможно создать два сообщения, которые производят одно и то же значение (коллизии в MD5).</p>
<p>К сожалению, выяснилось, что алгоритм MD5 не способен отвечать данным требованиям. <em>IETF</em> (Internet Engineering Task Force) рекомендовала новым проектам протоколов не использовать MD5, так как исследовательские атаки предоставили достаточные основания для исключения использования алгоритма в приложениях, которым требуется устойчивость к различного рода коллизиям.</p>
<p>Хеши MD5 больше не считаются безопасными, и их <strong>не рекомендовано</strong> использовать для криптографической аутентификации.</p>
<p>Спасибо за внимание!</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-41519399959026320002021-12-12T18:36:00.001+03:002021-12-12T18:36:50.093+03:00«Фонд электронных рубежей» призвал пользователей Chrome настороженней отнестись к Manifest v3<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/d44/69e/0cf/d4469e0cf2cfc0f641034102e11085e1.jpg" width="1024" height="512" data-src="https://habrastorage.org/getpro/habr/upload_files/d44/69e/0cf/d4469e0cf2cfc0f641034102e11085e1.jpg" data-blurred="true" /></figure>
<p>«Фонд электронных рубежей» (EFF) считает, что Manifest V3, новая платформа для расширений Google Chrome, только навредит конфиденциальности пользователей и производительности браузера. </p>
<p>Manifest V3 предусматривает множество изменений по сравнению с Manifest V2. Одним из самых серьезных является ограничение использования API webRequest, которое позволяет расширениям перехватывать и блокировать либо перенаправлять сетевые запросы. Вместо него расширения должны будут работать с declarativeNetRequest API, которое отдает эту работу в руки Chrome. <a href="https://www.eff.org/deeplinks/2021/12/chrome-users-beware-manifest-v3-deceitful-and-threatening" rel="noopener noreferrer nofollow">EFF заявляет,</a> что эти изменения — нечестная сделка для пользователей. </p>
<p>«Мы говорили об этом с момента анонса Manifest V3 и продолжаем говорить. Подобно FLoC и Privacy Sandbox, Manifest V3 — еще один пример конфликта интересов, который возник из-за того, что Google контролирует как доминирующий браузер, так и одну из крупнейших рекламных сетей в интернете».</p>
<p>EFF считает, что Manifest V3 ограничит возможности расширений, предназначенных для защиты конфиденциальности пользователей: в соответствии с новыми спецификациями такие расширения, как блокировщики трекеров трафика, перестанут работать. Что касается другого оправдания Chrome для Mv3 — повышения производительности — исследование Принстонского и Чикагского университетов 2020 года показало, что подобные расширения конфиденциальности улучшают производительность браузера, указывают в Фонде.</p>
<p>«Спецификации разработки расширений для браузера могут показаться неважными, но их изменения должны иметь значение для всех. Это еще один шаг к тому, чтобы Google диктовала, как нам жить в интернете».</p>
<p>Некоторые разработчики согласны с представителями EFF. Так, Кшиштоф Модрас из Ghostery, заявил, что Google стоило сделать сервис-воркеров и declarativeNetRequest необязательными, чтобы предоставить решения, подходящие для различных случаев использования. «В конечном счете, речь идет о выборе пользователя», заключил Модрас.</p>
<p>«Почти все расширения браузера в том виде, в каком вы их знаете сегодня, изменятся. Те, кому повезет, будут “только” хуже работать, некоторые выйдут из строя, а некоторые буквально перестанут существовать», — Андрей Мешков, компания AdGuard.</p>
<p>Джорджио Маоне, автор NoScript, назвал Manifest V3 серьезным регрессом с функциональной и технической точки зрения, не приносящим никакой выгоды для пользователей.</p>
<p>Окончательный переход на Manifest V3 завершится в 2023 году. С 17 января 2022 года новые расширения на Manifest V2 больше не будут размещаться в магазине Chrome, а с 2023 года <a href="https://habr.com/ru/news/t/532418/" rel="noopener noreferrer nofollow">перестанут работать.</a></p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com1tag:blogger.com,1999:blog-8624170009513620962.post-35872418171926648562021-12-11T22:36:00.001+03:002021-12-11T22:36:43.725+03:00Венера. Декабрь 2021<p><strong>Неужели мы пришли оттуда</strong></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/53d/947/0a9/53d9470a9f6c7dd54246bd51e67c6395.jpg" width="1920" height="1080" data-src="https://habrastorage.org/getpro/habr/upload_files/53d/947/0a9/53d9470a9f6c7dd54246bd51e67c6395.jpg" data-blurred="true" /></figure>
<p>В середине декабря этого года сложились пожалуй лучшие условия для наблюдений Венеры — ближайшей к Земле планеты — за весь период её вечерней видимости, который начался еще в июне, но был крайне неудовлетворительный. Венера заходила практически одновременно с Солнцем. В северных широтах отыскать её на небе до ноября было сложно. Но сейчас все изменилось. И планету нетрудно заметить в юго-юго-западной части небосвода, относительно невысоко над горизонтом, даже до заката. А уж с наступлением вечерних сумерек Венера блестит буквально ослепительно. И хотя благоприятный период вечерней видимости Венеры продлится недолго — в первых числах января она переметнется на утреннее небо, у нас есть по меньшей мере три недели, чтобы насладиться её красотой. И есть замечательный повод поговорить о Венере, как об астрономическом объекте. С античных времен, а может и ранее, это светило было очень популярным. У древних греков яркий звездоподобный объект, видимый то утром, то вечером на фоне зари, ассоциировался с двумя персонажами — богиней любви и красоты Афродитой, но еще и со спутницей и предвестницей утренней зари — Эос Форос. Более привычное имя Венера пришло в астрономию из римского пантеона богов — в нем это имя также принадлежало богине любви.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/f57/988/014/f57988014edb788351566466acfd89b4.jpg" width="1200" height="900" data-src="https://habrastorage.org/getpro/habr/upload_files/f57/988/014/f57988014edb788351566466acfd89b4.jpg" data-blurred="true" /></figure>
<p>В древнем Вавилоне светило ассоциировалось с богиней Иштар, но полномочия её были шире. Помимо любви и плотского влечения она руководила войнами, сельским хозяйством, и открывала тайные знания избранным. В некоторых культурах Венера, видимая утром, и она же, но видимая вечером, соответствовала разным божествам. Так было например в Египте, и на Руси в дохристианскую эпоху — древние славяне не видели единства в образах нареченных как “Денница”, “Утренница” и “Зо́рница”, “Вечерница”.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/2d1/1bc/005/2d11bc00546123218cd2e47ba1dc6a93.jpg" width="3200" height="3200" data-src="https://habrastorage.org/getpro/habr/upload_files/2d1/1bc/005/2d11bc00546123218cd2e47ba1dc6a93.jpg" data-blurred="true" /></figure>
<p>Есть еще одно — немного пугающее — название для вечерней или утренней звезды: Люцифер. Пришло оно из Рима, и дословно означает “Несущий свет” или “Ангел света”. Но в средние века “Ангел света” был признан “Падшим Ангелом”, и его образ стал исключительно негативным — ассоциировался со слугой Сатаны, а то и с самим Сатаной. Возможно, такая перемена связана со свойством Венеры внезапно превращаться из вечернего светила в утреннее. И в самое ближайшее время мы тоже можем стать свидетелями такого “превращения”.</p>
<p>При том, что Венера бывает видна очень ярким, эффектным светилом, её никогда не удается увидеть ночью (во всяком случае в умеренных широтах, хотя и тут есть свои интересные исключения). Это внутренняя планета — её орбита располагается внутри орбиты Земли. А раз так, то видна Венера всегда неподалеку от Солнца, и никогда не удаляется от него более, чем на 48 градусов. Но в тех случаях, когда максимальное угловое удаление планеты от Солнца сопровождается значительным превышением её склонения (в сравнении со склонением Солнца), продолжительность видимости Венеры может достигать 5 часов. Такое бывает весной в периоды вечерней видимости, или осенью в периоды утренней видимости. Но, как можно заметить, текущая вечерняя видимость Венеры выпала на осень — это для северного полушария не очень хорошо. Зато в южном в этом году условия видимости Венеры были сказочно хороши.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/78c/b82/e8b/78cb82e8bddf40a7866ab38572ed6399.jpg" width="800" height="450" data-src="https://habrastorage.org/getpro/habr/upload_files/78c/b82/e8b/78cb82e8bddf40a7866ab38572ed6399.jpg" data-blurred="true" /></figure>
<p>По ряду своих физических характеристик Венера близка к Земле. Её даже называли “Сестрой Земли”. Она практически соответствует Земле по массе и размерам, окутана плотной атмосферой, имеет твердую поверхность. В середине прошлого века не только писатели-фантасты, но и серьезные ученые вполне допускали обитаемость Венеры.</p>
<p>Посудите сами: такая же как Земля — 80% по массе, 90% по диаметру, 70% по расстоянию до Солнца — всё как у нас, только “лучше”. Почему бы там не жить каким-нибудь гуманоидам… лу, ладно, с гуманоидами не все так просто — вдруг все они божественного происхождения (это не шутка — среди ученых немало людей, разделяющих религиозные представления о происхождении человека, но насчет прочей живности…) — что-то живое там точно должно быть!</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/a7a/454/393/a7a45439367c6cfb79bbbce437487fb5.jpg" width="1200" height="630" data-src="https://habrastorage.org/getpro/habr/upload_files/a7a/454/393/a7a45439367c6cfb79bbbce437487fb5.jpg" data-blurred="true" /></figure>
<p>Проверить это было невозможно. Плотная атмосфера планеты скрывала от астрономов абсолютно все. Долгое время даже невозможно было понять, а вращается ли Венера вокруг оси? — и как быстро она это делает. Даже радиолокационные наблюдения не сильно помогали — плотные облака отражали даже радиоволны, а уж в видимом свете в облачном слое не было шанса заметить хоть какие-то подробности — вид планеты был совершенно ровный, белый как снег, без каких-либо деталей.</p>
<p>Открыл атмосферу Венеры Михаил Васильевич Ломоносов 6 июня 1761 года. Открытие было сделано во время прохождения Венеры по диску Солнца. Это довольно редкое явление — оно случается дважды за 150 лет, но с перерывом в 8 лет. Два прохождения подряд, и пауза на 142 года. надо ли говорить, как Ломоносову повезло: он уже был видным ученым, у него был телескоп, причем оптической конструкции собственной разработки, само явление могло наблюдаться с территории России, и удивительным образом в хорошую погоду.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/8e3/7cf/7d8/8e37cf7d8cadb0d0135a196644c70803.jpg" width="1600" height="1107" data-src="https://habrastorage.org/getpro/habr/upload_files/8e3/7cf/7d8/8e37cf7d8cadb0d0135a196644c70803.jpg" data-blurred="true" /></figure>
<p>Во время вступления черного кружочка Венеры на диск Солнца ученый заметил, как с противоположной стороны планеты разгорелось явное свечение:</p>
<blockquote readability="11">
<p>“появился на краю Солнца пупырь, который тем явственнее учинился, чем ближе Венера к выступлению приходила. Вскоре оный пупырь потерялся, и Венера оказалась вдруг без края”</p>
</blockquote>
<p>Чтобы объяснить увиденное, Михаил Васильевич предположил, что явление вызвано преломлением света в атмосфере Венеры. Позже герои фантастического фильма “Люди в Черном” не раз цитировали это объяснение в сложных ситуациях.</p>
<p>Казалось бы, изучение Венеры с Земли практически безнадежно. Однако, даже в таких случаях талант наблюдателя позволяет увидеть нечто необычное. Так, например, советский астроном Сергей Константинович Всехсвятский на пределе видимости глазом обнаружил неясные всполохи на теневой стороне Венеры, интерпретировав их как грозы. В эпоху исследования Венеры космическими аппаратами предположение Сергея Константиновича подтвердилось — грозы на Венере есть, и по мощности они грандиозны — вполне могли бы быть заметны с Земли. Но повторить наблюдения советского астронома в ту эпоху не удалось никому.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/465/986/1cd/4659861cd994525cc01de161bae92b6f.jpg" width="800" height="553" data-src="https://habrastorage.org/getpro/habr/upload_files/465/986/1cd/4659861cd994525cc01de161bae92b6f.jpg" data-blurred="true" /></figure>
<p>Кстати, Венера, подобно Луне меняет фазы, и бывает видима то полным круглым диском, то половинкой, то узким серпом. Причем, вид серпа Венера имеет при сближении с Землей, когда видна в направлении близком к направлению на Солнце. Вот и в декабре 2021-го года Венера примет серповидный облик, который можно разглядеть даже в подзорную трубу или сильный бинокль.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/bee/3fe/109/bee3fe109a15ac3cf0499ad7152dbadd.jpg" width="1200" height="600" data-src="https://habrastorage.org/getpro/habr/upload_files/bee/3fe/109/bee3fe109a15ac3cf0499ad7152dbadd.jpg" data-blurred="true" /></figure>
<p>С первых лет телескопической эпохи и открытия спутников Юпитера астрономы искали спутники у Венеры. А почему бы нет?! У Юпитера есть, у Земли есть, у Сатурна со временем нашлись спутники, и — не мало.</p>
<p>Как это часто бывает, если очень хочется, то это начинает казаться правдой. И было по меньшей мере два десятка свидетельств в пользу обнаружения спутников Венеры. Все они оказались плодом воображения наблюдателей или ошибочно принятыми за спутники далекими звездами. И по сей день Венера пребывает в одиночестве… хотя, не совсем. У неё есть маленький приятель — безымянный астероид за номером (524522) 2002 VE68, открытый лишь в 2002 году. Его точный размер пока неизвестен, но вряд ли он превышает полкилометра. А особенность его в том, что — обращаясь вокруг Солнца по вытянутой эллиптической орбите он постоянно находится неподалеку от Венеры. Период его обращения вокруг Солнца в точности равен венерианскому году. Такое взаимодействие небесных тел в науке — Небесной механике — называется гравитационным резонансом. А для подобных небольших небесных тел есть специальный термин — “квазиспутник”. Кстати, у Земли тоже есть квазиспутники.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/ef2/b5c/740/ef2b5c740754400510dd91ffed6e4311.jpg" width="800" height="400" data-src="https://habrastorage.org/getpro/habr/upload_files/ef2/b5c/740/ef2b5c740754400510dd91ffed6e4311.jpg" data-blurred="true" /></figure>
<p>По одной из гипотез у Венеры был и настоящий спутник, который позже был утерян. Если предположить, что гипотеза верна, это небесное тело сейчас является планетой Меркурий. В пользу этой гипотезы работают многие научные факторы — необычно высокий эксцентриситет орбиты Меркурия, его крайне медленное вращение, обратное и тоже очень медленное вращение Венеры вокруг оси (Венера — исключение из правил — обращается вокруг оси в противоположном направлении — не как другие планеты). Но самое интересное — точный резонанс осевого вращения Венеры и Меркурия, в результате чего Меркурий продолжает смотреть на Венеру одной и той же стороной — лишь с некоторыми относительно небольшими покачиваниями — либрациями. Это очень похоже на то, что происходит в системе Земля-Луна — ведь и Луна смотрит на Землю только одной своей стороной.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/c21/d1f/0e0/c21d1f0e0510e1854251d210df10ac83.jpg" width="800" height="480" data-src="https://habrastorage.org/getpro/habr/upload_files/c21/d1f/0e0/c21d1f0e0510e1854251d210df10ac83.jpg" data-blurred="true" /></figure>
<p>Но вот земляне наконец вошли в Космическую Эру — научились отправлять исследовательские станции на околоземную орбиту и к Луне. Пришло время выбрать первую цель среди планет. Разумеется, была выбрана Венера.</p>
<p>К Венере в 60-х годах устремились и американские, и советские космические аппараты — буквально пчелиным роем. Но никто не знал, что ждет на Венере земные железяки. А их ждал там в буквальном смысле ад.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/2f0/95f/5c3/2f095f5c31cc4febfcc0367073839c7a.jpg" width="1200" height="870" data-src="https://habrastorage.org/getpro/habr/upload_files/2f0/95f/5c3/2f095f5c31cc4febfcc0367073839c7a.jpg" data-blurred="true" /></figure>
<p>Оказалось, что во всем похожая на Землю планета имеет совершенно иные условия вблизи поверхности. Плотные облака скрывали под собой крайне высокую температуру — около +470 градусов по шкале Цельсия. Среди всех планет Солнечной системы Венера оказалась самой горячей. Даже на Меркурии чуть “прохладнее” — там в полуденной точке +430, но ведь у Меркурия есть теневая сторона, отвернутая от Солнца — там -170. На Венере всегда +470 градусов — в экваториальной зоне и на полюсах, на дневной и ночной стороне — температура одинаковая. Плотная атмосфера в совокупности с парниковым эффектом дают вот такой удивительный эффект.</p>
<p>Плотность атмосферы Венеры вблизи её поверхности в 100 раз выше, чем на Земле на уровне моря. Углекислый газ, из которого на 96% состоит венерианская атмосфера, на уровне поверхности находится в особом агрегатном состоянии — что-то между газом и жидкостью — ни то и ни другое, но очень густое, плотное, вязкое. Космические аппараты отстреливали парашюты на больших высотах и совершали посадку будто погружаясь в океан (у которого нет явной поверхности) — тормозя просто своим корпусом. Но первые гости с Земли были раздавлены огромным давлением и их оборудование не выдерживало крайне высоких температур.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/48b/63e/c46/48b63ec46905e6142ea2fe35b3b1f3cf.jpg" width="1024" height="723" data-src="https://habrastorage.org/getpro/habr/upload_files/48b/63e/c46/48b63ec46905e6142ea2fe35b3b1f3cf.jpg" data-blurred="true" /></figure>
<p>Американские аппараты почти все потерпели неудачу.</p>
<p>Советским станциям под названием “Венера” тоже изрядно досталось. Первая успешная посадка была осуществлена станцией “Венера-7”. Но на самом деле это был 17-й пуск в сторону “Утренней звезды”. Аппарат проработал совсем недолго, но это в любом случае была победа — успешно сесть на раскаленную поверхность планеты и передать радиосигнал об этом не удавалось еще никому.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/c4b/677/59e/c4b67759e1296a3333ec44aadceaf71a.jpg" width="800" height="450" data-src="https://habrastorage.org/getpro/habr/upload_files/c4b/677/59e/c4b67759e1296a3333ec44aadceaf71a.jpg" data-blurred="true" /></figure>
<p>Исследование Венеры для советской космонавтики стало триумфальным. Нам не очень везло с Марсом, а к дальним планетам-гигантам и вовсе не удалось ничего отправить — не получили эти проекты финансовой поддержки правительства. Но большое количество миссий к Венере оказались успешными. Причем там, где не выдерживала никакая другая техника, кроме советской. Американские аппараты не смогли выжить в существующих на Венере условиях. Все фотоснимки поверхности Венеры и даже запись, как воет ветер в венерианской атмосфере — это вклад исключительно советской космонавтики.В частности, цветные фотопанорамы поверхности Венеры были получены последней станцией данной серии — “Венера-14”.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/3c3/04c/e98/3c304ce98f41f4f70e46c1c73d1d01f3.jpg" width="958" height="196" data-src="https://habrastorage.org/getpro/habr/upload_files/3c3/04c/e98/3c304ce98f41f4f70e46c1c73d1d01f3.jpg" data-blurred="true" /></figure>
<p>Высокой температурой и все сминающим давлением дело не кончилось. Облака, скрывающие от всей Вселенной венерианские ландшафты, оказались состоящими из капель концентрированной серной кислоты. Чтобы попасть на поверхность, космическим аппаратам предстояло прежде преодолеть этот токсичный рубеж. Но и за ним посланцев с земли ожидали мощные грозовые фронты, высокая вулканическая активность. Сказка, а не планета!</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/38b/0b2/894/38b0b28945e33cfa8b751a0f6a5be795.jpg" width="800" height="336" data-src="https://habrastorage.org/getpro/habr/upload_files/38b/0b2/894/38b0b28945e33cfa8b751a0f6a5be795.jpg" data-blurred="true" /></figure>
<p>Последние на сегодняшний момент визиты на поверхность Венеры осуществили посадочные модули советских автоматических станций “Вега-1” и “Вега-2”. Это была очень интересная миссия. Она отправлялась не столько к Венере, сколько к комете Галлея, которая навещала внутреннюю часть Солнечной системы в 1986-м году. Эта комета — редкий гость. Она бывает вблизи Солнца и Земли раз в 76 лет. Пропустить её визит было нельзя, и в экспедицию к комете готовилось целое “созвездие” космических аппаратов из разных стран. Советские ученые обнаружили, что удобнее всего добраться до кометы можно совершив гравитационный маневр вблизи Венеры. А раз путь все равно лежит мимо “Утренней звезды”, почему бы не совместить в этой миссии изучение сразу двух небесных тел — планеты и кометы?</p>
<p>Решение отразилось и в названии станций, ведь “Вега” — это слитное сокращение от “Венера-Галлея”. Но это еще и имя самой яркой звезды северного полушария — альфа созвездия Лиры — она тоже называется Вега.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/ffb/b3e/230/ffbb3e2304e394e149266745ac806a4a.jpg" width="1280" height="1233" data-src="https://habrastorage.org/getpro/habr/upload_files/ffb/b3e/230/ffbb3e2304e394e149266745ac806a4a.jpg" data-blurred="true" /></figure>
<p>Пролетая мимо Венеры от обеих станций отделились посадочные модули, а из каждого из них чуть позже были выброшены аэростаты, которые наполнили свои шары гелием и отправились летать в облаках. Посадочный модуль “Веги-1” вышел из строя не выдержав экстремальных условий, но все остальные разведчики отработали штатно. Атмосферные зонды работали особенно долго — мы даже не знаем, сколько, ведь связь с Землей осуществлялась через уходящие к комете станции, и когда расстояние до них стало очень большим, связь со стратостатами просто прервалась из-за дальности, но они продолжали отправлять данные своих измерений, которые мы уже никогда не получим. Впрочем, и полученных данных тогда было очень много.</p>
<figure class="float"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/c6f/e81/161/c6fe81161112c0f608cecc7c5d61a87c.jpg" width="400" height="680" data-src="https://habrastorage.org/getpro/habr/upload_files/c6f/e81/161/c6fe81161112c0f608cecc7c5d61a87c.jpg" data-blurred="true" /></figure>
<p>С тех пор (последние 35 лет) Венера изучалась только с пролетных траекторий или орбит вокруг планеты. Здесь отличилась американская станция “Магеллан”, которая в 90-х года прошлого столетия своими радиолокаторами просканировала всю поверхность планеты. А до того карта Венеры была сплошным белым пятном. Но теперь существуют даже глобусы Венеры. Один из них установлен в Московском Планетарии — в Музее Урании.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/056/6e2/16c/0566e216c3adcdc7d68655b0b176435a.jpg" width="800" height="600" data-src="https://habrastorage.org/getpro/habr/upload_files/056/6e2/16c/0566e216c3adcdc7d68655b0b176435a.jpg" data-blurred="true" /></figure>
<p>Казалось бы, зачем дальше изучать Венеру, если нам стало понятно, что нога человека никогда не ступит на её горячие камни?</p>
<p>Но нам и до звезд тоже очень далеко, и в бытовом смысле бесперспективно. Но ведь мы их изучаем. Для науки нет неинтересных объектов. А Венера все же для нас имеет очень большое значение. И прежде всего потому, что совершенно непонятно, какие процессы сформировали там адские условия. По ряду расчетов Венера находится в зоне обитаемости. Находится на самом краю. Но и Земля — не в середине. Мы, на самом деле, располагаемся в зоне обитаемости — особом поясе, в котором солнечное излучение создает достаточно тепла для существования жидкой воды — ближе к дальнему краю, где холодно. Но легкий парниковый эффект делает климат на Земле более мягким и теплым, чем это могло бы быть без него. На Венере же все могло бы быть гораздо более пригодно для жизни — планета тепла и солнечного света, благоухание растительности там раскинулось бы от экватора до полюсов, там не было бы холодных зим и иссушающего летнего зноя, несколько более щадящая гравитация, надежная защита от ультрафиолета плотной атмосферой…</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/a57/2bd/657/a572bd65714c875c319dbf50a639f443.jpg" width="1440" height="888" data-src="https://habrastorage.org/getpro/habr/upload_files/a57/2bd/657/a572bd65714c875c319dbf50a639f443.jpg" data-blurred="true" /></figure>
<p>Но парниковый эффект превратил этот умозрительный рай в катастрофическую реальность. Всегда ли на Венере было так жутко? На этот вопрос мы пока ответить не можем. Но ученых, да и всех людей Земли, волнует ответ на другой вопрос: Не ожидает ли Землю будущее Венеры?</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/8b7/298/cb9/8b7298cb99acf4ccfe99b14324942fd1.jpg" width="800" height="565" data-src="https://habrastorage.org/getpro/habr/upload_files/8b7/298/cb9/8b7298cb99acf4ccfe99b14324942fd1.jpg" data-blurred="true" /></figure>
<p>Создавший исключительно благоприятные для возникновения и развития жизни на Земле парниковый эффект в последнее столетие заметно усиливается, что уже сказалось на изменении климата. Можно спорить о вкладе антропогенного и техногенного факторов в эти изменения, но сами изменения отрицать уже не удается — климат меняется. И меняется он как раз в венерианском направлении.</p>
<p>Конечно, хотелось бы, чтобы дело не зашло так далеко. Иначе, всем нам крышка. Адаптироваться к давлению в 100 атмосфер и к температуре +470 градусов нам не удастся. И никаким организмам не удастся. Поэтому исследование Венеры имеет довольно большое значение в свете понимания тех причин, которые привели к имеющимся на поверхности планеты условиям. Поняв это мы сможем предвидеть и наше будущее, а возможно и окажемся способными его изменить — избежать катастрофы.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/f73/686/d03/f73686d032fa11b6f15ce1514ca327dd.jpg" width="1908" height="1146" data-src="https://habrastorage.org/getpro/habr/upload_files/f73/686/d03/f73686d032fa11b6f15ce1514ca327dd.jpg" data-blurred="true" /></figure>
<p>Белковая формы жизни, существующая на Земле — уникальное явление. Нигде во Вселенной ничего подобного пока не обнаружено. Мы даже не знаем, а возможна ли жизнь в каких-то иных формах? И изучение Венеры интересно еще и потому, что представляет нам исследовательский полигон, условия которого воссоздать на Земле крайне сложно или невозможно. А кто знает, может быть и в таких условиях существует жизнь — особая, на нашу жизнь не похожая?</p>
<p>Может быть это стоит рассматривать как шутку, а может есть смысл посмотреть на это всерьез, но по прошествии десятилетий после первых успешных посадок советских космических аппаратов, переданные на Землю снимки были подняты из архивов. Исследовать эти уникальные кадры, но уже с применением современных программ обработки изображений, решил выдающийся отечественный планетолог Леонид Васильевич Ксанфомалити.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/b25/c16/6ef/b25c166ef18e1961ba518b1260e3e10e.jpg" width="800" height="466" data-src="https://habrastorage.org/getpro/habr/upload_files/b25/c16/6ef/b25c166ef18e1961ba518b1260e3e10e.jpg" data-blurred="true" /></figure>
<p>Фотографии венерианских пейзажей были обработаны уже в рамках новых технологий. Были получены новые сведения о строении минералов, форме вулканических бомб, коих разбросано по поверхности в местах посадок станций множество. Но вместе с этим обнаружилось необъяснимое — на грани зоркости камер были замечены объекты, которые то появлялись, то исчезали, или появлялись на других снимках в других местах пейзажа.</p>
<p>Заявление Леонида Васильевича было вполне серьезным — это движущиеся объекты. Конечно, нельзя вот так сразу говорить об их живой природе, но что еще может двигаться по поверхности, перемещаясь буквально в течении минут или даже секунд?</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/e7d/676/b28/e7d676b28fc0e36c390791e17a3a09f4.jpg" width="800" height="300" data-src="https://habrastorage.org/getpro/habr/upload_files/e7d/676/b28/e7d676b28fc0e36c390791e17a3a09f4.jpg" data-blurred="true" /></figure>
<p>Пока этот вопрос остается без ответа.</p>
<p>И появляются новые вопросы.</p>
<p>Буквально год назад в верхних слоях атмосферы Венеры — чуть выше сернокислых облаков — обнаружилась заметная концентрация фосфина — химического соединения, которое естественным образом образуется лишь в результате деятельности живых организмов — микробов каких-нибудь.</p>
<p>И тут надо отметить, что именно на уровне облаков или чуть выше, условия на Венере уже не столь ужасны. Там примерно земное атмосферное давление. И примерно земные температуры. Конечно, там кислота. Но науке известны бактерии вполне способные жить в серной кислоте — они даже используют её для питания. Кто знает, быть может в верхних слоях атмосферы Венеры есть своя примитивная жизнь? Жизнь — она вообще довольно живучая.</p>
<p>Могла ли она возникнуть там? — это вряд ли. Но если когда-то на Венере были иные условия, и жизнь возникла там в благоприятной среде, то она позже могла уцелеть в облаках и выше их.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/cc1/ddf/088/cc1ddf0887d6e121e3ed423f80d72692.jpg" width="1920" height="1080" data-src="https://habrastorage.org/getpro/habr/upload_files/cc1/ddf/088/cc1ddf0887d6e121e3ed423f80d72692.jpg" data-blurred="true" /></figure>
<p>После этого известия интерес к “Сестре Земли” вновь возрос. Появилось несколько проектов исследования Венеры с помощью парящих среди облаков стратостатов или дирижаблей. Не обязательно высаживаться на поверхность — в этот кромешный ад. Но можно зависнуть на высотах порядка 50-ти километров и собирать информацию оттуда.</p>
<p>Но человеческая фантазия на этом не остановилась. Множатся проекты создания пилотируемых станций или даже целых городов, которые будут дрейфовать в плотной венерианской атмосфере. На поверхности такие базы не создать. Но в атмосфере там можно буквально плавать, как в океане, создавая оазисы цивилизации базирующихся на небольших атоллах.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/579/b39/b89/579b39b89b776608744ecbc9147526c7.jpg" width="1280" height="886" data-src="https://habrastorage.org/getpro/habr/upload_files/579/b39/b89/579b39b89b776608744ecbc9147526c7.jpg" data-blurred="true" /></figure>
<p>Это вполне технически реализуемые проекты. Конечно, это дорого и сложно. Но наука всегда возвращала вложенные в неё средства — с избытком, и дарила потрясающие возможности людям, обрести которые другим способом было бы возможно.</p>
<p>Сейчас пока нет технологий, позволяющих тотально менять условия и климат на планетах.</p>
<p>Нам эти технологии нужны потому что никто не гарантирует, что на Земле — даже по естественным причинам — будет всё всегда для нас хорошо. Быть может за это “хорошо” нам еще предстоит бороться. И нужен полигон для тренировок. Венера, в этом смысле — отличный полигон. Конечно, есть определенные этические взгляды, согласно которым мы не имеем права вторгаться в иные миры, и что-то там менять. Правда, люди так уже ни раз делали, и обретали новые пространства для своего существования. Во всяком случае, расселение нашего вида по всей поверхности планеты во многом трансформировало её вид. Земля выглядела бы в значительной степени иначе, если бы человек разумный так и остался жить в экваториальной Африке.</p>
<p>Оценивать с моральной точки зрения это можно по-разному. Мы истребили мамонтов (они не вымерли подобно динозаврам естественным путем — наука это уже подтвердила — мы причина их исчезновения), мы уже успели сильно израсходовать углеводородные ресурсы, копившиеся в земной коре миллионами лет. И может быть наша расточительность — не есть хороший пример другим цивилизациям. Но вряд ли мы смогли бы выжить без всего этого, без развития и расширения ареала обитания.</p>
<p>Что ждет нас в этом развитии, не знает никто. Но если оно не прекратится и мы не исчезнем как вид, наш путь лежит в космос — к другим планетам — расширять наш ареал можно теперь теперь только посредством космической экспансии. И не исключено, что парящие города в атмосферах других планет, в том числе и в атмосфере Венеры, станут естественным для нас шагом в будущее.</p>
<p>Сейчас мы смотрим на вереницы спутников связи, на пролетающую в ночном небе среди звезд Международную Космическую Станцию. И наше сознание наполняется гордостью за то, что мы — Люди — смогли достичь этих рубежей. Быть может, десятилетия или столетия спустя с теми же чувствами мы будем смотреть на сияющую в вечерних небесах Земли яркую планету Венеру, зная, что где-то там — в облаках того далекого мира несут вахту первопроходцы земной цивилизации. Мы будем слать им электронные сообщения или даже летать туда на экскурсии и в познавательные туры.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/43b/8d8/ed1/43b8d8ed15541aa8b9ebfbc0dec2fb61.jpg" width="1902" height="759" data-src="https://habrastorage.org/getpro/habr/upload_files/43b/8d8/ed1/43b8d8ed15541aa8b9ebfbc0dec2fb61.jpg" data-blurred="true" /></figure>
<p>То, что сегодня кажется фантастикой, завтра может стать очень важной и неизбежной реальностью. Готовы ли мы к ней? Некоторые люди готовы. Другие пребывают в страхах и сомнениях. Есть даже идея, что отправляться в космос — на другие планеты — нам рано. Прежде надо научиться жить на своей планете, научиться быть людьми. Это хорошая идея — научиться быть созидающими, а не разрушающими существами. Но именно в создании космических технологий сейчас более всего проявляется наш созидательный вектор. И вполне может оказаться, что без мечтаний о покорении других планет состояться зрелыми разумными существами нам не судьба. Космос ставит перед нами такие задачи, решить которые нам по силам лишь постоянно развиваясь. И в этом развитии залог нашего существования. Без него мы деградируем и вымрем — даже без катастроф планетарного масштаба. Без развития все обречено.</p>
<p>И пока звезды зовут нас к себе, пока вечерняя Венера манит нас своим блеском, у нас есть шанс достичь очень многого. И даже если Вы не ученый, не космонавт, не занимаетесь созданием новых технологий, сияние небесных светил, попав на сетчатку вашего глаза, превращает вас в путника небесных орбит, по которым предстоит пройти нам всем.</p>
<p>Сегодня Вы просто смотрите на клонящуюся к закату Венеру, а завтра люди Земли будут смотреть оттуда на голубую планету — самую яркую в ночных небесах своего нового Мира, и говорить — <em>“Неужели мы пришли оттуда?! В это трудно поверить!”</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/930/6af/19a/9306af19ab42e8eb84a4acde4ea5134d.jpg" width="1560" height="780" data-src="https://habrastorage.org/getpro/habr/upload_files/930/6af/19a/9306af19ab42e8eb84a4acde4ea5134d.jpg" data-blurred="true" /></figure>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-84454520394515252262021-12-11T21:36:00.001+03:002021-12-11T21:36:36.123+03:00[Перевод] «Интернет в огне»: критическая уязвимость Log4Shell терроризирует онлайн-сервисы<img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/rb/zy/e1/rbzye19clkegbmlh6p9zgffz8tg.png" />
<p>Критическая уязвимость в Java, в библиотеке log4j, которая используется в тысячах сервисов, начиная от Minecraft и заканчивая Apple Cloud, быстро превращается в серьезную угрозу для организаций по всему миру. Уязвимости подвержены сервера Apple, Valve, Microsoft и других.</p>
<p> «Интернет сейчас в огне», — <a href="https://www.voanews.com/a/the-internet-s-on-fire-as-techs-race-to-fix-software-flaw-/6349967.html">сказал журналистам</a> Адам Мейерс, старший вице-президент компании Crowdstrike, занимающейся кибербезопасностью. — «Люди изо всех сил стараются исправить это, и в то же время самые разные люди пытаются это использовать». В пятницу Мейерс сказал, что за 12 часов, прошедших с момента обнаружения уязвимости, она была «полностью поставлена на вооружение», и злоумышленники разработали и распространили инструменты для ее использования.</p>
<p>Уязвимость позволяет злоумышленникам удаленно выполнять код на уязвимых серверах, давая им возможность импортировать вредоносное ПО, которое может полностью скомпрометировать любые машины.</p>
<p>Уязвимость обнаружена в log4j, библиотеке логирования Java-программ с открытым исходным кодом. Ее используют тысячи игр и приложений, в том числе облачные сервера и корпоративное ПО. Почти каждая сетевая система безопасности запускает какой-то процесс регистрации, что дает огромные возможности популярным библиотекам, таким как log4j. Затронуты все системы и службы, использующие библиотеку логирования Java, Apache Log4j между версиями 2.0 и 2.14.1, включая многие службы и приложения, написанные на Java.</p>
<p>Уязвимость, получившая название «Log4Shell», может стать самой серьезной, обнаруженной за последние годы. Ей подвержены крупные компании и даже сайты правительства стран. С её помощью даже новички в области программирования могут получить доступ к внутренним сетям, где они могут похищать ценную информацию, устанавливать вредоносные программы, стирать важные данные и так далее.</p>
<p>Джо Салливан, директор по безопасности Cloudflare:</p>
<br />
<blockquote>Мне сложно представить себе компанию, для которой это не риск. Неисчислимые миллионы серверов работают с log4j, полные последствия не будут известны в течение нескольких дней.<br /></blockquote>
<p>Амит Йоран, гендиректор компании Tenable, занимающейся кибербезопасностью, назвал Log4Shell «самой большой и самой критической уязвимостью последнего десятилетия». «и, возможно, самой большой в истории современных компьютеров».</p>
<br />
<img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/nz/a5/zy/nza5zynbhetyhs-vjc9z-jov1dw.png" />
<p>Уязвимость получила 10 баллов из 10 от <a href="https://www.apache.org/">Apache Software Foundation</a>, которая курирует разработку ПО. По ее словам, любой, у кого есть информация об эксплойте, может получить полный доступ к незащищенному компьютеру, который использует это программное обеспечение.</p>
<p>По словам экспертов, чрезвычайная легкость, с которой уязвимость позволяет злоумышленнику получить доступ к веб-серверу без пароля, — вот что делает уязвимость настолько опасной.</p>
<p>Одной из первых публично об обнаружении уязвимости рассказала группа реагирования на чрезвычайные компьютерные ситуации Новой Зеландии. Тогда же, в четверг, через несколько часов был выпущен <a href="https://logging.apache.org/log4j/2.x/security.html">патч</a>. Apache об уязвимости, обнаруженной в её ПО, еще 24 ноября сообщила Alibaba. На разработку и выпуск фикса ушло две недели.</p>
<p>Хотя патч сейчас и выпущен, мало кто знает о наличии уязвимости (за исключением злоумышленников), поэтому многие сервера остаются уязвимыми. Так, как <a href="https://www.lunasec.io/docs/blog/log4j-zero-day/">сообщает</a> LunaSec, уже обнаружено, что Steam и iCloud от Apple сейчас уязвимы.</p>
<p>А первые очевидные признаки использования уязвимости появились в Minecraft. Игроки могли включать выполнение программ на компьютерах других пользователей, вставляя короткое сообщение в окно чата.</p>
<p>Эксперт по безопасности Маркус Хатчинс <a href="https://twitter.com/MalwareTechBlog/status/1469289471463944198">говорит</a> в Твиттере:</p>
<br />
<blockquote>Миллионы приложений используют Log4j для ведения журналов, и все, что нужно сделать злоумышленнику — это заставить приложение зарегистрировать специальную строку.<br /></blockquote>
<p>Пока что исследователи обнаружили доказательства того, что уязвимость может быть использована на серверах таких компаний, как Apple, Amazon, Twitter и Cloudflare.</p>
<br />
<hr />
<p>Хотите найти работу в IT? Подключайте себе <a href="https://t.me/g_jobbot?start=u_habr153">телеграм-бот g-mate</a>. Указываете зарплату и должность, и он выдает вам лучшие вакансии от компаний. Не нужно ни резюме, ни портфолио, настройка занимает меньше 30 секунд.</p>
<br />
<a href="https://t.me/g_jobbot?start=u_habr153"><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/gi/j7/va/gij7vafk4xfih6yyfx5jbvmr5q0.png" /></a>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-76939627565436793402021-12-11T20:36:00.001+03:002021-12-11T20:36:12.889+03:00СМИ: Apple в рамках сделки с властями Китая на $275 млрд локально изменила данные в сервисе Maps<img src="https://habrastorage.org/r/w780q1/webt/xt/3m/-u/xt3m-uvhar_pzq63iiepggx-elm.jpeg" data-src="https://habrastorage.org/webt/xt/3m/-u/xt3m-uvhar_pzq63iiepggx-elm.jpeg" data-blurred="true" /><i>Спутниковое изображение островов Сенкаку (Дяоюйдао).</i>
<p>По <a href="https://www.theverge.com/2021/12/10/22826695/apple-china-mou-275-billion-tim-cook-icloud" rel="nofollow noopener noreferrer">информации</a> Verge, Apple в рамках пятилетней сделки с властями Китая на $275 млрд не только вложилась в экономику страны, но и локально изменила данные в своем сервисе Maps. У китайских пользователей было скорректировано отображение на картах Apple архипелага в Восточно-Китайском море в 170 км к северо-востоку от Тайваня под названием <a href="http://www.geopolitics.ru/2013/02/ostrova-senkaku-dyaoyujdao/" rel="nofollow noopener noreferrer">острова Сенкаку</a> (в Японии это место называется острова Дяоюйдао).<br />
Apple сделала так, чтобы эти спорные территории у китайских пользователей отображались немного не в масштабе и казались больше, чем они показаны в других геосервисах. Так же при попытке изменить масштаб карты на более меньший, размер островов оставался немного больше реального. Вдобавок на картах Apple в данном случае отображалось только китайского название территории — острова Дяоюйдао. Причем в Maps данные отрова по-прежнему отображаются в большем масштабе, чем территории вокруг них.</p>
<p>В японской версии Maps таких ограничений и изменений со стороны Apple сделано не было.</p>
<p>Ранее СМИ <a href="https://habr.com/ru/news/t/594075/">сообщили</a>, что Тим Кук в результате поездок в Китай в 2015-2016 годах подписал с властями Китая секретное соглашение на $275 млрд на 5 лет, чтобы у Apple не было сложностей в стране. Помимо прямых инвестиций Apple в производство, согласно соглашению, компания должна была внести значительный вклад в развитие экономики и технологических достижений Китая, заключать выгодные для страны деловые сделки, модернизировать фабрики самыми передовыми производственными технологиями, использовать в своей продукции больше компонентов от китайских производителей и проводить обучение сотрудников.</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-44174371026512603742021-12-11T19:36:00.001+03:002021-12-11T19:36:46.983+03:00Щуп осциллографа. Устройство и принцип работы<p>Эта статья для тех кто всегда хотел знать как устроен щуп осциллографа, но боялся спросить. Для тех кто начинает работать с осциллографом, а также для тех кто много лет работает, но никогда не хватало времени и сил для того, чтобы разобрать как устроен щуп(пробник) осциллографа на самом деле. Этот материал основан на статье Doug Ford «The secret world of oscilloscope probes» с некоторыми изменениями и дополнениями. В статье будут рассматриваться только пассивные щупы. Исследование работы будем проводить в популярном симуляторе электронных схем LTSpice. Разберем последовательно назначение и особенности каждого элемента, моделируя эквивалентные схемы начиная от простых вариантов и переходя к более реалистичным. Узнаем кто изобрёл и запатентовал первый прототип этого устройства в том виде в котором он используется сейчас. А также в конце рассмотрим как устроен реальный щуп фирмы Keysight(бывший Agilent) 10073C, вышедший из строя и давший согласие предоставить свои останки на благо научного прогресса.</p>
<p>Все кто работает в области электроники хоть раз сталкивался с измерением с помощью осциллографа. Существует много разновидностей пробников, в основном они делятся на активные и пассивные. Активные пробники могут быть самого разного устройства и назначения, и в этой статье не рассматриваются. Мы обратим внимание на наверное самый распространенный вариант пассивного пробника с коэффициентом деления равным 10 (либо с переключателем режимов 1 или 10) и входным сопротивлением 10 МОм с учетом входного сопротивления осциллографа 1 МОм. В комплекте осциллографа как правило имеется два таких щупа.</p>
<p>Рассмотрим его устройство. Если поискать в интернете как устроен щуп осциллографа, то чаще всего приводится схема представленная на рисунке 1. Входное сопротивление осциллографа равно 1 МОм. Емкость входа осциллографа как правило составляет от 10 до 30 пФ (мы возьмем 20пФ). Источником сигнала будет генератор с 50-омным выходом нагруженный на резистор<br />
50 Ом. Эквивалентное выходное сопротивление такой схемы будет параллельное сопротивление (Rgen || Rload) = 25 Ом, такой выбор не случаен, о чем еще пойдет речь ниже. Эквивалентная схема щупа представлена как емкость кабеля в виде конденсатора на 100 пФ, наконечника с резистором делителя Rdiv и компенсирующего подстроечного конденсатора Ccomp. Делитель составленный из резисторов Rdiv и Rin образуют коэффициент пробника</p>
<p><img class="formula inline" source="\frac{Rin}{Rin+Rdiv}=\frac{1}{10}" alt="\frac{Rin}{Rin+Rdiv}=\frac{1}{10}" src="https://habrastorage.org/getpro/habr/upload_files/c08/958/f21/c08958f218144501f3f78bc9eac86436.svg" /></p>
<p>Задача конденсатора Ccomp выровнять частотную характеристику тракта. Для того, чтобы коэффициент оставался 1/10 на всех частотах необходимо, чтобы конденсатор Ccomp равнялся 1/9 суммарной емкости кабеля и входа осц., и таким образом получаем значение</p>
<p><img class="formula inline" source="\frac{100+20}{9}=13.3\, пФ" alt="\frac{100+20}{9}=13.3\, пФ" src="https://habrastorage.org/getpro/habr/upload_files/025/3c0/114/0253c0114459ec9eeb99da32db3c799e.svg" /></p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 1" title="Рисунок 1" height="453" data-src="https://habrastorage.org/getpro/habr/upload_files/692/9ec/6de/6929ec6de2020dc642221c153e9c83a9.png" data-width="1274" />
<figcaption>Рисунок 1</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 2" title="Рисунок 2" height="456" data-src="https://habrastorage.org/getpro/habr/upload_files/21e/337/1cf/21e3371cf36cc565e06a63994df1f681.png" data-width="1294" />
<figcaption>Рисунок 2</figcaption>
</figure>
<p>Другой возможный вариант когда параллельно резистору Rdiv стоит постоянный конденсатор, а подстроечный ставится параллельно входу осциллографа как показано на рисунке 2. Для переключения в режим с коэффициентом 1 резистор Rdiv просто закорачивают. Еще одна возможная конфигурация, показанная на рисунке 3, когда цепь подстройки находится в основании щупа, а не в наконечнике. Такой вариант и будем рассматривать в дальнейшем. Входная емкость такой системы будет определятся как последовательное соединение емкости Cdiv и суммы емкостей Ccable, Ccomp и Cin и равняется 13,5 пФ. Именно входная емкость определяет полосу пропускания щупа, точнее она определяется RC цепочкой, составленной из входной емкости и внутреннего сопротивления той части схемы куда приложен щуп. В документации на пробник обычно указывается полоса пропускания, которая нормирована на эквивалентной внутреннее сопротивление источника равное 25 Ом, то есть, если щуп с полосой пропускания в 500 МГц, имеющий входную емкость в районе 12 пФ приложен к высокоомной цепи, например 1МОм, то полоса пропускания уменьшится до 12,5 кГц. В нашем же случае как видно из рисунка 4 штатная полоса пропускания оказалась равной 470 МГц.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 3" title="Рисунок 3" height="434" data-src="https://habrastorage.org/getpro/habr/upload_files/684/fa5/dc5/684fa5dc52ccad2ad2f49e0be25ca0d0.png" data-width="1323" />
<figcaption>Рисунок 3</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 4" title="Рисунок 4" height="463" data-src="https://habrastorage.org/getpro/habr/upload_files/2eb/d27/17c/2ebd2717c4b606d40a1c1b2847aa72a0.png" data-width="1479" />
<figcaption>Рисунок 4</figcaption>
</figure>
<p>Посмотрим как влияет изменение ёмкости компенсационного конденсатора Сcomp на частотный отклик. На рисунке 5 показан результат моделирования при изменении емкости от 4 пФ до 24 пФ с шагом 2 пФ. Видно, что искажения начинаются уже с нескольких сотен герц. Правильно подобранная компенсация должна обеспечить ровную частотную характеристику.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 5" title="Рисунок 5" height="481" data-src="https://habrastorage.org/getpro/habr/upload_files/bc8/fb8/f11/bc8fb8f11b214802dcb018ff3189f2cc.png" data-width="1020" />
<figcaption>Рисунок 5</figcaption>
</figure>
<p>На рисунке 6 влияние емкости Сcomp на форму измеряемого сигнала в виде прямоугольных импульсов. Последняя картинка знакома любому, кто хоть раз сталкивался с калибровкой щупа осциллографа. Осциллографы как правило оснащены внутренним генератором прямоугольных сигналов, который питает «калибровочный» терминал на передней панели. Частота калибровочного сигнала обычно составляет 1 кГц с амплитудой 1 В. Изменяя емкость подстроечного конденсатора в основании можно добиться максимальной «прямоугольности» импульсов, и тем самым максимальной ровности частотного отклика.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 6" title="Рисунок 6" height="481" data-src="https://habrastorage.org/getpro/habr/upload_files/b22/e55/ae5/b22e55ae52fdde5a9f9f985bc82147bc.png" data-width="1017" />
<figcaption>Рисунок 6</figcaption>
</figure>
<p>Как правило объяснение работы пассивного пробника на этом заканчивается. Но мы попробуем пойти немного дальше. Основное отличие приведенной схемы от реальной ситуации заключается в том, что кабель аппроксимируется сосредоточенной емкостью только на низких частотах. Для полной картины необходимо изменить модель кабеля с емкости на линию передачи, как показано на рисунке 7. Типичная длинна кабеля щупа равна 1,2 м. Определим погонную емкость из соображения сохранения общей емкости 100 пф, таким образом погонная емкость будет равна 100 / 1,2 = 83,3 пФ/м. Погонную индуктивность найдем из формулы</p>
<p><img class="formula inline" source="Z_{0}=\sqrt{\frac{L}{C}}" alt="Z_{0}=\sqrt{\frac{L}{C}}" src="https://habrastorage.org/getpro/habr/upload_files/8f4/6c3/225/8f46c322599aaaa8bd9ac57a90797a0e.svg" /></p>
<p> где Zo – волновое сопротивление кабеля – 50 Ом. Таким образом L=2500*83,3 = 208,3 нГн. Вставим полученные значения в нашу модель и построим АЧХ.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 7" title="Рисунок 7" height="422" data-src="https://habrastorage.org/getpro/habr/upload_files/8ab/abc/cd5/8ababccd5b0770c454bfa38a5d4da276.png" data-width="1366" />
<figcaption>Рисунок 7</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 8" title="Рисунок 8" height="546" data-src="https://habrastorage.org/getpro/habr/upload_files/f03/8e0/964/f038e096461d3ec0071864c79efeaefc.png" data-width="1278" />
<figcaption>Рисунок 8</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 9" title="Рисунок 9" height="544" data-src="https://habrastorage.org/getpro/habr/upload_files/d31/6dd/f98/d316ddf98c7d8cfab8b8964f231f24de.png" data-width="1281" />
<figcaption>Рисунок 9</figcaption>
</figure>
<p>Как видно результат оказался чудовищный. На рисунке 8 и 9 представлены частотные характеристики на входе и выходе щупа. Видно, что кроме того, что искажения частотного отклика приняли неприемлемый вид, но и в результате переотражений происходит влияние на измеряемую схему на частотах выше 40 МГц, чем вообще говоря можно повредить устройство. Так происходим из-за несогласованности нагрузки и сопротивления источника с кабелем. Для тех кто не очень знаком с основами передачи сигналов в линиях передачи можно начать ознакомление с <a href="https://habr.com/ru/post/183006/" rel="noopener noreferrer nofollow">этой</a> статьи. А мы пойдем дальше. Так что же делают разработчики пробников осциллографов для решения этой проблемы?</p>
<p>Если вы измерите сопротивление щупа в режиме 1х то увидите, что сопротивление не будет равно нулю. Измеренное сопротивление будет в районе 150-300 Ом. Можно предположить, что в щуп вставлены какие-то последовательные резисторы. Может в этом весь секрет. Давайте вставим в нашу симуляцию пару резисторов. Добавим на входе кабеля резистор 150 Ом, а также на выходе в отсеке регулировки добавим резистор 50 Ом. Результат моделирования показан на рисунке 11.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 10" title="Рисунок 10" height="445" data-src="https://habrastorage.org/getpro/habr/upload_files/1f5/a04/3f2/1f5a043f2d03cefc6259f615467e2adc.png" data-width="1366" />
<figcaption>Рисунок 10</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 11" title="Рисунок 11" height="517" data-src="https://habrastorage.org/getpro/habr/upload_files/e04/77c/7ab/e0477c7aba8b686680b76dd889430ccd.png" data-width="1119" />
<figcaption>Рисунок 11</figcaption>
</figure>
<p>Очевидно, что характеристика стала более плавной, хотя идеальной её по-прежнему трудно назвать. Полезная пропускная способность такой системы не превышает 40МГц. Настройка компенсационного конденсатора мало влияет на частотную характеристику или резонансные эффекты линии передачи. Таким образом, очевидно, что характеристики линии передачи зондирующего кабеля потенциально ответственны за некоторые серьезные ограничения полосы пропускания и частотной характеристики. Итак, в чем секрет дизайна высокочастотных щупов. Как производителям зондов удается добиться максимальной ширины полосы пропускания от зондов? Над этим вопросом думал молодой сотрудник компании Tektronix по имени John Kobbe в 50-е годы 20 века. Пытаясь подобрать размер и положение резисторов для получения гладкой характеристики, он в какой-то момент пришел к выводу, что требуется поставить резистор по середине кабеля. Впрочем, скоро ему пришла идея получше.</p>
<p>Если вы разберете ваш пробник и удалите из него все последовательные резисторы, а потом измерите сопротивление кабеля, то оно про прежнему будет далеко от короткого замыкания. Это происходим от того, что сама центральная жила имеет высокое сопротивление. Именно так поступил John Kobbe. Купив в магазине высокоомную проволоку, он вытащил центральную жилу, заменив ее на проволоку. На рисунке 12 показан кабель щупа в разрезе, видно, что центральная жила гораздо тоньше чем для обычного коаксиального кабеля и смята, что придает в свою очередь больше гибкости пробнику.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 12" title="Рисунок 12" height="350" data-src="https://habrastorage.org/getpro/habr/upload_files/dbe/7a7/58d/dbe7a758d8fd8db8d63e0c9c3a8a0809.png" data-width="984" />
<figcaption>Рисунок 12</figcaption>
</figure>
<p>Так, что же это нам даёт? Вернемся к нашей модели и заменим последовательные резисторы на сопротивление потерь в линии передачи (рисунок 13).</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 13" title="Рисунок 13" height="439" data-src="https://habrastorage.org/getpro/habr/upload_files/ccc/20f/c11/ccc20fc1173e070f87640bbb8c56ecd7.png" data-width="1366" />
<figcaption>Рисунок 13</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 14" title="Рисунок 14" height="516" data-src="https://habrastorage.org/getpro/habr/upload_files/3cf/c9e/41d/3cfc9e41d11e7f4a97b31948de5dbac2.png" data-width="1249" />
<figcaption>Рисунок 14</figcaption>
</figure>
<p>На рисунке 14 показан волшебный результат: плавный и монотонный отклик без неприятных отражений или аномалий– просто плавный, полезный отклик! Давайте посмотрим, чего мы еще сможем добиться используя этот подход. Рассмотрим как влияет изменение сопротивление центральной жилы на частотный отклик, будем изменять сопротивление от 100 до 200 Ом с шагом 10 Ом.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 15" title="Рисунок 15" height="464" data-src="https://habrastorage.org/getpro/habr/upload_files/573/a6b/880/573a6b880421b4ed2842edf02532feeb.png" data-width="1264" />
<figcaption>Рисунок 15</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 16" title="Рисунок 16" height="529" data-src="https://habrastorage.org/getpro/habr/upload_files/34f/38c/77c/34f38c77ce7e64b814fcb4a143bb9879.png" data-width="1216" />
<figcaption>Рисунок 16</figcaption>
</figure>
<p>Отсюда подбираем оптимальное сопротивление – примерно 140 Ом и получаем пробник с полосой пропускания более 230 МГц (рисунок 17) , что уже можно назвать неплохим результатом.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 17" title="Рисунок 17" height="465" data-src="https://habrastorage.org/getpro/habr/upload_files/0f4/dcd/41c/0f4dcd41c9a88e45340fc21e295cf856.png" data-width="1474" />
<figcaption>Рисунок 17</figcaption>
</figure>
<p>Этим нехитрым изобретением производители пробников пользуются и по сей день. Историю Джона Коббе можно почитать <a href="https://vintagetek.org/my-early-tektronix-days-by-john-kobbe-2/" rel="noopener noreferrer nofollow">здесь</a>. Подробнее про основы пассивных пробников можно почитать в <a href="https://w140.com/tekwiki/images/6/62/062-1146-00.pdf" rel="noopener noreferrer nofollow">книжке</a> "Oscilloscope Probe Circuits" JOE WEBER 1969 г. А мы двинемся дальше.</p>
<p>Попробуем ещё немного улучшить нашу модель. Практические конструкции компенсационных схем могут быть самые разные и зависят от производителя. Мы же рассмотрим еще один часто встречающийся приём, а именно последовательно с кондесатором Ccomp поставим дополнительный резистор и будем менять его от 50 до 250 Ом с шагом 10 Ом.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 18" title="Рисунок 18" height="436" data-src="https://habrastorage.org/getpro/habr/upload_files/71d/8e2/c79/71d8e2c799b8209be300c4106d5d1c27.png" data-width="1363" />
<figcaption>Рисунок 18</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 19" title="Рисунок 19" height="507" data-src="https://habrastorage.org/getpro/habr/upload_files/7a8/478/b58/7a8478b58a8391433585ddafc211a2a6.png" data-width="1196" />
<figcaption>Рисунок 19</figcaption>
</figure>
<p>На рисунке 19 показан результат моделирования. Как видно можно подобрать оптимальное значение резистора для получения ровной характеристики. В нашем случае это значение получается равным 160 Ом (часто в примерах на этом месте встречается значение 68 Ом). Построим окончательный вариант схемы (рисунок 20).</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 20" title="Рисунок 20" height="444" data-src="https://habrastorage.org/getpro/habr/upload_files/4db/aed/ea5/4dbaedea5815a604c01332eb9bea9377.png" data-width="1349" />
<figcaption>Рисунок 20</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 21" title="Рисунок 21" height="465" data-src="https://habrastorage.org/getpro/habr/upload_files/546/11a/f31/54611af31eda3523e8ebfad31ed4d666.png" data-width="1563" />
<figcaption>Рисунок 21</figcaption>
</figure>
<p>Внедрение правильной схемы компенсации позволило увеличить полосу пропускания до значения 450 МГц! Почти удалось добиться результата моделирования идеальной схемы из рисунка 3. Теперь мы знаем секрет создания пробника. Но, как уже говорилось выше, в реальности все гораздо сложнее и приходится учитывать паразитные составляющие всех элементов схемы.</p>
<p>Далее давайте посмотрим некоторые характеристики нашего новоиспечённого щупа. Рассмотрим время нарастания фронта и задержку распространения. Будем для наглядности сравнивать со схемой из рисунка 10 и схемой из рисунка 16.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 22" title="Рисунок 22" height="504" data-src="https://habrastorage.org/getpro/habr/upload_files/e6e/651/c74/e6e651c74d844abe4ec4fcb43340fad7.png" data-width="1178" />
<figcaption>Рисунок 22</figcaption>
</figure>
<p>На рисунке 22 показан отклик на прямоугольный импульс 10 В для трех схем, и исходный импульс в уменьшенном масштабе (голубой). Задержка всех моделей оказалась равной примерно 5 нсек. Последний вариант схемы с полосой пропускания 450 МГц (зеленый) показал время нарастания фронта менее 1 нсек, тогда как схема с полосой 230 МГц (красный) показала результат 1,7 нсек. Модель же с последовательными резисторами (коричневый) по длительности фронта не уступает последнему варианту щупа, но создает значительные искажения формы. Наносекундные различия во времени нарастания несущественны, если вы наблюдаете прямоугольный отклик звуковых операционных усилителей с микросекундным временем нарастания, но они становятся жизненно важными, если вы исследуете проблемы в высокоскоростных цифровых схемах.</p>
<p>Полезно также рассмотреть частотную зависимость входного сопротивления (импеданса) пробника. Как говорилось выше для постоянного напряжения и низких частот пробник x10 имеет входное сопротивление 10 МОм. На следующем рисунке 23, показана зависимость входного сопротивления от частоты. По оси Y указано входное сопротивление в дБ (140 дБ соответствует 10МОм). Видно, что емкость начинает оказывать определяющее воздействие на входной импеданс на высоких частотах, и выше 150 МГц падает до значения менее 100 Ом (40 дБ на графике).</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 23" title="Рисунок 23" height="523" data-src="https://habrastorage.org/getpro/habr/upload_files/710/525/17b/71052517b86d64df35beab4b30a1d892.png" data-width="1268" />
<figcaption>Рисунок 23</figcaption>
</figure>
<p>Рассмотрим также как влияет заземляющая клемма на частотную характеристику. Типичный провод заземления пробника с зажимом составляет около 150 мм в длину. Типичная индуктивность провода составляет около 1 нГн /мм, поэтому заземляющий провод соответствует индуктивности 150 нГн. Так как место крепления заземляющего провода находится на некотором расстоянии от наконечника добавим еще 50 нГн. Вставим эту индуктивность в нашу модель щупа и посмотрим, как это повлияет на частотную характеристику.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 24" title="Рисунок 24" height="398" data-src="https://habrastorage.org/getpro/habr/upload_files/648/ef1/b53/648ef1b535567aaadb757b446e693436.png" data-width="1247" />
<figcaption>Рисунок 24</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 25" title="Рисунок 25" height="555" data-src="https://habrastorage.org/getpro/habr/upload_files/6d5/c2d/b99/6d5c2db99cf6d9f8f2cbeb7524036c69.png" data-width="1154" />
<figcaption>Рисунок 25</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 26" title="Рисунок 26" height="539" data-src="https://habrastorage.org/getpro/habr/upload_files/895/c0a/6cf/895c0a6cf9d96c39d7bc7478baa3342f.png" data-width="1179" />
<figcaption>Рисунок 26</figcaption>
</figure>
<p>На рисунке 25 и 26 частотная характеристика и фронт отклика во временной области щупа с индуктивностью (зеленый) показана в сравнении с предыдущим вариантом без индуктивности (красный). Характеристика значительно испортилась и стала демонстрировать немонотонность.</p>
<figure class="float full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/daa/353/966/daa35396633bcb12b8d8d4670ebe8191.jpg" alt="Рисунок 27" title="Рисунок 27" width="1017" height="763" data-src="https://habrastorage.org/getpro/habr/upload_files/daa/353/966/daa35396633bcb12b8d8d4670ebe8191.jpg" data-blurred="true" />
<figcaption>Рисунок 27</figcaption>
</figure>
<p>Для измерения сигналов выше десятков МГц в комплекте щупа всегда идут специальные насадки (рисунок 27) для заземления пробника максимально близко к наконечнику щупа во избежание возникновения индуктивных искажений.</p>
<p>Напоследок рассмотрим реально существующий вариант щупа фирмы Agilent (нынешний Keysight) 10073C, который пришел в негодность у меня на работе и был разобран. На рисунке 28 представлено основание щупа.</p>
<figure class="float full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/633/61b/684/63361b6843859d96e0fe02c142b9e934.jpg" alt="Рисунок 28" title="Рисунок 28" width="1220" height="766" data-src="https://habrastorage.org/getpro/habr/upload_files/633/61b/684/63361b6843859d96e0fe02c142b9e934.jpg" data-blurred="true" />
<figcaption>Рисунок 28</figcaption>
</figure>
<p>На рисунке 29 воссозданная схема в LTSpice. Сопротивление кабеля отличается от рассмотренных выше и равняется 2,2 МОм. Значения потенциометров, расположенных по бокам могут принимать значения до 500 Ом (R7-R10). Полоса пропускания по спецификации 500 МГц. Значения регулируемых емкостей неизвестно. Параметры используемого кабеля и емкости Сdiv также неизвестно. Со значениями используемыми в этой статье получилось только 426 МГц (рисунок 30).</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 29" title="Рисунок 29" height="471" data-src="https://habrastorage.org/getpro/habr/upload_files/0cf/294/d1f/0cf294d1fcf1baefcb4621c4dc8cbd02.png" data-width="1550" />
<figcaption>Рисунок 29</figcaption>
</figure>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Рисунок 30" title="Рисунок 30" height="466" data-src="https://habrastorage.org/getpro/habr/upload_files/7e7/8dd/30c/7e78dd30c68b07a10ce268363d724c2c.png" data-width="1573" />
<figcaption>Рисунок 30</figcaption>
</figure>
<p>Выводы:</p>
<ul readability="6">
<li readability="2">
<p>Пробники с высокой пропускной способностью спроектированы с использованием тщательно подобранного кабеля линии передачи и с минимизации воздействия сквозных отражений линии передачи.</p>
</li>
<li readability="0">
<p>Использование правильной схемы компенсации позволяет в разы увеличить полосу пропускания.</p>
</li>
<li readability="1">
<p>Пробник 10х имеет входное сопротивление 10 MОм только на низких частотах. На более высоких частотах в основном определяется входной ёмкостью.</p>
</li>
<li readability="3">
<p>Индуктивность заземляющего провода может разрушить точность формы сигнала и пропускную способность. Используйте комплект насадок из комплекта пробника, чтобы обеспечить низкую индуктивность.</p>
</li>
</ul>
<hr />
<p>Файлы моделирования можно скачать <a href="https://yadi.sk/d/6XG2QN1G_AoLAA" rel="noopener noreferrer nofollow">здесь</a>.</p>
<p>Полезное видео на тему: <a href="https://www.youtube.com/watch?v=QvA2UhaqBgA" rel="noopener noreferrer nofollow">Eric Bogatin Oscilloscope Basics Session</a>.</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-55432597762367289172021-12-11T18:36:00.001+03:002021-12-11T18:36:36.913+03:00Артем, 34 года: Уволился с зарплаты $250k в год и уехал на пенсию в Португалию<p>Привет, меня зовут Артем Крумпан, и к 34 годам я успел 10 лет проработать в международной нефтегазовой компании в самых разных уголках мира, стать директором завода в Анголе, накопить миллион долларов, выйти на пенсию, и уехать вместе с женой и четырьмя детьми на пенсию в Португалию.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/849/beb/af7/849bebaf74effb180503269a30980a53.jpg" width="720" height="714" data-src="https://habrastorage.org/getpro/habr/upload_files/849/beb/af7/849bebaf74effb180503269a30980a53.jpg" data-blurred="true" /></figure>
<blockquote readability="29">
<p>Мы познакомились с Артемом в Твиттере на почве общих интересов к финансам и инвестициям. Сейчас много кто говорит про FIRE (финансовую независимость и раннюю пенсию), но не так часто можно встретить людей, кто, собственно, уже практикует эту самую раннюю пенсию. Поэтому мне было очень интересно взять интервью у Артема про то, как он дошел до жизни такой, и о чем он думал в процессе.</p>
<p>Хотел бы сразу предупредить: не стоит воспринимать текст ниже как мотивирующую статью в стиле успешного успеха о том, что «любой может заработать миллион долларов, если последует моим советам». Нет, это всего лишь рассказ о личном опыте одного конкретного человека, а уж какие выводы из него делать — это решать вам. Но, как минимум, обещаю, что этот рассказ будет интересным. =) Всё, передаю слово самому Артему.</p>
<p><strong>Павел Комаровский</strong> (RationalAnswer)</p>
</blockquote>
<h3>Как я попал в Африку</h3>
<p>Меня зовут Артем Крумпан, я родился и вырос в Риге, Латвии. После окончания школы я поехал работать на Кипр, потом переехал в Англию, и там же пошел в университет. Пока учился, успел поработать в Китае и постажироваться в Америке — и еще до выпуска устроился в компанию, которая занималась производством и обслуживанием вот таких штук для глубоководной добычи нефти.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/97d/42e/66a/97d42e66a28a4161076776cf92f72ef9.jpg" width="1000" height="750" data-src="https://habrastorage.org/getpro/habr/upload_files/97d/42e/66a/97d42e66a28a4161076776cf92f72ef9.jpg" data-blurred="true" /></figure>
<p>Было это в 2010 году, когда с ценами на нефть всё было отлично и с бизнесом всё тоже было прекрасно… Компании нужны были молодые «солдаты» для работы в таких прекрасных уголках планеты, как Нигерия, Экваториальная Гвинея и Ангола. Англичане туда не очень хотели ехать на долгие вахты, а молодому и безбашенному мне это было только в кайф. Так я, глупый и красивый, оказался в Анголe. :)</p>
<figure class=""><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/c83/4d9/ade/c834d9aded706b218d4fce8059ce6cc3.jpg" width="432" height="432" data-src="https://habrastorage.org/getpro/habr/upload_files/c83/4d9/ade/c834d9aded706b218d4fce8059ce6cc3.jpg" data-blurred="true" /></figure>
<p>Когда я уезжал из уютного офиса в Йоркшире в Анголу, коллеги на меня смотрели с плохо скрываемым сожалением: у них стабильность, ипотека, по 2,5 ребенка — а в Анголе, понятноe дело, меня сначала похитят, потом убьют и, наконец, изнасилуют! Спойлер: в конце истории их почти всех уволили, а я стал долларовым миллионером — с тех пор у меня и появилась привычка идти против «общепринятого здравого смысла».</p>
<p>В реальности, в нашем офисе в Анголе оказался огромный недостаток молодых и пробивных специалистов, и я начал быстро расти. Кроме быстрого карьерного роста Ангола давала еще и высокие надбавки к зарплате… Достаточно скоро я вышел на доход $15 тыс. в месяц после налогов. В 29 лет я стал директором нашего завода в Анголе, работал по 6 дней в неделю и, в общем, всем был доволен.</p>
<h3>Наша интернациональная семья</h3>
<p>В Анголе у меня сложилась не только карьера, но и семейная жизнь. Мы работали с будущей женой в одном офисе в Луанде: познакомились 8 лет назад, поженились 7 лет назад — и с тех пор мы вместе.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/06e/43a/dc4/06e43adc4ab5cb355bbf331922507d1a.jpg" width="833" height="469" data-src="https://habrastorage.org/getpro/habr/upload_files/06e/43a/dc4/06e43adc4ab5cb355bbf331922507d1a.jpg" data-blurred="true" /></figure>
<p>У моей жены мать из Анголы, а отец — из Португалии, так что она наполовину анголка, наполовину португалка. После свадьбы ее полное имя звучит как Мамуссинга Казимиру Гуржел Родригез Крумпан!</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/5b8/9a4/023/5b89a4023f514ff0a65336f8de7ed230.jpg" width="937" height="625" data-src="https://habrastorage.org/getpro/habr/upload_files/5b8/9a4/023/5b89a4023f514ff0a65336f8de7ed230.jpg" data-blurred="true" /></figure>
<p>Это, конечно, совершенно разные культуры по отношению к той, в которой вырос я. У нас в семье есть много смешных моментов, когда она не понимает какие-то аспекты того, что и почему делаю я, и наоборот. Конечно, со временем всё это проходит, и вы учитесь понимать друг друга гораздо лучше.</p>
<p>Вообще, с того момента, как я встретился со своей будущей супругой, Ангола для меня заиграла еще большими красками. Есть одна дисциплина, в которой ангольцы чемпионы мира, и это вечеринки! Моя жена всегда недовольна тем, что я начинаю засыпать, когда ангольская вечеринка «только начинается» ближе к часу ночи.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/7a8/2c9/4d8/7a82c94d88ae8f1e7207b260858049a6.jpg" width="625" height="352" data-src="https://habrastorage.org/getpro/habr/upload_files/7a8/2c9/4d8/7a82c94d88ae8f1e7207b260858049a6.jpg" data-blurred="true" /></figure>
<p>Сейчас у нас четверо детей: старшим дочкам от первого брака жены 18 и 15 лет, у них ангольские имена — Юнара и Сиара. И младшие: Ивану 7 лет и Ярославе 3 годика. За счет того, что мы долго жили в Анголе, они все больше похожи на маму своим менталитетом — но и от меня тоже что-то есть (как минимум, я в них понемногу воспитываю финансовую грамотность).</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/e44/43f/f71/e4443ff71f5b03191c9421df6278187a.jpg" width="1111" height="625" data-src="https://habrastorage.org/getpro/habr/upload_files/e44/43f/f71/e4443ff71f5b03191c9421df6278187a.jpg" data-blurred="true" /></figure>
<h3>Жизнь в Анголе</h3>
<p>Скорее всего, вы слышали про Анголу только то, что это помойка («спасибо» Варламову), что там была гражданская война, и еще что-то про нефть и алмазы. Но для меня Луанда оказалась не адом, а крутым мегаполисом, полным экспатов, денег и возможностей… Окей, один раз на меня наставили пистолет на перекрестке и пару раз гоп-стопнули на улице, но в целом — если быть осторожным, в Анголе можно было жить очень неплохо!</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" height="533" data-src="https://habrastorage.org/getpro/habr/upload_files/7e9/1f9/d31/7e91f9d3114876d24d0db9bbf62b0dd0.png" data-width="800" /></figure>
<p>Хочу оговорится, что бедность, преступность и грязь в Анголе конечно же есть, и я нисколько этого не преуменьшаю. Есть малярия, от которой, к сожалению, до сих пор умирает много детей. Но человек так устроен, что мы приживаемся везде и привыкаем ко всему.</p>
<p>Так вот, шел 2012 год, нефть была весьма дорогой, и вся Луанда была одной большой вечеринкой — этот город регулярно фигурировал <a href="http://edition.cnn.com/2011/BUSINESS/07/14/luanda.expensive.city/index.html" rel="noopener noreferrer nofollow">в топе самых дорогих городов мира</a>. Гражданская война закончилась только в 2002 году, и надолго вперед никто не смотрел — что, в общем-то, понятно.</p>
<p>Я тогда очень много работал, но каждый раз, когда получалось куда-то выбраться, меня поражала красота Анголы. Солнце, океан, слоны, жирафы, горы, водопады — в Анголе есть всё. Контраст между тем, что я слышал о стране, и тем, что видел своими глазами, не мог быть более резким…</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" height="625" data-src="https://habrastorage.org/getpro/habr/upload_files/07d/bb2/75f/07dbb275f0f8b3db479b80efcb4c0ae6.png" data-width="833" /></figure>
<p>Мы купили в ипотеку квартиру вот в этом типовом районе, построенном китайцами. Bолшебная ипотека: брали $80 тыс. в местной валюте под фиксированные 3% годовых — с тех пор национальная валюта обесценилась примерно в 9 раз, и от ипотеки осталось меньше $10 тыс. простo за счет девальвации!</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/77d/ea5/600/77dea56001eaa6c5e1bea68057cdb7cb.jpg" width="1280" height="720" data-src="https://habrastorage.org/getpro/habr/upload_files/77d/ea5/600/77dea56001eaa6c5e1bea68057cdb7cb.jpg" data-blurred="true" /></figure>
<p>Удивлены, что в Анголе есть такие районы? На самом деле там можно жить вполне по-европейски, если не выходить за пределы новых районов: новые большие квартиры (четырехкомнатные это норма, большие семьи), торговый центр, кафешки, пицерия на углу… и всё это в вечном лете!</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" height="540" data-src="https://habrastorage.org/getpro/habr/upload_files/6cc/30b/e54/6cc30be5442757684b34784d54d94839.png" data-width="720" /></figure>
<p>Потом мы купили землю под Луандой… у меня была идея построить дом. Пока эта идея так и не реализовалась, и теперь мы переживаем, как бы эту землю не отобрали: в Анголе не самые эффективные судебная и правоохранительная системы. Если хозяев долго нет — то землю могут просто занять. =)</p>
<p>Один из больших плюсов Анголы в том, что там, в отличие от, скажем, Южной Африки или Намибии, очень спокойные отношения между белыми, африканцами, мулатами… Смешанные пары это совершенно нормально: наверное, около 10% населения — это потомки смешанных семей.</p>
<p>На этом фоне, можете себе представить, какая у моей супруги была реакция когда мы были в Риге на Рождество… она никогда до этого не видела снега! В Анголе вообще, на мой взгляд, идеальный климат: температура круглый год 25-30 градусов. Гардероб не меняется — майка круглый год!)</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/883/7aa/7b0/8837aa7b059409e3b6499efe412ae3d0.jpg" width="625" height="352" data-src="https://habrastorage.org/getpro/habr/upload_files/883/7aa/7b0/8837aa7b059409e3b6499efe412ae3d0.jpg" data-blurred="true" /></figure>
<p>Современный кинотеатр, хорошая (частная) клиника, аквапарк, неплохая (частная) школа… в Луанде есть всё для комфортной жизни. Благодаря близости Южной Африки есть много достойных компаний, продуктов и сервисов.</p>
<p>Мой посыл таков: Иногда нырнуть в омут с головой — это отличная идея! Если вы молоды — принимайте high risk/high payout решения; если интересны неординарные результаты — то и поступайте неординарно. Уехать из Европы в Анголу было лучшим решением в моей жизни, и я очень благодарен этой стране!</p>
<p>Ложка дёгтя: при всём сказанном, Ангола очень неравноправна — в Европе это тяжело представить. Образованный и современный средний класс живет в хороших ухоженных квартирах, при этом у них дома может за $100 в месяц работать неграмотная домработница, которая живет в районе как на фото ниже… это Ангола.</p>
<figure class=""><img src="https://habr.com/img/image-loader.svg" height="625" data-src="https://habrastorage.org/getpro/habr/upload_files/1a4/efc/6d9/1a4efc6d97b39d87bd823f0a98d8b1f4.png" data-width="352" /></figure>
<p>Теперь назад к позитиву! Один из самых позитивных моментов в Луанде — это пляжная культура. На выходных весь город едет на пляж. Почти круглый год (только «зимой» им холодно). На пляже барбекю, футбол, фитнес, прогулки, рестораны… Всё самое интересное в Луанде происходит на пляже!</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/854/aef/7e5/854aef7e57dc0170e48235adca6a45fc.jpg" width="720" height="960" data-src="https://habrastorage.org/getpro/habr/upload_files/854/aef/7e5/854aef7e57dc0170e48235adca6a45fc.jpg" data-blurred="true" /></figure>
<p>Про деньги. Сколько стоит жизнь в Луанде? Неплохая четырёхкомнатная квартира стоит $150 в месяц, сходить в ресторан $10-20 на человека, литр бензина стоит 25 центов. В целом, на $1000 в месяц семья может жить комфортно. Мы жили на $2000 в месяц с домработницей, няней… то есть — очень комфортно.</p>
<h3>Инвестиции и FIRE: как я пришел к финансовой независимости</h3>
<p>Подходим к самому интересному. Дела на работе шли в гору, на жизнь в Луанде уходило не так много, и у меня постепенно копился капитал — стало понятно, что его нужно куда-то инвестировать.</p>
<figure class=""><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/54e/fea/269/54efea2695ab54357bf89064fa3a0cde.jpg" width="352" height="352" data-src="https://habrastorage.org/getpro/habr/upload_files/54e/fea/269/54efea2695ab54357bf89064fa3a0cde.jpg" data-blurred="true" /></figure>
<p>Тут я прошел по всем граблям: последовательно терял деньги на ежедневном трейдинге, спекуляциях акциями и выборе отдельных компаний. Мне не стыдно признатся, я потерял на этом МНОГО денег…</p>
<p>Постепенно благодаря своему опыту, книгам и подкастам я пришел к тому, что лучший способ вложить деньги на долгий срок — это пассивное индексное инвестирование. Покупаем маленькую часть всех компаний мира (да, я такой тупой, что начал читать об инвестициях только <em>после</em> первых вложений).</p>
<p>Я ничего вам не продаю, у меня нет книги, курсов или платной группы в Телеграме — просто поверьте дураку, который потерял сотни тысяч долларов на фондовом рынке, и тем не менее стал миллионером и вышел на пенсию в 34 года: пассивное индексное инвестирование — это оптимальный путь!</p>
<p>К счастью, мы всегда жили скромно, и я откладывал от 75% до 85% доходов в разное время — так что первые неудачи на поприще инвестиций не стали для нашего капитала фатальными. Первое время жена тоже работала. Постепенно мой Net Worth (чистый накопленный капитал) рос, и у меня начали появляться крамольные мысли: а зачем, собственно, я всё это делаю? Какова финальная цель? Миллион долларов — для чего?</p>
<figure class=""><img src="https://habr.com/img/image-loader.svg" height="226" data-src="https://habrastorage.org/getpro/habr/upload_files/27a/bec/722/27abec722d5d9509fdab5123de4bcf81.png" data-width="477" /></figure>
<p>Так я пришел к идее о финансовой независимости и FIRE. Больше всего на меня повлияла книга J.L. Collins <a href="https://www.amazon.com/gp/product/1533667926/" rel="noopener noreferrer nofollow">«The Simple Path to Wealth»</a>. Его простой и минималистический подход к финансам полностью резонировал со мной. Кстати, скоро книга должна выйти на русском, рекомендую!</p>
<p>Не буду сейчас подробно говорить о FIRE — об этом уже много написано даже на русском. <a href="https://www.mrmoneymustache.com/2012/01/13/the-shockingly-simple-math-behind-early-retirement/" rel="noopener noreferrer nofollow">Вот тут</a> более подробно об этой идее. Всё крутится вокруг того, что, вкладывая в индексные фонды, вы можете почти «бесконечно» вынимать определенный процент своего капитала ежегодно.</p>
<p>Достаточно быстро я накопил достаточно денег для того, чтобы выйти на раннюю пенсию, и вот тут я ударился в стену. Я что, дурак — уходить с очень хорошо оплачиваемой работы и выкидывать мою карьеру?! Кто меня потом назад возьмет? С такой работы не уходят, с такой работы уносят!)</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/24f/983/8ba/24f9838ba2e551df1dc19ff06a56c2b8.jpg" width="1111" height="625" data-src="https://habrastorage.org/getpro/habr/upload_files/24f/983/8ba/24f9838ba2e551df1dc19ff06a56c2b8.jpg" data-blurred="true" /></figure>
<p>Это состояние продлилось около двух лет. Я боялся уйти с работы даже тогда, когда уже был миллионером. Где-то в мозжечке у меня сидела идея о том, что «никому я не нужен без крупной компании за спиной», «а вдруг что…». Я делал ошибку, концентрируясь на финансовом риске…</p>
<p>В чем ошибка? В том, что в этой ситуации есть две стороны риска: один финансовый — что я переживу свои накопления; а с другой стороны «риск времени» — что я не успею сделать то, что хочу. И речь тут не только и не столько о смерти! Как молодой отец объясню это на примере с детьми.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/452/423/f91/452423f9110b4429aef1e87a6e5f7edd.jpg" width="960" height="1280" data-src="https://habrastorage.org/getpro/habr/upload_files/452/423/f91/452423f9110b4429aef1e87a6e5f7edd.jpg" data-blurred="true" /></figure>
<p><a href="https://waitbutwhy.com/2015/12/the-tail-end.html" rel="noopener noreferrer nofollow">Вот в этой известной статье</a> Тима Урбана показано, что средний родитель к восемнадцатилетию своего ребенка уже использовал 93% своего времени с ним. Потом у детей универ, карьера, семья… бывает по разному, но многие, как я, видятся с родителями хорошо если неделю за год.</p>
<p>Меня лично эта мысль бросает в дрожь. Когда они вырастут, будет очень сложно всем вместе собраться и поехать, например, в Малазию к слонам.) Дочке три года, и каждый день онa узнает что-то новое о мире… Я хочу быть частью этого. Мое время с детьми бесценно и невосполнимо (!)</p>
<p>Когда я поставил вопрос так: что меня пугает больше — с вероятностью 5% остаться без денег, которые восполнимы, или с вероятностью 100% потерять время с детьми, которое невосполнимо… то ответ пришел сам собой. За 2020-й год я заработал около $250 тыс. и уволился с работы «в никуда»…</p>
<h3>После FIRE, или жизнь «на пенсии»</h3>
<p>Наш бюджет на ранней пенсии составляет $24 тыс. в год после налогов и без расходов на образование детей. Если быть точным, я сам себе плачу €1.650 каждый месяц. За первые два месяца этого года мы потратили около 80% этого бюджета и отложили остальное. Мы могли бы снимать примерно в полтора раза больше и по-прежнему укладываться в правило 4%, но мы этого не делаем по двум причинам.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/822/aac/8fc/822aac8fcbab190e93a6fcc0dae3a977.jpg" width="715" height="924" data-src="https://habrastorage.org/getpro/habr/upload_files/822/aac/8fc/822aac8fcbab190e93a6fcc0dae3a977.jpg" data-blurred="true" /></figure>
<p>Во-первых, я убежден в том, что выше определенного уровня потребления дополнительные расходы не приводят к повышению ощущения благополучия/счастья. <a href="https://eu.usatoday.com/story/money/nation-now/2018/02/26/does-money-equal-happiness-does-until-you-earn-much/374119002/" rel="noopener noreferrer nofollow">Вот одно из исследований</a> на эту тему в Америке, соответственно, с релевантными для этой страны цифрами. TLDR: свыше $105 тыс. в год особой прибавки к счастью уже нет.</p>
<p>Вообще, таких исследований уже много и в разных странах мира цифры разнятся, но похоже на то, что после достижения определенного уровня дохода люди не становятся более счастливыми… они просто привыкают к новым обстоятельствам! Это называют «гедонической адаптацией»: мы просто тупо привыкаем к комфорту и принимаем за само собой разумеющееся то, что вчера было особенно желаемым и, может даже, недоступным. Я думаю, что у каждого из нас есть примеры на эту тему из собственной жизни; по крайней мере, у меня точно есть, и не один.</p>
<p>Какое всё это имеет отношение к FIRE? На мой взгляд, у каждого из нас есть свой уровень «достаточно», после которого наш уровень удовлетворения жизнью объективно не повышается. Не будет ли рациональным и логичным остановится на этой цифре?</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/2fd/827/3f5/2fd8273f5f585276c75a0483356c8712.jpg" alt="Ангольский street food" title="Ангольский street food" width="833" height="469" data-src="https://habrastorage.org/getpro/habr/upload_files/2fd/827/3f5/2fd8273f5f585276c75a0483356c8712.jpg" data-blurred="true" />
<figcaption>Ангольский street food</figcaption>
</figure>
<p>Если у тебя есть «достаточно», то зачем продолжать обменивать свое ограниченное время, на уже в целом бесполезный в этот момент ресурс денег? Опытным путем я определил для себя «достаточно» как примерно $24 тыс. в год в недорогой стране.</p>
<p>Мне кажется тут важно подчеркнуть — это очень индивидуально, и для каждого эта цифра будет разной в зависимости от среды/бэкграунда и т.д. Никак не хочу сказать, что эта или другая цифра «правильна» для всех. Более того, я могу ошибаться даже по поводу себя самого… Но тут время покажет.)</p>
<p>И второй момент: низкие начальные расходы делают план более прочным, т.к. я трачу достаточно незначительную часть портфеля — около 2,6% в год. <a href="https://rationalanswer.club/post/7/" rel="noopener noreferrer nofollow">Вот здесь перевод интересного цикла статей о том</a>, на какой процент от капитала можно рассчитывать при планировании FIRE. TLDR: примерно от 3,00% до 3,75% в год (в реальном выражении, то есть с учетом инфляции).</p>
<p>Мы достаточно долго выбирали, куда мы хотим переехать всей семьей «на пенсию» — анализировали много факторов, от налогов и простоты получения визы, до климата и социальной обстановки (подробнее писал об этом в <a href="https://rationalanswer.club/post/240/" rel="noopener noreferrer nofollow">статье про географический арбитраж</a>). В итоге мы остановились на Португалии, и <a href="https://rationalanswer.club/post/29/" rel="noopener noreferrer nofollow">пока более чем довольны своим выбором</a>.</p>
<p>Кстати, если $24 тыс. в год в Португалии это близко к среднему доходу, то при переезде в Азию или Латинскую Америку — это уже совсем не средний доход, а вполне себе выше среднего. Кондо в Куала-Лумпуре стоит $400-$500 в месяц, и FIRE дает возможность быть не привязанным к одной географической точке — так что, если <a href="https://rationalanswer.club/post/45/" rel="noopener noreferrer nofollow">в нашем финансовом плане</a> что-то «пойдет не по плану», мы всегда можем переехать всей семьей в более бюджетную локацию.</p>
<hr />
<p>Если вам понравился рассказ Артема, то, возможно, вам будет интересно посмотреть длинное интервью с ним про FIRE, которое мы провели в прямом эфире: <a href="https://www.youtube.com/watch?v=Be6Ba-AN4MA" rel="noopener noreferrer nofollow">вот видеозапись интервью</a>, а его текстовую расшифровку можно <a href="https://www.rationalanswer.ru/2021/12/11/krumpans/" rel="noopener noreferrer nofollow">прочитать здесь</a>.</p>
<p>Также рекомендую <a href="https://twitter.com/krumpans" rel="noopener noreferrer nofollow">подписаться на Артема в Твиттере</a> — он периодически постит интересные зарисовки из жизни «пенсионера» в Португалии. (Собственно, вся эта статья по большей части собрана из <a href="https://twitter.com/krumpans/status/1368304839227285514" rel="noopener noreferrer nofollow">его крутых Твиттер-тредов</a>).</p>
<p>Ну и, наконец, буду признателен, если вы подпишетесь на мой <a href="https://t.me/RationalAnswer" rel="noopener noreferrer nofollow">Телеграм-канал RationalAnswer</a> — я стараюсь регулярно выпускать новые интервью с интересными людьми на тему личных финансов и инвестиций, да и вообще про всякие разные практически полезные штуки.</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-65202211405332358872021-12-11T17:36:00.001+03:002021-12-11T17:36:38.143+03:00Технология VPN и как с ее помощью реализовать Zero Trust<h2>Всегда проверяйте, никогда доверяйте</h2>
<hr />
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/9fe/407/2d3/9fe4072d3284931b3e825256cf82511f.jpg" width="1000" height="580" data-src="https://habrastorage.org/getpro/habr/upload_files/9fe/407/2d3/9fe4072d3284931b3e825256cf82511f.jpg" data-blurred="true" /></figure>
<h2>Введение</h2>
<p>Без сети Интернет сейчас тяжело представить нашу жизнь, и, несмотря на то, что существует угроза перехвата личных данных или кибератаки, частные пользователи продолжают её использовать, так как риск для нас не настолько высок, чтобы о нем переживать. Однако в крупных компаниях так отмахнуться не получится: на кону может стоять конфиденциальная информация корпорации и ее сотрудников, конкурентоспособность, секретные планы компании и прочее. При этом зачастую разные отделы или филиалы могут быть расположены далеко друг от друга, или компания сотрудничает с другой, не связанной с ней одной сетью, что ставит вопрос: как безопасно передавать информацию? Публичной сети интернет доверять нельзя, а позволить себе создание собственной сети или выделенного канала связи может далеко не каждая корпорация. Решением этой проблемы стало формирование защищенной сети VPN, работающей поверх публичной. </p>
<h4>Virtual Private Network</h4>
<p>VPN расшифровывается как Virtual Private Network — виртуальная частная сеть, защищающая ваши данные, но работающая на основе публичной небезопасной сети. Механизм ее действия достаточно прост, лаконичен, а главное эффективен и заключается в трех основных принципах.</p>
<p>Давайте остановимся чуть подробнее на каждом пункте:</p>
<ol readability="13.5">
<li readability="10">
<p>Перед отправкой сначала проверяются адреса отправителя и получателя и в случае, если, например, адрес получателя не найден в настройках VPN клиента, также проверяется целостность полученного пакета и далее он вместе со всей служебной информацией шифруется с помощью различных способов, но отдельно стоит выделить алгоритмы SSL и IPSec, отличающиеся друг от друга в цене, легкости применения и уровню доверия узлам, к которым вы подключаетесь.</p>
</li>
<li readability="9">
<p>Туннелирование - это создание связи между двумя точками сети посредством инкапсуляции (вкладывания пакетов информации один в другой). Пакет более высокого уровня вместе со служебной информацией в зашифрованном виде, помещается в пакет того же уровня или даже более низкого, скрывая от принимающего узла данные об отправителе и получателе и прочую информацию. Новый адрес отправителя - это адрес соответствующего VPN-агента, а новый адрес получателя - адрес другого VPN-агента, подключенного к настоящему адресату. Пакет пересылается по открытой сети, при этом риск перехвата уже не страшен, ведь получившийся пакет не раскрывает ни направления пересылки, ни важной содержащейся информации.</p>
</li>
<li readability="5">
<p>Получить или отправить пакеты по VPN могут лишь авторизованные пользователи, которым предоставлены соответствующие права, поэтому ваше сообщение получить может только тот, кому оно предназначалось.</p>
</li>
</ol>
<p>После получения VPN-клиентом адресата пакета происходит зеркально обратный процесс: </p>
<p>После идентификации VPN-клиента отправителя (он, например, может не входить в число разрешенных и тогда пакет будет отброшен), выбираются соответствующие настройкам ключи и алгоритмы расшифровки, а далее пакет пересылается действительному получателю по локальной сети.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" height="1024" data-src="https://habrastorage.org/getpro/habr/upload_files/138/d6c/1e4/138d6c1e44d278b8024f586f8274ca93.png" data-width="2048" /></figure>
<h4>Никогда не доверяйте, всегда проверяйте </h4>
<p>Это основная предпосылка сети Zero Trust (или сеть с нулевым доверием), разработанной Джоном Киндервагом в 2010 году. Zero Trust может стать важной частью многоуровневой кибербезопасности для компании, требующей строгой идентификации для доступа к сети. Не стоит доверять какому-либо соединению, даже происходящему внутри компании, не проверив преждевременно его надежность и безопасность.</p>
<p>Модель Zero Trust основывается на нескольких базовых принципах:</p>
<ul readability="7">
<li readability="5">
<p>Аутентификация и проверка прав доступа при каждом запросе на получение данных от пользователя. Каждая попытка входа в систему должна расцениваться как атака, вне зависимости от локации, до тех пор, пока не подтверждено обратное.</p>
</li>
<li readability="3">
<p>Ограничение прав доступа каждого сотрудника до необходимого для его работы минимума. При такой политике злоумышленники никогда не получат доступ к всему объему данных, даже если их атака успешна.</p>
</li>
<li readability="3">
<p>Аналитика безопасности данных поможет в выявлении угроз в вашей сети путем нахождения отклонений в запросах к доступам, вызовах файлов или отправлениях сообщений со стороны аккаунтов сотрудников. </p>
</li>
</ul>
<p>Существует мнение в технологической индустрии, что Zero Trust и VPN являются взаимоисключающими технологиями, но это далеко от истины.</p>
<p>Взглянем на различные аспекты в реализации и применении этих технологий, а также требования, к ним предъявляемые:</p>
<div>
<div class="table">
<table>
<tbody readability="18">
<tr>
<td>
<p><strong>Zero Trust</strong></p>
</td>
<td>
<p><strong>OpenVPN Access Server</strong></p>
</td>
</tr>
<tr readability="15">
<td readability="7">
<p>Обеспечивает сегментацию сети (разделяет сеть на более мелкие отдельные подсети для обеспечения безопасности)</p>
</td>
<td readability="9">
<p>Сегментация достигается за счет использования ACL (список, который определяет, кто имеет соответствующий доступ)</p>
</td>
</tr>
<tr readability="15">
<td readability="7">
<p>Предотвращает “Lateral Movement”, атаки посредством физического перемещения по сети</p>
</td>
<td readability="9">
<p>Позволяет администраторам сети вычислять, имеется ли у пользователей доступ к приватным подсетям, предотвращая “Lateral Movement”</p>
</td>
</tr>
<tr readability="10.5">
<td readability="5">
<p>Реализует контроль доступа самостоятельно</p>
</td>
<td readability="8">
<p>Правила контроля доступа позволяют администраторам назначать для каждого пользователя или группы IP адреса, к которым у них есть доступ</p>
</td>
</tr>
<tr readability="13.5">
<td readability="5">
<p>Предотвращает атаки</p>
</td>
<td readability="10">
<p>Предоставляет защиту от кибератак, исходящих из-за предела устройств, подключенных к сети, вне зависимости от расположения</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Как мы видим, правильно настроенный VPN реализует архитектуру технологии Zero Trust, защищая тем самым сеть как от внешних, так и от внутренних атак.</p>
<h4>Совместное применение OpenVPN + Zero Trust</h4>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" height="571" data-src="https://habrastorage.org/getpro/habr/upload_files/c8d/0f3/476/c8d0f347675d7162ee17b55da491aee0.png" data-width="2498" /></figure>
<p>Вопреки тому, что мы часто видим в новостях, атаки далеко не всегда исходят от киберпреступников. Многие из них начинаются изнутри, поэтому для организаций крайне необходимо придерживаться принципов Zero Trust. Один из лучших способов обеспечить этот тип защиты - это настроить VPN для обеспечения контроля доступа.</p>
<p>Применяя определенные настройки к пользователям сервера, можно задать кто может войти в систему и к каким сетевым службам у них есть доступ. Настраивая сервер доступа таким образом, вы приближаетесь к реализации принципа: «никогда не доверяй, всегда проверяй».</p>
<p>Отличный пример использования VPN для Zero Trust - от компании HVAC, которая управляет тремя большими независимыми подразделениями в США. Они предоставляют клиентам единое интегрированное решение для оборудования HVAC, обеспечивая автоматизацию зданий и балансировку независимых систем.</p>
<p>Крайне важно, чтобы у компании была возможность проверить каждого человека, имеющего доступ к сети. Руководители должны гарантировать, что члены команды имеют безопасный доступ к важным ресурсам, в то же время предотвращая доступ посторонних лиц к конфиденциальным данным.</p>
<p>HVAC установили интеграцию между VPN и своей службой каталогов Active Directory, и теперь их сервер настроен так, что члены компании имеют доступ только к тем ресурсам и каталогам, которые им необходимы для выполнения своей работы.</p>
<p>Такой подход очень сильно отразился на функционале корпорации, упростив работу сотрудникам, с одной стороны позволив им легко получать доступ к информации, необходимой им для обслуживания своих клиентов, с другой предоставив компании способы гарантировать, что только авторизованные пользователи с соответствующими правами могут добраться до необходимых ресурсов.</p>
<p>Zero trust подразумевает безусловную идентификацию личности, без ориентации на границы сети: то есть необходимо аутентифицировать всех, независимо от того, находятся ли они в офисе через корпоративную сеть или вне его. Один из способов этого достичь - потребовать, чтобы все использовали VPN для доступа к конфиденциальным ресурсам - независимо от того, подключаются они из офиса или работают удаленно.</p>
<p>Таким образом, используя технологию VPN и все возможности, которые она предлагает, мы можем построить безопасную сеть, которая будет удовлетворять всем принципам сети Zero Trust.</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-12633064362197541982021-12-10T21:37:00.001+03:002021-12-10T21:37:23.134+03:00Как строить карьеру тимлидам и СТО: рефлексия, планирование и карьерный роадмапСтать руководителем — один из вариантов развития карьеры разработчика. Но что делать дальше, когда кода в жизни становится всё меньше, а управления всё больше? Мы поговорили с техлидами и СТО о том, что значит, когда очередная галочка в списке целей поставлена и вы уже руководитель небольшой (или очень даже большой) команды. Как правильно развиваться в профессии дальше и что предпринять, чтобы при этом не выгореть самому и не дать выгореть команде.
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/3h/wb/gx/3hwbgxb2vziy57d9fsqkbfh_60y.png" /></div>
<i>Выгорел и забухал...</i><br />
<h2><span>Отчего выгорают тимлиды и СТО</span></h2>
<br />
Если долго никуда не двигаться, а стоять на одном месте — велик риск эмоционального истощения, считают опрошенные нами эксперты. А приблизить это могут следующие факторы.
<h3>1. Ощущения стагнации</h3>
<br />
<img src="https://habr.com/img/image-loader.svg" align="left" data-src="https://habrastorage.org/webt/py/tb/eg/pytbegegzqrjwuf_nmboeum-w-8.png" /><i>Евгений Антонов, IT-консультант. Ведёт Telegram-канал «</i><a href="https://t.me/general_it_talks"><i>Тимлид Очевидность</i></a><i>»</i>
<p>В целом профессия тимлида более напряжная, чем просто работа разработчиком. Выгорание во многом происходит от повышенной нагрузки и овертаймов — когда ты сам себя загоняешь, или позволяешь себя загнать не профессиональному менеджменту.<br />
Часто выгорают тимлиды, которые вышли из технических профессий и стали руководить. Они мало пишут код и чувствуют стагнацию как технические специалисты. А когда ты мало делаешь то, на чем строилась вся твоя карьера, то это давит.</p>
<p>Задача тимлидов становится больше, чем просто писать код, а успехи сложнее оценить. Цикл получения обратной связи в руководстве куда дольше, чем в инженерной должности. Разработчиком ты можешь писать код день, два, неделю, потом релизнуть и удовлетвориться тем, что видишь, как твоя разработка работает в проде. Руководителем ты можешь тащить проект через кучу согласований, обсуждений, конфликтов, бюджетных планирований и т.д. месяцами, прежде чем увидеть в итоге финальный результат своего труда.</p>
<p>Нужно понимать, что теперь твои цели глобальнее. Многим не хватает именно понимания важности того, что они делают. Кажется, будто в постоянных созвонах и согласованиях бесполезно пролетают дни и ты не сделал ничего полезного.</p>
<p>Свежеиспеченным тимлидам хорошо бы разговаривать с другими коллегами по профессии — теми, у кого схожие проблемы, кто наступал на те же грабли и может поделиться своим опытом.</p>
<p>Если ты стараешься общаться с людьми, смотришь доклады, читаешь книги, например Друкера <a href="https://www.mann-ivanov-ferber.ru/books/paperbook/theeffectiveexecutive/">«Эффективный руководитель»</a>, все время находишься в контексте и примеряешь чужой опыт на себя, то будет расти осознание важности того, что делаешь, и как именно это делать, чтобы быть хорошим, полезным и востребованным.</p>
<h3>2. Непонимание куда двигаться дальше и отсутствие возможности это выяснить</h3>
<br />
<img src="https://habr.com/img/image-loader.svg" align="left" data-src="https://habrastorage.org/webt/wh/00/92/wh0092clnwdf1mpqldzw8z2bmre.png" /><i>Роман Ивлиев, организатор конференций TeamleadConf, ex СТО в MOS.RU</i>
<p>Мы испытываем давление начальства, экономической ситуации, пандемии, семейных обстоятельств. Был момент, когда я сильно устал, начались серьезные проблемы со здоровьем. На этом фоне подорвалась эмоциональная составляющая — тяжело быть веселым, когда у тебя что-то болит, и ты устал. Начинают раздражать обычные вещи, нет сил и желания что-то делать, не хочешь брать трубку, когда звонят с работы.</p>
<p>Это как снежный ком: в семье недовольны что ты все время в работе, а на все вопросы отвечаешь, что все плохо. А еще хуже, когда ты не знаешь, будет ли еще хуже, чем сейчас. Неопределенность еще сильнее усугубляет ситуацию.</p>
<p>В конечном счете я уволился из места, в котором выгорел. Чтобы выйти из этого состояния, нужно искать положительные эмоции, делать побольше приятных вещей, смотреть по сторонам и изучать опыт других. Мне это помогло. Я много читал про выгорание в разных книгах, искал идеи и умные мысли. Раз про это пишут — значит я не одинок. Если много кто с этим сталкивался и смог справиться — значит смогу и я. Это ключевой момент — поверить в себя и поставить цель исправить ситуацию.</p>
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/8i/5f/d0/8i5fd0ahmm5jhq3kvzraa4-hggy.png" /></div>
<p>Занятия тем, что нравится очень прилично добавили сил, стало отпускать, вернулись интересы и желание что-то делать. Я сопровождал это большим количеством отдыха, легким фитнесом и здоровым образом жизни. Месяцы не употреблял то, что может влиять на работу головы, например, чай и кофе. В совокупности это меня взбодрило, облегчило состояние.</p>
<p>Но есть одно наблюдение. Не стоит пытаться в разбитом состоянии «назначать» себе что-то в качестве лекарства, например, пет-проект. Это скорее всего не сработает. Я брал в руки то, что бралось и приносило удовольствие. Если вы себя заставляете, то даже хобби приведет к дальнейшему выгоранию. Другое дело, если ты всю жизнь мечтал сделать собственную CRM систему, выгорел, взял отпуск и начал ее делать и получаешь от этого удовольствие. Такие проекты наоборот дают не свалиться в выгорание, профилактируют его.</p>
<h3>3. Бешеная нагрузка и несбывшиеся ожидания</h3>
<br />
<img src="https://habr.com/img/image-loader.svg" align="left" data-src="https://habrastorage.org/webt/j6/uk/bs/j6ukbsoege1psjvpqbkxsjhzhpk.png" /><i>Глеб Михеев, технический директор и основатель агентства Beta, программный директор по программированию Skillbox, руководитель программного комитета конференции FrontendConf</i>
<p>Если долго работаешь на износ, обязательно выгоришь. Еще быстрее это происходит, когда заставляешь себя потерпеть, а конца работы не видно. Обычно в придачу перестаешь видеть ценность своей работы, особенно когда не получаешь положительной обратной связи.</p>
<p>В этом случае единственный выход — поменять работу. Но скорее всего ты выгоришь и там, если не отрефлексировал, что именно к этому привело.</p>
<p>Если тебе постоянно плохо уже месяцы или годы, выпиши на листочек, что именно к этому привело. Например, что в компании все разобщены или что руководитель не ценит твою работу или что тебя только ругают и никогда не хвалят.</p>
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/mr/-1/yi/mr-1yihkhhan7bkwrw8shvavax4.png" /></div>
<p>Проблема может быть и в чувстве незаконченности. Нужна культура правильно двигаться к цели — в походы нужно уметь ходить. А если ты работаешь над продуктом с длинным циклом разработки, без еженедельного подведения итогов и разделения большой задачи на более мелкие то чувству завершенности просто неоткуда будет взяться.</p>
<p>Если ты понял, в чем проблема выгорания, можно поговорить об этом с руководителем и командой. Но если к тебе не захотят прислушаться, значит в этом месте работы тебе больше делать нечего.</p>
<h2>Сценарии развития карьеры для тимлидов или СТО</h2>
<br />
Чтобы не стоять на одном месте, нужно что-то делать: пойти в бизнес, изменить сферу ответственности, податься в другой стек технологий или вообще стать консультантом или сменить сферу работы. Какие преимущества и риски у этих карьерных маршрутов?
<h3>1. Сменить стек</h3>
<br />
<img src="https://habr.com/img/image-loader.svg" align="left" data-src="https://habrastorage.org/webt/gv/ze/in/gvzeinywfldijdorwk77xvg6ld8.png" />Есть разные варианты развивать карьеру, когда ты уже тимлид. Сменить стек, податься в другую компанию. Но когда ты уставший тимлид, тебе может быть неинтересно снова идти на ту же должность.
<p>Если вы решили сменить место работы, нужно спланировать заранее, куда вы хотите попасть в итоге. Выберите цель и подумайте, в какой компании сможете ее достичь. Если вы хотите стать крутым кибербезопасником, устройтесь в компанию, где она важна — например, в банк.</p>
<p>А еще попробуйте пойти на курсы, читайте лидеров мнений, следите за новостями в индустрии и ходите на профильные конференции. Без постоянного пополнения знаний, вы не сможете построить траекторию карьеры.</p>
<p>Еще одна версия для тимлида — податься в СТО. Вопрос, куда идти — в маленький стартап или в большую компанию. В маленькой компании СТО — тот же тимлид, но с нагрузкой административного характера. Он занимается кадровыми вопросами, бизнес вопросами и отвечает за все технологии, а спросить за ошибки ему не с кого.</p>
<p>Если перейти СТО в большую компанию, то придется отвечать за большой штат (до нескольких тысяч) разработчиков. Но если у вас нет опыта работы техническим директором, то устроиться на такую вакансию будет проблематично. Другой вариант — стать мини-СТО в конкретном проекте или направлении. В этой иерархии можно расти постепенно.</p>
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/lb/l3/sd/lbl3sdufvekdnmmmnwnlseqyz-4.png" /></div>
<p>Но чем больше людей будет у вас подчинении, тем меньше технических и больше организационных вопросов будет входить в ваши обязанности. Вам придётся становиться все дальше от кода и все ближе к бизнесу. В продуктовой разработке принято делить большой коллектив на маленькие продуктовые команды. Например, если ты в одной из них лид, то можешь переквалифицироваться в продуктолога. Это классный вариант, если тебе больше нравится работать над продуктами и метриками. А еще можно стать техническим руководителем с экспертизой в конкретной сфере или больше управлять людьми.</p>
<p>В больших компаниях существует матричная модель. Много команд с разными особенностями. Поэтому можно найти оптимальную версию для собственного развития.</p>
<h3>2. Уйти в бизнес</h3>
<br />
<img src="https://habr.com/img/image-loader.svg" align="left" data-src="https://habrastorage.org/webt/-p/jv/fh/-pjvfhneuj9ep8i51_sw6-ukgj4.png" />Если вы уже доработали до должности лида или СТО, дальше открывается несколько вариантов развития. Можно развиваться вертикально, то есть брать под свое начало все большие команды и все более масштабные проекты.
<p>А можно сменить сферу деятельности или стек технологий, это горизонтальный рост. Например, можно пойти в e-commerce, если раньше занимался порталами. Или перейти в сферу банкинга. Это выход из зоны комфорта, смена стека. Это интересно и позволяет вырасти как специалисту.</p>
<p>Но этот вариант не всегда подойдет узкопрофильным специалистам. Например, если ты всю жизнь работал в медтехе с оборудованием, то попасть в веб-разработку будет непросто. Или 10 лет занимался банкингом, а потом решил перейти работать в классифайд, то скорее всего придется приложить серьезные усилия. Это при условии, что компания-работодатель согласится сотрудничать с «непрофильным» сотрудником.</p>
<p>Тимлид в России — это практически всегда старший инженер — больше технарь, чем управленец. Но так как сейчас практически все строят кроссфункциональные команды, тимлид в них не может быть специалистом во всем, он эксперт в чем-то одном. Тем не менее, у него есть много возможностей для карьерного роста — начальник отдела, департамента, технический директор.</p>
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/ti/ve/y4/tivey4s46j0-ftx_zmap_jfnz0a.png" /></div>
<br />
Важно понимать, что есть развилка: в одних компаниях техлид — прежде всего технический специалист, а в других тимлид — прежде всего управленец. Если ты длительное время был управленцем, а сейчас решил уйти в технические специалисты, то будет сложно. Потому что технологии очень быстро развиваются, и скорее всего успели сильно уйти вперёд. Отсюда очень важно постоянно поддерживать свой технологический уровень.
<p>Если ты классный специалист, то все равно сможешь во всем разобраться и начать работать в новой сфере. Но нужно, чтобы компания дала такую возможность и готова была ждать, пока ты разберешься.</p>
<p>Многим компаниям, особенно небольшого размера, не хватает техэкспертизы и им нужен как раз хардкорный СТО, который будет и код писать, и административные функции выполнять. Чтобы стать таким, нужно развивать и хардскиллы, и софтскиллы.</p>
<p>Многие СТО уходят в бизнес — то есть их роли в компании становятся больше бизнесовые. Например, мне в своё время предложили должность ИТ-бизнес-партнера. Перечень выполняемых задач на таких позициях может быть очень обширным. Еще одна подобная должность — технический менеджер продукта или менеджер программы. Часто это интерфейс между бизнесом и техническими специалистами.</p>
<p>Вариантов для развития на самом деле масса. Работа СТО — это не тупик. Часто это люди с большим опытом, которым открыты дороги везде. Они могут уйти в советники, открывать свои консультационные программы, брать под управления большие команды или просто заработать много денег и вообще ничего не делать.</p>
<h3>3. Стать консультантом</h3>
<br />
<img src="https://habr.com/img/image-loader.svg" align="left" data-src="https://habrastorage.org/webt/pb/pb/ov/pbpbovejnsqj33uptrmrt_9ffvu.png" />Мой карьерный путь в фултайме выглядит примерно одинаково. Я приходил в компании рядовым сотрудником, а потом дорастал до тимлида. После чего переходил в другую компанию.
<p>Сейчас, работая фултайм тимлидом, я нашел возможность для развития через организацию своего парт-тайм ИТ консалтинга. На данный момент в нем я уже не тимлид, а выполняю, можно сказать, роль техдиректора.</p>
<p>Если в компании нет команды, понимания как работать с людьми и как делать продукт, ей нужен кто-то, кто понимает ситуацию достаточно разносторонне, и может либо подсказать направление, в котором необходимо двигаться, либо закатать рукава, занырнуть поглубже в компанию и помочь уже в настройке всего этого дела своими руками. Именно этим я и занимаюсь.</p>
<p>Я далеко не единственный, кто это делает. Есть ряд людей, для которых это основная работа. Они приходят в компанию на позиции ближе к C-level, налаживают процессы, запускают производство и переходят в другие компании. Такой трансфер позволяет все время развиваться и заниматься интересными проектами.</p>
<h3>4. Уйти в крупную корпорацию или открыть свой стартап</h3>
<br />
<img src="https://habr.com/img/image-loader.svg" align="left" data-src="https://habrastorage.org/webt/c1/yu/j6/c1yuj6pxnr3emrkzmd3zfl_su_i.png" /><i>Антон Ленев, СТО Viewst</i>
<p>С небольшими командами области развития более очевидны. Растет количество людей и команд, приобретаются навыки управления. Постепенно увеличивая команду, можно перейти на макро уровень управления и выстраивания таких процессов.</p>
<p>Органичнее такое развитие происходит в небольшой кампании по мере ее роста. Так можно достаточно быстро дорасти до СТО крупной команды. При этом зона ответственности и компетенции будут расти постепенно, вместе с компанией.</p>
<p>Можно попробовать пойти другим путем и создать свой стартап. Но важно ответить себе на вопрос — есть ли желание еще дальше отодвинуть техническую часть и уйти в бизнесовую часть движухи, с иными задачами и требованиями. Если есть такое желание и ресурсы на такую авантюру — это интересный путь<br />
Третий вариант — уйти в большую корпорацию. После небольших стартапов и команд там можно получить совершенно отличный опыт. Но и на высокие уровни в таких кампаниях сразу не запрыгнешь — придется откатиться от СТО к тимлиду или и вовсе штатному разработчику и постепенно дорасти до СТО.</p>
<h2>Как планировать менеджерскую карьеру</h2>
<br />
<h3><span>1. Понять, в какую компанию вам нужно</span></h3>
<br />
<img src="https://habr.com/img/image-loader.svg" align="left" data-src="https://habrastorage.org/webt/gv/ze/in/gvzeinywfldijdorwk77xvg6ld8.png" />Я был разработчиком долгое время, а потом ушел работать в стартап. Теперь у меня своя компания, в которой я — технический директор.
<p>Когда долго работаешь в одной компании, в какой-то момент вырастаешь технически как инженер, но сталкиваетесь с тем, что продукты не растут вместе с тобой. Задачи не растут по сложности так, как вам нужно. С этой проблемой рано или поздно сталкиваются все разработчики.</p>
<p>Еще одна проблема — вы переросли культуру компании. Речь о культуре, когда один руководитель рассказывает всем как поступать, не объясняя почему. Рано или поздно в такой компании становится тесно. И когда вы понимаете, что созрели как лид, у вас есть свое мнение, то из компании нужно уходить. Ведь если хотите стать сеньором или лидом, нужно брать на себя больше обязанностей, проявлять инициативу.</p>
<p>Нужна компания, которая заинтересована в вашем росте и росте лежащей на вас ответственности. Такая культура обычно есть в больших компаниях. Это причина, почему люди стремятся попасть на работу в условный Google, Spotify, Яндекс.</p>
<p>Когда ты руководишь разработчиками, у них тоже есть свои мнения. Поэтому важно уметь выстраивать коммуникацию в команде без холиваров. Для успеха команды не менее важно делегировать, уметь долгосрочно планировать и верно оценивать тайминг задач.</p>
<p>Двигаться к цели нужно без выгорания и пиков нагрузки, чтобы все в команде видели результаты своей работы. Это добавляет бодрости в проекты. Если ты видишь проект только на три шага вперед, то ничего не получится. Принцип waterfall не работает в динамике и долгосрочной перспективе. В этом случае нужно уметь работать с гибкими методологиями — Kanban, Agile и так далее. Вводить ритуалы, демо, спринты. Все эти механики помогают эмпирически двигаться к цели, быть гибкими, как нужно бизнесу, а команде видеть результаты своей работы на постоянной основе.</p>
<p>Мы работаем в настолько динамичном и стремительно развивающемся рынке, что обязаны уметь это делать. А еще в задачу руководителя входит умение договариваться с соседней командой, которая договариваться не хочет. Для этого нужно уметь апеллировать к общей цели, презентовать что вы делаете и зачем это нужно. И уметь общаться с бизнесом на его языке — это навыки самопрезентации, стратегического мышления, оценки перспектив и последствий.</p>
<h3>1. Построить карту развития</h3>
<br />
<img src="https://habr.com/img/image-loader.svg" align="left" data-src="https://habrastorage.org/webt/-p/jv/fh/-pjvfhneuj9ep8i51_sw6-ukgj4.png" />Я не планировал стать директором, двигался по некоторому внутреннему курсу, рос как инженер и тимлид. Но тимлид — это назначаемая менее самостоятельная должность. Вовсе не обязательно становиться из тимлида директором. Многим комфортнее оставаться в инженерной деятельности, например, программировать и непосредственно управлять инженерами. Да и вообще стоимость инженеров сейчас часто выше, а ответственность изрядно ниже. Если ты колеблешься, нужен ли тебе путь вертикального роста, то идти по нему не стоит.
<p>Я стал СТО, когда вокруг меня появилось слишком много начальников, которые давали разные, порой противоречивые вводные. Стать директором — это способ получить одного (в идеальной ситуации) начальника.</p>
<p>Но моем карьерном пути мне помогли и подсказали знакомые. Они предложили попробовать себя в этой роли и искать места, где серьёзный профильный управленческий опыт не обязателен. Важно понимать, что если ты идешь в руководство, то скорее всего лишишь себя возможности работать как инженер.<br />
Если ты уверен, что это твое, можно построить карту развития. Например, директору нужны более развитые софтскиллы: навыки переговоров и коммуникации, умение стратегически и системно мыслить, управлять конфликтами и т.д. Прокачать их можно с помощью курсов, книг, посещения конференций, просмотров докладов. Потому что если ты без подготовки свалишься с кресла тимлида в кресло директора, то быстро перегоришь. Ведь будет слишком много неопределенности, слишком много вопросов, на которые ты не знаешь ответов. Самое сложное — это понять в чём ты слаб и убедить себя в этом.</p>
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/mj/jf/mx/mjjfmxt4juniuveeijrsqg44ncu.png" /></div>
<br />
<a href="https://tlroadmap.io/">tlroadmap.io</a>
<p>Став техдиректором ты рискуешь безвозвратно уйти из истории с разработкой, потому что СТО «руками» техническими вещами почти не занимается, например, код не пишет. Он обсуждает технологии, процессы, архитектуру, проводит ревью, строит планы развития, адаптирует технические подразделения под задачи бизнеса и т.д. У меня есть всего несколько примеров руководителей, которые поддерживают хороший исполнительный технический уровень. Но в большинстве случаев, когда у тебя в подчинении 100-200 человек, сил на то, чтобы что-то программировать у тебя просто не остается.</p>
<p>Основная идея в том, что тебе нужно разбираться в самом себе: что тебе хочется, а что нет. Это поможет осознанно ставить себе рамки на масштаб того, что ты хочешь попробовать.</p>
<p>Когда попадаешь в среду, которая тебе непонятна ты скорее всего разберешься с помощью литературы или ментора. Но если ты ленивый или тебе на самом деле не хочется, то ничего не получится. Важно понять что нужно развивать, следом понять как развивать, ну и, наконец, планомерно двигаться в выбранном направлении.</p>
<h2>Что в итоге</h2>
<br />
Чтобы не выгореть, нужно развиваться в профессии. Стагнация и непонимание куда двигаться — быстрый путь к эмоциональному истощению.
<p>Строить карьеру, когда ты тимлид или СТО можно по разным сценариям: сменить стек, уйти в стартап, заниматься бизнес-процессами в больших компаниях, стать консультантом, идти по карьерной лестнице в крупной корпорации.</p>
<p>Чтобы спланировать карьеру, нужно понять, чего именно ты хочешь добиться и в какой компании это проще всего сделать. Дальше нужно посмотреть вакансии и построить карту развития — выписать навыки, которые нужны и подготовить пошаговый план их освоения.</p>
<p>А как вы строили карьеру тимлида или технического директора? Какое направление выбрали? Удалось не выгорать на пути к поставленной цели? Расскажите о своем пути в комментариях.</p>
<p>Ну а мы продолжаем делать настраиваемого под ваши запросы Telegram-бота с «вкусными» вакансиями <a href="https://clck.ru/ZGpGt"><b>Get Me It</b></a>. В последнем релизе, мы добавили много всего, чтобы вы получали более подходящие вашим запросам предложения.</p>
<p>Теперь, если вы синьор-помидор с зарплатой 300к/наносек и опытом управления межгалактической империей — вы сможете лучше настроить фильтры для себя. Еще мы добавили пару крупных городов, которые несправедливо обошли стороной: Екатеринбург и Новосибирск (тамошнему IT-сообществу большой привет!).</p>
<p>Следуйте за белым кроликом кликнув на картинку ниже😉</p>
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/sk/c0/6y/skc06yplzq47j3ckhdinxoz8dk8.png" /></div>
<div class="spoiler" role="button" tabindex="0"><b class="spoiler_title">Сцена после титров совсем как у Marvel (а точнее мемасы, которые не вошли в статью)</b></div>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-80998218213646589232021-12-10T20:37:00.001+03:002021-12-10T20:37:37.054+03:00Пользователи «Тинькофф Банка» и «Тинькофф.Инвестиций» жалуются на проблемы со входом в приложения<img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/lt/lf/17/ltlf17xiovx46lkhobskwtn1yxk.png" /><i>Ошибка при попытке запуска приложения «Тинькофф Банк».</i>
<p>С 17.30 мск у многих пользователей «Тинькофф Банка» и «Тинькофф.Инвестиций» <a href="https://downdetector.ru/ne-rabotaet/tinkoff-bank/" rel="nofollow noopener noreferrer">перестали</a> работать приложения «Тинькофф Банк» и «Тинькофф.Инвестиции». Представитель банка в Twitter пояснил, что разработчики в курсе проблемы и пытаются ее исправить.<br />
Пользователи не могут войти в приложения, совершить переводы и проверить свои счета, снять наличные, не работает эквайринг. Причину инцидента и время исправления в «Тинькофф Банке» не пояснили.</p>
<blockquote>У нас действительно наблюдаются затруднения при входе в мобильное приложение и личный кабинет. По техническим причинам пока они не работают. Мы уже чиним мобильное приложение и личный кабинет. Простите, что доставили неудобства, — пояснили в Тинькофф.</blockquote>
На 18.30 мск часть сервисов «Тинькофф Банка» стали доступны снова, но пока написано, что не все функции в приложениях могут быть доступны или приложение может работать с ошибками.
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-13758613134992755782021-12-10T19:36:00.001+03:002021-12-10T19:36:23.314+03:00Американские IT-компании устроят ярмарку вакансий для сотен сотрудников, уволенных из Better.com<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/386/c93/6c5/386c936c567c9e4b4636e16a3ecb2cd4.jpeg" width="976" height="549" data-src="https://habrastorage.org/getpro/habr/upload_files/386/c93/6c5/386c936c567c9e4b4636e16a3ecb2cd4.jpeg" data-blurred="true" /></figure>
<p>Как <a href="https://www.businessinsider.com/better-com-employees-fired-over-zoom-job-fair-microsoft-robinhood-2021-12" rel="noopener noreferrer nofollow">сообщает</a> издание Insider, компании Allstate, Intercontinental Capital Group, Microsoft и Robinhood планируют предложить работу сотням сотрудникам, <a href="https://habr.com/ru/news/t/593683/" rel="noopener noreferrer nofollow">уволенным</a> в начале декабря из Better.com в ходе видеотрансляции в Zoom. Для них будет организована специальная ярмарка вакансий, чтобы пострадавшие работники не остались перед праздниками без работы. По словам бывшего регионального директора Better.com Деми Найт Кларк (одного из организаторов ярмарки), в текущей обстановке сотни свободных и подкованных технических специалистов, способных незамедлительно приступить к работе — мечта для работодателя.</p>
<p>Массовое увольнение через Zoom <a href="https://habr.com/ru/news/t/593683/" rel="noopener noreferrer nofollow">произошло</a> первого декабря этого года. Глава компании Вишал Гарг зачитал короткую речь, в которой рассказал, что рынок меняется и сервис должен адаптироваться под эти изменения, чтобы выжить. На эту речь были собраны только те сотрудники, которых собрались уволить — 9% штата, что составляет около 900 человек. Как <a href="https://www.dailymail.co.uk/news/article-10289067/My-heart-just-sank-says-ex-employee-laid-900-employees-Better-com-Zoom-call.html" rel="noopener noreferrer nofollow">сообщают</a> работники, их заранее не уведомили об увольнении, и вскоре после окончания трансляции они были отключены от всех рабочих сервисов, выданная работодателем техника также была заблокирована всего через несколько минут после объявления. Сотрудникам пришлось потратить несколько часов, чтобы добиться от работодателя более подробной информации об инциденте.</p>
<p>Через неделю (вероятно, из-за громкого скандала в СМИ) Вишал <a href="https://habr.com/ru/news/t/594189/" rel="noopener noreferrer nofollow">извинился</a>, что уволил людей именно таким образом. Он признал, что выбрал не лучший способ, чтобы сообщить об этом людям, и обязательно извлечёт из этого уроки. Но из-за репутации Вишала в искренность его заявлений никто не верит. Из-за регулярных скандалов на работе, плохого отношения к сотрудникам и ряда судебных исков от бывших партнёров и инвесторов глава Better.com зарекомендовал себя как неуравновешенный, ненадёжный и агрессивный человек. Например, в рабочих переписках он называл сотрудников «тупыми дельфинами», а при даче показаний по иску обещал «заживо сжечь» своего бывшего партнёра, который обвиняет его в краже $3 млн со счетов совместно созданной компании.</p>
<p>Несмотря на извинения, Гарг утверждал, что уволенные сотрудники «воровали» деньги у компании — они якобы работали всего по два часа в день, в то время как получали за 8+ часов. За месяц до увольнения компания начала анализировать данные о производительности, включая количество пропущенных, входящих и исходящих телефонных звонков, отслеживала сотрудников, опаздывающих на встречи с клиентом, и другие показатели. Better.com планирует продолжить эту практику, за счёт уже получила критику от множества текущих сотрудников компании.</p>
<p>С самого начала инцидента в СМИ появилась информация, что сокращение было проведено по требованию инвесторов в обмен на крупную сумму инвестиций. На днях Вишал подтвердил, что фирмы-партнёры и инвесторы полностью поддержали сокращение рабочих мест и то, как компания справилась с этим сокращением. Но он не указал, кто именно выразил одобрение.</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-47106925732423853732021-12-10T18:36:00.001+03:002021-12-10T18:36:40.423+03:00Из-за давления властей Китая на отрасль местные IT-компании начали сокращать персонал<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/d61/f14/dd0/d61f14dd07c598392387dd071221cf12.jpeg" width="1920" height="1080" data-src="https://habrastorage.org/getpro/habr/upload_files/d61/f14/dd0/d61f14dd07c598392387dd071221cf12.jpeg" data-blurred="true" /></figure>
<p>Китайские IT-компании прибегли к сокращениям сотрудников на фоне давления местных властей на технологический сектор. Так, например, видосервис iQiyi Inc. планирует уволить сотни сотрудников из некоторых департаментов — это около 20% всего персонала, <a href="https://www.caixinglobal.com/2021-12-08/iqiyi-fires-hundreds-of-workers-as-losses-balloon-101815279.html" rel="noopener noreferrer nofollow">сообщает</a> портал Caixin Global со ссылкой на нескольких работников сервиса.</p>
<p>Работники iQiyi Inc. рассказали порталу, что в наименее прибыльных департаментах сокращения достигнут 40%. Такие меры компании подразумевают, что руководство решило резко изменить стратегию, которая ранее предполагала получение прибыли за счёт расширения.</p>
<p>Также сокращения начались и в компании Kuaishou Technology — она разарабатывает сервис коротких видеороликов, подобный TikTok. Как <a href="https://www.thepaper.cn/newsDetail_forward_15748355" rel="noopener noreferrer nofollow">пишет</a> сайт The Paper, её сотрудники сообщили, что до конца года руководство произведёт перестановки в подразделениях в Пекине, Шанхае, Гуанчжоу и Шэньчжэне.</p>
<p>Увольнения в китайских компаниях перед Новым годом — обычное дело, однако South China Morning Post <a href="https://www.scmp.com/tech/big-tech/article/3158928/lay-offs-chinas-big-tech-mount-kuaishou-iqiyi-said-be-joining" rel="noopener noreferrer nofollow">отмечает</a>, что в этом году они более масштабны. В то же время не следует связывать сокращения исключительно с давлением властей на сектор — их причиной служит в том числе выросшая конкуренция, пишет газета.</p>
<p>Источники South China Morning Post утверждают, что Kuaishou сокращает самых неэффективных сотрудников, предлагая им выплату месячной зарплаты и бонус за выслугу лет. При этом начались сокращения с менеджеров с высокими зарплатами.</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-17466593386850522552021-12-10T17:37:00.001+03:002021-12-10T17:37:38.737+03:00[Перевод] Как работают коды Spotify — часть 2<a href="https://habr.com/ru/company/ruvds/blog/594623/">
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/dv/m7/02/dvm702ads7zrhpzuafx6yq-y80s.png" /></div>
</a><br />
В <a href="https://habr.com/ru/company/ruvds/blog/594115/">первой части</a> мы разобрали общие технические принципы функционирования кодов платформы Spotify, и в завершении я написал, что неуверенность в некоторых деталях не позволила мне реализовать собственный конвертер штрихкодов в URI. Однако благодаря дополнительному исследованию и активной <a href="https://stackoverflow.com/a/64950150/10703868">помощи от участников StackOverflow</a> теперь я это преобразование выполнить могу.
<p>Если вы первую статью не читали, то стоит начать с нее. Я опубликовал ее, в том числе, <a href="https://www.reddit.com/r/programming/comments/jvrpvj/how_spotify_codes_work/">на Reddit</a>, где она породила интересную дискуссию. Случилось так, что сам <a href="https://en.wikipedia.org/wiki/Ludvig_Strigeus">Людвиг Стригеус</a>, ключевой разработчик Spotify, который и придумал эти коды, заглянул на огонек и поделился дополнительной информацией по их созданию и стоящей за ними логикой.</p>
<p>Текущая статья будет немного более технической, нежели предыдущая, поскольку здесь я постараюсь объяснить, как конкретно создаются коды Spotify. Для тех же, кто заинтересуется дальнейшим изучением темы, я перечислю в конце список полезных материалов.</p>
<h2><span>Кодирование URI в штрихкод Spotify</span></h2>
<br />
На мой взгляд, проще всего понять штрихкоды, начав с URI и проследовав по всему процессу кодирования.
<h3><span>Медиа-ссылка</span></h3>
<br />
Сначала Spotify генерирует медиа-ссылку для URI. Эта ссылка кодируется в штрихкод и связывает его с URI. Spotify поддерживает базу данных сопоставлений медиа-ссылок с URI.<br />
Медиа-ссылки позволяют ресурсу отслеживать сканирование кодов, в теории дают возможность пересопоставлять их и просто выглядят в кодированном виде красивее. Если бы Spotify кодировал весь URI, то выглядел бы он примерно как показано ниже, и сканировать его в таком виде было бы уже сложнее.
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/cx/qn/ge/cxqngeoq6u2wn7tzi3ahctwof2i.png" /></div>
<p>Начнем с медиа-ссылки <code>57639171874</code>, указывающей на следующий плейлист: <code>spotify:user:spotify:playlist:37i9dQZF1DWZq91oLsHZvy</code> (<a href="https://open.spotify.com/playlist/37i9dQZF1DWZq91oLsHZvy">Indie x Running</a>).</p>
<p>Эту медиа-ссылку можно выразить в виде 37-битного двоичного числа:</p>
<pre><code class="bash">57639171874 -> 0100010011101111111100011101011010110</code></pre>
<br />
<h3><span>Вычисление CRC</span></h3>
<br />
Далее для медиа-ссылки вычисляются биты <a href="https://en.wikipedia.org/wiki/Cyclic_redundancy_check">циклической проверки избыточности</a>. Делается это для оценки целостности данных. (Еще одним инструментом проверки контрольных сумм, используемым нами повседневно для проверки номеров кредитных карт, является <a href="https://en.wikipedia.org/wiki/Luhn_algorithm">алгоритм Луна</a>).
<p>Spotify использует CRC-8, которому соответствует следующий полином:</p>
<pre><code class="bash">x^8 + x^2 + x + 1</code></pre>
<br />
В полной записи он выглядит так:
<pre><code class="bash">1x^8 + 0x^7 + 0x^6 + 0x^5 + 0x^4 + 0x^3 + 1x^2 + x + 1
[1, 0, 0, 0, 0, 0, 1, 1, 1]</code></pre>
<br />
Вычисление CRC происходит по следующим этапам:
<p>1. Заполнение тремя битами справа.</p>
<pre><code class="bash">01000100 11101111 11110001 11010110 10110000</code></pre>
<br />
2. Реверсирование байт.
<pre><code class="bash">00100010 11110111 10001111 01101011 00001101</code></pre>
<br />
3. Стандартное вычисление CRC (старший бит слева).
<pre><code class="bash">11001100</code></pre>
<br />
4. Реверсирование CRC.
<pre><code class="bash">00110011</code></pre>
<br />
5. Инвертирование бит.
<pre><code class="bash">11001100</code></pre>
<br />
6. Присоединение к результату из шага 1.
<pre><code class="bash">01000100 11101111 11110001 11010110 10110110 01100
|----------Media Ref--------------------||--CRC--|</code></pre>
<p>Вот простая версия калькулятора crc (шаг 3):</p>
<pre><code class="bash">def crc(data, polynomial):
# выполнить операцию xor для данных с полиномом в каждом вхождении 1.
# Остаток вернуть в виде контрольной суммы.
n = len(polynomial) - 1
initial_length = len(data)
check_bits = data + [0] * n
for i in range(initial_length):
if check_bits[i] == 1:
for j, p in enumerate(polynomial):
check_bits[i + j] = check_bits[i + j] ^ p
return check_bits[-n:]</code></pre>
<br />
С помощью проверки бит можно удостовериться в том, что полученные данные соответствуют переданным «отправителем»:
<pre><code class="bash">def check_crc(data, polynomial, check_bits):
full_data = data + check_bits
for i in range(len(data)):
if full_data[i] == 1:
for j, p in enumerate(polynomial):
full_data[i + j] = full_data[i + j] ^ p
return 1 not in full_data
data = [0,0,1,0,0,0,1,0,1,1,1,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,0,1,0,1,1,0,0,0,0,1,1,0,1]
check = [1,1,0,0,1,1,0,0]
poly = [1,0,0,0,0,0,1,1,1]
print(check_crc(data, poly, check))
# True</code></pre>
<br />
<h3><span>Сверточное кодирование</span></h3>
<br />
Далее эти 45 бит проходят этап <a href="https://en.wikipedia.org/wiki/Convolutional_code">сверточного кодирования</a>. Сверточные коды добавляют в данные избыточность, делая возможным их декодирование в случае появления ошибок при передаче. Для более подробного знакомства с данной технологией рекомендую ознакомиться с <a href="http://web.mit.edu/6.02/www/f2010/handouts/lectures/L8.pdf">этими конспектами лекций MIT</a>.
<p><a href="https://www.freepatentsonline.com/20180181849.pdf">Патент</a> Spotify не очень ясен относительно того, какое сверточное кодирование выполняется:</p>
<blockquote>Затем код можно преобразовать в код, исправляющий ошибки, например, упреждающую коррекцию ошибок. При этом в качестве упреждающей коррекции ошибок может использоваться, к примеру, сверточный код.</blockquote>
<br />
Однако участник StackOverflow под ником «Doyle» <a href="https://stackoverflow.com/a/64950150/10703868">определил</a>, что Spotify использует следующие генераторные полиномы:
<pre><code class="bash">g0 = 1011011
g1 = 1111001</code></pre>
<br />
Этот полином представляет, какие биты входных данных должны быть проXORены вместе в скользящем окне.
<p><span>Откусывание хвоста (tail_bite)</span><br />
Прежде, чем мы начнем вычислять биты четности, нужно добавить в начало потока последние 6 бит данных:</p>
<pre><code class="bash">01000100 11101111 11110001 11010110 10110110 01100
|-----|
001100 01000100 11101111 11110001 11010110 10110110 01100
|----|</code></pre>
<br />
В виде альтернативы можно дополнить выходные данные нулями, но разработчики Spotify решили пойти по пути «откусывания хвоста».
<p><span>Кодирование</span><br />
Одновременно можно фокусироваться только на одном генераторе. Ниже представлен пошаговый проход по процессу генерации бит четности для <code>g0</code>. Полином я развернул наоборот, потому что в этом примере его проще отобразить справа налево.</p>
<pre><code class="bash">Bit #0
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
0001000 = 1 (xor the bits together)
Bit #1
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
0100001 = 0 (xor the bits together)
Bit #2
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
1100000 = 0 (xor the bits together)
Bit #3
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
1000100 = 0 (xor the bits together)
Bit #4
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
0001000 = 1 (xor the bits together)
Продолжаем до конца потока входных бит:
Bit #45
001100010001001110111111110001110101101011011001100
1101101 <- generator polynomial (mask)
-------
1001100 = 1 (xor the bits together)</code></pre>
<br />
Результат кодирования с помощью первого генератора, <code>g0</code>:
<pre><code class="bash">100011100111110100110011110100000010001001011</code></pre>
<br />
Результат кодирования с помощью <code>g1</code>:
<pre><code class="bash">110011100010110110110100101101011100110011011</code></pre>
<br />
Ниже приведен (простой) алгоритм для вычисления бит четности:
<pre><code class="bash">def encode(bits: List[int], polynomial: List[int], tail_bite=False):
"""Сверточное кодирование потока бит с помощью генераторного полинома.
Если tail_bite == True, добавляем хвост входных данных. В противном случае заполняем нулями. """
if tail_bite:
tail = bits[-(len(polynomial) - 1):]
else:
tail = [0 for i in range(len(polynomial) - 1)]
full = tail + bits
polynomial.reverse() # Реверсируем полином, так как работаем в обратном направлении
parity_bits = []
for i in range(len(bits)):
parity = 0
for j in range(len(polynomial)):
parity ^= full[i + j] * polynomial[j]
parity_bits.append(parity)
return parity_bits</code></pre>
<br />
Затем эти две последовательности битов четности чередуются (abab…):
<pre><code class="bash">1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
1 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 1 0 1 1
result:
110100001111110000101110111100110100111100011010111001110001000101011000010110000111001111</code></pre>
<br />
<span>Перфорирование</span><br />
На этом этапе мы перешли от 45 к 90 бит. Скорость этого сверточного кода равна ½ (на один входной бит генерируется 2 бита четности).
<p>Скорость ½ в данном контексте маловата (рекомендую почитать <a href="https://blog.qrstuff.com/2011/12/14/qr-code-error-correction">статью</a> о скорости работы QR-кодов). Ее можно повысить путем «перфорирования» кода, подразумевающего удаление каждого третьего бита. Так мы увеличим скорость до ¾:</p>
<pre><code class="bash">110100001111110000101110111100110100111100011010111001110001000101011000010110000111001111
11 10 00 11 11 00 10 11 11 10 11 10 11 10 01 01 11 00 11 00 00 10 01 00 01 11 00 11 00 11
result:
111000111100101111101110111001011100110000100100011100110011</code></pre>
<br />
Это равнозначно перфорированию последовательностей двух бит четности с паттернами <code>101</code> и <code>110</code> перед их чередованием. Перфорирование – это красивый и простой способ увеличить скорость кода после оценки частоты ожидаемых ошибок.
<h3><span>Пермутация</span></h3>
<br />
После этого Spotify перемешивает данные, чтобы в случае утраты всего штриха ошибки распределились по всей структуре:
<blockquote>Процесс перемешивания используется для распределения потенциальных ошибок (например, если утрачивается целый штрих/интервал). В итоге утраченные биты в кодовом слове идут непоследовательно, что увеличивает эффективность упреждающей коррекции ошибок, когда утрачивается целый штрих или интервал. Далее, чтобы отсканировать оптический код после того, как длины найденных штрихов достоверно конвертированы в биты, эти биты перемешиваются обратно в правильном порядке.<br />
<a href="https://www.freepatentsonline.com/20180181849.pdf">Источник</a></blockquote>
<br />
Перемешивание бит происходит путем выбора из входных данных каждого 7-го (по модулю 60).
<pre><code class="bash">def permute(bits, step=7):
for i in range(len(bits)):
yield bits[(i * step) % len(bits)]</code></pre>
<br />
Вход и результат:
<pre><code class="bash">111000111100101111101110111001011100110000100100011100110011
111100110001110101101000011110010110101100111111101000111000</code></pre>
<br />
<span>Сопоставление с высотами штрихов</span><br />
В завершении с помощью <a href="https://en.wikipedia.org/wiki/Gray_code">кода Грея</a> биты сопоставляются с высотами штрихов, чьи значения варьируются от от 0 до 7:
<pre><code class="bash">Десятичный Двоичный Грей
0 000 000
1 001 001
2 010 011
3 011 010
4 100 110
5 101 111
6 110 101
7 111 100</code></pre>
<pre><code class="bash">111 100 110 001 110 101 101 000 011 110 010 110 101 100 111 111 101 000 111 000
5 7 4 1 4 6 6 0 2 4 3 4 6 7 5 5 6 0 7 0</code></pre>
<br />
В качестве точек привязки добавляются три дополнительных штриха: в начале, в конце и в 12-й позиции:
<pre><code class="bash">[0]5741466024[7]3467556070[0]</code></pre>
<br />
В результате получается итоговый код Spotify:
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/g1/re/an/g1reanjxzjjtmyhhisxm6k3gfi8.png" /></div>
<h2><span>Декодирование</span></h2>
<br />
Еще раз повторим, зачем мы прошли через процесс вычисления CRC и сверточного кодирования данных:
<ol>
<li>Сверточные коды позволяют нам исправлять ошибки в сообщении путем отправки вместе с этим сообщением «избыточных» бит.</li>
<li>CRC позволяет клиенту проверять достоверность декодированного кода Spotify. Если контрольные биты оказываются не верны, клиент может просканировать код повторно. Если же они сходятся, тогда клиент может обратиться к серверам Spotify. Как говорит Людвиг: «Я решил включить CRC, чтобы позволить клиенту с легкостью отклонять неверные коды без необходимости обращения к бэкенду».</li>
</ol>
<br />
Процесс преобразования изображения кода Spotify в медиа-ссылку следует примерно тем же шагам, что и кодирование в обратном направлении. Однако по декодированию сверточного кода есть немаловажная теоретическая часть.
<h3><span>Сверточное декодирование</span></h3>
<br />
Глубокое знакомство с различными алгоритмами, используемыми для декодирования сверточного кода, выходит за рамки текущей статьи. Однако я настоятельно рекомендую вам ознакомиться с <a href="http://web.mit.edu/6.02/www/s2012/handouts/8.pdf">этими конспектами MIT</a>, посвященными алгоритму Витерби, чтобы сформировать отчетливое понимание об одном из таких алгоритмов.
<p>Если коротко, то он предоставляет способ определения более вероятной исходной последовательности на основе потоков бит четности. Эта треллис-диаграмма является визуальным представлением алгоритма – нахождение пути с наименьшим числом ошибок через потоки бит четности.</p>
<p><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/7n/ey/wo/7neywo7sbswhm8ax_hviixpnjcc.png" /><br />
<i><span>Треллис-диаграммы представляют удобный способ просмотра задачи декодирования и помогают понять эволюцию конечного автомата во времени</span></i></p>
<h2><span>Рабочее решение</span></h2>
<br />
Если вы хотите увидеть рабочий декодер, то можете ознакомиться с <a href="https://github.com/boonepeter/boonepeter.github.io-code/tree/main/spotify-codes-part-2">этим кодом</a>. Вам понадобится получить от Spotify личный токен доступа, потому что код должен обращаться к их серверу поиска соответствий <code>media_ref -> uri</code>. Отмечу, что в коде задействуется решение Дойла из разряда линейной алгебры.
<p>Я проверил это решение еще на нескольких кодах Spotify:</p>
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/fz/7t/6a/fz7t6akvcs-yaqsayrp5cchcl7k.png" /></div>
<pre><code class="bash">heights: [0, 6, 6, 0, 7, 6, 0, 2, 2, 3, 1, 7, 0, 7, 6, 4, 6, 1, 4, 7, 4, 1, 0]
media ref: 26560102031
uri: spotify:track:1ykrctzPhcSS9GS3aHdtMt</code></pre>
<br />
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/ez/wz/sv/ezwzsv1gx-s47wragkdxyruhxr0.png" /></div>
<pre><code class="bash">heights: [0, 2, 6, 7, 1, 7, 0, 0, 0, 0, 4, 7, 1, 7, 3, 4, 2, 7, 5, 6, 5, 6, 0]
uri: spotify:user:jimmylavallin:playlist:2hXLRTDrNa4rG1XyM0ngT1
media ref: 67775490487</code></pre>
<br />
<div><img src="https://habr.com/img/image-loader.svg" data-src="https://habrastorage.org/webt/ed/ca/_q/edca_qqpmcoumwgs0zzkwjxaj1y.png" /></div>
<pre><code class="bash">heights: [0, 5, 7, 4, 1, 4, 6, 6, 0, 2, 4, 7, 3, 4, 6, 7, 5, 5, 6, 0, 5, 0, 0]
uri: spotify:user:spotify:playlist:37i9dQZF1DWZq91oLsHZvy
media ref: 57639171874</code></pre>
<br />
Думаю, будет уместно поделиться показавшимся мне забавным предложением из <a href="https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.341.7314&rep=rep1&type=pdf">статьи</a> об алгоритме Витерби:
<blockquote>Вскоре после этого, в работе, вышедшей 23 мая 1968 года, Джим Омура заметил, что VA (алгоритм Витерби) был <b>просто</b> <i>стандартным решением прямого динамического программирования для декодирования по максимальному правдоподобию динамической системы с дискретным временем и конечным состоянием, наблюдаемой в шуме без запоминания.</i></blockquote>
<br />
Не знаю как вы, но я бы не стал описывать <i>«стандартное решение прямого динамического программирования для декодирования по максимальному правдоподобию динамической системы с дискретным временем и конечным состоянием, наблюдаемой в шуме без запоминания»</i> словом «простое».
<p>Целью моей статьи было попытаться объяснить процесс кодирования Spotify доступным образом. Надеюсь, что мне это удалось.</p>
<h2><span>Дополнительные материалы</span></h2>
<br />
<a href="https://habr.com/en/post/518970/">Как спрятать мусор в базе Spotify и превратить это в квест</a>
<p><a href="https://zlib.net/crc_v3.txt">CRC Rocksoft</a></p>
<p><a href="https://trs.jpl.nasa.gov/bitstream/handle/2014/34531/94-0881.pdf?sequence=1">Reed-Solomon Codes and the Exploration of the Solar System</a></p>
<p><a href="https://doi.org/10.1109/TCOM.1984.1096047">High-Rate Punctured Convolutional Codes for Soft Decision Viterbi Decoding</a></p>
<p><a href="http://web.mit.edu/6.02/www/s2012/handouts/8.pdf">Viterbi Decoding of Convolutional Codes</a></p>
<p><a href="http://web.mit.edu/6.02/www/f2010/handouts/lectures/L8.pdf">Convolutional codes (MIT lecture notes)</a></p>
<p><a href="https://doi.org/10.1109/TIT.1967.1054010">Viterbi Decoder<br /></a><br />
<a href="https://www.mathworks.com/help/comm/ug/punctured-convolutional-encoding-in-simulink.html">Punctured Convolutional Encoding<br /></a><br />
<a href="https://ipnpr.jpl.nasa.gov/progress_report/42-63/63H.PDF">Performance of concatenated codes for deep space missions</a></p>
<p><a href="https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-02-introduction-to-eecs-ii-digital-communication-systems-fall-2012/lecture-slides/MIT6_02F12_lec06.pdf">Convolutional Codes and State Machine View/Trellis (MIT Slides)</a></p>
<p><a href="http://www.eccpage.com/">The Error Correcting Codes Page</a></p>
<p><a href="https://math.stackexchange.com/a/1284885">Explanation on Math Stack Exchange</a></p>
<p><a href="https://ruvds.com/ru-rub/news/read/151?utm_source=habr&utm_medium=article&utm_campaign=Bright_Translate&utm_content=kak_rabotayut_kody_spotify_%E2%80%94_chast_2"><img src="https://habrastorage.org/r/w780q1/webt/kg/hq/9z/kghq9za934md5ceo14bxovinlgy.jpeg" data-src="https://habrastorage.org/webt/kg/hq/9z/kghq9za934md5ceo14bxovinlgy.jpeg" data-blurred="true" /></a></p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-72176471843044431212021-12-10T15:36:00.005+03:002021-12-10T15:36:53.048+03:00В «СберБанк Онлайн» появилась опция «дать в долг» с предупреждением должника вернуть в срок деньги<img src="https://habrastorage.org/r/w780q1/webt/he/to/pf/hetopfoc0wvzpttx9rcykakfl0m.jpeg" data-src="https://habrastorage.org/webt/he/to/pf/hetopfoc0wvzpttx9rcykakfl0m.jpeg" data-blurred="true" />
<p>10 декабря 2021 года «Сбер» <a href="https://press.sber.ru/publications/dat-v-dolg-novyi-servis-v-sberbank-onlain" rel="nofollow noopener noreferrer">сообщил</a>, что добавил в мобильное приложение «СберБанк Онлайн» опцию для физлиц под названием «дать в долг».<br />
Теперь пользователь может через меню «диалоги» в приложении перечислить определенную сумму в долг другому клиенту банка с указанием срока возврата.</p>
<p>После перевода денег в долг получателю придет пуш-уведомление, а в общем чате в приложении появится возможность отслеживать время возврата долга. За несколько ней до истечения этого времени новая функция сама напомнит должнику о необходимости возврата долга с помощью пуш-уведомления.</p>
<p>«Сбер» уточнил, что это информационная опция для частных лиц, чтобы помочь им фиксировать такие операции и не забывать о должниках. При ее активации не будет происходить автоматического возврата денег со счета должника после окончания срока, на который был выдан долг. В любом случае это частное лицо должно будет само вернуть деньги обратно тому клиенту банка, у которого он их попросил.</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-21041162218631670902021-12-10T15:36:00.003+03:002021-12-10T15:36:51.667+03:00Vange-rs: взгляд на реализацию WebAssembly в Rust<p>Вангеры - это одна из самых почитаемых и технологичных игр своего времени (1998 год), и она продолжает жить и развиваться. Благодаря сплоченному сообществу игра получила множество усовершенствований: HD, 60 FPS, новые сетевые режимы и много другое. Vange-rs один из интереснейших проектов по Вангерам. Это rust версия игры, основной изюминкой которой является 3D рендер основанный на wgpu.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/webt/z8/ai/lm/z8ailmuaw6cp8etxyabdfgwyviw.jpeg" alt="Трассировка лучей (vange-rs)" title="Трассировка лучей (vange-rs)" width="2120" height="1187" data-src="https://habrastorage.org/webt/z8/ai/lm/z8ailmuaw6cp8etxyabdfgwyviw.jpeg" data-blurred="true" />
<figcaption>Трассировка лучей (vange-rs)</figcaption>
</figure>
<p><em>wgpu</em> - кроссплатформенное, безопасное графическое API написанное исключительно на rust. Может использовать Vulkan, Metal, D3D12, D3D11, OpenGL ES3 нативно, а также WebGPU и WebGL в WebAssembly.</p>
<p>Можно сказать, что этот проект показывает всю мощь и возможности библиотеки. Vange-rs содержит исчерпывающее <a href="https://github.com/kvark/vange-rs/wiki/Rendering-Techniques" rel="noopener noreferrer nofollow">описание</a> технологий применимых для рендеринга миров Вангеров. Даже сама возможность покататься на мехосе в полноценном 3D выглядит очень круто. И вдвойне было бы круто сделать это через браузер.</p>
<p>Тем более это должно быть не сложно, ведь Rust позиционируется как современный язык с поддержкой WebAssembly, однако не все так просто.</p>
<h3>Мир безграничных возможностей</h3>
<p>Документация Rust обещает нам поддержку аж целых трёх возможных вариантов компиляции в WebAssembly. (<a href="https://doc.rust-lang.org/nightly/rustc/platform-support.html#tier-2" rel="noopener noreferrer nofollow">Tier 2</a>: rustc гарантированно собирается).</p>
<p><strong>wasm32</strong> - архитектура, <strong>unknown</strong> - вендор, <strong>emscripten | unknown | wasi</strong> - операционная система. Для всех платформ заявлена поддержка стандартной библиотеки (функции работы с файловой системой, временем и пр.).</p>
<h3>wasm32-unknown-emscripten</h3>
<p><a href="https://emscripten.org/" rel="noopener noreferrer nofollow">Emscripten</a>, пожалуй, старейший и самый развитый инструмент для компиляции из C/C++ в WebAssembly. Из коробки поддерживаются практически все функции posix, виртуальная файловая система, OpenGL ES3. Формально используя emscripten можно скомпилировать проект в рабочий WebAssembly без каких-либо изменений. По факту это совсем не так.</p>
<p>Чтобы скомпилировать проект с использованием emscripten достаточно передать флаг <strong>--target wasm32-unknown-emscripten</strong> к вызову <em>cargo</em>.</p>
<p>Rust выполняет компиляцию кода приложения, а на последнем этапе использует <em>emcc</em> для линковки в WebAssembly. К сожалению, в компилятор <a href="https://github.com/rust-lang/rust/blob/master/compiler/rustc_target/src/spec/wasm32_unknown_emscripten.rs#L20-L23" rel="noopener noreferrer nofollow">зашит</a> флаг, вызывающий ошибку в случае обнаружения не реализованных символов (<em>ERROR_ON_UNDEFINED_SYMBOLS=1)</em>. Из-за этого даже hello-world проект на данный момент <a href="https://stackoverflow.com/questions/67474533/error-in-compiling-rust-into-webassembly-using-emscripten-on-windows" rel="noopener noreferrer nofollow">не может быть собран</a> с помощью emscripten.</p>
<p>Конфигурационные флаги из <em>rustc</em> добавляются всегда в конец, поэтому ситуацию невозможно исправить даже через RUSTFLAGS. И если проблему символов ещё можно обойти, добавив соответствующую реализацию в cpp файл (как указано по ссылке), то <em>ASSERTIONS=1</em> будет с нами всегда. Т.е. собрать проект без отладочного кода средствами rust невозможно!</p>
<p>Emscripten позволяет изменить это поведение через переменную окружения о которой мало кто знает:</p>
<pre><code class="bash">EMMAKEN_CFLAGS="-s ERROR_ON_UNDEFINED_SYMBOLS=0 --no-entry -s ASSERTIONS=0" </code></pre>
<p>Таким образом эту проблему можно решить, но этого будет мало. Большинство библиотек, которые имеют поддержку WebAssembly пытаются взаимодействовать с браузером через библиотеки-обертки, такие как <a href="https://rustwasm.github.io/wasm-bindgen/web-sys/index.html" rel="noopener noreferrer nofollow">web-sys</a> и <a href="https://github.com/koute/stdweb" rel="noopener noreferrer nofollow">stdweb</a>. Они предоставляют API браузера, например, WebGL через систему типов Rust. <em>web-sys</em> основан на <em>wasm-bindgen</em> и поэтому он не совместим с emscripten.</p>
<blockquote readability="6">
<p>The <em>wasm-bindgen</em> project is designed to target the wasm32-unknown-unknown target in Rust. This target is a "bare bones" target for Rust which emits WebAssembly as output.</p>
</blockquote>
<p>Если вы попробуете запустить <em>web-sys</em> проект использует <em>--target wasm32-unknown-emscripten</em>, то произойдет ошибка:</p>
<blockquote readability="5">
<p>cannot call wasm-bindgen imported functions on non-wasm targets</p>
</blockquote>
<p><em>wasm-bindgen</em> для работы требует изменения полученного <em>wasm</em> файла, а конкретно "функции заглушки" заменяются на вызовы импортированных функций из js, вот что пишет один из авторов о возможной поддержке emscripten:</p>
<blockquote readability="12">
<p>AFAIK emscripten wants its own JS shims and all that, and having two systems of managing shims won't mix well.</p>
<p>...</p>
<p>wasm-bindgen doesn't support the emscripten wasm target at this time. I haven't ever tested it myself so I don't know how far off we would be from getting it to work, but it's expected that emscripten doesn't work at the moment.</p>
</blockquote>
<p>Таким образом <em>wasm-bindgen</em> фактически не совместим с emscripten, значит и все библиотеки основанные на <em>web-sys</em> тоже. На данный момент это вообще <strong>все библиотеки</strong>. Поскольку <em>stdweb</em> фактически мертв:</p>
<ul readability="0.482421875">
<li readability="0">
<p><a href="https://github.com/rust-windowing/winit/issues/1662" rel="noopener noreferrer nofollow">winit</a> (библиотека для работы с окнами) отказывается от поддержки <em>stdweb</em></p>
</li>
<li readability="0.97037037037037">
<p><a href="https://github.com/rust-lang/rust/issues/66916" rel="noopener noreferrer nofollow">rust</a> не генерирует правильный <em>wasm</em> для <em>stdweb</em>, начиная с nightly-2019-11-25. <strong>Уже 2 года как.</strong></p>
</li>
</ul>
<p>Я пробовал использовать <em>stdweb</em> в связке с <em>winit</em>, и ошибка rust (ссылка выше) не дает сделать это. А вот ещё почему vange-rs не будет работать с emscripten:</p>
<ul readability="0">
<li readability="-0.92592592592593">
<p><a href="https://github.com/gfx-rs/wgpu/discussions/2179" rel="noopener noreferrer nofollow">wgpu</a> <strong>пока</strong> не поддерживает emscripten</p>
</li>
<li readability="-0.92592592592593">
<p><a href="https://github.com/grovesNL/glow/issues/189" rel="noopener noreferrer nofollow">glow</a> <strong>пока</strong> не поддерживает emscripten</p>
</li>
<li readability="-0.96052631578947">
<p><a href="https://github.com/ron-rs/ron/issues/335" rel="noopener noreferrer nofollow">ron</a> не компилируется для emscripten из-за ошибки</p>
</li>
</ul>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" alt="Экспертное мнение о поддержке emscripten в rust" title="Экспертное мнение о поддержке emscripten в rust" height="562" data-src="https://habrastorage.org/webt/x0/pk/mm/x0pkmmh7h863rvuewyga8pvc7t8.png" data-width="1000" />
<figcaption>Экспертное мнение о поддержке emscripten в rust</figcaption>
</figure>
<p>Я понял одну вещь, rust сообщество пытается использовать emscripten неправильно. Сильное заявление, но это так. Вся соль emscripten в том, что он предоставляет идентичное окружение что и обычная <em>*nix</em> система, и поэтому пытаться использовать его совместно с обертками вроде <em>web-sys</em> или <em>stdweb</em> не нужно.</p>
<p>Например, в библиотеке <em>wgpu</em> для OpenGL ES3 бэкенда на линуксе используются библиотеки <a href="https://crates.io/crates/khronos-egl/4.1.0" rel="noopener noreferrer nofollow">khronos-egl</a> и <a href="https://github.com/grovesNL/glow" rel="noopener noreferrer nofollow">glow</a>. Когда происходит компиляция в WebAssembly <em>khronos-egl</em> отключается и вместо него используются обертки <em>web-sys</em> и <em>glow</em>. Но, для emscripten это делать не нужно, поскольку он эмулирует полноценную систему с OpenGL ES3. Таким образом нужно просто использовать тот же код что и для нативной платформы. Если думать таким образом, то можно легко добавить поддержку emscripten и в <a href="https://github.com/gfx-rs/wgpu/pull/2233" rel="noopener noreferrer nofollow">wgpu</a> и в <a href="https://github.com/grovesNL/glow/pull/195" rel="noopener noreferrer nofollow">glow</a>.</p>
<p>Сделав это, мы наконец-то сможем скомпилировать vange-rs. Пришлось полностью отказаться от библиотеки <em>winit</em>, поскольку мы используем emscripten, то и создавать окно нам нет необходимости. В случае браузера это всего лишь <em>canvas</em> который мы создадим в <em>index.html</em>. Остается передать WebGL контекст в <em>wgpu</em>. Библиотека имеет достаточно высокую степень абстракции чтобы принять в качестве хэндла окна заглушку.</p>
<pre><code class="rust">struct WebWindow {
}
unsafe impl HasRawWindowHandle for WebWindow {
fn raw_window_handle(&self) -> RawWindowHandle {
RawWindowHandle::Web(WebHandle::empty())
}
}
// ...
let window = WebWindow {};
let surface = unsafe { instance.create_surface(&window) }; </code></pre>
<p><em>wgpu</em> будет считать, что окно создано, хотя по факту его нет, есть только контекст WebGL (OpenGL ES3), который вернется через нативный <em>krhonos-egl</em>. Удалив <em>winit</em> мы лишились управления с клавиатуры, поскольку библиотека делала это за нас, но добавить пару обработчиков мы легко сможем вернуть его. Таким образом это действительно работает, хоть и с большими оговорками.</p>
<p>К сожалению, во многих обсуждениях я видел мнение что rust отказывается от <em>wasm32-unknown-emscripten</em> в пользу <em>wasm32-unknown-unknown</em>. Я считаю это мнение не обоснованным, так как у emscripten достаточно много своих плюсов, которые возможно никогда не появятся в <em>unknown</em>, например поддержка <a href="https://emscripten.org/docs/porting/asyncify.html" rel="noopener noreferrer nofollow">asyncify</a>, 3 вида файловых систем на выбор, сетевой стэк и пр.</p>
<h3>wasm32-unknown-unknown</h3>
<p>Все внимание сообщества сосредоточено на <em>обожаемых web-sys</em> и <em>wasm-bindgen</em>, ну они-то должны работать из коробки? Ммм, нет... Собирается все действительно без особых проблем, передаем флаг <strong>--target wasm32-unknown-unknown</strong> и запускаем в браузере:</p>
<blockquote readability="5">
<p>panic: operation not supported on this platform</p>
</blockquote>
<p>Функции работы с файловой системы не поддерживаются.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/ab4/a71/4ac/ab4a714acb874cadb91cccd650fcedc2.jpg" alt="???" title="???" width="925" height="805" data-src="https://habrastorage.org/getpro/habr/upload_files/ab4/a71/4ac/ab4a714acb874cadb91cccd650fcedc2.jpg" data-blurred="true" />
<figcaption>???</figcaption>
</figure>
<p>Очевидно, что игра не сможет запуститься без файлов. Напомню, что в emscripten это решено довольно просто: по умолчанию используется файловая система в памяти, она реализует стандартные функции работы с файлами, в неё можно загрузить образ диска перед запуском. Это вполне логичное решение и, как кажется, в Rust можно было бы применить схожий подход (использование виртуальной файловой системы), тогда такой код работал бы:</p>
<pre><code class="rust"> File::create(file).expect(&format!("Unable to create {}", file))
.write(include_bytes!("../file"))
.expect(&format!("Unable to write in {}", file)); </code></pre>
<p>У нас нет файлов в файловой системе, но мы могли бы их создать: загрузить через <em>wasm-bidngen</em> или просто вставив в дата секцию. Однако, это не работает, потому что реализация файловой системы в случае с unknown просто <a href="https://github.com/rust-lang/rust/blob/master/library/std/src/sys/unsupported/fs.rs#L178" rel="noopener noreferrer nofollow">отсутствует</a>. И не только файловой системы, так же отсутствует какая-либо реализация для потоков или времени. Даже <em>env_logger</em> не будет работать из коробки, потому что он пытается получить текущее время, а эта функция не реализована.</p>
<p>Весь драматизм в том, что unknown используется не только на архитектуре <em>wasm32</em>, и нельзя сделать исправление только для <em>wasm32</em>. Т.е. варианта два, либо переписать vange-rs полностью отказавшись от библиотек и кода работающих с файловой системой, либо исправить <em>rustc</em> добавив в него поддержку файловой системы в памяти.</p>
<p>Очевидно что мы выбираем <a href="https://github.com/caiiiycuk/rust-memfs" rel="noopener noreferrer nofollow">второе</a>. Было не просто, особенно если учесть, что я прочитал только избранные главы из rust book. Но в итоге получилось ведь!</p>
<p>Комичный случай, я несколько дней безуспешно пытался собрать компилятор <em>rust</em>, используя команду:</p>
<pre><code class="bash">./x.py build library/std --target wasm32-unknown-unknown</code></pre>
<p>Команда отрабатывала, но использовать это компилятор я не мог, из-за ошибки:</p>
<blockquote readability="5">
<p>error[E0463]: can't find crate for `core`</p>
</blockquote>
<p>Оказалось, что нужно передавать одновременно <strong>2 архитектуры</strong> (<em>--target x86_64-unknown-linux-gnu --target wasm32-unknown-unknown</em>):</p>
<blockquote readability="7">
<p>You need to use --target x86_64-unknown-linux-gnu --target wasm32-unknown-unknown". If you don't include the host in --target you can't build build scripts and proc macros that need to be compiled for the host.</p>
</blockquote>
<p>Сделав это, я наконец-то получил рабочий компилятор с виртуальной файловой системой. В моем репозитории можно скачать собранный вариант для <a href="https://github.com/caiiiycuk/rust-memfs/releases" rel="noopener noreferrer nofollow"><strong>x86_64-unknown-linux-gnu</strong></a>. Собрав или скачав компилятор, просто регистрируем его в <em>rustup</em> и применяем для проекта:</p>
<pre><code class="bash">rustup toolchain link memfs memfs/stage1
cd <project>
rustup override set memfs </code></pre>
<p>А дальше собираем как обычно через <em>сargo build</em>. Вы удивитесь, но <em>winit</em> тоже не способен ловить события клавиатуры из-за <a href="https://github.com/rust-windowing/winit/issues/2090" rel="noopener noreferrer nofollow">ошибки</a>, так что, как и в случае emscripten приходится реализовывать этот функционал самостоятельно, до тех пор, пока не поправят <em>winit</em>.</p>
<p>Решив эти проблемы, мы наконец-то получаем рабочую версию vange-rs для браузера!</p>
<h3>wasm32-unknown-wasi</h3>
<p>Поскольку <em>wasm-bindgen</em> не поддерживает ничего кроме <em>unknown</em>, то мы имеем все те же проблемы что и у emscripten. Кроме того, wasi предназначен для <em>node.js</em>, а не для браузера. Поэтому экспериментировать с ним я не стал.</p>
<h3>Вместо выводов</h3>
<p>Вероятно, rust еще слишком молод, и поддержка WebAssembly находится на экспериментальном уровне. Не смотря на большое количество потребовавших усилий оба варианты компиляции (emscripten, unknown) работают! Какой из них проще - решать вам, для unknown придется собрать компилятор, а в случае с emscripten придется отказаться от большинства библиотек. Но результат в обоих случаях вас порадует, ведь нет ничего невозможного.</p>
<p>Огромное спасибо <a href="https://t.me/vangers" rel="noopener noreferrer nofollow">сообществу Вангеров</a> и Дмитрию (<a href="https://habr.com/ru/users/kvark/" rel="noopener noreferrer nofollow">@kvark</a>) - автору проекта vange-rs и участнику <em>wgpu,</em> за саму возможность покататься на мехосах в 3D и помощь в исправлении ошибок WebGL.</p>
<p><strong>Ссылки</strong></p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-18187758735102004362021-12-10T15:36:00.001+03:002021-12-10T15:36:50.224+03:00Суд в Лондоне разрешил экстрадировать Джулиана Ассанжа в США, его защита подает апелляцию<img src="https://habrastorage.org/r/w780q1/getpro/habr/post_images/a2a/f61/016/a2af610167e315df9cb81d196ab3f45a.jpg" alt="image" data-src="https://habrastorage.org/getpro/habr/post_images/a2a/f61/016/a2af610167e315df9cb81d196ab3f45a.jpg" data-blurred="true" /><br />
<i>В апреле 2019 года полиция Лондона арестовала Ассанжа после того, как он был лишен убежища в посольстве Эквадора.</i>
<p>По <a href="https://www.reuters.com/world/us/united-states-wins-appeal-over-extradition-wikileaks-founder-assange-2021-12-10/" rel="nofollow noopener noreferrer">информации</a> Reuters, cуд в Лондоне <a href="https://www.bbc.co.uk/news/uk-59608641" rel="nofollow noopener noreferrer">разрешил</a> экстрадировать Джулиана Ассанжа в США. Его защита собирается подать апелляцию по этому решению. Год назад этот же суд отказал США в экстрадиции Ассанжа.<br />
Сейчас дело об экстрадиции Ассанжа возвращено в Вестминстерский магистратский суд, который рассматривал вопрос о выдаче Ассанжа изначально. Невеста Ассанжа Стелла Морис рассказала СМИ, что адвокаты Ассанжа готовят апелляцию по этому решению. По ее мнению, это опасное и ошибочное решение.</p>
<p>Лондонский суд принял во внимание заявления представителей госорганов обвинения из США, что они минимизируют риск самоубийства Ассанжа после экстрадиции. Также представлявшие США адвокаты пообещали, что Ассанж будет содержаться в американской тюрьме в обычных условиях, к нему не будут приниматься жесткие меры, если он в будущем сам не совершит деяния, за которое их заслужит. Всего США предоставили суду четыре гарантии безопасности, в том числе то, что Ассанж не будет подвергаться одиночному заключению до или после суда или содержаться в тюрьме строгого режима в случае экстрадиции.</p>
<p>СМИ пояснили, что в настоящее время неясно, может ли Ассанж оспорить свою экстрадицию, хотя лорд-судья Холройд указал в суде, что основатель Wikileaks пытался подать новую апелляцию.</p>
<p>Сейчас Ассанжу 50 лет и он находится в британской тюрьме в отдельной камере. Восемь лет он провел взаперти, <a href="https://habr.com/ru/post/149709/">скрываясь</a> с июня 2012 года в посольстве Эквадора в Лондоне.</p>
<p>Ассанж несколько раз <a href="https://habr.com/ru/post/284744/">получал</a> повестки от органов правопорядка, по которым он должен был прийти в полицейское управление для экстрадиции в США, где ему предъявлено в общей сложности 17 обвинений в шпионаже и в сговоре с экс-информатором этой организации Челси Мэннинг с целью взлома правительственных компьютерных систем для распространения секретных военных документов в 2010-2011 годах.</p>
<p>В случае экстрадиции в США основатель WikiLeaks может быть приговорен к 175 годам заключения в тюрьме строгого режима. Хотя обвинители США заявляли, что приговор будет мягче, скорее всего, обвинение потребует от четырех до шести лет тюрьмы.</p>
<p>Специальный докладчик ООН по пыткам профессор Нильс Мельцер (Nils Melzer) в 2019 году <a href="https://habr.com/ru/post/460623/">рассказал</a> о методах психологического давления на Ассанжа, вплоть до пыток, во время его пребывания внутри посольства и в тюрьме.</p>
<p>В начале апреля 2019 года Ассанж был лишен убежища в посольстве Эквадора «за неоднократные нарушения международных конвенций». Фактически посольству пришлось его выдать властям Великобритании. 11 апреля 2019 года в Лондоне по запросу США Ассанжа <a href="https://habr.com/ru/post/447738/">арестовала</a> столичная полиция Лондона.</p>
<p>В сентябре 2020 года тюремный психиатр <a href="https://shadowproof.com/2020/09/23/doctor-assange-aspergers-prison-extradition-trial/" rel="nofollow noopener noreferrer">диагностировал</a> у основателя WikiLeaks Джулиана Ассанжа синдром Аспергера (форма аутизма).</p>
<p>В октябре 2020 года адвокаты основателя WikiLeaks <a href="https://dissenter.substack.com/p/fbi-seized-legally-privileged-materials" rel="nofollow noopener noreferrer">выяснили</a>, что ФБР изъяло у Джулиана Ассанжа все юридически привилегированные материалы после его ареста, включая записи из его личного архива. А без этой информации проводить полноценную защиту по его делу об экстрадиции стало затруднительно.</p>
<p>В середине декабря 2020 года появились слухи, что президент США Дональд Трамп собирается помиловать Ассанжа. Но это, как уточнил в Twitter экс-сотрудник американских спецслужб Эдвард Сноуден, <a href="https://twitter.com/Snowden/status/1338545776860028929" rel="nofollow noopener noreferrer">оказалось</a> в итоге неверной информацией.</p>
<p>4 января 2021 года Центральный уголовный суд Лондона <a href="https://habr.com/ru/news/t/536074/">отказал</a> США в экстрадиции основателя WikiLeaks Джулиана Ассанжа. Адвокаты американской стороны <a href="https://iz.ru/1124221/2021-02-12/administratciia-ssha-namerena-dobivatsia-vydachi-assanzha" rel="nofollow noopener noreferrer">обжаловали</a> данное решение. 6 января британской суд <a href="https://twitter.com/wikileaks/status/1346780334201970690" rel="nofollow noopener noreferrer">отказал</a> Джулиану Ассанжу в освобождении под залог и оставил под стражей до рассмотрения апелляции США по экстрадиции. Защита Ассанжа <a href="https://www.interfax.ru/world/744180" rel="nofollow noopener noreferrer">уверяла</a>, что риска побега нет. Администрация США продолжила добиваться выдачи Ассанжа.</p>
<p><img src="https://habrastorage.org/r/w780q1/webt/cu/ef/d1/cuefd1wfyk7n0qepgnu1u0bfw40.jpeg" data-src="https://habrastorage.org/webt/cu/ef/d1/cuefd1wfyk7n0qepgnu1u0bfw40.jpeg" data-blurred="true" /><i>Ассанж после заседания суда по его экстрадиции в начале 2020 года. Источник фото: Reuters.</i></p>
<p>26 июня 2021 года один из основных свидетелей по делу США против Ассанжа исландец Сигурдур Инги Тордарсон <a href="https://iz.ru/1184680/2021-06-26/svidetel-po-delu-protiv-assanzha-priznalsia-v-dache-lozhnykh-pokazanii" rel="nofollow noopener noreferrer">признался</a>, что сфабриковал ключевые показания против основателя WikiLeaks. Именно эти материалы США использовало в своем обвинительном заключении. Тордарсон был завербован сотрудниками ЦРУ США и использовался внутри WikiLeaks для сбора информации и данных, которые спецслужбы не могли получить самостоятельно.</p>
<p>В сентября 2021 года СМИ <a href="https://habr.com/ru/news/t/580110/">сообщили</a>, что спецслужбы США и администрация бывшего президента страны Дональда Трампа планировали несколько вариантов похищения из Великобритании и даже убийства основателя WikiLeaks Джулиана Ассанжа. Фактически они хотели объявить войну WikiLeaks и всем, кто связан с этой организацией, несколько лет плотно следили за всеми ее сотрудниками по всему миру, фиксировали на видео все действия Ассанжа в посольстве Эквадора. По данным многочисленных источников журналистов Yahoo News, планирование убийства основателя WikiLeaks велось на самых высоких уровнях администрации президента Трампа. Ассанжу повезло, что эти планы так и не были одобрены президентом и высшими чинами администрации, хотя руководство ЦРУ настаивало на немедленном выполнении операции хотя бы в части похищения и засекречивания его местоположения.</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-85228209142824773782021-12-10T09:36:00.001+03:002021-12-10T09:36:07.884+03:00Кровавый клад универмага Fenwick<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/386/6fc/edd/3866fceddc020ab4ee4fed5449b2f79a.jpg" width="640" height="428" data-src="https://habrastorage.org/getpro/habr/upload_files/386/6fc/edd/3866fceddc020ab4ee4fed5449b2f79a.jpg" data-blurred="true" /></figure>
<p>Бывают клады, впечатляющие нас вовсе не блеском и изобилием золота. Скромные украшения и небольшая сумма денег — все что есть за душой у человека, который прячет их перед надвигающейся неумолимой катастрофой, в тщетной надежде вернуться за ними. И то, что клад дожил до наших дней, означает лишь одно — его хозяин погиб. Если мы знаем, когда и почему это произошло, такие клады становятся для нас возможностью заглянуть в далекое прошлое. История словно оживает, становится осязаемой, такой близкой и понятной. Ведь и тогда жили люди, такие же как и мы c вами, они любили, страдали и умирали, но все-таки надеялись на лучшее, даже когда шансов выжить у них практически не оставалось...</p>
<p>При раскопках 2014 года на территории универмага сети Fenwick в английском городе Колчестере (проводились в связи с постройкой нового крыла здания) был обнаружен слой относящийся к I веку нашей эры. Почти полметра красной и черной золы…</p>
<p>Это были развалины сожженного дотла древнеримского города.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/938/cce/fb0/938ccefb0206a437adbee94206832952.jpg" alt="Взято с www.thecolchesterarchaeologist.co.uk" title="Взято с www.thecolchesterarchaeologist.co.uk" width="640" height="960" data-src="https://habrastorage.org/getpro/habr/upload_files/938/cce/fb0/938ccefb0206a437adbee94206832952.jpg" data-blurred="true" />
<figcaption>Взято с https://ift.tt/3IG2fmS</figcaption>
</figure>
<p>В одной из комнат разрушенного здания под слоем пепла и золы археологи дошли до уровня пола, среди разбитой керамики нашли обугленные финики, фиги, горох, пшеницу. Их оказалось не так уж много, помещение явно не складское, скорее все это упало на пол со сгоревшей деревянной полки, а, следовательно, тут, вероятно, находилась кухня. Причем наличие фиников и фиг, не произраставших на Британских островах, указывало, что жители дома явно не кельты (бритты), а выходцы со средиземноморского региона, то есть, сами римляне. При расчистке уровня чуть ниже пола древнеримского здания археологи почти сразу наткнулись на… золото.</p>
<p>Неужели клад?</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/8e9/c71/87d/8e9c7187d6517690978373fb1d44a4ec.jpg" alt="Взято www.thecolchesterarchaeologist.co.uk" title="Взято www.thecolchesterarchaeologist.co.uk" width="640" height="854" data-src="https://habrastorage.org/getpro/habr/upload_files/8e9/c71/87d/8e9c7187d6517690978373fb1d44a4ec.jpg" data-blurred="true" />
<figcaption>Взято https://ift.tt/3IG2fmS</figcaption>
</figure>
<p>Два золотых переплетенных браслета, полоска серебра и явно это было не все.</p>
<figure class=""><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/e3c/358/9f0/e3c3589f0595363f373b224e4647c663.jpg" alt="Взято www.thecolchesterarchaeologist.co.uk" title="Взято www.thecolchesterarchaeologist.co.uk" width="612" height="550" data-src="https://habrastorage.org/getpro/habr/upload_files/e3c/358/9f0/e3c3589f0595363f373b224e4647c663.jpg" data-blurred="true" />
<figcaption>Взято https://ift.tt/3IG2fmS</figcaption>
</figure>
<p>Клад достали из земли целиком вместе с грунтом, дабы не повредить его целостность и отправили для исследования в лабораторию при музее Колчестера и Ипсвича.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/7ec/c56/be4/7ecc56be4d0c228bffc80e941f54988b.jpg" alt="Взято с www.dailymail.co.uk" title="Взято с www.dailymail.co.uk" width="640" height="425" data-src="https://habrastorage.org/getpro/habr/upload_files/7ec/c56/be4/7ecc56be4d0c228bffc80e941f54988b.jpg" data-blurred="true" />
<figcaption>Взято с www.dailymail.co.uk</figcaption>
</figure>
<p>Началась ювелирная работа по расчистке клада.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/5d7/1c6/946/5d71c69468bf84438123a0e09acf1c72.jpg" alt="Взято с www.thecolchesterarchaeologist.co.uk" title="Взято с www.thecolchesterarchaeologist.co.uk" width="640" height="360" data-src="https://habrastorage.org/getpro/habr/upload_files/5d7/1c6/946/5d71c69468bf84438123a0e09acf1c72.jpg" data-blurred="true" />
<figcaption>Взято с https://ift.tt/3IG2fmS</figcaption>
</figure>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/571/fcc/11e/571fcc11e797821e8779c5f687fe8adb.jpg" alt="Взято с www.thecolchesterarchaeologist.co.uk" title="Взято с www.thecolchesterarchaeologist.co.uk" width="630" height="446" data-src="https://habrastorage.org/getpro/habr/upload_files/571/fcc/11e/571fcc11e797821e8779c5f687fe8adb.jpg" data-blurred="true" />
<figcaption>Взято с https://ift.tt/3IG2fmS</figcaption>
</figure>
<p>А теперь давайте попробуем разобраться в находке. Прежде всего мы видим три золотых браслета (точнее «armlets» – браслеты, надеваемые не на запястье, а выше) - два витых, один в виде простого кольца, три серебряных браслета (один из них «armlet»), серебряные монеты в истлевшем кошельке, остатки серебряной коробочки для драгоценностей, в ней пять золотых перстней, две пары золотых сережек (здесь видна лишь одна). Еще довольно массивная серебряная цепочка (не видна с этого ракурса).</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/f39/d87/032/f39d870323e053f7def75457c36fec9e.jpeg" width="640" height="583" data-src="https://habrastorage.org/getpro/habr/upload_files/f39/d87/032/f39d870323e053f7def75457c36fec9e.jpeg" data-blurred="true" /></figure>
<p>Вот здесь хорошо видна цепочка (silver chain):</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/c0d/d04/eb9/c0dd04eb95c07346226504b8e6690837.jpg" alt="Взято с www.thecolchesterarchaeologist.co.uk" title="Взято с www.thecolchesterarchaeologist.co.uk" width="640" height="428" data-src="https://habrastorage.org/getpro/habr/upload_files/c0d/d04/eb9/c0dd04eb95c07346226504b8e6690837.jpg" data-blurred="true" />
<figcaption>Взято с https://ift.tt/3IG2fmS</figcaption>
</figure>
<p><em>Полностью расчищенный клад</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/7d7/8f0/0d9/7d78f00d9b87398ef4a5ca29e20e9cfe.jpeg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="807" height="538" data-src="https://habrastorage.org/getpro/habr/upload_files/7d7/8f0/0d9/7d78f00d9b87398ef4a5ca29e20e9cfe.jpeg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p><em>Золотые браслеты и сережки</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/72a/fcb/102/72afcb102371e047720ad5cdf0c7358e.jpeg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="640" height="484" data-src="https://habrastorage.org/getpro/habr/upload_files/72a/fcb/102/72afcb102371e047720ad5cdf0c7358e.jpeg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p><em>Один из браслетов</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/90a/941/c15/90a941c1518805d4fb96fcf60990f700.jpg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="640" height="428" data-src="https://habrastorage.org/getpro/habr/upload_files/90a/941/c15/90a941c1518805d4fb96fcf60990f700.jpg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p><em>Пять золотых колец-перстней: три из них с изумрудами, в одном камень потерян, еще один — перстень-печатка с изображением дельфина</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/15c/f14/695/15cf14695887f9fff0ed86ef7906f765.jpg" alt="Взято с colchester.cimuseums.org.uk " title="Взято с colchester.cimuseums.org.uk " width="640" height="428" data-src="https://habrastorage.org/getpro/habr/upload_files/15c/f14/695/15cf14695887f9fff0ed86ef7906f765.jpg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p><em>Золотые сережки-шарики, они не такие маленькие, как может показаться, смотрите фото с браслетами выше</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/805/601/208/805601208700a6fb7b341eb284874f85.jpg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="640" height="433" data-src="https://habrastorage.org/getpro/habr/upload_files/805/601/208/805601208700a6fb7b341eb284874f85.jpg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p>Удивительно, но на одной из сережек сохранилась жемчужные (!) подвески, но сам жемчуг уже потускнел — «умер». Увы, жемчуг очень недолговечный и, пожалуй, один из самых легко разрушаемых драгоценных камней. Его «убивает» повышенная температура, кислая среда и просто время…</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/77b/954/718/77b954718ee343532d1eec850a1b6a15.jpeg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="583" height="869" data-src="https://habrastorage.org/getpro/habr/upload_files/77b/954/718/77b954718ee343532d1eec850a1b6a15.jpeg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p><em>Еще один золотой браслет</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/7af/0c1/420/7af0c142051fe92e286221f7291b2d27.jpg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="640" height="427" data-src="https://habrastorage.org/getpro/habr/upload_files/7af/0c1/420/7af0c142051fe92e286221f7291b2d27.jpg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p>А вот этот маленький медный почти полностью окислившийся медальон-амулет весьма примечателен, хотя он и не сделан из драгоценных металлов. Такой амулет повязывали на шею каждому римскому мальчику на восьмой день от рождения. Амулет носился до совершеннолетия, а после его часто хранили в семье уже как память — семейную реликвию.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/98d/80f/156/98d80f15652ab23220b057334170efb4.jpeg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="640" height="430" data-src="https://habrastorage.org/getpro/habr/upload_files/98d/80f/156/98d80f15652ab23220b057334170efb4.jpeg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p>Вот пример такого амулета практически в идеальном состоянии и его изображение на древнеримском барельефе</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/e64/ec9/b30/e64ec9b3085438c02f0c2e9947bd7b38.jpg" width="640" height="367" data-src="https://habrastorage.org/getpro/habr/upload_files/e64/ec9/b30/e64ec9b3085438c02f0c2e9947bd7b38.jpg" data-blurred="true" /></figure>
<p>А вот это уже серебряный браслет — на центральном диске изображен Юпитер, сидящий между Фортуной (богиня удачи, слева) и Викторией (богиня победы, справа). На самом браслете — сцены охоты пантеры на оленей. Возможно, это награда отставника-легионера.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/43f/264/9c2/43f2649c2183c6c555843c88d3f1db2d.jpg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="640" height="814" data-src="https://habrastorage.org/getpro/habr/upload_files/43f/264/9c2/43f2649c2183c6c555843c88d3f1db2d.jpg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p>Мужские серебряные браслеты, вот это уже совершенно точно не просто украшения! Это armilla (множественное число armillae) — наградные браслеты легионера.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/af4/0d4/b71/af40d4b71f23b2572b600cd52f43565a.jpeg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="640" height="429" data-src="https://habrastorage.org/getpro/habr/upload_files/af4/0d4/b71/af40d4b71f23b2572b600cd52f43565a.jpeg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p>Стеклянная инталья — изначально была закреплена на кольце или на подвеске. Изображение пантеры-матери с набухшими сосками.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/73d/0ad/222/73d0ad222f43c800466652bdc0c06a47.jpeg" width="640" height="268" data-src="https://habrastorage.org/getpro/habr/upload_files/73d/0ad/222/73d0ad222f43c800466652bdc0c06a47.jpeg" data-blurred="true" /></figure>
<p>Даже монеты здесь необычны. Часть из них — республиканские монеты древнего Рима времен Суллы, Мария, Юлия Цезаря, то есть, им уже на момент закладки уже тогда более века! Cамые поздние — монеты императора Клавдия, в том числе и мелочь.</p>
<p><em>Слева динарий Марка Антония, справа — императора Августа</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/c89/ca6/3d1/c89ca63d1b538e1add1fac74821ee85a.jpg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="640" height="641" data-src="https://habrastorage.org/getpro/habr/upload_files/c89/ca6/3d1/c89ca63d1b538e1add1fac74821ee85a.jpg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p><em>Винтики, скрепляющие серебряную коробочку для драгоценностей, и ее куски</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/928/58a/c0c/92858ac0c273f0f07cead794c5a2e8aa.jpg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="640" height="215" data-src="https://habrastorage.org/getpro/habr/upload_files/928/58a/c0c/92858ac0c273f0f07cead794c5a2e8aa.jpg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p><strong><em>Итак, что мы имеем в итоге? Уже вполне можно попытаться сделать предположения, кому же принадлежал клад, и кто его спрятал.</em></strong></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/30f/b7a/3be/30fb7a3be93c6e1f4b81d1ffb8c92244.jpeg" width="640" height="211" data-src="https://habrastorage.org/getpro/habr/upload_files/30f/b7a/3be/30fb7a3be93c6e1f4b81d1ffb8c92244.jpeg" data-blurred="true" /></figure>
<p>Анализируем вместе с вами состав клада. Разделим его на четыре группы:</p>
<p>- Первая группа — украшения (две пары золотых сережек и золотые перстни (размер небольшой, скорее женский), амулет римского мальчика, инталья и одна очень старая еще республиканская монета. Серебряная шкатулка с драгоценностями принадлежит именно женщине, а амулет, вероятно, ее выросшему сыну, этакий сентиментальный сувенир на память.<br />
- Вторая группа — три тонких изящных золотых браслета, явно женские.<br />
- Третья группа — серебряные мужские браслеты, награды легионера.<br />
- И четвертая — кошель (?) с монетами, но монет немного, скорее просто старые монеты на память и немного на текущие расходы.</p>
<p>Это явно семейные ценности: украшения матери, награды отца, памятные безделушки и семейные реликвии вперемешку, как и у многих читателей сегодня. Семья скорее просто обеспеченная, чем знатная, да и награды (браслеты) явно солдатские, а не офицерские — награды заслуженного отставника-легионера.</p>
<p><strong><em>Следующий вопрос, кто же прятал?</em></strong></p>
<p>По мне так, ответ вполне очевиден, кто будет прятать на кухне клад под полом? Ведь кухня — место, где царят женщины. К тому же, если бы прятал мужчина, он положил бы туда прежде всего деньги, возможно, личные печати, документы (восковые таблички, листы, подтверждающие его гражданство, право на имущество — недвижимость, землю и т. п.). Два десятка серебряных и медных монет так же никак не тянут на сбережения всей семьи.</p>
<p>Что же стало с жителями дома? Точно сказать невозможно, но в самом доме были найдены две обгоревшие человеческие кости — разрубленная острым предметом (вероятно мечом) человеческая голень и фрагмент нижней челюсти. Остальное либо растащили звери, либо останки жителей все же похоронили позже.</p>
<p><em>Походы римских легионов с 43 по 60 гг. н. э. Завоевание Британии</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/8f1/024/c35/8f1024c35505424791b2097a15823fed.jpg" alt="взято с wikimedia.org" title="взято с wikimedia.org" width="640" height="614" data-src="https://habrastorage.org/getpro/habr/upload_files/8f1/024/c35/8f1024c35505424791b2097a15823fed.jpg" data-blurred="true" />
<figcaption>взято с wikimedia.org</figcaption>
</figure>
<p>Город Камулодун, как и многие города западной Европы, начинался с «каструма» — лагеря римского легиона. В 43 году нашей эры здесь рядом с древним кельтским городом разбил свой лагерь XX легион — «Отважный и Победоносный» (Valeria Vitrix).</p>
<p>Легионный лагерь — это уже сам по себе город-крепость с населением 5−6 тыс., со своим храмом, администрацией, казармами и хозяйственными постройками. Поэтому, когда ХХ легион в 49 году перевели на новое постоянное место (Камолодун стал уже глубоким тылом и не нуждался в такой защите), здесь остались отставные легионеры, у которых вышел срок службы, и именно они стали первыми жителями нового римского города.</p>
<p>За службу в римской армии легионеры получали римское гражданство, надел земли и небольшое денежное вознаграждение при выходе на «пенсию». Многие отставники обзавелись здесь семьями, обжились и не торопились возвращаться в метрополию. Ведь здесь на краю империи они — «римские граждане», «белая кость», чуть ли не аристократы на фоне местных «дикарей», да и жизнь здесь гораздо дешевле чем в Риме.</p>
<p>К 60 году количество жителей Камулодуна превысило 20 тысяч, он стал самым густонаселенным городом римской Британии.</p>
<p><em>Римский легионный лагерь на границах империи</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/3aa/758/e77/3aa758e7703f6368bdb916c6a4727699.jpg" width="640" height="387" data-src="https://habrastorage.org/getpro/habr/upload_files/3aa/758/e77/3aa758e7703f6368bdb916c6a4727699.jpg" data-blurred="true" /></figure>
<p>Однако далеко не все земли бриттов на покоренной территории были завоеваны, часть племен-союзников остались формально независимы от Римской империи. Их цари объявляли себя клиентами римского государства и находились под защитой римского оружия. Они регулярно платили дань, но это не было налогом (значительно меньше, чем платили завоеванные племена), а оформлялись как подарки клиента своему покровителю. У них оставалась своя армия, управление, и римляне формально не имели право вмешиваться во внутренние дела своих союзников-клиентов.</p>
<p>Неужели за столь несоразмерно малую плату клиенты получали кучу ништяков в виде покровительства самой могучей империи мира? В чем же тут подвох?</p>
<p>А в том, что рано или поздно земли клиентов становились частью Римской империи. Дело в том, что царь-клиент обязан был подписать в своем завещании один маааленький пунктик, напечатанный мелким шрифтом, о том, что если у него не останется наследников, то его страна отойдет римскому государству, дабы оно достойно позаботилось об его подданных. Исключительно токмо ради благосостояния этих самых подданных, дабы недруги-вороги и прочие нехорошие люди не воспользовались смертью глубокочтимого клиента и его наследников! И надо сказать, мерли наследники регулярно и как-то очень удачно в нужный момент.</p>
<p>Царь кельтского племени иценов Прасутаг - один из союзников римлян аж с 43 года, то есть, с самого начала вторжения римлян на остров. Когда в 47 году необходимость в воинской помощи союзников отпала, римляне попытались разоружить их, но неожиданно получили достойный отпор. Поняв, что с этими ребятами лучше жить мирно, римляне заключили с Прасутагом клиентский договор со всеми вытекающими последствиями.</p>
<p>А дальше пошла у Прасутага веселая и безбедная жизнь, еще бы — все враги его истреблены римлянами и союзниками, а если кто еще попытается наехать, то огребет от Старшего Брата (Римской империи) по самое не балуй. А тут еще римские купцы зачастили к ним с товарами, причем денег на шикарную жизнь опять же им сами римляне (вот лохи!) отвалили — много, не мало, а 40 миллионов сестерциев накапало.</p>
<p>Бедняга Прасутаг, лучше бы ему внимательней читать бумаги, что он подписывал. Эти 40 миллионов были даны ему в долг под дикие проценты великим гуманистом и древнеримским философом Сенекой. А Сенека, между нами, хоть и считается по сей день прекрасным оратором, талантливым писателем и философом, проповедующим идеалы гуманизма, воздержанности, скромной жизни вдали от страстей, в реальности был одержимым жаждой наживы беспринципным мудаком.</p>
<p>Эх, если бы вы слышали, как он красноречиво в сенате обличал коррупцию сильных мира сего при предыдущем императоре! Но когда его воспитанник и ученик Нерон стал императором, у «скромного» философа снесло крышу. Ведь он стал, по сути, вторым человеком в империи, хотя и не занимал никаких официальных постов. За 4 года правления Нерона его состояние с пары миллионов выросло до 300 миллионов сестерциев.</p>
<p><em>Слева бюст псевдо-Сенеки, именно этот бюст часто фигурирует в учебниках истории и философии, а вот справа — его настоящее лицо.</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/c85/30e/e6f/c8530ee6fe4abab7d0afdc434c972cdf.jpeg" width="640" height="300" data-src="https://habrastorage.org/getpro/habr/upload_files/c85/30e/e6f/c8530ee6fe4abab7d0afdc434c972cdf.jpeg" data-blurred="true" /></figure>
<p>У престарелого царя Прасутага была жена Боудикка и две дочери. Именно своих дочерей он назвал своими наследницами, рассчитывая, что Боудикка будет регентом после его смерти. Не учел он одного, в отличие от кельтов претендовать на наследство свыше 100 тыс. сестерциев в римском праве могли лишь мужчины.</p>
<p>Когда на похороны царя явились римские чиновники с отрядом легионеров ицены не придали этому значения. Отгуляв на поминках, чиновники сообщили царице Боудикке: все что принадлежало царю отныне принадлежит Риму, а все имущество иценов будет конфисковано в счет уплаты долга, причем разницы между знатью иценов и их рабами нет, все они одинаково бесправны перед законом и оружием Рима.</p>
<p>Горячих парней из знати иценов, схватившихся было за мечи, римлянами перебили тут же, а потом начался повальный грабеж, тех, кто сопротивлялся, убивали без раздумий. Из уважения к царской крови Боудикку не убили, а лишь голой выпороли на площади города. К сожалению, ее дочерям «повезло» еще меньше — их изнасиловала солдатня и бросила в грязь на дороге. По мнению римлян после такого поругания ни один бритт не пойдет за ними, ведь честь у кельтов ценилась выше жизни.</p>
<p>Не учли римляне одного, честь кельта все же можно восстановить, но лишь заставив врага заплатить многократно кровью за поругание.</p>
<p>И Боудикка тут же принялась платить свой кровавый «долг» — сначала за ней пошли лишь кровные родственники, но после уничтожения нескольких римских усадеб и их хозяев, к ней примкнули остальные ицены. Вскоре все римляне в округе, кто не успел укрыться в крепости Камулодуна были убиты, а их усадьбы сожжены, восставшие осадили город. Наместник провинции Гай Светоний Паулин на тот момент отсутствовал, подавляя другой мятеж на далеком краю Британии — Уэльсе</p>
<p>Однако кельты все еще не торопились с штурмом, казалось бы почему? Ведь город был защищен лишь мизерным гарнизоном, а 20 тыс. римлян, укрывшихся за его стенами, и их имущество — богатая добыча.</p>
<p>Но Боудикка рассчитала все правильно. Город стал заложником восставших, и римляне сделают все, чтобы спасти его жителей. Зачем штурмовать крепости одну за другой, — решила царица, — лучше выманить римлян на бой в чистом поле до того, как вернется Паулин со своей армией.</p>
<p>Все надежда жителей города была на IX «Испанский» легион. И это первое серьезное испытание для восставших. Победить легион — вовсе не равнозначно к разгрому отрядов ополчения из числа римских колонистов и городской стражи, как это случилось недавно под стенами города. Ведь IX легион — это олицетворение римской незнающей поражений в Британии армии империи.</p>
<p>Однако в этот раз все было по другому, самонадеянный легат Квинт Петиллий Цериал принял бой в открытом поле, пытаясь атаковать восставших, но ицены, обойдя с флангов, опрокинули ряды манипул легиона. Прижатые к реке остатки двух когорт сражались до последнего, только отряду кавалеристов с легатом удалось прорваться, унося с собой орла легиона.</p>
<p>Когда весть о разгроме легиона дошла Камулодуна, жителям стало ясно: их уже ничто не может спасти. Наверно, именно тогда хозяйка дома спрятала под полом кухни свой клад.</p>
<p>А затем — короткий жестокий штурм, который кончился взятием крепости. Кельты не пощадили никого — кровавый долг Боудикка выплатила здесь сполна. Римлян убивали, вешали, распинали еще живых вокруг города. Лишь немногие женщины пережили первые сутки после штурма. Их избитых и изнасилованных отвезли в «священные рощи» и убили особо жестоко, принося в дар кровожадной богине победы Андрасте.</p>
<p>Возможно, среди них была и владелица клада…</p>
<p><em>Боудикка и ее дочери, памятник викторианской эпохи</em></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/ab2/abc/b81/ab2abcb81c49330d2fb77cfa085bc792.jpeg" alt="Взято с wikimedia.org" title="Взято с wikimedia.org" width="640" height="423" data-src="https://habrastorage.org/getpro/habr/upload_files/ab2/abc/b81/ab2abcb81c49330d2fb77cfa085bc792.jpeg" data-blurred="true" />
<figcaption>Взято с wikimedia.org</figcaption>
</figure>
<p>Один из свидетелей разгрома города — вот эта голова статуи императора из храма божественного Клавдия в Камулодуне. Найдена в Саффолке, захвачена как трофей после взятия города.</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/96f/ab4/6ad/96fab46adc3c83ebb7719f13165d0e09.jpeg" alt="Взято с wikimedia.org" title="Взято с wikimedia.org" width="640" height="960" data-src="https://habrastorage.org/getpro/habr/upload_files/96f/ab4/6ad/96fab46adc3c83ebb7719f13165d0e09.jpeg" data-blurred="true" />
<figcaption>Взято с wikimedia.org</figcaption>
</figure>
<p>Восстание Боудикки росло как снежный ком, одно за другим племена бриттов, присоединялись к нему, вслед за Камулодуном был взят Лондиниум (современный Лондон), а потом и Варуланиум. Количество убитых римских граждан перевалило за 70 тысяч.</p>
<p>Но вскоре восставшие столкнулись с армией Рима — на этот раз им противостояло два легиона XIV и XX. Хотя числом восставшие многократно их превосходили, но в этот раз у римлян есть хладнокровный и грамотный командир — сам Светоний Паулин.</p>
<p>Он выстроил два легиона в плотном строю между двумя лесными массивами, в которых засели лучники и пращники. Узкий фронт нивелировал громадное численное преимущество бриттов. Отразив одну за другой две атаки, легионы мерным шагом, не ломая строй, двинулись вперед по трупам врагов. И тут бритты побежали, насколько они были бесстрашны в атаке, настолько же, оказались неудержимы в бегстве и панике.</p>
<p>В этой последней битве Боудикки погибли от 30 до 40 тыс. кельтов, сама она приняла яд, чтобы не стать почетным трофеем в добыче римлян…</p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/32f/967/431/32f96743172866e84532753cc1ad00ba.jpg" alt="Взято с www.dailymail.co.uk" title="Взято с www.dailymail.co.uk" width="634" height="555" data-src="https://habrastorage.org/getpro/habr/upload_files/32f/967/431/32f96743172866e84532753cc1ad00ba.jpg" data-blurred="true" />
<figcaption>Взято с www.dailymail.co.uk</figcaption>
</figure>
<p><strong><em>Британия еще три с половиной века будет принадлежать римлянам, лишь в начале V века последние легионы все же покинут остров, и тогда начнется следующая глава истории острова. Увы, новые завоеватели - англы и саксы окажутся еще более беспощадными и жестокими.</em></strong></p>
<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/8ee/a79/199/8eea791990d1b7aa92ec219523af9676.jpeg" alt="Взято с colchester.cimuseums.org.uk" title="Взято с colchester.cimuseums.org.uk" width="640" height="427" data-src="https://habrastorage.org/getpro/habr/upload_files/8ee/a79/199/8eea791990d1b7aa92ec219523af9676.jpeg" data-blurred="true" />
<figcaption>Взято с colchester.cimuseums.org.uk</figcaption>
</figure>
<p>Автор: Лысый Камрад (@LKamrad)</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-36257442454304493322021-12-09T21:36:00.005+03:002021-12-09T21:36:51.369+03:00Android: как подружить ваше приложение с Google Ассистентом?<figure class="full-width"><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/1e2/1c6/376/1e21c6376177821634d15207eaa75ded.jpg" width="2048" height="1365" data-src="https://habrastorage.org/getpro/habr/upload_files/1e2/1c6/376/1e21c6376177821634d15207eaa75ded.jpg" data-blurred="true" /></figure>
<p>Многие из вас прекрасно знают, что такое Google Ассистент. Это голосовой помощник, подобный Siri, Алисе, Алексе и другим. Когда пользователь что-то говорит, Google Ассистент понимает это с помощью natural language understanding (NLU). NLU преобразует человеческую речь в специальную структуру данных, которую уже можно обработать.</p>
<p>У разработчиков Android есть возможность интегрировать NLU в свои приложения через специальный api, который называется App Actions. Точнее, существует два вида интеграции: мы можем получить и использовать Deep Link из речи пользователя или получить данные из приложения, не открывая его, и показать их прямо в Google Ассистенте через Slice.</p>
<h3>Как работать с голосовым ассистентом</h3>
<p>Когда пользователь отдаёт голосовую команду, он нажимает на кнопку и говорит, например: «Окей, Google. Хочу узнать мой текущий счёт в таком-то приложении». Google Ассистент распознаёт речь с помощью NLU и переводит её в специальную структуру данных. Затем в приложении ищется соответствие с одним из действий — Deep Link или Slice. Если найден Deep Link, из команды пользователя вычленяются данные, и пользователь видит какой-либо экран приложения. Если найден Slice, пользователь видит какой-либо элемент в Google Ассистенте на основе полученных из приложения данных.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" height="668" data-src="https://habrastorage.org/getpro/habr/upload_files/2e4/9e2/297/2e49e2297056d3eb473e1a1ae602d9b8.png" data-width="1440" /></figure>
<p>А теперь подробнее об этом от разработчика. Упомянутая структура данных называется intent, и это не тот intent, который используют все Android-разработчики, а специальная структура, описанная в документации: <a href="https://developers.google.com/assistant/app/reference/built-in-intents">https://developers.google.com/assistant/app/reference/built-in-intents</a></p>
<p>Есть несколько встроенных intent’ов, называемых Built-in intent (BII). Они разбиты по сферам: финансы, здравоохранение, спорт, еда и так далее. В этих сферах есть типичные действия, которые совершают пользователи. Например, в спорте это «начать тренировку», «начать бег», «закончить бег», «приостановить бег», «начать бег на 20 минут» и так далее. Список intent’ов постоянно расширяется, и мы можем их использовать.</p>
<p>Когда хотим добавить в приложение какое-то типичное действие, находим подходящий BII в документации. Потом прописываем его в actions.xml, который является, по сути, главным файлом по работе с App Actions, и в нём происходит маппинг. Далее указываем, какое действие (или fulfillment — так оно называется в документации) нужно совершить: Deep Link или Slice. Deep Link мы обрабатываем, достаём из него данные и открываем определённый экран. Slice мы можем показать в виде bubbles в самом Google Ассистенте, передав какие-то данные из приложения.</p>
<h3>Настройка окружения для интеграции голосовых команд</h3>
<p>Будет понятнее, если мы сделаем простой Hello World с голосовыми командами. Сначала нам нужно настроить окружение: в Android Studio создаём новый проект. Проект нужно сразу загрузить в Google Play Console и сохранить там как черновик.</p>
<p>Когда хотим опубликовать приложение с App Actions, фактически нужно пройти два этапа проверки. Первый этап — обычная публикация приложения в Google Play, про который вы, скорее всего, хорошо всё знаете. Второй этап — отдельная подгрузка actions.xml в Google Play Console. Он проводится отдельно и независимо от первого. При каждом изменении actions.xml нужно отдельно его публиковать с отдельным процессом его проверки. Только когда оба этапа пройдены, можно использовать приложение.</p>
<p>Чтобы до публикации протестировать, как в приложении работают App Actions, нужно:</p>
<ol readability="0.5">
<li readability="0">
<p>Сохранить проект в качестве черновика в Google Play Console без actions.xml</p>
</li>
<li readability="1">
<p>В Android Studio установить плагин Test Tool для App Actions, который позволит загружать actions.xml в аккаунт Google Play Console</p>
</li>
</ol>
<p>App Actions, описанные в actions.xml, будут работать только из-под нашего аккаунта. Поэтому везде должен использоваться один и тот же Google-аккаунт: в Android Studio, в Google Play Console, на реальном устройстве или эмуляторе, на которых будем тестировать — только так App Actions смогут работать.</p>
<h3>Простейшая голосовая команда по открытию экрана</h3>
<p>Предварительные настройки завершены, вернёмся к проекту. В файле манифеста пропишем расположение файла android.xml (в ресурсной папке xml):</p>
<pre><code><meta-data
android:name="com.google.android.actions"
android:resource="@xml/actions" /></code></pre>
<p>Файл actions.xml в простейшем варианте может выглядеть так:</p>
<pre><code><?xml version ="1.0" encoding ="utf-8"?>
<actions>
<action intentName="actions.intent.GET_INVOICE">
<fulfillment urlTemplate="https://zavanton.com/invoice" />
</action>
</actions></code></pre>
<p>Как вы заметили, в этом файле перечисляются actions, которым соответствует fulfilment. В этом случае ожидаем от Google Ассистента встроенного intent GET_INVOICE — это финансовый intent, который вызывается голосовой командой «Окей, Google. Покажи мне мой текущий счёт». Когда пользователь произносит эту фразу в той или иной форме, Google Ассистент переводит её в этот intent, и мы можем его обработать в actions.xml.</p>
<p>В этом случае мы вызываем Deep Link с указанным url. Затем идёт обычная работа с диплинками: они прописываются в манифесте и обрабатываются уже в соответствующих Activity. То есть, получив Deep Link, мы можем, например, открыть какой-нибудь экран. Пример описания экрана с диплинками из манифеста:</p>
<pre><code><activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- deep links -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="zavanton.com"
android:scheme="https" />
</intent-filter>
</activity></code></pre>
<p>Давайте посмотрим, как это выглядит в Android Studio</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" height="1152" data-src="https://habrastorage.org/getpro/habr/upload_files/224/496/62a/22449662ad3c4b837ac5cb000240950c.png" data-width="2048" /></figure>
<p>Открыта Android Studio, запущен эмулятор, и открыт плагин Test Tool. В проект уже добавлен файл actions.xml, и для его обновления на сервере Google Play Console нужно нажать Update Preview. После этого мы сможем запускать действия, прописанные в actions.xml. Для этого достаточно нажать Run и увидеть, как в эмуляторе или на реальном устройстве эмулируется ввод пользователя и открывается экран по диплинку.</p>
<p>Если хочется увидеть весь процесс, можно длительно нажать на кнопку Home на эмуляторе или реальном устройстве, а потом проговорить или написать фразу, которая будет распознана, и откроется тот же экран по диплинку.</p>
<p>А теперь давайте решим задачу посложнее. Подготовим два fulfilment разных типов: один будет в Deep Link передавать параметр, а другой будет работать со Slice.</p>
<h2>Передача параметров через диплинки и работа с синонимами</h2>
<h4>Один параметр</h4>
<p>Теперь пример посложнее. Передаём встроенный intent GET_THING с параметром. В документации у него указан один параметр thing.name. Поэтому нам останется прописать intent, параметр и указать, куда этот параметр подставляется в Deep Link.</p>
<p>Дальше из диплинка достаём параметры. В этом случае параметр — это поисковый запрос, по которому берём данные с сервера или из локальной базы и показываем их на экране, соответствующем диплинку.</p>
<pre><code><action intentName="actions.intent.GET_THING">
<fulfillment urlTemplate="https://zavanton.com/search{?query}">
<parameter-mapping
intentParameter="thing.name"
urlParameter="query" />
</fulfillment>
</action></code></pre>
<h4>Несколько параметров</h4>
<p>В примере был один параметр. А как быть, если параметров несколько? Так же. Количество параметров зависит от используемого intent. Например, пользователь говорит: «Окей, Google. Переведи мне деньги завтра 100 рублей с текущего счёта на депозитный счёт». Фраза «переведи мне деньги» будет соответствовать заранее настроенному intent CREATE_MONEY_TRANSFER. А все остальные слова из этой фразы Google Ассистент попытается распарсить, воспроизвести, считать и передать в качестве соответствующих параметров. Ниже текст для actions.xml по настройке intent CREATE_MONEY_TRANSFER:</p>
<pre><code><action intentName="actions.intent.CREATE_MONEY_TRANSFER">
<fulfillment urlTemplate="https://zavanton.com/payment{?transferMode,value,currency,moneyTransferOriginName,moneyTransferDestinationName,moneyTransferOriginProvidername,moneyTransferDestinationProvidername}">
<!-- Eg. transferMode = "http://schema.googleapis.com/ReceiveMoney" -->
<parameter-mapping
intentParameter="moneyTransfer.transferMode"
required="true"
urlParameter="transferMode" />
<!-- Eg. value = "100" -->
<parameter-mapping
intentParameter="moneyTransfer.amount.value"
urlParameter="value" />
<!-- Eg. currency = "USD" -->
<parameter-mapping
intentParameter="moneyTransfer.amount.currency"
urlParameter="currency" />
<!-- Eg. moneyTransferOriginName = "Credit card" -->
<parameter-mapping
intentParameter="moneyTransfer.moneyTransferOrigin.name"
urlParameter="moneyTransferOriginName" />
<!-- Eg. moneyTransferDestinationName = "Savings account" -->
<parameter-mapping
intentParameter="moneyTransfer.moneyTransferDestination.name"
urlParameter="moneyTransferDestinationName" />
<!-- Eg. moneyTransferOriginProvidername = "Example Provider" -->
<parameter-mapping
intentParameter="moneyTransfer.moneyTransferOrigin.provider.name"
urlParameter="moneyTransferOriginProvidername" />
<!-- Eg. moneyTransferDestinationProvidername = "Example Provider" -->
<parameter-mapping
intentParameter="moneyTransfer.moneyTransferDestination.provider.name"
urlParameter="moneyTransferDestinationProvidername" />
</fulfillment>
<!-- fallback fulfillment -->
<fulfillment urlTemplate="https://zavanton.com/payment" />
</action></code></pre>
<h4>Незаполненные параметры</h4>
<p>Хорошо, когда все необходимые нам параметры ассистент успешно распарсил и передал. А как быть, если некоторые параметры он не смог передать? Тогда мы обязаны предоставить Google Ассистенту fallback fulfillment в общем виде без параметров.</p>
<p>Допустим, была команда выполнить платёж, и параметры не считались. На этот случай по fallback fulfillment мы можем открыть экран «денежные переводы», и пользователь сам введёт эти параметры. Обращаю внимание, что можно предоставить несколько fulfillment, и они будут считываться сверху вниз. Первый fulfillment, который подходит, будет реализован, нижестоящие — пропущены. Соответственно, последним указываем наш fallback fulfillment без параметров.</p>
<h4>Синонимы</h4>
<p>Ещё есть возможность накладывать на получаемые параметры ограничения. Например, голосовая команда «Окей, Google. Открой мне список банковских карт в моём приложении» или «Окей, Google. Открой мне список счетов в моём приложении». Допустим, есть две фичи — список карт и список счетов. Но пользователь может по-разному их называть: банковские карты, просто карты, ещё какие-нибудь карты. Мы можем занести их все с помощью inline inventory и тега entity-set. В entity-set заносятся имена и синонимы, которые мы можем услышать от пользователя: «банковская», «банковская карта», «карта», «карточка» и так далее. Все эти синонимы будут приводиться к одному cards. Аналогично делаем для счетов, приводя их к accounts. В итоге у нас остались cards и accounts — два значения, которые можно использовать.</p>
<p>В fulfilment указан параметр feature, который ссылается через entitySetId на наборы значений cards и accounts. У cards и accounts есть параметр url с адресом Deep Link для каждого набора значений. В fulfillment в параметре urlTemplate прописано {@url}, а это значит, что в качестве Deep Link будет подставляться соответствующий url из cards или accounts — в зависимости от того, что скажет пользователь.</p>
<pre><code><action intentName="actions.intent.OPEN_APP_FEATURE">
<!-- the fulfillment for specific features -->
<fulfillment
fulfillmentMode="actions.fulfillment.DEEPLINK"
urlTemplate="{@url}" />
<parameter name="feature">
<entity-set-reference entitySetId="myappfeature" />
</parameter>
<!-- the fallback fulfillment -->
<fulfillment
fulfillmentMode="actions.fulfillment.DEEPLINK"
urlTemplate="https://zavanton.com/home" />
</action>
<entity-set entitySetId="myappfeature">
<entity
name="cards"
url="https://zavanton.com/card-list" />
<entity
name="accounts"
url="https://zavanton.com/account-list" />
</entity-set></code></pre>
<h4>Заполнение при открытом приложении</h4>
<p>У fulfilment есть атрибут requiredForegroundActivity. Что делает этот атрибут? При указании в нём activity срабатывает только при открытом приложении. Это может быть полезно в некоторых ситуациях.</p>
<p>Допустим, есть intent на перевод денег. В банковском приложении пользователь должен сначала авторизоваться. Если мы вызовем этот intent, нужно пройти авторизацию, перейти на нужный экран и так далее. Чтобы избежать сложностей, дадим возможность использовать intent только при открытом приложении.</p>
<p>Пользователь открывает приложение, переходит на нужный экран, нажимает Home и говорит: «Перевести на другой счёт такую-то сумму». Google Ассистент открыт, приложение открыто — intent будет выполнен. Повторю, это достигается с помощью флага requiredForegroundActivity, в нём указываем активность, которая должна быть открыта.</p>
<p>Подробнее об этих и других параметрах можно почитать в документации: <a href="https://developers.google.com/assistant/app/legacy/action-schema">https://developers.google.com/assistant/app/legacy/action-schema</a></p>
<h2>Обратная связь для ассистента</h2>
<p>Пользователь дал голосовую команду, Google Ассистент её обработал и передал в intent — после этого Google Ассистент не знает, насколько успешно мы смогли эту команду обработать.</p>
<p>Есть способ исправить эту ситуацию и дать обратную связь Google Ассистенту. Это делается с помощью библиотеки <strong>Firebase App Indexing</strong>. После обработки Deep Link нужно вызвать метод, который, в зависимости от успешности обработки, отправит true или false в наш Firebase:</p>
<pre><code>private fun notifyGoogleAssistant(isActionHandled: Boolean) {
intent.getStringExtra(Actions.ACTION_TOKEN_EXTRA)?.let { actionToken ->
val actionStatus = if (isActionHandled) {
Action.Builder.STATUS_TYPE_COMPLETED
} else {
Action.Builder.STATUS_TYPE_FAILED
}
val action = AssistActionBuilder()
.setActionToken(actionToken)
.setActionStatus(actionStatus)
.build()
// Send the end action to the Firebase app indexing.
FirebaseUserActions.getInstance().end(action)
}
}</code></pre>
<p>Это рекомендуется делать, чтобы Google Ассистент знал, что мы успешно обрабатываем intent в приложении, и он и дальше может передавать Deep Link именно в наше приложение, а не в какое-либо другое. </p>
<h3>Настройка Slice для диалога в ассистенте</h3>
<p>Далеко не всегда нужно открывать приложение по голосовой команде. Часто удобнее взять данные из приложения и показать их на экране диалога Google Ассистента. Это делается с помощью Slice.</p>
<p>Тестирование проходит так же, как и с Deep Link: в плагине Test Tool выбираем action, который соответствует Slice и нажимаем кнопку RUN. В эмуляторе видим, что приложение не открывается, а мы остаёмся в Google Ассистенте, и в нём появляется bubble — диалоговое окно из нашего приложения с нашими данными.</p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" height="1152" data-src="https://habrastorage.org/getpro/habr/upload_files/9e2/9c1/2fd/9e29c12fdf8da1433f9c27d613f87683.png" data-width="2048" /></figure>
<p>Это делается в том же файле actions.xml и похоже на то, что мы ранее описывали, за исключением другого fulfillmentMode, который установлен как actions.fulfillment.SLICE. FulfillmentMode существует два: либо Slice, либо Deep Link. Deep Link идёт по умолчанию, его можно и не указывать. Давайте разберём следующий кусок подключения Slice:</p>
<pre><code><!-- App Action with slice fulfillment -->
<action intentName="actions.intent.GET_ACCOUNT">
<fulfillment
fulfillmentMode="actions.fulfillment.SLICE"
urlTemplate="content://com.zavanton.slices.account.provider{?accountName,description,providerName}">
<parameter-mapping
intentParameter="account.name"
required="true"
urlParameter="accountName" />
<parameter-mapping
intentParameter="account.description"
urlParameter="description" />
<parameter-mapping
intentParameter="account.provider.name"
urlParameter="providerName" />
</fulfillment>
<!-- the fallback fulfillment -->
<fulfillment
fulfillmentMode="actions.fulfillment.DEEPLINK"
urlTemplate="https://zavanton.com/home" />
</action></code></pre>
<p>Тут тоже есть параметры, распознаваемые в Google Ассистенте и передаваемые в url. Чем же теперь будет url, если мы работаем не с Deep Link? Этот url будет authority контент-провайдер, через которого мы будем получать данные.</p>
<p>Вернёмся к Android-манифесту. Определим там контент-провайдер с authority, который соответствует url, указанном в actions.xml.</p>
<pre><code><provider
android:name=".slices.AccountInfoProvider"
android:authorities="com.zavanton.slices.account.provider"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.app.slice.category.SLICE" />
</intent-filter>
</provider></code></pre>
<p>Контент-провайдер — это класс, он наследуется от SliceProvider, будет использоваться Slice-менеджером и передаваться обратно в Google Ассистента, который будет его отображать.</p>
<p>В классе реализуем ряд методов, прежде всего метод onBindSlice(). В нём заложена логика получения данных. Из sliceUri получаем сказанное пользователем — это какие-то параметры. Их используем в запросе к локальной базе данных или к серверному api и в красивой форме отдаём.</p>
<pre><code>override fun onBindSlice(sliceUri: Uri): Slice {
Log.d("zavanton", "zavanton - onBindSlice: $sliceUri")
// implement logic to get some slice from uri
return list(requireNotNull(context), sliceUri, ListBuilder.INFINITY) {
header {
title = "Account Info"
subtitle = "Some Subtitle"
primaryAction = createOpenAppAction()
}
gridRow {
cell {
addTitleText("Some Title Text")
addText("Some text")
}
}
}
}
private fun createOpenAppAction(): SliceAction {
val intent = Intent(context, MainActivity::class.java)
return SliceAction.create(
PendingIntent.getActivity(context, 0, intent, 0),
IconCompat.createWithResource(context, R.drawable.abc_ic_star_black_16dp),
ListBuilder.SMALL_IMAGE,
"Open App"
)
}</code></pre>
<p>Повторим всю цепочку:</p>
<ol readability="5">
<li readability="1">
<p>Пользователь говорит «Окей, Google. Покажи мне мой текущий баланс из такого-то приложения»</p>
</li>
<li readability="-1">
<p>Google Ассистент подбирает соответствующий Built-in intent</p>
</li>
<li readability="-1">
<p>В actions.xml этот intent будет захвачен с fulfillmentMode = Slice</p>
</li>
<li readability="0">
<p>Slice-менеджер анализирует url и по нему находит контент-провайдер</p>
</li>
<li readability="-1">
<p>Из контент-провайдера он возьмёт данные</p>
</li>
<li readability="0">
<p>Затем передаст их обратно в Google Ассистент в виде слайса</p>
</li>
</ol>
<p>При этом мы должны предусмотреть, что slice-менеджер должен иметь разрешение на работу с контент-провайдером. Например, в Application-классе надо дать ему разрешение на работу с контент-провайдером — просто даём разрешение. </p>
<pre><code>private fun grantAssistantPermissions() {
getAssistantPackage()?.let { assistantPackage ->
val sliceProviderUri = Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(AccountInfoProvider.ACCOUNT_SLICE_AUTHORITY)
.build()
SliceManager.getInstance(this).grantSlicePermission(assistantPackage, sliceProviderUri)
}
}
private fun getAssistantPackage(): String? {
val resolveInfoList = packageManager?.queryIntentServices(
Intent(VoiceInteractionService.SERVICE_INTERFACE), 0
)
return resolveInfoList?.firstOrNull()?.serviceInfo?.packageName
}</code></pre>
<h3>Нестандартные запросы через кастомные intent’ы</h3>
<p>Последняя тема, на которой я хотел бы остановиться, — это кастомные intent’ы. Ранее я писал только про встроенные (build-in) intent, которые может понимать Google Ассистент. Но в последних версиях появилась возможность создавать свои intent. Это может быть полезно, когда есть пользовательский запрос, который не вписывается в сценарии из официальной документации.</p>
<p>Как это делается? В файле actions.xml указываем action с нашим кастомным intent с именем, которое сами придумаем, но по конвенции имя должно начинаться с custom.action. В Built-in intent «android.action», а здесь будет «custom.action».</p>
<p>Затем идёт важный атрибут queryPatterns — он фактически будет ссылаться на список запросов, которые мы предполагаем услышать от пользователя. Например, мы хотим услышать от пользователя «Эй, Google, открой такое-то приложение и подпишись на такую-то услугу». Мы хотим услышать от пользователя одну и ту же команду в трёх вариациях. Соответственно, мы сформулировали три вариации и прописываем их в наших строковых ресурсах:</p>
<p>— Hey, Google, open DemoApp and subscribe me to SomeService.</p>
<p>— Hey, Google, open DemoApp and make a subscription to SomeService.</p>
<p>— Hey, Google, open DemoApp and enable service SomeService.</p>
<p>Создаём массив строк и в нём будем указывать эти три команды. Естественно, их может быть больше, и мы можем указать параметры, которые хотим поручить Google Ассистенту доставать из голосовых команд. В этом примере видим, что у нас один параметр — это сервис. Выделяем его с помощью такого знака $.</p>
<pre><code><string-array name="subscribe_to_financial_services">
<item>subscribe me to $service1</item>
<item>make a subscription to $service1</item>
<item>enable service $service1</item>
</string-array></code></pre>
<p>Возвращаясь к actions.xml, пропишем, что параметр $service1 мы обрабатываем. Пропишем у него тип Теxt, и теперь мы можем использовать его для передачи в url.</p>
<pre><code><action
intentName="custom.actions.intent.SUBSCRIBE_TO_FINANCIAL_SERVICE"
queryPatterns="@array/subscribe_to_financial_services">
<parameter
name="service1"
type="https://schema.org/Text" />
<fulfillment urlTemplate="https://zavanton.com/services{?service}">
<parameter-mapping
intentParameter="service1"
urlParameter="service" />
</fulfillment>
</action></code></pre>
<p>Так работают кастомные intent, они очень похожи на build-in intent. В них мы можем прописать собственную логику. Тем не менее у кастомных intent есть ограничения:</p>
<ul readability="5">
<li readability="3">
<p>Ограниченное количество типов параметров, которые мы можем передавать: текст, число, дата и время</p>
</li>
<li readability="-1">
<p>Может быть всего два текстовых параметра</p>
</li>
<li readability="5">
<p>В списке команд queryPatterns нужно указывать команды дословно — это самое большое ограничение. Да, Google Ассистент будет воспринимать их дословно. Если мы какой-то кейс упустили, ассистент ещё не настолько умён, чтобы правильно обработать наш кастомный intent</p>
</li>
</ul>
<p>Из-за последнего ограничения лучше использовать built-in intent — благодаря более гибкому и мощному механизму считывания команд пользователя. Но если у вас какой-то редкий случай, вполне можно воспользоваться кастомным intent, но очень хорошо продумать, какие формулировки хочется услышать от пользователя.</p>
<h3>Заключение</h3>
<p>Это довольно интересная технология. На моём примере можете ещё раз посмотреть репозитории <a href="https://github.com/zavanton123/app-actions-demo">https://github.com/zavanton123/app-actions-demo</a>.</p>
<p>В нём собирается весь код. Немножко пришлось повозиться с настройкой окружения.</p>
<p>Самое большое ограничение в технологии — она заточена под английский язык. Есть встроенные intent, которые обрабатывают другие языки, но русского пока не нашёл. Планы по локализации пока неясны. Будем надеяться, что, если Google не похоронит эту технологию раньше времени, она будет развиваться, и мы сможем её использовать в нашем приложении, заточенном на русский. Но если ваше приложение ориентировано на английский язык, можно уже сейчас в продакшене пробовать какие-то фичи и экспериментировать с интентами от Google</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-59393197793111206632021-12-09T21:36:00.003+03:002021-12-09T21:36:49.904+03:00Восстановление знаков пунктуации и заглавных букв — теперь и на длинных текстах<p><img src="https://habrastorage.org/r/w780q1/webt/st/je/my/stjemymnnjxkq5cwzcjspy9w4f8.jpeg" alt="изображение" data-src="https://habrastorage.org/webt/st/je/my/stjemymnnjxkq5cwzcjspy9w4f8.jpeg" data-blurred="true" /></p>
<p><a href="https://colab.research.google.com/github/snakers4/silero-models/blob/master/examples_te.ipynb" rel="nofollow noopener noreferrer"><img src="https://habrastorage.org/getpro/habr/post_images/f4b/2a9/316/f4b2a931637833ba516509a93f28f40b.svg" alt="Open In Colab" /></a></p>
<p>После <a href="https://habr.com/ru/post/581946/">релиза нашей первой модели</a>, расставляющей знаки препинания и большие буквы, было много пожеланий доработать её, чтобы она могла обрабатывать тексты целиком, а не отдельные предложения. Это коллективное пожелание и было осуществлено в нашей новой версии модели.</p>
<p><img src="https://habr.com/img/image-loader.svg" alt="изображение" data-src="https://habrastorage.org/webt/ga/w0/qb/gaw0qbivdwgibyf18ylgc3h-owq.png" /></p>
<p>В целом, архитектура и датасеты остались прежними. Что изменилось:</p>
<br />
<ul>
<li>обучение теперь производилось не на отдельных предложениях, а на нескольких последовательных предложениях (принимаем во внимание, что конструктивное ограничение модели при обучении — 512 токенов на вход, что позволяет свободно подавать ~150 слов на любом из четырех поддерживаемых языков)</li>
<li>для ускорения обучения модели сокращение словаря теперь проводилось не только на инференсе, но и на трейне, что позволило увелить размер батча</li>
</ul>
<br />
<h2 id="razmer-modeli-i-ee-szhatie">Размер модели и ее сжатие</h2>
<p>Первая версия модели на момент релиза уже весила меньше 100 мегабайт. После этого мы выбросили еще 20 тысяч токенов (размер токена, напомним, 768) — токенов с большой буквой в начале, про которые мы забыли в тот раз, и которые модель, очевидно, не использует. Так модель еще немного ужалась до 85 мегабайт.</p>
<p>Как и раньше, основным секретом такого удобного размера выступает статическая и динамическая квантизация.</p>
<p>Что мы еще попробовали:</p>
<br />
<ol readability="7.0953237410072">
<li readability="9.4759825327511">
<p>прунинг — с помощью кода из оригинального <a href="https://github.com/huggingface/transformers/" rel="nofollow noopener noreferrer">репо базовой модели</a> действительно удалось проанализировать головы и подрезать лишние, но это, во-первых, резко ухудшило качество модели, во-вторых, из-за особенностей архитектуры модели, головы — не единственные тяжеловесные ее части, и выигрыш по размеру составил только 10 мегабайт, что вообще не имеет смысла при ухудшении метрик;</p>
<br /></li>
<li readability="4.7169811320755">
<p><a href="https://habr.com/ru/post/563778/">факторизацию</a> — вывод примерно аналогичный, хоть выигрыш и составил здесь около 20 мегабайт, эмбеддинг стал работать сильно менее успешно и вероятно требовал очень длительного дообучения, что тоже выходило бы не вполне рационально.</p>
<br /></li>
</ol>
<p>В итоге от обеих перечисленных техник было разумнее отказаться.</p>
<br />
<h2 id="rezultaty">Результаты</h2>
<p>Напомним, что для этой задачи мы снимаем метрики на валидационных сабсетах наших приватных текстовых корпусов (<code>5,000</code> предложений на каждый язык) и на текстах <a href="http://www.caito.de/2019/01/the-m-ailabs-speech-dataset/" rel="nofollow noopener noreferrer">caito</a> (<code>20,000</code> случайных предложений на каждый язык). Более подробно про снятие метрик — в нашей <a href="https://habr.com/ru/post/581946/">статье</a> про первую версию модели.</p>
<p>В этот раз для краткости приведем только WER (word error rate) в процентах, причем отдельно рассчитанный для пунктуации (и предсказание, и оригинал при этом приведены к строчному виду) — <code>WER_p</code> и для расставления заглавных букв (а здесь выбрасываем всю пунтуацию) — <code>WER_c</code>.</p>
<p>Мы посчитали метрики как для входных данных, представляющих из себя блоки из нескольких последовательных предложений, так и на отдельных предложениях, чтобы удостовериться, что новая версия модели действительно включает в себя функционал старой.</p>
<p>В ячейках указан <code>WER_p</code> / <code>WER_c</code>, а наивный бейзлайн состоит в постановке заглавной буквы в начале текста и точки в конце.</p>
<br />
<h3 id="wer---rabota-modeli-na-blokah-iz-neskolkih-predlozheniy">WER — работа модели на блоках из нескольких предложений</h3>
<p><strong>Домен — валидационные данные:</strong></p>
<p><strong>Домен — книги:</strong></p>
<br />
<h3 id="wer---rabota-modeli-otdelnyh-predlozheniyah">WER — работа модели отдельных предложениях</h3>
<p><strong>Домен — валидационные данные:</strong></p>
<p><strong>Домен — книги:</strong></p>
<p>Впрочем, еще работая с текстами caito в первый раз, мы заметили, что они далеки от идеала — нередко предложения будто обрезаны или перемешаны, внутри предложения вклинивается другое, начинающееся с большой буквы, но без точки до этого, — что, конечно, на блоках предложений становится еще более заметным. Вероятно, таковы издержки предобработки текстов книг. Тем не менее, решили уже не переходить на другие датасеты для удобства сравнения метрик — понятно, что полученные числа скорее коррелируют с реальным качеством работы модели на произвольных данных.</p>
<br />
<h3 id="primery-raboty-modeli">Примеры работы модели</h3>
<p>Как и раньше, приведем непосредственные примеры работы модели — в этот раз поможем Агенту Смиту с пунктуацией и заглавными буквами на трех оставшихся языках:</p>
<br />
<h2 id="kak-zapustit">Как запустить</h2>
<p>Модель, как и первая ее версия, выложена в репозитории проекта <a href="https://github.com/snakers4/silero-models" rel="nofollow noopener noreferrer">silero-models</a>. А вот простой запуск модели (подробнее, как обычно, в <a href="https://colab.research.google.com/github/snakers4/silero-models/blob/master/examples_te.ipynb" rel="nofollow noopener noreferrer">colab</a>):</p>
<pre><code class="plaintext">import torch
model, example_texts, languages, punct, apply_te = torch.hub.load(repo_or_dir='snakers4/silero-models',
model='silero_te')
input_text = input('Enter input text\n')
apply_te(input_text, lan='en')</code></pre>
<br />
<h2 id="dalneyshie-plany">Дальнейшие планы</h2>
<p>В перспективе есть мысли переработать и расширить тренировочный корпус текстов — например, сейчас в нем заметно не достает примеров разговорной живой речи, как в субтитрах.</p>
<p>Еще одна особенность модели, тоже проявившаяся именно при работе с целыми абзацами текста: из-за того, что модель предсказывает заглавные буквы и пунктуацию раздельно — на каждую подзадачу отдельная голова, — изредка эти предсказания выходят несогласованными. В процессе разработки модели мы пробовали делать общую голову для обеих задач, но она работала хуже раздельных. Опция, которую хорошо бы еще проверить, — предсказывать сначала расстановку заглавных букв (это более простая задача), а потом подавать это предсказание вместе с входной текстовой последовательностью для расстановки пунктуации.</p>
<p>P. S. Делитесь остроумными примерами работы модели в комментариях и голосуйте за понравившиеся! Лучшие фразы добавим как встроенные примеры в следующем релизе :D</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-39764199725188114652021-12-09T21:36:00.001+03:002021-12-09T21:36:48.153+03:00Конкурс статей на Хабре «Технотекст» стал финалистом Премии Рунета 2021<p>В 2021 году Премия Рунета собрала 1097 заявок, 16 номинаций, лучшие социальные, технические, культурные, научные проекты. В номинации «Креативные индустрии» был заявлен конкурс статей на Хабре «Технотекст», который в этом году проводится в четвёртый раз. Проект Хабра сперва попал в шорт-лист, а затем на объявлении результатов был назван среди финалистов. </p>
<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" height="688" data-src="https://habrastorage.org/getpro/habr/upload_files/f96/ca2/9f9/f96ca29f9a2371439dc9873683ef3f3d.png" data-width="1283" /></figure>
<p>Уже 4 года подряд мы проводим на нашем ресурсе конкурс лучших технических статей: собираем работы от сообщества по разным IT-направлениям и даём экспертам выбрать лучших из них. В этом году мы надеемся собрать 1000 заявок и подготовили 25 тематических номинаций и одну секретную, о которой участники узнают в самом финале. Конкурс, который мотивирует айтишников заниматься творчеством: делиться своим профессиональным и личным опытом, лайфхаками, создавать уникальные материалы. В рамках конкурса мы прокачиваем айтишных авторов, чтобы их контент становился лучше с каждым годом. </p>
<p>В 2021 году команда Хабра заявилась на Премию Рунета, значимую интернет-премию в российском сегменте. Нашей целью было не только принять участие и дойти до финала или стать лауреатом, но информировать широкую аудиторию о возможности присоединиться к конкурсу, потому что он открывает интересные перспективы для авторов.</p>
<p>Спасибо всей команде Хабра за кропотливую и непростую работу над конкурсом! 💖</p>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0tag:blogger.com,1999:blog-8624170009513620962.post-15023066405618801202021-12-09T20:36:00.001+03:002021-12-09T20:36:54.930+03:00[Перевод] Неопределенное поведение может привести к путешествиям во времени<figure class="full-width"><img src="https://habr.com/img/image-loader.svg" height="439" data-src="https://habrastorage.org/getpro/habr/upload_files/bea/f74/761/beaf74761d5b7a38d69eac3d64814f95.png" data-width="780" /></figure>
<p>Языки C и C++ печально известны большими областями на картах, которые отмечены предупреждением “<a href="http://en.wikipedia.org/wiki/Here_be_dragons"><em><u>тут обитают драконы</u></em></a>”, а если говорить более формально, речь идет о <em>неопределенном поведении (undefined behavior)</em>.</p>
<p>Когда мы сталкиваемся с неопределенным поведением, может произойти все что угодно. Например, <a href="http://markshroyer.com/2012/06/c-both-true-and-false/"><u>переменная может быть одновременно и true, и false</u></a>. В блоге Джона Регера (John Regehr) есть <a href="http://blog.regehr.org/archives/759"><u>парочка интересных примеров</u></a> неопределенного поведения, а также определены несколько <a href="http://blog.regehr.org/archives/767"><u>победителей</u></a> объявленного в комментариях конкурса на самый сумасшедший объектный код, генерируемый компилятором в результате неопределенного поведения.</p>
<p>Рассмотрим следующую функцию:</p>
<pre><code class="cpp">int table[4];
bool exists_in_table(int v)
{
for (int i = 0; i <= 4; i++) {
if (table[i] == v) return true;
}
return false;
}</code></pre>
<p><a href="http://blogs.msdn.com/b/oldnewthing/archive/2013/10/11/10455907.aspx#10456678"><u>Какое это имеет отношение к путешествию во времени</u></a>, спросите вы? Погодите, немного терпения.</p>
<p>Прежде всего, в схеме управления циклом вы могли заметить ошибку смещения на единицу. В результате чего, функция будет считывать еще один элемент, следующий за конечным элементом массива данных в <code>table</code>, прежде чем цикл завершится. Классический компилятор не особо это заботит. Он просто сгенерирует код для чтения элемента за границей массива (несмотря на то, что это нарушение правил синтаксиса языка), и вернет <code>true</code>, если в памяти за пределами массива, оказалось бы подходящее по типу значение.</p>
<p>С другой стороны, постклассический компилятор мог бы выполнить следующий анализ:</p>
<ul readability="3">
<li readability="9">
<p>Когда i равно 4, в коде происходит неопределенное поведение. Поскольку неопределенное поведение позволяет мне делать все, что угодно, я могу полностью проигнорировать этот случай и предположить, что i никогда не будет равно четырем. (Если предположение окажется ошибочным, произойдет что-то непредвиденное, но это нормально, потому что неопределенное поведение позволяет мне действовать непредсказуемо.)</p>
</li>
</ul>
<ul readability="3">
<li readability="9">
<p>Случай, когда i равно 5, невозможен, потому что для того, чтобы это произошло, нужно сначала пройти через i = 4, что, как нам позволено считать, может не произойти.</p>
</li>
</ul>
<p>Таким образом, постклассический компилятор может оптимизировать функцию следующим образом:</p>
<pre><code class="cpp">bool exists_in_table(int v)
{
return true;
}</code></pre>
<p>Так, вот это уже выглядит странно. Функция была оптимизирована практически до ничего из-за неопределенного поведения. Обратите внимание, что даже если значение отсутствует в <code>table</code> (включая даже недопустимый <a href="http://www.amazon.com/dp/0800195175?tag=tholneth-20"><u>пятый элемент</u></a>), функция все <em>равно вернет</em> <code>true</code>.</p>
<p>Теперь мы можем продвинуть постклассическое поведение еще на один шаг: поскольку компилятор может допустить, что неопределенное поведение никогда не возникнет (ведь, если это происходит, компилятор может делать <em>все, что угодно</em>), например, он может использовать неопределенное поведение в целях оптимизации.</p>
<pre><code class="cpp">int value_or_fallback(int *p)
{
return p ? *p : 42;
}</code></pre>
<p>Вышеупомянутая функция получает указатель на целое число и либо возвращает указанное значение, либо (если указатель равен <code>null</code>) возвращает резервное значение 42. Здесь пока все нормально.</p>
<p>Теперь, в целях дебага давайте добавим в функцию эту строчку.</p>
<pre><code class="cpp">int value_or_fallback(int *p)
{
printf("The value of *p is %d\n", *p);
return p ? *p : 42;
}</code></pre>
<p>Добавленная строчка содержит баг: она разыменовывает указатель <code>p</code>, не проверив предварительно, равен ли он <code>null</code>. Однако этот маленький баг влечет масштабные последствия. Постклассический компилятор оптимизирует функцию, потому что он видит, что проверка нулевого указателя больше не требуется, следующим образом:</p>
<pre><code class="cpp">int value_or_fallback(int *p)
{
printf("The value of *p is %d\n", *p);
return *p;
}</code></pre>
<p>Если бы указатель был равен <code>null</code>, тогда <code>printf</code> уже вызвал бы неопределенное поведение, поэтому компилятору разрешено делать что угодно в случае, если указатель имеет значение <code>null</code> (даже например, представить, что указатель не равен <code>null</code>).</p>
<p>Ладно, тут нет ничего удивительного. Возможно, что это и есть та оптимизация, которую вы ожидаете от компилятора. (Например, если тернарный оператор был спрятан в макрос, можно ожидать, что компилятор не проведет проверку, которая гарантированно будет <code>false</code>.)</p>
<p>Но постклассический компилятор теперь может использовать содержащую ошибки функцию, чтобы начать путешествие во времени.</p>
<pre><code class="cpp">void unwitting(bool door_is_open)
{
if (door_is_open) {
walk_on_in();
} else {
ring_bell();
// ждем, пока дверь откроется, со значением по умолчанию
fallback = value_or_fallback(nullptr);
wait_for_door_to_open(fallback);
}
}</code></pre>
<p>Постклассический компилятор может оптимизировать всю функцию следующим образом:</p>
<pre><code class="cpp">void unwitting(bool door_is_open)
{
walk_on_in();
}</code></pre>
<p>Что произошло?</p>
<p>Компилятор заметил, что вызов <code>value_or_fallback(nullptr)</code> приводит к неопределенному поведению по всем путям кода. Распространяя этот анализ назад, компилятор замечает, что если <code>door_is_open</code> имеет значение <code>false</code>, то в ветке <code>else</code> вызывается неопределенное поведение по всем путям кода. Следовательно, всю else ветвь можно считать невозможной.²</p>
<p>А теперь мы наконец-то переходим к путешествию во времени:</p>
<pre><code class="cpp">void keep_checking_door()
{
for (;;) {
printf("Is the door open? ");
fflush(stdout);
char response;
if (scanf("%c", &response) != 1) return;
bool door_is_open = response == 'Y';
unwitting(door_is_open);
}
}</code></pre>
<p>Постклассический компилятор может запомнить вывод, что “если door_is_open равно false, то происходит неопределенное поведение”, и переписать эту функцию следующим образом:</p>
<pre><code class="cpp">void keep_checking_door()
{
for (;;) {
printf("Is the door open? ");
fflush(stdout);
char response;
if (scanf("%c", &response) != 1) return;
bool door_is_open = response == 'Y';
if (!door_is_open) abort();
walk_on_in();
}
}</code></pre>
<p>Обратите внимание, что исходный код звонил в колокольчик перед сбоем, а оптимизированная функция пропускает звонок и сразу же вылетает. Можно сказать, что компилятор вернулся в прошлое и отменил прозвеневший звонок.</p>
<p>“Путешествие в прошлое” возможно даже для объектов с внешней видимостью, например файлов, потому что стандарт допускает, чтобы все происходило в момент, когда обнаруживается неопределенное поведение. И это позволяет прыгнуть в машину времени и притвориться, что вы никогда не звонили <code>fwrite</code>.</p>
<p>Даже если вы возьметесь утверждать, что компилятору не разрешено путешествовать во времени, все равно можно увидеть, что предыдущие операции отменены. Например, может так случиться, что неопределенная операция приведет к повреждению буферов файлов, поэтому данные на самом деле никогда не записывались. Даже если буферы были очищены, эта операция могла привести к вызову функции ftruncate, созданную для логического удаления только что записанных данных. Или же это могло привести к тому, что <code>DeleteFile</code> удалил файл, которые вы предполагали, что создали.</p>
<p>Все эти виды поведения имеют один общий заметный эффект, а именно отмена предыдущего действия. Было ли действие выполнено, было изменено или никогда не происходило, вопрос спорный с точки зрения теории компиляторов.</p>
<p>Компилятор также мог в прошлом размножить эффект неопределенной операции.</p>
<p>¹ Примечание автора: согласно стандарту - путешествие во времени допустимо перед возникновением неопределенного поведения:</p>
<p>Однако, если любое такое выполнение содержит неопределенную операцию, этот международный стандарт не налагает никаких требований на реализацию, выполняющую эту программу с этим входом (<u>также это касается операций, предшествующих первой неопределенной операции</u>).</p>
<p>² Другой способ взглянуть на это преобразование состоит в том, что компилятор увидел, что else ветвь вызывает неопределенное поведение для всех путей кода, после чего он переписал код, воспользовавшись правилом, согласно которому неопределенное поведение допускает что угодно:</p>
<pre><code class="cpp">void unwitting(bool door_is_open)
{
if (door_is_open) {
walk_on_in();
} else {
walk_on_in();
}
}</code></pre>
<p>В данном случае, “<code>walk_on_in</code>” по ошибке было принято за “anything”.</p>
<p><strong>Дополнительная информация</strong>: обратите внимание, что есть некоторые категории неопределенного поведения, которые могут быть неочевидными. Например, разыменование нулевого указателя является неопределенным поведением, даже если вы пытаетесь противодействовать разыменованию до того, как он сделает что-нибудь опасное.</p>
<pre><code class="cpp">int p = nullptr;
int& i = p;
foo(&i); // undefined</code></pre>
<p>Вы можете подумать, что & и взаимоуничтожаются, и результат остается такой же, как если бы вы написали foo(p), но тот факт, что вы создали ссылку на несуществующий объект, даже если вы по сути не делали этого, вызывает неопределенное поведение (§8.5.3 (1)).</p>
<p>Похожие статьи: Что должен знать каждый программист на C о неопределенном поведении, <a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html"><u>часть 1</u></a>, <a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know_14.html"><u>часть 2</u></a>, <a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know_21.html"><u>часть 3</u></a>.</p>
<p>Обновление: разделил & на две строки, потому что одиночная является проблемой.</p>
<hr />
<blockquote readability="12.874269005848">
<p>Материал подготовлен в рамках курса <a href="https://otus.pw/eUXs/">«Программист С».</a></p>
<p>Всех желающих приглашаем на бесплатное demo-занятие <strong>«WinAPI: пишем GUI приложение на C и кросскомпилируем из-под Linux».</strong> На открытом уроке мы разберём несложное приложение с графическим интерфейсом, использующее WinAPI, а так же скомпилируем выполняемый .exe файл для Windows, находясь в Linux, с помощью инструмента сборки CMake.<br />
<a href="https://otus.pw/ifeL/"><strong>>> РЕГИСТРАЦИЯ</strong></a></p>
</blockquote>
<p><strong><a href="https://blockads.fivefilters.org">Adblock test</a></strong> <a href="https://blockads.fivefilters.org/acceptable.html">(Why?)</a></p>
<div class="blogger-post-footer">Вы читаете <a href="http://habrparser.blogspot.com/" >Парсер Хабра</a> </div>Anonymoushttp://www.blogger.com/profile/08150333499716520467noreply@blogger.com0