{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог Антона Репушко: заметки с тегом полезности",
    "_rss_description": "Блог Антона Репушко",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/repushko.com\/tags\/poleznosti\/",
    "feed_url": "https:\/\/repushko.com\/tags\/poleznosti\/json\/",
    "icon": "https:\/\/repushko.com\/user\/userpic@2x.jpg?1608852798",
    "author": {
        "name": "Антон Репушко",
        "url": "https:\/\/repushko.com\/",
        "avatar": "https:\/\/repushko.com\/user\/userpic@2x.jpg?1608852798"
    },
    "items": [
        {
            "id": "61",
            "url": "https:\/\/repushko.com\/all\/ubuntu-i-nvidia-container-toolkit\/",
            "title": "Ubuntu и nvidia-container-toolkit",
            "content_html": "<p>Из неочевидного: для того, чтобы в Docker-контейнерах заработал доступ к GPU, нужно использовать <i>docker-ce<\/i>, а не <i>docker<\/i> из Snap. Это связано с тем, что пакеты из snap’a работают в песочнице snap’a и не имеют прямого доступа к системе.<\/p>\n<p><a href=\"https:\/\/github.com\/docker\/genai-stack\/issues\/95\">Вот тут описание проблемы<\/a>.<\/p>\n",
            "date_published": "2025-03-30T01:33:41+03:00",
            "date_modified": "2025-03-30T01:33:37+03:00",
            "_date_published_rfc2822": "Sun, 30 Mar 2025 01:33:41 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "61",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "57",
            "url": "https:\/\/repushko.com\/all\/newprojectname-dev\/",
            "title": "newprojectname.dev",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/readme_image.jpeg\" width=\"1280\" height=\"729\" alt=\"\" \/>\n<\/div>\n<p><a href=\"newprojectname.dev\"><a href=\"https:\/\/newprojectname.dev\">https:\/\/newprojectname.dev<\/a><\/a><\/p>\n<p>Есть забавная традиция называть проекты\/библиотеки именами различных мифических существ и божеств. И у меня давно лежала идея хелпера по подбору таких названий, но реализовал её только сейчас.<\/p>\n<p>Я напарсил <a href=\"https:\/\/github.com\/repushko\/mythology_names_dataset\">самый большой список названий божеств<\/a> из 43 пантеонов, что дало 4096 уникальных имён (и 9000 если считать все алиасы). Ну а чтобы избежать коллизий, проект на лету ищет эти имена в названиях репозиториев на Гитхабе и показывает топ-результаты.<\/p>\n<p>Из интересной инженерии: проект на <a href=\"https:\/\/svelte.dev\/\">Svelte<\/a>, имеются <a href=\"https:\/\/github.com\/repushko\/newprojectname.dev\">исходники<\/a>. Внутри есть база на 1Мб сырого json’a, которая затаскивается в общий бандл приложения и ужимается до 150кб. И из-за этого хака всё успешно хостится как статика на Digital Ocean’e за 0.00$ в месяц. Дизайн тоже корявенько делал я. Запросы к Гитхабу — клиентские, лимиты запросов — тоже на клиенте. Легчайшая поддержка.<\/p>\n",
            "date_published": "2021-01-08T23:47:43+03:00",
            "date_modified": "2021-01-08T23:48:13+03:00",
            "image": "https:\/\/repushko.com\/pictures\/readme_image.jpeg",
            "_date_published_rfc2822": "Fri, 08 Jan 2021 23:47:43 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "57",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/readme_image.jpeg"
                ]
            }
        },
        {
            "id": "54",
            "url": "https:\/\/repushko.com\/all\/rejection-sampling-i-reservoir-sampling\/",
            "title": "Rejection sampling и Reservoir sampling",
            "content_html": "<p>Разобрался на днях с двумя интересными алгоритмами про выборки.<\/p>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Rejection_sampling\">Rejection sampling<\/a> находил в задачах вроде «с помощью функции, которая гарантирует равновероятное выпадение целого числа в интервале [1...7], создайте функцию, которая делает тоже самое, но в интервале от [1...10]».  Ещё такая же задача была однажды у меня на собесе в Яндексе: дана монетка с вероятностью выпадения орла\/решки ½. С помощью этой монетки нужно смоделировать вероятность ⅓. Я интуитивно дошёл до решения и доказал, что это работает, но конкретно названия группы алгоритмов не знал.<\/p>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Reservoir_sampling\">Reservoir sampling<\/a> про то, как смоделировать равновероятный выбор элемента при неизвестной конечной размерности множества вариантов.<\/p>\n",
            "date_published": "2020-10-14T21:28:27+03:00",
            "date_modified": "2020-10-14T21:28:38+03:00",
            "_date_published_rfc2822": "Wed, 14 Oct 2020 21:28:27 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "54",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "35",
            "url": "https:\/\/repushko.com\/all\/ecto-i-connect-k-gcp-cloud-sql\/",
            "title": "Ecto и GCP Cloud SQL",
            "content_html": "<p>Когда запускаешь сервис через <a href=\"https:\/\/cloud.google.com\/run\">GCP Cloud Run<\/a>, есть очень <a href=\"https:\/\/cloud.google.com\/sql\/docs\/mysql\/connect-run\">удобная возможность<\/a>  пробросить внутрь контейнера <a href=\"https:\/\/cloud.google.com\/sql\">Cloud SQL<\/a> через настройки сервиса при запуске.<\/p>\n<p>В <a href=\"https:\/\/hexdocs.pm\/ecto\/Ecto.html\">Ecto<\/a> (data-layer для Elixir-приложений, чаще всего используется с фреймворком <a href=\"https:\/\/www.phoenixframework.org\/\">Phoenix<\/a>) получается такой удобный конфиг для PostgreSQL:<\/p>\n<code class=\"elixir\">\r\n# project_directory\/config\/config.exs\r\nconfig :project, Project.Repo,\r\n       username: \"username\",\r\n       password: \"password\",\r\n       database: \"db_name\",\r\n       socket: \"\/cloudsql\/&#60;project>:&#60;region:>&#60;db_instance_name>\/.s.PGSQL.5432\"\r\n<\/code>\n",
            "date_published": "2020-04-17T21:04:36+03:00",
            "date_modified": "2020-04-17T21:13:12+03:00",
            "_date_published_rfc2822": "Fri, 17 Apr 2020 21:04:36 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "35",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "34",
            "url": "https:\/\/repushko.com\/all\/docker-compose-ecr-error\/",
            "title": "docker-compose не умеет искать конфиги docker’a из snap’a",
            "content_html": "<p>Исходная обстановка:<\/p>\n<code class=\"accesslog\">docker version 18.09.9, build 1752eb3\r\ndocker-compose version 1.25.4, build 8d51620a\r\nUbuntu 18.04<\/code>\n<p><p\/><\/p>\n<p>При пуле из приватного AWS ECR после <a href=\"https:\/\/docs.aws.amazon.com\/cli\/latest\/reference\/ecr\/get-login.html\"><i>docker login<\/i> и <i>aws ecr get-login-password<\/i><\/a> сам <i>docker<\/i> работает нормально, а вот <i>docker-compose<\/i> не может аутентифицироваться в ECR и отдает ошибку:<\/p>\n<code class=\"txt\">ERROR: compose.cli.errors.log_api_error: Get https:\/\/aws_id.dkr.ecr.region.amazonaws.com\/image:tag: no basic auth credentials<\/code>\n<p><p\/><\/p>\n<p>Через <i>verbose<\/i> выяснено, что <i>docker-compose<\/i> ищет конфиг с ключами в <i>~\/.docker\/config.json<\/i> или <i>~\/.dockercfg<\/i>, а если (как было и есть у меня) <i>docker<\/i> поставлен через <a href=\"https:\/\/snapcraft.io\/\">snap<\/a>, то конфиг благополучно не находится, потому что всё лежит в другом месте. Спасибо на том, что в <i>verbose<\/i> пишет.<\/p>\n<p>Конфиг же лежит в <i>~\/snap\/docker\/current\/.docker\/config.json<\/i>, где <i>current<\/i> — это симлинк до текущей версии.<\/p>\n<p><b>Выход<\/b>: создать симлинк на существующий конфиг в ~\/.docker\/<\/p>\n<p>UPD: Хотя да, тут можно и в мейнтейнеров пакета из Canonical камень кинуть, почему они симлинки конфигов в стандартные места не делают при установке. Кажется разумным так делать.<\/p>\n",
            "date_published": "2020-04-15T00:27:21+03:00",
            "date_modified": "2020-04-15T16:39:56+03:00",
            "_date_published_rfc2822": "Wed, 15 Apr 2020 00:27:21 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "34",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "32",
            "url": "https:\/\/repushko.com\/all\/bash-zsh\/",
            "title": "bash -&gt; zsh",
            "content_html": "<p>Ruby-скрипт для конвертации истории bash в zsh, Ctrl-C \/ Ctrl-V с просторов Гитхаба.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#################################################################\r\n# = This script transfers bash history to zsh history\r\n# = Change bash and zsh history files, if you don't use defaults\r\n#\r\n# = Usage: ruby bash_to_zsh_history.rb\r\n#\r\n# = Author: Ankit Goyal\r\n#################################################################\r\n\r\n# change if you don't use default values\r\nBASH_HISTORY_FILE_PATH=&quot;#{ENV['HOME']}\/.bash_history&quot;\r\nZSH_HISTORY_FILE_PATH=&quot;#{ENV['HOME']}\/.zsh_history&quot;\r\n\r\n# Read the bash history file\r\nbash_hist_file = File.read(BASH_HISTORY_FILE_PATH)\r\n\r\n# Get the list of commands from bash history hile\r\ncommand_list = bash_hist_file.split(&quot;\\n&quot;)\r\n\r\n# Open the zsh history file\r\nzsh_hist_file = File.open(ZSH_HISTORY_FILE_PATH, &quot;a&quot;)\r\n\r\n# Get timestamp required for zsh history file format and update the history file\r\ntime = Time.now.to_i\r\ncommand_list.each do |command|\r\n  time += 1\r\n  zsh_hist_file.write(&quot;: #{time}:0;#{command}\\n&quot;)\r\nend\r\n\r\n# Close the file\r\nzsh_hist_file.close<\/code><\/pre>",
            "date_published": "2020-04-07T23:08:13+03:00",
            "date_modified": "2020-04-07T23:08:03+03:00",
            "_date_published_rfc2822": "Tue, 07 Apr 2020 23:08:13 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "32",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "16",
            "url": "https:\/\/repushko.com\/all\/diy-course-medicine\/",
            "title": "DIY курс по медицине",
            "content_html": "<p>В <a href=\"https:\/\/ods.ai\">ODS<\/a> возникло обсуждение «Как прокачаться в медицине и понимания статей с pubmed до приличного уровня» и @statist (Андрей Огурцов) написал отличный гайд, чтобы зайдя с улицы можно было разобраться и прокачаться до нормального уровня. С его разрешения украл себе, а ещё он ведёт <a href=\"http:\/\/biostat-r.blogspot.com\/\">блог<\/a>.<\/p>\n<h2>Биология<\/h2>\n<ol start=\"1\">\n<li><b>Ботаника<\/b> и <b>зоология<\/b>. С этого начинается биология. В жестком варианте с латынью и систематикой это мало кому интересно, а в нашем контексте совсем не актуально.<br \/>\nДля общего развития пойдет «Аванта+. „Энциклопедия для детей. Т.2. Биология“».<\/li>\n<li><b>Цитология.<\/b> Исторически тема устройства живого раскрывается снизу вверх (точнее, с середины, но объекты изучения биохимии и молекулярной биологии формально живыми не являются), то есть с цитологии. Изучается от и до по книге <a href=\"https:\/\/en.wikipedia.org\/wiki\/Molecular_Biology_of_the_Cell_(textbook)\">Molecular Biology of the Cell<\/a>. Издание на английском брать как можно новее, русский перевод на мой 2006 был уже такой себе по актуальности, про более свежие переводы ничего не знаю.<\/li>\n<li><b>Гистология<\/b>. Мимо меня она прошла почти полностью и ни разу не вспоминалась за годы работы, так что на мой взгляд можно пропустить. По желанию можно полистать какой-нибудь красочный гистологический атлас. Для задач <a href=\"https:\/\/iciar2018-challenge.grand-challenge.org\/Dataset\/\">такого типа<\/a> все равно придется гуглить специфические вещи. А ещё и :stack-more-layers: работает лучше, чем знания в доменной области.<\/li>\n<li><b>Анатомия.<\/b> В университетском варианте скучный и бесполезный предмет, чуть меньше чем полностью состоящий из названий костей и прочей требухи. Чтобы упороться, можно почитать «Синельников Р.Д. Атлас анатомии человека». С практической целью лучше почитать что-то типа «Коц Я.М. Спортивная физиология». Сам не читал, но одобряю.<\/li>\n<li><b>Физиология.<\/b> «Шмидт Р. Физиология человека» — наше все. Также «Ганонг В.Ф. Физиология человека». Читал украинский перевод, должен быть и русский, ну или в оригинале. Все подряд читать не обязательно, но вообще это центровой предмет, которому на моем биофаке могли бы побольше времени уделить за счет упразднения всяких биоэтик.<\/li>\n<li><b>Биохимия.<\/b> Еще один центровой предмет. Учится по «Lehninger. Principles of Biochemistry».<\/li>\n<li><b>Молекулярная биология.<\/b> Тут все сложно — я учил по довольно-таки актуальной на момент написания книге от моего препода, но она <a href=\"http:\/\/biology.org.ua\/files\/lib\/MolBiol_sivolob.pdf\">только на украинском<\/a> есть . Можно ограничиться книгой из пункта 2 и ситуативно гуглить отдельные тонкости.<\/li>\n<li><b>Вирусология.<\/b> Если нужно — <a href=\"https:\/\/www.amazon.com\/Fields-Virology-Knipe-2-Set\/dp\/1451105630\" class=\"nu\">«<u>Knipe. Fields Virology<\/u>»<\/a>.<\/li>\n<li><b>Теория эволюции.<\/b> Философская тема, можно начать с «Еськов К.Ю. История Земли и жизни на ней».<\/li>\n<li><b>Иммунология.<\/b> <a href=\"https:\/\/www.amazon.com\/Fundamental-Immunology-William-Paul\/dp\/1451117833\" class=\"nu\">«<u>Paul. Fundamental Immunology<\/u>»<\/a>.<\/li>\n<\/ol>\n<h2>Ещё немного о биохимии и других областях<\/h2>\n<ul>\n<li><b>Биохимия<\/b>. Кроме базового учебника Ленинджера, полезно заиметь «Кольман Я., Рем К. Наглядная биохимия». Я почти не пользовался, но некоторым такой формат очень заходит.<\/li>\n<li><b>Органическая химия.<\/b> Перед биохимией может возникнуть потребность подучить. Можно почитать одноименную книгу под ред. Тюкавкиной. У меня основным учебником был «Ластухин Ю.О., Воронов С.А. Органічна хімія». По каждому классу соединений можно читать специализированную литературу, но на это жизни не хватит, так что лучше и не начинать.<\/li>\n<li><b>Неорганическая биохимия<\/b> — «Г. Эйхгорн. Неорганическая биохимия».<\/li>\n<li>Для понимания <b>лабораторной работы<\/b> листаем <a href=\"http:\/\/www.molecularcloning.com\/\" class=\"nu\">«<u>Molecular Cloning<\/u>»<\/a>.<\/li>\n<li>По методами нужно ориентироваться в <b>секвенировании<\/b> (это частично будет раскрыто в молекулярной биологии, но можно углубиться, загуглив Next-Generation Sequencing), <b>спектральных методах<\/b> (гуглить по потребности), <b>ПЦР<\/b> (есть годная книга «ПЦР в реальном времени» издательства Бином).<\/li>\n<li><b>Биотехнология.<\/b> «Глик Б., Пастернак Дж. Молекулярная биотехнология. Принципы и применение». Ну или оригинал, наверняка были новые издания.<\/li>\n<li><b>Микробиологию<\/b> ранее упустил, в общем виде она не нужна, как и вирусология. Чего-то лаконичного с прицелом на медицину я не нашел по этим двум предметам.<\/li>\n<li><b>Биоинформатика.<\/b> читаем «Buffalo V. Bioinformatics Data Skills», смотрим <a href=\"https:\/\/www.coursera.org\/learn\/bioinformatika\">Coursera<\/a>. На первое время хватит, далее можно искать другие курсы, в т.ч. очные от <a href=\"https:\/\/bioinf.me\">Института Биоинформатики<\/a>.<\/li>\n<li><b>Биостатистика.<\/b> «Гланц С. Медико-биологическая статистика, Ланг Т.А., Сесик М. Как описывать статистику в медицине». Сюда же «Гринхальх Т. Основы доказательной медицины».<\/li>\n<li>Чтобы приблизиться к <b>медицине<\/b> и <b>фарме<\/b>, читаем отраслевые стандарты — GMP, GCP и прочие GxP. Не страшно, если при первом прочтении не все будет понятно — при последующих прочтениях и при изучении новых редакций будет понятно еще меньше. Также полезным источником могут оказаться стандарты оказания медицинской помощи по разным заболеваниям. Там будет указано, чем в обязательном порядке лечить и как оценивать состояние пациента. Кроме российских, полезно брать всякие другие, например от American Diabetes Association для диабета.<\/li>\n<\/ul>\n",
            "date_published": "2019-07-22T15:45:30+03:00",
            "date_modified": "2019-07-22T15:45:23+03:00",
            "_date_published_rfc2822": "Mon, 22 Jul 2019 15:45:30 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "16",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "14",
            "url": "https:\/\/repushko.com\/all\/shema-vybora-koda-http\/",
            "title": "Схема выбора кода ответа HTTP",
            "content_html": "<p><a href=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/6\/65\/Http-headers-status.gif\">Высокое разрешение<\/a><\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/Http-headers-status.gif-1.jpg\" width=\"2560\" height=\"1782\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Картинка для привлечения внимания<\/div>\n<\/div>\n",
            "date_published": "2019-06-09T01:07:14+03:00",
            "date_modified": "2019-06-09T01:07:02+03:00",
            "image": "https:\/\/repushko.com\/pictures\/Http-headers-status.gif-1.jpg",
            "_date_published_rfc2822": "Sun, 09 Jun 2019 01:07:14 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "14",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/Http-headers-status.gif-1.jpg"
                ]
            }
        }
    ],
    "_e2_version": 3565,
    "_e2_ua_string": "E2 (v3565; Aegea)"
}