Factory Method Pattern
Привет, друзья. С вами Alex Versus.
Ранее мы говорили про шаблоны проектирования Одиночка и Стратегия, про тонкости реализации на языке Golang.
Сегодня расскажу про Фабричный метод.
Привет, друзья. С вами Alex Versus.
Ранее мы говорили про шаблоны проектирования Одиночка и Стратегия, про тонкости реализации на языке Golang.
Сегодня расскажу про Фабричный метод.
Системы Skyscanner сложно назвать маломасштабными. Наш сайт и приложение каждый месяц используются миллионами путешественников, мы обрабатываем умопомрачительные объёмы запросов, используя микросервисную архитектуру, которая сама по себе далеко не маленькая. В общей совокупности у нас задействовано несколько сотен микросервисов и микросайтов (веб-приложений, поддерживающих определённую часть нашего сайта), обслуживаемых сотнями экземпляров AWS Lambda и библиотек. Каждое из этих средств хранится в своём собственном репозитории GitHub, что даёт некоторые преимущества с точки зрения разделения задач, но имеет и свою цену: когда одно и то же изменение нужно выполнить во всех этих репозиториях, как это можно осуществить?
Свежая подборка новостей и материалов
Интересное в этом выпуске
Видео с GopherCon Russia 2021, создание BitTorrent-клиента с нуля, набор инструментов для работы с API Apple/Mac, сетевой сканер ARP, TCP, UDP, ICMP
Приятного чтения!
Утечку горутин можно легко обнаружить с помощью APM, который отслеживает количество работающих горутин. Вот пример из NewRelic — график, который мониторит горутины:
scratch
и крошечного http-сервера на основе этой сборки, я смог ужать результат до 6.32kB!Перевод статьи начального уровня в блоге проекта Textile от 12 декабря 2019 г.
В предыдущей статье мы начали с вопроса: «Как подойти к своему первому p2p-приложению?» После недолгих размышлений мы быстро пришли к выводу, что решение не полагаться на централизованный сервер и сосредоточиться на том, чтобы сделать приложение для равноправных узлов, сопряжено с множеством дополнительных сложностей. Две основные группы «проблем» - это состояние приложения и инфраструктурное разнообразие протоколов. К счастью, мы обнаружили, что нам не нужно изобретать велосипед, заново решая груду инфраструктурных задач - вместо того мы можем использовать великолепный сетевой p2p-стек: библиотеку libp2p.
В сегодняшнем посте мы пойдем немного дальше и представим «игрушечное» приложение, чтобы почувствовать, как на самом деле можно что-то разрабатывать с помощью libp2p, и, надеюсь, мотивировать вас создать собственное p2p-приложение. Серьезно, вы удивитесь, насколько это просто!
Приложение
Сразу оговоримся, наша программа нынче будет написана на языке Go, с использованием библиотеки go-libp2p. Если вы ещё не знакомы с этим языком, настоятельно рекомендуем ознакомиться. Он действительно хорош для приложений, имеющих дело с параллелизмом и сетевыми взаимодействиями (такими, как например, обработка множества p2p-соединений). Большинство библиотек IPFS/libp2p имеют свои базовые реализации, написанные на Go. Прекрасным введением в Go является тур на golang.org.
Итак, наша программка будет простым приложением для пинг-понга с некоторыми добавочными настройками, чтобы сделать её более интересной, в отличие от обычных безыскусных примеров. Вот некоторые особенности нашего приложения (не волнуйтесь, мы расскажем подробней об этих пунктах позже):
В нашей компании в стеке разработки есть язык Go. И иногда, при написании unit-тестов к приложениям написанным на Go, у нас появляются сложности. В этой статье мы расскажем о некоторых моментах, которые мы учитываем при написании тестов. На примерах разберём как их можно использовать.
Привет, Хабр!
Вышло первое крупное обновление GoLand 2021.1. Традиционно расскажем о новом в релизе и покажем, как пользоваться новой функциональностью.
Если совсем коротко, теперь вы можете:
• собирать и запускать программы на удаленном окружении: Docker, SSH и WSL 2;
• использовать новую функциональность Go 1.16 (например, //go:embed);
• мгновенно генерировать код из JSON;
• с легкостью обрабатывать ошибки с помощью новых быстрых исправлений;
• обсуждать код и обмениваться новыми знаниями с помощью сервиса для совместной разработки и парного программирования Code With Me.
Но, это конечно, не все!
Привет, друзья.
Меня зовут Alex Versus и сегодня с вами посмотрим шаблон Singleton, реализацию на языке Golang.
Какая суть?
Одиночка - относится к порождающим шаблонам. Гарантирует:
Как показывает собственный опыт - если разработчик пишет код, который взаимодействует с внешним миром, то закон Мерфи сработает быстрее, чем хотел бы того этот самый разработчик. И дело даже не в том, что в этом случае появляются зависимости от доступности внешнего мира и стороны принимающей данные - часто ошибки появляются на стороне кода отправляющего данные из-за недостаточной его проверки, полагаясь на "ну, код вроде выглядит нормально, да и unit-тест есть на это". Но должного ли качества этот самый тест, и фиксирует ли он то, что надо? А что будет, если состав данных будет совсем не такой, как в тесте?
В этот момент появляется желание посмотреть "так что же на самом деле отправляет my-awesome-lib?", и если это желание возникает и у тебя, мой дорогой читатель, и отправка происходит посредством протокола HTTP - то, возможно, у меня для тебя есть "ещё одна тулзовина для отладки HTTP запросов" в твою коллекцию (бесплатно, без регистрации).
Всем привет, друзья. Меня зовут Alex, я профессиональный разработчик и создатель программных продуктов в веб индустрии. Много лет изучаю языки, делюсь опытом с другими.
Сегодня хочу с вами поговорить про шаблон проектирования Стратегия (Strategy). Постараюсь донести до вас принципы и суть шаблона без воды, и покажу как его применять на практике.
Время от времени новички в Go натыкаются на любопытное свойство языка, связанное с размером стека, доступным для горутины. Обычно это происходит из-за того, что программист непреднамеренно создает бесконечную рекурсию. Чтобы проиллюстрировать это, рассмотрим следующий (слегка надуманный) пример.
package main
import "fmt"
type S struct {
a, b int
}
// String implements the fmt.Stringer interface
func (s *S) String() string {
return fmt.Sprintf("%s", s) // Sprintf will call s.String()
}
func main() {
s := &S{a: 1, b: 2}
fmt.Println(s)
}
Свежая подборка новостей и материалов
Интересное в этом выпуске
монитор горутин в терминале, пикселизатор изображений, проверка безопасности Go-кода, dropbox load balancing
Приятного чтения!
При рассмотрении вопросов базируемых на безопасности каналов связи, использующих криптографические протоколы, между точками A и B, вместе с доверенным участником T, концентрация внимания сосредоточена в большей мере как раз на последнего. Это и логично, и оправдано, ведь доверенный, промежуточный субъект информации T становится законно установленным атакующим первоначальными субъектами A и B, тем самым, способен совершать атаки MITM (Man In The Middle), что приводит систему в неустойчивое состояние, состояние требующее абсолютного доверия. Но так или иначе, более значимой проблемой приведённого анализа является вовсе не субъект T, а скорее субъекты A, B, возможность атаки которых полностью игнорируется, что и приводит к фатальным угрозам информационной безопасности настоящего времени.
Основной сутью проблемы является возможность атаки со стороны принимающей стороны. Так предположим, что субъект A есть отправитель, значит он автоматически становится жертвой нападения, если B есть получатель, он автоматически становится атакующим. Современная задача заключается в том, что истинным получателем информации (объекта) становится вовсе не пользователь B, а предположим, что участник C, в то время как сама точка B становится промежуточным, интерстициальным узлом, владеющим всей информацией о пользователях A и C (увлечениями, интересами, хобби, развлечениями, сообщениями, адресами) в предельно открытом, транспарентном состоянии. Узлу B известна совершенно вся передаваемая через него, и в последующем хранимая на нём, информация. Примером такого явления могут служить современные мессенджеры, социальные сети, форумы, чаты, файловые сервисы и т.д., где общение не происходит напрямую (как это предполагается в криптографических протоколах), а всегда проходит сквозь стороннюю точку, представляющую собой сервис или платформу связи.
Проблема начинает претерпевать кардинальные изменения, т.к. возвращает первичную задачу классической криптографии — борьбу с прослушиванием, которая должна была решиться (и решилась теоретически) лишь с приходом раздела асимметричной криптографии [1]. Данная апория куда серьёзнее и значимее, нежели классическая MITM атака, т.к. требует куда меньшее количество затрат атакующего для слежки большего количества атакуемых. Это есть паноптикон современного общества, где атакующие и атакуемые меняются местами, инвертируют способ слежения и делают заложника инициатором прослушивания. Теперь жертвы собственными усилиями подключаются к прослушиваемой связи, выбирают множество возможных способов слежения за собственным «Я», в то время как атакующие воспроизводят такие способы в огромном количестве, затмевая тем самым факт существования более безопасных альтернатив.
Итогом считается возникновение систем доверия, где не только сами доверительные узлы являются атакующими, но и промежуточные получатели, что приводит к значительным рискам компрометации хранимых и передаваемых объектов между истинными субъектами. Уничтожить такую систему доверия не представляется возможным, из-за появления более общих и разрушительных видов атак, из-за ухудшения оптимизации и производительности программ, а также из-за невозможности полного искоренения доверия как такового [2, с.267]. Таким образом, остаётся лишь улучшать данную систему, делать так, чтобы сам её механизм стремился к уменьшению мощности доверия*, чтобы собственная её структура представляла защиту объектов и анонимат субъектов. К системам подобного рода относятся анонимные сети и тайные каналы связи.
Это вторая часть статьи, посвященной универсальному сервису подписания для инфраструктуры Госуслуг. Первая часть статьи была посвящена GO-части нового сервиса, в которую входит конфигурирование, тестирование, ресты, файловый менеджер и планировщик. Всему тому, что происходит до того, как данные будут переданы в С-часть для подписания и верификации. Также там кратко описаны основные предпосылки к создания нового сервиса.
Приступать к чтению этой статьи рекомендуется строго после ознакомления с первой частью.
Во второй части будет рассмотрена CGO-прослойка и C-часть, в которой происходит подписание и верификация данных. Тут же будут описаны самые важные оптимизации, ради которых этот сервис и создавался.
Это первая часть статьи, в которой будет рассмотрена GO-часть нового сервиса подписания для всем известного (а если не всем, то многим) портала Госуслуг. Сюда входит конфигурирование, тестирование, ресты, файловый менеджер и планировщик. В общем все то, что происходит до того, как данные будут переданы в C-часть для подписания и верификации. Я также кратко опишу основные предпосылки к созданию нового сервиса.
Какое-то время назад появилась возможность уделить внимание языку Go и удачно на глаза попалась публикация «Паспортный контроль, или Как сжать полтора гигабайта до 42 мегабайт» . В статье кратко, но информативно, рассказывается о тестовой задаче по разработке сервиса проверки номеров российских паспортов на предмет наличия их в списке недействительных паспортов. Среди основных требований к реализации – это скорость проверки и доступность сервиса.
После прочтения статьи для себя решил, что именно на этой практической задаче можно построить свое обучение Go. Действительно, задача c проверкой недействительных паспортов, хоть и избитая, но интересная, а раз уж требования по производительности здесь в приоритете, то реализация на Go здесь будет вполне уместна.
Кроме того, в упомянутой выше статье затронуты вопросы эффективной, с точки зрения памяти, организации битовых массивов (bitmap). И эта тема достаточно актуальна и востребована в разных прикладных решениях, например, в виде bitmap-индексов для СУБД.
Итак, есть желание посмотреть на новый для себя язык Go, есть интересная проблематика в виде организации и использования bitmap, есть практическое применение, на котором эти две задачи можно отработать.