<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Берлога программиста</title>
    <link>https://tyvik.ru/</link>
    <description>Recent content on Берлога программиста</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ru</language>
    <lastBuildDate>Tue, 07 Apr 2026 09:02:00 +0300</lastBuildDate>
    <atom:link href="https://tyvik.ru/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Чемодан без ручки</title>
      <link>https://tyvik.ru/posts/pet-project-issues/</link>
      <pubDate>Tue, 07 Apr 2026 09:02:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/pet-project-issues/</guid>
      <description>Есть у меня один pet-проект - GeoPuzzle. Вот настоящий чемодан без ручки - и закрыть жалко, всё-таки 10k человек в месяц играют, и развивать времени нет. А ещё он постоянно ломается. Нет, не из-за кода, а из-за новых внешних ограничений.&#xA;Изначально там были гуглокарты - с ключиком, всё красиво. Но внезапно оказалось, что при ~5k человек в месяц лимиты в $200 на карты заканчиваются. Ну ладно, отключаем ключик и показываем карты в режиме разработчика.</description>
    </item>
    <item>
      <title>Эксперимент на выживание: 8 месяцев в режиме хард-дедлайнов</title>
      <link>https://tyvik.ru/posts/constant-hard-deadlines/</link>
      <pubDate>Sat, 13 Dec 2025 20:04:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/constant-hard-deadlines/</guid>
      <description>В этом году я репостил статью как дышать, а не задыхаться. Там была интересная мысль про то, как заставлять себя делать больше. Всё очень просто - публично пообещайте что-то сделать к определённому времени. Я попробовал и поставил над собой эксперимент длиной 8 месяцев. О результатах и выводах далее чуть подробнее.&#xA;Начало 🔗Итак, в чём состоял эксперимент? Я захотел проверить на сколько хватит моих сил - физических и моральных. Но по итогу выяснилось, что есть ещё и коммуникативные.</description>
    </item>
    <item>
      <title>Я рад, что застал рождение Рунета</title>
      <link>https://tyvik.ru/posts/born-runet/</link>
      <pubDate>Wed, 10 Sep 2025 20:08:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/born-runet/</guid>
      <description>Это было интересное время, которое никогда больше не повторится. То время, когда интернет раздавали по талонамкарточкам, и берегли каждую минуту в сети. Самым популярным сайтом для меня тогда был локальный форум http://forums.kuban.ru, где обсуждали вообще всё. И незаменимой была программа Teleport Pro, которая скачивала локально в фоне страницы, чтобы можно было их почитать спокойно в оффлайне. Там я познакомился с программистом из Уралсиба, который был для меня гейм-дилером. Он мне давал копировать диски с интересными играми: Baldur&amp;rsquo;s Gate, Neverhood, Петька&amp;hellip;</description>
    </item>
    <item>
      <title>Tail-calling: разбираемся в новом интерпретаторе в CPython</title>
      <link>https://tyvik.ru/posts/tail-calling-optimization/</link>
      <pubDate>Tue, 08 Apr 2025 20:08:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/tail-calling-optimization/</guid>
      <description>В последнее время в моём инфополе появилось много шума вокруг нового типа интерпретатора в Python: tail-calling. Я посмотрел PR на Github, из которого понял, что [[clang::musttail]] должен ускорить рантайм на 5%.&#xA;Ещё я почитал Соболева, но понял только то, что эта инструкция генерирует вызов метода в asm-коде как jmp, а не call, то есть экономит один стэк-фрейм — посмотреть можно тут. Но почему эти инструкции в данном случае эквивалентны и сработают в CPython — непонятно.</description>
    </item>
    <item>
      <title>Собеседование а энтерпрайз</title>
      <link>https://tyvik.ru/posts/enterprise-interview/</link>
      <pubDate>Fri, 26 Jul 2024 20:08:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/enterprise-interview/</guid>
      <description>Волею судеб я снова стал ходить на собеседования, и хочу поделиться некоторыми наблюдениями. На этот раз речь про энтерпрайзные компании, в которых должен быть выстроен процесс найма.&#xA;Скрининг 🔗Всё начинает с него, и тех-скрининг становится нормой. Рекрутер прям на первом звонке задаёт каверзные вопросы и сверяется со шпаргалкой. Например:&#xA;как остановить контейнер? неизменяемые типы данных в python? какой pid у ядра linux? как расшифровывается CAP и PACELC? &amp;hellip; Тинькофф пошёл ещё дальше и создал целую платформу с небольшими кусками кода, который можно запускать.</description>
    </item>
    <item>
      <title>Обзор на курс &#34;Основы генетики&#34;</title>
      <link>https://tyvik.ru/posts/skillbox-genetics/</link>
      <pubDate>Sat, 09 Dec 2023 08:06:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/skillbox-genetics/</guid>
      <description>Прошёл следующий курс на Skillbox, который называется &amp;ldquo;Основы генетики&amp;rdquo;. Если честно, то немного разочарован. Нет на мой взгляд самого интересного: генной инженерии, CRISPR/CAS9, расшифровки ДНК, сборки вакцины от COVID и т.п. С другой стороны он именно что про основы. Если вы не прогуливали биологию в школе и хоть как-то следите за генетикой, то найдёте для себя мало нового. Тем не менее, что я узнал:&#xA;пол у других животных может быть абсолютно по-разному спроектирован (Y-хромосома не обязательно отвечает за мужской) при кодировании мРНК репликация идёт только от 5&amp;rsquo; к 3&amp;rsquo; основаниям понимание статистики в генетике крайне необходимо как устроен горизонтальный перенос генов между бактериями и растениями мне интересно больше изучение генотипа и микробиологии, нежели фенотипа Из плюсов хочется отметить хорошо сделанные слайды и, пожалуй, раскрытие темы основ генетики.</description>
    </item>
    <item>
      <title>Принципы коммуникации в команде</title>
      <link>https://tyvik.ru/posts/communication/</link>
      <pubDate>Thu, 07 Dec 2023 13:02:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/communication/</guid>
      <description>За свои 15+ лет в разработке я понял, что чуть ли не половина времени уходит на коммуникацию. И хотя в основном я работаю в IDE, общения всё равно достаточно много. Дейли, груминги и прочие scrum-ритуалы; выяснение требований у заказчика; обсуждение MR и архитектуры&amp;hellip; Просто обратите внимание сколько времени вы пишете код, а сколько общаетесь с коллегами.&#xA;В распределённой команде коммуникация становится в несколько раз сложнее. Там нет встреч у кулера, общих обедов, курилок и т.</description>
    </item>
    <item>
      <title>Обзор на курс &#34;Мир Страдающего Средневековья&#34;</title>
      <link>https://tyvik.ru/posts/skillbox-medieval-history/</link>
      <pubDate>Mon, 20 Nov 2023 20:06:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/skillbox-medieval-history/</guid>
      <description>Пользуясь возможностью, стал проходить курсы Skillbox. В первую очередь для общего развития, и начал с истории. Мне интересна эта наука, потому что позволяет понять почему что-то появилось в нашей жизни именно в таком виде; что повлияло и какие были предпосылки. Это даёт представление как о границах применимости инструмента или понятия, так и о его актуальности. Возможно, наша жизнь настолько изменилась, что пора бы уже этот атавизм и отбросить.&#xA;Начал с курса &amp;ldquo;Мир Страдающего Средневековья&amp;rdquo;.</description>
    </item>
    <item>
      <title>Как работает ChatGPT</title>
      <link>https://tyvik.ru/posts/what-is-chatgpt-doing/</link>
      <pubDate>Sat, 03 Jun 2023 10:55:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/what-is-chatgpt-doing/</guid>
      <description>Просто добавляйте по одному слову&amp;hellip; 🔗То, что ChatGPT может автоматически генерировать что-то, что хотя бы на первый взгляд похоже на написанный человеком текст, удивительно и неожиданно. Но как он это делает? И почему это работает? Цель этой статьи - дать приблизительное описание того, что происходит внутри ChatGPT, а затем исследовать, почему он может так хорошо справляться с созданием более-менее осмысленного текста. С самого начала я должен сказать, что собираюсь сосредоточиться на общей картине происходящего, и хотя я упомяну некоторые инженерные детали, но не буду глубоко в них вникать.</description>
    </item>
    <item>
      <title>У вас нет причин использовать Alpine для python проектов</title>
      <link>https://tyvik.ru/posts/alpine-python/</link>
      <pubDate>Wed, 14 Dec 2022 13:02:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/alpine-python/</guid>
      <description>По мотивам моего доклада на PyCon &amp;ldquo;Контейнеризация Python без боли&amp;rdquo;. На своей практике я постоянно сталкиваюсь со спорами какой базовый образ лучше использовать для проектов: alpine или debian. Аргументы есть и у той, и у другой стороны, но мне это настолько надоело, что я решил сам разобраться и наконец-то поставить точку. В конце концов &amp;ldquo;В наше время верить нельзя никому, даже себе. Но мне - можно.&amp;rdquo; (с)&#xA;Сравниваем базовые образы alpine и debian 🔗Перед тем, как мы перейдём к специфике запуска python-проектов под alpine, давайте заглянем под капот базовых образов и сравним что они нам предлагают.</description>
    </item>
    <item>
      <title>Обновляем ключи для apt</title>
      <link>https://tyvik.ru/posts/apt-key-migrate/</link>
      <pubDate>Fri, 25 Nov 2022 13:02:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/apt-key-migrate/</guid>
      <description>В наше время тотальной слежки и всеобщего недоверия всё должно подписываться публичными ключами. Утрирую, конечно, но проблема стара как мир - как убедиться, что файл был создан действительно тем, кому мы доверяем? Сегодня речь пойдёт об apt и установку пакетов.&#xA;Прошло то время, когда люди ставили ПО из исходников. Это было реально неудобно по многим причинам, так что на свет появился сначала dpkg, а потом и apt-get. dpkg умеет работать с зависимостями и устанавливать пакеты, а apt - искать их в репозиториях.</description>
    </item>
    <item>
      <title>Готовимся резать лосей в портфеле</title>
      <link>https://tyvik.ru/posts/stocks-deals-visualizer/</link>
      <pubDate>Sat, 05 Nov 2022 13:02:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/stocks-deals-visualizer/</guid>
      <description>Скоро декабрь - самая пора резать лосей. Не тех, за которыми надо охотиться, а которые у нас в брокерском портфеле (loss - минусовые позиции). Тем более, что год выдался удивительным на события, и отрицательных позиций, уверен, много у каждого. Вот и я решил узнать что можно продать с минимальным убытком. Считать ручками как-то лень, так что весь код на github.&#xA;Немного теории 🔗Наш налоговый кодекс допускает некоторую оптимизацию уплаты. Первая попавшаяся статья говорит нам, что можно провернуть много чего, но я пользуюсь только парой пунктов:</description>
    </item>
    <item>
      <title>Тангенциальное обучение - мой путь</title>
      <link>https://tyvik.ru/posts/my-games/</link>
      <pubDate>Mon, 22 Aug 2022 06:43:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/my-games/</guid>
      <description>Сегодня хотел бы поднять тему игр. Кто-то относится к ним как к бесполезной трате времени, кто-то азартен и не может остановиться, но мне хочется показать как с помощью них можно учиться.&#xA;С рождения мы познаём мир через игры: сначала в какие-нибудь кубики и конструкторы, позже - с помощью специальных программ и обучающих материалов. Пожалуй, это самый простой способ получать знания даже неосознанно. Потому что интересно! Интересно победить, поэкспериментировать, сделать что-то новое&amp;hellip; Да, не могу сказать, что такая техника обучения самая эффективная, но то, что она работает - определённо.</description>
    </item>
    <item>
      <title>Дорогие рекрутеры!</title>
      <link>https://tyvik.ru/posts/hr-interview/</link>
      <pubDate>Wed, 10 Aug 2022 06:43:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/hr-interview/</guid>
      <description>Дорогие рекрутеры! Я искренне ценю ваш труд. Перебрать сотни резюме, созвониться с кандидатом, организовать встречи, собрать фидбек - это требует огромных усилий. Особенно, если это работа, которую надо делать каждый день. И я представляю вашу радость, когда оффер наконец-то принимают, и новый человек в команде хорошо приживается. Поздравляю! Но случается это, увы, не так часто. И мне хотелось бы рассказать как процесс общения и найма выглядит со стороны кандидата и как можно улучшить коммуникацию.</description>
    </item>
    <item>
      <title>Современный фронтенд неизлечимо болен</title>
      <link>https://tyvik.ru/posts/modern-frontend/</link>
      <pubDate>Mon, 02 May 2022 06:43:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/modern-frontend/</guid>
      <description>Волею судеб мне пришлось глубоко погрузиться в промышленную фронтенд разработку. До этого у меня были некоторые свои небольшие проекты, но писал я их в одиночку и не знал всех best practice. Следовал логике что чем проще, тем лучше, и они как-то работали. Пример можно посмотреть на GitHub GeoPuzzle - там используется React вместе с bootstrap, получилось достаточно минималистично. Сейчас же я работаю с крупным проектом на сотни компонент, несколько десятков страниц и сложной бизнес-логикой.</description>
    </item>
    <item>
      <title>Не все индексы одинаково полезны</title>
      <link>https://tyvik.ru/posts/postgres-index-scan-backward/</link>
      <pubDate>Fri, 24 Dec 2021 16:07:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/postgres-index-scan-backward/</guid>
      <description>Каждый разработчик знает, что если запрос тормозит, то надо просто добавить индекс. Контринтуитивна обратная ситуация - чтобы запрос работал быстрее, надо индекс удалить. Вот именно с таким случаем я и столкнулся на работе.&#xA;Попробуем смоделировать ситуацию. У нас есть всего одна таблица, в которой хранится информация по обработанным задачам. Пользователи дёргают ендпоинт, запускается Celery задача, и результат отправляется на email. Ничего сложного, всего несколько столбцов:&#xA;id - уникальный ключ task_id - номер задачи user_id - кто запустил started_at - время начала finished_at - время окончания О хранении исторической информации в реляционной БД Вообще, хранить в Postgres данные, которые не меняются - не самая хорошая практика.</description>
    </item>
    <item>
      <title>Моя любовь к линтерам</title>
      <link>https://tyvik.ru/posts/linters-love/</link>
      <pubDate>Thu, 15 Jul 2021 09:02:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/linters-love/</guid>
      <description>Я думаю, все понимают пользу стайлгайдов и оду линтерам не писал только ленивый, так что я собираюсь покинуть их число. За последние 10 лет правила форматирования кода появились у всех языков (а для некоторых даже несколько!). Причина понятна - единообразно написанный код проще читать. Глаз не цепляется за пропущенный пробел или скобку не на той строке. В Go это даже возведено в абсолют - вы не можете форматировать свою программу по-другому.</description>
    </item>
    <item>
      <title>Правильный запуск python-пакетов</title>
      <link>https://tyvik.ru/posts/python-m/</link>
      <pubDate>Sun, 11 Jul 2021 13:02:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/python-m/</guid>
      <description>На днях меня попросили посмотреть один странный баг, связанный с запуском приложения. Вот так $ python mymodule интерпретатор валился с ошибкой ModuleNotFoundError: No module named &#39;http.server&#39;; &#39;http&#39; is not a package (или ImportError: cannot import name &#39;server&#39; from partially initialized module &#39;http&#39; - зависит от того как импортировать http.server). Проблема уходит, если запускать пакет правильно $ python -m mymodule. И вроде бы вопрос закрыт, можно было бы и забить, но что-то меня заставило копнуть глубже и разобраться чем эти 2 команды различаются.</description>
    </item>
    <item>
      <title>Сбивается время при переключении систем в дуалбуте</title>
      <link>https://tyvik.ru/posts/dualboot-datetime-issue/</link>
      <pubDate>Sun, 04 Jul 2021 13:02:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/dualboot-datetime-issue/</guid>
      <description>У меня на ноутбуке установлено 2 ОС: Linux Mint и Windows 10. Первая - для работы, вторая - для Steam. Переключаюсь поиграть я не так чтобы часто, но в этот раз меня окончательно достал сброс времени при возврате в linux на 3 час, так что я решил всё-таки разобраться в проблеме. Мой часовой пояс Europe/Moscow UTC+3, значит где-то не происходит перевод из datetime with timezone в naive datetime или наоборот. И что же может быть общего между двумя ОС на разных разделах диска?</description>
    </item>
    <item>
      <title>Заводим Caddy на DigitalOcean с Let&#39;s Encrypt</title>
      <link>https://tyvik.ru/posts/caddy/</link>
      <pubDate>Sat, 12 Dec 2020 13:02:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/caddy/</guid>
      <description>За свои 15 лет в IT я перепробовал разные веб-серверы. Сначала это был Apache (куда же без него), потом перешёл на более лёгкий nginx (а как меня однажды OpenResty спас!). Поразвлекался с lighttpd когда держал дома FreeNAS, даже заводил pet-project под YAWS. И вот в одном из репозиториев увидел новый для себя Caddy. Поспрашивал в местных чатиках кто его использует, и меня убедили, что он уже вполне production-ready. Более того - настраивать ничего не надо, сертификаты сам обновляет, быстрый, всего один бинарник!</description>
    </item>
    <item>
      <title>Скачиваем оценки с kinopoisk.ru</title>
      <link>https://tyvik.ru/posts/dump-kinopoisk/</link>
      <pubDate>Wed, 04 Nov 2020 23:02:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/dump-kinopoisk/</guid>
      <description>У меня есть некоторая паранойя касательно моих данных. Мне постоянно кажется, что я могу их потерять. Поэтому, я стараюсь делать бэкапы всего, что только можно: фото, видео, проектов&amp;hellip; и рейтинга просмотренных фильмов. Один раз меня это уже спасло - когда внезапно закрылся ImhoNet. Тогда я перебрался на Kinopoisk. И что-то не уверен в правильности своего решения. После того, как он убил аккаунт жены, добавив туда кучу мусора, я решил проверить не случилось ли это с моим, а заодно и сделать бэкап.</description>
    </item>
    <item>
      <title>Образы в нашей голове</title>
      <link>https://tyvik.ru/posts/images-in-mind/</link>
      <pubDate>Sun, 09 Aug 2020 12:08:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/images-in-mind/</guid>
      <description>Есть у меня такое хобби - интересоваться как же на самом деле работает наш мозг. И чем больше я знакомлюсь с ним, тем больше он меня удивляет. Насколько это мощный, но в то же время и бажный механизм. Сегодня я остановлюсь на образах. Здесь под образом я понимаю собирательное представление чего-либо: предмета, человека, роли (жены, профессионала) и пр. У которого в свою очередь у каждого свои определения (привет, навешивание ярлыков и ошибки атрибуции).</description>
    </item>
    <item>
      <title>Почему не iPhone. Моё ИМХО.</title>
      <link>https://tyvik.ru/posts/why-not-iphone/</link>
      <pubDate>Wed, 05 Aug 2020 12:08:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/why-not-iphone/</guid>
      <description>Одним из призов за победу в конкурсе приложений VK был iPhone 11. Я решил воспользоваться случаем и попробовать перейти на него. tl;dr Это закончилось фейлом, я вернулся на свой прежний аппарат Xiaomi Mi A2.&#xA;Первое ощущение, когда вы берёте этот аппарат в руку - он тяжёлый! Мне вспомнилась какая-то Нокия из студенчества. Долговечность, надёжность, в общем, весчъ! И по началу вроде бы ok, но со временем рука начинает уставать. Да, Mi A2 всего на 30г легче, но это заметно.</description>
    </item>
    <item>
      <title>SPARQL: Получаем данные из Wikipedia правильно</title>
      <link>https://tyvik.ru/posts/sparql/</link>
      <pubDate>Sun, 12 Jul 2020 20:31:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/sparql/</guid>
      <description>Disclaimer: Текстовая расшифровка лишь частично пересекается с видео. На мастер-классе всё пошло не так :)&#xA;Здравствуйте, меня зовут Виктор Тыщенко, и сегодня я бы хотел поговорить как можно удобно получать факты из самой большой базы знаний - Wikipedia. Давным давно я увидел игру Puzzle Mercator, которую сделал один из сотрудников Google. Мне очень понравилась идея, так что я решил её скопировать, расширить и доработать. Например, показывать информацию об объектах в отдельном окошке, который бы напоминал инфобокс Wikipedia.</description>
    </item>
    <item>
      <title>Примеры SPARQL</title>
      <link>https://tyvik.ru/sparql/</link>
      <pubDate>Mon, 18 May 2020 12:52:00 +0300</pubDate>
      <guid>https://tyvik.ru/sparql/</guid>
      <description>Страны Европы с флагами 🔗 Населённые пункты Исландии 🔗 Население Германии 🔗 Страны Африки с регионами 🔗 Русские города, основанные с 900 до 1100 г. 🔗 </description>
    </item>
    <item>
      <title>Работа над PEG на Core Developer Sprint</title>
      <link>https://tyvik.ru/posts/peg/core-developer-sprint/</link>
      <pubDate>Mon, 04 Nov 2019 06:46:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/peg/core-developer-sprint/</guid>
      <description>Оригинал: &amp;lsquo;PEG at the Core Developer Sprint&amp;rsquo; by Guido van Rossum&#xA;В этой статье я не буду рассказывать о новых фичах генератора парсера - я достаточно описал его в предыдущих частях. Вместо этого хочу рассказать что я делал на Core Developer Sprint на прошлой неделе, прежде чем всё сотрётся из моей памяти. Хотя большая часть материала так или иначе всё равно касается PEG. Так что мне придётся показать некоторый код, который задаёт направление в реализации PEG-парсера для Python 3.</description>
    </item>
    <item>
      <title>Реализация остальных возможностей PEG</title>
      <link>https://tyvik.ru/posts/peg/features/</link>
      <pubDate>Fri, 01 Nov 2019 22:56:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/peg/features/</guid>
      <description>Оригинал: &amp;lsquo;Implementing PEG Features&amp;rsquo; by Guido van Rossum&#xA;После того, как я собрал все части генератора PEG-парсеров воедино в предыдущем посте, я готов показать как реализовать и некоторые другие интересные штуки.&#xA;Содержание серии статей о PEG-парсере в Python PEG парсеры Реализация PEG парсера Генерация PEG парсера Визуализация работы PEG парсера Леворекурсивные PEG грамматики Добавление экшенов в грамматику PEG Мета-грамматика для PEG парсера Реализация остальных возможностей PEG PEG на Core Developer Sprint Мы рассмотрим следующие фичи PEG:</description>
    </item>
    <item>
      <title>Мета-грамматика для PEG парсера</title>
      <link>https://tyvik.ru/posts/peg/meta-grammar/</link>
      <pubDate>Wed, 30 Oct 2019 06:36:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/peg/meta-grammar/</guid>
      <description>Оригинал: &amp;lsquo;A Meta-Grammar for PEG Parsers&amp;rsquo; by Guido van Rossum&#xA;На этой неделе мы делаем генератор парсеров «самостоятельным», то есть он будет генерировать свой собственный парсер.&#xA;Содержание серии статей о PEG-парсере в Python PEG парсеры Реализация PEG парсера Генерация PEG парсера Визуализация работы PEG парсера Леворекурсивные PEG грамматики Добавление экшенов в грамматику PEG Мета-грамматика для PEG парсера Реализация остальных возможностей PEG PEG на Core Developer Sprint Итак, у нас уже есть генератор парсера, часть которого является парсером грамматики.</description>
    </item>
    <item>
      <title>Добавление экшенов в грамматику PEG</title>
      <link>https://tyvik.ru/posts/peg/actions/</link>
      <pubDate>Tue, 29 Oct 2019 04:31:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/peg/actions/</guid>
      <description>Оригинал: &amp;lsquo;Adding Actions to a PEG Grammar&amp;rsquo; by Guido van Rossum&#xA;Грамматика становится ещё лучше, если вы можете добавить (некоторую) семантику в соответствии с правилами. В частности, для анализатора Python, который я разрабатываю, мне нужно возвращать узел AST из каждой альтернативы, поскольку я хочу придерживаться текущей реализации AST в CPython.&#xA;Содержание серии статей о PEG-парсере в Python PEG парсеры Реализация PEG парсера Генерация PEG парсера Визуализация работы PEG парсера Леворекурсивные PEG грамматики Добавление экшенов в грамматику PEG Мета-грамматика для PEG парсера Реализация остальных возможностей PEG PEG на Core Developer Sprint Многие грамматики используют соглашение, позволяющее добавлять экшены к правилам - обычно это блок кода внутри {фигурных скобок}.</description>
    </item>
    <item>
      <title>Леворекурсивные PEG грамматики</title>
      <link>https://tyvik.ru/posts/peg/left-recursive-grammar/</link>
      <pubDate>Sat, 26 Oct 2019 07:14:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/peg/left-recursive-grammar/</guid>
      <description>Оригинал: &amp;lsquo;Left-recursive PEG Grammars&amp;rsquo; by Guido van Rossum&#xA;Я упоминал о левой рекурсии как о камне преткновения несколько раз, и пришло время разобраться с этим. Основная проблема заключается в том, что парсер с лево-рекурсивным спуском мгновенно падает из-за переполнения стека.&#xA;Содержание серии статей о PEG-парсере в Python PEG парсеры Реализация PEG парсера Генерация PEG парсера Визуализация работы PEG парсера Леворекурсивные PEG грамматики Добавление экшенов в грамматику PEG Мета-грамматика для PEG парсера Реализация остальных возможностей PEG PEG на Core Developer Sprint Рассмотрим это гипотетическое правило грамматики:</description>
    </item>
    <item>
      <title>Визуализация работы PEG парсера</title>
      <link>https://tyvik.ru/posts/peg/visualization/</link>
      <pubDate>Wed, 23 Oct 2019 05:06:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/peg/visualization/</guid>
      <description>Оригинал: &amp;lsquo;Visualizing PEG Parsing&amp;rsquo; by Guido van Rossum&#xA;В прошлый раз получился простой генератор парсера PEG. Сейчас же я покажу, что на самом деле делает сгенерированный парсер при разборе программы. Я погрузился в ретро-мир ASCII-арта, в частности, библиотеку с именем «curses», которая доступна в стандартной поставке Python для Linux и Mac, а также как дополнение для Windows.&#xA;Содержание серии статей о PEG-парсере в Python PEG парсеры Реализация PEG парсера Генерация PEG парсера Визуализация работы PEG парсера Леворекурсивные PEG грамматики Добавление экшенов в грамматику PEG Мета-грамматика для PEG парсера Реализация остальных возможностей PEG PEG на Core Developer Sprint &amp;lt;В конце статьи под спойлером приводится gif.</description>
    </item>
    <item>
      <title>Генерация PEG-парсера</title>
      <link>https://tyvik.ru/posts/peg/generation/</link>
      <pubDate>Mon, 21 Oct 2019 18:33:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/peg/generation/</guid>
      <description>Оригинал: &amp;lsquo;Generating a PEG Parser&amp;rsquo; by Guido van Rossum&#xA;Теперь, когда я набросал основу самописного парсера, давайте перейдём к генерации его методов из грамматики, как я и обещал. Также покажу как реализовать packrat-парсер с помощью декоратора @memoize.&#xA;Содержание серии статей о PEG-парсере в Python PEG парсеры Реализация PEG парсера Генерация PEG парсера Визуализация работы PEG парсера Леворекурсивные PEG грамматики Добавление экшенов в грамматику PEG Мета-грамматика для PEG парсера Реализация остальных возможностей PEG PEG на Core Developer Sprint В прошлый раз мы разобрали несколько методов парсера.</description>
    </item>
    <item>
      <title>Реализация PEG парсера</title>
      <link>https://tyvik.ru/posts/peg/implementation/</link>
      <pubDate>Sat, 19 Oct 2019 22:08:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/peg/implementation/</guid>
      <description>Оригинал: &amp;lsquo;Building a PEG Parser&amp;rsquo; by Guido van Rossum&#xA;Вдохновленный лишь частичным пониманием PEG, я решил попробовать его реализовать. Результат может получиться и не самым лучшим среди парсеров PEG общего назначения - их уже много (например, TatSu написан на Python и генерирует код Python) - но это хороший способ разобраться в PEG. В дальнейшем я хочу заменить им текущую реализацию парсера в CPython.&#xA;Содержание серии статей о PEG-парсере в Python PEG парсеры Реализация PEG парсера Генерация PEG парсера Визуализация работы PEG парсера Леворекурсивные PEG грамматики Добавление экшенов в грамматику PEG Мета-грамматика для PEG парсера Реализация остальных возможностей PEG PEG на Core Developer Sprint В этом разделе я закладываю основы для понимания работы парсера, на примере простой самописной реализации игрушечной грамматики из прошлой статьи.</description>
    </item>
    <item>
      <title>PEG парсеры</title>
      <link>https://tyvik.ru/posts/peg/parsers/</link>
      <pubDate>Thu, 17 Oct 2019 09:36:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/peg/parsers/</guid>
      <description>Оригинал: &amp;lsquo;PEG parsers&amp;rsquo; by Guido van Rossum&#xA;Несколько лет назад меня кто-то спросил имеет ли смысл превести Python на PEG-парсер (или на грамматику PEG; я не помню точно кто и когда это было). Тогда я немного посмотрел на него, но так и не пришёл к какому-либо выводу, а потому и отбросил эту тему. Недавно я узнал больше о PEG (Parsing Expression Grammars, грамматике по парсингу выражений), и теперь я думаю, что это интересная альтернатива самописному генератору парсеров, который был разработан 30 лет назад, когда только начинал работать над Python.</description>
    </item>
    <item>
      <title>Содержание цикла статей о PEG-парсере для Python</title>
      <link>https://tyvik.ru/posts/peg/</link>
      <pubDate>Tue, 15 Oct 2019 04:31:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/peg/</guid>
      <description>Оригинал: &amp;lsquo;PEG Parsing Series Overview&amp;rsquo; by Guido van Rossum&#xA;Содержание серии статей о PEG-парсере в Python 🔗 PEG парсеры Реализация PEG парсера Генерация PEG парсера Визуализация работы PEG парсера Леворекурсивные PEG грамматики Добавление экшенов в грамматику PEG Мета-грамматика для PEG парсера Реализация остальных возможностей PEG PEG на Core Developer Sprint А вот видео с North Bay Python, в котором он рассказывает про PEG парсеры.</description>
    </item>
    <item>
      <title>Рецензия на книгу &#34;Пиши, сокращай&#34;, или как же уважать читателя?</title>
      <link>https://tyvik.ru/posts/write-cut/</link>
      <pubDate>Thu, 07 Mar 2019 11:55:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/write-cut/</guid>
      <description>Тема выражения своих мыслей, их структурирования и умение донести идею сейчас очень актуальна для меня. Порой мне кажется, что это даже важнее, чем способность писать код. Так что когда несколько человек примерно в одно и то же время посоветовали мне &amp;ldquo;Пиши, сокращай&amp;rdquo;, я сразу пошёл в Читай-город (не реклама, в других магазинах можно найти дешевле).&#xA;Немного об издании 🔗Книга выполнена отлично! Приятная на ощупь плотная бумага, чёткая печать, яркие иллюстрации (за комикс с девушкой отдельное спасибо!</description>
    </item>
    <item>
      <title>Мультитенантность на примере DjangoORM и PostgreSQL</title>
      <link>https://tyvik.ru/posts/multitenancy/</link>
      <pubDate>Fri, 01 Mar 2019 11:55:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/multitenancy/</guid>
      <description>слайды&#xA;Что такое SaaS и тенант? 🔗Sofware as a Service (SaaS) - модель реализации вашего приложения, когда вы предоставляете свой продукт разным клиентам практически не меняя его. Например, есть у вас CRM, и вы подключаете в неё нескольких клиентов, разнося их по поддоменам: mvideo.crm.ru, dns.crm.ru, eldorado.crm.ru… Код процентов на 90% совпадает, различаются лишь стили и третьестепенная бизнес-логика. Каждый клиент в этом случае завётся тенантом. А чтобы чуть упростить вашу жизнь как разработчика, познакомлю с такой классной вещью как мультитенантность на примере DjangoORM и PostgreSQL.</description>
    </item>
    <item>
      <title>Первый python митап в Краснодаре</title>
      <link>https://tyvik.ru/posts/python-meetup-1/</link>
      <pubDate>Sat, 16 Feb 2019 04:31:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/python-meetup-1/</guid>
      <description>Список докладов:&#xA;Влад Токарев: &amp;ldquo;Itertools и функциональный python&amp;rdquo;. Видео Презентация Дмитрий Жерлицын: &amp;ldquo;Опциональная статическая типизация в Python 3&amp;rdquo;. Видео Презентация Виктор Тыщенко: &amp;ldquo;Реализация мультитенантности на примере Django и Postgres&amp;rdquo;. Видео Презентация Фото в группе в Vk и facebook</description>
    </item>
    <item>
      <title>Мои Хабразакладки</title>
      <link>https://tyvik.ru/posts/habra-bookmarks/</link>
      <pubDate>Tue, 29 Jan 2019 11:03:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/habra-bookmarks/</guid>
      <description>У каждого из нас есть традиции. У меня, например, раз в год перебирать закладки в браузере и избранное на других сайтах. Что-то становится не актуальным, что-то я и так выучиваю за год. Вот и сейчас подошла пора навести порядок в избранном Хабра. На момент начала чистки там 598 статей - довольно большая колекция на самые разные темы: и как работать с картинкам в CSS, и немного функциональщины, и для умного дома рецептики&amp;hellip; А чтобы ничего не потерять, я решил выгрузить все статьи в pdf и выложить в общий доступ.</description>
    </item>
    <item>
      <title>GeoPuzzle — собери мир по кусочкам</title>
      <link>https://tyvik.ru/posts/geopuzzle/</link>
      <pubDate>Thu, 01 Nov 2018 08:50:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/geopuzzle/</guid>
      <description>Хочу рассказать о проекте, который развивал последние пару лет. Называется он GeoPuzzle и представляет собой игру-паззл на политической карте мира. Цель - расставить кусочки-страны на свои места. Идея подсмотрена в статье &amp;ldquo;Головоломка Mercator для знатоков географии&amp;rdquo;, также в детстве играл в тетрис из стран (ещё под DOS), но название программы уже не припомню. Я был настолько вдохновлён идеей, что захотел сделать полноценный продукт, интересный не только школьникам, но и знатокам географии.</description>
    </item>
    <item>
      <title>Мои подписки</title>
      <link>https://tyvik.ru/posts/my-subscriptions/</link>
      <pubDate>Mon, 24 Sep 2018 23:21:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/my-subscriptions/</guid>
      <description>Сегодня хотел бы поговорить о поисках информации в интернете. Так уж сложилось, что я интересуюсь довольно большим кругом тем в области программирования. Самый лучший на мой взгляд способ получения информации - подписка на блоги, сайты и прочие интересные RSS. К сожалению, Google Reader умер (вернее, его убили), так что пришлось переехать на аналоги - Feedly тут делать - заодно почистил ленту. Итак, мои подписки:&#xA;Блоги 🔗 Хабрахабр&amp;#x1f1f7;&amp;#x1f1fa; - в пояснении не нуждается :) Дайджест новостей о python&amp;#x1f1fa;&amp;#x1f1f8;&amp;#x1f1f7;&amp;#x1f1fa;- новости в мире python: выход новых версий библиотек, статьи и пр.</description>
    </item>
    <item>
      <title>Подключение CI/CD к Django/React на примере CircleCI</title>
      <link>https://tyvik.ru/posts/circleci/</link>
      <pubDate>Sat, 07 Jul 2018 11:55:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/circleci/</guid>
      <description>Зачем мне это? 🔗Ну куда ж в наше время без CI/CD - пришлось настраивать. Чтобы пуш в мастер обновлял прод, чтобы тесты прогонялись, и вообще спокойно жилось&amp;hellip; У меня open source проект, ничего ставить на свои виртуалки я не хочу, так что подходили как минимум 2 сторонних сервиса: TravisCI и CircleCI. С первым я уже знакомился в рамках автоматического тестирования своей библиотеки для работы с Yandex.Disk, так что почему бы не попробовать другой для сравнения?</description>
    </item>
    <item>
      <title>Организация поиска по сайту: запросы</title>
      <link>https://tyvik.ru/posts/elasticsearch-queries/</link>
      <pubDate>Fri, 23 Feb 2018 12:08:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/elasticsearch-queries/</guid>
      <description>В предыдущей статье мы разобрали основы Elasticsearch: индексы, маппинги и анализаторы. В этой же я хочу углубиться в тему построения запросов. У Elasticsearch свой собственный DSL, который может показаться непривычным, но по своей гибкости не уступает всем знакомому SQL. Набор данных, над которым я буду приводить примеры, можно взять здесь: Набор данных POST /twitter/tweet/_bulk {&amp;#34;index&amp;#34;: {&amp;#34;_id&amp;#34;: 1}} {&amp;#34;subject&amp;#34;: &amp;#34;Первая запись в твиттер&amp;#34;, &amp;#34;geotag&amp;#34;: &amp;#34;Краснодар&amp;#34;, &amp;#34;hashtags&amp;#34;: [&amp;#34;твит&amp;#34;, &amp;#34;новости&amp;#34;, &amp;#34;Краснодар&amp;#34;], &amp;#34;published&amp;#34;: &amp;#34;2014-09-12T20:44:42+00:00&amp;#34;} {&amp;#34;index&amp;#34;: {&amp;#34;_id&amp;#34;: 2}} {&amp;#34;subject&amp;#34;: &amp;#34;Первая запись в Геленджике&amp;#34;, &amp;#34;geotag&amp;#34;: &amp;#34;Геленджик&amp;#34;, &amp;#34;hashtags&amp;#34;: [&amp;#34;твит&amp;#34;, &amp;#34;море&amp;#34;, &amp;#34;Геленджик&amp;#34;], &amp;#34;published&amp;#34;: &amp;#34;2014-09-13T20:44:42+00:00&amp;#34;} {&amp;#34;index&amp;#34;: {&amp;#34;_id&amp;#34;: 3}} {&amp;#34;subject&amp;#34;: &amp;#34;Солнечный Краснодар&amp;#34;, &amp;#34;geotag&amp;#34;: &amp;#34;Краснодар&amp;#34;, &amp;#34;hashtags&amp;#34;: [&amp;#34;Краснодар&amp;#34;], &amp;#34;published&amp;#34;: &amp;#34;2014-09-11T20:44:42+00:00&amp;#34;} {&amp;#34;index&amp;#34;: {&amp;#34;_id&amp;#34;: 4}} {&amp;#34;subject&amp;#34;: &amp;#34;Солнечный Геленджик&amp;#34;, &amp;#34;geotag&amp;#34;: &amp;#34;Геленджик&amp;#34;, &amp;#34;hashtags&amp;#34;: [&amp;#34;Геленджик&amp;#34;], &amp;#34;published&amp;#34;: &amp;#34;2014-09-11T10:44:42+00:00&amp;#34;} PUT /twitter/retweet/1?</description>
    </item>
    <item>
      <title>Организация поиска по сайту: основы</title>
      <link>https://tyvik.ru/posts/elasticsearch/</link>
      <pubDate>Tue, 06 Feb 2018 20:08:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/elasticsearch/</guid>
      <description>Отсутствие опыта работы с Elasticsearch всегда считал своим слабым местом. Эту NoSQL БД используют для хранения логов, анализа информации и, самое главное, поиска. Собственно, она и представляет собой поисковый движок на базе Apache Lucene по json документам. Ну, плюс, конечно же, шардирование и репликация из коробки, настройки которых я пока касаться не буду.&#xA;Видео доклада 🔗На базе этой статьи был подготовлен доклад на Krasnodar Backend: Meetup #2. Возможно, кому-то такая подача материала ближе, так что добавлю видео и слайды.</description>
    </item>
    <item>
      <title>Без телефона вы никто</title>
      <link>https://tyvik.ru/posts/without-phone/</link>
      <pubDate>Sun, 26 Nov 2017 20:04:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/without-phone/</guid>
      <description>Так уж вышло, что мой Nexus 5X внезапно ушёл в циклическую перезагрузку, и мне пришлось отдать его в ремонт. После диагностики выяснилось, что виноват контроллер питания, и работы займут около недели. Я решил поэкспериментировать и на какое-то время остаться без телефона, и тут выяснилась страшная правда.&#xA;Без телефона вы беспомощны 🔗Он настолько сильно влился в нашу жизнь, что мы его уже не замечаем - а зря.&#xA;Вы лишаетесь доступа к информации - посмотреть погоду или пробки становится невозможным.</description>
    </item>
    <item>
      <title>Выступление на Krasnodar Dev Days 2 о Python</title>
      <link>https://tyvik.ru/posts/krddevdays-python/</link>
      <pubDate>Thu, 02 Nov 2017 10:40:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/krddevdays-python/</guid>
      <description>слайды&#xA;Всем привет! Меня зовут Тыщенко Виктор, я backend team-lead в компании 3d4medical. Вижу, тут собралось много людей, любящих решать задачи и интересующихся чем-то новым. У каждого из нас есть свои способы, свои проверенные инструменты и, в конце концов, любимые языки программирования. Я же хочу рассказать о своём, который помогает сосредоточиться на задаче, а не заставляет бороться с компилятором и вспоминать какие-то низкоуровневые конструкции.&#xA;Python 🔗Что за зверь? Первая его версия вышла более 20 лет назад, причём написал его человек, получивший образование именно в сфере разработки языков программирования.</description>
    </item>
    <item>
      <title>О себе</title>
      <link>https://tyvik.ru/about/</link>
      <pubDate>Mon, 30 Oct 2017 12:52:00 +0300</pubDate>
      <guid>https://tyvik.ru/about/</guid>
      <description>Где я? 🔗Вы попали в берлогу, где любят компьютеры, сети, ОС и программирование во всех его проявлениях. Здесь собраны материалы по самым разным областям.&#xA;Кто здесь? 🔗Здесь обитает программист. На входе кофе и пицца, на выходе код, причём качество второго напрямую зависит от качества первого. Итак, пописывает он себе программки да сайтики. Что из этого выходит можно посмотреть в разделе проектов. Пишется на всём, что под руку попадётся — от asm до python, не гнушаясь php, erlang, java…</description>
    </item>
    <item>
      <title>Проекты</title>
      <link>https://tyvik.ru/projects/</link>
      <pubDate>Mon, 30 Oct 2017 12:52:00 +0300</pubDate>
      <guid>https://tyvik.ru/projects/</guid>
      <description>Geo!Puzzle 🔗 Игра для изучения политической карты мира. Необходимо перетащить контуры стран на свои места. Прям как в детстве мы собирали паззлы кусочек за кусочком, так и здесь карта мира складывается из множества государств.&#xA;YaDiskClient 🔗Python-библиотека для работы с Yandex.Disk, которую я хотел сделать максимально простой. Описана в статье Python API для Яндекс.Диск (а исходники на github), общение идёт по протоколу WebDAV.&#xA;AWS doc 🔗За годы работы с AWS у меня накопилась некоторая экспертиза в этой области, и я был очень удивлен, когда не нашёл хоть какой-то документации на русском языке, кроме официальной.</description>
    </item>
    <item>
      <title>AsyncIO для практикующего python-разработчика</title>
      <link>https://tyvik.ru/posts/asyncio-for-the-working-python-developer/</link>
      <pubDate>Fri, 08 Sep 2017 09:27:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/asyncio-for-the-working-python-developer/</guid>
      <description>Оригинал: &amp;lsquo;AsyncIO for the Working Python Developer&amp;rsquo; by Yeray Diaz; перевод был впервые опубликован на Хабрахабре.&#xA;Я помню тот момент, когда подумал «Как же медленно всё работает, что если я распараллелю вызовы?», а спустя 3 дня, взглянув на код, ничего не мог понять в жуткой каше из потоков, синхронизаторов и функций обратного вызова.&#xA;Тогда я познакомился с asyncio, и всё изменилось.&#xA;Если кто не знает, asyncio — новый модуль для организации конкурентного программирования, который появился в Python 3.</description>
    </item>
    <item>
      <title>Получаем фотографии NASA с Марса с помощью aiohttp</title>
      <link>https://tyvik.ru/posts/getting-mars-photos-from-nasa-using-aiohttp/</link>
      <pubDate>Thu, 29 Jun 2017 20:04:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/getting-mars-photos-from-nasa-using-aiohttp/</guid>
      <description>Оригинал: &amp;lsquo;Getting Mars photos from NASA using aiohttp&amp;rsquo; by PAWEŁ FERTYK; перевод был впервые опубликован на Хабрахабре.&#xA;Я большой фанат книги «Марсианин» Энди Вейера. Читая её, мне было интересно, что же Марк Уотни чувствовал, гуляя по красной планете. Недавно наткнулся на пост на Twillo, в котором упоминалось, что у NASA есть публичный API для доступа к фотографиям с марсоходов. Так что я решил написать собственное приложение для просмотра изображений непосредственно в браузере.</description>
    </item>
    <item>
      <title>Да, Python медленный, но меня это не волнует</title>
      <link>https://tyvik.ru/posts/yes-python-is-slow-and-i-dont-care/</link>
      <pubDate>Fri, 02 Jun 2017 08:11:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/yes-python-is-slow-and-i-dont-care/</guid>
      <description>Оригинал: &amp;lsquo;Yes, Python is Slow, and I Don’t Care&amp;rsquo; by Nick Humrich; перевод был впервые опубликован на Хабрахабре.&#xA;Я беру паузу в моём обсуждении asyncio в Python, чтобы поговорить о скорости Python. Позвольте представиться, я — ярый поклонник Python, и использую его везде, где только удаётся. Одна из причин, почему люди выступают против этого языка, — то, что он медленный. Некоторые отказываются даже попробовать на нём поработать лишь из-за того, что «X быстрее».</description>
    </item>
    <item>
      <title>Почему print стал функцией в python 3?</title>
      <link>https://tyvik.ru/posts/python-3-print-function/</link>
      <pubDate>Sat, 20 May 2017 00:01:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/python-3-print-function/</guid>
      <description>Оригинал: &amp;lsquo;Why print became a function in Python 3&amp;rsquo; by Brett Cannon&#xA;После моего поста &amp;ldquo;Почему Python3 получился именно таким&amp;rdquo;, в котором я ответил на самые популярный вопрос почему в python 3 разделили текстовые и бинарные данные, меня попросили ответить на второй по популярности вопрос: почему в python3 print стал функцией.&#xA;Кто это сделал? 🔗print как выражение 🔗В самом простом случае выражение print A является эквивалентом sys.stdout.write(str(A) + &#39;\n&#39;). Если вы укажите дополнительные аргументы через запятую, то они будут переданы в str() и выведены в одной строке через пробел.</description>
    </item>
    <item>
      <title>Почему Python 3 получился именно таким</title>
      <link>https://tyvik.ru/posts/why-python3-exists/</link>
      <pubDate>Fri, 19 May 2017 11:07:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/why-python3-exists/</guid>
      <description>Оригинал: &amp;lsquo;Why Python 3 exists&amp;rsquo; by Brett Cannon&#xA;В этом месяце я отвечал на канале Q&amp;amp;A at PuPPY, что в конце концов заставило меня разобраться почему в Python3 появилось разделение по работе со строками и байтами. В итоге я получил благодарности по поводу объяснения, что несколько удивило меня, т.к. я наивно предполагал, что все знают зачем так было сделано. Хотя было бы глупо с моей стороны полагать что каждый - будь то новичок или продвинутый питонист - задавался этим вопросом и пытался найти объяснение.</description>
    </item>
    <item>
      <title>Ода кешированию в Django</title>
      <link>https://tyvik.ru/posts/django-cache/</link>
      <pubDate>Wed, 22 Mar 2017 23:02:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/django-cache/</guid>
      <description>Как известно, есть 2 проблемы программирования: выбор имени переменной и инвалидация кеша. Вторая меня на этой неделе прям достала. Извините, наболело&amp;hellip; Итак, кеширование - классная штука, она позволяет существенно ускорить работу приложения, но привносит свои проблемы. Главная из них - поддержание кеша в консистентном состоянии. Вроде бы ничего сложного - на сигнал post_save вешаем функцию по перерассчёту и радуемся жизни, но не всё так просто. В Django есть несколько адаптеров для работы с кешем, рассмотрим парочку из django.</description>
    </item>
    <item>
      <title>Получаем данные из Википедии через SPARQL</title>
      <link>https://tyvik.ru/posts/wikidata-sparql/</link>
      <pubDate>Mon, 20 Feb 2017 23:19:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/wikidata-sparql/</guid>
      <description>В своей игре GeoPuzzle мне понадобились некоторые данные о странах: флаги, столицы, население&amp;hellip; Откуда бы их взять? Наверно, с Википедии :) Задача, вроде, достаточно распространённая, так что спросим Google как это делается, авось и библиотека найдётся. Сразу бросается в глаза то, что настоятельно не рекомендуют парсить инфобоксы. Это верно - я сходу нашёл 3 разных их шаблона на 10 страницах. В одном из ответов на StackOverflow настоятельно рекомендовали использовать SPARQL. Так я узнал о том, что есть некий язык запросов для Википедии (на самом деле это реализовано в качестве плагина для MediaWiki).</description>
    </item>
    <item>
      <title>Выступление на Krasnodar Dev Days о Postgres</title>
      <link>https://tyvik.ru/posts/krddevdays-postgres/</link>
      <pubDate>Mon, 26 Dec 2016 10:40:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/krddevdays-postgres/</guid>
      <description>слайды&#xA;Всем привет!&#xA;Postgres 🔗Да, тема большая, так что я уточнил словом «Начало». Цель моего доклада — заинтересовать вас, рассказать о преимуществах и обсудить недостатки. В конце слайдов будут ссылочки на интересный материал на мой взгляд.&#xA;В основу баз данных была положена так называемая CAP-теорема. Она гласит, что для распределённых систем вы можете выбрать только 2 свойства из 3х: согласованность, доступность, партицирование. Ну это как создание сайта — выберите 2 из 3х: быстро, дёшево или качественно.</description>
    </item>
    <item>
      <title>Pillow всемогущий</title>
      <link>https://tyvik.ru/posts/pillow-almighty/</link>
      <pubDate>Thu, 20 Oct 2016 16:07:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/pillow-almighty/</guid>
      <description>Рано или поздно, но всем нам приходится работать с графикой. Заказчики просят добавить ватермарки, сделать превьюшки картинок, построить графики&amp;hellip; В мире python для этого есть библиотека Pillow, которая действительно умеет если не всё, то очень многое.&#xA;Установка pillow 🔗Pillow далеко не самостоятельная библиотека, ей необходима поддержка форматов сжатия файлов. Для ubuntu как правило хватает установки следующих пакетов:&#xA;$ sudo apt-get install libjpeg-dev libfreetype6-dev zlib1g-dev libpng12-dev То есть работы с jpg, png, ttf (шрифты) и gzip (нужен для некоторых форматов).</description>
    </item>
    <item>
      <title>Библиотека для парсинга сайта Scrapy</title>
      <link>https://tyvik.ru/posts/parsing-scrapy/</link>
      <pubDate>Tue, 20 Sep 2016 22:47:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/parsing-scrapy/</guid>
      <description>Рано или поздно перед каждым разработчиком встаёт задача что-нибудь стянуть с какого-нибудь сайта :) На этот раз я улетал туда, где интернета не было, так что хотел получить некую оффлайновую копию информации с сайта. Сам я не поощряю такие вещи (всё-таки авторы приложили немало усилий для наполнения контентом), но один разочек исключительно для личных нужд можно :) В интернете есть куча библиотек для парсинга сайтов, но я бы хотел найти реализацию на питоне.</description>
    </item>
    <item>
      <title>Миграции Django без даунтайма</title>
      <link>https://tyvik.ru/posts/django-migrations-without-downtime/</link>
      <pubDate>Sat, 23 Jul 2016 18:56:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/django-migrations-without-downtime/</guid>
      <description>Оригинал: &amp;lsquo;Django migrations without downtimes&amp;rsquo; by Ludwig Hähne&#xA;Большинство современных веб-приложений используют реляционные базы данных. Время от времени в них приходится менять схему для реализации новых фич или удаления ставших ненужными полей или таблиц. Так что все миграции должны быть учтены в процессе деплоя. С одной стороны, даже запланированный даунтайм может дорого обойтись бизнесу, а уж для больших компаний и подавно. С другой стороны, применение миграций на боевой системе может порушить веб-приложение самым неожиданным образом.</description>
    </item>
    <item>
      <title>Работаем с PostgreSQL из psql</title>
      <link>https://tyvik.ru/posts/postgresql-psql/</link>
      <pubDate>Mon, 11 Apr 2016 23:51:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/postgresql-psql/</guid>
      <description>Оригинал: &amp;lsquo;PostgreSQL on the Command Line&amp;rsquo; by Philipe Fatio&#xA;Мне настолько понравилась эта статья, что я решил её перевести. Получилось весьма вольно, но сама суть сохранена.&#xA;Я уже больше 4 лет работаю с PostgreSQL. В начале использовал графические программы, сейчас же обхожусь только встроенными утилитами командной строки. Так получается более эффективно.&#xA;Этот пост разделён на несколько секций согласно задачам, которые можно решать с помощью psql:&#xA;настройка psql получение справки возня в песочнице описание БД построение запросов сравнение вывода клонирование базы данных получение данных Настройка psql 🔗psql отлично настроена и из коробки, однако я бы хотел остановиться на 2х вещах, которые использую каждый день и которые делают psql более удобным инструментом.</description>
    </item>
    <item>
      <title>Реализация telegram bot через setWebhook</title>
      <link>https://tyvik.ru/posts/telegram-bot-setwebhook/</link>
      <pubDate>Tue, 21 Jul 2015 22:17:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/telegram-bot-setwebhook/</guid>
      <description>Не так давно Telegram открыл API для написание ботов. Примеры уже существующих можно посмотреть на их сайте. Всё общение сводится к отправке команды, её параметров и получение ответа, вот и меня попросили разобраться с этим и написать пример бота. Ну ok, почему бы и нет? :)&#xA;Регистрация нового бота telegram 🔗Начнём, как полагается, с документации. В ней сказано, что для регистрации своего бота надо обратиться к @BotFather с оной просьбой (/newbot).</description>
    </item>
    <item>
      <title>Мой Hello world на rust</title>
      <link>https://tyvik.ru/posts/first-with-rust/</link>
      <pubDate>Sun, 12 Jul 2015 10:15:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/first-with-rust/</guid>
      <description>Итак, у меня наконец-то появилось немного свободного времени, а значит пришло время попробывать rust. Давно хотел познакомиться с этим языком, т.к. разработчики обещают очень много плюшек: безопасный код, компилируемый в нативный, под кучу архитектур, интегрируемый с C/C++&amp;hellip; В общем, попробовать стоит! В качестве туториала взял статью на Хабре.&#xA;Установка 🔗В репозитории ubuntu 14.04 пакета с именем rust не нашлось. Странно, вроде уже не молодой язык&amp;hellip; Хотя там проблемы совместимости были до версии 1.</description>
    </item>
    <item>
      <title>Работа с шебенг (#!)</title>
      <link>https://tyvik.ru/posts/shebang/</link>
      <pubDate>Mon, 03 Nov 2014 20:21:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/shebang/</guid>
      <description>Уже второй раз за выходные натыкаюсь на особенность моей ОС - работа с шебенг. Это понятие применительно исключительно к миру *nix. Если вкратце, то это первая строка в файле, которая говорит с помощью какой программы оный запускать. Наверняка сталкивались с нечто похожим: #!/bin/bash или #!/usr/bin/python- это оно и есть :) Вернее, не совсем так, должны быть соблюдены следующие условия:&#xA;файл исполняемый (**x); файл не бинарный (в противном случае он запустится &amp;ldquo;как exe-шник&amp;rdquo;); первые 2 байта должны быть # и !</description>
    </item>
    <item>
      <title>Значения по умолчанию в python</title>
      <link>https://tyvik.ru/posts/python-defaults/</link>
      <pubDate>Sat, 01 Nov 2014 16:55:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/python-defaults/</guid>
      <description>Проходил как-то собеседование на должность python-разработчика, одним из вопросов был что выведет следующий код:&#xA;def f(value=[]): value.append(1) print value f() f([1]) f() К сожалению, хоть я и знал в чём подвох (значения по умолчанию в python не так уж просты :) ), но ответил неправильно. Что же тут не так можно посмотреть под катом.&#xA;Всё дело тут в т.н. значении по умолчанию, которое на самом деле не совсем уж значение, а очень даже переменная.</description>
    </item>
    <item>
      <title>Выступление на GDG Краснодар</title>
      <link>https://tyvik.ru/posts/gdg-krasnodar/</link>
      <pubDate>Sun, 12 Oct 2014 17:49:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/gdg-krasnodar/</guid>
      <description>Всем привет, прошу прощения, что так долго не писал, но на то были веские причины. За последние пару месяцев я узнал столько всего нового, написал кучу полезных вещей&amp;hellip; Увы, времени и сил на то, чтобы оформить это в статью уже не остаётся :( Но обо всём по-порядку.&#xA;GDG Краснодар: начало положено 🔗С месяц назад в IT-парке Краснодара состоялось собрание, посвящённое созданию GDG движения в Краснодаре. GDG расшифровывается как Google Development Group - собрания программистов, на которых обсуждаются технологии Google.</description>
    </item>
    <item>
      <title>Работа с odtPHP: подключаем картинки</title>
      <link>https://tyvik.ru/posts/odtphp-images/</link>
      <pubDate>Wed, 03 Sep 2014 18:50:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/odtphp-images/</guid>
      <description>В последнее время я всё глубже погружаюсь в Yii и вообще php-инфраструктуру. К сожалению, некоторые библиотеки авторы забросили, и приходится их дотачивать под свои нужды. Одной из таких является odtPHP, которая шаблонизирует odt документы. Мне казалось, что такая задача весьма распространена, ан решений всего парочка, и odtPHP понравилось мне больше всего. (Если кто-то использует что-то другое для работы с OOo из-под php, пожалуйста, отпишитесь). Однако, картинки она вставляет настолько криво, что современный LibreOffice напрочь отказывается читать документ.</description>
    </item>
    <item>
      <title>Деплой Django&#43;uWSGI&#43;Nginx</title>
      <link>https://tyvik.ru/posts/deploy-django-uwsgi-nginx/</link>
      <pubDate>Thu, 29 May 2014 10:35:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/deploy-django-uwsgi-nginx/</guid>
      <description>Несколькими статьями ранее я рассказывал как на одной странице вывести список объектов и форму для добавления нового. Пришло время запульнуть это приложение на сервер :) Для этого нам понадобится nginx (1.4.6), uwsgi (1.0.3), virtualenv (1.7.1.2), supervisor. Определимся, что файлы проекта будут лежать в /var/www/tyvik/markettyvik.&#xA;Установка виртуального окружения 🔗Любое приложение на Django по-хорошему надо поместить в песочницу, чтобы пакеты, которые оно требует, не конфликтовали с системными. Для этих целей есть специальные пакеты virtualenv и virtualenvwrapper.</description>
    </item>
    <item>
      <title>Перевод: &#34;Руководство: используем AngularJS вместе с Django&#34;</title>
      <link>https://tyvik.ru/posts/django-angular/</link>
      <pubDate>Tue, 20 May 2014 14:34:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/django-angular/</guid>
      <description>Данный материал сильно устарел и оставлен лишь для истории&#xA;Оригинал: &amp;lsquo;Tutorial: Using AngularJS with Django&amp;rsquo; by Glyn Jackson&#xA;Я надеялся написать простенькое руководство по использованию Angular вместе с Django. В том, что получилось, есть заслуга Red Bull. Прошу прощения за несколько скомканный конец!&#xA;Прочитав несколько статей, посвящённых Angular+Django, мне показалось, что все изобретают свои велосипеды. Пример, приведённый в этой статье, сыроват, но он должен показать как я использую эту связку.</description>
    </item>
    <item>
      <title>Django: список с формой добавления</title>
      <link>https://tyvik.ru/posts/django-list-create-view/</link>
      <pubDate>Sun, 18 May 2014 15:13:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/django-list-create-view/</guid>
      <description>Для одного из своих pet-проектов понадобилось реализовать список с формой добавления туда элемента. Как оказалось, в Django это несколько нетривиальная задача. Все, кто работал с этим фреймворком, знают про class-view (CreateView, ListView&amp;hellip;): вызываешь as_view с нужными параметрами в urlconf и всё готово :) Но класса типа ListAndCreateView я не нашёл. Хотя, как мне кажется, это довольно распространённая задача. Немного погуглив, я нашёл два ответа на SO (1, 2) на подобный вопрос.</description>
    </item>
    <item>
      <title>Прощай DynDNS, да здравствует no-ip</title>
      <link>https://tyvik.ru/posts/dyndns-vs-noip/</link>
      <pubDate>Wed, 16 Apr 2014 21:21:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/dyndns-vs-noip/</guid>
      <description>В связи с отключением бесплатных аккаунтов на dyn.com появилась необходимость перейти на что-то похожее. Вкратце, этот сервис предоставлял возможность получить статичное имя на динамический белый IP. Было удобно, т.к. он поддерживался моим модемом, который отвечал за это. Увы, халява кончилась :( Первое, что я придумал - написать скриптик, который бы лез на internet.yandex.ru, получал IP и писал его в файлик, который синхронизировался с каким-нибудь облаком. Всё отлично, но на домашнем компе был установлен только клиент Dropbox&amp;rsquo;а, а он имеет привычку уведомлять о том, что какой-то файлик изменился, что очень раздражает, т.</description>
    </item>
    <item>
      <title>Инфраструктура Erlang: с чего начать?</title>
      <link>https://tyvik.ru/posts/first-with-erlang/</link>
      <pubDate>Wed, 05 Feb 2014 16:37:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/first-with-erlang/</guid>
      <description>Посмотрев замечательную вводную от Юрия Жлобы, я понял, что писал под YAWS совсем не так, как нужно. Всё-таки без OTP, на чистом erlang, трудно делать серьёзные вещи. Вот и стал копать глубже в инфраструктуру этого языка: узнавать какие есть веб-сервера, библиотеки, концепции и правила. Посему эта заметка будет от новичка для новичка :)&#xA;С чего же начать? 🔗Прежде всего основы следует изучить на RSDN (там же и про обработку ошибок). После этого стоит посмотреть видео по ссылке выше.</description>
    </item>
    <item>
      <title>Python API для Яндекс.Диск</title>
      <link>https://tyvik.ru/posts/yandex-disk-python/</link>
      <pubDate>Thu, 30 Jan 2014 11:55:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/yandex-disk-python/</guid>
      <description>Дело было вечером, делать было нечего, вот и решил я написать обёртку для Яндекс Диска на python, дабы потом прикрутить скрипты бекапа для своих VPS. Готовое решение можно посмотреть на github или установить через pip: pip install YaDiskClient. Прежде чем начать, как полагается, посмотрел что же уже реализовано. Есть одна библиотека на PHP, которая удовлетворяет всем моим требованиям за исключением языка - хочется всё же работать на питоне. На pypi нашёл наработку от lexich.</description>
    </item>
    <item>
      <title>Создание персонального VPS</title>
      <link>https://tyvik.ru/posts/personal-vps/</link>
      <pubDate>Sun, 24 Nov 2013 11:03:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/personal-vps/</guid>
      <description>Задался я целью сделать себе виртуалочку, куда в дальнейшем переедет блог и демо всяких моих наработок. К тому же и жена себе фотосайтик захотела :) Делов-то: развернуть систему, выбрать имя и перенести проекты. А проектов много, и все они разные - тут и erlang, и django, и ruby&amp;hellip; В общем, небольшая тренировочка, хотя дома и так всё успешно работает.&#xA;Выбор виртуалки 🔗Остановился я на серверах от DigitalOcean, выбрал самый базовый тариф: 512Mb ОЗУ, 2.</description>
    </item>
    <item>
      <title>Установка PostgreSQL 9.6 на Ubuntu 16.04</title>
      <link>https://tyvik.ru/posts/postgresql-91-ubuntu/</link>
      <pubDate>Tue, 19 Nov 2013 20:19:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/postgresql-91-ubuntu/</guid>
      <description>Что-то мне в последнее время честенько приходится ставить postgres. То на новый боевой сервер, то на свою персональную VPS, так что я решил написать заметочку на будущее. Авось и ещё кому-нибудь пригодится :) Процесс установки я буду описывать на голой системе (ubuntu 16.04), и все команды будут от root&amp;rsquo;а. Так работать, конечно, не принято - все мы знаем, что sudo наше всё, но здесь я ничем не рискую, а пользователя добавлю уже после описанного.</description>
    </item>
    <item>
      <title>Про кодировки: Должна остаться только одна!</title>
      <link>https://tyvik.ru/posts/python-coding/</link>
      <pubDate>Thu, 19 Sep 2013 17:44:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/python-coding/</guid>
      <description>Сегодня пришлось мне повозиться с кодировкой строк. Задача: записать в базу русские буквы. Реализация: Python (MySQLdb) + MySQL + OS X. Не зря я здесь указал платформу ;) Казалось бы, тривиальная задача, ан нет - в таблицу падали крякозябры.&#xA;Сначала я грешил на питон с его странными строками (Python 2.7). Известно, что обычная строка там - просто последовательность байтов. Получить юникодную строку можно несколькими способами:&#xA;указать в начале файла # -*- coding: UTF-8 -*-, т.</description>
    </item>
    <item>
      <title>Паззл из стран Mercator. Клиент (js)</title>
      <link>https://tyvik.ru/posts/mercator-client/</link>
      <pubDate>Sun, 08 Sep 2013 20:06:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/mercator-client/</guid>
      <description>Содержание:&#xA;Введение Подготовка данных (ruby) Сервер (Erlang+YAWS) Клиент (JS) Сегодня заключительная статья из серии про Mercator. На этот раз поговорим про клиентскую часть. Из прошлой статьи видно, что после получения информации о странах из БД, эти данные пишутся в js-массив. Таким образом, ответы также есть в этом массиве (мы ведь пока просто играемся ;) ). Но сначала нужно создать объекты стран, которые можно двигать:&#xA;function addCountries() { var options = { strokeColor: &amp;#39;#FF0000&amp;#39;, strokeOpacity: 0.</description>
    </item>
    <item>
      <title>IDE или текстовый редактор</title>
      <link>https://tyvik.ru/posts/ide-vs-editor/</link>
      <pubDate>Fri, 23 Aug 2013 15:24:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/ide-vs-editor/</guid>
      <description>Сегодня хотел бы поговорить по поводу того, что же использовать в работе программисту: IDE или текстовый редактор? Я так и не пришёл к единому мнению что же использовать. Есть крупные IDE, которые создаются под язык программирования:&#xA;Visual Studio - C++ XCode - Objective-C Delphi - pascal (тут немного сложнее, но для общей картины) Eclipse - Java PHPStorm - PHP PyCharm - Python RubyMine - Ruby Сама идея IDE замечательна: тут и код, и дебаг, и структура модуля и прочие полезные плюшки, но все они далеки от идеала.</description>
    </item>
    <item>
      <title>Паззл из стран Mercator. Сервер (Erlang&#43;YAWS)</title>
      <link>https://tyvik.ru/posts/mercator-server/</link>
      <pubDate>Sat, 03 Aug 2013 11:43:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/mercator-server/</guid>
      <description>Содержание:&#xA;Введение Подготовка данных (ruby) Сервер (Erlang+YAWS) Клиент (JS) Это третья статья из цикла об игрушке Mercator - паззл из стран. На мой взгляд, самая интересная часть - Erlang. Почему он, а не, например, Node.js? Мне уже давно хочется познакомиться с миром функционального программирования, а Erlang - наиболее приспособленый для практического применения. Его основная фишка - легковесные потоки, которые выполняются параллельно, друг другу никогда не мешая, т.к. в этом языке нет понятия &amp;ldquo;переменная&amp;rdquo;.</description>
    </item>
    <item>
      <title>Моё участие в open source</title>
      <link>https://tyvik.ru/posts/my-open-source/</link>
      <pubDate>Wed, 24 Jul 2013 11:17:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/my-open-source/</guid>
      <description>Чем старше я становлюсь, тем больше начинаю задумываться о своём участии в open source проектах. Я пользуюсь открытой Ubuntu, шарюсь в интернете через бесплатные браузеры, использую программы, которые кто-то написал и поделился со всеми остальными. Я потребитель! Но ведь я же могу стать и производителем полезного-доброго-вечного. Да, у меня не всегда хватает времени и сил для вклада в общее дело, но уж деньги-то есть. Я стараюсь поддерживать интересные мне проекты - те, которые, как мне кажется, будут полезны многим людям.</description>
    </item>
    <item>
      <title>Паззл из стран Mercator. Подготовка данных (ruby)</title>
      <link>https://tyvik.ru/posts/mercator-data/</link>
      <pubDate>Thu, 18 Jul 2013 21:28:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/mercator-data/</guid>
      <description>Содержание:&#xA;Введение Подготовка данных (ruby) Сервер (Erlang+YAWS) Клиент (JS) Итак, у нас есть XML файл с координатами стран, теперь хорошо бы его загнать в базу данных. В нашем случае это PostgreSQL. Делать мы это будем с помощью замечательного языка Ruby. Для этого установим gem для работы с Postgres по имени pg (неожиданно, правда?):&#xA;$ gem install pg Но для начала создадим структуру БД:&#xA;-- создадим пользователя mercator CREATE ROLE mercator LOGIN NOSUPERUSER INHERIT CREATEDB NOCREATEROLE NOREPLICATION; -- добавим ему схему CREATE SCHEMA mercator AUTHORIZATION mercator; -- последовательность для таблицы стран CREATE SEQUENCE countries_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1; ALTER TABLE countries_seq OWNER TO mercator; -- создадим таблицу стран CREATE TABLE &amp;#34;Countries&amp;#34;( &amp;#34;ID&amp;#34; integer NOT NULL DEFAULT nextval(&amp;#39;countries_seq&amp;#39;::regclass), &amp;#34;Name&amp;#34; character varying(50) NOT NULL, -- имя страны &amp;#34;Level&amp;#34; character varying, -- кажется, масштаб, но пока не используется &amp;#34;Polygon&amp;#34; character varying[], -- список полигонов в виде строк &amp;#34;Available&amp;#34; boolean, -- доступность для игры &amp;#34;Answer&amp;#34; character varying(50), -- хранение ответа CONSTRAINT &amp;#34;CountriesID&amp;#34; PRIMARY KEY (&amp;#34;ID&amp;#34; ) ) WITH (OIDS=FALSE); ALTER TABLE &amp;#34;Countries&amp;#34; OWNER TO mercator; Теперь можно попробовать подключиться через пользователя mercator/mercator:</description>
    </item>
    <item>
      <title>Паззл из стран Mercator. Введение</title>
      <link>https://tyvik.ru/posts/mercator-intro/</link>
      <pubDate>Mon, 24 Jun 2013 20:12:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/mercator-intro/</guid>
      <description>Содержание:&#xA;Введение Подготовка данных (ruby) Сервер (Erlang+YAWS) Клиент (JS) На Хабре был как-то обзор небольшой игрушки от Google для демонстрации работы с API карт. Суть в том, что надо все страны растащить по своим местам. Когда-то в детстве у меня была подобная игрушка (ещё под DOS), но она больше напоминала тетрис - надо было успеть положить страну на своё место пока она не скрылась за границами экрана. Кстати, если кто вспомнит название, буду очень благодарен?</description>
    </item>
    <item>
      <title>Мне стыдно</title>
      <link>https://tyvik.ru/posts/i-am-ashamed/</link>
      <pubDate>Sat, 22 Jun 2013 00:11:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/i-am-ashamed/</guid>
      <description>Мне стыдно! Нет, мне реально стыдно за тот код, который приходится писать. Хуки, костыли, заплатки&amp;hellip; Чёрт, да я же не понимаю как это работает! Да, я это поправил, как? Чудом, интуицией - не знаю. И я не знаю где и когда оно сломается. Хотите получить гарантии, стабильность, спокойную жизнь - дайте время! Дайте время сделать всё по уму, я хочу сделать это правильно! А, что, дедлайн завтра? В пятницу вечером? Вы смеётесь?</description>
    </item>
    <item>
      <title>Разрабатываем Java2ME под Eclipse</title>
      <link>https://tyvik.ru/posts/java2me-eclipse/</link>
      <pubDate>Tue, 04 Jun 2013 23:04:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/java2me-eclipse/</guid>
      <description>Данный материал сильно устарел и оставлен лишь для истории&#xA;Есть у меня один проектик под J2ME (github). Это небольшое приложение - клиент для списка покупок. Разрабатывалось оно специально для моей второй половинки, чтобы было удобно сообщать что нужно купить в магазине. Т.к. телефон у неё простой, то единственный вариант нативного приложения - Java2ME. Решил я его доделать, но все настройки Eclipse слетели после перехода с OpenSUSe на Mint. Что ж, вспомним как это было :)</description>
    </item>
    <item>
      <title>Плагин для Yii - YiiMultiBox</title>
      <link>https://tyvik.ru/posts/yii-multibox/</link>
      <pubDate>Sat, 11 May 2013 22:32:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/yii-multibox/</guid>
      <description>Понадобилось мне сделать для автошколы небольшой виджет для удобного назначения учеников инструктору. Захотел я это сделать более-менее красиво - с помощью drag&amp;amp;drop: список нераспределённых учеников и списки инструкторов, в которые можно бросить ученика, и он автоматически назначится инструктору. К сожалению, ничего готового для Yii я не нашёл, так что пришлось писать самому :) Немного поплутав по интернету, нашёл решение на js. Мне оно приглянулось своей лаконичностью и законченностью, правда, коробок там всего 2, но это легко исправить.</description>
    </item>
    <item>
      <title>Импорт данных из 1С (dbf) в MySQL</title>
      <link>https://tyvik.ru/posts/import-1c-dbf-mysql/</link>
      <pubDate>Sat, 27 Apr 2013 17:11:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/import-1c-dbf-mysql/</guid>
      <description>Давным давно писал статью на СвободноХабр про импорт данных из 1С файлов dbf в MySQL, решил перепостить её сюда, т.к., увы, ухожу с того ресурса.&#xA;Предыстория 🔗Работали себе люди долго-долго в самописной конфигурации 1С и бед не знали, как открылись у организации филиалы, и директор захотел все данные в одном месте. Сказано — сделано: через пару месяцев родился корпоративный сайт (написанный на php (Yii) + MySQL). Пользователи ринулись добавлять новую информацию, печатать отчёты… в общем, работа закипела.</description>
    </item>
    <item>
      <title>Отечественная БД HyTech</title>
      <link>https://tyvik.ru/posts/hytech-sonar-plus/</link>
      <pubDate>Mon, 22 Apr 2013 14:26:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/hytech-sonar-plus/</guid>
      <description>Большое спасибо Николаю за комментарий. Если читателя интересует официальная HyTech от СКАЗ-М, настоятельно рекомендую ознакомиться с ним. Моя же заметка о форке HyTech 1.6, который был сделан году этак в 1993, и после которого пути развития сильно разошлись.&#xA;Рождение форка 🔗Будучи студентом четвёртого курса довелось мне познакомиться с отечественной разработкой в области баз данных под названием HyTech. Использовалась она (да и по сей день используется) в фирме, где я тогда работал — НТЦ «Сонар-Плюс».</description>
    </item>
    <item>
      <title>Зачем нужен rebase, если есть merge?!</title>
      <link>https://tyvik.ru/posts/merge-vs-rebase/</link>
      <pubDate>Sat, 06 Apr 2013 17:41:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/merge-vs-rebase/</guid>
      <description>Давеча разгорелся спор на работе по поводу того как вести историю изменений. Поводом послужила вот такая картина: Из 19 коммитов 8 не несут никакой полезной информации! Почти половина «мусорных» коммитов! К слову разработчиков на этом проекте всего трое, а сложность истории заметно выросла. Меня она задела большим количеством мерджей, хотя объективных поводов для этого не было — вносились небольшие изменения в разные файлы. Я высказал своё «фи», но ответом было что это нормально, так принято в hg и вообще надо работать, а не холиварить.</description>
    </item>
    <item>
      <title>Зарисовка из жизни компьютера</title>
      <link>https://tyvik.ru/posts/computer-life/</link>
      <pubDate>Sat, 09 Mar 2013 20:04:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/computer-life/</guid>
      <description>Юра прошёл мимо стола, включив компьютер. Пока он наливал себе кофе, в его кремниевом друге наставал новый день. Если прислушаться, то можно было услышать как BIOS опрашивал устройства:&#xA;— Процессор? Вижу, Intel i3, так и запишем… Видеокарта? NVidia, хорошо… Жёсткий диск? А вас как всегда двое. Хорошо, все на месте, начинаем загрузку! У меня записано, что я должен передать все дела тебе, Seagate, руководи.&#xA;Seagate посмотрел на своих подчинённых и отдал все документы загрузочному разделу:</description>
    </item>
    <item>
      <title>Миграция с SVN на Mercurial</title>
      <link>https://tyvik.ru/posts/migration-from-svn-to-hg/</link>
      <pubDate>Sat, 09 Mar 2013 16:43:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/migration-from-svn-to-hg/</guid>
      <description>Сегодня хотелось бы поведать о переходе с svn на hg. Subversion использовался для коммерческих продуктов, которые не хотелось выкладывать на github. Поймите меня правильно — я сторонник open source, но клиенты настаивали именно на закрытости, и их понять можно. Проблем с svn особых не было отчасти потому что я работал один, отчасти потому что много от него не требовал — update, commit, log, checkout, — линейная элементарная история. Но, поработав с mercurial на работе, осознал все прелести DVCS.</description>
    </item>
    <item>
      <title>Свадьба программиста</title>
      <link>https://tyvik.ru/posts/wedding-programmer/</link>
      <pubDate>Sun, 17 Feb 2013 20:17:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/wedding-programmer/</guid>
      <description>Сезон свадеб скоро начнётся, и я хочу рассказать как устроить одну из них в программистском стиле 🙂 Небольшой дисклаймер — невесте нравятся компы, железяки и прочие атрибуты, а посему решили заморочиться вместе. Как театр начинается с вешалки, так каждая свадьба с приглашения.&#xA;Приглашения 🔗С моей стороны были исключительно программисты, и я решил каждому написать индивидуальное приглашение на том языке, с которым он работает. Набор получился такой: HTML, PHP, SQL, C++, Pascal и Brainfuck (ох как невеста жаловалась, когда вручную переписывала этот непонятный набор знаков) Кстати, сами тексты на github).</description>
    </item>
    <item>
      <title>Знакомимся с Ant</title>
      <link>https://tyvik.ru/posts/first-with-ant/</link>
      <pubDate>Sat, 12 Jan 2013 18:09:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/first-with-ant/</guid>
      <description>Понадобилось мне установить программку, которая вроде как и кросплатформенная, однако инсталлятор написан на дикой смеси bat&amp;rsquo;ников, xml и xsl преобразованиях с помощью msxsl.exe — кошмар для линуксоида. А так как это далеко не разовая операция, то было принято решение написать свой инсталлятор с кофе и муравьями 🙂 О проблемах и их решениях прошу под кат.&#xA;Задача вроде как сводится к написанию xml для ant, который будет копировать куда надо файлики, выполнять xsl-преобразования, в общем, повторять все действия, которые указаны в его предыдущей реинкарнации.</description>
    </item>
    <item>
      <title>Мой первый ПК: Истра-4816</title>
      <link>https://tyvik.ru/posts/istra-4816/</link>
      <pubDate>Mon, 07 Jan 2013 20:31:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/istra-4816/</guid>
      <description>Осенью 1990 года, когда мне было 4 года, у нас в семье появился первый персональный компьютер — Истра-4816. Стоил он как ВАЗ 2101. Этот монстр ревел как самолёт, пикал на каждое нажатие клавиш, но работал! В нём было целых 20Мб жёсткого диска, процессор i8080 и i8086 и 640 Кб оперативной памяти. На нём я познакомился с NC (вопрос старичкам: как расшифровывается? 🙂 ), играл в «Принца Персии» и «Kings bounty&amp;quot;, набирал тексты.</description>
    </item>
    <item>
      <title>Установка Oracle на RHEL 5 (VM) для проведения тестов</title>
      <link>https://tyvik.ru/posts/oracle-rhel-tests/</link>
      <pubDate>Sat, 05 Jan 2013 19:15:00 +0300</pubDate>
      <guid>https://tyvik.ru/posts/oracle-rhel-tests/</guid>
      <description>Добрый день, %username%! Передо мной возникла задача создания виртуальной машины для тестов продукта под Oracle. Тесты какие-никакие уже есть, но необходимо автоматизировать настройку среды и их прогон. Идея до безобразия простая — запускается машина, создаётся снапшот (дабы не портить базу), устанавливается продукт, запускаются тесты. Думаю, это стандартная схема, реализовывать же это планируется на VirtualBox + RHEL 5 + Oracle 11.2.&#xA;Настройка ВМ 🔗Как выяснилось опытным путём, Oracle при установке требует swap, причём минимум гиг.</description>
    </item>
    <item>
      <title>Hello world</title>
      <link>https://tyvik.ru/posts/hello-world/</link>
      <pubDate>Tue, 01 Jan 2013 10:11:33 +0300</pubDate>
      <guid>https://tyvik.ru/posts/hello-world/</guid>
      <description>Привет %username%! Поздравляю тебя с уже наступившим годом Python&amp;rsquo;а 🙂 Желаю, чтоб баги были мелкими, не размножались и отыскивались в 2 клика ;)&#xA;Так как это первая запись, то нужно, пожалуй, представиться. Я программист, пишу на всём, что под руку попадётся :) В большей или меньшей степени овладел кучей языков - от C++ и asmа до python и php. Работал (да и работаю) с Postgres, MySQL, Oracle, SQLite, HyTech (Будет время о последнем расскажу подробнее).</description>
    </item>
  </channel>
</rss>
