<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Ivan Istomin</title><generator>teletype.in</generator><description><![CDATA[I have no idea what I'll think about tomorrow.]]></description><image><url>https://img3.teletype.in/files/af/4b/af4baef7-52f7-466e-8d9b-3ff6692c7685.png</url><title>Ivan Istomin</title><link>https://blog.istomin.im/</link></image><link>https://blog.istomin.im/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/istomin?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/istomin?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 07 May 2026 19:49:55 GMT</pubDate><lastBuildDate>Thu, 07 May 2026 19:49:55 GMT</lastBuildDate><item><guid isPermaLink="true">https://blog.istomin.im/AmneziaVPNSteamOS</guid><link>https://blog.istomin.im/AmneziaVPNSteamOS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin</link><comments>https://blog.istomin.im/AmneziaVPNSteamOS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin#comments</comments><dc:creator>istomin</dc:creator><title>Установка AmneziaVPN на SteamOS Holo</title><pubDate>Tue, 07 Jan 2025 07:28:03 GMT</pubDate><category>Developing</category><description><![CDATA[Приветствую, господа! Сам лично пользуюсь AmneziaVPN, но произошла проблема, официальная документация не содержит информацию об установке на, по сути, Arch Linux, и данный пробел я хочу исправить!]]></description><content:encoded><![CDATA[
  <p id="IZ15">Приветствую, господа! Сам лично пользуюсь AmneziaVPN, но произошла проблема, <a href="https://docs.amnezia.org/documentation/installing-app-on-linux/" target="_blank">официальная документация не содержит</a> информацию об установке на, по сути, Arch Linux, и данный пробел я хочу исправить!</p>
  <h2 id="jAx4">Подготовка к установке</h2>
  <p id="7ROD">Если вы только первый раз начинаете пользоваться консолью, вам нужно для начала задать пароль администратора</p>
  <p id="pF63"><code>~$ passwd</code></p>
  <p id="exJQ">Далее, вам нужно отключить режим readonly, для того чтобы иметь возможность устанавливать пакеты</p>
  <p id="JQFi"><code>~$ sudo steamos-readonly disable</code></p>
  <p id="X4nQ">А далее, устанавливаем нужные нам пакеты</p>
  <pre id="W6cn">~$ sudo pacman -S libxcb xcb-util-cursor opengl-driver iptables</pre>
  <blockquote id="0OX5">Далее было предложено установить Xwayland, но этого делать категорически не нужно, потому что у Valve присутствует своя версия которая сочетает как запуск Wayland приложение так и X11 без танцев с бубнами.</blockquote>
  <h2 id="x9CF">Скачиваем бинарный файл и начинаем его устанавливать</h2>
  <p id="at5d">Скачать: <a href="https://github.com/amnezia-vpn/amnezia-client/releases/download/4.8.10.0/AmneziaVPN_4.8.10.0_linux_x64.tar.zip" target="_blank">https://github.com/amnezia-vpn/amnezia-client/releases/download/4.8.10.0/AmneziaVPN_4.8.10.0_linux_x64.tar.zip</a></p>
  <ol id="jVg4">
    <li id="oapz">Извлекаем <code>AmneziaVPN_4.8.10.0_linux_x64.tar.zip</code> сначала просто из zip файла, а потом просто командой <code>tar -xf AmneziaVPN_Linux_Installer.tar</code></li>
    <li id="35qN">Далее мы получаем <code>AmneziaVPN_Linux_Installer.bin</code>, с которым нам и осталось отработать</li>
    <li id="StWZ">Далее прописываем права на исполнение файла <code>chmod 755 AmneziaVPN_Linux_Installer.bin</code></li>
    <li id="QeXy">Ну и на последнее, запускаем файл и устанавливаем приложение, которое будет работать как обычная программа: <code>QT_QPA_PLATFORM=xcb ./AmneziaVPN_Linux_Installer.bin</code></li>
  </ol>
  <h3 id="AVnL">Всем приятное игры, если будут вопрос, исправим статью, добавим дополнительных комментариев!</h3>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.istomin.im/true-thoughts-one</guid><link>https://blog.istomin.im/true-thoughts-one?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin</link><comments>https://blog.istomin.im/true-thoughts-one?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin#comments</comments><dc:creator>istomin</dc:creator><title>Почему именно так?</title><pubDate>Tue, 31 Jan 2023 13:22:36 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/35/3c/353c26de-9abc-4fbf-bfc9-bdf39aab00cb.png"></media:content><category>Philosophy</category><description><![CDATA[<img src="https://bits.media/upload/iblock/084/sem_benkman_frid_potentsial_kriptovalyutnykh_derivativov_nedootsenivaetsya.jpg"></img>Живя в России я всегда думал, какой ужас, какой кошмар что всю власть забрали по сути те, кто был авторитетом в 90-х, ну и какой-то процент просто людей, которые туда попали и тоже неплохо поживились.]]></description><content:encoded><![CDATA[
  <figure id="MsvW" class="m_original">
    <img src="https://bits.media/upload/iblock/084/sem_benkman_frid_potentsial_kriptovalyutnykh_derivativov_nedootsenivaetsya.jpg" />
    <figcaption>Сэм Бэнкман-Фрид, почему он в заголовке? Потому что один из тех кто больше всех кто получит по щщам, и поверьте, ситуация с ним куда сложнее, чем просто FTX, Alameda, и самое главное, его сильно альтруистические наклонности. Он американец - биржа американская, это важно понимать.</figcaption>
  </figure>
  <p id="Mkoy">Живя в России я всегда думал, какой ужас, какой кошмар что всю власть забрали по сути те, кто был авторитетом в 90-х, ну и какой-то процент просто людей, которые туда попали и тоже неплохо поживились.</p>
  <p id="wur8">Но вдруг, тут наступает война, да, именно война, война между нациями, двумя державами, Россией и США, можете сколь угодно говорить что “бомбят хохлов” (простите, украинцы), но это не их война, и время <strong>уже</strong> это показало.</p>
  <p id="zasO">На войне убивают людей, людей жалко , я вообще про мирных промолчу, причем мирных убивают с двух сторон, а также война двигатель прогресса, и что прикажете думать? Доллар надоел, США везде лезет, недавно было собрание по поводу регулирования криптовалюты, может еще ядерную Кима отрегулируете?</p>
  <p id="gECk">Я ни в коем случае не поддерживаю политику России и США, Украина в данном случае лишь пешка, ею играют два реально сильных игрока, и она, как бы грубо или смешно это не звучало — ради власти и денег. В красном случае больше ради власти, в синем, больше ради денег, кажется не будет победы или проигрыши, выведут мистер Пу, просто выведет войска или, что он там любит там делать, и типа ничего и не было.</p>
  <p id="789f">Все настолько плохо, что люди стоящие рядом с мистером Пу, также врут ему, воруют и вообще неплохо доживают те дни, пока еще можно чем-то насладиться.</p>
  <p id="HsH5">Живя в стране, которая когда-то сходила в состав СССР, я осознал много вечей, да, Россия действительно имеет сильных ученых, айтишников, систему образования, развалившуюся на половину правда, но имеет. Вижу глупость стран, думающим, что из России приезжают богатые люди, меня много раз пытались нагреть, но мы не об этом (нагревали, если интересно). </p>
  <p id="1p8i">Мишустин со своими «давайте делать свои системы», может успешно идти в сами знаете какое место, вместо того, чтобы создать пространство как Маск, типа OpenAI, арендовать здание, платить хорошие бабки айтишникам просто тупо для того чтобы они &quot;что-то делали&quot; и придумывали, мы покупаем яхты, отправляет детей в Лондоны, «потому что я не хочу чтобы мои дети жили также как когда-то жил я», да пошел ты в пизду, проблема «плохо» заработанных денег в «плохом их инвестировании». И вот весь мир «охуевать» от <strong>chatGPT</strong>, от его движка в целом и так далее, я уже молчу про другие разработки данной компании. Выложи свои деньги продай ссаную яхту ублюдок, если надеюсь, ее еще не конфисковали. У нас нет частной космонавтики именно из-за таких как вы.</p>
  <p id="drb2">Я просто набросал мыслей, который крутятся в голове каждый день, будет продолжение, и не одно. Плохого дня.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.istomin.im/eating-traditional-finance</guid><link>https://blog.istomin.im/eating-traditional-finance?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin</link><comments>https://blog.istomin.im/eating-traditional-finance?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin#comments</comments><dc:creator>istomin</dc:creator><title>Как DeFi поглощает традиционные финансы</title><pubDate>Wed, 27 Jan 2021 20:32:45 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/eb/6a/eb6a5245-bc38-4afe-a84f-19b73c13b011.png"></media:content><category>Finance</category><description><![CDATA[<img src="https://teletype.in/files/76/1d/761d3263-54ca-460b-8e34-9935312b3e13.png"></img>Эта статья изначально была размещена на dYdX, которая в свою очередь была размещена на The Pomp Letter.]]></description><content:encoded><![CDATA[
  <figure class="m_original">
    <img src="https://teletype.in/files/76/1d/761d3263-54ca-460b-8e34-9935312b3e13.png" width="2000" />
    <figcaption>Воронка</figcaption>
  </figure>
  <blockquote>Эта статья изначально была размещена на <em><u><a href="https://integral.dydx.exchange/eating-traditional-finance/" target="_blank">dYdX</a></u></em>, которая в свою очередь была размещена на <u><em><a href="https://pomp.substack.com/p/how-defi-is-eating-traditional-finance" target="_blank">The Pomp Letter</a></em></u>.</blockquote>
  <p>С созданием базового блока Bitcoin в мире появилось первое по-настоящему децентрализованное финансовое приложение. Bitcoin позволил любому человеку в мире хранить богатство без необходимости в централизованной организации. Это богатство можно было взять и отправить в любую точку мира, единственным требованием было подключение к Интернету. По мере того, как сеть Bitcoin росла с увеличением количества владельцев и передаваемой ценности, разработчики начали искать способы создания более сложных финансовых операций. Это противоречило тому, как сообщество Bitcoin относилось к компромиссам между безопасностью и выгодными финансовыми инструментами, что создавало нераскрытые возможности для создания блокчейна, которая могла бы способствовать заключению более сложных финансовых контрактов.</p>
  <p>Когда был запущен Ethereum, он стремился стать глобальным компьютером, способным обеспечивать работу произвольного количества приложений с помощью &quot;умных&quot; контрактов. Мания ICO 2017 года отразила это видение, но Ethereum как платформа в конечном итоге оставила желать лучшего для большинства приложений. Среди всего этого шума, стало все более очевидным, что Ethereum является плодородной почвой для экспериментов в финансовых приложениях. Ethereum резко сократил расходы, связанные с различными финансовыми операциями, включая формирование капитала, выпуск активов (отсюда и пузырь ICO), обмен активами, администрирование займов, управление залоговым обеспечением и многое другое. После того, как в 2017 году завалы были расчищены, сообщество Ethereum начало активно развиваться и получило название &quot;DeFi&quot; (сокращение от &quot;децентрализованное финансирование&quot;).</p>
  <p>DeFi имел огромные перспективы с учетом того, насколько неэффективным является традиционное финансирование, а также с учетом того, насколько хорошо его цели согласуются с основной идеей крипто-сообщества. Умные контракты Ethereum позволяли управлять деньгами программно, без необходимости центральной инстанции, что, в свою очередь, создавало много преимуществ с точки зрения эффективности. Аналогичным образом, приложения DeFi были открыты и не требовали разрешений. Как и Bitcoin, любой мог получить к ним доступ, все, что ему было нужно, это подключение к Интернету.</p>
  <p>Сравните это с традиционной финансовой системой, и вы легко поймете, насколько более привлекателен DeFi. В традиционном мире финансовые приложения труднодоступны, сложны в использовании, а главное, дорогостоящи.</p>
  <p><strong>Ранние признаки соответствия продукта рынку</strong><br />Вскоре после того, как сообщество Ethereum сплотилось вокруг DeFi и выделило инженерные ресурсы на создание инфраструктуры, появились первые признаки движения. В эти первые дни наиболее многообещающими разработками были примитивы DeFi: строительные блоки, которые можно было строить друг на друге для создания более эффектных приложений. Компетентность этих примитивов помогает создавать сильные сетевые эффекты, в которых ценность продуктов и услуг растет по мере увеличения числа пользователей DeFi.</p>
  <p>Первым случаем использования, когда был обнаружен большой рост, были стеблкоины. Стаблкоины просты, они представляют собой активы, предназначенные для удержания привязки к другому активу, который в случае с самыми популярными стаблконами, считается долларом США. Со стаблкоинами любой желающий может совершать сделки в долларах, по всему миру, и без задержек. Стаблкоины кажутся примитивными на поверхности, но иметь возможность свободно отправлять доллары в рамках криптоэкосистемы всегда было трудно — мир фиата и мир крипто не очень-то взаимозаменяемы.</p>
  <p>Стаблконы действительно начали расти, когда на рынке появились новые примитивы. Возможность обмена стаблкойнов через децентрализованные биржи, такие как dYdX, 0x и Kyber, или возможность занимать и выдавать стаблкоины через такие платформы, как dYdX и Compound, сделала стаблконы намного более мощными. Пользователи могут оставаться на связи для многих своих банковских потребностей.</p>
  <p>Мы ясно видим, что эмиссия стаблекойн действительно взлетела в конце 2018 года, как раз в то время, когда многие из первых примитивов DeFi появились на рынке. Сумма долларов в USDT, выделенная в Ethereum, выросла до более чем 6 миллиардов долларов США практически с 0. USDC также наблюдал астрономический рост, увеличившись до более чем 1 миллиарда долларов США в течение менее чем двух лет.</p>
  <figure class="m_retina">
    <img src="https://teletype.in/files/0b/0e/0b0e6a57-2a5f-4c86-ba62-c23448958157.png" width="1200" />
    <figcaption>Данные взяты на основе сетевой диаграммы CoinMetrics</figcaption>
  </figure>
  <p>Децентрализованный обмен был еще одним примитивом, который взлетел в 2019 году. При децентрализованных биржах &quot;умные&quot; контракты обрабатывают все части биржевого процесса — они проверяют, что каждый владелец владеет активами, что он одобрил передачу, и, как только они удовлетворяют требованиям, контракты атомизируют обмен активами между двумя контрагентами. Опять же, это кажется простым, но традиционный процесс обмена может быть дорогостоящим и подвергает пользователей большому риску со стороны контрагента. Как мы видели снова и снова, обмены могут идти вниз с криптой всех своих клиентов.</p>
  <p>Автоматизированные маркет-мейкеры продвинули концепцию децентрализованной биржи на шаг вперед, устранив необходимость в централизованном маркет-мейкере для цитирования обеих сторон книги. Есть много причин, по которым AMM стали прорывной моделью для децентрализованных бирж. Во-первых, для токен-проектов привлечение маркет-мейкеров является чрезвычайно дорогостоящим – сделки очень односторонние и концентрируют слишком большое влияние в руках маркет-мейкера. Во-вторых, для маркет-мейкеров предоставление ликвидности на децентрализованных биржах является дорогостоящим, учитывая латентность и стоимость внутрицепочечных сделок. С помощью AMM проекты могут иметь ликвидность с первого дня, что значительно облегчает загрузку сообществ и сетей.</p>
  <p>Последний примитив DeFi, о котором стоит упомянуть, это заимствование и кредитование рынков, а точнее, заимствование и кредитование непосредственно из &quot;умного&quot; контракта. Эти системы позволяют любому, у кого есть простаивающие активы, вложить их в общий кредитный пул, а любому, кто хочет занять активы, снять их из этого пула в обмен на проценты. Девелоперы смогли создать мощные продукты, сформировав топ-рынок этих кредитных рынков. Например, кредитные рынки dYdX поддерживают глобальную систему маржинальной торговли — способность трейдеров зарабатывать проценты помогает приносить больше ликвидности в платформу.</p>
  <h3>Куда идет DeFi?</h3>
  <p>DeFi только начал процесс децентрализации наиболее важных составляющих традиционного финансирования. 2020 год стал переломным для компании DeFi — отмеченные выше примитивы используются для создания как продуктов, конкурирующих с традиционными решениями, так и новых сетевых продуктов, которые недоступны в сегодняшней системе.</p>
  <p>Недавний бум добычи ликвидности на самом деле представляет собой интересную игру на генерации доходности. Хотя большая часть доходности зависит от инфляции, а не от реальных процентов или денежных потоков, она предлагается в то время, когда большинство традиционных банков предлагают ставки по сбережениям, близкие к 0%. В связи с этим мы наблюдаем огромный приток капитала в экосистему. Даже если это краткосрочная перспектива, этот новый капитал помогает стимулировать эксперименты до тех пор, пока не будет найдено что-то ценное. Точно так же, эти протоколы имеют внутреннюю ценность через свои денежные потоки. Так что даже если доходность со временем обвалится, у них все равно есть пол, который намного больше, чем все, что предлагается в традиционной банковской системе.</p>
  <figure class="m_retina">
    <img src="https://teletype.in/files/c6/47/c64753ae-48da-4f6a-b81c-c79a96ca789e.png" width="1200" />
    <figcaption>Данные взяты из DeFi Pulse</figcaption>
  </figure>
  <p>Децентрализованная биржа — это также вертикаль, которая будет продолжать расти в краткосрочной и среднесрочной перспективе, и мы ожидаем, что в ближайшие несколько лет она превзойдет большинство централизованных бирж. Уже сегодня было много дней, в течение которых торговля на Uniswap превосходила торговлю на Gemini, Kraken и даже на Coinbase. Такие события, как добыча ликвидности, повысят ликвидность, предлагаемую на децентрализованных биржах, до такой степени, что трейдеры смогут обмениваться по более дешевому курсу, чем на централизованных биржах, и без KYC. Кроме того, децентрализованные биржи все еще находятся в режиме v1.0. На dYdX мы приложили все усилия, чтобы построить маржинальную торговлю и самый первый синтетический BTC бессрочный своп, все в цепочке, так что пользователям никогда не придется отказываться от опеки над своими средствами. В ближайшие несколько месяцев мы также <a href="https://integral.dydx.exchange/scaling-with-starkware/" target="_blank">запустим наше решение Layer 2 со Starkware</a>, которое значительно сократит расходы, увеличит пропускную способность и позволит торговать большим количеством торговых пар, а также предоставит возможность кросс-маржинальной торговли на наших вечных рынках.</p>
  <figure class="m_retina">
    <img src="https://teletype.in/files/64/b9/64b9e40d-99c6-4a02-b814-dd57854721d5.png" width="1200" />
    <figcaption>Данные получены от компании Dune Analytics</figcaption>
  </figure>
  <p>Еще одной областью, в которой децентрализованное финансирование подрывает деятельность своих централизованных контрагентов, является кредитование. Кредитование по цепочке всегда критиковалось за неспособность администрировать кредиты с недостаточным залоговым обеспечением из-за отсутствия средств правовой защиты и идентичности, но вскоре ситуация может измениться в связи с новым порядком кредитования, разработанным Aave для делегирования кредитов. С помощью своей системы владельцы токенов смогут ставить свои активы под кредитную репутацию другого адреса (привязанного к пользователю), что позволит этому адресу заимствовать средства без избыточного обеспечения кредита. Если этот пользователь не погасит кредит, то именно его стейкер <em>[Прим. И: держатель]</em> будет наказан, то есть держатели токенов будут мотивированы действовать таким образом, чтобы не навредить им, фактически помогая гарантировать, что только кредитоспособные заемщики смогут брать беззалоговые кредиты.</p>
  <p>Наконец, в экосистеме DeFi появились собственные предложения страхования, позволяющие пользователям приобрести защиту от рисков, связанных с &quot;умными&quot; контрактами. Одним из самых больших барьеров на пути внедрения DeFi в первые дни существования компании было отсутствие страховки. Ни один традиционный страховщик не входил в пространство, поэтому участники экосистемы строили свои собственные решения. С помощью таких протоколов, как Nexus Mutual и Opyn, пользователи DeFi могут защитить свои депозиты без необходимости в традиционном банке или учреждении.</p>
  <p>Все инновации, происходящие в экосистеме DeFi, подтверждают тот факт, что децентрализованное финансирование может создавать финансовые приложения, которые более желательны, чем те, которые существуют в традиционном мире. Мы уже видим, как некоторые проекты DeFi обгоняют части централизованной криптоэкономики, и вскоре эта деятельность начнет обгонять традиционный мир. Никогда еще не было такой потребности в финансовой системе, которая была бы более справедливой, открытой и эффективной. В dYdX мы не могли придумать более захватывающей миссии, к которой можно было бы стремиться.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.istomin.im/r10VNiuaB</guid><link>https://blog.istomin.im/r10VNiuaB?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin</link><comments>https://blog.istomin.im/r10VNiuaB?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin#comments</comments><dc:creator>istomin</dc:creator><title>Письмо от Ларри и Сергея</title><pubDate>Sat, 07 Dec 2019 04:01:58 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/aa/aa9a1e21-0d0c-4906-9ff7-2afd8b8ac7ba.png"></media:content><category>Translate</category><description><![CDATA[<img src="https://teletype.in/files/aa/aa9a1e21-0d0c-4906-9ff7-2afd8b8ac7ba.png"></img>Ларри Пейдж и Сергей Брин
— Основатели Alphabet

Письмо опубликовано 03 Декабря 2019 года. Источник.]]></description><content:encoded><![CDATA[
  <figure class="m_retina">
    <img src="https://teletype.in/files/aa/aa9a1e21-0d0c-4906-9ff7-2afd8b8ac7ba.png" width="356.5" />
    <figcaption>Alphabet, Inc.</figcaption>
  </figure>
  <blockquote>Ларри Пейдж и Сергей Брин<br />— Основатели Alphabet<br /><br />Письмо опубликовано 03 Декабря 2019 года. <a href="https://www.blog.google/inside-google/alphabet/letter-from-larry-and-sergey/" target="_blank">Источник</a>.</blockquote>
  <hr />
  <p>Наше <a href="https://abc.xyz/investor/founders-letters/2004-ipo-letter/" target="_blank">самое первое письмо основателей</a> в 2004 году началось с S-1:</p>
  <blockquote>Google — это не типичная компания. Мы не намерены ею становиться. На протяжении всей эволюции Google, как частной компании, мы управляли Google по-разному. Мы также подчеркиваем, что атмосфера творчества и вызовов помогает нам обеспечивать объективный, точный и свободный доступ к информации для тех, кто на нас рассчитывает во всем мире.</blockquote>
  <p>Мы считаем, что эти основные постулаты остаются в силе и по сей день. Компания не является традиционной и продолжает делать амбициозные ставки на новые технологии, особенно на структуру нашей компании Alphabet. Креативность и вызовы остаются как никогда актуальными, если не более актуальными, и все чаще применяются в различных областях, таких как машиностроение, энергоэффективность и транспорт. Тем не менее, основной сервис Google - предоставление непредвзятого, точного и свободного доступа к информации - остается в центре внимания компании.</p>
  <p>Однако с тех пор, как мы написали первое письмо основателей, компания развивалась и становилась зрелой. В Google есть все популярные потребительские сервисы, которые последовали за Поиском, такие как Карты, Фотографии и YouTube; глобальная экосистема устройств на базе наших платформ Android и Chrome, включая наши собственные устройства Google; Google Cloud, включая GCP и G Suite; и конечно же основа основных технологий для обучения машин, облачных вычислений и разработки ПО. Это честь, что миллиарды людей решили сделать эти продукты центральным элементом своей жизни - это доверие и ответственность, над которыми Google всегда будет работать.</p>
  <p>И в организационном плане в 2015 году компания превратилась в Alphabet. Как мы и <a href="https://abc.xyz/" target="_blank">сказали в письме-основании Alphabet</a> в 2015 году: </p>
  <blockquote>Alphabet — это процветание бизнеса благодаря сильным лидерам и независимости.</blockquote>
  <p>С тех пор как мы написали это, сотни жителей Финикса в настоящее время ездят на машинах Waymo - многие из них без водителей! Wing стала первой беспилотной компанией, которая осуществила коммерческие поставки для потребителей в США. И Verily и Calico делают важную работу, благодаря сотрудничеству с рядом других медицинских компаний. Некоторые из наших &quot;Других ставок&quot; имеют собственные советы директоров с независимыми членами и внешними инвесторами.</p>
  <p>Это лишь несколько примеров технологических компаний, которые мы создали в рамках Alphabet, в дополнение к инвестиционным дочерним компаниям GV и Capital G, которые поддержали еще сотни компаний. Вместе со всеми сервисами Google это формирует красочный набор ставок на технологии в различных отраслях промышленности - и все это с целью помочь людям и решить основные проблемы.</p>
  <hr />
  <p>Наше <a href="https://abc.xyz/investor/founders-letters/2004/" target="_blank">второе письмо основателей</a> было начато так:</p>
  <blockquote>Google родился в 1998 году. Если бы это был человек, то начальную школу он бы начал в конце лета прошлого года (около 19 августа), а сегодня почти закончил бы первый класс.</blockquote>
  <p>Сегодня, в 2019 году, если бы компания была человеком, ей бы исполнился 21 год, и пришло время покинуть покой. Хотя для нас было огромной честью принимать активное участие в повседневном управлении компанией так долго, мы считаем, что пришло время взять на себя роль гордого родителя, предлагающего советы и любовь, но не ворчащего каждый день!</p>
  <p>Теперь, когда Alphabet хорошо зарекомендовал себя, а Google и другие компании эффективно работают как независимые компании, настало подходящее время упростить нашу структуру управления. Мы никогда не держались за руководящие должности, когда думали, что есть лучший способ управлять компанией. А Alphabet и Google больше не нуждаются в двух генеральных директорах и президенте. В дальнейшем Сундар будет генеральным директором как Google, так и Alphabet. Он будет отвечать за руководство компанией Google и управление инвестициями компании в наши &quot;Другие ставки&quot;, а также отвечать за руководство компанией. Мы глубоко привержены принципам Google и Alphabet в долгосрочной перспективе и будем продолжать активно работать в качестве членов Совета директоров, акционеров и соучредителей. Кроме того, мы планируем продолжать регулярно общаться с Сундаром, особенно на темы, которые нас очень интересуют! </p>
  <p>Сундар несет смирение и глубокую страсть к технологиям нашим пользователям, партнерам и нашим сотрудникам каждый день. Он тесно сотрудничал с нами в течение 15 лет, создавая компанию Alphabet в качестве генерального директора Google и члена совета директоров компании Alphabet. Он разделяет нашу уверенность в ценности структуры Alphabet и в том, что она дает нам возможность решать большие задачи с помощью технологий. Нет никого, на кого мы могли бы положиться с момента основания Alphabet, и нет человека, который мог бы лучше вести Google и Alphabet в будущее.</p>
  <p>Мы глубоко смирились с тем, что небольшой исследовательский проект превратился в источник знаний и возможностей для миллиардов людей, ставку, которую мы сделали в качестве двух студентов Стэнфордского университета и которая привела к множеству других технологических ставок. Мы и представить себе не могли, в 1998 году, когда мы переместили наши серверы из общежития в гараж, путешествие, которое должно было последовать за этим.</p>
  <hr />
  <p><em>Во вторник, 3 декабря, Сундар отправил следующее письмо всем сотрудникам компании Google:</em></p>
  <p>Привет всем,</p>
  <p>Когда несколько недель назад я посетил сотрудников Google в Токио, я говорил о том, как Google изменился за эти годы. На самом деле, за 15 с лишним лет работы в Google, единственное постоянство, что я наблюдал, это перемены. Этот процесс непрерывной эволюции, который основатели часто называют &quot;неудобно захватывающим&quot;, является частью того, кем мы являемся. Это утверждение будет особенно актуально сегодня, когда вы прочтетете новости, которые Ларри и Сергей только что опубликовали в нашем блоге.</p>
  <p>Ключевая идея, которую разделяют Ларри и Сергей, заключается в следующем: </p>
  <blockquote>Хотя для нас было огромной честью принимать активное участие в повседневном управлении компанией так долго, мы считаем, что пришло время взять на себя роль гордого родителя, предлагающего советы и любовь, но не ворчащего каждый день!<br /><br />Теперь, когда Alphabet хорошо зарекомендовал себя, а Google и другие компании эффективно работают как независимые компании, настало подходящее время упростить нашу структуру управления. Мы никогда не держались за руководящие должности, когда думали, что есть лучший способ управлять компанией. А Alphabet и Google больше не нуждаются в двух генеральных директорах и президенте. В дальнейшем Сундар будет генеральным директором как Google, так и Alphabet. Он будет отвечать за руководство компанией Google и управление инвестициями компании в наши &quot;Другие ставки&quot;, а также отвечать за руководство компанией. Мы глубоко привержены принципам Google и Alphabet в долгосрочной перспективе и будем продолжать активно работать в качестве членов Совета директоров, акционеров и соучредителей. Кроме того, мы планируем продолжать регулярно общаться с Сундаром, особенно на темы, которые нас очень интересуют!</blockquote>
  <p>Впервые я встретился с Ларри и Сергеем еще в 2004 году и с тех пор пользуюсь их советами и идеями. Хорошая новость заключается в том, что я буду продолжать работать с ними, хотя и в разных ролях для них и для меня. Они будут продолжать консультировать как членов совета директоров, так и соучредителей.</p>
  <p>Я хочу, чтобы было ясно, что этот переход не повлияет на структуру Alphabet и работу, которую мы выполняем изо дня в день. Я буду продолжать уделять большое внимание Google и той глубокой работе, которую мы проводим для расширения границ вычислений и создания более полезного Google для всех. В то же время, я очень рад за Alphabet и его долгосрочной ориентации на решение больших задач с использованием современных технологий.</p>
  <p>Учредители дали всем нам невероятный шанс оказать влияние на мир. Благодаря им у нас есть вечная миссия, непреходящие ценности и культура сотрудничества и исследований, которая делает нашу работу захватывающей каждый день. Это прочный фундамент, на котором мы будем продолжать строить. Не терпится увидеть, куда мы отправимся дальше и с нетерпением ждем продолжения путешествия со всеми вами. </p>
  <p>— Сундар</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.istomin.im/HyVX0QDtS</guid><link>https://blog.istomin.im/HyVX0QDtS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin</link><comments>https://blog.istomin.im/HyVX0QDtS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin#comments</comments><dc:creator>istomin</dc:creator><title>How to Install MongoDB on Debian 10 (Buster)</title><pubDate>Fri, 18 Oct 2019 12:20:44 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/85/85e81eed-4282-4c05-af6b-6ffc1eb97b02.png"></media:content><category>Developing</category><description><![CDATA[<img src="https://teletype.in/files/ac/acf5a463-0115-45ca-9b3f-80aba36ad030.png"></img>Because I couldn't find proper and working documentation for installing mongoDB on Debian 10 (Buster), I thought it would be useful to describe how I literally lost time with it.]]></description><content:encoded><![CDATA[
  <figure class="m_original">
    <img src="https://teletype.in/files/ac/acf5a463-0115-45ca-9b3f-80aba36ad030.png" width="1040" />
  </figure>
  <blockquote>Because I couldn&#x27;t find proper and working documentation for installing mongoDB on Debian 10 (Buster), I thought it would be useful to describe how I literally lost time with it.</blockquote>
  <h2>Prerequisites</h2>
  <p>This guide assumes that you are using Debian 10. Before you begin, you should have a non-root user with sudo privileges set up on your system. You can learn how to set this up by following the <a href="https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-10" target="_blank">initial server setup for Debian 10</a> tutorial.</p>
  <h2>Step 1. Add MongoDB repository</h2>
  <p>At the moment, the mongoDB repository simply doesn&#x27;t have a stable version 4 of the database for Debian 10, so we&#x27;ll have to go round the clock and look for everything ourselves (good thing I already did).</p>
  <p>First, we need to add the MongoDB signing key with <code>apt-key add</code>. We’ll need to make sure the <code>curl</code> command is installed before doing so:</p>
  <pre>~$ sudo apt install curl</pre>
  <p>Next we download the key and pass it to <code>apt-key add</code>:</p>
  <pre>~$ curl https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -</pre>
  <p>Next we’ll create a source list for the MongoDB repo, so <code>apt</code> knows where to download from. To do this, we execute the command:</p>
  <pre>~$ echo &quot;deb http://repo.mongodb.org/apt/debian buster/mongodb-org/development main&quot; | sudo tee /etc/apt/sources.list.d/mongodb-org.list</pre>
  <h2>Step 2. Install libcurl3</h2>
  <p>The <code>libcurl3</code> package is required by <code>mongodb-org-server</code>. Since the default version for Debian 10 is <code>libcurl4</code>, this package will be downloaded from added Debian 9 repository. To return the curl command to work, follow the steps described in <a href="https://dev.to/jake/using-libcurl3-and-libcurl4-on-ubuntu-1804-bionic-184g" target="_blank">this article</a>.</p>
  <pre>~$ echo &quot;deb http://deb.debian.org/debian/ stretch main&quot; | sudo tee /etc/apt/sources.list.d/debian-stretch.list
~$ sudo apt update
~$ sudo apt -y install libcurl3</pre>
  <h2>Step 3. Install MongoDB Server on Debian 10 (Buster)</h2>
  <p>We have added required repositories and installed <em>libcurl3</em>. Let’s now install MongoDB Server on Debian 10 (Stretch).:</p>
  <pre>~$ sudo apt -y install mongodb-org</pre>
  <p>Get package information with apt info command.</p>
  <pre>~$ apt info mongodb-org
Package: mongodb-org
Version: 4.2.1~latest
Priority: optional
Section: database
Maintainer: Ernie Hershey &lt;ernie.hershey@mongodb.com&gt;
Installed-Size: 13.3 kB
Depends: mongodb-org-shell, mongodb-org-server, mongodb-org-mongos, mongodb-org-tools</pre>
  <p>The installation of the above package will install the following dependency packages:</p>
  <p><strong>mongodb-org-server</strong> – This provides MongoDB daemon <strong>mongod</strong><br /><strong>mongodb-org-mongos</strong> – This is a MongoDB Shard daemon<br /><strong>mongodb-org-shell</strong> – This provides a shell to MongoDB<br /><strong>mongodb-org-tools</strong> – MongoDB tools used for export, dump, import etc</p>
  <h2>Step 4. Start MongoDB Server on Debian 10 (Buster)</h2>
  <p>The server daemon is named mongod. Start and set it to start on server reboot/boot up:</p>
  <pre>~$ sudo systemctl enable --now mongod</pre>
  <p>Check its running status:</p>
  <pre>~$ sudo systemctl status mongod
● mongod.service - MongoDB Database Server
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-10-18 14:53:55 MSK; 4s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 6596 (mongod)
   Memory: 78.5M
   CGroup: /system.slice/mongod.service
           └─6596 /usr/bin/mongod --config /etc/mongod.conf

Oct 18 14:53:55 220943.simplecloud.ru systemd[1]: Started MongoDB Database Server.</pre>
  <p>If you have caught an error the first time you run it, the following steps are likely to help you:</p>
  <pre>~$ sudo systemctl stop mongod
~$ sudo rm -rf /var/lib/mongodb
~$ sudo mkdir /var/lib/mongodb
~$ sudo chown -R mongodb:mongodb /var/lib/mongodb
~$ sudo systemctl start mongod</pre>
  <p>The service listens on localhost TCP port 27017 by default, check it:</p>
  <pre>~$ ss -tunelp
Netid            State             Recv-Q            Send-Q                             Local Address:Port                          Peer Address:Port
udp              UNCONN            0                 0                             96.123.217.94%eth0:68                                 0.0.0.0:*                uid:102 ino:82671 sk:1 &lt;-&gt;
udp              UNCONN            0                 0                                        0.0.0.0:68                                 0.0.0.0:*                ino:14242 sk:2 &lt;-&gt;
tcp              LISTEN            0                 128                                      0.0.0.0:22                                 0.0.0.0:*                ino:15174 sk:3 &lt;-&gt;
tcp              LISTEN            0                 128                                    127.0.0.1:27017                              0.0.0.0:*                uid:106 ino:259576 sk:7 &lt;-&gt;
tcp              LISTEN            0                 128                                      0.0.0.0:80                                 0.0.0.0:*                ino:144683 sk:4 &lt;-&gt;
tcp              LISTEN            0                 128                                         [::]:22                                    [::]:*                ino:15185 sk:5 v6only:1 &lt;-&gt;
tcp              LISTEN            0                 128                                         [::]:80                                    [::]:*                ino:144684 sk:6 v6only:1 &lt;-&gt;</pre>
  <p>That&#x27;s all, thanks for reading.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.istomin.im/Byk6Y69Vr</guid><link>https://blog.istomin.im/Byk6Y69Vr?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin</link><comments>https://blog.istomin.im/Byk6Y69Vr?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin#comments</comments><dc:creator>istomin</dc:creator><title>Opsian разговаривает с Алексеем Шипилевым об обновлениях JDK</title><pubDate>Wed, 21 Aug 2019 13:40:06 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/7c/7cd86f07-427d-4e33-b0a5-58de30601e4a.png"></media:content><category>Translate</category><category>Developing</category><description><![CDATA[<img src="https://teletype.in/files/16/1602ca34-522b-4c7f-9859-78bb9c9b7a96.png"></img>Ричард Варбертон из Opsian имел честь встретиться с Алексеем Шипилевым и узнать его мнения по целому ряду вопросов. В первой части интервью Алексей и Ричард обсуждают текущее состояние обновлений JDK.]]></description><content:encoded><![CDATA[
  <figure class="m_original">
    <img src="https://teletype.in/files/16/1602ca34-522b-4c7f-9859-78bb9c9b7a96.png" width="1177" />
    <figcaption>Часть I</figcaption>
  </figure>
  <blockquote>Ричард Варбертон из Opsian имел честь встретиться с Алексеем Шипилевым и узнать его мнения по целому ряду вопросов. В первой части интервью Алексей и Ричард обсуждают текущее состояние обновлений JDK.</blockquote>
  <p><strong>Ричард:</strong> Для тех, кто не знает, кто вы есть, не желаете ли вы представиться или рассказать нам немного о себе?</p>
  <p><strong>Алексей:</strong> Привет, я Алексей Шипилев, занимаюсь Java и производительностью уже около 15 лет. Вероятно, я могу перечислить проекты, в которых я принимал участие в OpenJDK: различные инструменты, такие как JMH, JCStress и JOL. Я сделал несколько параллельных тестов, провел общую работу по повышению производительности и некоторые из них включали в себя JEP. После работы в Red Hat я также работал с Epsilon и Shenandoah и помогаю с обновлениями OpenJDK для Red Hat.</p>
  <p><strong>Ричард:</strong> Точно. И вы бы сказали, что большую часть времени проводите в эти дни, работая над Shenandoah?</p>
  <p><strong>Алексей:</strong> Я бы сказал, что это половина с половиной: Я трачу половину своего времени на работу с Shenandoah, а половину - на общую работу в JVM. Последние несколько месяцев были заняты выпуском обновлений с первой волной исправлений после того, как Red Hat взял на себя техобслуживание 8u и 11u. Мы надеемся, что сейчас объем работы снизится, поэтому я бы тратил на это, может быть, день в неделю, или что-то в этом роде. Но да, до сих пор я провожу много времени, занимаясь выпуском обновлений.</p>
  <p><strong>Ричард:</strong> Так наверное, это хорошее место для начала, потому что я думаю, что в Java сообществе в целом довольно много путаницы по поводу того, что происходит на самом деле с обновлениями. Существует множество &quot; не бесплатных обновлений, не безопасности&quot;, много забот и всего остального. Я знаю, что есть несколько человек, которые выпустили более подробную документацию или информацию - возможно, вы захотите объяснить, что вы делаете и что Red Hat делает в этих обновлениях?</p>
  <p><strong>Алексей:</strong> Я думаю, что существует путаница вокруг того, что такое OpenJDK. Есть OpenJDK &quot;проект&quot; и OpenJDK &quot;дистрибутив&quot;. Путаница в том, что в дистрибутиве нет золотого двоичного кода для OpenJDK. Сайт OpenJDK не содержит двоичных файлов, что означает, что для создания сборки вам придется полагаться на нижестоящие дистрибутивы. [Редактор: Red Hat начал публиковать ванильные сборки на <a href="https://adoptopenjdk.net/upstream.html" target="_blank">https://adoptopenjdk.net/upstream.html</a> через некоторое время после этого интервью.]</p>
  <p>Во времена Sun/Oracle, это было обычное Sun/Oracle производство собственных нижестоящих дистрибутивов JDK на основе OpenJDK исходников. Недавно компания Oracle решила реализовать свои собственные разработки только при наличии коммерческой поддержки. Они также любезно публикуют сборки OpenJDK на своем сайте <a href="https://jdk.java.net/" target="_blank">https://jdk.java.net/</a></p>
  <p>Будучи поставщиком нижестоящих версий, как и все остальные, Oracle вольна выбирать, какие сборки публиковать. И на данный момент они предпочитают публиковать только последние сборки OpenJDK 12. Если вы хотите 11u или 8u от Oracle, вы должны пойти на их коммерческое предложение. Но это и есть часть Oracle, также существуют другие участники экосистемы, которые используют OpenJDK в качестве проекта, то есть репозитории исходных кодов, которые находятся в открытом доступе, и создают из них свои 8u и 11u бинарные файлы. Их много, включая, но не ограничиваясь ими, Red Hat, SAP, AdoptOpenJDK и т.д.</p>
  <p>Теперь вопрос в том, что содержат эти бинарные файлы? На это есть два ответа. Во-первых, существуют репозитории с открытым исходным кодом для 8u и 11u, из которых вы можете создавать свои сборки. Во-вторых, некоторые производители предпочитают применять некоторые дополнительные патчи, поскольку, например, не могут дождаться появления патча, чтобы он появился в потоке, а затем предоставить его своим пользователям. Тем не менее, я полагаю, что существует внутреннее давление на процесс распространения этих патчей, поскольку это помогает сбалансировать нагрузку на работу над обновлениями.</p>
  <p>Когда вы услышите новость о том, что Red Hat &quot;принимает&quot; права собственности на релизы 8u и 11u - это новость об Эндрю Хейли, который является официальным лидером проекта в этих проектах обновления OpenJDK. Речь идет скорее об официальной роли, которая делает Red Hat официально ответственным за эти исходные деревья и процессы вокруг них. Фактическая работа выходит за рамки этих формальностей. Если вы посмотрите, что там делается для текущей версии 8u212 и 11.0.3, вы увидите, что в то время как Red Hat выполняет значительную часть бэкпортных исправлений, есть и другие команды и другие компании, в частности SAP, которые очень активны. Другие производители, такие как Amazon и Google, также принимают активное участие в проекте.</p>
  <p>Существует общая площадка, где поставщики могут сотрудничать в выпусках обновлений, а затем создавать их на основе вышестоящего репозитория. Так что их собственные бинарные файлы 8u и 11u обычно сходятся в OpenJDK. Некоторые могут захотеть изобразить его как бесплатные джунгли для всех, когда у вас несколько поставщиков и вы не знаете, какой поставщик что поставляет, но в действительности большинство поставщиков действительно работают через этот вышестоящий процесс 8u и 11u, и таким образом в основном соглашаются, какие они имеют исходники.</p>
  <p>Думаю, это отвечает на вопрос о бесплатных обновлениях и бесплатных исправлениях ошибок. Исходные коды обновляются в рамках процесса обновления OpenJDK. Выберите производителя, который предоставляет вам бесплатные сборки (большинство из них) из тех исходников, и вы получите бесплатные обновления.</p>
  <p><strong>Ричард:</strong> Понятно. Таким образом, практическое значение для Java-разработчика заключается в том, что он все еще может использовать Java-приложение и запускать его на JVM разных производителей. И они вольны выбрать того, кто предложит лучший вариант поддержки по договору и процессу и тому подобное?</p>
  <p><strong>Алексей:</strong> Да, спецификация... Я имею в виду, есть обязательное тестирование, которое каждый релиз должен пройти под названием Java. Обычно поставщики проводят дополнительные тесты дополнительно к этому. Я надеялся на такой же уровень совместимости с другими версиями JDK.</p>
  <p>Если вы очень внимательно посмотрите на списки исправлений, публикуемые производителями, или на то, как они описывают свое отклонение от вышестоящих версий, то эти исправления окажутся незначительными. Например, вещи, которые помогают им встраивать в свою среду, предоставляют дополнительные сертификаты CA или делают что-то другое, что не является исправлением совместимости. Некоторые из них являются исправлениями ошибок или производительности, которые уже находятся в процессе обновления, но еще не перенесены в ванильный исходный код, который вы можете собрать прямо сейчас.</p>
  <p><strong>Ричард:</strong> Интересно, интересно. Ну, это немного меняющаяся экосистема для разработчиков Java, и им нужно понять, как адаптироваться и куда лучше всего двигаться.</p>
  <p><strong>Алексей:</strong> Да, я имею в виду, для некоторых людей. Другие, как и многие люди, работающие под Linux, с незапамятных времен привыкли иметь бинарные файлы OpenJDK от своих дистрибутивов, поскольку это было для них самым простым решением. Дистрибутивы Linux обычно собирают OpenJDK для вас. Полагаю, это в основном культурный сдвиг. До этого, только пользователи Linux привыкли к тому, что это был необязательный шаг, чтобы скачать бинарный файл Oracle со своего сайта...</p>
  <p><strong>Ричард:</strong> Точно, да, вы можете просто воспользоваться пакетом дистрибутива.</p>
  <p><strong>Алексей:</strong> Да. Для всех остальных, посещение Oracle было первым выходом, верно? Например, если вам нужен Java на рабочем столе Windows. Итак, то, что мы видим сейчас, это переход от менталитета одного производителя к менталитету Linux, когда вы выбираете провайдера, который предоставляет вам дистрибутив для продукта, в таких условиях, которые вам нравятся: платформы, для которых они собираются, частота/ оперативность выпуска, структура поддержки и т.д. Если вы не доверяете ни одному из существующих поставщиков, вы даже можете собрать OpenJDK самостоятельно и запустить его.</p>
  <p><strong>Ричард:</strong> И как бы вы прокомментировали, например, существующие дистрибутивы Linux и степень предоставляемого ими тестирования совместимости? Я имею в виду, вы упомянули, что Red Hat, очевидно, имеет большой доступ к тестированию, и как вы думаете, все ли дистрибутивы этого добиваются?</p>
  <p><strong>Алексей:</strong> Я не знаю, что именно дистрибутивы делают, но большинство из них строятся из одних и тех же исходных деревьев. Так что, если вы являетесь пользователем дистрибутива, то, вероятно, в ваших интересах пойти и спросить их об этом. По словам Эндрю Хейли: если вы не можете доверять пакету, который собирает ваш дистрибутив, то, возможно, вам не стоит использовать этот дистрибутив в первую очередь.</p>
  <p><strong>Ричард:</strong> Возможно. Да.</p>
  <p><strong>Алексей:</strong> Итак, да, если у вас есть сомнения относительно того, какие продукты входят в дистрибутив вашей операционной системы, тогда идите и спросите разработчиков, что находится в нем. Я бы сказал, что поскольку существует общая база кода для большинства сборщиков OpenJDK, то даже если вы вообще не будете тестировать и просто опубликуете бинарный файл и позволите пользователям установить его, существует очень большая вероятность, что непроверенный выпуск не будет нарушен. Поставщики, которые проводят тестирование, будут исправлять ошибки и публиковать исправления в деревьях исходных кодов.</p>
  <p><strong>Ричард:</strong> Да.</p>
  <p><strong>Алексей:</strong> Недочеты могут появиться, если ваша инструментальная связка слегка отличается от любой другой, такие вещи случаются. Я бы сказал, что скорость Red Hat в основном была протестирована так: мы собираем OpenJDK в виде RPM, а затем тестируем его. Поэтому мы уверены, что созданные нами бинарные файлы на самом деле проходят все тесты. Я не думаю, что это уникальная ситуация. Я думаю, это то же самое предложение для любого поставщика бинарных файлов: вы собираете что-то, проверяете, что бинарные программы работают, а затем вы публикуете их...</p>
  <p><strong>Ричард:</strong> Ага.</p>
  <p><strong>Алексей:</strong> Так что спросите у своего поставщика. Различия должны быть незначительными.</p>
  <hr />
  <p>На этом завершаем первую часть нашего интервью с Алексеем. Мы все еще готовим вторую часть, в которой речь пойдет о параллельных сборщиках мусора и Shenandoah в частности. Это будет в прямом эфире на следующей неделе, так что не забудьте.</p>
  <p>Мы хотели бы поблагодарить Алексея за то, что он уделил нам немного времени и посидел с нами, чтобы поделиться своими мыслями.</p>
  <hr />
  <p>Источник: <a href="https://www.opsian.com/blog/aleksey-shipilev-on-jdk-updates/" target="_blank">раз</a>, и еще ссылки на различные OpenJDK сборки со StackOverflow: <a href="https://stackoverflow.com/questions/52431764/difference-between-openjdk-and-adoptopenjdk" target="_blank">два</a>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.istomin.im/ryt-CLMmH</guid><link>https://blog.istomin.im/ryt-CLMmH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin</link><comments>https://blog.istomin.im/ryt-CLMmH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin#comments</comments><dc:creator>istomin</dc:creator><title>Автоматизация работы. Вывод реальных данных. Расширьте возможности с помощью плагинов Figma</title><pubDate>Sat, 03 Aug 2019 01:06:08 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/ab/ab3fb681-8108-4f5b-8d63-5f93217e984b.png"></media:content><category>Translate</category><category>Developing</category><description><![CDATA[<img src="https://teletype.in/files/4f/4fdd97c0-1dcc-4f4f-96f7-874d4b8df516.png"></img>Я рад представить плагины всему сообществу Figma, вместе с сотнями разработчиков, которые создали и опубликовали плагины во время нашей бета-версии. Сегодня все пользователи могут использовать эти плагины, разработанные нашим сообществом, и создавать свои собственные плагины, адаптированные к их рабочим процессам.]]></description><content:encoded><![CDATA[
  <figure class="m_original">
    <img src="https://teletype.in/files/4f/4fdd97c0-1dcc-4f4f-96f7-874d4b8df516.png" width="1060" />
    <figcaption>Мол вся такая сборная.</figcaption>
  </figure>
  <p>Я рад представить плагины всему сообществу Figma, вместе с сотнями разработчиков, которые создали и опубликовали плагины во время нашей бета-версии. Сегодня все пользователи могут использовать эти плагины, разработанные нашим сообществом, и создавать свои собственные плагины, адаптированные к их рабочим процессам.</p>
  <p>Большую часть своей профессиональной карьеры я посвятил разработке инструментов, которые позволяют другим людям создавать вещи. Предоставление другим людям возможности творческого подхода - это весело для меня, и работа над расширяемыми архитектурами - еще более веселая версия этого.</p>
  <p>Плагины всегда были в перспективе в Figma, но мы хотели сделать все иначе с архитектурой нашей платформы. Плагины являются критически важными компонентами рабочего процесса дизайнера, которые могут служить в качестве небольших бонусов и способствовать расширению функциональности продукта Figma. Однако, какими бы важными они ни были, дизайнерские плагины до сих пор не выполнили своего служебного долга. Мы увидели две основные проблемы:</p>
  <ol>
    <li>Хотя разработчики используют плагины, они не всегда надежны и безопасны. Это связано с тем, что они часто построены на не полностью поддерживаемых API.</li>
    <li>Дизайнеры находятся во власти других, чтобы создавать плагины для них, если они сами не знают, как писать код. И получить инженерно-технические знания всегда непросто.</li>
  </ol>
  <p>К счастью, мне пришлось работать с супер талантливыми инженерами и разработчиками плагинов из нашего сообщества, чтобы помочь решить эти проблемы. Конечно, мы хотели, чтобы наши плагины были безопасными, стабильными и работоспособными. Но мы также хотели, чтобы программирование плагинов Figma было похоже на веб-программирование. Наш внутренний девиз - &quot;Если вы можете запрограммировать веб-страницу с помощью базовых HTML и JavaScript, вы можете создать плагин Figma.&quot;</p>
  <p>Получается, что для этого возникло много технических сложностей (о которых мы поговорим в одном из последующих технических блогов). Нам также впервые пришлось выяснить, как выглядит архитектура плагина для веб-платформы, когда речь заходит об инструментах проектирования. Но при такой архитектуре платформы плагинов мы надеялись, что эти первоначальные затраты позволят большему числу создателей плагинов создавать более креативные, интересные плагины.</p>
  <blockquote>Плагины Figma обеспечивают легкость защиты себя и других, давая мне возможность создавать необходимые инструменты проектирования, а не скрещивать пальцы, надеясь, что кто-то другой сделает их за нас.<br />— <strong>Тиффани Чен, дизайнер UX Designer в Microsoft</strong></blockquote>
  <p>Всего через 6 недель бета-тестирования, у нас появилось более 40 публичных плагинов, доступных для сообщества Figma, с каждым днем их становится все больше. Вы можете просмотреть все плагины прямо в программе Figma. Установка плагина займет всего один клик. В своем проектном файле просто щелкните правой кнопкой мыши, чтобы получить все доступные плагины.</p>
  <hr />
  <p></p>
  <p><a href="https://www.figma.com/blog/introducing-figma-plugins/" target="_blank">Источник</a> статьи, а также <a href="https://github.com/Istom1n/Figma-Developer-Platform-Rus" target="_blank">ссылка на мой репозиторий на Github</a>, где я начал перевод документации Plugin API.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.istomin.im/Byge9bpQV</guid><link>https://blog.istomin.im/Byge9bpQV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin</link><comments>https://blog.istomin.im/Byge9bpQV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin#comments</comments><dc:creator>istomin</dc:creator><title>Что такое Global Interpreter Lock (GIL) в Python?</title><pubDate>Tue, 30 Jul 2019 19:50:07 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/4a/4a909ad4-7c9e-4303-8b09-f0d1a08a46bf.png"></media:content><category>Translate</category><category>Developing</category><description><![CDATA[<img src="https://files.realpython.com/media/python-gil-title.958a5bb2cecb.jpg"></img>И следом за одним переводом, перевод другой статьи, но уже про работу GIL в Python.]]></description><content:encoded><![CDATA[
  <figure class="m_custom">
    <img src="https://files.realpython.com/media/python-gil-title.958a5bb2cecb.jpg" width="960" />
  </figure>
  <blockquote>И следом за одним переводом, перевод другой статьи, но уже <a href="https://realpython.com/python-gil/" target="_blank">про работу GIL в Python</a>.</blockquote>
  <p>Проще говоря, Python Global Interpreter Lock или <a href="https://wiki.python.org/moin/GlobalInterpreterLock" target="_blank">GIL</a> — это мьютекс (или замок), который позволяет только одному потоку контролировать интерпретатор Python.</p>
  <p>Это означает, что только один поток может находиться в состоянии выполнения в любой момент времени. Влияние GIL не заметно разработчикам, выполняющим однопоточные программы, но оно может быть узким местом в многопоточном коде, привязанном к процессору.</p>
  <p>Поскольку GIL позволяет выполнять только один поток одновременно даже в многопоточной архитектуре с более чем одним ядром процессора, GIL завоевал репутацию &quot;печально известной&quot; функции Python.</p>
  <p><strong>В этой статье вы узнаете, как GIL влияет на производительность ваших программ Python, и как вы можете смягчить его влияние на ваш код.</strong></p>
  <h2>Какую проблему GIL решил для Python?</h2>
  <p>Python использует подсчет ссылок для управления памятью. Это означает, что объекты, созданные в Python, имеют переменную счетчика ссылок, которая отслеживает количество ссылок, указывающих на объект. Когда это число достигает нуля, освобождается память, занимаемая объектом.</p>
  <p>Давайте рассмотрим краткий пример кода, чтобы продемонстрировать, как работает подсчет ссылок:</p>
  <pre>&gt;&gt;&gt; import sys
&gt;&gt;&gt; a = []
&gt;&gt;&gt; b = a
&gt;&gt;&gt; sys.getrefcount(a)
3</pre>
  <p>В приведенном выше примере счетчик ссылок для объекта пустого списка <code>[]</code> равен 3, объект списка ссылается на <code>a</code>, <code>b</code> и аргумент переданный в <code>sys.getrefcount()</code>.</p>
  <p>Вернемся к GIL:</p>
  <p>Проблема заключалась в том, что эта переменная числа ссылок нуждалась в защите от состояния гонки, когда два потока одновременно увеличивают или уменьшают свое значение. Если это произойдет, то это может привести либо к утечке никогда не высвобождающейся памяти, либо, что еще хуже, к некорректному освобождению памяти при сохранении ссылки на этот объект. Это может привести к сбоям или другим &quot;странным&quot; ошибкам в ваших программах Python.</p>
  <p>Эта переменная счетчика ссылок может быть сохранена путем добавления блокировок во все структуры данных, которые являются общими для всех потоков, чтобы они не изменялись непоследовательно.</p>
  <p>Но добавление блокировки к каждому объекту или группам объектов означает, что будет существовать несколько блокировок, что может привести к другой проблеме deadlock&#x27;ов (блокировка может произойти только при наличии нескольких блокировок). Еще одним побочным эффектом было бы снижение производительности, вызванное повторным приобретением и разблокировкой замков.</p>
  <p>GIL - это единственный замок на самом интерпретаторе, который добавляет правило, что выполнение любого байт-кода Python требует получения блокировки интерпретатора. Это предотвращает возникновение тупиковых ситуаций (поскольку существует только один замок) и не приводит к значительным накладным расходам. Но это эффективно делает любую программу Python, привязанную к процессору, однопоточной.</p>
  <p>GIL, хотя и используется переводчиками для других языков, таких как Ruby, но это не единственное решение этой проблемы. Некоторые языки избегают необходимости использования GIL для управления поточно безопасной памятью, используя подходы, отличные от подсчета ссылок, такие как сбор мусора.</p>
  <p>С другой стороны, это означает, что этим языкам часто приходится компенсировать потерю однопоточных преимуществ производительности GIL, добавляя другие функции повышения производительности, такие как компиляторы JIT.</p>
  <h2>Почему в качестве решения был выбран именно GIL?</h2>
  <p>Итак, почему подход, который кажется таким мешающим, использовался в Python? Было ли это плохое решение разработчиков Python?</p>
  <p>Ну, <a href="https://www.youtube.com/watch?v=KVKufdTphKs&feature=youtu.be&t=12m11s" target="_blank">по словам Ларри Гастингса</a>, дизайнерское решение GIL сделало Python таким же популярным, как и сегодня.</p>
  <p>Python существует со времен, когда операционные системы не имели понятия потоков. Python был разработан для простоты использования, чтобы сделать разработку более быстрой, и все больше и больше разработчиков начали использовать его.</p>
  <p>Много расширений было написано для существующих библиотек на языке С, возможности которых были необходимы в Python. Для предотвращения непоследовательных изменений эти расширения C требовали управления памятью, обеспечиваемого GIL, в соответствии с требованиями безопасности потока.</p>
  <p>GIL прост в реализации и был легко добавлен в Python. Это обеспечивает повышение производительности однопоточных программ, так как необходимо управлять только одной блокировкой.</p>
  <p>Библиотеки языка С, которые не были потоко-безопасными, стало легче внедрять. И эти расширения C стали одной из причин, по которым Python был легко принят различными сообществами.</p>
  <p>Как вы видите, GIL был прагматичным решением сложной проблемы, с которой разработчики CPython столкнулись в самом начале жизни Python.</p>
  <h2>Влияние на многопоточные программы Python</h2>
  <p>Когда вы смотрите на типичную программу Python - или любую другую компьютерную программу для этой цели - есть разница между теми, которые привязаны к процессору, в производительности и теми, которые привязаны к вводу/выводу.</p>
  <p>Связанные с процессором программы - это те, которые толкают процессор до предела. Сюда входят программы, выполняющие математические вычисления, такие как умножение матриц, поиск, обработка изображений и т.д.</p>
  <p>I/O-связанные программы — это те, которые проводят время в ожидании ввода/вывода, который может исходить от пользователя, файла, базы данных, сети и т.д. Иногда программам ввода-вывода приходится ждать значительное количество времени, пока они получат то, что им нужно от источника, из-за того, что источнику может понадобиться сделать свою собственную обработку, прежде чем ввод/вывод будет готов, например, пользователь подумает о том, что делать во входной запрос или запрос к базе данных, выполняемый в его собственном процессе.</p>
  <p>Давайте посмотрим на простую программу, привязанную к процессору и выполняющую обратный отсчет:</p>
  <pre># single_threaded.py
# однопоточный
import time
from threading import Thread

COUNT = 50000000

def countdown(n):
    while n &gt; 0:
        n -= 1

start = time.time()
countdown(COUNT)
end = time.time()

print(&#x27;Время в секундах -&#x27;, end - start)</pre>
  <p>Выполнение этого кода на моем компьютере с 4 ядрами дало следующий результат:</p>
  <pre>$ python single_threaded.py
Время в секундах - 6.20024037361145</pre>
  <p>Теперь я немного изменил код, чтобы сделать то же самое с обратным отсчетом, используя два параллельных потока:</p>
  <pre># multi_threaded.py
# многопоточный

import time
from threading import Thread

COUNT = 50000000

def countdown(n):
    while n &gt; 0:
        n -= 1

t1 = Thread(target=countdown, args=(COUNT//2,))
t2 = Thread(target=countdown, args=(COUNT//2,))

start = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
end = time.time()

print(&#x27;Время в секундах -&#x27;, end - start)</pre>
  <p>И потом, когда я запустил его снова:</p>
  <pre>$ python multi_threaded.py
Время в секундах - 6.924342632293701</pre>
  <p>Как видите, обе версии занимают почти одинаковое количество времени для завершения. В многопоточной версии GIL предотвращал параллельное выполнение потоков, связанных с CPU.</p>
  <p>GIL не оказывает значительного влияния на производительность многопоточных программ, так как блокировка разделяется между потоками, пока они ожидают ввода/вывода.</p>
  <p>Однако программа, потоки ��оторой полн��стью привязаны к процессору, например, программа, обрабатывающая образ по частям с помощью потоков, не только станет однопоточной из-за блокировки, но и увеличит время выполнения, как показано в приведенном выше примере, по сравнению со сценарием, в котором она была написана как полностью однопоточная.</p>
  <p>Это увеличение является результатом увеличения накладных расходов, связанных с блокировкой.</p>
  <h2>Почему GIL еще не удалили?</h2>
  <p>Разработчики Python получают множество жалоб по этому поводу, но такой популярный язык, как Python, не может принести таких значительных изменений, как удаление GIL, не вызывая проблем с обратной несовместимостью.</p>
  <p>Очевидно, что GIL может быть удален, и это делалось несколько раз в прошлом разработчиками и исследователями, но все эти попытки сломали существующие расширения C, которые сильно зависят от решения, которое предоставляет GIL.</p>
  <p>Конечно, есть и другие решения проблемы, которые решает GIL, но некоторые из них снижают производительность однопоточных и многопоточных программ ввода-вывода, а некоторые из них слишком сложны. В конце концов, вы же не хотите, чтобы ваши существующие программы Python работали медленнее после выхода новой версии, не так ли?</p>
  <p>Создатель и BDFL (Великодушный пожизненный диктатор) Python Гвидо ван Россум в своей статье &quot;<a href="https://www.artima.com/weblogs/viewpost.jsp?thread=214235" target="_blank">Нелегко удалить GIL</a>&quot; в сентябре 2007 года дал ответ сообществу:</p>
  <blockquote>&quot;Я бы приветствовал набор патчей к Py3k только в том случае, если бы производительность однопоточной программы (и многопоточной, но связанной с вводом/выводом программы) не снизилась&quot;</blockquote>
  <p>И это условие не было выполнено ни одной из попыток, предпринятых с тех пор.</p>
  <h2>Почему его не удалили в Python 3?</h2>
  <p>У Python 3 был шанс запустить множество функций с нуля, и в процессе работы он сломал некоторые из существующих расширений C, которые затем потребовали обновления и портирования для работы с Python 3. Именно по этой причине ранние версии Python 3 были приняты сообществом не так быстро.</p>
  <p>Но почему GIL не был удален вместе с ним?</p>
  <p>Удаление GIL сделало бы Python 3 медленнее по сравнению с Python 2 в однопоточной производительности, и вы можете себе представить, к чему бы это привело. Вы не можете спорить с преимуществами однопоточной производительности GIL. В результате у Python 3 остался GIL.</p>
  <p>Но Python 3 действительно привнес значительные улучшения в существующий GIL...</p>
  <p>Мы обсудили влияние GIL на &quot;только CPU-связанные&quot; и &quot;только I/O-связанные&quot; многопоточные программы, но как насчет программ, где некоторые потоки являются I/O-связанными, а некоторые CPU-связанными?</p>
  <p>В таких программах GIL Python был известен тем, что не давал возможности получить GIL из потоков, связанных с процессором, что приводило к потере связи между вводом/выводом и выводом данных.</p>
  <p>Это произошло из-за встроенного в Python механизма, который заставлял потоки освобождать GIL <strong>после фиксированного интервала</strong> непрерывного использования, и если никто другой не получал GIL, тот же самый поток мог продолжать его использование.</p>
  <pre>&gt;&gt;&gt; import sys
&gt;&gt;&gt; # Интервал установлен в 100 команд:
&gt;&gt;&gt; sys.getcheckinterval()
100</pre>
  <p>Проблема в этом механизме заключалась в том, что большую часть времени процессорный поток перезагружал сам GIL, прежде чем другие потоки могли его получить. Это было исследовано Дэвидом Бизли и визуализации, которую можно найти <a href="https://www.dabeaz.com/blog/2010/01/python-gil-visualized.html" target="_blank">здесь</a>.</p>
  <p>Эту проблему в версии Python 3.2 в 2009 году исправил Антуан Питру, <a href="https://mail.python.org/pipermail/python-dev/2009-October/093321.html" target="_blank">добавив механизм</a> просмотра количества запросов на получение GIL другими потоками, которые были удалены, и не позволив текущему потоку перезагрузить GIL до того момента, пока у других потоков не появится возможность его запустить.</p>
  <h2>Как справиться с GIL в Python</h2>
  <p>Если GIL вызывает у вас проблемы, попробуйте несколько подходов:</p>
  <p><strong>Мультипроцессорная обработка по сравнению с многопоточной:</strong> Наиболее популярным способом является использование мультипроцессорного подхода, при котором вместо потоков используется несколько процессов. Каждый процесс Python получает свой собственный интерпретатор Python и область памяти, так что GIL не будет проблемой. Python имеет модуль <code><a href="https://docs.python.org/3.7/library/multiprocessing.html" target="_blank">multiprocessing</a></code>, который позволяет нам легко создавать подобные процессы:</p>
  <pre>from multiprocessing import Pool
import time

COUNT = 50000000
def countdown(n):
    while n&gt;0:
        n -= 1

if __name__ == &#x27;__main__&#x27;:
    pool = Pool(processes=2)
    start = time.time()
    r1 = pool.apply_async(countdown, [COUNT//2])
    r2 = pool.apply_async(countdown, [COUNT//2])
    pool.close()
    pool.join()
    end = time.time()
    print(&#x27;Время в секундах -&#x27;, end - start)</pre>
  <p>Запуск этой программы в моей системе дал такой результат:</p>
  <pre>$ python multiprocess.py
Время в секундах - 4.060242414474487</pre>
  <p>Приличный прирост производительности по сравнению с многопоточной версией, верно?</p>
  <p>Время не сократилось до половины того, что мы видели выше, потому что управление процессами имеет свои накладные расходы. Несколько процессов тяжелее, чем несколько потоков, поэтому имейте в виду, что это может стать узким местом в масштабировании.</p>
  <p><strong>Альтернативные интерпретаторы Python:</strong> У Python имеется несколько реализаций интерпретаторов. Наиболее популярными из них являются CPython, Jython, IronPython и PyPy, написанные на C, Java, C# и Python соответственно. GIL существует только в оригинальной реализации Python - CPython. Если ваша программа с библиотеками доступна для одной из других реализаций, то вы также можете попробовать их.</p>
  <p><strong>Просто подождите:</strong> В то время как многие пользователи Python используют преимущества однопоточной производительности GIL. Многопоточным программистам не нужно беспокоиться, так как одни из самых ярких умов сообщества Python работают над удалением GIL из CPython. Одна из таких попыток известна под названием &quot;<a href="https://github.com/larryhastings/gilectomy" target="_blank">Gilectomy</a>&quot;.</p>
  <p>Python GIL часто рассматривается как загадочная и сложная тема. Но имейте в виду, что как на Pythonista, на вас это обычно влияет, только если вы пишете расширения на C или если вы используете многопоточный процессор в ваших программах.</p>
  <p>В этом случае, эта статья должна дать вам все, что вам нужно, чтобы понять, что такое GIL и как с ним обращаться в ваших собственных проектах. И если вы хотите понять низкоуровневую внутреннюю работу GIL, я бы порекомендовал вам посмотреть выступление Дэвида Бизли &quot;<a href="https://www.youtube.com/watch?v=Obt-vMVdM8s&feature=youtu.be" target="_blank">Понимание работы GIL в Python</a>&quot;.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.istomin.im/S1Uk2v6zS</guid><link>https://blog.istomin.im/S1Uk2v6zS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin</link><comments>https://blog.istomin.im/S1Uk2v6zS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin#comments</comments><dc:creator>istomin</dc:creator><title>PHP в 2019</title><pubDate>Tue, 30 Jul 2019 18:14:29 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/bc/bcd86df0-a3d1-4c92-b8d7-fb6d51ceecd4.png"></media:content><category>Developing</category><category>Translate</category><description><![CDATA[<img src="https://teletype.in/files/df/df200622-8d3f-42ec-ab1b-5506ee92272a.png"></img>В надежде все-таки перенести свой сайт на иную платформу, мне как-то стало лень, и я решил остаться временно здесь. Тем более мне здесь вполне комфортно. Итак, продолжим мы молгое молчание с перевода статьи про то, как сильно изменился PHP к 2019 году и продолжает развивается.]]></description><content:encoded><![CDATA[
  <figure class="m_original">
    <img src="https://teletype.in/files/df/df200622-8d3f-42ec-ab1b-5506ee92272a.png" width="1200" />
  </figure>
  <blockquote>В надежде все-таки перенести свой сайт на иную платформу, мне как-то стало лень, и я решил остаться временно здесь. Тем более мне здесь вполне комфортно. Итак, продолжим мы молгое молчание с <a href="https://stitcher.io/blog/php-in-2019" target="_blank">перевода статьи про то, как сильно изменился PHP к 2019 году</a> и продолжает развивается.</blockquote>
  <p>Помните популярную заметку в блоге &quot;<a href="https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/" target="_blank">PHP: фрактал плохого дизайна</a>&quot;? Впервые прочитав ее, я работал в ужаснейшем месте с большим количеством legacy-проектов на PHP. Эта статья заставила меня задуматься, что мне стоит просто уйти и заняться чем-то совершенно иным, ежели программированием.</p>
  <p>К счастью для меня, я смог поменять работу сразу после увольнения, и, что более важно, PHP удалось развиться довольно быстро с тех пор, как он был еще  версии 5.*. Сегодня я обращаюсь к людям, которые либо больше не программируют на PHP, либо застряли в legacy-проектах.</p>
  <p>Спойлер: некоторые вещи до сих пор остаются уродскими, но как и в любом языке программирования есть, и у PHP есть свои причуды. Многие основные функции все еще имеют свои противоречивые сигнатуры методов, все еще существуют запутанные параметры конфигурации, многие разработчики все еще пишут хреновый код - потому что они вынуждены, или потому что они не знают как лучше.</p>
  <p>Сегодня я хочу посмотреть на положительные стороны: давайте сосредоточимся на том, что изменилось, и на том, как написать чистый и удобный для обслуживания PHP-код. Я хочу попросить вас отложить любые предрассудки на несколько минут.</p>
  <p>После этого вы можете думать о PHP точно так же, как и раньше. Хотя есть шансы на то, что вы будете удивлены некоторыми улучшениями, внесенными в PHP за последние несколько лет.</p>
  <h2>TL;DR</h2>
  <ul>
    <li>PHP активно развивается с каждым новым релизом каждый год</li>
    <li>Производительность с момента появления PHP 5 удвоилась, если не утроилась</li>
    <li>Существует крайне активная экосистема фреймворков, пакетов и платформ</li>
    <li>За последние несколько лет в PHP было добавлено много новых функций, и язык продолжает развиваться</li>
    <li>Инструменты, такие как статические анализаторы, выросли за последние годы и только продолжают расти</li>
  </ul>
  <p>Update: Люди попросили меня показать какой-либо реальный код. Я рад сообщить, что это возможно! Вот <a href="https://github.com/brendt/aggregate.stitcher.io" target="_blank">исходный код</a> одного из моих хобби-проектов, написанный на PHP и Laravel; <a href="https://spatie.be/open-source/packages" target="_blank">вот список из нескольких сотен OSS пакетов</a>, которые мы поддерживаем в нашем офисе. Оба являются хорошими примерами того, как выглядят современные PHP-проекты.</p>
  <p>Давайте начнем.</p>
  <h2>История в целом</h2>
  <p>Для хорошей оценки, давайте быстро рассмотрим цикл выпуска PHP на сегодняшний день. Сейчас мы на PHP версии 7.3, 7.4 ожидается в конце 2019 года. PHP 8.0 будет следующей версией после 7.4.</p>
  <p>Начиная с конца эры 5.*, основная группа старается поддерживать ежегодный цикл выпуска релизов, и добилась успеха в течение последних четырех лет.</p>
  <p>В целом, каждый новый релиз активно поддерживается в течение двух лет и получает еще один год на &quot;исправление проблем безопасности&quot;. Цель заключается в том, чтобы мотивировать разработчиков PHP оставаться как можно более современными: небольшие обновления каждый год намного проще, чем, например, переход с версии 5.4 на версию 7.0.</p>
  <p>Ознакомиться с активным графиком развития над PHP можно <a href="https://www.php.net/supported-versions.php" target="_blank">здесь</a>.</p>
  <p>И, наконец, PHP 5.6 был последним релизом 5.*, следующим был 7.0. Если вы хотите узнать, что случилось с PHP 6, вы можете послушать <a href="https://www.phproundtable.com/episode/what-happened-to-php-6" target="_blank">подкаст круглого стола PHP</a>.</p>
  <p>Разобравшись с этим, давайте опровергнем некоторые распространенные ошибочные представления о современном PHP.</p>
  <h2>Производительность PHP</h2>
  <p>Вернувшись в дни версии 5.*, производительность PHP была... в лучшем случае средней. Однако с выходом 7.0 большие куски ядра PHP были переписаны с нуля, что привело к увеличению производительности в два-три раза.</p>
  <p>Но слов недостаточно. Давайте посмотрим на бенчмарки. К счастью, другие люди потратили много времени на сравнительный анализ производительности PHP. Я считаю, что у <a href="https://kinsta.com/blog/php-benchmarks/" target="_blank">Kinsta</a> имеется хороший обновленный список.</p>
  <p>С момента обновления 7.0 производительность только возросла. Настолько, что веб-приложения PHP имеют сопоставимую - в некоторых случаях лучшую - производительность, чем веб-фреймворки на других языках. Взгляните на этот <a href="https://github.com/the-benchmarker/web-frameworks" target="_blank">обширный набор тестов</a>.</p>
  <p>Конечно, PHP-фреймворки не превзойдут C и Rust, но они работают намного лучше Rails или Django и сравнимы с ExpressJS.</p>
  <h2>Фреймворки и экосистема</h2>
  <p>Кстати о фреймворках: PHP больше не просто WordPress. Позвольте мне сказать вам кое-что как профессиональный разработчик PHP: WordPress ни в коей мере не представляет современную экосистему.</p>
  <p>В целом, существует два основных фреймворка веб-приложений, и несколько более мелких: <a href="https://symfony.com/" target="_blank">Symfony</a> и <a href="https://laravel.com" target="_blank">Laravel</a>. Конечно, есть также Zend, Yii, Cake, Code Igniter и т.д. — но если вы хотите знать, как выглядит современная разработка PHP, вы хорошо справляетесь с одним из этих двух.</p>
  <p>Оба этих фреймворка имеют большую экосистему, состоящую из пакетов программ и продуктов. От панелей администрирования или CRM до отдельных пакетов, от CI до профайлеров, от многочисленных сервисов, таких как серверы веб-сокетов, менеджеры очередей, платежные системы; честно говоря, их слишком много, чтобы перечислить.</p>
  <p>Однако эти фреймворки предназначены для продолжительного развития. Если вам нужен чистый контент-менеджмент, такие платформы, как WordPress и CraftCMS, совершенствуются все больше и больше.</p>
  <p>Одним из способов измерения текущего состояния экосистемы PHP является использование Packagist, основного репозитория пакетов для PHP. Он демонстрирует экспоненциальный рост. Имея ±25 миллионов загрузок в день, может с уверенностью сказать, что экосистема PHP не такая уж маленькая и отстающая экосистема, какой она была раньше.</p>
  <p>Посмотрите на этот график с указанием количества пакетов и версий с течением времени. С ним также можно ознакомиться <a href="https://packagist.org/statistics" target="_blank">на сайте Packagist</a>.</p>
  <figure class="m_retina">
    <img src="https://teletype.in/files/43/43287c4a-b0a5-4de5-98b3-f07cf351d0ef.png" width="1037.5" />
    <figcaption>Статистика <a href="https://packagist.org/" target="_blank">Packagist.org</a></figcaption>
  </figure>
  <p>Помимо фрейворков, приложений и CMS, мы также наблюдаем рост асинхронных фреймворков за последние годы.<br />Эти фреймворки и серверы, написанные на PHP или других языках, позволяют пользователям запускать по-настоящему асинхронный PHP. Несколько примеров в качестве примеров этого - <a href="https://www.swoole.co.uk/" target="_blank">Swoole</a>, <a href="https://amphp.org/" target="_blank">Amp</a> и <a href="https://reactphp.org/" target="_blank">ReactPHP</a>.</p>
  <p>С тех пор как мы осмелились войти в мир асинхронности, такие вещи, как веб-сокеты и приложения с большим количеством I/O, стали актуальными в мире PHP.</p>
  <p>Также, шла речь о списке рассылки внутренних почтовых рассылок — месте, где разработчики ядра обсуждают развитие языка — чтобы <a href="https://externals.io/message/102415#102415" target="_blank">добавить libuv в ядро</a>. Для тех, кто не знаком с libuv: это та же самая библиотека, которую использует Node.js, чтобы позволить себе всю ее асинхронность.</p>
  <h2>Сам язык</h2>
  <p>Хотя <code>async</code> и <code>await</code> еще не доступны, за последние годы язык значительно улучшился. Вот неполный список новых возможностей PHP:</p>
  <ul>
    <li><a href="https://stitcher.io/blog/short-closures-in-php" target="_blank">Короткие замыкания, также называемые функциями стрелок</a></li>
    <li><a href="https://stitcher.io/blog/shorthand-comparisons-in-php#null-coalescing-operator" target="_blank">Оператор объединения с null</a></li>
    <li><a href="https://www.php.net/manual/ru/language.oop5.traits.php" target="_blank">Трейты</a></li>
    <li><a href="https://stitcher.io/blog/typed-properties-in-php-74" target="_blank">Типизированные свойства</a></li>
    <li><a href="https://wiki.php.net/rfc/argument_unpacking" target="_blank">Оператор распространения</a></li>
    <li><a href="https://wiki.php.net/rfc/jit" target="_blank">JIT-компилятор</a></li>
    <li><a href="https://wiki.php.net/rfc/ffi" target="_blank">Интерфейс внешних функций</a></li>
    <li><a href="https://www.php.net/manual/ru/language.oop5.anonymous.php" target="_blank">Анонимные классы</a></li>
    <li><a href="https://www.php.net/manual/en/functions.returning-values.php#functions.returning-values.type-declaration" target="_blank">Объявление типа возвращаемой функцией</a></li>
    <li><a href="https://wiki.php.net/rfc/libsodium" target="_blank">Современная криптография</a></li>
    <li><a href="https://wiki.php.net/rfc/generators" target="_blank">Генераторы</a></li>
    <li><a href="https://www.php.net/ChangeLog-7.php" target="_blank">И многое другое</a></li>
  </ul>
  <p>Раз уж мы заговорили об особенностях языка, давайте поговорим о том, как он развивается сегодня. Существует активная основная группа добровольцев, которые продвигают язык вперед, хотя сообществу разрешено предлагать RFC.</p>
  <p>Далее, эти RFC обсуждаются в списке рассылки &quot;внутренних устройств&quot;, который также можно <a href="https://externals.io/" target="_blank">прочитать в интернете</a>. Перед добавлением новой языковой функции необходимо провести голосование. В ядре допускается только RFC с большинством голосов не менее 2/3.</p>
  <p>Существует, вероятно, около 100 человек, которым разрешено голосовать, хотя от вас не требуется голосовать по каждому RFC. Членам основной группы, конечно, разрешено голосовать, они должны вести базу данных. Кроме них, есть группа людей, которые были выбраны индивидуально сообществом PHP. В их число входят сопровождающие документации PHP, участники проекта PHP в целом и известные разработчики в сообществе PHP.</p>
  <p>Хотя большая часть основной работы выполняется на добровольной основе, один из основных разработчиков PHP, Никита Попов, недавно был <a href="https://blog.jetbrains.com/phpstorm/2019/01/nikita-popov-joins-phpstorm-team/" target="_blank">принят на работу в JetBrains</a> для работы над языком на полной ставке. Другой пример — Linux Foundation, который недавно решил <a href="https://getlaminas.org/" target="_blank">инвестировать во фреймворк Zend</a>. Подобные случаи найма и присоединения обеспечивают стабильность для будущего развития PHP.</p>
  <h2>Инструментарий</h2>
  <p>Помимо самого ядра, за последние несколько лет мы стали свидетелями увеличения количества инструментов вокруг него. На ум приходят статические анализаторы типа <a href="https://psalm.dev/" target="_blank">Psalm</a>, созданный Vimeo, <a href="https://github.com/phan/phan" target="_blank">Phan</a> и <a href="https://github.com/phpstan/phpstan" target="_blank">PHPStan</a>.</p>
  <p>Эти инструменты будут статически анализировать ваш PHP код и сообщать о любых типах ошибок, возможных ошибках и т.д. В некотором смысле, функциональность, которую они предоставляют, можно сравнить с TypeScript, хотя на данный момент язык не является открытым, поэтому не допускается использование пользовательского синтаксиса.</p>
  <p>Несмотря на то, что это означает, что нам нужно полагаться на документарные блоки, Расмус Лердорф, оригинальный создатель PHP, все же упомянул идею <a href="https://externals.io/message/101477#101592" target="_blank">добавления в ядро статического анализатора</a>. Несмотря на наличие большого потенциала, это огромная работа.</p>
  <p>Кстати, говоря о том, что все это происходит под влиянием сообщества JavaScript; были предприняты усилия по расширению синтаксиса PHP в пользовательском пространстве. Проект под названием <a href="https://preprocess.io/#/" target="_blank">Pre</a> делает именно это: разрешает новый синтаксис PHP, который появляется в обычном PHP коде.</p>
  <p>Хотя идея и зарекомендовала себя в мире JavaScript, она сможет работать в PHP только при наличии соответствующей поддержки статического и IDE-анализа. Это очень интересная идея, но она должна вырасти, прежде чем можно будет назвать ее &quot;мейнстримом&quot;.</p>
  <h2>В заключение</h2>
  <p>При этом не стесняйтесь думать о PHP как о дерьмовом языке. Хотя язык, безусловно, имеет свои недостатки и 20-летнее наследие, я могу с уверенностью сказать, что мне нравится работать с ним.</p>
  <p>По моему опыту, я могу создать надежное, удобное в обслуживании и качественное программное обеспечение. Клиенты, на которых я работаю, как и я, довольны конечным результатом.</p>
  <p>Хотя с PHP все еще можно делать много запутанных вещей, я бы сказал, что это отличный выбор для веб-разработки, если использовать его с умом и правильно.</p>
  <p>Разве вы не согласны? Дай мне знать, почему! Вы можете связаться со мной через <a href="https://twitter.com/istom1n" target="_blank">Twitter</a> или по <a href="mailto:ivan@istomin.im" target="_blank">электронной почте</a>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.istomin.im/Hy-hGUFfV</guid><link>https://blog.istomin.im/Hy-hGUFfV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin</link><comments>https://blog.istomin.im/Hy-hGUFfV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=istomin#comments</comments><dc:creator>istomin</dc:creator><title>Dependency injection для самых маленьких</title><pubDate>Mon, 14 Jan 2019 00:07:04 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/3e/3ecd8e0d-89c8-49a6-95a3-42f70c54223a.png"></media:content><category>Developing</category><description><![CDATA[<img src="https://github.com/Istom1n/istomin-io/raw/master/src/pages/articles/2018-07-05---Dependency-injection-%D0%B4%D0%BB%D1%8F-%D1%81%D0%B0%D0%BC%D1%8B%D1%85-%D0%BC%D0%B0%D0%BB%D0%B5%D0%BD%D1%8C%D0%BA%D0%B8%D1%85/cover.png"></img>Вы едете в машине бизнес-класса, ваша работа заключается в том, чтобы делать автомобили за заказ. Объектно-ориентированный программист говорит вам: &quot;нет проблем, я сделаю чертеж, который я могу использовать, чтобы сделать столько автомобилей, сколько я хочу!&quot;...]]></description><content:encoded><![CDATA[
  <figure class="m_custom">
    <img src="https://github.com/Istom1n/istomin-io/raw/master/src/pages/articles/2018-07-05---Dependency-injection-%D0%B4%D0%BB%D1%8F-%D1%81%D0%B0%D0%BC%D1%8B%D1%85-%D0%BC%D0%B0%D0%BB%D0%B5%D0%BD%D1%8C%D0%BA%D0%B8%D1%85/cover.png" width="793" />
  </figure>
  <p>Вы едете в машине бизнес-класса, ваша работа заключается в том, чтобы делать автомобили за заказ. Объектно-ориентированный программист говорит вам: &quot;нет проблем, я сделаю чертеж, который я могу использовать, чтобы сделать столько автомобилей, сколько я хочу!&quot;...</p>
  <pre>class Car
{
    public function drive()
    {
        // ...
    }
}
</pre>
  <p>Для того чтобы каждая машина работала, она должна обладать как минимум двигателем и колесами. Итак, существует несколько подходов к достижению этой цели. Например, можно выполнить следующее:</p>
  <pre>class Car
{
    public function __construct()
    {
        $this-&gt;engine = new Engine();

        $this-&gt;wheels = [
            new Wheel(), new Wheel(), 
            new Wheel(), new Wheel(),
        ];
    }

    public function drive() { ... }
}
</pre>
  <p>Есть план для каждой машины, которую вы сделаете! Далее, ваш босс приходит к вам и говорит, что есть новый клиент и он хочет электрическую машину.</p>
  <p>Так что в конечном итоге вы делаете это.</p>
  <pre>class ElectricalCar extends Car
{
    public function __construct()
    {
        parent::__construct();

        $this-&gt;engine = new ElectricalEngine();
    }
}
</pre>
  <p>&quot;Отличное решение&quot; — думаете вы. Конечно, есть избыточный нормальный двигатель, который создается при вызове <code>parent::__construct()</code>, но, по крайней мере, вы могли бы повторно использовать колеса!</p>
  <p>Я думаю, вы понимаете к чему это все приведет. Следующий клиент захочет машину с необычными чехлами на руль, другой бы дизельный двигатель с теми же колпаками, еще один просит гоночной автомобиль, и последний хочет самоуправляемую машину.</p>
  <p>О, так был же клиент, который хотел купить двигатель, чтобы построить лодку с самим собой, но Вы сказали своему боссу, что это невозможно.</p>
  <p>Через некоторое время в Вашем офисе оказывается тонна чертежей, каждый из которых описывает очень специфический вариант автомобиля. Вы начали с аккуратно упорядоченной кучи чертежей, но через некоторое время вы должны были сгруппировать их в разные папки и коробки, потому что это заняло слишком много времени, чтобы найти план, который вы ищете.</p>
  <p>Объектно-ориентированные программисты часто попадают в эту ловушку наследования, заканчивающуюся полностью испорченной кодовой базой. Итак, давайте рассмотрим лучший подход. Может быть, вы слышали о&quot; композиции над наследством&quot; раньше?</p>
  <blockquote>Композиция над наследованием является принципом, что классы должны достичь полиморфного поведения и повторного использования кода по их составу, а не наследование от базового или родительского класса — <a href="https://en.wikipedia.org/wiki/Composition_over_inheritance" target="_blank">Wikipedia</a></blockquote>
  <p>Здесь слишком много модных словечек. Давайте просто посмотрим на наш пример автомобиля. Этот принцип гласит, что <code>Car</code> должен обеспечивать свое полиморфное поведение, будучи состоящим из других классов.</p>
  <p>Слово <em>polymorphic</em> буквально означает &quot;много форм&quot; и подразумевает, что автомобиль должен иметь возможность управлять многими различными способами, в зависимости от контекста, в котором он используется.</p>
  <p>При повторном использовании кода мы пытаемся сделать код многократно используемым, чтобы в конечном итоге десятки классов не делали почти то же самое.</p>
  <h2>Какое это имеет отношение к инъекции зависимости?</h2>
  <p>Вместо того, чтобы сделать уникальный план, который описывает все возможные варианты автомобиля, мы предпочли бы, чтобы <code>Car</code> сделал одну вещь и сделал это хорошо: ездил.</p>
  <p>Это означает, что это не должно быть заботой автомобиля о том, как построен его двигатель, какие колеса на нем прикреплены. Он должен знать только следующую вещь:</p>
  <blockquote>Учитывая работающий двигатель и четыре колеса, я могу управлять.</blockquote>
  <p>Можно сказать, что для того, чтобы <code>Car</code> работал, ему нужны двигатель и колеса. Другими словами: <code>Car</code> зависит от <code>Engine</code> и <code>Wheels</code>.</p>
  <p>Эти зависимости должны быть <em>переданы</em> <code>Car</code>. Или, сказал иначе: инъектированы.</p>
  <pre>class Car
{
    public function __construct(
        Engine $engine, 
        array $wheels
    ) {
        $this-&gt;engine = $engine;
        $this-&gt;wheels = $wheels;
    }

    public function drive()
    {
        $this-&gt;engine-&gt;connectTo($this-&gt;wheels);

        $this-&gt;engine-&gt;start();

        $this-&gt;engine()-&gt;accelerate();
    }
}
</pre>
  <p>Хотите гоночный автомобиль? Нет проблем!</p>
  <pre>$raceCar = new Car(new TurboEngine(), [
    new RacingWheel(), new RacingWheel(),
    new RacingWheel(), new RacingWheel(),
]);
</pre>
  <p>Тот клиент, которому нужны были специальные крышки для колес? У тебя все под контролем!</p>
  <pre>$smugCar = new Car(new Engine(), [
    new FancyWheel(), new FancyWheel(),
    new FancyWheel(), new FancyWheel(),
]);
</pre>
  <p>Теперь у вас <em>гораздо больше</em> гибкости!</p>
  <p>Dependency injection — это идея дать классу свои требования извне, вместо того, чтобы этот класс отвечал за них сам.</p>
  <h2>Чего внедрение зависимостей не может</h2>
  <p>Существуют фреймворки и инструменты, построенные на этом простом принципе и переводящие его на новый уровень. Возможно, вы слышали о них, давайте посмотрим на них ниже.</p>
  <h3>Общие зависимости</h3>
  <p>Одним из наиболее полезных побочных эффектов инъекционных зависимостей является то, что внешний контекст может контролировать их. Это означает, что вы можете предоставить один и тот же экземпляр класса нескольким другим, которые имеют зависимость от этого класса.</p>
  <p>Зависимые или повторные зависимости, используемые чаще всего, получают метку «dependency injection». Безусловно, очень хорошая практика, но разделение зависимости в сущности не является основным значением инъекции зависимости.</p>
  <h3>Контейнер зависимостей</h3>
  <p>Иногда это также называют контейнером «инверсии контроля (inversion of control)», хотя это не точное имя.</p>
  <p>Каким бы ни было точное имя, контейнер представляет собой набор определений классов. Это большая коробка, которая знает, как объекты в вашем приложении могут быть созданы с другими зависимостями. Хотя в таком контейнере определенно много вариантов использования, нет необходимости делать инъекции зависимостей.</p>
  <h3>Автоматическая проводка</h3>
  <p>Чтобы предоставить разработчикам еще большую гибкость, в некоторых контейнерах учитываются интеллектуальные, автоматически определяемые определения классов. Это означает, что вам не нужно вручную описывать, как должен строиться каждый класс. Эти контейнеры сканируют ваш код и определяют, какие зависимости необходимы, просматривая типы подсказок и блоки документов.</p>
  <p>Здесь много волшебства, но автоматическая проводка может быть полезным инструментом для быстрой разработки приложений.</p>
  <h3>Расположение службы (Service location)</h3>
  <p>Вместо того, чтобы вводить зависимости в класс, есть некоторые инструменты и фреймворки, которые позволяют классу просить контейнер «дать ему экземпляр другого класса».</p>
  <p>Сначала это может показаться полезным, потому что нашему классу больше не нужно знать, как построить определенную зависимость. Однако: разрешая классу запрашивать зависимости от собственной учетной записи, мы вернемся к квадрату.</p>
  <p>Для того, чтобы местоположение службы работало, наш класс должен знать о системах снаружи. Он не сильно отличается от вызова нового в самом классе. Эта идея на самом деле противоположна тому, что пытается сделать инъекция зависимости. Это неправильное использование контейнера.</p>
  <h3>Инъектировать все подряд</h3>
  <p>Как это происходит в реальных ��роектах, вы заметите, что инъекция зависимостей не всегда является решением вашей проблемы.</p>
  <p>Важно понимать, что существуют пределы использования любых преимуществ. Вы всегда должны понимать, когда не используете их слишком часто, так как действительные существуют случаи, когда упрощенный подход является лучшим решением.</p>
  <h2>Подводя итоги</h2>
  <p>Основная идея внедрения зависимостей очень проста, она позволяет лучше поддерживать, тестировать и отделять код, который будет написан.</p>
  <p>Поскольку это такая мощная модель, что вокруг нее появляется множество инструментов. Я считаю, что главное в начале понять основной принцип, прежде чем использовать инструменты, построенные на нем.</p>

]]></content:encoded></item></channel></rss>