[Archived] Джун уронил прод
336 subscribers
1 video
70 links
Канал в архиве. Весь актуальный контент выходит здесь @from_junior_to_senior



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

Блог @from_junior_to_senior
Навигация - @djuupbot
Обсуждения
Download Telegram
Поздравляю всех нас с Днем Программиста!
Да да, сегодня уже 256-й день в году. Здесь собрались, пожалуй, самые крутые разработчики, но почему так? Одна из главных задач программиста - учиться, постоянно учиться и двигаться вперед. Все вы, те, кто читает канал и статьи, совершенствуется в знаниях и растет - лучшие представители нашей профессии.
Вы могли заметить, что статья по мобильному приложению на Kotlin еще не вышла и причина этому - напряженная основная работа, которая никак меня не отпускает. Тех из вас, кто хочет читать больше и чаще, я приглашаю на свой второй канал t.me/from_junior_to_senior , там я пишу о технологиях и не только, в более свободном формате, выпускаю 20-минутные подкасты (ссылка на последний t.me/from_junior_to_senior/33), в общем жизнь кипит.
С праздником! Не забудьте поздравить коллег :)
Forwarded from From Junior to CTO (Ivan Osipov)
Взрывная новость! Russian AI Cup 2017 стартует совсем скоро! Пару месяцев назад я писал статьи об этом чемпионате и опыте участия в 2016 году и вот случилось! Для того, чтобы понять, что это будет в 2017 году ссылка на хабр ниже:
https://m.habrahabr.ru/company/mailru/blog/340540/

Статьи, которые я писал:
https://tttttt.me/djuup/22
https://tttttt.me/djuup/24
​​Генетический алгоритм
Что человечество научилось делать хорошо, так это заимствовать. В этот раз заимствование произошло у самой природы. Есть класс алгоритмов, которые называются метаэвристическими - это те, которые подглядели у природы и хорошо зашло в применении. Так появился генетический алгоритм в основе которого лежат целые популяции особей - решений. Этот алгоритм по праву считается универсальным, т.к. справляется с задачами из различных областей. Давайте решим вашу задачу (скажу сразу, что в разных источниках можно найти небольшие отклонения в именовании). Для начала сформируйте решение вашей задачи в виде вектора (набор цифр, например), такой вектор называется набором генов (каждая цифра вектора - это значение спрятанное в гене). Вектор - это хромосома, хромосом может быть несколько, но если ваш вектор целиком описывает решение, то хромосома всего одна. Хромосомы определяются генотипом, т.е. генотип обладает одной или более хромосом. В генетическом алгоритме на первом шаге создается первое поколение или популяция, которое представляет из себя набор особей с разнообразными генотипами. Из каждого, в том числе и первого, поколения выбираются лучшие особи. Способов выбора множество, список их вы найдете по запросу GA Selection. В зависимости от выбранного подхода к селекции (отбору), в дополнение к выбраным особям поколение допополняется либо их копиями, либо особями со случайным генотипом. Затем из обновленноного поколения мы случайным образом выбираем пары и выполняем операцию скрещивания. Полный список скрещиваний вы найдете по запросу GA Crossover. Вариантов масса, всё зависит от вашей задачи. От двух родителей получается два потомка, в некоторых случаях особь переходит в следующее поколение без изменений, иногда, с небольшой вероятностью особь может немного мутировать (GA Mutation), так мы обеспечиваем "метод иммитации отжига", когда благодаря случайным изменениям мы вырываемся из локального экстремума и исследуем поле значений более широко, т.к. скрещивания эталонных особей может загнать нас в локальный максимум или минимум целевой функции, которая оценивает особь. В итоге, спустя много поколений селекции, скрещивания и мутаций случайных решений вашей проблемы вы получаете отличное решение для абсолютно разных задач. Хотите статью на эту тему?
Статья

Генетический алгоритм: эволюция помогает подросткам

Автор: @ivan_osipov

Время чтения 🕔: 6 минут

Описание:
Генетический алгоритм — мощный инструмент в решении практических задач. Мы с вами разберем каким образом можно представить задачу цепочки действий в виде, пригодном для решения с помощью ГА. Обсудим причины процесса мутации и Cycle Crossover. В статье вы найдете ссылку на библиотеку с готовой реализацией структуры ГА и примеры использования.

Читать: Генетический алгоритм: эволюция помогает подросткам

Теги: #java #ga #algorithms
Привет всем! Хорошая новость!
Помните статью о DSL на Kotlin? Я переработал этот материал, подготовил реальный пример, который очень похож на то, что я сам использую на практике, написал огромную статью и отправил на хабр. Статья оформлена так, что вы можете использовать её как небольшой справочник и отсылать к ней своих начинающих разработчиков. В общем, думаю будет полезно.
Читать по ссылке habrahabr.ru/company/haulmont/blog/341402/
🍽 Анонс

Алгоритмы поиска кратчайшего пути: BF, Дейкстра, A Star

Уже завтра начинается Russian AI Cup. Последние дни я провёл в изучении алгоритмов поиска пути, а это значит, что самое время написать об этом. В ближайших статьях мы с вами рассмотрим практическое применение алгоритмов поиска по графу, а именно алгоритм поиска в ширину, алгоритм Дейкстры и A Star. Меня утомляют скучные объяснения, по этому, я простым языком расскажу о том как алгоритмы работают и могут быть применены, дам ссылки на очень крутые источники, более того, скину исходники алгоритмов на Java, которыми вы сможете воспользоваться для решения своих задач. Присоединяйтесь к участию и присылайте свои результаты!

Читать другие статьи: t.me/djuupbot
VR (Virtual Reality) - огромная индустрия сегодня, когда я вижу новости от facebook об очередных достижениях в виртуальном мире, я не удивляюсь, что мои инвестиции в них растут. Вы только представьте соц сеть в виртуальной реальности... Убойно! Если вы до сих пор путаете VR и AR (Augmented Reality/Дополнительная реальность) прочитайте вот этот пост t.me/fit_predict/96. Нашел много интересной аналитики, новостей и даже приложения, которые следует испытать, вот здесь @fit_predict. Отличный агрегатор информации о перспективных технологиях.
Автор, ведущий data scientist, также публикует обзор интересных новостей, но основной уклон делает на информацию об интересных мероприятиях и обучающих программах в области искусственного интеллекта.
Статья

Алгоритмы поиска кратчайшего пути: Поиск в ширину

Автор: @ivan_osipov

Время чтения 🕔: 10 минут

Описание:
Хотите наконец разобраться в поиске путей по графу? Первый алгоритм, который мы рассмотрим, поиск в ширину. В статье мы разберем алгоритм, особенности реализации и пример. Также вы найдете ссылки на исходники, которые можете переиспользовать при решении собственных задач.

Читать: Алгоритмы поиска кратчайшего пути: Поиск в ширину

Теги: #java #pathfinding #algorithms
​​Статья

Алгоритмы поиска кратчайшего пути: Алгоритм Дейкстры

Автор: @ivan_osipov

Время чтения 🕔: 8 минут

Описание:
Продолжим изучать поиск путей по графу? Второй алгоритм, который мы разберем, алгоритм Дейкстры. Теперь мы будем использовать взвешенный граф по которому и построим маршрут. В статье мы разберем алгоритм и пример применения в картинках. Ссылки на код, который можно запустить или переиспользовать при решении собственных задач, под катом.

Читать: Алгоритмы поиска кратчайшего пути: Алгоритм Дейкстры

Теги: #java #pathfinding #algorithms
Forwarded from From Junior to CTO (Ivan Osipov)
По ощущениям первая волна интереса к микросервисам утихла, теперь можно свежим взглядом посмотреть в эту сторону. Сейчас появилась хорошая инфраструктура для построения микросервисных архитектур, один Spring Cloud чего стоит. Плюс очевиден тренд на реактивные потоки данных (Reactive Streams). Плюс докер, который дает дополнительный уровень изоляции. Хотя я совершенно не верю в то, что написание микросервисов на разных языках это сколь-нибудь живой кейс, тем не менее сам подход интересный и влечет за собой решение большого количества интересных задач. Так, например, давайте ответим на вопрос, а как же нам авторизировать пользователя в каждом из микросервисов? Взглянем на прошлое. Существуют монолитные системы, все сервисы в одной куче, при входе вам выдаются права и проблем с их отслеживанием не возникает, но миктосервисы... Микросервисы сегодня это множество отдельно запускаемых приложений, в принципе, мы могли бы дать доступ каждому из них к бд с пользователями, но только представьте, какую нагрузку это даст на систему. Так дело не пойдет. В ходе изучения вопроса, я встретил следующий популярный вариант: пользователь аутентифицируется через OAuth2 на сервере авторизаций, который обладает полной информацией о пользователе, пользователь получает свого рода ссылку или токен, который вне сети микросервисов бесполезен, однако, при обращении к API, предоставив токен/ссылку, можно восстановить "значение" запросом от действующего сервера к серверу авторизаций. Значение в нашем случае это JSON Web Token. Полученный объект - это зашифрованная информация, расшифровать которую могут исключительно сервера с ключом. Получается, что сама информация о пользователе из сети микросервисов не выходит, а рамках неё - пропагируется, простым языком - прокидывается. Одно из условий - каждый сервер должен уметь расшифровать то, что он получил. Вот такой незатейливый способ авторизации по токену, который мы получаем от пользователя после его аутентификации. Ниже прикладываю ссылку на статью, где это всё более подробно разобрано, материал и его качетво хороши, так что если вы заинтересовались, то вперёд
https://nordicapis.com/how-to-control-user-identity-within-microservices/
Forwarded from From Junior to CTO (Ivan Osipov)
ICO Телеграм

Таким просто нельзя не поделиться. Есть подкрепленные слухи о том, что Телеграм будет проводить ICO, если вы не в курсе криптовалютного мира, то это процесс, когда происходит первичное размещение криптомонет. Название проекта Telegram Open Network. Судя по тому что пишут - это хороший способ монетизировать мессенджер и при этом не забрасывать мессенджер рекламой или чем похуже. Грядёт что-то интересное. Надеюсь, что это продвинется дальше чем просто слухи.

Источник: https://www.facebook.com/id77777/posts/10154846872521076
Forwarded from From Junior to CTO (Ivan Osipov)
Media is too big
VIEW IN TELEGRAM
FullHD ролик о Telegram Open Network
Forwarded from From Junior to CTO (Ivan Osipov)
API Docs

Как вы пишете доки к API приложения? Какие средства используете? Документация актуальна? Часто для документирования HTTP API используется swagger, простой и понятный инструмент, но сегодня мы поговорим о чем-то чуть более сложном, о чем-то чуть более продвинутом, а именно о Spring REST Docs. Довольно удивительно, что в разных кругах REST обозначает не сколько стиль архитектуры, сколько, в принципе, использование HTTP для построения API приложения. Spring Rest Docs (SRD) - это один из проектов Spring, который позволяет писать документацию к вашим REST сервисам и вот каким образом. Знакомы с TDD? Успели полюбить написание тестов? Здесь это пригодится. Документация в проекте SRD генерируется на основе написанных вами тестов. Как это выглядит?

Упрощенно, процесс следующий: пишем тест -> запускаем его -> генерируется сниппет в формате asciidoctor -> сниппет компилируется в html/pdf/другие форматы.

Тест для Spring Boot выглядит следующим образом.
Вы конфигурируете объект MockMvc, например, так (JUnit 5)
@SpringBootTest
@ExtendWith({RestDocumentationExtension.class, SpringExtension.class})
public class SampleJUnit5ApplicationTests {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;

@BeforeEach
public void setUp(RestDocumentationExtension restDocumentation) {
this.mockMvc = MockMvcBuilders
.webAppContextSetup(context).apply(
documentationConfiguration(
restDocumentation))
.build();
}
...
}

Затем с его помощью пишите тест, например, так
@Test
public void sample() throws Exception {
this.mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andDo(document("sample"));
}

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

Spring Rest Docs: https://goo.gl/CF3NRv
Getting Started: https://goo.gl/WdRdF8
Примеры: https://goo.gl/cujcj5
Forwarded from From Junior to CTO (Ivan Osipov)
Последний рабочий день в этом году закончился, а это значит, что впереди 2 недели отдыха смешанного с реализацией отложенных до "свободного времени" идей и личностного роста. Этот год в самом его начале я обозвал "годом перемен", всё так и произошло. В этом году я закончил магистратуру, успел с женой дважды слетать в отпуск, посетил JPoint, в мою жизнь пришёл Kotlin, я открыл для себя мир телеграма, который затем открыл для меня мир статей, переслушал огромное колличество мотивирующей и бизнес литературы, что в корне изменило моё мышление и взгляды, начал свою дорогу в инвестировании и довольно успешно, сделал много открытий для себя лично, в общем год получился насыщенным. Всё это при поддержке моей жены, которой можно было довериться в любой ситуации. С Наступающим всех вас! Ставьте цели, идите к ним, не сомневайтесь и достигать задуманного. Помните, что остановиться в стремлении к лучшему можно в любой момент, так зачем это делать сейчас? Спасибо, что читаете! До следующего года!
Forwarded from From Junior to CTO (Ivan Osipov)
Квантовые компьютеры сегодня

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

Кубит это наименьший элемент хранения информации по аналогии с битами в классическом компьютере. Его ключевое отличие в том, что при изменении его состояния он случайно переходит из 0 в 1 и наоборот. Пока мы не наблюдаем за кубитом его состояние описывается суперпозицией двух возможных состояний, в тот момент когда мы ставим средство наблюдения, магия квантового мира разрушается и значение становится определенным, только вот нам не обязательно наблюдать за значениями в ходе получения решения. Это и другие фантастические вещи из квантового мира позволяют решать некоторые задачи очень быстро.

Сегодня за первенство на рынке квантовых компьютеров борется сразу несколько компаний, среди которых IBM, D-Wave и подключившийся в 2015 году Intel. Ключевым приемуществом квантовых компьютеров перед классическими является возможность выполнять вычисления параллельно на физическом уровне опираясь на квантовую теорию. Такой подход поможет решать комбинаторные задачи в миллионы раз быстрее, чем это происходит сейчас на классических ПК.

Сегодня, компания IBM делает очень большой вклад в развитие инфраструктуры квантовых компьютеров. Компания, которая проспала мобильную революцию, в ноябре 2017 года реализовала 50 кубитный квантовый компьютер, что является хорошим показателем для универсальных квантовых компьютеров. Вы можете встретить упоминания о том, что d-wave продали свой 2000 кубитный компьютер, но обратите внимание на то, что он адиабатический, по сути это другой подход к реализации, направленный на конкретные задачи, а не что-то универсальное. Развивая спрос IBM выпускает обучающие видео, которые знакомят людей с этим новым сранным миром квантовых вычислений.

На рынке квантовых технологий есть еще одно направление - квантовые сенсоры. Всё в том же ноябре 2017 года Apple купила стартап InVisage, который разрабатывал "квантовую плёнку", по сути через несколько лет мы можем увидеть новый IPhone с камерой, которая даже при контрастном освещении не теряет объекты, а при низкой освещённости сможет делать снимки с дневным качеством.

Квантовые технологии - это важный фронт прогресса компьютерных вычислений. Не смотря на то, что в бытовых условиях мы с вами врядли увидим реализации на основе атомов охлажденных до "около" абсюлютного нуля, скорее здесь приживется подход от IBM на базе конденсаторов из ниобия, нелинейного алюминиевого моста и кремниевого чипа. Тем не менее, уже сегодня в этой области развиваются квантовые облачные вычисления и первое с чем я предлагаю вам познакомиться это IBM Quantum Experience. По сути, это облачная платформа, которая знакомит вас с построение программ для квантовых компьютеров. Похоже на что-то революционное. Пойду изучать, ниже ссылка
IBM Q Experience: https://goo.gl/YN9LCA
Forwarded from From Junior to CTO (Ivan Osipov)
Кодогенерация

Два года назад я узнал о проекте jooq. Это генерация кода с помощью которого можно работать с БД из Java. Автоматически создаются классы на основе схемы бд. Тогда это мне показалось чем-то новым, но с тех пор прошло время и генерация кода стала ощущаться чем-то странным. Тем не менее сама по себе задача интересная и отчасти уже решена. На днях открыл для себя библиотеку JavaPoet и её разновидность KotlinPoet, которая сейчас в Early-Access Release, но это нас не остановит, не так ли?

Создадим пустой проект на Kotlin и подцепим gradle зависимость

compile 'com.squareup:kotlinpoet:0.6.0'


внутри функции main опишем генерируемый класс:

val userClass = ClassName("example", "User")


класс находится в каком-то файле, по этому нам нужно этот файл описать, тут куча всяких билдеров и появилось острое желание сделать для этого Kotlin DSL ибо "слишком много шумного кода". Итак, к файлу:

val file = FileSpec.builder("example", "model")
...
.build()
file.writeTo(System.out)


Здесь мы говорим о том, что будем генерировать файл model c пакетом example, а затем распечатаем его на экран. Между инициализацией билдера и его терминальным вызовом build() происходит основной экшен. Например, мы можем добавить класс User в этот файл:

.addType(TypeSpec.classBuilder(userClass)
...
.build())
.build()


А в класс можно добавить проперти, но важно понимать, что библиотека не гарантирует компилируемости результата, так что сразу защищайтесь от вещей типа lateinit val, которые не скомпилируются. Итак, добавим к нашему классу свойство name:

.addProperty(PropertySpec
.varBuilder("name", String::class, KModifier.LATEINIT)
.build())
.build()


Так мы описали спецификацию var переменной типа String с модификатором lateinit

В результате описанного выше примера у нас сгенерируется следующий код:

package example

import kotlin.String

class User {
lateinit var name: String
}


Библиотека на GitHub здесь: https://github.com/square/kotlinpoet
Код, который мы рассмотрели выше для удобочитаемости выложил вот сюда: https://goo.gl/yuY7jd
Forwarded from From Junior to CTO (Ivan Osipov)
Instant View in Action
Полное руководство по разработке Instant View

Пользуетесь функцией Instant View? Это кнопочка в самом низу поста, который содержит в себе ссылку. При клике на кнопку вам становится доступен контент, который вы получите перейдя по ссылке, но при этом контент вы просматриваете прямо внутри телеграмма. Самый частый гость на просторах нашего мессенджера это telegra.ph, как его опытный пользователь могу сказать, что это отличный и простой как 5 копеек сервис для написания статей с минимумом возможностей. Однако, если у вас есть любимый сайт с которого вы хотели бы закидывать статьи прямо в соседний чат и для него телеграм до сих пор не поддерживает Instant View, то это можно исправить. На примере своего сайта я покажу и объясню как настроить Instant View для вашего случая, а результат вы увидите во время чтения этого поста с телефона.

Статья:
https://tttttt.me/iv?url=https%3A%2F%2Fi-osipov.ru%2Fpost%2Finstant-view-in-action%2F&rhash=cc209de8fde944
Forwarded from From Junior to CTO (Ivan Osipov)
Шаблон TolerantReader и Закон Постела

Время чтения: 8 минут

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

Статья:
https://tttttt.me/iv?url=https%3A%2F%2Fi-osipov.ru%2Fpost%2Fpostels-law-and-tolerant-reader%2F&rhash=cc209de8fde944
Forwarded from From Junior to CTO (Ivan Osipov)
Семантическое версионирование 2.0

Время чтения: 5 минут

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

Статья:
https://tttttt.me/iv?url=https%3A%2F%2Fi-osipov.ru%2Fpost%2Fsemanantic-versioning-2_0%2F&rhash=cc209de8fde944