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.