<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Статьи]]></title>
    <link>https://habr.com/ru/users/alonecoder/publications/articles/</link>
    <description><![CDATA[Хабр: статьи пользователя alonecoder]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Wed, 29 Apr 2026 03:37:02 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Лучшие практики написания комментариев к коду]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/568610/</guid>
      <link>https://habr.com/ru/companies/vk/articles/568610/?utm_campaign=568610&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/47/8p/-l/478p-l6q4hvh1_daqyeyfdjfgu8.jpeg" width="400"></div><br>
Известный профессор МТИ Гарольд Абельсон сказал: «Программы нужно писать для того, чтобы их читали люди, и лишь случайно — чтобы их исполняли машины». Хотя он намеренно преуменьшил важность исполнения кода, однако подчёркивает, что у программ две важные аудитории. Компиляторы и интерпретаторы игнорируют комментарии и с одинаковой лёгкостью воспринимают все синтаксически корректные программы. У людей всё иначе. Одни программы нам воспринимать легче, чем другие, и мы ищем комментарии, которые помогут нам разобраться.<br>
<br>
Есть множество источников информации, помогающих программистам писать более качественный код — книги, сайты, статические анализаторы. Но гораздо меньше источников посвящено повышению качества комментариев. Легко измерить их количество в программе, но качество оценить сложно, и два этих параметра не обязательно взаимосвязаны. Плохой комментарий хуже отсутствия комментария. Вот несколько правил, которые помогут вам найти золотую середину.<br> <a href="https://habr.com/ru/articles/568610/?utm_campaign=568610&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 20 Jul 2021 09:29:43 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Анализ и проектирование систем]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Проектирование и рефакторинг]]></category>
      <category>лучшие практики</category><category>комментирование кода</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Функция, которую мне хотелось бы видеть в Git: группы коммитов]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/566556/</guid>
      <link>https://habr.com/ru/companies/vk/articles/566556/?utm_campaign=566556&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/zm/dv/ng/zmdvng3dqr8q2sceigxj_99btx0.jpeg" width="500"></div><br>
Почти все любят Git. Я тоже. Он работает, он эффективен, в нём изумительная модель данных, и в нём есть все возможные инструменты. За 13 лет использования не было случая, чтобы я не находил в Git нужный мне инструмент. До недавнего времени. Но сначала давайте поговорим о GitHub.<br> <a href="https://habr.com/ru/articles/566556/?utm_campaign=566556&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 07 Jul 2021 13:16:47 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Git]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Системы управления версиями]]></category>
      <category>git</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Веб-скрейпинг на PHP]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/565028/</guid>
      <link>https://habr.com/ru/companies/vk/articles/565028/?utm_campaign=565028&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/1e/ns/9s/1ens9snce7hfihupglqn8956c3i.jpeg" width="350"></div><br>
<br>
Термин <i>web scraping</i> означает извлечение информации из веб-страниц в интернете. Его ещё называют <i>web crawling</i> или <i>web data extraction</i>.<br>
<br>
PHP широко используется в качестве серверного скриптового языка для создания динамических сайтов и веб-приложений. И на нём можно написать веб-скрейпер. Но поскольку мы не хотим изобретать колесо, можно воспользоваться готовыми open-source библиотеками для веб-скрейпинга. Кстати, мы также написали отличную статью про <a href="https://www.scrapingdog.com/blog/web-scraping-101-with-nodejs.html" rel="nofollow noopener noreferrer">веб-скрейпинг с помощью Node.js</a> и <a href="https://www.scrapingdog.com/blog/web-scraping-with-python.html" rel="nofollow noopener noreferrer">с помощью Python</a>, почитайте. А здесь мы обсудим разные инструменты и сервисы, которые можно использовать с PHP для скрейпинга веб-страниц: Guzzle, Goutte, Simple HTML DOM, Headless-браузер Symfony Panther. <br> <a href="https://habr.com/ru/articles/565028/?utm_campaign=565028&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Mon, 28 Jun 2021 12:21:31 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Тестирование веб-сервисов]]></category>
      <category>php</category><category>парсинг</category><category>headless</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Развеиваем мифы об управлении памятью в JVM]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/559794/</guid>
      <link>https://habr.com/ru/companies/vk/articles/559794/?utm_campaign=559794&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/2o/j5/wg/2oj5wgbtd57j4hhprw3tkmvddru.jpeg" width="400"></div><br>
В серии статей я хочу опровергнуть заблуждения, связанные с управлением памятью, и глубже рассмотреть её устройство в некоторых современных языках программирования — Java, Kotlin, Scala, Groovy и Clojure. Надеюсь, эта статья поможет вам разобраться, что происходит под капотом этих языков. Сначала мы рассмотрим управление памятью в <strong>виртуальной машине Java (JVM)</strong>, которая используется в Java, Kotlin, Scala, Clojure, Groovy и других языках. В <a href="https://dev.to/deepu105/demystifying-memory-management-in-modern-programming-languages-ddd" rel="nofollow noopener noreferrer">первой статье</a> я рассказал и разнице между стеком и кучей, что полезно для понимания этой статьи.<br> <a href="https://habr.com/ru/articles/559794/?utm_campaign=559794&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 28 May 2021 13:10:55 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Java]]></category><category><![CDATA[Алгоритмы]]></category><category><![CDATA[Анализ и проектирование систем]]></category><category><![CDATA[Высоконагруженные системы]]></category>
      <category>jvm</category><category>java</category><category>garbage collector</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Внутренности Linux: как /proc/self/mem пишет в недоступную для записи память]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/559322/</guid>
      <link>https://habr.com/ru/companies/vk/articles/559322/?utm_campaign=559322&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/69/kw/tn/69kwtnfwitxpq4q8gaosgz8ykcy.jpeg"  width="400"/></div><br/>
Странная причудливость псевдофайла <code>/proc/*/mem</code> заключается в его «пробивной» семантике. Операции записи через этот файл будут успешными даже если целевая виртуальная память помечена как недоступная для записи. Это сделано намеренно, и такое поведение <a href="https://lkml.org/lkml/2017/5/29/541">активно используется</a> проектами вроде компилятора Julia JIT или отладчика rr.<br/>
<br/>
Но возникают вопросы: подчиняется ли привилегированный код разрешениям виртуальной памяти? До какой степени оборудование может влиять на доступ к памяти ядра?<br/>
<br/>
Мы постараемся ответить на эти вопросы и рассмотрим нюансы взаимодействия между операционной системой и оборудованием, на котором она исполняется. Изучим ограничения процессора, которые могут влиять на ядро, и узнаем, как ядро может их обходить.<br/>
 <a href="https://habr.com/ru/articles/559322/?utm_campaign=559322&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut"></a>]]></description>
      
      <pubDate>Wed, 26 May 2021 09:23:46 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[*nix]]></category><category><![CDATA[C]]></category><category><![CDATA[Ненормальное программирование]]></category><category><![CDATA[Linux]]></category>
      <category>linux</category><category>proc</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Парсим протобаф на скорости больше 2 Гб/с.: как я научился любить хвостовую рекурсию в C]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/557012/</guid>
      <link>https://habr.com/ru/companies/vk/articles/557012/?utm_campaign=557012&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/webt/87/zo/p7/87zop7nd8j7mgxpkjtquvtdnw3y.png"><br>
<br>
Отличную функцию <a href="https://reviews.llvm.org/D99517" rel="nofollow noopener noreferrer">недавно добавили в основную ветку компилятора Clang</a>. С помощью атрибутов <code>[[clang::musttail]]</code> или <code>__attribute__((musttail))</code> теперь можно получить гарантированные хвостовые (tail) вызовы в C, C++ и Objective-C.<br>
<br>
<pre><code class="cpp">int g(int);
int f(int x) {
    __attribute__((musttail)) return g(x);
}
</code></pre><br>
(<a href="https://godbolt.org/" rel="nofollow noopener noreferrer">Онлайн-компилятор</a>)<br> <a href="https://habr.com/ru/articles/557012/?utm_campaign=557012&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 12 May 2021 15:07:26 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[C]]></category><category><![CDATA[Высоконагруженные системы]]></category><category><![CDATA[Программирование]]></category>
      <category>c</category><category>рекурсия</category><category>хвостовая рекурсия</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Fiber’ы — новая фича в PHP 8.1]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/551240/</guid>
      <link>https://habr.com/ru/companies/vk/articles/551240/?utm_campaign=551240&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/je/ev/az/jeevazhcn8kg8fraihb6dpwq1a8.jpeg"></div><br>
PHP пытается восполнить недостаток возможностей в своей кодовой базе, и <a href="https://wiki.php.net/rfc/fibers" rel="nofollow noopener noreferrer">Fiber</a>’ы — одно из значимых нововведений. Они появились в PHP 8.1 в конце 2020 и привнесли в язык своего рода асинхронное программирование. Файберы представляют собой легковесные потоки исполнения (известные как сопрограммы, или корутины (coroutine)). Они исполняются параллельно, но обрабатываются исключительно самой runtime-средой, а передаются напрямую в процессор. Разные реализации сопрограмм есть <a href="https://en.wikipedia.org/wiki/Coroutine" rel="nofollow noopener noreferrer">во многих основных языках</a>, но принцип один и тот же: позволить компьютеру одновременно выполнять две и больше задач и ждать, пока они все не завершатся.<br>
<br>
PHP-реализация файберов — это не настоящие асинхронные вычисления, как можно подумать. Даже после появления новинки ядро языка осталось синхронным. Применение файберов можно сравнить с пересаживанием из одного автомобиля в другой.<br> <a href="https://habr.com/ru/articles/551240/?utm_campaign=551240&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 08 Apr 2021 10:52:08 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Параллельное программирование]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Веб-разработка]]></category>
      <category>php</category><category>fibers</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Худшие из так называемых «лучших практик» для Docker]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/550138/</guid>
      <link>https://habr.com/ru/companies/vk/articles/550138/?utm_campaign=550138&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/_x/7-/le/_x7-le9yybhmmzmha9u9xcmm-mk.jpeg" width="300"></div><br>
В интернете всегда кто-то неправ, и часто встречаются плохие советы по упаковке Docker. Но некоторые из них достаточно опасны, чтобы удостоиться этой статьи. <br>
<br>
Часто пишут, что при сборке Docker-образа не нужно устанавливать обновления безопасности. Я написал несколько опровержений, так что этот совет теперь встречается чуть реже. Но ранее эта рекомендация была на официальной странице с лучшими практиками Docker:<br>
<br>
<blockquote>Избегайте <code>RUN apt-get upgrade</code> и <code>dist-upgrade</code>, потому что многие «особые» пакеты из родительских образов не смогут обновиться внутри непривилегированного контейнера.</blockquote><br>
Поясню: команды <code>RUN</code> выполняются при сборке образа, а не запуске контейнера. В документации говорится: «собирайте образы без установки обновлений безопасности». Тот же совет встречается в <a href="https://github.com/hadolint/hadolint/wiki/DL3005" rel="nofollow noopener noreferrer">hadolint Dockerfile linter</a> (цитируется вышеприведённый текст). Оттуда его тоже скоро должны убрать. Для подавляющего большинства людей, создающих Docker-файлы, это абсолютно ужасный совет. И поскольку встречается он очень часто, давайте рассмотрим некоторые объяснения и разберёмся, почему они ошибочны.<br> <a href="https://habr.com/ru/articles/550138/?utm_campaign=550138&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 06 Apr 2021 10:27:57 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[*nix]]></category><category><![CDATA[DevOps]]></category><category><![CDATA[Серверное администрирование]]></category><category><![CDATA[Системное администрирование]]></category>
      <category>docker</category><category>best practices</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Юнит-тестирование на PHP в примерах]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/549698/</guid>
      <link>https://habr.com/ru/companies/vk/articles/549698/?utm_campaign=549698&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/1-/oj/3d/1-oj3d2j1lkbnzrb2hbxsr5zreo.jpeg"></div><br>
Сегодня юнит-тесты невероятно полезны. Думаю, они есть в большинстве из недавно созданных проектов. Юнит-тесты являются важнейшими в enterprise-приложениях с обилием бизнес-логики, потому что они быстрые и могут сразу сказать нам, корректна ли наша реализация. Однако я часто сталкиваюсь с проблемами, которые связаны с хорошими тестами, хотя те и крайне полезны. Я дам вам несколько советов с примерами, как писать хорошие юнит-тесты.<br> <a href="https://habr.com/ru/articles/549698/?utm_campaign=549698&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 30 Mar 2021 14:50:36 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Веб-разработка]]></category><category><![CDATA[Тестирование IT-систем]]></category><category><![CDATA[Тестирование веб-сервисов]]></category>
      <category>php</category><category>unit testing</category><category>tests</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Когда объектов не достаточно]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/547588/</guid>
      <link>https://habr.com/ru/companies/vk/articles/547588/?utm_campaign=547588&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/gl/72/qv/gl72qvych2imgichvppe5vatqws.jpeg" width="400"></div><br>
Я искал материалы об истоках объектно-ориентированного программирования. Причина была в том, что в сообществе Laravel возникла тенденция использовать паттерн <i>Action</i> и говорить <i>вот что такое «настоящее ООП»</i>. У меня возникли некоторые сомнения, и вместо того, чтобы задавать вопросы, я решил поискать ссылки времён Smalltalk. Нашёл книгу <a href="https://www.amazon.com/Smalltalk-Objects-Design-Chamond-Liu/dp/1583484906/" rel="nofollow noopener noreferrer">Smalltalk, Objects, and Design</a>. И мне было так интересно её читать, что я решил поделиться с вами своими находками.<br>
<br>
Паттерн <i>Action</i> гласит, что логику нужно обёртывать в <a href="https://stitcher.io/blog/laravel-beyond-crud-03-actions" rel="nofollow noopener noreferrer">классы Action</a>. Эта идея не нова, в других сообществах продвигалась «<a href="https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html" rel="nofollow noopener noreferrer">Чистая архитектура</a>», при которой каждый «сценарий использования» (или <i>Interactor</i>) должен являться самостоятельным классом. Всё очень просто. Но об этом ли говорит ООП?<br>
<br>
Если вам интересна суть статьи, то:<br>
<br>
<ul>
<li>Smalltalk был одним из первых ООП-языков. Он стал источником таких концепций, как наследование и обмен сообщениями (или как минимум он их популяризировал, насколько я вижу).</li>
<li>Как сказал Алан Кей, придумавший термин «объектно-ориентированное программирование», объектов не достаточно. Они не обеспечивают нам <i>архитектуру</i>. Объекты — это про взаимодействие между ними, и в случае с большими системами вам нужна возможность разделения приложения на модули, которые можно отключать по отдельности, заменять и включать снова в общую систему, не кладя при этом всё приложение. В этом контексте Алан предлагает идею инкапсуляции «сообщений» в классы, когда каждый экземпляр является сообщением в системе, подкрепляя идею наличия в <i>Чистой архитектуре</i> классов «Action» или «интеракторов».</li>
</ul><br>
Продолжайте читать, если я разжёг в вас интерес.<br> <a href="https://habr.com/ru/articles/547588/?utm_campaign=547588&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 18 Mar 2021 12:08:20 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Laravel]]></category><category><![CDATA[PHP]]></category><category><![CDATA[ООП]]></category><category><![CDATA[Программирование]]></category>
      <category>php</category><category>ооп</category><category>laravel</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Символы Unicode: о чём должен знать каждый разработчик]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/547084/</guid>
      <link>https://habr.com/ru/companies/vk/articles/547084/?utm_campaign=547084&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/webt/f8/oj/br/f8ojbrekuhscl9trjum-rmga9we.jpeg"><br>
<br>
Если вы пишете международное приложение, использующее несколько языков, то вам нужно кое-что знать о кодировке. Она отвечает за то, как текст отображается на экране. Я вкратце расскажу об истории кодировки и о её стандартизации, а затем мы поговорим о её использовании. Затронем немного и теорию информатики.<br> <a href="https://habr.com/ru/articles/547084/?utm_campaign=547084&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Mon, 15 Mar 2021 15:20:55 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[Веб-разработка]]></category><category><![CDATA[Терминология IT]]></category><category><![CDATA[Хранение данных]]></category>
      <category>unicode</category><category>utf</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Максимально оптимизированная веб-загрузка изображений в 2021 году]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/543434/</guid>
      <link>https://habr.com/ru/companies/vk/articles/543434/?utm_campaign=543434&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/_p/en/a6/_pena6zde6vdpgopmo6wk3z8u6w.jpeg" width="400"></div><br>
В этой статье я расскажу про 8 методик оптимизации загрузки изображений, которые уменьшают необходимую пропускную способность сети и нагрузку на процессор при выводе на экран. Приведу примеры аннотированного HTML, чтобы вам было легче воспроизвести. Какие-то методики уже давно известны, а какие-то появились относительно недавно. В идеале, ваш любимый механизм публикации веб-документов (например, CMS, генератор статичных сайтов или фреймворк для веб-приложений) должен всё это реализовывать из коробки.<br> <a href="https://habr.com/ru/articles/543434/?utm_campaign=543434&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Sat, 20 Feb 2021 12:42:09 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Браузеры]]></category><category><![CDATA[Высоконагруженные системы]]></category><category><![CDATA[Клиентская оптимизация]]></category><category><![CDATA[Веб-разработка]]></category>
      <category>загрузка картинок</category><category>оптимизация изображений</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Культ лучших практик]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/541624/</guid>
      <link>https://habr.com/ru/companies/vk/articles/541624/?utm_campaign=541624&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/t-/rj/rk/t-rjrke7lqnq6n4mezu-cutxdvq.jpeg"></div><br>
Лучшие практики, несмотря на термин, не всегда хороши. В программировании многие из них не оправдывают своего названия. Они распространяются не благодаря своим заслугам или доказательствам эффективности, а из-за эффекта авторитета и использования обществом. По мере их распространения теряются нюансы. А с потерей нюансов становится легче заниматься их евангелизмом. В сочетании с нехваткой опыта это может привести к возникновению культа лучших практик. Представьте команду, которая одержима их использованием — скажем, разработкой через тестирование (test-driven development) или написанием пользовательских сценариев, — до такой степени, что это уже вредит. В эту ловушку попадали многие, в том числе и я.<br>
<br>
Почему лучшие практики могут быть вредны? Почему мы любим им следовать? Когда и как они мешают? Чтобы ответить на эти вопросы, нужно понять, откуда берутся эти практики и как они распространяются в программировании.<br> <a href="https://habr.com/ru/articles/541624/?utm_campaign=541624&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 10 Feb 2021 13:44:46 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Качество кода]]></category><category><![CDATA[Терминология IT]]></category><category><![CDATA[Управление разработкой]]></category>
      <category>best practices</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Углублённое руководство по JavaScript: генераторы. Часть 2, простой пример использования]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/539530/</guid>
      <link>https://habr.com/ru/companies/vk/articles/539530/?utm_campaign=539530&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/ue/al/on/uealonmpgifcwbyd7bjzedwgnkg.jpeg" width="450"></div><br>
Поведение генераторов, описанное в <a href="https://habr.com/ru/company/mailru/blog/539194/">предыдущей статье</a>, нельзя назвать сложным, но оно точно удивляет и поначалу может выглядеть непонятным. Поэтому вместо изучения новых концепций мы сейчас сделаем паузу и рассмотрим интересный пример использования генераторов.<br> <a href="https://habr.com/ru/articles/539530/?utm_campaign=539530&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 27 Jan 2021 16:26:56 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Веб-разработка]]></category>
      <category>javascript</category><category>генераторы</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Углублённое руководство по JavaScript: генераторы. Часть 1, основы]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/539194/</guid>
      <link>https://habr.com/ru/companies/vk/articles/539194/?utm_campaign=539194&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/n5/s9/0u/n5s90usd99zp_mwv4pp-nvihwra.jpeg"></div><br>
В этой серии статей я расскажу почти всё, что нужно знать о генераторах в JavaScript: что это такое, как их использовать и какие тонкости с ними связаны. И, как всегда, начнём мы с основ — общего представления о том, что такое генераторы.<br>
<br>
Я не исхожу из того, что вы хоть что-то знаете о генераторах. Но вам требуется хорошо разбираться в итераторах и итерируемых объектах в JavaScript. Если вы с ними не знакомы или «плаваете в теме», то сначала <a href="https://habr.com/ru/company/mailru/blog/533822/">углублённо изучите</a> их. Если же вы владеете этими знаниями, то можно погружаться в мир генераторов. Это очень странный мир, в котором многое совершенно не похоже на то, что вы используете в обычном JS-коде. При этом сам механизм очень прост, и даже после прочтения этой статьи вы сможете уверенно использовать генераторы. Приступим!<br> <a href="https://habr.com/ru/articles/539194/?utm_campaign=539194&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 26 Jan 2021 11:18:08 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Веб-разработка]]></category>
      <category>javascript</category><category>генераторы</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Трассировка Python GIL]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/538706/</guid>
      <link>https://habr.com/ru/companies/vk/articles/538706/?utm_campaign=538706&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/webt/bw/9l/5d/bw9l5dh0hycrc3t-_317ox9xoqy.jpeg"><br>
<br>
Есть много статей, объясняющих, для чего нужен Python GIL (The Global Interpreter Lock) (я подразумеваю CPython). Если вкратце, то GIL не даёт многопоточному чистому коду на Python использовать несколько ядер процессора.<br>
<br>
Однако мы в Vaex исполняем большинство задач с интенсивными вычислениями на С++ с отключением GIL. Это нормальная практика для высокопроизводительных Python—библиотек, в которых Python всего лишь выступает в роли высокоуровневого связующего звена.<br>
<br>
GIL нужно отключать явно, и это ответственность программиста, о которой он может забыть, что приведёт к неэффективному использованию мощностей. Недавно я сам побывал в роли забывшего, и нашёл подобную проблему в <a href="https://github.com/apache/arrow/pull/7756" rel="nofollow noopener noreferrer">Apache Arrow</a> (это зависимость Vaex, так что когда GIL не отключается в Arrow, мы (и все остальные) сталкиваемся с падением производительности).<br>
<br>
Кроме того, при исполнении на 64 ядрах производительность Vaex иногда далека от идеала. Возможно, он использует 4000 % процессора вместо 6400 %, что меня не устраивает. Вместо того, чтобы наугад вставлять выключатели для изучения этого эффекта, я хочу разобраться в происходящем, и если проблема в GIL, то хочу понять, почему и как он тормозит Vaex.<br> <a href="https://habr.com/ru/articles/538706/?utm_campaign=538706&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 22 Jan 2021 13:31:18 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Python]]></category><category><![CDATA[Высоконагруженные системы]]></category><category><![CDATA[Отладка]]></category><category><![CDATA[Программирование]]></category>
      <category>python</category><category>gil</category><category>jupyter</category><category>perf</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Двоичные и побитовые операции в PHP]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/538052/</guid>
      <link>https://habr.com/ru/companies/vk/articles/538052/?utm_campaign=538052&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/x_/km/cc/x_kmccgfjuiag5tygvtgdba7u5m.jpeg"></div><br>
Недавно я обратил внимание, что в разных проектах мне приходится активно писать побитовые операции на PHP. Это очень интересное и полезное умение, которое пригодится начиная с чтения двоичных файлов до эмуляции процессоров.<br>
<br>
В PHP есть много инструментов, помогающих манипулировать двоичными данными, но хочу сразу предупредить: если вам нужно супернизкоуровневая эффективность, то этот язык не для вас. <br>
<br>
А теперь к делу! В этой статье я расскажу много интересного о побитовых операциях, двоичной и шестнадцатеричной обработке, которые будут полезны в ЛЮБОМ языке.<br> <a href="https://habr.com/ru/articles/538052/?utm_campaign=538052&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 19 Jan 2021 14:40:13 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Математика]]></category><category><![CDATA[Ненормальное программирование]]></category><category><![CDATA[Программирование]]></category>
      <category>php</category><category>бинарные данные</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Итерируемые объекты и итераторы: углублённое руководство по JavaScript]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/533822/</guid>
      <link>https://habr.com/ru/companies/vk/articles/533822/?utm_campaign=533822&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/dk/fb/l6/dkfbl61j2mhkjlmxbwiuetst-iu.jpeg"></div><br>
Эта статья представляет собой углублённое введение в итерируемые объекты (iterables) и итераторы (iterators) в JavaScript. Моя главная мотивация к её написанию заключалась в подготовке к изучению генераторов. По сути, я планировал позднее поэкспериментировать с комбинированием генераторов и хуками React. Если вам это интересно, то следите за моим <a href="https://twitter.com/m_podlasin" rel="nofollow noopener noreferrer">Twitter</a> или<a href="https://www.youtube.com/channel/UCF0RK6CA9wpxVrcFbKNG2sA" rel="nofollow noopener noreferrer"> YouTube</a>!<br>
<br>
Вообще-то я планировал начать со статьи про генераторы, но вскоре стало очевидно, что о них сложно рассказывать без хорошего понимания итерируемых объектов и итераторов. На них мы сейчас и сосредоточимся. Буду исходить из того, что вы ничего не знаете по этой теме, но при этом мы значительно углубимся в неё. Так что если вы <i>что-то</i> знаете об итерируемых объектах и итераторах, но не чувствуете себя достаточно уверенно при их использовании, эта статья вам поможет.<br> <a href="https://habr.com/ru/articles/533822/?utm_campaign=533822&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 18 Dec 2020 16:28:26 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[ReactJS]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Веб-разработка]]></category>
      <category>javascript</category><category>итераторы</category><category>генераторы</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Лучшие методики журналирования enterprise-приложений (с точки зрения инженера поддержки)]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/532996/</guid>
      <link>https://habr.com/ru/companies/vk/articles/532996/?utm_campaign=532996&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/8m/6i/u2/8m6iu2fq8zuqhydid45ogyj6laq.jpeg" width="300"></div><br>
Журналы приложений раскрывают информацию о внешних и внутренних событиях, которые видит приложение в ходе исполнения. Когда при деплое возникает баг, взлом или аномалия, журналы — самое полезное и надёжное доказательство для проведения анализа причин инцидента.<br>
<br>
Давайте разберемся, как писать в журнал полезные сообщения, которые всем понравятся.<br> <a href="https://habr.com/ru/articles/532996/?utm_campaign=532996&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Mon, 14 Dec 2020 15:52:24 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Анализ и проектирование систем]]></category><category><![CDATA[Инженерные системы]]></category><category><![CDATA[Отладка]]></category><category><![CDATA[Программирование]]></category>
      <category>логи</category><category>журналирование</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Производительность TypeScript]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/530712/</guid>
      <link>https://habr.com/ru/companies/vk/articles/530712/?utm_campaign=530712&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/-u/t4/dc/-ut4dcvbes6hcoh5cqbjkjb04ye.jpeg" width="500"></div><br>
Есть лёгкие способы конфигурирования TypeScript для ускорения компиляции и редактирования. И чем раньше их внедрить, тем лучше. Также есть ещё некоторые популярные подходы к изучению причин медленной компиляции и редактирования, некоторые исправления и распространенные способы помочь TypeScript-команде в расследовании проблем.<br> <a href="https://habr.com/ru/articles/530712/?utm_campaign=530712&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 02 Dec 2020 12:14:24 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[Высоконагруженные системы]]></category><category><![CDATA[Программирование]]></category>
      <category>javascript</category><category>typescript</category><category>performance</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Макропроблема микросервисов]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/530528/</guid>
      <link>https://habr.com/ru/companies/vk/articles/530528/?utm_campaign=530528&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/al/ck/ru/alckruueiiel-n-lutrpcfp_lcs.jpeg"  width="500"/></div><br/>
Всего за 20 лет разработка ПО перешла от архитектурных монолитов с единой базой данных и централизованным состоянием к микросервисам, где всё распределено по многочисленным контейнерам, серверам, ЦОДам и даже континентам. Распределённость упрощает масштабирование, но привносит и совершенно новые проблемы, многие из которых раньше решались с помощью монолитов.<br/>
<br/>
Давайте с помощью краткого экскурса по истории сетевых приложений разберёмся, как мы пришли к сегодняшней ситуации. А затем поговорим о модели исполнения с сохранением состояния (stateful execution model), <a href="https://github.com/temporalio/temporal">используемую в Temporal</a>, и о том, как она решает проблемы сервис-ориентированных архитектур (service-oriented architectures, SOA). Я могу быть предвзятым, потому что руковожу продуктовым отделом в Temporal, но считаю, что за этим подходом будущее.<br/>
 <a href="https://habr.com/ru/articles/530528/?utm_campaign=530528&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut"></a>]]></description>
      
      <pubDate>Mon, 30 Nov 2020 11:44:06 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Анализ и проектирование систем]]></category><category><![CDATA[Микросервисы]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[Распределённые системы]]></category>
      <category>микросервисы</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Рейт лимиты с помощью Python и Redis]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/528490/</guid>
      <link>https://habr.com/ru/companies/vk/articles/528490/?utm_campaign=528490&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/c_/_1/ty/c__1ty0mgk4grpgnzt28aghkuki.jpeg" width="500"></div><br>
В этой статье мы рассмотрим некоторые алгоритмы рейт лимитов на основе Python и Redis, начиная с самой простой реализации и заканчивая продвинутым обобщённым алгоритмом контроля скорости передачи ячеек (<strong>Generic Cell Rate Algorithm, GCRA</strong>).<br>
<br>
Для взаимодействия с Redis (<code>pip install redis</code>) мы будем пользоваться <a href="https://github.com/andymccurdy/redis-py" rel="nofollow">redis-py</a>. Предлагаю клонировать <a href="https://github.com/astagi/python-limit-requests" rel="nofollow">мой репозиторий</a> для экспериментирования с ограничениями запросов.<br> <a href="https://habr.com/ru/articles/528490/?utm_campaign=528490&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 17 Nov 2020 09:50:23 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Проектирование API]]></category><category><![CDATA[NoSQL]]></category><category><![CDATA[Python]]></category><category><![CDATA[Анализ и проектирование систем]]></category>
      <category>api</category><category>rate limiting</category><category>python</category><category>redis</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] PHP 8 — пробуем новые возможности]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/525614/</guid>
      <link>https://habr.com/ru/companies/vk/articles/525614/?utm_campaign=525614&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/uq/nx/fr/uqnxfr7lejorah7msj0t2fnoxiq.jpeg"></div><br>
PHP 8 уже на этапе release candidate, версия RC 3 вышла 29 октября, а полноценный релиз назначен на 26 ноября. Так что пора взглянуть на новые возможности, которые нас ждут в PHP 8. График релизов можно посмотреть <a href="https://wiki.php.net/todo/php80" rel="nofollow noopener noreferrer">здесь</a>. А официальное руководство по обновлению на новую версию лежит <a href="https://github.com/php/php-src/blob/PHP-8.0/UPGRADING" rel="nofollow noopener noreferrer">тут</a>.<br> <a href="https://habr.com/ru/articles/525614/?utm_campaign=525614&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 29 Oct 2020 15:42:31 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Laravel]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Веб-разработка]]></category>
      <category>php</category><category>php8</category><category>будущее наступило</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Как генерируются UUID]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/522094/</guid>
      <link>https://habr.com/ru/companies/vk/articles/522094/?utm_campaign=522094&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/v5/gp/f-/v5gpf-c-7_njkpgjosroinvowos.jpeg"></div><br>
Вы наверняка уже использовали в своих проектах UUID и полагали, что они уникальны. Давайте рассмотрим основные аспекты реализации и разберёмся, почему UUID <i>практически</i> уникальны, поскольку существует мизерная возможность возникновения одинаковых значений. <br>
<br>
Современную реализацию UUID можно проследить до RFC 4122, в котором описано пять разных подходов к генерированию этих идентификаторов. Мы рассмотрим каждый из них и пройдёмся по реализации версии 1 и версии 4.<br> <a href="https://habr.com/ru/articles/522094/?utm_campaign=522094&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Mon, 05 Oct 2020 14:13:21 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Алгоритмы]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[Терминология IT]]></category>
      <category>uuid</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Модернизация старого PHP-приложения]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/515778/</guid>
      <link>https://habr.com/ru/companies/vk/articles/515778/?utm_campaign=515778&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/pg/fo/lj/pgfolj4zlzhk50zemaa3ljpn2b4.jpeg" width="400"></div><br>
Недавно мне выдалась случайная возможность поработать с несколькими старыми PHP-приложениями. Я заметил несколько распространённых антипаттернов, которые пришлось исправлять. Эта статья не о том, как переписывать старое PHP-приложение на &lt;вставьте сюда название чудесного фреймворка&gt;, а о том, как сделать его более удобным в сопровождении и менее хлопотным в работе.<br> <a href="https://habr.com/ru/articles/515778/?utm_campaign=515778&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 20 Aug 2020 09:40:51 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[Веб-разработка]]></category>
      <category>php</category><category>legacy</category><category>refactoring</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Почему язык С не помешает вам делать ошибки]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/515134/</guid>
      <link>https://habr.com/ru/companies/vk/articles/515134/?utm_campaign=515134&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/4p/cs/26/4pcs26pzbeplfijxnsaecq8j4ui.jpeg"></div><br>
Если вкратце: потому что мы так сказали.<br>
<br>
:)<br>
<br>
Ладно, это слишком короткое объяснение для статьи, дорогой читатель, и мои провокационные слова требуют объяснения.<br>
<br>
Встреча Комитета по языку С — которую сначала планировали провести в германском Фрайбурге, но не срослось по понятным причинам, — завершилась 7 августа. Она прошла хорошо, мы продвинулись по всем фронтам. Да, мы действительно продвигаемся, уверяю вас, и язык С не умер.<br> <a href="https://habr.com/ru/articles/515134/?utm_campaign=515134&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 14 Aug 2020 10:48:55 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[C]]></category><category><![CDATA[Отладка]]></category><category><![CDATA[Программирование]]></category>
      <category>c</category><category>стандарты</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Трюки с SQL от DBA. Небанальные советы для разработчиков БД]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/513968/</guid>
      <link>https://habr.com/ru/companies/vk/articles/513968/?utm_campaign=513968&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/e3/xm/af/e3xmafztka0bp04mxq5ucubnrse.jpeg" width="400"></div><br>
Когда я начинал свою карьеру разработчика, моей первой работой стала DBA (администратор базы данных, АБД). В те годы, ещё до AWS RDS, Azure, Google Cloud и других облачных сервисов, существовало два типа АБД:<br>
<br>
<ul>
<li><strong>АБД инфраструктуры</strong> отвечали за настройку базы данных, конфигурирование хранилища и заботу о резервных копиях и репликации. После настройки БД инфраструктурный администратор время от времени «настраивал экземпляры», например, уточнял размеры кэшей.</li>
<li><strong>АБД приложения</strong> получал от АБД инфраструктуры чистую базу и отвечал за её архитектуру: создание таблиц, индексов, ограничений и настройку SQL. АБД приложения также реализовывал ETL-процессы и миграцию данных. Если команды использовали хранимые процедуры, то АБД приложения поддерживал и их.</li>
</ul><br>
АБД приложений обычно были частью команд разработки. Они обладали глубокими познаниями по конкретной теме, поэтому обычно работали только над одним-двумя проектами. Инфраструктурные администраторы баз данных обычно входили в ИТ-команду и могли одновременно работать над несколькими проектами.<br> <a href="https://habr.com/ru/articles/513968/?utm_campaign=513968&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 05 Aug 2020 17:43:18 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[PostgreSQL]]></category><category><![CDATA[SQL]]></category><category><![CDATA[Высоконагруженные системы]]></category>
      <category>sql</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Как реализованы JIT-компиляторы]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/513290/</guid>
      <link>https://habr.com/ru/companies/vk/articles/513290/?utm_campaign=513290&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/l2/dj/ej/l2djej_af2wenjo1zb_qzrjb2ea.jpeg" width="400"></div><br>
В этой статье мы поговорим о подробностях реализации и работе разных JIT-компиляторов, а также о стратегиях оптимизации. Обсуждать будем достаточно подробно, однако многие важные концепции опустим. То есть в этой статье не будет <i>достаточной информации</i>, чтобы прийти к обоснованным заключениям при любых сравнениях реализаций и языков.<br>
<br>
Чтобы получить базовое представление о JIT-компиляторах, почитайте <a href="https://carolchen.me/blog/jits-intro" rel="nofollow">эту статью</a>. <br>
<br>
Небольшое примечание: <br>
<br>
<blockquote>Я часто буду описывать поведение оптимизации и утверждать, что она, вероятно, есть и в каком-нибудь другом компиляторе. Хотя я не всегда проверяю, есть ли эта оптимизация в другом JIT (иногда всё неоднозначно), но если знаю точно, то укажу на это. Я также приведу примеры кода, чтобы показать, где может быть применена оптимизация, но это не точно, ведь приоритет может быть отдан другой оптимизации. Могут быть и какие-то общие упрощения, но не больше, чем в большинстве подобных постов.</blockquote><br> <a href="https://habr.com/ru/articles/513290/?utm_campaign=513290&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 31 Jul 2020 12:59:28 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Анализ и проектирование систем]]></category><category><![CDATA[Высоконагруженные системы]]></category><category><![CDATA[Компиляторы]]></category><category><![CDATA[Программирование]]></category>
      <category>jit</category><category>compilers</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Декодируем JPEG-изображение с помощью Python]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/512004/</guid>
      <link>https://habr.com/ru/companies/vk/articles/512004/?utm_campaign=512004&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/9p/8u/z0/9p8uz00vyiu_gcooou6mjpi6tcg.jpeg"  width="400"/></div><br/>
Всем привет, сегодня мы будем разбираться с алгоритмом сжатия JPEG. Многие не знают, что JPEG — это не столько формат, сколько алгоритм. Большинство JPEG-изображений, которые вы видите, представлены в формате JFIF (JPEG File Interchange Format), внутри которого применяется алгоритм сжатия JPEG. К концу статьи вы будете гораздо лучше понимать, как этот алгоритм сжимает данные и как написать код распаковки на Python. Мы не будем рассматривать все нюансы формата JPEG (например, прогрессивное сканирование), а поговорим только о базовых возможностях формата, пока будем писать свой декодер.<br/>
 <a href="https://habr.com/ru/articles/512004/?utm_campaign=512004&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut"></a>]]></description>
      
      <pubDate>Wed, 22 Jul 2020 10:01:56 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Python]]></category><category><![CDATA[Алгоритмы]]></category><category><![CDATA[Математика]]></category><category><![CDATA[Обработка изображений]]></category>
      <category>python</category><category>jpeg</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] 10 советов по тестированию в Symfony]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/508376/</guid>
      <link>https://habr.com/ru/companies/vk/articles/508376/?utm_campaign=508376&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/qz/f5/9l/qzf59l-uqd3zs1edxbssa7zpmk8.jpeg" width="400"></div><br>
Я принял участие в проекте с двухлетней кодовой базой и Symfony 3.4 в качестве веб-фреймворка. Это был не самый новый и блестящий проект, но у него было большое достоинство: тесты покрывали самые важные действия приложения.<br>
<br>
Впервые в своей карьере я увидел, как тесты могут придать уверенности в кодовой базе, начинают экономить твоё время и помогают соблюсти требования бизнеса.<br>
<br>
Этого достигли с помощью многочисленных функциональных тестов Symfony и некоторых модульных тестов, которые заполнили некоторые пустоты. Общее покрытие было около 50-52 %, но покрытие критически важной функциональности было гораздо выше. Это придавало достаточно уверенности, чтобы добавлять новые функции без ручного тестирования.<br> <a href="https://habr.com/ru/articles/508376/?utm_campaign=508376&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 30 Jun 2020 16:57:30 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Symfony]]></category><category><![CDATA[Тестирование веб-сервисов]]></category>
      <category>php</category><category>тестирование</category><category>unit testing</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Если вы используете моки, то вы хоть что-то тестируете?]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/508254/</guid>
      <link>https://habr.com/ru/companies/vk/articles/508254/?utm_campaign=508254&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/ew/xc/6r/ewxc6r4p0ocpt7kdvlg41v-qfw0.jpeg"></div><br>
Было ли у вас ощущение, что ради тестирования вы делаете код труднее для чтения? Допустим, у вас есть код, который ещё не тестировался. У него есть ряд побочных эффектов, и вас просят сначала прогнать тесты. Вы начинаете следовать советам вроде <a href="https://understandlegacycode.com/blog/best-way-to-handle-global-variables" rel="nofollow">передачи глобальных переменных в виде параметров</a> или<a href="https://understandlegacycode.com/blog/quick-way-to-add-tests-when-code-does-side-effects" rel="nofollow"> извлечения проблемных побочных эффектов, чтобы сделать вместо них заглушки в тестах</a>.<br>
<br>
Но чем дальше вы заходите, тем больше чувствуете себя не в своей тарелке. У вас скапливается куча заглушек для состояний и данных, которые позволяют писать <i>быстрые и надёжные</i> модульные тесты. В результате создаётся ощущение, что вы создали совершенно другой класс, который неточно воспроизводит реальный код.<br>
<br>
Вы останавливаетесь и задумываетесь: «Допустимо ли менять сигнатуры кода ради тестирования? Тестирую ли я реальный код или совершенно другой класс, в котором не происходит то, что нужно?» Перед вами может возникнуть дилемма. Вы уверены, что стоит и дальше придерживаться этого подхода? Или это потеря времени?<br>
<br>
Вопрос на миллион: <strong>для устаревшего кода нужно писать модульные тесты или интеграционные?</strong><br> <a href="https://habr.com/ru/articles/508254/?utm_campaign=508254&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 25 Jun 2020 16:38:28 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[Тестирование IT-систем]]></category><category><![CDATA[Тестирование веб-сервисов]]></category>
      <category>php</category><category>тестирование</category><category>testing</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Производительность современной Java при работе с большим объёмом данных, часть 2]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/507210/</guid>
      <link>https://habr.com/ru/companies/vk/articles/507210/?utm_campaign=507210&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/d1/gm/bn/d1gmbnhwk4pkhy1bck7ykdmu-uq.jpeg"></div><br>
FYI: <a href="https://habr.com/ru/company/mailru/blog/506706/">Первая часть</a>.<br>
<br>
<h2>Бенчмарк пакетного конвейера</h2><br>
Пакетный конвейер обрабатывает конечный объём сохранённых данных. Здесь нет потока результатов обработки, выходные данные агрегирующей функции нужно применить ко всему набору данных. Это меняет требования к производительности: задержка — ключевой фактор при потоковой обработке — здесь отсутствует, потому что мы обрабатываем данные не в реальном времени. Единственная важная метрика — общее время работы конвейера.<br>
<br>
Поэтому мы выбрали Parallel. На первом этапе тестирования, при работе на одной ноде, этот сборщик действительно показал лучшую пропускную способность (но только после настройки). Однако это было получено ценой длительных пауз. Если одна из нод кластера останавливается на сборку мусора, это стопорит весь конвейер. А поскольку ноды собирают мусор в разное время, общее время сборки увеличивается с добавлением каждой ноды к кластеру. Мы проанализировали этот эффект, сравнив результаты тестирования на одной ноде и на кластере из трёх нод.<br>
<br>
Кроме того, на этом этапе мы не рассматривали экспериментальные сборщики с низкой задержкой. Их очень короткие паузы не влияют на результаты тестирования, к тому же это достигается за счёт пропускной способности.<br> <a href="https://habr.com/ru/articles/507210/?utm_campaign=507210&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 18 Jun 2020 19:42:09 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Big Data]]></category><category><![CDATA[Java]]></category><category><![CDATA[Высоконагруженные системы]]></category><category><![CDATA[Программирование]]></category>
      <category>java</category><category>big data</category><category>gc</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Производительность современной Java при работе с большим объёмом данных, часть 1]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/506706/</guid>
      <link>https://habr.com/ru/companies/vk/articles/506706/?utm_campaign=506706&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/gy/8p/zf/gy8pzf7gjtwr9pvv1zb7rgmmjiy.jpeg"></div><br>
Среда исполнения Java в последние годы развивалась быстрее, чем раньше. Спустя 15 лет мы наконец-то получили сборщик мусора по умолчанию — G1. Ещё два в разработке и доступны в качестве экспериментальных функций — Oracle ZGC и OpenJDK Shenandoah. Мы решили протестировать все эти новые инструменты и выяснить, что лучше работает с нагрузками, типичными для распределённого opensource-движка потоковой обработки Hazelcast Jet.<br> <a href="https://habr.com/ru/articles/506706/?utm_campaign=506706&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Mon, 15 Jun 2020 10:27:38 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Big Data]]></category><category><![CDATA[Java]]></category><category><![CDATA[Высоконагруженные системы]]></category><category><![CDATA[Программирование]]></category>
      <category>java</category><category>big data</category><category>gc</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Хакерский фольклор]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/506202/</guid>
      <link>https://habr.com/ru/companies/vk/articles/506202/?utm_campaign=506202&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/9n/tf/pa/9ntfpakbxfrsrpn8h4oc2ncvd80.jpeg" /></div><br/>
У некоторых компьютерных терминов необычное происхождение. Многие слова относятся к давно забытым технологиям. В этой статье мы сдуем пыль времён с некоторых терминов, которыми пользуемся каждый день.<br/>
<br/>
Бо́льшая часть статьи взята из Википедии, но найти пояснения не так-то просто, если не знаешь, что искать.<br/>
 <a href="https://habr.com/ru/articles/506202/?utm_campaign=506202&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut"></a>]]></description>
      
      <pubDate>Thu, 11 Jun 2020 12:06:22 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[История IT]]></category><category><![CDATA[Научно-популярное]]></category><category><![CDATA[Терминология IT]]></category><category><![CDATA[Читальный зал]]></category>
      <category>термины</category><category>история терминологии</category><category>юмор</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Руководство по моделированию угроз для разработчиков]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/504062/</guid>
      <link>https://habr.com/ru/companies/vk/articles/504062/?utm_campaign=504062&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/iw/0q/2w/iw0q2wxwxxl29cyqumhlyibiupe.jpeg" /></div><br/>
В этой статье описаны простые и понятные шаги по внедрению моделирования угроз — подхода к проектированию защищённых систем на основе оценки рисков. В основе подхода лежит определение угроз, чтобы разработчики могли к ним подготовиться. С ростом киберугроз и желания компаний сохранить свои средства командам разработчиков требуются эффективные способы защиты ПО. К сожалению, внедрение моделирования угроз часто проходит с трудом. Многие методологии требуют сложного и исчерпывающего предварительного анализа, который не совместим с работой современных команд. Поэтому вместо того, чтобы всё останавливать ради создания идеальной модели угроз, я рекомендую начинать с малого и постепенно расширять.<br/>
 <a href="https://habr.com/ru/articles/504062/?utm_campaign=504062&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut"></a>]]></description>
      
      <pubDate>Fri, 29 May 2020 15:15:00 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Agile]]></category><category><![CDATA[Информационная безопасность]]></category><category><![CDATA[Веб-разработка]]></category><category><![CDATA[Управление разработкой]]></category>
      <category>разработка</category><category>безопасность</category><category>agile</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Рендеринг в 3D-играх: введение]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/500692/</guid>
      <link>https://habr.com/ru/companies/vk/articles/500692/?utm_campaign=500692&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/dq/hw/gw/dqhwgwxgezi8q8erzwy94bjwst0.jpeg" width="500"></div><br>
Вы играете в свежую Call of Mario: Deathduty Battleyard на своём совершенном игровом ПК. Смотрите на прекрасный сверширокий 4K-монитор, любуясь великолепными пейзажами и замысловатыми деталями. Вас когда-нибудь интересовало, как графика попадает на экран? Задумывались, как игра заставляет компьютер всё это показать вам?<br>
<br>
Добро пожаловать в наш тур по рендерингу в 3D-играх: путешествие для начинающих, из которого вы узнаете, как создаётся один базовый кадр на экране.<br> <a href="https://habr.com/ru/articles/500692/?utm_campaign=500692&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 07 May 2020 16:40:42 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Алгоритмы]]></category><category><![CDATA[Математика]]></category><category><![CDATA[3D-графика]]></category><category><![CDATA[Разработка игр]]></category>
      <category>рендеринг графики</category><category>gamedev</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] SHISHUA: самый быстрый в мире генератор псевдослучайных чисел]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/498352/</guid>
      <link>https://habr.com/ru/companies/vk/articles/498352/?utm_campaign=498352&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/5p/ex/bl/5pexblhd_seedlgm8iidkfktef4.jpeg" width="400"></div><br>
Полгода назад мне захотелось создать лучший генератор псевдослучайных чисел (ГПСЧ) с какой-нибудь необычной архитектурой. Я думал, что начало будет лёгким, а по мере работы задача станет медленно усложняться. И думал, смогу ли я научиться всему достаточно быстро, чтобы справиться с самым сложным.<br>
<br>
К моему удивлению, сложность возрастала не линейно. Побайтовое тестирование по критерию хи-квадрат оказалось очень трудным! Позднее столь же трудно было пройти тесты diehard. Я <a href="https://mobile.twitter.com/espadrine/status/1184542865969614849" rel="nofollow">опубликовал текущие результаты</a>, чтобы понять, какие ещё трудности меня ожидают. Однако <a href="https://mobile.twitter.com/espadrine/status/1184883565634424832" rel="nofollow">тест PractRand в тот раз пройти не удалось</a>.<br>
<br>
Затем было очень трудно<a href="https://mobile.twitter.com/espadrine/status/1186358084425400320" rel="nofollow"> прохождение теста BigCrush</a>.<br>
<br>
Затем было очень трудно передавать 32 тебибайта данных при прохождении PractRand. Скорость стала проблемой. Мало было создать конструкцию, генерирующей десять мегабайтов в секунду, потому что прохождение PractRand заняло бы месяц. Но должен признаться, что <a href="https://github.com/espadrine/combit" rel="nofollow">пройти этот тест со скоростью гигабайт в секунду</a> было очень трудно.<br> <a href="https://habr.com/ru/articles/498352/?utm_campaign=498352&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 21 Apr 2020 16:49:49 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[C]]></category><category><![CDATA[Rust]]></category><category><![CDATA[Алгоритмы]]></category><category><![CDATA[Качество кода]]></category>
      <category>c</category><category>rust</category><category>crypto</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Разбираемся с алгоритмом коллапса волновой функции]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/497590/</guid>
      <link>https://habr.com/ru/companies/vk/articles/497590/?utm_campaign=497590&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/0p/3h/m9/0p3hm9jziz_gbzi9tajbo2p_s3a.jpeg"></div><br>
После появления <a href="https://boristhebrave.github.io/DeBroglie/">DeBroglie</a> и <a href="https://assetstore.unity.com/packages/tools/modeling/tessera-procedural-tile-based-generator-155425">Tessera</a> меня много раз просили объяснить, как они работают. Генерирование может выглядеть как волшебство, но лежащие в его основе правила на самом деле просты.<br> <a href="https://habr.com/ru/articles/497590/?utm_campaign=497590&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut"></a>]]></description>
      
      <pubDate>Thu, 16 Apr 2020 14:40:03 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Алгоритмы]]></category><category><![CDATA[Высоконагруженные системы]]></category><category><![CDATA[Математика]]></category><category><![CDATA[Разработка игр]]></category>
      <category>алгоритмы</category><category>wcf</category><category>wave function collapse</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Как реализованы конвейеры в Unix]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/495484/</guid>
      <link>https://habr.com/ru/companies/vk/articles/495484/?utm_campaign=495484&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/ge/sl/9i/gesl9iqjuhatlmgyrdps28zgje0.jpeg"></div><br>
В этой статье описана реализация конвейеров в ядре Unix. Я был несколько разочарован, что недавняя статья под названием «<a href="https://www.vegardstikbakke.com/how-do-pipes-work-sigpipe/" rel="nofollow">Как работают конвейеры в Unix?</a>» оказалась <i>не </i>про внутреннее устройство. Мне стало интересно, и я зарылся в старые источники, чтобы найти ответ.<br> <a href="https://habr.com/ru/articles/495484/?utm_campaign=495484&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 03 Apr 2020 16:33:51 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[*nix]]></category><category><![CDATA[Алгоритмы]]></category><category><![CDATA[История IT]]></category><category><![CDATA[Качество кода]]></category>
      <category>unix</category><category>pipes</category><category>никто не читает теги</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Определяем COVID-19 на рентгеновских снимках с помощью Keras, TensorFlow и глубокого обучения]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/vk/articles/493614/</guid>
      <link>https://habr.com/ru/companies/vk/articles/493614/?utm_campaign=493614&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/webt/al/bt/gn/albtgnkhy92l7fzrjmwpm6fdu4o.jpeg"></div><br>
С помощью этого руководства мы с помощью Keras, TensorFlow и глубокого обучения научимся на собранном вручную датасете из рентгеновских снимков автоматически определять COVID-19.<br>
<br>
Как и многие другие, я искренне беспокоюсь относительно COVID-19. Я заметил, что постоянно анализирую своё состояние и гадаю, подхвачу ли болезнь и когда это произойдёт. И чем больше я об этом беспокоюсь, тем больше это превращается в болезненную игру разума, в которой симптоматика сочетается с ипохондрией:<br>
<br>
<ul>
<li>Я проснулся утром, чувствуя некоторую болезненность и слабость.</li>
<li>Когда я выполз из кровати, то обнаружил у себя насморк (хотя <a href="https://www.webmd.com/lung/news/20200310/know-the-symptoms-of-covid19" rel="nofollow">уже известно</a>, что насморк <strong>не</strong> является симптомом COVID-19).</li>
<li>К тому времени, как я добрёл до ванной, чтобы взять бумажный платок, я уже кашлял.</li>
</ul><br>
Сначала я не обращал на это особого внимания — у меня аллергия на пыльцу, а из-за тёплой погоды на восточном побережье США весна в этом году выдалась ранняя. Скорее всего, это аллергические симптомы. Но в течение дня моё состояние не улучшалось. Я сижу и пишу это руководство с градусником во рту. Смотрю вниз и вижу 37,4 °С. Моя нормальная температура тела чуть ниже, чем у других, на уровне 36,3 °С. Всё, что выше 37,2 °С, для меня уже небольшой жар.<br>
<br>
Кашель и небольшой жар? Это может быть COVID-19… или просто моя аллергия. <strong>Выяснить без тестирования невозможно, и именно это «незнание» делает ситуацию столь пугающей на человеческом уровне.</strong><br> <a href="https://habr.com/ru/articles/493614/?utm_campaign=493614&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Для человека нет ничего страшнее неведения.</a>]]></description>
      
      <pubDate>Mon, 23 Mar 2020 13:30:04 GMT</pubDate>
      <dc:creator><![CDATA[AloneCoder (VK)]]></dc:creator>
      <category><![CDATA[Блог компании VK]]></category><category><![CDATA[Python]]></category><category><![CDATA[Здоровье]]></category><category><![CDATA[Машинное обучение]]></category><category><![CDATA[Ненормальное программирование]]></category>
      <category>covid-19</category><category>python</category><category>tensorflow</category><category>keras</category><category>никто не читает теги</category>
    </item>
  

  

      

      

      

    
  </channel>
</rss>
