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

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

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

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

Ежемесячный дайджест: новое за июль☀️

📺 Показали удобный способ, как развернуть Telegram-бота с сервисом Evolution Container Apps на бесплатном вебинаре. А в ближайших планах: 

💼 Разобрали кейс: АТОЛ — компания, которая занимается полным циклом разработки и производства оборудования для транспортной телематики поделилась, как улучшила производительность критически важных приложений 1C после миграции IT-инфраструктуры в Облако VMware от Cloud.ru. Другие кейсы можно посмотреть на нашем сайте.

📝 Поделились опытом и экспертизой:

☁️ Даем еще две недели, чтобы попробовать облако Cloud.ru юрлицам и ИП бесплатно. Успевайте подать заявку до 31 августа 2024 года!

🎧 Спросили у Максима Смирнова — frontend-разработчика из Т-Банка, кто такой frontend-архитектор, чем хорош фреймворк Angular и почему в работе так важна гибкость. Ответы в новом подкасте на YouTube-канале Cloud.ru

До встречи в сентябре!

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Полезные ресурсы для начинающих разработчиков

Собрали IT-версию пакета с пакетами — подборку с подборками. Внутри каждой из них вы найдёте бесплатные курсы, телеграм-каналы, YouTube-каналы, книги, тренажёры и статьи. Они помогут изучить основы языков программирования, углубить знания и применить их на практике. 

Ещё один источник знаний — бесплатные части курсов Практикума. Вы можете попробовать разные языки программирования, чтобы узнать о них больше и определиться с выбором. Если не знаете, с чего начать, выбирайте бесплатный курс «Какую профессию выбрать в программировании» — он поможет сориентироваться.

→ Все курсы по программированию

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Только не говорите, что я один этого не знал.

Если ссылку любого репозитория на GitHub, например такую:

https://github.com/Bednyakov/takewords

Дополнить строкой vscode.dev, чтобы получилось:

https://vscode.dev/github/Bednyakov/takewords

Проект откроется в онлайн редакторе Visual Studio Code.

Теги:
Всего голосов 11: ↑10 и ↓1+13
Комментарии3

Всем привет!

В продолжение предыдущего поста попробую сам себе возразить.
Предположим, что наши DevOps инженеры круто настроили pipeline: все атрибуты, которые должен настроить разработчик, параметризованы. Например, с помощью чартов Helm.
Значит ли это, что разработчик может расслабиться и не изучать все эти ваши Deployment, EnvoyFilter, VirtualService ...? Мой ответ - нет. И вот почему.

  1. если рассуждать дальше, то и Docker разработчику не нужен. Пусть его же DevOps-ы настраивают. А я на Tomcat встроенном запущу. Но вспомним в чем суть Docker - единая среда у разработчиков, тестировщиков и ПРОМа. Что позволяет избежать большой части ошибок, возникающих из-за разницы настроек окружения. Не всех, но большого числа

  2. окей, Docker пусть будет. А k8s? Но идея та же. Приложение в облаке ведёт себя по другому, чем в standalone. Его может в любой момент прибить k8s и поднять на другой node. А это ограничивает возможности локального кэширования. В облаке несколько приложений может работать параллельно. Это нужно учитывать, например, при чтении из топика Kafka. Более того число подов может меняться - см. HorizontalPodAutoscaler. Еще момент - по умолчанию у нас ephemeral storage и надеяться на сохранение логов после перезапуска нельзя. А ещё одно из Cloud Native требований - быстрый старт приложения, опять же из-за потенциального перезапуска в любой момент. На этот момент не всегда обращают внимание, хотя варианты улучшения времени запуска есть.

    Надеюсь, я вас убедил. Если нет - жду в комментах

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Почему бы не сделать runtime языка С++ проще и легче? почему бы не сделать его перенос в том числе проще? Когда я задался этим вопросом, я решил, что во чтобы то ни стало, я напишу свой RT, для тех, кто пишет под слабые машины, или тех, кто пишет под bare metal среду. результат вы можете посмотреть на гитхабе: вотъ

Когда я работал, я старался максимально всё упростить, при этом сохранив юзабельность. не знаю как для других, но лично мне было важно сохранить исключения, для меня это удобно. но в С++ они жутко дорогие из-за RTTI (RunTime Type Information), и на bare metal реализуется с большим напрягом. выход прост - использовать статусы вместо типов. но чтобы оставить всем знакомый и удобный синтаксис исключений и позволить функциям возвращать что-то вместо статуса, где это везде лепят, я переделал всё на тупо макросах :>

так же я понял, что сложность моей работы и сложность переносимости этой вещицы усложнится, если прям всё с нуля пилить, поэтому просто воспользовался libc, выпилив libc++. Пришлось сделать обёртки над new и delete, но это не так уж и сложно, просто вызывать malloc/free.

Так же я невероятно сильно намучился в попытках сделать всё используя стандартный синтаксис С++. Потратил несколько часов в попытках разобраться как оторвать исключения от использования rtti, возился в флагах, писать cxa, gxx и unwind с нуля, даже лез в ассемблерный код в попытках вырезать надоеду, но по итогу сдался и просто слепил всё из макросов.

Всем добра <3

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

Впечатлилися случайно найденным ресурсом и убил час, чтобы(, несмотря на кривое юзабилити,) найти оглавление. Вот оно:

https://opendsa-server.cs.vt.edu/home/books
(Sample OpenDSA eTextbooks)

Это один из (потенциально многих) несвязанных инстансов открытого движка для прохождения курсов по Computer Science и создания новых. Крутая его фишка: визуализация алгоритмов, структур данных и концепций, таких как стили вызовов функций - ещё и с упражнениями для закрепления.

Контента бездна, рекомендую прокликать ссылки.

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

Десять ресурсов для практики 

Собрали полезные сайты для разработчиков, где вы можете потренироваться решать задачи на разных языках. Простые сайты для первых шагов в программировании, задачки по алгоритмам, соревнования, практика для собеседований — держите список и дополняйте его в комментариях:

LeetCode
HackerRank
GeeksforGeeks
Codewars
Codeforces
CheckiO
Exercism
Coderbyte
CodeChef
Edabit

В бесплатных частях курсов Практикума мы также добавили возможность попрактиковаться (подойдёт совсем начинающим). Присмотритесь, подходит ли вам такой формат:

для фронтенд-разработчиков: напишете простую программу на JavaScript и сделаете страницу интерактивной;
для java-разработчиков: напишете консольное приложение;
для android-разработчиков: найдёте ошибки и запустите приложение «Конвертер валют»

Теги:
Всего голосов 6: ↑6 и ↓0+9
Комментарии3

Всем привет!

Когда заходит речь о разделении обязанностей между разработчиками и DevOps инженерами, споры обычно возникают в двух моментах - манифесты k8s\Openshift и CI джобы - они же джобы сборки. Поговорим про первые.
Мое мнение - за манифесты k8s\Openshift должны отвечать разработчики. Почему? А вот почему:

  1. liveness\readiness probes - только разработчики знают, по каким url они находятся. Конечно в мире Spring Boot и Actuator есть некая стандартизация, но не везде и не всегда. И не всегда actuator подходит для healthcheck, но это отдельная тема

  2. liveness\readiness timeouts - разработчики точно знают сколько времени старт пода. DevOps-ы могут это время эмпирически определить, но это требует времени)

  3. timeouts, circuit breaker, retry - опять же только разработчики могут сказать, реализовали они их на прикладном уровне или требуется настройка на уровне Service Mesh. Могут быть требования корпоративной архитектуры\сопровождения ПРОМ, их определяющие, но опять же не везде и не всегда.

  4. куда пишутся логи, какие существуют метрики, где их можно взять. Снова можно повториться, что где-то это стандартизировано, где-то нет.

  5. любые другие тонкие облачные настройки - переменные среды, значение параметров в ConfigMap, поддержка graceful shutdown .... Наверняка DevOps или сопровождение со всем этим разберется. Но будет ли это эффективно?

Теги:
Всего голосов 5: ↑2 и ↓3+3
Комментарии0

Написал web-сервис чтобы помочь возрастным родителям отправлять показатели счётчиков в коммунальные службы.

Дисклеймер: в данном посте рассмотрен мой личный опыт, опыт моих близких для которых данное решение работает в текущий период времени. Выбор стэка для реализации мои личные предпочтения, это pet-проект, делаю что хочу ;)

Мои родители в возрасте, они пользуются интернетом, но некоторые технологии даются очень тяжело. В тоже время, ряд (провинциальных) коммунальных компаний принимают показания счётчиков только по почте. Нет приложений, вэб-сайтов чтобы их отправить. Счётчики олдскульные и менять не планируют. И давно уже хотелось попробовать axum после многих лет с actix ;)

В итоге я написал крохотный web-сервис, который предоставляет собой web-интерфейс с минимумом телодвижений. Выбираешь адрес из списка, счётчик и указываешь значение. Автоматически подставляется предыдущий месяц как период оплаты, но можно выбрать другой. Жмёшь "Отправить" и письмо в нужном формате улетает по нужному адресу. Копия письма улетает моим родителям.

К сожалению, в пост нельзя добавить остальные изображения (скрины есть на гитхабе), поэтому опишу текстом.

Перед отправкой можно посмотреть как будет выглядеть итоговое письмо.

Конфигурация приложения позволяет поменять любые надписи в интерфейсе.

Коротко про стэк: rust, axum, config (конфигурация через yaml), terra (шаблонизатор), для фронта взят svelte (love.jpg)

Спасибо за внимание :)

Код и скриншоты проекта

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

Всем привет!

Хочется сказать пару слов о практике T-Shape. Это когда помимо основной специальности - например, разработки, ты развиваешься в чем-то еще. Если рассмотреть состав типовой команды, то это аналитик или тестировщик. Может быть DevOps или НТ. Или даже сопровождение ПРОМ. Насколько я знаю, такая практика есть в Яндексе. Рассмотрим плюсы и минусы на примере разработчика-тестировщика.

Плюсы очевидны:

  1. взаимозаменяемость членов команды

  2. упрощение найма за счет унификации

Но есть и минусы.

  1. суть работы тестировщика - найти проблемы в коде, рассматривая его как черный ящик. Именно потому, что тестировщик не знает, что внутри, но знает, как должно работать, ему удается найти "новые" баги. Конечно, можно ввести практику: код пишет один разраб, а тестирует другой. Но это усложнение и человеческий фактор.

  2. развитие ИТ идет в сторону более узкой специализации. Да, любую технологию можно изучить. Проблема в том, что их очень много. Много и в разработке, и в тестировании. И распыляя свои усилия на 2 направления есть риск полноценно не научится ни тому, ни другому.

  3. пункт субъективный т.к. я разработчик. Сравнивая разработку и тестирование как две области деятельности я бы всегда выбирал разработку. IMHO, она сложнее и поэтому интереснее. Отсюда риск, что на тестирование будет выделяться меньше времени. Вопрос в уровне инженерной культуры и дисциплине, но это снова человеческий фактор.

    Итог - практика интересная, но требует высокой инженерной культуры и подвержена влиянию человеческого фактора

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии4

Интересный пример, когда определение friend T (где T — шаблонный параметр) имеет смысл:

template <class T>
class Badge {
   friend T;
   Badge() { }
};

Допустим, у нас есть какой-нибудь публичный метод, и предполагается, что круг его пользователей ограничен одним классом, например:

class VFS {
   ...
public:
   void register_device(Device&);
   void unregister_device(Device&);
};

Предполагается, что эти методы будут вызываться внутри конструкторов (и деструкторов) Device и нигде (и никем) больше. Но как закрепить наше ожидание на уровне API?

Распространенное решение — вынести (un)register_device в приватную часть, а Device объявить другом:

class VFS {
private:
   friend class Device;
   void register_device(Device&);
   void unregister_device(Device&);
};

И это действительно запрещает всем кроме Device обращаться к данным методам. Но это так же разрешает Device обращаться ко всем остальным членам VFS!

Выразить же желаемое наиболее четко и ясно нам помогает как раз таки класс Badge, приведенный в самом начале статьи: мы можем оставить методы (un)register_device публичными, но при этом сделать их первым аргументом значение Badge<Device>:

class VFS {
    ...
public:
    void reg_Device(Badge<Device>, Device&);
    void unregister_device(Badge<Device>, Device&);
};

Теперь чужак не может использовать эти методы, потому что он не может сконструировать Badge<Device>, а а сам Device может вызывать их где и как пожелает:

Device::Device()
{
    VFS::instance().register_device({}, *this);
}

Теги:
Всего голосов 4: ↑4 и ↓0+5
Комментарии2

Концентрация полезных ссылок в июньском облачном дайджесте🔥

🔥 Предлагаем бесплатно попробовать облако Cloud.ru: подскажем, какой сервис лучше выбрать под вашу задачу, выделим грант или тестовый период и поможем мигрировать в облако. Подать заявку можно до 31 августа 2024 года.

✨ Обновили навигацию, дизайн и документацию на нашем сайте — провели большое UX-исследование, результаты которого легли в основу улучшений. Подробнее.

☁️ Выдаем Evolution free tier — бесплатный объем облачных ресурсов для тестирования и запуска pet-проектов. А за привязку карты при первой регистрации в личном кабинете — 4 000 бонусов (= 4 000 рублей), которые действуют 60 дней. С их помощью можно подключить к виртуальной машине любые сервисы, например, публичный IP и SNAT-шлюз. А в статье на Хабре разобрали мифы о бесплатных облачных ресурсах и частые вопросы про наш free tier.

💸 Предлагаем зарабатывать вместе с Cloud.ru: присоединяйтесь к реферальной программе, рекомендуйте наши облачные сервисы клиентам, коллегам или друзьям и получайте вознаграждение 15%. Теперь участвовать могут не только юридические лица и ИП, но и самозанятые.

🚀На конференции GigaConf 2024 анонсировали новую модульную облачную платформу Cloud․ru Evolution Stack для создания частного, гибридного или распределенного облака с учетом существующего IT-ландшафта компании. Подробнее в нашем Telegram-канале.

До встречи в августе!

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

В открытом доступе появился литкод по машинному обучению с задачами по линейной алгебре и deep learning.

Разработчики проекта поделили задачи по уровням сложности, а ещё там можно узнать правильный ответ и почитать подробнейший разбор каждого таска.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии1

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

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань

Состоялся релиз отладчика GDB 15.1 (первый выпуск серии 15.x, ветка 15.0 использовалась для разработки).

Проект GDB поддерживает отладку на уровне исходных текстов для широкого спектра языков программирования (Ada, C, C++, D, Fortran, Go, Objective-C, Modula-2, Pascal, Rust) на различных аппаратных (i386, amd64, ARM, Power, Sparc, RISC-V) и программных платформах (GNU/Linux, *BSD, Unix, Windows, macOS).

Ключевые улучшения:

  • для сборки GDB и GDBserver теперь необходим компилятор, поддерживающий C++17 (как минимум GCC 9);

  • внесены улучшения в Python API;

  • продолжена реализация протокола DAP (Debugger Adapter Protocol). Добавлена команда set debug dap-log-level для управления ведением логов для DAP. Добавлена поддержка запроса cancel и возможность формирования события process;

  • в протокол удалённой отладки добавлена поддержка пакетов QThreadOptions и qIsAddressTagged, а также реализована команда set/show remote thread-options-packet;

  • в индекс добавлена информация о функции main, что позволяет ускорить запуск при использовании с некоторыми большими исполняемыми файлами;

  • объявлены устаревшими MPX-команды show/set mpx bound, поддержка которых прекращена Intel в 2019 году.

Источник: OpenNET.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Периодически даю подобные задачки на интервью для джунов, и, к сожалению, далеко не все дают правильный ответ. А вы сможете?

Начинающий Python-разработчик выполнил свою первую самостоятельную задачу: написал программу для удаления всех чисел меньше пяти из списка. Однако результат работы его программы не соответствует ожиданиям.

Исходный список:

numbers = [1, 2, 5, 11, 3, 111, 7, 27]

Результат работы кода:

[2, 5, 11, 111, 7, 27]

Ожидаемый результат:

[5, 11, 111, 7, 27]

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

Исходный код программы:

numbers = [1, 2, 5, 11, 3, 111, 7, 27]

for i in numbers:
    if i < 5:
        numbers.remove(i)
        
print(numbers)

Ну и на всякий случай: у кандидатов на собеседовании нет доступа к GPT-чатам и поисковикам, решите без подсказок?

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

Как получить токен авторизации приложений telegram Mini Apps

Первый и самый простой способ, это открыть web версию telegram в браузере, открыть инструменты разработчика (F12 в Chrome) и во вкладке network посмотреть заголовки запросов, которые шлет клиент приложения. В поле Authorization будет искомый токен.

Однако разработчики всяких крипто-приложений, которые обычно и интересуют автоматизаторов, постоянно прикрывают возможность открытия приложения вне мобильной версии telegram. И тут приходится использовать всякие костыли.

Но в этом посте я поделюсь способом, который мне подсказал хороший человек с нечитаемым ником в телеграм-канале. Заключается он в использовании отладчика приложения telegram для Android.

В первую очередь, понадобится включить в настройках телефона "Параметры разработчика". Например, на Samsung это делается так: Настройки -> Сведения о телефоне -> Сведения о ПО -> 7 раз быстро нажать на номер сборки -> в меню "Параметры разработчика" включить "Отладка по USB".

Далее открываем приложение telegram на этом же телефоне -> Настойки -> пару раз длительно нажимаем на строку с версией приложения -> в открывшемся секретном меню "включить отладку WebView".

Подключаем телефон к компьютеру по USB и переходим в DevTools браузера Chrome: chrome://inspect/#devices

На телефоне в telegram запускаем нужное приложение и ждем, пока инспектор его определит, после чего жмём "inspect". Всё, теперь все манипуляции с приложением будут отображаться в браузере.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Автоматическая игра в BLUM

Если у вас, как и у меня, накопилось много билетов для мини игры в приложении BLUM, но нет времени, чтобы их потратить, попробуйте воспользоваться моим небольшим проектом: репозиторий BLUM_autoclaimer.

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

Для работы программы потребуется токен авторизации.

Пулл реквесты приветствуются. Интересные обсуждения автоматизации подобных проектов в телеграм-канале.

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

Чем занимаются Go-специалисты в Островке?

У нас 10 команд, использующих Go, как основной язык. Для примера возьмём команду интеграций с поставщиками отелей. Вот что делают разработчики в этой команде:

  • Адаптируют API различных поставщиков к внутреннему API сервиса. Внешние поставщики отелей используют разные технологии: GraphQL, XML, SOAP, WTF. В каждом API своё время ответа, свои коды ошибок и ещё много кастомного. 

  • Поддерживают и правят существующие интеграции. Протокол сменился, или (куда реже) коды ошибок стали другие — всё надо держать в актуальном состоянии и при необходимости править.

  • Уменьшают технический долг. Это задачи, связанные с библиотеками и рефакторингом. Есть правило — на одну итерацию должно приходиться 75% продуктовых задач и 25% техдолговых.

  • Дежурят в общем чате. В нём разработчики отвечают на вопросы менеджеров. Раньше дежурств не было, на вопрос отвечал тот, кто увидел его первым. Когда поток обращений вырос, решили назначать дежурного.

  • Обмениваются знаниями внутри компании. В Островке есть активности, напрямую не связанные с работой. Например, канал в слаке #dev-golang и еженедельный книжный клуб.

Отдельно отмечу багфиксы, которые порой превращаются в настоящие расследования инцидентов. Кроме того, команда интеграций с поставщиками отелей сейчас переписывает легаси частей системы и разрабатывает свой линтер, о котором у нас будет отдельная статья.

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

Эта программа сериализует данные из слайса структур User в JSON-формат. Но есть одна проблема: программа не работает. Нужно найти ошибку и исправить её. Когда программа заработает, она выведет данные на экран в JSON-формате.

import (
  "encoding/json"
  "fmt"
)

type User struct {
  id       int    `json:"id"`
  name     string `json:"name,omitempty"`
  email    string `json:"email,omitempty"`
  password string `json:"-"`
}

func main() {
  users := []User{
    {
      id:       1,
      name:     "Gopher",
      email:    "gopher@example.com",
      password: "Im4G0pH3r",
    },
    {
      id:       2,
      name:     "Rustocaen",
      email:    "rustocean@example.com",
      password: "iT$Ru$t0C34n",
    },
  }

  out, err := json.MarshalIndent(users, "", "    ")
  if err != nil {
    fmt.Printf("serialization error: %s\n", err.Error())
    return
  }

  fmt.Println(string(out))
}

Решение задачи опубликуем в комментариях.

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии4

Порешаем математические задачки? Практика пригодится начинающим и опытным аналитикам, разработчикам и тестировщикам.

Задача №1: делим стоимость такси справедливо

Трое друзей возвращаются домой из театра. Им по пути и они берут одно такси на троих. Поездка стоит 3000 руб. Вопрос: как делить стоимость? 

Пусть цена зависит только от расстояния. Если бы каждый ехал в отдельном такси, то: 

  • Первый заплатил бы 600 руб; 

  • Второй — 1200 руб; 

  • Третий живёт за городом, его поездка стоила бы 3000 руб — столько же, сколько сейчас стоит общая. 

Варианты решения:

  1. Разделить 3000 на троих поровну — каждый заплатит 1000 руб. Вроде бы логично, но почему первый человек должен платить так много? Ехать одному ему было бы выгоднее. 

  2. Можно, чтобы первый заплатил 600, а второй — свой остаток в 1200-600=600 руб. Третьему останется заплатить 1800 руб. Для первого друга такое тоже не очень выгодно, но он хотя бы не переплачивает.

  3. За всё платит третий — он ведь всё равно едет весь маршрут до конца.

Как бы вы посчитали? Пишите свой ответ в комментариях, а мы вернёмся с решением через несколько дней.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии12

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