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

Пользователь

Отправить сообщение

Более 10 лет ставлю цели на год: рассказываю, как это делать эффективно

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

Меня зовут Павел Комаровский, и я алкоголик занимаюсь саморазвитием уже более 10 лет. Эта статья о том, какой подход к личному целеполаганию я выработал для себя в итоге – надеюсь, она поможет вам избежать ошибок, которых в своё время наделал я.

Я полностью прошёл все стадии грехопадения: в студенческие годы искал сакральные ответы в стопках self-help макулатуры; затем разочаровался и решил, что весь этот «успешный успех» – это разводилово для дурачков (до сих пор уверен, что Наполеон Хилл – шизофреник); позже переосмыслил всё ещё раз и пришёл к своему пониманию того, как может выглядеть саморазвитие с адекватным лицом.

Читать далее
Всего голосов 78: ↑67 и ↓11+81
Комментарии223

TeamCity: настраиваем CI/CD в вашей команде

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

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

TeamCity — пожалуй, один из самых популярных CI/CD-серверов, который используют разработчики по всему миру. В этой статье я расскажу про базовые концепции, на которых он построен, и на примерах покажу, как можно настроить CI/CD в вашей команде.

Читать далее
Всего голосов 21: ↑20 и ↓1+22
Комментарии26

В нативный код из уютного мира Java: путешествие туда и обратно (часть 1)

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


Java и другие управляемые языки просты и удобны во многих случаях, но иногда их возможностей недостаточно — например, если нужна библиотека, написанная только на C или C++. Иногда хочется позвать пару методов из системного API, или попытаться улучшить производительность для модуля — и тогда прямой путь в нативный код.


Но тут возникают подводные камни: написать нативный метод и вызвать библиотеку может быть и легко, но JVM начинает крашиться в случайных местах, производительность падает, сборщик мусора перестает справляться с работой, а в репозитории царствуют бесконечные C-шные файлы с буквами JNI. Что же могло пойти не так?


Иван Углянский (dbg_nsk) из Huawei разбирается со всем по порядку: что необычного в интеропе между Java и нативным кодом, как оно работало раньше и что нужно делать для их нормальной совместной работы (и можно ли это вообще сделать). Иван рассказывает, как избежать просадок производительности, внезапных OOM и размышляет на тему будущего — в контексте проектов Panama и Sulong.


Мы подготовили текстовую версию доклада о работе с нативами в Java. В первой части:


  • Зачем вообще работать с нативным кодом в Java.
  • С какими ошибками и проблемами придётся столкнуться при работе с нативами.

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


Далее — повествование от лица спикера.

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

Google Play In-App Review API: пошаговое руководство по внедрению

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

Летом 2020 года появилась новая классная функциональность в библиотеке Play Core — In-App Review [1]. При помощи этой фичи можно реализовать диалог с отзывом и оценкой пользователя. Это очень удобно и не ломает пользовательский сценарий. Фича полезна для повышения рейтинга и продвижения. Например, после внедрения в одном из приложений количество оценок увеличилось в 5 раз [2]. В этой статье я расскажу, как внедрить In-App Review в ваше приложение.

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

И снова о Legacy. Вечная боль техдира

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

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


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


Техдир пришёл к ним, поздоровался и спросил: «Ребята, скажите честно, какой аццкий зверь меня ждёт в этом проекте? Потому что стейкхолдеры рассказали только о единорогах с радужными хвостами и розовых пони? Legacy, да?»


«Legacy, ...», — грустно ответили разработчики.


Сказка закончилась. Началась работа — и непростые решения.


Читать дальше →
Всего голосов 62: ↑50 и ↓12+52
Комментарии111
Привет, Хабр! Меня зовут Георгий, я менеджер проектов и гейм-дизайнер в компании Azur Games. Мир мобильных игр — это очень конкурентная среда: здесь важно регулярно включаться в освоение новых инструментов, чтобы продолжать наращивать свою аудиторию.
Наша команда отслеживает появление новых платформ и экосистем приложений, так как на ранней стадии зайти на них проще и выгоднее. Именно эти соображения и привели Azur Games в магазин приложений AppGallery от Huawei. Сегодня я хочу рассказать вам об этом опыте на примере своего проекта — игры AXES.io. Под катом — о том, какие шаги я предпринимал, обо что споткнулся и что получил.
Читать дальше
Всего голосов 23: ↑16 и ↓7+32
Комментарии20

А вы можете решить эти три (обманчиво) простые задачи на Python?

Время на прочтение4 мин
Количество просмотров29K
С самого начала своего пути как разработчика программного обеспечения я очень любил копаться во внутренностях языков программирования. Мне всегда было интересно, как устроена та или иная конструкция, как работает та или иная команда, что под капотом у синтаксического сахара и т.п. Недавно мне на глаза попалась интересная статья с примерами того, как не всегда очевидно работают mutable- и immutable-объекты в Python. На мой взгляд, ключевое — это то, как меняется поведение кода в зависимости от используемого типа данных, при сохранении идентичной семантики и используемых языковых конструкциях. Это отличный пример того, что думать надо не только при написании, но и при использовании. Предлагаю всем желающим ознакомиться с переводом.



Попробуйте решить эти три задачи, а потом сверьтесь с ответами в конце статьи.

Совет: у задач есть кое-что общее, поэтому освежите в памяти решение первой задачи, когда перейдёте ко второй или третьей, так вам будет проще.
Читать дальше →
Всего голосов 38: ↑26 и ↓12+19
Комментарии32

Данные всех стран, не объединяйтесь

Время на прочтение4 мин
Количество просмотров21K
Радует, когда на диаграмме кроме новых созвездий находится нечто похожее на зависимость. В таком случае мы строим модель, которая хорошо объясняет связь между двумя переменными. Но исследователь должен понимать не только, как работать с данными, но и какая история из реального мира за ними лежит. В противном случае легко сделать ошибку. Расскажу о парадоксе Симпсона — одном из самых опасных примеров обманчивых данных, который может перевернуть связь с ног на голову.
Читать дальше →
Всего голосов 109: ↑109 и ↓0+109
Комментарии10

Настройка Debian, Nginx и Gunicorn для Django проекта

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


Всем доброго времени суток.

Была задача поднять свой Debian сервер на Nginx для проектов Django 3.х. Перерыв кучу информации в интернете, удалось это сделать соединив рекомендации с нескольких разных сайтов. Если вам интересно почитать, как настроить свой первый сервер для Django-проекта, то — добро пожаловать.
Читать дальше →
Всего голосов 7: ↑6 и ↓1+8
Комментарии12

Мега-Учебник Flask, Часть XIX: Развертывание на основе Docker-контейнеров

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

(издание 2018)


Miguel Grinberg




Туда Сюда


Это девятнадцатая часть серии мега-учебника Flask, в которой я собираюсь развернуть Microblog на платформе Docker.

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

Практическое руководство по разработке бэкенд-сервиса на Python

Время на прочтение57 мин
Количество просмотров176K
Привет, меня зовут Александр Васин, я бэкенд-разработчик в Едадиле. Идея этого материала началась с того, что я хотел разобрать вступительное задание (Я.Диск) в Школу бэкенд-разработки Яндекса. Я начал описывать все тонкости выбора тех или иных технологий, методику тестирования… Получался совсем не разбор, а очень подробный гайд по тому, как писать бэкенды на Python. От первоначальной идеи остались только требования к сервису, на примере которых удобно разбирать инструменты и технологии. В итоге я очнулся на сотне тысяч символов. Ровно столько потребовалось, чтобы рассмотреть всё в мельчайших подробностях. Итак, программа на следующие 100 килобайт: как строить бэкенд сервиса, начиная от выбора инструментов и заканчивая деплоем.



TL;DR: Вот репка на GitHub с приложением, а кто любит (настоящие) лонгриды — прошу под кат.
Читать дальше →
Всего голосов 57: ↑55 и ↓2+66
Комментарии48

Оптимизация времени сборки — Часть 1

Время на прочтение7 мин
Количество просмотров5.1K
Почти каждый разработчик хотя бы раз сталкивался с довольно длительным временем сборки своего проекта. Это приводит к снижению производительности и замедляет процесс разработки всей команды. Как вы видите, увеличение времени сборки проекта имеет решающее значение, поскольку оно оказывает непосредственное влияние на время публикаций приложения в AppStore и для более быстрого релиза новых возможностей вашего приложения.

В этой статье мы узнаем, как профилировать сборку в Xcode и получать метрики. В следующей статье я расскажу о методах устранения узких мест и ускорения сборки проекта. Следует также упомянуть, что мы будем использовать проект Kickstarter iOS, который можно найти на Github. Так что давайте начнем!

Что мы измеряем?


Первое, что мы должны сделать, — определить, что мы пытаемся измерить и оптимизировать. Можно рассмотреть два варианта:

  • Clean build — clean и сборки проекта. Часто clean сборка выполняется на CI для проверки нового pull request и выполнения юнит тестов.
  • Incremental build — сборки проекта после значительных правок исходного кода. Эта сборка создается разработчиком во время работы над новой функциональностью.

В большинстве случаев уменьшение времени при Clean сборке должно также ускорить Incremental сборку. Оптимальным вариантом было бы создание метрик для обоих типов сборок и отслеживание их. Мы будем измерять время сборки, используя Debug конфигурацию только потому, что она используются большую часть времени и оказывают большее влияние на разработку.
Читать дальше →
Всего голосов 10: ↑10 и ↓0+10
Комментарии4

Blitz Engine & Battle Prime: ECS и сетевой код

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


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

В геймдев индустрии огромное количество разработчиков, которые охотно делятся своими историями, наработками, архитектурными решениями — в том или ином виде. Этот опыт, выложенный в публичное пространство в виде статей, презентаций и докладов, является отличным источником идей и вдохновения. Например, доклады команды разработки из Overwatch были для нас очень полезны при работе над движком. Как и сама игра, они очень талантливо сделаны, и я советую посмотреть их всем интересующимся. Доступны в GDC vault и на YouTube.

Это одна из причин, по которой мы также хотим вносить вклад в общее дело — и эта статья одна из первых, посвященная техническим деталям разработки движка Blitz Engine и игры на нем — Battle Prime.

Статья будет поделена на две части:

  • ECS: имплементация Entity-Component-System паттерна внутри Blitz Engine. Этот раздел важен для понимания примеров кода в статье, и сам по себе является отдельной интересной темой.
  • Неткод и геймплей: все, что касается высокоуровневой сетевой части и ее использования внутри игры — клиент-серверная архитектура, клиентские предсказания, репликация. Одной из важнейших вещей в шутере является стрельба, так что ей будет уделено большее количество времени.

Под катом много мегабайт гифок!
Читать дальше →
Всего голосов 30: ↑30 и ↓0+30
Комментарии8

Идеальная передача и универсальные ссылки в C++

Время на прочтение9 мин
Количество просмотров156K
Недавно на isocpp.org была опубликована ссылка на статью Eli Bendersky «Perfect forwarding and universal references in C++». В этой небольшой статье есть простой ответ на простой вопрос — для решения каких задач и как нужно использовать rvalue-ссылки.
Узнать этот ответ
Всего голосов 56: ↑56 и ↓0+56
Комментарии27

Топ-10 докладов конференции C++ CoreHard Autumn 2019

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


CoreHard – C++ конференция, проходящая в Минске дважды в год, весной и осенью. С 2015 года мы выросли из небольшого сообщества энтузиастов в крупную региональную конференцию. Мы стараемся совмещать знания признанных мастеров мира С++ с развитием локального С++ движения, активно привлекая докладчиков из местных белорусских, российских и украинских компаний.

Спешим поделиться с хабровчанами топ-10 свежеиспеченных видео с нашей недавно отшумевшей конференции.

Итак, поехали: топ-10 докладов по оценкам зрителей.
Всего голосов 31: ↑31 и ↓0+31
Комментарии1

Как ужиться с поколением Z

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


Знаете, когда читаешь публикации в СМИ насчёт очередных особенностей очередного поколения молодых людей, начинает казаться, что мир катится в пропасть. Все эти фразы про молодёжь, которая не умеет работать, не признаёт авторитетов и скоро погубит мир, свежестью своей мысли заставляют вспомнить глиняные таблички времён Хаммурапи.

Чушь. Познакомьтесь с поколением Z. Они скоро станут вашими коллегами, подчинёнными и даже начальниками. Они обычные люди, просто получившие смартфон раньше, чем научились читать. Умные, целеустремлённые, образованные. Да, они не жгли тряпки на заброшенной стройке и не ели муравьёв в песочнице, но зато многие из них уже успели собрать свой первый школьный проект на Arduino и вовсю осваивают 3D-печать.

Эта тема всё больше нервирует рекрутеров, которые ещё не совсем понимают, как правильно их нанимать, и руководителей, которые не уверены, что получится ужиться с этим поколением. Всё не так страшно. Я хочу рассказать немного больше о социологических аспектах поколений. А ещё попробуем понять, почему бывает так сложно работать с центениалами, и как направить их творческую натуру на благо компании.
Всего голосов 112: ↑93 и ↓19+96
Комментарии604

Разработка мобильного приложения без сервера

Время на прочтение10 мин
Количество просмотров14K
Очень часто при разработке мобильных приложений (возможно с веб-приложениями та же проблема) разработчики попадают в ситуацию, когда бэкэнд не работает или не предоставляет нужных методов.

Такая ситуация может происходить по разным причинам. Однако, чаще всего на старте разработки, бэкэнд просто не написан и клиент начинает без него. В таком случае начало разработки затягивается на 2-4 месяца.

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


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

Просто и на C++. Основы userver — фреймворка для написания асинхронных микросервисов

Время на прочтение6 мин
Количество просмотров39K
В Яндекс.Такси придерживаются микросервисной архитектуры. С ростом количества микросервисов мы заметили, что разработчики много времени тратят на boilerplate и типичные проблемы, при этом решения не всегда получаются оптимальные.

Мы решили сделать свой фреймворк, с C++17 и корутинами. Вот так теперь выглядит типичный код микросервиса:

Response View::Handle(Request&& request, const Dependencies& dependencies) {
  auto cluster = dependencies.pg->GetCluster();
  auto trx = cluster->Begin(storages::postgres::ClusterHostType::kMaster);

  const char* statement = "SELECT ok, baz FROM some WHERE id = $1 LIMIT 1";
  auto row = psql::Execute(trx, statement, request.id)[0];
  if (!row["ok"].As<bool>()) {
    LOG_DEBUG() << request.id << " is not OK of " << GetSomeInfoFromDb();
    return Response400();
  }

  psql::Execute(trx, queries::kUpdateRules, request.foo, request.bar);
  trx.Commit();

  return Response200{row["baz"].As<std::string>()};
}

А вот почему это крайне эффективно и быстро — мы расскажем под катом.
Читать дальше →
Всего голосов 53: ↑51 и ↓2+49
Комментарии57

Переупаковка пакетов в Gradle

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

В своей статье хочу рассказать об очередной хитрости, которую можно довольно просто реализовать с помощью Gradle — переупаковке пакетов библиотек. Каждый, кто хоть чуть чуть работал с этой системой сборки, знает, что она автоматически умеет решать конфликты разных версий библиотек, а при желании можно повлиять на это, например зафорсить конкретную версию какой-нибудь библиотеки:


configurations.all {
    resolutionStrategy {
        force "org.ow2.asm:asm:7.2"
    }
}

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


Такая проблема также может возникнуть и при разработке библиотек. Если вы подключите в свой проект 2 библиотеки, использующие одну и ту же стороннюю библиотеку разных версий, например 1 и 2, то Gradle разрулит и возьмет самую новую версию, вторую. Но если в этой сторонней библиотеке нет обратной совместимости и вторая версия не может быть просто так использована вместо первой, то будут проблемы, которые наверняка будет очень сложно отследить по стектрейсу. Библиотека, ожидающая первую версию, получит классы второй и просто упадет.


Я столкнулся с конфликтом версий при написании градл плагина, в нем используется библиотека asm, которая и конфликтовала. После написания плагина, я проверил его работоспособность на тестовом проекте: все отлично, проверил на pet project-е, тоже все хорошо, но когда подключил к реальному рабочему проекту с кучей сторонних зависимостей, столкнулся с проблемой.



Решение проблемы под катом.

Читать дальше →
Всего голосов 12: ↑11 и ↓1+10
Комментарии6

C/C++ из Python (C API)

Время на прочтение7 мин
Количество просмотров26K
main

Продолжаем тему как вызывать C/C++ из Python3. Теперь используем C API для создания модуля, на этом примере мы сможем разобраться как работает cffi и прочие библиотеки упрощающие нам жизнь. Потому что на мой взгляд это самый трудный способ.

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

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность