Вторая часть из цилка статей про вычислительные выражения в F#. Здесь Скотт Влащин рассказывает про функции-продолжения. Сложная, но очень важная тема.
User
Сыворотка правды. Расскажете, что угодно
Занятная штука, эта сыворотка. Такая то и дело мелькает на страницах фэнтези, в боевичках "про серьёзные спецслужбы", ну и в интернет-легендах, конечно. С ней, мол, расскажете, что угодно! В посте - пара слов про "сыворотки правды"...
Создание масштабируемого API на спотовых инстансах AWS
Всем привет! Меня зовут Кирилл, я CTO Adapty Большая часть нашей архитектуры находится на AWS, и сегодня я расскажу о том, как мы сократили расходы на сервера в 3 раза за счёт использования спотовых инстансов на продакшн окружении, а также о том, как настроить их автомасштабирование. Сначала будет обзор того, как это работает, а потом подробная инструкция для запуска.
Что такое спотовые инстансы?
Спотовые инстансы — это сервера других пользователей AWS, которые в данный момент простаивают, и они продают их с большой скидкой (Amazon пишет до 90%, по нашему опыту ~3x, варьируется в зависимости от региона, AZ и типа инстанса). Основное их отличие от обычных в том, что они могут выключиться в любой момент. Поэтому мы долгое время считали, что их нормально использовать для дев окружений, либо для задач по расчёту чего-то, с сохранением промежуточных результатов на S3 или в базу, но не для прода. Существуют сторонние решения, которые позволяют использовать споты на проде, но там для нашего кейса много костылей, поэтому мы не внедряли их. Подход, описанный в статье, работает полностью в рамках стандартного функционала AWS, без дополнительных скриптов, кронов и тд.
(Без)болезненный NGINX Ingress
Итак, у вас есть кластер Kubernetes, а для проброса внешнего трафика сервисам внутри кластера вы уже настроили Ingress-контроллер NGINX, ну, или пока только собираетесь это сделать. Класс!
Я тоже через это прошел, и поначалу все выглядело очень просто: установленный NGINX Ingress-контроллер был на расстоянии одного helm install
. А затем оставалось лишь подвязать DNS к балансировщику нагрузки и создать необходимые Ingress-ресурсы.
Спустя несколько месяцев весь внешний трафик для всех окружений (dev, staging, production) направлялся через Ingress-серверы. И все было хорошо. А потом стало плохо.
Все мы отлично знаем, как это бывает: сначала вы заинтересовываетесь этой новой замечательной штукой, начинаете ей пользоваться, а затем начинаются неприятности.
Kubernetes: жизнь пода
Как вы могли догадаться, заголовок этой публикации — отсылка к мультфильму Pixar 1998-го года «A Bug’s Life» (в российском прокате он назывался «Приключения Флика» или «Жизнь насекомого» — прим. перев.), и действительно: между муравьём-рабочим и подом в Kubernetes есть много схожего. Мы внимательно посмотрим на полный жизненный цикл пода с практической точки зрения — в частности, на способы, которыми вы можете повлиять на поведение при старте и завершении работы, а также на правильные подходы к проверке состояния приложения.
Почему вам стоит перестать использовать продуктовые роадмапы и попробовать GIST
Вольный перевод статьи Итамара Гилада, консультанта по росту и стратегии, бывшего продакт-менеджера Google, о подходе к стратегическому планированию развития продуктов.
На протяжении лет я разработал немалое количество продуктовых стратегий, роадмапов и диаграмм Ганта по проектам. Но больше я их не делаю. Я нашёл альтернативу получше, о которой сейчас расскажу.
Красота Go
Gopher — талисман Go
Некоторое время назад я начал изучать возможность использования Go в некоторых своих сторонних проектах и был просто поражен красотой этого языка программирования.
Думаю, что его разработчикам удалось найти баланс между простотой использования, обычно свойственной интерпретируемым языкам с динамической типизацией, и производительностью вкупе с безопасностью (типобезопасность, безопасность использования памяти), которые характерны для компилируемых языков со статической типизацией.
Есть еще две особенности языка, которые делают его идеальным вариантом для разработки современных систем. Я на них остановлюсь подробнее в разделе статьи под названием «Сильные стороны».
Одна из них — первоклассная поддержка конкурентности (concurrency) (с помощью горутин (goroutines) и каналов, рассмотрено ниже). Конкурентность по своему определению позволяет эффективнее использовать всю доступную мощь CPU, даже если у процессора всего одно ядро. В Go на одной машине могут одновременно выполняться сотни тысяч горутин (легковесных потоков). Каналы и горутины крайне важны при построении распределенных систем, поскольку они абстрагируют механизмы, связанные с передачей сообщений в рамках концепции поставщика-потребителя (producer-consumer messaging paradigm).
Nginx в работе DevOps/Администратора. Тёмная сторона силы
В работе DevOps/Администраторов зачастую возникают моменты, в которые необходимо куда-то кому-то срочно предоставить доступ. Будь то инстанс докера, один из многочисленных контейнеров или какой-то внутренний сервис.
Все знают о возможностях nginx с точки зрения проксирования трафика, балансировки нагрузки между серверами и прочих полезных вещей, помогающих объединять разрозненные сервисы. Однако задача разрешения проблем возникающих в процессе разработки намного обширнее.
Основной посыл данной статьи — показать нестандартный подход к казалось бы простым вещам, таким как предоставление временного доступа внутрь закрытого сегмента.
Эффективная DI библиотека на Swift в 200 строк кода
— Создание объектов и внедрение зависимостей в существующие
— Разделение на контейнеры — Assemblies
— Типы разрешения зависимостей: граф объектов, синглетон, прототип
— Разрешение циклических зависимостей
— Подмена объектов и конктесты зависимостей для тестов
В EasyDi нет разделения на register/resolve. Вместо этого зависимости описываются вот так:
var apiClient: IAPIClient {
return define(init: APIClient()) {
$0.baseURl = self.baseURL
}
}
→ Cocoapods / EasyDi
→ Github / EasyDi
Под катом очень краткое описание «Зачем DI и что это», также примеры использования библиотеки:
- Как использовать и типы зависимостей
- Как тестировать c подменой объектов
- Как можно это использовать для A/B тестов
- Как собрать VIPER-модуль
Рождение Software Tools: как и зачем появились GREP и AWK
Этим летом мне на глаза попалось эссе Брайана Кернигана «Иногда старые способы — лучшие», опубликованное в честь 25-летнего юбилея журнала IEEE Software в 2008 году. В нем профессор Керниган рассказывал о том, какие инструменты он использует в работе.
В тот момент он был занят двумя сложными проектами — один из них подразумевал экспертный анализ проекта на 100 000 строк кода, написанный на C и Assembler в 1990 году, под Windows XP; другой — перенос кода с экзотического языка L1 на не менее экзотический язык L2 при помощи программы, написанной на неназванном скриптовом языке под Linux. Удивительно, но для столь разных задач профессор Керниган вместо IDE использовал один и тот же набор инструментов — grep, diff, sort, awk, wc и прочих «старых знакомых» из эпохи раннего Unix. Более того, многие инструменты и IDE конца прошлого десятилетия он подверг критике за неудобность и несовершенство.
Действительно, к некоторым вещам в своей жизни мы привыкли настолько сильно, что уже воспринимаем их за данность и критиковать их нам даже не приходит в голову — нам кажется, будто они существовали всегда. Подобный образ мышления помогает адаптироваться к потоку новой информации и неизбежен в современном мире, но давайте не будем сегодня отказывать себе в удовольствии «спуститься на уровень ниже», чтобы увидеть, как появилась сама идея программных инструментов (они же далее по тексту — «software tools», утилиты, команды Unix).
Pull request'ы на GitHub или Как мне внести изменения в чужой проект
Итак, что же такое «запрос на включение (сделанных вами изменений)» (именно так я перевёл pull request)? В официальной документации гитхаба говорится следующее:
Pull request'ы позволяют вам рассказать другим о тех изменениях, которые вы разместили в своём GitHub-репозитории. Как только pull request отправлен, заинтересованные стороны рассматривают ваши изменения, обсуждают возможные правки или даже добавляют дополняющие коммиты, если нужно.
Говоря своим языком: Посылая pull request, вы говорите автору изначального репозитория (и всем заинтересованным лицам): «Смотрите, что я сделал, не хотите ли принять мои изменения и влить их в проект?»
Вы уволили самого талантливого сотрудника. Надеюсь, теперь вы довольны
Давайте присядем, вы и я. Нужно поговорить. Если вы не читали статью по ссылке, то уделите 10–15 минут и прочитайте, впитайте её целиком.
Готовы? Отлично. Теперь разберём этот текст, потому что он значит гораздо больше, чем там написано. Если вы прочитали статью, то понимаете, что автор описывает проблемного сотрудника под вымышленным именем «Рик». Рик — это местный гений с огромным количеством знаний в предметной области, он входит в состав ключевых разработчиков продукта.
На первый взгляд, это история о технаре, который возомнил себя божьим даром для компании. Он решил, что руководители должны поклоняться земле, по которой он ходит и быть благодарны за одно его присутствие, а руководство вышвырнуло его пинком за дверь, потому что его репутация обналичивала чеки, за которые талант не мог заплатить.
Литература на выходные: 15 материалов по структурированию кода для разработчиков
«Чистый код прост и ясен. Чистый код читается как хорошо написанное произведение. Чистый код никогда не скрывает намерений создателя, но, напротив, полон четких абстракций и простых линий передачи управления»
Сегодня мы собрали для вас список книг и статей по этой теме, которые рекомендуют к прочтению резиденты Hacker News, Stack Exchange и других профильных платформ.
MVVM: полное понимание (+WPF) Часть 1
Зачем вообще нужно использовать паттерн MVVM? Это ведь лишний код! Написать тоже самое можно гораздо понятнее и прямолинейнее.
Отвечаю: в маленьких проектах прямолинейный подход срабатывает. Но стоит ему стать чуть больше — и логика программы размазывается в интерфейсе так, что потом весь проект превращается в монолитный клубок, который проще переписать заново, чем пытаться распутать. Для наглядности можно посмотреть на две картинки:
«Паттерны» функционального программирования
Многие люди представляют функциональное программирование как нечто очень сложное и «наукоемкое», а представителей ФП-сообщества – эстетствующими философами, живущими в башне из слоновой кости.
До недавнего времени такой взгляд на вещи действительно был недалек от истины: говорим ФП, подразумеваем Хаскель и теорию категорий. В последнее время ситуация изменилась и функциональная парадигма набирает обороты в web-разработке, не без помощи F#, Scala и React. Попробуем взглянуть на «паттерны» функционального программирования, полезные для решения повседневных задач с точки зрения ООП – парадигмы.
ООП широко распространено в разработке прикладного ПО не одно десятилетие. Все мы знакомы с SOLID и GOF. Что будет их функциональным эквивалентом?.. Функции! Функциональное программирование просто «другое» и предлагает другие решения.
Архитектурная пирамида приложения
Разбираясь со всем этим по отдельности, меня заинтересовал вопрос — как они взаимосвязаны? Пытаясь выстроить иерархию и вдохновившись небезызвестной пирамидой Маслоу, я построил свою пирамиду «архитектуры приложения».
О том, что из этого вышло — читайте под катом.
Алгоритм машинного обучения Flappy Bird
То есть мы хотим создать ИИ-робота, который сможет учиться оптимальной игре во Flappy Bird. В результате наша маленькая птица сможет спокойно пролетать через препятствия. В наилучшем сценарии она не умрёт никогда.
Прочитав теорию, лежащую в основе этого проекта, можно скачать исходный код в конце этого туториала. Весь код написан на HTML5 с использованием фреймворка Phaser. Кроме того, мы использовали библиотеку Synaptic Neural Network для реализации нейросети, чтобы не создавать её с нуля.
Демо
Для начала посмотрите демо, чтобы оценить алгоритм в действии:
Запустить в полноэкранном режиме
Применение MVP+TDD в разработке iOS приложений
— Слава TDD!
— Юнит-тестам слава!
В этой статье мы разберемся с принципами применения MVP+TDD в разработке iOS приложений. Разбираться будем на примере создания небольшой обучалки для пользователя, которая показывается при первом запуске.
Требования от бизнеса
Итак, ваш заказчик хочет, чтоб в его приложение добавили обучалку, которая покажется пользователю один раз при первом запуске. Обучалка состоит из нескольких изображений, которые должны быть показаны в определенной последовательности. Переключаться изображения должны по нажатию на кнопку "Продолжить". Также при показе последнего изображения — на кнопке нужно написать "Старт" (как бы намекая пользователю, что приложение будет сейчас запущено).
Эти токсичные, токсичные собеседования
Всё началось, когда автор Ruby on Rails признался миру:
Hello, my name is David. I would fail to write bubble sort on a whiteboard. I look code up on the internet all the time. I don't do riddles.
— DHH (@dhh) February 21, 2017
Использование NSOperation и NSOperationQueue в Swift
На Mac, пользователи видит песочные часы или вращающийся радужный курсор, пока снова не возобновится взаимодействие с пользовательским интерфейсом. Многие пользователи ошибочно предполагают, что приложения сразу же заработает при прикосновению к экрану. Такие приложение дают ощущение низкой производительности и кажутся медленными, и, как правило, получает плохие отзывы в AppStore.
Но обеспечить постоянную отзывчивость пользовательского интерфейса не так уж просто. Как только приложение выполняет множество задач, оно начинает подтормаживать. Не так уж много времени выделяется для выполнения большого количества задач в главном потоке и для обеспечения отзывчивости интерфейса.
Что же должен делать «несчастный» разработчик? Решение есть, оно состоит в том, чтобы отделить основной поток через параллелизм. Параллелизм, это свойство приложения выполнять задачи в несколько потоков одновременно – и при этом пользовательский интерфейс остается отзывчивым, поскольку Вы выполняете свою работу в разных потоках.
Одним из методов для одновременного выполнения операций в iOS являются использование классов NSOperation и NSOperationQueue. В этой статье вы узнаете, как их использовать! Вы будете работать с приложением, которое совсем не использует многопоточность, таким образом, оно будет очень медленным, и будет «тормозить». Когда вы измените приложение, чтобы можно было добавлять параллельные операций и — надеюсь – это обеспечит более отзывчивый интерфейс для пользователя!
Information
- Rating
- Does not participate
- Registered
- Activity