Forwarded from Lilu Maque
#rust #gateway #senior #удаленка
We are looking for a Senior Gateway Engineer for one of the top companies in the field of HFT.
We expect that the candidate will join the Trading Platform Team to work on exchange gateways for a new algorithmic trading platform.
We offer a chance to build complex solutions using cutting edge technologies and mature software engineering practices in the atmosphere of creativity and collaboration.
Responsibilities:
Given high-level business and technical requirements, discuss all the related details with trading/devops teams, design architecture of trading platform gateways for maximum reliability and performance;
Research and reverse-engineer exchange external APIs to find undocumented ways to achieve fastest communication;
Implement proposed solutions using modern technology stack;
Ensure quality, reliability and performance of developed solutions using automated (unit, integration, performance) and manual testing;
Document implemented modules;
Communicate with peer teams on integrations, deployment and support of implemented solutions;
Maintain and improve implemented connectors according to business needs and feedback.
Skills and Experience:
4+ years of relevant work experience;
Strong adherence to principles of effective software engineering - SOLID, TDD;
Understanding of computer systems and software architecture - Linux OS, networks, data structures and algorithms, parallel programming, distributed computing, performance optimization;
Extensive experience with Rust, or familiarity with Rust and experience in strong-typed language eg C++ / C# /Go;
Deep understanding of communication protocols - TCP, UDP, HTTP/REST, WebSocket;
Proven hands-on experience in exchange gateways development;
Self-motivated, with strong analytical and problem solving skills;
Strong communication skills (upper intermediate English);
Degree in Computer Science, a related field or equivalent professional experience.
Bonus Points:
Experience in the HFT or related areas;
Hacking skills are encouraged.
Отклик: @lilumaque
We are looking for a Senior Gateway Engineer for one of the top companies in the field of HFT.
We expect that the candidate will join the Trading Platform Team to work on exchange gateways for a new algorithmic trading platform.
We offer a chance to build complex solutions using cutting edge technologies and mature software engineering practices in the atmosphere of creativity and collaboration.
Responsibilities:
Given high-level business and technical requirements, discuss all the related details with trading/devops teams, design architecture of trading platform gateways for maximum reliability and performance;
Research and reverse-engineer exchange external APIs to find undocumented ways to achieve fastest communication;
Implement proposed solutions using modern technology stack;
Ensure quality, reliability and performance of developed solutions using automated (unit, integration, performance) and manual testing;
Document implemented modules;
Communicate with peer teams on integrations, deployment and support of implemented solutions;
Maintain and improve implemented connectors according to business needs and feedback.
Skills and Experience:
4+ years of relevant work experience;
Strong adherence to principles of effective software engineering - SOLID, TDD;
Understanding of computer systems and software architecture - Linux OS, networks, data structures and algorithms, parallel programming, distributed computing, performance optimization;
Extensive experience with Rust, or familiarity with Rust and experience in strong-typed language eg C++ / C# /Go;
Deep understanding of communication protocols - TCP, UDP, HTTP/REST, WebSocket;
Proven hands-on experience in exchange gateways development;
Self-motivated, with strong analytical and problem solving skills;
Strong communication skills (upper intermediate English);
Degree in Computer Science, a related field or equivalent professional experience.
Bonus Points:
Experience in the HFT or related areas;
Hacking skills are encouraged.
Отклик: @lilumaque
Forwarded from Блог*
Первый статья (pdf) (июнь 2020!), с подходом, адаптировавшим зипперы к PwD, использует понятия синтаксиса (как единого объекта) и сфокусированного синтаксиса, который суть синтаксис плюс стек слоёв, который можно к нему применить (отчасти напоминает то, о чём говорил я). Ограничив себя LL(1)-грамматиками, авторы сумели реализовать парсер, работающий за время, пропорциональное количеству входных лексем, причём все важные свойства промежуточных операций они верифицировали при помощи доказательств на Coq. Сам парсер доступен в виде библиотеки на Scala.
Вторая статья (август 2020!) не ограничивается LL(1)-грамматиками, а даёт способ парсить произвольные контекстно-свободные грамматики. Т. к. на вход подаётся лишь единственное правило, поэтому алгоритму приходится разбираться с произвольными графами с циклами и использовать несколько изощрённое обобщение зиппера. Статья ценна тем, что в ней реализация выводится через ряд промежуточных версий (одним из шагов, как и в статье Майкла Адамса, является замена таблицы мемоизаций на единственное значение для мемоизации). Получившийся парсер короче оригинального PwD и при этом показывает лучшую производительность, чем оптимизированный PwD Майкла Адамса. К сожалению, не смотря на то, что данный парсер, по всей видимости, имеет кубическуб производительность для худшего случая, доказать этот факт авторы не сумели из-за приличного количества нетривиальной логики с мемоизацией.
Как вам уже известно, я выкладываю лишь то, что прочитал/посмотрел сам. Последние две статьи я прочитал, но, к сожалению, не уяснил полностью излагаемые там алгоритмы. Буду перечитывать.
Вторая статья (август 2020!) не ограничивается LL(1)-грамматиками, а даёт способ парсить произвольные контекстно-свободные грамматики. Т. к. на вход подаётся лишь единственное правило, поэтому алгоритму приходится разбираться с произвольными графами с циклами и использовать несколько изощрённое обобщение зиппера. Статья ценна тем, что в ней реализация выводится через ряд промежуточных версий (одним из шагов, как и в статье Майкла Адамса, является замена таблицы мемоизаций на единственное значение для мемоизации). Получившийся парсер короче оригинального PwD и при этом показывает лучшую производительность, чем оптимизированный PwD Майкла Адамса. К сожалению, не смотря на то, что данный парсер, по всей видимости, имеет кубическуб производительность для худшего случая, доказать этот факт авторы не сумели из-за приличного количества нетривиальной логики с мемоизацией.
Как вам уже известно, я выкладываю лишь то, что прочитал/посмотрел сам. Последние две статьи я прочитал, но, к сожалению, не уяснил полностью излагаемые там алгоритмы. Буду перечитывать.
Telegram
Блог*
#prog #rust #моё
Исторически решение задач с бектрекингом является более простым в функциональных ЯП с персистентными структурами данных. Взял состояние, немного поменял его и получил новую версию, делаешь на ней рекурсивный вызов, если решение зашло в тупик…
Исторически решение задач с бектрекингом является более простым в функциональных ЯП с персистентными структурами данных. Взял состояние, немного поменял его и получил новую версию, делаешь на ней рекурсивный вызов, если решение зашло в тупик…
Forwarded from Igor Gulamov
#вакансия #rust #senior #remote #удаленно #fulltime #halftime #blockchain
Формат работы: #удаленка
Занятость: #полная #частичная
Оплата: $25-50/h
О проекте: международный проект, который делает полностью анонимные транзакции, с возможностью переводов внутри продукта. Проект основан ресерчерами, но уже сейчас виден большой потенциальный спрос на будущий продукт.
О соискателе: ты готов работать удаленно, имеешь опыт работы на rust и substrate, тебе не нужно объяснять, как работает подпись на эллиптических кривых и меркл дерево.
Основная задача - разработка смарт контрактов и модулей на substrate.
Проект активно привлекает гранты от мировых лидеров индустрии, быстро растет, появляются новые задачи и возможности для профессионального роста.
Подробности в PM.
Формат работы: #удаленка
Занятость: #полная #частичная
Оплата: $25-50/h
О проекте: международный проект, который делает полностью анонимные транзакции, с возможностью переводов внутри продукта. Проект основан ресерчерами, но уже сейчас виден большой потенциальный спрос на будущий продукт.
О соискателе: ты готов работать удаленно, имеешь опыт работы на rust и substrate, тебе не нужно объяснять, как работает подпись на эллиптических кривых и меркл дерево.
Основная задача - разработка смарт контрактов и модулей на substrate.
Проект активно привлекает гранты от мировых лидеров индустрии, быстро растет, появляются новые задачи и возможности для профессионального роста.
Подробности в PM.
Forwarded from Блог*
#prog #rust
Пара советов по строкам в Rust:
1) Если вам нужно разбить строку по одному из нескольких возможных символов — не спешите расчехлять регулярки, для это задачи вполне хватит стандартной библиотеки. Множество строковых методов навроде {, r}split{, _terminator}, trim{, _start, _end}_matches, find и прочие принимают в качестве аргумента для поиска значение, тип которого реализует пока нестабильный трейт Pattern. В настоящий момент его реализуют
2) Если функция принимает на вход
Вызвать `next`?
Нет.
Также вызвать `next_back`?
Нет.
Это всё неполные ответы. Если мы получаем мутабельную ссылку на
Покажу на примере.
Вот первый способ вытащить строку из
Второй способ (побыстрее и не требующий аллокаций):
Пара советов по строкам в Rust:
1) Если вам нужно разбить строку по одному из нескольких возможных символов — не спешите расчехлять регулярки, для это задачи вполне хватит стандартной библиотеки. Множество строковых методов навроде {, r}split{, _terminator}, trim{, _start, _end}_matches, find и прочие принимают в качестве аргумента для поиска значение, тип которого реализует пока нестабильный трейт Pattern. В настоящий момент его реализуют
&str, &&str, &String, impl FnMut(char) -> bool и (почему-то малоизвестный) &[char]. Таким образом, разбить строку по нескольким символам легко:let result = "Hello, world!".split(&['o', 'l'][..]).collect::<Vec<_>>();
assert_eq!(result, vec!["He", "", "", ", w", "r", "d!"]);
2) Если функция принимает на вход
&mut std::str::Chars, что она может с ним сделать?Вызвать `next`?
Нет.
Также вызвать `next_back`?
Нет.
Это всё неполные ответы. Если мы получаем мутабельную ссылку на
Chars, мы можем редактировать произвольным образом, в том числе и поменять его целиком. Chars внутри себя содержит строки, символы которой он перебирает, и при помощи метода Chars::as_str эту строку можно достать. Таким образом, имея мутабельную ссылку на Chars, можно вытащить из него строку, вырезать из строки нужный кусок и переписать переданный итератор .chars() от этого кусочка.Покажу на примере.
Вот первый способ вытащить строку из
Chars (медленный, требующий аллокаций и не совсем корректный):fn extract_line2(chars: &mut Chars) -> String {
chars.take_while(|&ch| !matches!(ch, '\r' | '\n')).collect()
}Второй способ (побыстрее и не требующий аллокаций):
fn extract_line<'s>(chars: &mut Chars<'s>) -> Option<&'s str> {
let s = chars.as_str();
let line = s.lines().next()?;
*chars = s[line.len()..].chars();
Some(line)
}doc.rust-lang.org
Pattern in std::str::pattern - Rust
A string pattern.
Forwarded from Блог*
#prog #rust #article
Статья про то, как писать код с инициализацией данных, сохранив сильную exception safety.
Статья про то, как писать код с инициализацией данных, сохранив сильную exception safety.
Arthur::Carcano
Exception safety in Rust: using transient droppers to prevent memory leaks
In this post, we dive into a common Rust pattern to prevent memory leaks in case of exceptions in unsafe code, as used in the `array-init` crate.
Forwarded from Так говорит Алиса (John Meow)
DEV Community
How to debug rust applications with VIM
This is a simple guide to configure the loved (and hated) VIM editor to develop and debug rust applications.
Forwarded from Так говорит Алиса (John Meow)
Forwarded from Блог*
#prog #rust #article
Обстоятельная статья о трейтах
Обстоятельная статья о трейтах
Send и Sync и о том, что они означают с точки зрения написания кода.nyanpasu64.github.io
An unsafe tour of Rust’s Send and Sync
Rust’s concurrency safety is based around the Send and Sync traits. For people writing safe code, you don’t really need to understand these traits on a deep level, only enough to satisfy the compiler when it spits errors at you (or switch from std threads…
Forwarded from Блог*
#prog #rust #моё #article
Здрасьте. Сегодня поста не будет — но только потому, что я решил написать статью для Хабра. Собственно, вот она.
И напоминаю: если вам это понравилось — поддержите копеечкой автора, я вам благодарен буду: 4274 3200 5402 8520.
Здрасьте. Сегодня поста не будет — но только потому, что я решил написать статью для Хабра. Собственно, вот она.
И напоминаю: если вам это понравилось — поддержите копеечкой автора, я вам благодарен буду: 4274 3200 5402 8520.
Хабр
Как написать FizzBuzz на собеседовании
Здравствуй, Хабр. Недавно я проходил собеседование в одну солидную айтишную контору. Когда мы разобрались с формальностями, начался технический этап, на котором мне поручили написать fizzbuzz. По не...
Forwarded from Блог*
Michael-F-Bryan
Common Newbie Mistakes and Bad Practices in Rust: Bad Habits
When you are coming to Rust from another language you bring all your previous experiences with you.
Often this is awesome because it means you aren’t learning programming from scratch! However, you can also bring along bad habits which can lead you down the…
Often this is awesome because it means you aren’t learning programming from scratch! However, you can also bring along bad habits which can lead you down the…
Forwarded from Блог*
#prog #rust #article
Rust's Unsafe Pointer Types Need An Overhaul
Или что не так с сырыми указателями в Rust и что с этим стоило бы сделать
Rust's Unsafe Pointer Types Need An Overhaul
Или что не так с сырыми указателями в Rust и что с этим стоило бы сделать
Faultlore
Rust's Unsafe Pointer Types Need An Overhaul - Faultlore
Forwarded from Блог*
#prog #rust #article
How to speed up the Rust compiler in July 2022
Куча интересных усовершенствований!
How to speed up the Rust compiler in July 2022
Куча интересных усовершенствований!
Nicholas Nethercote
How to speed up the Rust compiler in July 2022
Let’s look at some of the progress on Rust compiler speed made since my last post. I will start with some important changes made by other people.
Forwarded from Блог*
#prog #rust #c #video
Unsafe Rust is not C
Или об отличиях в правилах, нарушение которых приводит в C и в Rust к UB, к чему UB может привести на практике и как эти правила выливаются в ограничения и возможности для оптимизации.
Unsafe Rust is not C
Или об отличиях в правилах, нарушение которых приводит в C и в Rust к UB, к чему UB может привести на практике и как эти правила выливаются в ограничения и возможности для оптимизации.
YouTube
Unsafe Rust is not C
Unsafe Rust is like C in some ways, but there are tricky rules that unsafe Rust has to follow that don't exist in C. C also has some tricky rules of its own. This is a talk about some of these differences, particularly when it comes to pointer aliasing. I've…
Forwarded from Блог*
#prog #rust #article
Набор из трёх статей Niko Matsakis про дизайн параллельных итераторов в rayon. Впрочем, первая статья посвящена обзору обычных, последовательных итераторов. Если у вас есть опыт работы с Rust — первую статью можно спокойно не читать.
Parallel Iterators Part 1: Foundations
Parallel Iterators Part 2: Producers
Parallel iterators, part 3: Consumers
И ещё небольшой документ в репе rayon о том, как реализовывать параллельные итераторы.
Набор из трёх статей Niko Matsakis про дизайн параллельных итераторов в rayon. Впрочем, первая статья посвящена обзору обычных, последовательных итераторов. Если у вас есть опыт работы с Rust — первую статью можно спокойно не читать.
Parallel Iterators Part 1: Foundations
Parallel Iterators Part 2: Producers
Parallel iterators, part 3: Consumers
И ещё небольшой документ в репе rayon о том, как реализовывать параллельные итераторы.
docs.rs
rayon - Rust
Rayon is a data-parallelism library that makes it easy to convert sequential computations into parallel.
Forwarded from Блог*
#prog #rust #article
The registers of Rust
Лодочник рассматривает существующие эффекты в Rust (асинхронность, итерирование, ошибочность) с точки зрения регистров (не процессорных, а в том смысле, в котором это слово используется в социолингвистике) и довольно аргументированно доказывает, что усилия по развитию асинхронности в Rust идут в не совсем нужном направлении. Даже если вы с ним не согласны, предложенный им способ рассмотрения фич языка программирования довольно полезен.
И продолжения:
Patterns & Abstractions
Const as an auto trait
The registers of Rust
Лодочник рассматривает существующие эффекты в Rust (асинхронность, итерирование, ошибочность) с точки зрения регистров (не процессорных, а в том смысле, в котором это слово используется в социолингвистике) и довольно аргументированно доказывает, что усилия по развитию асинхронности в Rust идут в не совсем нужном направлении. Даже если вы с ним не согласны, предложенный им способ рассмотрения фич языка программирования довольно полезен.
И продолжения:
Patterns & Abstractions
Const as an auto trait
Forwarded from Блог*
#prog #rust #rustasync #article
Efficient indexing with Quickwit Rust actor framework
Или немного о том, почему разработчики Quickwit решили реализовать свой акторный фреймворк. Также в тексте есть ссылка на статью Actors with Tokio, которая описывает, как создавать свои акторы, имея асинхронный рантайм, и показывает некоторые частые ошибки при подобном наивном подходе.
Efficient indexing with Quickwit Rust actor framework
Или немного о том, почему разработчики Quickwit решили реализовать свой акторный фреймворк. Также в тексте есть ссылка на статью Actors with Tokio, которая описывает, как создавать свои акторы, имея асинхронный рантайм, и показывает некоторые частые ошибки при подобном наивном подходе.
quickwit.io
Efficient indexing with Quickwit Rust actor framework
At Quickwit, we are building the most cost-efficient search engine for logs and traces. Such an engine typically ingests massive amounts of data while serving a comparatively low number of search queries. Under this workload, most of your CPU is spent on…
Forwarded from Блог*
#prog #rust #rustasync #article
Using Rustlang's Async Tokio Runtime for CPU-Bound Tasks
Да, это возможно и в этом есть смысл. Описываемый подход используется в InfluxDB, а InfluxDB используется в проде.
Using Rustlang's Async Tokio Runtime for CPU-Bound Tasks
Да, это возможно и в этом есть смысл. Описываемый подход используется в InfluxDB, а InfluxDB используется в проде.
InfluxData
%%title%% | InfluxData | InfluxData
This blog post argues that the Tokio runtime at the heart of the Rust async ecosystem is a good choice for CPU-heavy jobs.