Обложка канала

Типа про IT. Страница 2

1563 @tipaproit

Типа про IT и вот это вот всё — full stack development и современные инструменты, подборки и рекомендации, интересные находки и практические советы. Профессиональный авторский контент.

  • Типа про IT

    💫 Понадобилось мне намедни для очередного персонального проекта разжиться каким-нибудь GPU-инстансом, чтобы там всякие прожорливые процессы поднимать, циферки считать да по API отдавать. Никогда прежде не интересовался именно GPU и для меня их стоимость стала некоторым откровением, в среднем это от $0.60 до $5 в час, получается $430 — $3600 в месяц, что слегка over budget, you know. А мне ещё и очередной K8s разворачивать… В общем я погуглил и заинтересовался Vultr, просто потому что цена заявлена “from $0.134/hour“, да и Кубер у них тоже есть. Это те самые ребята, которые вылазят в Гугле по запросу DigitalOcean, кстати :) Черти, даже интерфейс похож. Короче, регистрируюсь, пытаюсь взять себе самый базовый GPU (1/20 NVIDIA A100, 4 GB GPU RAM, 70 GB NVMe, мне хватит), а они мне такие — ты чел новый, мы тебя не знаем, заправь сначала аккаунт на 100 баксов хотя бы. Нихрена себе, думаю, но ладно. Заправил. Вторая попытка создать инстанс, а они мне такие — ты чел новый, мы тебя не знаем, создай сначала тикет (!) в техподдержку. Нихрена себе, думаю, но ладно. Создал, пообщались, меня попросили максимально подробно расписать usecase, во избежание дальнейших недоразумений. Мне не жалко, расписал. Где-то за полчаса мы всё порешали и с меня сняли все ограничения. Удивительный опыт, конечно, но я таки смог себе позволить неплохой GPU в личных целях. So far so good, поэтому я решил на вас немного заработать, порекомендовать вам сервис для ваших облачных проектов. Цены более чем демократичные, техподдержка оперативная и дружелюбная. Вот ссылка на referral program, по которой вы получите 100 баксов на свой счёт, а я получу с вас 35, если вы останетесь на Vultr и будете платить им уже со своего кармана.
    SSD VPS Servers, Cloud Servers and Cloud Hosting

    Vultr Global Cloud Hosting - Brilliantly Fast SSD VPS Cloud Servers. 100% KVM Virtualization

    Vultr
  • Типа про IT

    17-18 ноября в Лондоне состоится Modern Frontends Conference и у меня уже есть билет в кармане, поэтому ждите лонгрид с фоточками, как в старые-добрые. Программа пока не сформирована, зато среди спикеров заявлены Joel Hooks (Founder at egghead.io), Ben Lesh (RxJS Core Team Lead) и, самое главное, Sebastián Ramírez (Creator of FastAPI). По-перше, я уже лет 5 не был ни на каких конференциях (хотя в лучшие годы ходил на все возможные, от YaC до LvivPy). По-друге, это первая большая конференция в пост-пандемийном мире и, конечно, хочется размяться. По-третє это Рамирез, ради него и идём. Но есть и по-четверте. Закинув удочку с ссылкой на конференцию в корпоративный dev-канал на 960 человек, я получил подтверждение интереса к событию от 6 (шести) человек only. Из них двое точно не смогут приехать, потому что нет британской визы и они вряд ли успеют её получить. Остальные теперь цыганят билеты у своих линейных менеджеров. Уже сейчас Early Bird стоит 300 фунтов, с сентября будет 400, а с октября 500. Я бы, конечно, в любом случае купил билет, но 300 фунтов для меня и 300 фунтов для огромной продуктовой компании это немного разные деньги. Это я всё к чему? 1. Никогда не сталкивался с тем, чтобы работодатель был настолько равнодушен к конференциям подобного уровня. 2. Никогда не сталкивался с тем, чтобы разработчики компании были настолько равнодушны к конференциям подобного уровня. У нас фронтенда, как и фронтендеров, дохуища, а FastAPI — корпоративный стандарт для всех новых Python Services. 3. Это что такое? Это как вообще?
  • Типа про IT

    ​​🤖 Довелось давеча заняться фундаментальным рефакторингом всей кодовой базы моего пет-проджекта, потому что сделать всё хорошо изначально — это не наш метод. Фронтенд я в итоге переписал полностью, обычное дело, а на бэкенде встал вопрос хоть какой-нибудь стандартизации, чтобы двигаться с новыми фичами дальше и не потерять контроль над ситуацией. Рефакторить так рефакторить, правильно? И как раз в это время ко мне постучался коллега, который подкинул ссылочку на их новый REST API Standard, который вобрал в себя лучшее и при этом не раздулся до размеров JSON:API, который я, прямо скажем, недолюбливаю. Это было вовремя. Я не поленился, прочитал всю спеку, проникся, и в итоге забрал себе часть контракта по работе с коллекциями, в частности cursor-based pagination. Потом перечитал URL Structure и задумался. А нахуя мы вообще соблюдаем REST? Зачем тянуть в новые стандарты старое соглашение, снова и снова? GET пусть остаётся для /health и для статики, абсолютно всё решается POST-запросами, в тело которых можно аккуратно уложить любую параметризацию, а не вот это вот. Действие (action, verb) спокойно выносится в URL, пусть он сам за себя говорит. В моём случае достаточно соблюдать наименование вида /[версия]/[сущность]/[действие]/[признак], например: /v1/damage/get/shallow — получить все т.н. “верхние маркеры”, опционально принимает набор фильтров и объект пагинации /v1/damage/create — очевидно /v1/airalarm/get/all — все объекты другой сущности /v1/auth — просто действие И так далее. POST only. Works like a charm. А вы что думаете об этом? In REST we trust или rest in peace?
  • Реклама

  • Типа про IT

    ​​🤖 MinIO — это S3 compatible object storage, который совместим с оригинальным на уровне API. Чаще всего MinIO используют тогда, когда хочется по-честному потестировать взаимодействие с бакетами в системных тестах не мокая всё подряд. А ещё это может быть локальная зависимость для экспериментов с Hive Metastore, например, но об этом в другой раз. Самое замечательное в MinIO, что его очень легко поднять. Вот вам готовый рецепт для Docker Compose:
    minio:
      image: minio/minio
        container_name: minio
        environment:
          - MINIO_ROOT_USER=admin
          - MINIO_ROOT_PASSWORD=password
        ports:
          - 9001:9001
          - 9000:9000
        command: ["server", "/data", "--console-address", ":9001"]
        volumes:
          - minio_data:/data
    mc:
      depends_on:
        - minio
      image: minio/mc
      container_name: mc
      volumes:
        - type: bind
          source: ./minio/entrypoint.sh
          target: /usr/bin/entrypoint.sh
          read_only: true
      environment:
        - AWS_ACCESS_KEY_ID=admin
        - AWS_SECRET_ACCESS_KEY=password
        - AWS_REGION=us-east-1
      entrypoint: ["sh", "-c", "/usr/bin/entrypoint.sh"]
    volumes:
      minio_data:
    
    В entrypoint.sh своя пара строк:
    #!/bin/sh
    
    until (/usr/bin/mc config host add minio http://minio:9000 admin password) do echo '...waiting...' && sleep 1; done;
    /usr/bin/mc rm -r --force minio/warehouse;
    /usr/bin/mc mb minio/warehouse;
    /usr/bin/mc policy set public minio/warehouse;
    exit 0;
    
    MinIO Client, если что, это вспомогательный инструмент для более лаконичных операций с хранилищами и объектами, never mind. Теперь у вас по localhost:9001 откроется симпатичный dashboard с вашим личным S3. Что с этим всем делать — вам решать :)
  • Типа про IT

    📖 Многих кандидатов ломают некоторые, казалось бы, очевидные вопросы про потоки и процессы: в чём разница, как приготовить, какие есть примитивы синхронизации и зачем? При чём правильные ответы про GIL знают абсолютно все, поэтому я уже давно о нём ничего не спрашиваю. А вот написать потокобезопасный метод здесь и сейчас под силу не каждому, несмотря на сеньорство и прочие лычки. Короче говоря, в особо тяжёлых ситуациях я даю кандидатам ссылку на https://superfastpython.com/learning-paths/ (и сам туда захаживаю), где собрано всё про concurrency в Python, с теорией и примерами, всеобъемлюще и добротно.
    Python Concurrency Learning Paths

    Python Concurrency Learning Paths Python concurrency is a big topic and can be challenging for beginners. This page provides you with step-by-step learning paths that you can use to get started and…

    Super Fast Python
  • Типа про IT

    📦 Apache Parquet — это высокоэффективный бинарный column-oriented формат, который помимо самих данных содержит заодно и метаданные к ним, c типами и структурой. Считайте, что это как CSV, только сильно быстрее, занимает сильно меньше места у вас в облаке и, следовательно, дешевле в эксплуатации (иногда на порядки). Про “паркет” хорошо знают все, кто работает с big data или ML, потому что там, на дне data-озёр, жирным слоем накапливаются мегатонны parquet-файлов, в которых большие компании хранят большие массивы данных. Но мне кажется, что Parquet может быть полезен и в проектах поменьше, без сотен терабайт данных в S3. Где-то можно сэкономить на табличном процессинге используя Pandas (у которого, к слову, первоклассная поддержка формата), где-то можно разгрузить основную базу, ну или просто поближе познакомиться с технологией, которая лежит в основе всей современной data-движухи. Если очень интересно и есть лишние 40 минут, посмотрите клёвый доклад от WeWork по теме.

    The Apache Parquet Website

    Apache Parquet
  • Типа про IT

    👨‍⚖️ По долгу службы мне приходится регулярно проводить технические собеседования. И вот что характерно. Во-первых, судя по всему, закончилась волна массового оттока специалистов из Яндекса и Мэйлру, потому что в какой-то момент у меня было с ними по три-четыре собеседования в неделю и я узнал про эти две компании больше, чем хотел. Теперь, в основном, заходят поляки, испанцы и португальцы. Во-вторых, все те сеньоры из Яндекса, Мэйлру и Сбера — это люди с удивительной профдеформацией. Они хорошо знают что и как устроено внутри их компании, но совсем не в теме общемирового тренда на технологии. Ни у кого не было никакого опыта с K8s, Helm, AWS/GCP, например. Применительно к Python — nothing to say about FastAPI, pydantic или poetry. То есть пристреливаешься базвордами и всё в “молоко”. Зато отлично знают алгоритмы! Вот только мы их не спрашиваем. Потому все те, кто выдрочил LeetCode не проходят даже live coding, сливаясь на элементарном практическом задании. Сидят, короче, в своём болоте годами и за все эти годы теряют собственную актуальность и волю к движению. IT — это мир Алисы. “Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее”. Следите за рынком, иначе пиздец и точка.
  • Типа про IT

    ⚒️ Обычная ситуация, когда для локального прогона системных тестов поднимается связка из баз данных и прочих сервисов средствами docker compose. Перед запуском нужно “апнуть” контейнеры, дождаться их живого состояния и только потом запустить сами тесты, для чего есть bash-скрипт или makefile (или оба сразу) с каким-нибудь с потолка взятым sleep между вызовами, чтоб уж наверняка. Я не знаю как принято решать эту проблему в прогрессивном обществе, но и sleep в минуту это как-то слишком. Поэтому мы тут у себя в команде используем простой, но эффективный wait-for-it. Выглядит примерно так:
     1. docker-compose up хуё-моё
     2. poetry run wait-for-it \
        --parallel \
        --timeout 240 \
        --service postgres:5432 \
        --service exasol:8563 \
        -- echo "postgres and exasol are up and running"
     3. poetry run pytest -s systests
    
    Скрипт, разумеется, блокирующий, в этом весь смысл.
  • Типа про IT

    🛠️ Bloomberg разродился новым, шикарным профилировщиком для Python-приложений. Цитирую: Memray is a memory profiler for Python. It can track memory allocations in Python code, in native extension modules, and in the Python interpreter itself. It can generate several different types of reports to help you analyze the captured memory usage data. While commonly used as a CLI tool, it can also be used as a library to perform more fine-grained profiling tasks. 🕵️‍♀️ Traces every function call so it can accurately represent the call stack, unlike sampling profilers. ℭ Also handles native calls in C/C++ libraries so the entire call stack is present in the results. 🏎 Blazing fast! Profiling causes minimal slowdown in the application. Tracking native code is somewhat slower, but this can be enabled or disabled on demand. 📈 It can generate various reports about the collected memory usage data, like flame graphs. 🧵 Works with Python threads. 👽🧵 Works with native-threads (e.g. C++ threads in native extensions) Выбирайте анализатор: flame, summary, table, tree, stats или live? Будет что выводить на внешний монитор вместо скучного htop! Но есть нюанс — Linux only, поэтому всем нам, плотно сидящим на OS X ничего не светит. Это печально.
  • Типа про IT

    ​​💎 Бесконечно можно смотреть на три вещи: как горит огонь, как течет вода и как команда пытается выработать правильную архитектуру приложения. Я за все эти годы в IT уже насмотрелся на горы сломанных копий, это не моя война. MVC? Onion? DDD? FP? Просто херачим как придётся? Да, ок. Но всегда было интересно как выглядит красивое Real World Python App ©, вот чтобы scalable, maintainable, testable и чтобы дизайн приложения сам направлял тебя в нужную сторону. Я так и не видел хороших примеров. До весны этого года. Пришёл к нам в команду новый software engineer, поляк, который полностью взял на себя разработку PoC нового ML-приложения и за неделю запилил нам прототип. И не просто прототип, а “это просто охуенно” прототип. В итоге мы все сошлись на том, что теперь пишем все новые приложения именно так, несмотря на мою (и не только) непереносимость ООП. Классы эти повсюду, буэ. В основе решения — Ports & Adapters Architecture (aka Hexagonal Architecture): 📍Ports & Adapters Architecture 📍A Color Coded Guide to Ports and Adapters 📍Ports-And-Adapters / Hexagonal Architecture 📍The Clean Architecture (Ian Cooper) 📍More Testable Code with the Hexagonal Architecture В качестве DI — Injector, у которого для старта откровенно слабая документация и мало примеров, но если потратить вечер и разобраться, то всё действительно просто. Плюс The Twelve Factor, не забываем. Вот и весь секрет. Нет, на самом деле не весь, но три кита так точно.
  • Типа про IT

    Решил тут на днях обновиться до свежего React 18, потому что в мире клиентской логики за такими вещами лучше следить, иначе окажешься в ситуации, когда переписывать надо вообще всё. Хотя, в любом случае окажешься, но не так быстро. В новом релизе они решили поменять способ установки корневого контейнера (или как это по-рюсски?)
    // Было
    import { render } from ‘react-dom’;
    import App from './App'
    const container = document.getElementById('root')
    ReactDOM.render(
      <React.StrictMode><App /></React.StrictMode>,
      contaner,
    )
    
    // Стало
    import { createRoot } from 'react-dom/client';
    import App from './App'
    const container = document.getElementById('root')
    const root = createRoot(container!)
    root.render(<React.StrictMode><App /></React.StrictMode)
    
    Во время рефакторинга я обновил “в том числе и это”, а потом целый час дебажил почему все actions во всём проекте стали вызываться по два раза. А потому что upgrade notes надо читать внимательнее: In React 18, StrictMode gets an additional behavior to ensure it’s compatible with reusable state. When Strict Mode is enabled, React intentionally double-invokes effects (mount -> unmount -> mount) for newly mounted components. А в компонентах что? useEffect, а в useEffect дёргается dispatch и API. Такое поведение наблюдается только в development mode и только с использованием StrictMode. Они называют это фичей, которая помогает отлавливать баги и форсит использование pure functions. Я же в гробу видал такое поведение, поэтому убираем StrictMode из корня и живём нормальной жизнью root.render(<App />) Заебали всё ломать.
  • Типа про IT

    🗺 Ядро проекта Громада — интерактивная карта Украины. За последний месяц я узнал об экосистеме OpenStreetMap чуть больше, чем мне хотелось бы. Кажется, что существует какой-то заговор, чтобы при формальной бесплатности и открытости OSM-данных self-hosting оставался уделом больших корпораций с большими мощностями, а все остальные могут пойти нахуй, то есть могут ежемесячно заносить деньги Mapbox или какому-нибудь Google за использование картографических API. По факту, мне не нужна карта всего мира, к тому же постоянно скачивать 115 гиг данных и рендерить их целую неделю в надежде, что в процессе ничего не упадёт с segfault я себе позволить не могу. К счастью, Geofabrik, дай бох им здоровья, предлагает data extract по регионам и Украина весит всего 666 мегабайт. С тем только нюансом, что extract строго ограничен bounding box’ом региона, то есть я не получу даже контуры других стран, не говоря уже про всякие прочие реки-океаны. Для дополнительных полигонов, чтобы вокруг Украины не было сплошного серого пятна, существует другой источник данных — Natural Earth. Оттуда скачиваются недостающие shape-файлы, которые участвуют в дальнейшем тяжеловесном процессинге. Чтобы сырые данные превратились в красивую векторную карту, необходимо: 1. Сконвертировать shp-файлы в geojson-файлы с помощью инструмента ogr2ogr 2. Сконвертировать geojson-файлы в формат mbtiles через tippecanoe 3. Отрендерить основные osm.pbf данные в mbtiles с помощью tilemaker 4. Смёржить два mbtiles через tippecanoe Возможен вариант подключения shp-файлов непосредственно в tilemaker, но для этого придётся изучить и модифицировать его конфиг на Lua, который занимается процессингом точек и полигонов. Из коробки, разумеется, ничего не работает, часть данных не отображается, требуется поправка на уровни масштабирования и прочее. Вся процедура занимает минут 20 и частично автоматизирована. На выходе ожидаем примерно гигабайтный файл ukraine.mbtiles, который теперь нужно как-то отобразить в браузере. Для этого готовим тайловый сервер, он будет резать всё на тайлы в реальном времени и порционно выдавать клиенту для рендеринга. После недолгих экспериментов я остановился на mbtileserver, потому что zero configuration и простое горизонтальное масштабирование. Ну а чтобы отобразить тайлы в браузере с привычным look-and-feel, используем MapLibre, форк уже коммерческой Mapbox GL. Для работы ему нужна тема, которая описывает движку как именно отображать эти самые тайлы (шрифты, толщина линий, цвета и многое другое). В своём проекте я использую симпатичную, на мой вкус, OSM Bright. Интересный факт, конфигурация темы не включает в себя нумерацию зданий, которую, как мне кажется, все хотят по-умолчанию. Также интересный факт, что иногда не понятно где зарыта собака — в процессинге или в рендеринге? Поэтому для анализа mbtiles приходится расчехлять полновесную QGIS. Ну и на react-map-gl мы заканчиваем нашу цепочку преобразований сырых OSM-данных в красивые перелёты по карте в браузере.
    Громада — це ти

    Якісно нова платформа, що дає можливість кожному українцю шукати та пропонувати цільову допомогу для себе, або своїх рідних у простий та зручний спосіб.

    hromada.me
  • Типа про IT

    Никогда в жизни не занимался бы ничем подобным, если бы лицензия на свежие mbtiles не стоила 1800 долларов в год. Покажется дикостью, но это всё равно дешевле, чем MapTiler Cloud, MapBox Tile API или Google Maps. Точнее, существует фиксированная цена вместо динамического подсчёта per 1000 tiles. Просто открыть карту это уже около 10 тайлов, если что. Как и с любым open-source, короче. Хочешь трахаться? На здоровье. Не хочешь? Вот тебе коммерческая поддержка и решения вокруг открытых данных и продуктов. Но если хоть немного разобраться, а полная карта мира не нужна, можно настроить собственный pipeline и сэкономить кучу денег. Ну а для полной карты можно арендовать хороший CPU-инстанс и посчитать всё там, дня за 2-3 он должен справиться. Карты — это долго, дорого и довольно сложно. В целом, не удивительно, что платные решения платные. Но не настолько же.
  • Типа про IT

    🥳 На Громаде первое большое обновление — интеграция с Прихистком. Хороший результат, осталось только доработать поисковую механику дополнительными фильтрами. Но у Громады есть свой канал с новостями, я к вам не с этим, я к вам с наболевшим. Просто удивительно, на какую фигню может уходить куча ценного времени, которого и так мало. И вместо непосредственно разработки занимаешься то траблшутингом, то дебагингом, на самом ровном, казалось бы месте. Впрочем, а когда было не так? Тот же Helm для чего придумали? Чтобы ты такой helm install bla/blabla и у тебя через пару минут на кластере завёлся blabla, automagically. На деле же, у меня не возникло проблем только с bitnami/postgresql и спасибо им за это. Вот например. В качестве геокодинг-движка активно используется Nominatim, о котором я упоминал в прошлом посте. Сам по себе продукт тоже вызывает у меня вопросы, но ничего более зрелого я не нашёл, поэтому маємо шо маємо. У Nominatim довольно лаконичный API, из которого я использую только /reverse и /lookup. Их полнотекстовый /search абсолютно непригоден для адресного автокомплита (они где-то писали, что так и надо), поэтому для полей ввода адреса, которые вы видите на сайте, у меня собственный набор materialized views с индексами под капотом с дальнейшим реверсом через Nominatim. Для обработки данных с Прихистка мне потребовалось использовать в том числе и /search, потому что люди на Прихистке вбивают свою локацию в произвольной форме, точно известен только регион, а мне нужен как бы longitude и latitude, чтобы отобразить маркер. И когда настало время выкатываться, стало понятно, что с Nominatim в кластере что-то не так. Приложение, которое делает reverse geocoding через /search падает. Кубер его пытается переподнять, оно снова падает, ну вы поняли. Смотрю логи контейнера, а там от Nominatim прилетает какой-то непонятный html, потому и падает (оно и должно падать в таком случае). Но почему? Локально работает, остальные endpoint’ы работают, pod явно видит Nominatim… короче странно это всё. Запрос к API на /search , как я понял, зачем-то редиректился на UI, отчего два вопроса — почему у них такой конфиг Apache и зачем мне на сервере какой-то UI? Оказалось, что в Helm chart’е UI включен по-дефолту. Выключаем. Падает весь Nominatim. Включаем обратно 🙂 Форкаю chart, разбираюсь. Вырезаю весь намёк на UI, чищу немного остальные ямлы, раскатываю уже свою версию. Работает, но не /search. При чём не работает он как-то по-тихому. Смотрю логи Nominatim, а ему нужен какой-то tokenizer.php, но по нужному пути его нет. Гугление ничем не помогло… но почему всё работает локально? Потому что локально в одном контейнере поднимаются и Postgres, и сервис, а в Dockerfile есть такой интересный трюк, который нельзя применить в случае, когда у тебя база и приложение разнесены. Да, chart сломан. Простое решение — берём локально tokenizer и доставляем его через ConfigMap по адресу. Ура, всё работает! Вот и ночь прошла. Короче говоря, K8s — это весело.
  • Типа про IT

    ​​🚨 Где-то на третий день войны, когда в полной мере пришло осознание ужаса происходящего, я всерьёз озадачился желанием сделать хоть что-нибудь, чтобы помочь своей стране в сложившейся ситуации. Моя информационная поддержка, учитывая размер моей аудитории, находится где-то на уровне “всё это абсолютно бесполезно”, а моя финансовая поддержка ВСУ — капля в океане военных расходов. Что с этим всем делать — непонятно. Понятно только, что людям требуется реальная помощь на местах, а из-за того, что вся коммуникация происходит в Telegram, Viber и прочих Фейсбуках, запросы моментально теряются в потоке быстро убегающих лент. Короче говоря, я разработал собственный сервис, призванный решить эту проблему и получивший название Громада. Hromada.me — это интерактивная карта Украины, на которую любой желающий может наносить информационные маркеры с запросом о помощи или предложением помочь, без регистрации и СМС. Кажется, у меня получилось создать простой, но достаточно функциональный MVP, которым можно пользоваться уже сегодня. Пришлось собрать в кучу вообще весь свой опыт и быстро добрать новый. Из интересного: - Карты полностью self-hosted, на базе OpenStreetMap и MapLibre. Геокодинг на базе Nominatim и PostGIS. Это даёт мне полную свободу в том, как карта выглядит, какие данные использует и как с этим всем работать. - Kubernetes-кластер, вопреки традициям и здравому смыслу, я поднял на DigitalOcean. Разумеется, нет никакой разницы где у тебя Кубер, кроме цены. Статика там же, в Spaces. Прошёл заодно CKAD-сертификацию, потому что хрен бы я это всё правильно развернул. Ну и Helm, конечно. - На фронтенде всё довольно стандартно: React, TypeScript, styled-components и так далее. Кода прилично, есть куда рефакторить. Обо всём этом мне есть что рассказать и я, конечно, расскажу. Но сейчас, пользуясь возможностью, хочу попросить вас распространить ссылку на hromada.me среди своих знакомых в Украине, чтобы всем этим начали пользоваться и чтобы я смог получить первый живой фидбек. Все буде Україна 🇺🇦
  • Реклама

  • Типа про IT

    Мы сделали очень простую страницу на английском языке для тех, кто хочет помочь Украинской Армии в войне с Россией. Принимаем платежи с карты любого банка мира. Пожалуйста, очень-очень вас прошу максимальный репост. Передайте ссылку всем вашим друзьям иностранцам. Но и сами можете платить, она работает и для Украинцев. Огромное количество запросов на помощь из-за рубежа. Нам так сильно нужна ваша поддержка, дорогие Друзья! Слава Украине! Ссылка: https://uahelp.monobank.ua/
  • Типа про IT

    🚨Наш день сегодня начался в 6 утра с тревожных звонков и сообщений — Путин пошёл с войной на Украину. В Украине у нас живут родители, родственники, множество друзей и знакомых, которые давно готовы к такому повороту событий, но все мы в глубине души надеялись, что до полномасштабного вторжения дело не дойдёт. Теперь же часть украинцев стоит в пробках по дороге в Польшу, спасая свои семьи от обстрелов, а другая стоит в очереди за оружием, чтобы защищать свои дома и землю. Владимир Зеленский, президент Украины, выступил с обращением к россиянам и, как мне кажется, донёс правильную и честную позицию всего украинского народа. По Первому каналу это, естественно, не покажут, поэтому прошу вас уделить 9 минут времени на просмотр. Ни к чему больше никого не призываю. Украинцам же хочу напомнить, что Путин это не вся Россия и мало кто из россиян действительно хочет этой войны. Держитесь и берегите себя 🇺🇦
  • Типа про IT

    🤖 Коллега подкинул задачку, которую я хрен бы когда решил самостоятельно, такое тыком не решается. Дан массив неважно каких данных фиксированного размера: ['1', '2', '3', 'a', 'b', 'c', 'd', 'e'] И дано некое число K. Нужно реализовать функцию rotate_left, которая смещает элементы списка на K элементов влево: ['a', 'b', 'c', 'd', 'e', '1', '2', '3'] Можем заодно и rotate_right запилить, чтобы двигать таким же образом вправо: ['c', 'd', 'e', '1', '2', '3', 'a', 'b'] И если вам кажется, что всё очень просто, алгоритм должен отработать за O(n) по времени и O(1) по памяти. #алкоритмы