Давай программировать стек TCP/IP. Part 2: IPv4 & ICMPv4
Part 1: Ethernet & ARP
На этот раз в нашем TCP/IP стеке в пространстве пользователя мы реализуем минимально жизнеспособный IP-уровень и протестируем его с помощью ICMP-запросов эхо (известных также как ping).
Мы рассмотрим форматы IPv4 и ICMPv4 и опишем, как проверять их целостность. Некоторые функции, такие как фрагментация IP, оставлены в качестве упражнения для читателя.
Для нашего сетевого стека был выбран IPv4 вместо IPv6, так как он до сих пор является основным сетевым протоколом Интернета. Однако это быстро меняется, и наш стек можно будет расширить поддержкой IPv6 в будущем.
Internet Checksum
Поле интернет-контрольной суммы используется для проверки целостности IP-дейтаграммы. Вычисление контрольной суммы относительно простое и определено в оригинальной спецификации:
Поле контрольной суммы представляет собой 16-битное дополнение до единицы суммы всех 16-битных слов в заголовке. Для вычисления контрольной суммы значение этого поля принимается равным нулю.
Фактический код для алгоритма выглядит следующим образом:
uint16_t checksum(void *addr, int count)
{
/* Compute Internet Checksum for "count" bytes
* beginning at location "addr".
* Taken from https://tools.ietf.org/html/rfc1071
*/
register uint32_t sum = 0;
uint16_t * ptr = addr;
while( count > 1 ) {
/* This is the inner loop */
sum += * ptr++;
count -= 2;
}
/* Add left-over byte, if any */
if( count > 0 )
sum += * (uint8_t *) ptr;
/* Fold 32-bit sum to 16 bits */
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
return ~sum;
}
Пишем отладчик для Linux
Part 1: Setup
https://blog.tartanllama.xyz/writing-a-linux-debugger-setup/
Part 2: Breakpoints
https://blog.tartanllama.xyz/writing-a-linux-debugger-breakpoints/
Part 3: Registers and memory
https://blog.tartanllama.xyz/writing-a-linux-debugger-registers/
Part 4: Elves and dwarves
https://blog.tartanllama.xyz/writing-a-linux-debugger-elf-dwarf/
Part 5: Source and signals
https://blog.tartanllama.xyz/writing-a-linux-debugger-source-signal/
Part 6: Source-level stepping
https://blog.tartanllama.xyz/writing-a-linux-debugger-dwarf-step/
Part 7: Source-level breakpoints
https://blog.tartanllama.xyz/writing-a-linux-debugger-source-break/
Part 8: Stack unwinding
https://blog.tartanllama.xyz/writing-a-linux-debugger-unwinding/
Part 9: Handling variables
https://blog.tartanllama.xyz/writing-a-linux-debugger-variables/
Part 10: Advanced topics
https://blog.tartanllama.xyz/writing-a-linux-debugger-advanced-topics/
#cpp #programming
👉 @cpp_lib
Учебник по Тетрису на C++, платформенно-независимый, с акцентом на игровую логику для начинающих
Мы собираемся узнать, как с нуля создать клон Тетриса, используя простой и чистый C++.
И это займет у вас меньше часа! Это идеальный урок для начинающих.
https://javilop.com/gamedev/tetris-tutorial-in-c-platform-independent-focused-in-game-logic-for-beginners/
#cpp #programming
👉 @cpp_lib
Пишем собственную виртуальную машину
В этом руководстве я научу вас, как написать собственную виртуальную машину (VM), которая сможет выполнять программы на языке ассемблера, такие как игра моего друга "2048" или мой Roguelike. Если вы умеете программировать, но хотите лучше понять, что происходит внутри компьютера, и глубже разобраться, как работают языки программирования, то этот проект для вас. Написание собственной виртуальной машины может показаться сложной задачей, но я обещаю, что вы найдете это удивительно простым и познавательным.
Конечный код занимает около 250 строк на C (unix, windows). Все, что вам нужно знать, — это как читать базовый C или C++ и выполнять двоичную арифметику.
https://justinmeiners.github.io/lc3-vm/
#cpp #programming
👉 @cpp_lib
Самый быстрый и безопасный PNG декодер в мире
TL;DR: декодер изображений PNG из стандартной библиотеки языка программирования Wuffs работает в 1.22–2.75 раза быстрее, чем libpng (широко используемая реализация PNG декодера на C с открытым исходным кодом), C-библиотеки libspng, lodepng и stb_image, а также самые популярные библиотеки для работы с PNG на Go и Rust.
Декодирование PNG с помощью Wuffs обсуждалось на Hacker News №1, Hacker News №2, /r/programming, /r/rust и lobste.rs.
https://habr.com/ru/articles/751462/
#cpp #programming
👉 @cpp_lib
Создаем свой собственный Lisp
Если вы хотите изучить язык C или когда-либо задумывались о том, как создать свой собственный язык программирования, эта книга для вас.
Всего за несколько строк кода я научу вас использовать C, и вместе мы начнем создавать ваш собственный язык.
По пути мы узнаем о странной и удивительной природе Lisp, как развивать реальный проект, лаконично решать задачи и писать красивый код!
Эту книгу можно бесплатно прочитать онлайн, так что вы можете начать прямо сейчас! Но для тех, кто хочет выразить свою поддержку или получить лучший опыт чтения, книга также доступна для покупки в печатном формате или недорого в основных электронных форматах.
https://www.buildyourownlisp.com/contents
#cpp #programming
👉 @cpp_lib
Контейнеры Linux в 500 строках кода
Я уже много лет прямо или косвенно использую контейнеры Linux, но мне хотелось познакомиться с ними поближе. Поэтому я написал немного кода. Раньше это было 500 строк кода, клянусь, но я немного изменил его с момента публикации; в итоге получилось примерно на 70 строк больше.
Статья объясняет, как работают Linux-контейнеры, показывая минимальную реализацию на 500 строках кода. Она рассматривает ключевые концепции, такие как namespaces, cgroups и монтирование файловых систем, и даёт простое, но функциональное представление о механике, которая лежит в основе контейнеров, например, Docker. Основная цель — дать читателю ясное и практическое введение в то, как работают контейнеры на базовом уровне.
https://blog.lizzie.io/linux-containers-in-500-loc.html
#cpp #programming
👉 @cpp_lib
Создаём эмулятор CHIP-8 [C++]
Я всегда любил эмуляторы, потому что они позволяют мне играть в старые игры, которые нравились мне в детстве, поэтому я подумал, что было бы интересно узнать, как они работают, и как собрать такой эмулятор. Моя настоящая цель - создать эмулятор NES, но после некоторых исследований я решил прислушаться к советам интернета и начать с создания эмулятора для гораздо менее сложной CHIP-8. Это хорошая ступенька для перехода к NES.
https://austinmorlan.com/posts/chip8_emulator/
#cpp #programming
👉 @cpp_lib
Самые быстрые мьютексы
Cosmopolitan Libc хорошо известна своим «полиглотным жирным бинарным» хаком, который позволяем исполняемым файлам запускаться на шести операционных системах для AMD64/ARM64. Вас может удивить, что при этом она может быть лучшей С‑библиотекой для вашего продакшена. Чтобы продемонстрировать это, давайте сравним библиотеку мьютексов Cosmo с другими платформами.
Мы напишем простой тест, который создает 30 потоков, увеличивающих одно и то же число 100 000 раз. Это поможет проверить, насколько хорошо реализация мьютексов справляется с задачей при интенсивном использовании. По сути он будет следующим (см. сегмент внизу статьи для полного исходного кода).
int g_chores;
pthread_mutex_t g_locker = PTHREAD_MUTEX_INITIALIZER;
void *worker(void *arg) {
for (int i = 0; i < ITERATIONS; ++i) {
pthread_mutex_lock(&g_locker);
++g_chores;
pthread_mutex_unlock(&g_locker);
}
return 0;
}
Подборка Telegram каналов для программистов
Системное администрирование 📌
/channel/sysadmin_girl Девочка Сисадмин
/channel/srv_admin_linux Админские угодья
/channel/linux_srv Типичный Сисадмин
/channel/devops_star DevOps Star (Звезда Девопса)
/channel/i_linux Системный администратор
/channel/linuxchmod Linux
/channel/sys_adminos Системный Администратор
/channel/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
/channel/sysadminof Книги для админов, полезные материалы
/channel/i_odmin Все для системного администратора
/channel/i_odmin_book Библиотека Системного Администратора
/channel/i_odmin_chat Чат системных администраторов
/channel/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
/channel/sysadminoff Новости Линукс Linux
1C разработка 📌
/channel/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
/channel/cpp_lib Библиотека C/C++ разработчика
/channel/cpp_knigi Книги для программистов C/C++
/channel/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
/channel/pythonofff Python академия. Учи Python быстро и легко🐍
/channel/BookPython Библиотека Python разработчика
/channel/python_real Python подборки на русском и английском
/channel/python_360 Книги по Python Rus
Java разработка 📌
/channel/BookJava Библиотека Java разработчика
/channel/java_360 Книги по Java Rus
/channel/java_geek Учим Java на примерах
GitHub Сообщество 📌
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
/channel/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
/channel/developer_mobila Мобильная разработка
/channel/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
/channel/frontend_1 Подборки для frontend разработчиков
/channel/frontend_sovet Frontend советы, примеры и практика!
/channel/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
/channel/game_devv Все о разработке игр
Библиотеки 📌
/channel/book_for_dev Книги для программистов Rus
/channel/programmist_of Книги по программированию
/channel/proglb Библиотека программиста
/channel/bfbook Книги для программистов
/channel/books_reserv Книги для программистов
БигДата, машинное обучение 📌
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
/channel/bookflow Лекции, видеоуроки, доклады с IT конференций
/channel/coddy_academy Полезные советы по программированию
/channel/rust_lib Полезный контент по программированию на Rust
/channel/golang_lib Библиотека Go (Golang) разработчика
/channel/itmozg Программисты, дизайнеры, новости из мира IT
/channel/php_lib Библиотека PHP программиста 👨🏼💻👩💻
/channel/nodejs_lib Подборки по Node js и все что с ним связано
/channel/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 📌
/channel/thehaking Канал о кибербезопасности
/channel/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
/channel/ux_web Статьи, книги для дизайнеров
Английский 📌
/channel/UchuEnglish Английский с нуля
Математика 📌
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
/channel/Excel_lifehack
/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)
Вакансии 📌
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
Хотите узнать, как превратить массив в пирамиду и ускорить сортировку данных?
Ждем вас на бесплатном вебинаре 14 октября в 20:00 мск, где мы разберем:
- как реализовать алгоритм сортировки выбором с линейной сложностью;
- как превратить массив в пирамиду (кучу) для быстрого доступа к максимальному элементу;
- как создать алгоритм пирамидальной сортировки с квазилинейной сложностью — О(N log N);
- визуальные примеры работы алгоритма на конкретных числах.
🚀 Спикер Евгений Волосатов — программист баз данных и преподаватель с огромным и разнообразным опытом, автор статей и учебных программ по C#, Java, PHP.
Встречаемся в преддверии старта курса «Алгоритмы и структуры данных». Все участники вебинара получат специальную цену на обучение!
🔴 Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cChlzgРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Написание минимального JIT-компилятора для x86-64 на C++
В этой статье я покажу, как написать минимальный, базовый JIT-компилятор для x86-64 на C++, который работает на macOS, Linux и потенциально может работать на Windows через WSL.
Для наших целей JIT-компиляция — это техника, с помощью которой программа генерирует машинный код во время выполнения, основываясь на вводе пользователя. Программа на C++ компилируется заранее (AOT, ahead of time), что обычно означает, что после того, как исходный код был скомпилирован для конкретной машины, его нельзя изменить во время выполнения (и с точки зрения безопасности это желаемая функция). Простое и полезное применение JIT-компилятора на C++ — это компиляция новой функции на лету, основанной на других функциях, уже определенных в исходном коде.
1 // hello_0.cpp
2 #include <iostream>
3 #include <string>
4
5 int main() {
6 // Get the user name
7 std::string name;
8 std::cout << "What is your name?\n";
9 std::getline(std::cin, name);
10 std::string hello_name = "Hello, " + name + "!\n";
11
12 // Greet the user
13 std::cout << hello_name;
14 }
Memory Allocators 101 - пишем простой аллокатор памяти
Эта статья посвящена написанию простого аллокатора памяти на языке C.
Мы реализуем malloc()
, calloc()
, realloc()
и free()
.
Это статья для начинающих, поэтому я не буду описывать все детали.
Этот аллокатор памяти не будет быстрым и эффективным, мы не будем подстраивать выделяемую память под границу страницы, но мы создадим работающий аллокатор памяти. Вот и все.
https://arjunsreedharan.org/post/148675821737/memory-allocators-101-write-a-simple-memory
#cpp #programming
👉 @cpp_lib
Захват переменных без ошибок — это возможно!
Как? Расскажем на бесплатном вебинаре Слёрма «Ля какие! Лямбды в С++».
Поговорим про:
📍 Захваты переменных, параметры, возвращаемые значения, типы замыканий.
📍 Лямбды в C++20 и C++23.
📍 Применение в реальных задачах: передача функций в алгоритмы STL, написание компактных колбэков
Спикер: Юрий Вашинко, Tech Lead/Lead Developer
📆 Когда: 15 октября в 14:00 мск
🔗 Занять место на вебинаре — через бота
Приходите!
#реклама
О рекламодателе
erid: LjN8KDTvY
Обнаружен короткий путь к офферу Сбера! 🕵️♀️
12 октября приглашаем на One Day Offer Центра квантовых технологий для С++ разработчиков.
Команда создаёт квантовый компьютер и фотонные сопроцессоры для решения задач Сбера: от AI до оптимизации логистических процессов. Разработки Центра позволят оптимизировать логистические цепочки, обучать нейросети большего размера и увеличивать доходность инвестирования.
Чем предстоит заниматься:
✔️ Проектировать архитектуру ПО для обработки и передачи данных.
✔️ Писать код на C++ для управления и контроля квантового компьютера.
✔️ Разрабатывать первичную инфраструктуру CI/CD и автоматическое тестирование для своего кода.
✔️ Участвовать в разработке общей архитектуры квантовых и аналоговых процессоров.
✔️ Участвовать в переносе задач потребителей на квантовые или аналоговые процессоры.
Регистрируйся и создавай решения на стыке науки и технологий вместе со Сбером! 😏
Давай программировать стек TCP/IP. Part 1: Ethernet & ARP
Написание собственного стека TCP/IP может показаться сложной задачей. Действительно, за более чем тридцать лет существования TCP накопилось множество спецификаций. Однако основная спецификация на удивление компактна — важные части включают разбор заголовков TCP, автомат конечных состояний, контроль перегрузок и вычисление времени ожидания повторной передачи.
Наиболее распространенные протоколы второго и третьего уровней — Ethernet и IP, соответственно, — в сравнении с TCP гораздо проще. В этой серии статей мы реализуем минимальный стек TCP/IP в пространстве пользователя для Linux.
Цель этих публикаций и создаваемого ПО исключительно образовательная — углубленное изучение сетевого и системного программирования.
TUN/TAP устройства
Чтобы перехватывать сетевой трафик низкого уровня из ядра Linux, мы будем использовать TAP-устройство Linux. Если кратко, TUN/TAP устройства часто применяются приложениями в пространстве пользователя для работы с трафиком на уровне L3 и L2 соответственно. Популярным примером является туннелирование, когда пакет инкапсулируется внутри полезной нагрузки другого пакета.
Преимущество TUN/TAP устройств в том, что их легко настроить в программе в пространстве пользователя, и они уже используются во множестве программ, таких как OpenVPN.
Поскольку мы хотим строить стек сетевого взаимодействия, начиная со второго уровня, нам потребуется TAP-устройство. Мы создаем его следующим образом:
/*
* Taken from Kernel Documentation/networking/tuntap.txt
*/
int tun_alloc(char *dev)
{
struct ifreq ifr;
int fd, err;
if( (fd = open("/dev/net/tap", O_RDWR)) < 0 ) {
print_error("Cannot open TUN/TAP dev");
exit(1);
}
CLEAR(ifr);
/* Flags: IFF_TUN - TUN device (no Ethernet headers)
* IFF_TAP - TAP device
*
* IFF_NO_PI - Do not provide packet information
*/
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
if( *dev ) {
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
}
if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){
print_error("ERR: Could not ioctl tun: %s\n", strerror(errno));
close(fd);
return err;
}
strcpy(dev, ifr.ifr_name);
return fd;
}
Подборка Telegram каналов для программистов
Системное администрирование 📌
/channel/sysadmin_girl Девочка Сисадмин
/channel/srv_admin_linux Админские угодья
/channel/linux_srv Типичный Сисадмин
/channel/devops_star DevOps Star (Звезда Девопса)
/channel/i_linux Системный администратор
/channel/linuxchmod Linux
/channel/sys_adminos Системный Администратор
/channel/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
/channel/sysadminof Книги для админов, полезные материалы
/channel/i_odmin Все для системного администратора
/channel/i_odmin_book Библиотека Системного Администратора
/channel/i_odmin_chat Чат системных администраторов
/channel/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
/channel/sysadminoff Новости Линукс Linux
1C разработка 📌
/channel/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
/channel/cpp_lib Библиотека C/C++ разработчика
/channel/cpp_knigi Книги для программистов C/C++
/channel/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
/channel/pythonofff Python академия. Учи Python быстро и легко🐍
/channel/BookPython Библиотека Python разработчика
/channel/python_real Python подборки на русском и английском
/channel/python_360 Книги по Python Rus
Java разработка 📌
/channel/BookJava Библиотека Java разработчика
/channel/java_360 Книги по Java Rus
/channel/java_geek Учим Java на примерах
GitHub Сообщество 📌
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
/channel/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
/channel/developer_mobila Мобильная разработка
/channel/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
/channel/frontend_1 Подборки для frontend разработчиков
/channel/frontend_sovet Frontend советы, примеры и практика!
/channel/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
/channel/game_devv Все о разработке игр
Библиотеки 📌
/channel/book_for_dev Книги для программистов Rus
/channel/programmist_of Книги по программированию
/channel/proglb Библиотека программиста
/channel/bfbook Книги для программистов
/channel/books_reserv Книги для программистов
БигДата, машинное обучение 📌
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
/channel/bookflow Лекции, видеоуроки, доклады с IT конференций
/channel/coddy_academy Полезные советы по программированию
/channel/rust_lib Полезный контент по программированию на Rust
/channel/golang_lib Библиотека Go (Golang) разработчика
/channel/itmozg Программисты, дизайнеры, новости из мира IT
/channel/php_lib Библиотека PHP программиста 👨🏼💻👩💻
/channel/nodejs_lib Подборки по Node js и все что с ним связано
/channel/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 📌
/channel/thehaking Канал о кибербезопасности
/channel/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
/channel/ux_web Статьи, книги для дизайнеров
Английский 📌
/channel/UchuEnglish Английский с нуля
Математика 📌
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
/channel/Excel_lifehack
/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)
Вакансии 📌
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
Как читать язык ассемблера
Зачем кому-то нужно изучать язык ассемблера? Во-первых, чтение языка ассемблера - это способ узнать, что именно делает ваша программа. Почему именно эта программа на Си++ занимает 1 Мб (скажем), а не 100 Кб? Можно ли выжать еще немного производительности из той функции, которая постоянно вызывается?
В частности, для языка Си++ легко забыть или просто не заметить какую-либо операцию (например, неявное преобразование или вызов конструктора или деструктора копирования), которая подразумевается исходным кодом и семантикой языка, но не прописана в явном виде. Если посмотреть на ассемблер, сгенерированный компилятором, то все будет на виду.
https://wolchok.org/posts/how-to-read-assembly-language/
#cpp #programming
👉 @cpp_lib
Возможности для молодых людей в «Алабуге»
В особой экономической зоне «Алабуга» активно развивается лидерская программа «100 Лидеров». В ней могут поучаствовать молодые специалисты от 19 до 29 лет.
У участников есть возможность познакомиться с топ-менеджерами компании, поиграть в бизнес-игры, пройти собеседования с реальным шансом трудоустройства в компанию «Алабуга».
Питание и проживание за счет компании.
Работа в «Алабуге» - это зарплата от 78 до 200 тысяч рублей и участие в реализации проектов мирового уровня.
Следующий поток - с 28 по 31 октября!
Заявку можно подать на сайте.
Бесплатное IT-образование в 2024
Отобрали для вас полезные телеграм-каналы, которые помогут освоить программирование и другие IT-направления
Выбирайте нужное и подписывайтесь:
👩💻 С/С++: @Cpportal
📱 GitHub: @git_developer
🤓 Книги айти: @portalToIT
⚙️ Backend: @BackendPortal
👩💻 Frontend: @FrontendPortal
👩💻 Python: @PythonPortal
👩💻 Java: @Java_Iibrary
👩💻 C#: @KodBlog
🖥 Базы Данных & SQL: @SQL
👩💻 Golang: @juniorGolang
👩💻 PHP: @PHPortal
👩💻 Моб. разработка: @MobDev
👩💻 Разработка игр: @GameDevgx
👩💻 DevOps: @loose_code
🖥 Data Science: @DataSciencegx
🤔 Хакинг & ИБ: @cybersecinform
🐞 Тестирование: @QAPortal
📱 Маркетинг: @MarketingPortal
🖥 Дизайн: @PortalToDesign
➡️ Сохраняйте себе, чтобы не потерять
Яндекс запускает новый сезон Тренировок по алгоритмам!
Для участников доступно новое направление: машинное обучение. Тренировки проходят формате онлайн-интенсивов с лекциями, разбором домашек и наградами для лучших участников.
По окончании тренировок, участников ждет сертификат о прохождении: решенные задачи после курса можно добавить к себе в портфолио.
А лучших учеников ждет:
— Пробное техническое собеседование в Яндекс
Успешное интервью могут засчитать при отборе на стажировку
— Промокод 3000 ₽ на Яндекс Маркет
Не упускай возможность прокачать харды и скилл прохождения собеседований в IT. Зарегистрироваться можно тут.
🔥 Weekend Offer Backend в Яндекс 26–27 октября
Устройтесь backend-разработчиком в Яндекс онлайн за одни выходные.
↔️ К участию приглашаем разработчиков на C++, Python, Go, Java или Kotlin, с опытом коммерческой разработки от трёх лет, которые готовы работать в офисном или гибридном режиме на территории России или Республики Беларусь.
🛐План простой: зарегистрируйтесь и до 23 октября решите пару задачек в Контесте, 26 октября пройдите два технических собеседования, а 27 октября получите офер.
🔛В Weekend Offer Backend участвуют разные сервисы: Финтех, HR-Tech, Образование, МВА, Биллинг, Геосервисы, Реклама, Поисковые сценарии. Чтобы заранее подумать, с кем вам хочется пообщаться 17 октября мы проведем онлайн-встречу в зуме, где команды расскажут о себе и задачах.
🆖 Узнать подробности и принять участие можно здесь.
🌐 Научитесь создавать сетевые сервисы на C++ с помощью фреймворка userver!
Приглашаем вас на открытый вебинар 17 октября в 20:00 МСК, где мы подробно разберем:
- Как подключить userver в проект;
- Как собрать userver с нужной конфигурацией;
- Как написать сетевой сервис, работающий с REST и WebSocket API;
- Как реализовать аутентификацию для нового сервиса.
🎓 Встречаемся в преддверии старта курса «C++ Developer. Professional». Все участники вебинара получат специальную цену на обучение!
🔗 Регистрируйтесь прямо сейчас, чтобы не пропустить это важное мероприятие: https://otus.pw/Dtoo/?erid=2VtzqxPykF5
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Туториал - Пишем оболочку на C
Легко считать себя "не настоящим программистом". Существуют программы, которые используют все, и легко возвести их разработчиков на пьедестал. Хотя разработка крупных программных проектов непроста, зачастую основная идея такого ПО довольно проста. Реализовать ее самому — это увлекательный способ доказать, что у тебя есть всё необходимое, чтобы быть настоящим программистом. Поэтому это руководство о том, как я написал свою упрощенную Unix-оболочку на C, в надежде, что это заставит других почувствовать то же самое.
Код описанной здесь, получившей название lsh, доступен на GitHub.
#define LSH_RL_BUFSIZE 1024
char *lsh_read_line(void)
{
int bufsize = LSH_RL_BUFSIZE;
int position = 0;
char *buffer = malloc(sizeof(char) * bufsize);
int c;
if (!buffer) {
fprintf(stderr, "lsh: allocation error\n");
exit(EXIT_FAILURE);
}
while (1) {
// Read a character
c = getchar();
// If we hit EOF, replace it with a null character and return.
if (c == EOF || c == '\n') {
buffer[position] = '\0';
return buffer;
} else {
buffer[position] = c;
}
position++;
// If we have exceeded the buffer, reallocate.
if (position >= bufsize) {
bufsize += LSH_RL_BUFSIZE;
buffer = realloc(buffer, bufsize);
if (!buffer) {
fprintf(stderr, "lsh: allocation error\n");
exit(EXIT_FAILURE);
}
}
}
}
Шеф, всё пропало
Ошибки программистов C++ — это отдельный вид искусства, вроде бы простой язык, но стоит отвлечься на чашечку кофе, как компилятор начинает вываливать простыню ворнингов пополам с ошибками, и иногда это больше похоже на древнеегипетские письмена, чем на нормальный выхлоп. Вы наверное и сами не раз сталкивались с разыменованием nullptr или перепутали (= и ==) по недосмотру. Часто причиной ошибкой является лень или невнимательность, или усталость - не зря появились суеверия "не комитить в пятницу вечером", "не кодить в состоянии изменного сознания" или "избегать кода под кофейным угаром", ну это когда три-четыре кружечки кофе навернул и пошел нести добрый код направо и налево.
https://habr.com/ru/articles/848662/
#cpp #programming
👉 @cpp_lib
Написание минимального JIT-компилятора для x86-64 на C++. Часть 2
В моей предыдущей статье я показал, как сгенерировать машинный код для функции во время выполнения, скопировать этот код в часть памяти, помеченную как исполняемую, и вызвать её из C++. Теперь мы пойдём в обратную сторону — вызовем функцию на C++ из функции, сгенерированной во время выполнения. Как и раньше, я предполагаю, что вы пробуете код на Linux или macOS.
Если помните из первой части, мы начали с добавления инструкций машинного кода в std::vector
и копирования этого кода на страницу исполняемой памяти. Хотя этот подход был хорош с дидактической точки зрения, на практике, вероятно, вы захотите записывать код напрямую в исполняемую память. Вот пример, как я предлагаю это сделать:
1 MemoryPages mp;
2 mp.push(0x48); mp.push(0xb8);
☕️ Дмитрий Мезенцев, руководитель службы разработки Поиска рассказывает, как в Яндексе сочетаются атмосфера стартапа и бигтеха и за что он любит продуктовую разработку.
А если после прочтения вам захочется работать с нами — откликайтесь на вакансию!
➡️ Бэкенд-разработчик в команду поисковых сценариев
Шпаргалка по библиотеке fmt
https://hackingcpp.com/cpp/libs/fmt.html
#cpp #programming
👉 @cpp_lib
C++ с точки зрения Rust-разработчика: достоинства и недостатки
Я профессионально программирую на Rust и, признаться, немного этот язык продвигаю. Поэтому можете себе представить глубину моего расстройства, когда моя младшая сестрёнка, почти не умеющая программировать, обратилась ко мне и попросила научить её C++. Я попытался её отговорить, сказав, что однажды она будет сидеть за отладкой ошибок сегментирования, вооружившись Valgrind и вспоминать этот наш разговор, размышляя, где же она свернула не туда. Но она оказалась ещё упрямее меня и настаивала: хочу выучить язык программирования, которым действительно пользуются люди.
https://habr.com/ru/articles/844988/
#cpp #programming
👉 @cpp_lib
Просто не копируй это
То, о чем я собираюсь рассказать в статье настолько тривиально, что любой, даже начинающий, разработчик уже это знает - я правда очень на это надеюсь. Тем не менее, приходящий на ревью код, показывает, что люди как делали, так и продолжают делать что-то подобное:
bool LoadAnimation(str::string filename);
void DrawLines(std::vector<Points> path);
Matrix RotateObject(Matrix m, Angle angle);
int DrawSprite(Sprite sprite);