Как стать автором
Обновить
706.96

Программирование *

Искусство создания компьютерных программ

Сначала показывать
Порог рейтинга
Уровень сложности

Дешево и сердито: геймдев на Godot 4.2 для тех, кто знает Python

Уровень сложности Средний
Время на прочтение 9 мин
Количество просмотров 1.8K

Привет, Хабр! Меня зовут Матвей, я уже несколько лет хочу научиться создавать игры. Скажу честно: все никак не хватало времени и, возможно, целеустремленности, чтобы изучить Unreal Engine, Cry Engine и им подобные движки.

Но я знаю Python. Оказывается, для любителей парселтанга есть относительно простой способ вкатиться в геймдев — игровой движок Godot. Я его изучил и даже создал небольшую игру. В этой статье хочу рассказать об этом решении подробнее.
Читать дальше →
Всего голосов 18: ↑14 и ↓4 +10
Комментарии 1

Новости

Паттерны Singleton и Multiton в Java: когда и какой лучше?

Уровень сложности Простой
Время на прочтение 6 мин
Количество просмотров 1.8K

Привет, Хабр!

Паттерн Singleton гарантирует существование лишь одного экземпляра класса и предоставляет к нему глобальную точку доступа. Этот паттерн стал почти синонимом чистоты кода в многих сценариях работы с Java, где требуется строго один экземпляр объекта. Но не менее интересный и гибкий паттерн - это Multiton. Менее известный, но не менее мощный, он позволяет создавать множество экземпляров класса и контролировать их число и жизненный цикл через предопределенные ключи.

В этой статье мы рассмотрим эти паттерны и их различия.

Читать далее
Всего голосов 6: ↑4 и ↓2 +2
Комментарии 1

Выпущена версия Jmix 2.2

Уровень сложности Средний
Время на прочтение 9 мин
Количество просмотров 549

Данная статья описывает важные обновления, представленные в только что вышедшем релизе платформы Jmix 2.2.

Читать далее
Всего голосов 5: ↑5 и ↓0 +5
Комментарии 0

Разработка под Android в 2024 году

Время на прочтение 15 мин
Количество просмотров 1.9K

Эта статья отражает моё личное мнение и профессиональные взгляды, учитывающие различные точки зрения в сообществе Android-разработчиков. Кроме того, я регулярно просматриваю руководства от Google для Android.

Важно подчеркнуть: некоторые хорошие инструменты, паттерны и архитектуры я не упомянул в статье в явном виде, но это не отменяет их потенциал в качестве ценных альтернатив для разработки Android-приложений.

Читать далее
Всего голосов 10: ↑10 и ↓0 +10
Комментарии 5

Истории

Когда пишешь приложения для себя

Уровень сложности Простой
Время на прочтение 12 мин
Количество просмотров 13K

require 'glimmer-dsl-libui'
include Glimmer
window('hello world').show

Почти каждый из читателей Хабра настраивает домашнюю сеть, пишет скрипты для автоматизации умного дома, админит домашний сервер и т. д. Всё это практически «семейные обязанности» разработчика, как вынести мусор для семейного мужчины.

А как насчёт написать для своей семьи мобильное приложение? Это уже новый уровень.
Читать дальше →
Всего голосов 54: ↑52.5 и ↓1.5 +51
Комментарии 0

Как облегчить жизнь программисту при написании тестов

Время на прочтение 6 мин
Количество просмотров 3.9K

Наверняка, многие из вас работали или хотя бы слышали о том, что есть разработчики, которые работают над проектом в одиночку. Ну как в одиночку… Есть скрам, аналитик, продакт, еще кто-то вплоть до директора, а вот программист один, даже тестировщика нет. В этом случае оптимальным видом тестирования, на мой взгляд, является интеграционное тестирование с  использованием тест-контейнеров.

Привет, Хабр! Меня зовут Николай Пискунов — ведущий разработчик в подразделении Big Data. И сегодня в блоге beeline cloud поговорим о Spring boot и интеграционном тестировании. Расскажу, как упростить жизнь при написании тестов.

Читать далее
Всего голосов 13: ↑11 и ↓2 +9
Комментарии 2

Блеск и нищета паттерна «Спецификация» в С#. Оцениваем планы запросов

Уровень сложности Сложный
Время на прочтение 20 мин
Количество просмотров 5.8K

О паттерне «Спецификация», который позволяет улучшить структуру приложения, и, следовательно, увеличить гибкость, уменьшив при этом объем кода, а значит — сократить количество ошибок, но это не точно. Почему? - читаем ниже. 

Читать далее
Всего голосов 27: ↑26 и ↓1 +25
Комментарии 38

Отзыв на IJunior. Почему не стоит покупать курс IJunior. Spoiler: черепаший спринт в Gamedev. В конце mini-roadmap

Уровень сложности Простой
Время на прочтение 17 мин
Количество просмотров 3.1K

Жизненно необходимая информация для тех, кто хочет быстро найти работу в IT и особенно в геймдеве. Прочитайте мой отзыв и сэкономьте себе деньги, время и нервы.

Если вы вообще ничего не знаете в языках программирования, ни в коем случае не покупайте ни курс, ни отдельные модули!

IJunior не поможет вам быстро найти работу
много лишней инфы
плох с педагогической стороны
не оптимизирован
нет инфы об основах
абсолютным нулям в программировании не подходит вообще

В самом конце я подготовил mini-roadmap, который я сам лично прошёл и более чем удовлетворён своими знаниями и опытом.

А при чём здесь шахта?..
Всего голосов 11: ↑7 и ↓4 +3
Комментарии 30

Изучаем WebRTC на практике: Лучшие инструменты и демо

Уровень сложности Простой
Время на прочтение 9 мин
Количество просмотров 3.4K

В этой статье(или дайджесте) я поделюсь ключевыми инструментами, демонстрационными приложениями и открытыми проектами, незаменимыми для практического понимания WebRTC. Здесь не будет туториалов или подробных объяснений о той или иной части WebRTC, а скорее некий дайджест ресурсов, которые помогут лучше разобраться в теме. Если вы работаете с этой технологией уже какое-то время, вряд ли вы найдете что-то новое для себя.

Читать далее
Всего голосов 9: ↑9 и ↓0 +9
Комментарии 8

Как потерять управление оболочкой… Расследование

Уровень сложности Средний
Время на прочтение 9 мин
Количество просмотров 2.6K

image


Несколько недель назад я занимался хаком языковых серверов в Zed, пытаясь заставить Zed определять, когда заданный бинарник языкового сервера, например gopls, уже присутствует в $PATH. Если так, вместо загрузки нового бинарника Zed должен использовать его.


Трудность: часто $PATH динамически изменяется такими инструментами, как direnv, asdf, mise и другими, которые позволяют в данной папке установить определённый $PATH. Почему эти инструменты так делают? Потому что это даёт возможность, скажем, в начале $PATH добавить ./my_custom_binaries, пока вы находитесь в my-cool-project. Поэтому нельзя просто использовать $PATH, связанный с процессом Zed, нужен $PATH, как он есть, когда выполняется cd в каталог проекта.


Легко, подумал я. Просто запусти $SHELL, выполни cd в проект, чтобы запустить direnv и всё такое, запусти env, сохрани окружение, выбери $PATH, найди в нём бинарники. И это было легко. Вот часть кода, та часть, которая запускает $SHELL, cd и получает env:


fn load_shell_environment(dir: &Path) -> Result<HashMap<String, String>> {
    // Получает $SHELL
    let shell = std::env::var("SHELL")?;

    // Конструирует команду, которую хочется выполнить в $SHELL
    let command = format!("cd {:?}; /usr/bin/env -0;", dir);

    // Запускает $SHELL как интерактивную оболочку (чтобы использовались файлы пользователя rc).
    // и выполняет `command`:
    let output = std::process::Command::new(&shell)
        .args(["-i", "-c", &command])
        .output()?;

    // [... проверка кода выхода, получение stdout, превращение stdout в HashMap и т. д. ...]
}

За исключением одного: после запуска экземпляра Zed в терминале, который выполнял эту функцию, я больше не мог убить Zed, нажав Ctrl-C.

Что?
Всего голосов 15: ↑13 и ↓2 +11
Комментарии 8

И вновь KolibriOS! И вновь ассемблер!.

Уровень сложности Простой
Время на прочтение 7 мин
Количество просмотров 4.3K

В прошлой статье, я решил потестировать ассемблер на данной ОС. Но я ни когда не ищу лёгких путей и потому решил окунуться в мир KolibriOS и программировать используя только данную ОС. Всё что я смог выяснить, это то что давно когда-то что-то делали и на данный момент, увы, многое забросили...

Но далеко не всё так плохо как кажется! В KolibriOS есть готовый редактор кода с подсветкой CEdit, и он поддерживает подсветку для нескольких языков программирования. Но я не уверен что он умеет компилировать под все эти языки. Но как минимум текст набрать можно. Fasm поддерживается полностью и собирать/запускать/отлаживать приложения можно "используя" данный редактор (не совсем, редактор запускает отдельно компилятор и так же запускает отдельно отладчик), что и позволяет полноценно разрабатывать программы.

Я бы хотел сразу предупредить, практически ни какого обучения в статье не будет. Всё рассчитано на то, что вы уже хотя бы немного знаете ассемблер x86 и уже создавали простые программы под данную архитектуру (под Windows, Dos, Linux, а так может и MacOS).

Читать далее
Всего голосов 22: ↑22 и ↓0 +22
Комментарии 7

Систему модулей в Java для новичков

Уровень сложности Простой
Время на прочтение 7 мин
Количество просмотров 5.7K

Привет, Хабр!

Система модулей в Java 9, известная как Project Jigsaw, была задумана и реализована для решения ряда проблем, включая «Ад JAR‑файлов» и сложностей с обеспечением сильной инкапсуляции.

И вот с Java 9 можно явно контролировать, какие части их модулей доступны внешнему миру, а какие скрыты и защищены от несанкционированного доступа.

Модульность вносит ясность и порядок в то, как приложения связываются с библиотеками и друг с другом. Благодаря системе модулей, зависимости становятся явными и управляемыми.

Рассмотрим, как выглядит работы с системой модулей в Java.

Читать далее
Всего голосов 12: ↑10 и ↓2 +8
Комментарии 3

Охота на недостающий тип данных

Уровень сложности Средний
Время на прочтение 11 мин
Количество просмотров 10K
Направленный граф — это набор узлов, связанных стрелками (рёбрами). Как узлы, так и рёбра могут содержать данные. Вот несколько примеров:

Все графы созданы с помощью graphviz (источник)

В сфере разработки ПО графы используются повсеместно:

  1. Зависимости пакетов, как и импорт модулей, формируют направленные графы.
  2. Интернет — это граф, состоящий из ссылок между веб-страницами.
  3. При проверке моделей анализ выполняется путём изучения «пространства состояний» всех возможных конфигураций. Узлы — это состояния, а рёбра — это допустимые переходы между ними.
  4. Реляционные базы данных — это графы, в которых узлы являются записями, а рёбра — внешними ключами.
  5. Графы — это обобщение связанных списков, двоичных деревьев и хэш-таблиц.1

Кроме того, графы также широко используются в бизнес-логике. Научные работы со ссылками формируют графы цитат. Транспортные сети представляют графы маршрутов. Социальные сети — это графы связей. Если вы работаете в сфере разработки, то рано или поздно встретитесь с графами.

Я вижу графы повсюду и использую их для анализа всевозможных систем. В то же время я побаиваюсь использовать их в коде. Какой из популярных языков программирования ни возьми, поддержка графов в них практически отсутствует. Ни в одном её нет в виде встроенного типа, очень мало где они прописаны в стандартной библиотеке, и у многих языков нет для этой функциональности надёжного стороннего пакета. Чаще всего мне приходится создавать графы с нуля. Существует большой разрыв между тем, как часто инженерам ПО могут понадобиться графы и тем, в какой степени экосистема их поддерживает. Где все графовые типы?
Читать дальше →
Всего голосов 62: ↑60 и ↓2 +58
Комментарии 20

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн

Async/await, There is no thread – легко обмануть тех, кто сам обманываться рад

Уровень сложности Средний
Время на прочтение 3 мин
Количество просмотров 10K

Когда нам показывают на некотором примере, что асинхронная операция не создает потока, нам пытаются внушить, что асинхронная операция НИКОГДА не создает потока и в принципе не может его создать, но это не правда! Простой пример с работающим кодом доказывает обратное. Давайте разберем этот пример.

Логика тех, кто поддается такому внушению мне вполне понятна, они хотят упростить себе жизнь, сократить объем теории, с которой надо разбираться.

Интересно было бы понять логику тех, кто поддерживает такое внушение, выдавая обрезанную теорию за полноценную, вполне осознавая, что все не так просто, как хотелось бы.

Читать далее
Всего голосов 14: ↑9 и ↓5 +4
Комментарии 38

Безопасная параллельная разработка. Istio

Уровень сложности Средний
Время на прочтение 6 мин
Количество просмотров 3.3K

Как-то в конторе появилась мысль, что надо бы продумать как нам распараллелить работу над одни микриком, так чтобы команды не пересекались друг с другом. Есть некоторые API над которыми работают несколько команд. Каждая работает над своей фичей локально и пишет тесты, а вот при деплое на стэнд получается столпотворение потому, что нужно изменения слить в одну ветку аля develop и её закинуть на тест. При этом могут быть конфликты при мерже кода или измениться проперти, которые не совместимы между разными ветка.

Мобильный банк сейчас обслуживает 450+ микриков. Над которыми работают более 90 команд. Так как у нас в проекте нет code ownership, то каждая команда вносит изменения в нужные им микрики. Чтобы избежать различного рода сложностей, которые приводят к увеличению времени time to market, нужно было развести разработку отдельных команд так, чтобы они не влияли друг на друга и могли работать параллельно.

Читать далее
Всего голосов 15: ↑14 и ↓1 +13
Комментарии 7

Пиррова победа Domain-Driven Design

Уровень сложности Сложный
Время на прочтение 7 мин
Количество просмотров 8K

TL;DR: DDD неизбежно ведёт к избыточному (на порядки больше минимально необходимого) количеству саг в проекте, которые, в свою очередь, неизбежно ведут к нарушению целостности данных в БД.

DDD вполне успешно решает поставленную задачу: дать разработчикам инструменты, которые позволят им справится (корректно реализовать и поддерживать) со сложной предметной областью. Но эта победа оказалась пирровой: инструменты, обеспечивающие корректность данных в памяти, оказались неспособны гарантировать корректность данных в БД. А что толку от изначально корректных данных в памяти, если со временем (после их сохранения в БД и последующего чтения) они перестают быть корректными? По сути, у DDD есть фатальный недостаток: DDD неизбежно приводит к нарушению целостности данных (инварианта бизнес-логики) в БД.

Читать далее
Всего голосов 36: ↑33 и ↓3 +30
Комментарии 98

Аннотировать или да?

Уровень сложности Простой
Время на прочтение 4 мин
Количество просмотров 3.9K

Что такое аннотации типов в Python?

Читая эту статью надеюсь, что вы знакомы с аннотациями в Python. Но все же в вкратце напомню. Они нужны для того, чтобы придать некой строгости нашему динамически типизированному языку.

Читать далее
Всего голосов 8: ↑7 и ↓1 +6
Комментарии 58

Как LLM могут повлиять на труд разработчиков (и не только их)

Уровень сложности Простой
Время на прочтение 15 мин
Количество просмотров 1.7K

Если взглянуть на ИТ индустрию изнутри, хотя бы за последние 20 лет, то технологии и продукты сменяли друг друга довольно активно, вознося на пик спроса то одних специалистов, то совершенно других. Если брать рынок РФ, то в крупном корп секторе таких волн было несколько: была волна разработчиков OEBS (который, все еще работает в очень крупных компаниях, начиная с телекома, заканчивая известными интернет компаниями), был взлет и падение SAP/ABAP, был Siebel CRM, в части интеграции были монстры типа Oracle SOA или Tibco, в BI - Oracle BI и Sap Bobj, но сейчас все эти продукты, а вместе с ними тысячи их разработчиков перешли в разряд legacy с исчезающе малым числом вакансий и низкими зарплатами. И каждый раз, находясь в казалось бы несущемся вперед поезде очередного OEBS, находились люди, видевшие, что поезд уже горит и пора "соскакивать". На этом фоне, [backend] разработка казалась чем-то стабильным, несмотря на смены парадигм и фреймворков.

Эта статья попытка взглянуть на классическую заказную разработку с т.з. "я не сидим ли мы в поезде, паровоз которого уже горит" и поделиться соображениями в части влияния больших языковых моделей (LLM) на труд разработчиков (и шире, ИТ специалистов), рынок труда в этой сфере в кратко- и средне срочной перспективе.

Читать далее
Всего голосов 3: ↑2 и ↓1 +1
Комментарии 2

Наш путь в создании информационной системы проверок контрагентов || Laravel having no problems

Время на прочтение 9 мин
Количество просмотров 814

Проверка потенциальных контрагентов на благонадёжность — неотъемлемая часть ведения бизнеса. Она нужна, чтобы эффективно управлять рисками, соблюдать должную осмотрительность, исключить репутационные риски и финансовые потери.

Мы создали систему, которая позволила оптимизировать работу по проверке контрагентов из открытых источников. Рассказываем, как она устроена.

Читать далее
Всего голосов 2: ↑2 и ↓0 +2
Комментарии 1

Птицу узнают по перьям… или профзащита от спама

Уровень сложности Простой
Время на прочтение 2 мин
Количество просмотров 804
Часто у каждого из нас возникает желание найти похожих на себя (в профессиональном смысле), но в то же время размещение в публичных сетях своей контактной информации может породить кучу спама (ах эти древние консервы).
На помощь в этом случае приходит общее знание — образовательный ценз в профессиональной области — которое не даст воспользоваться данными «непосвящённым».

Примите и эту простую защиту персональных данных для математиков и программистов.
Читать дальше →
Всего голосов 4: ↑0 и ↓4 -4
Комментарии 4

Вклад авторов