В этой статье я расскажу об одном из вариантов каррирования и частичного применения функций в любимом мною C++, покажу свою экспериментальную реализацию сего действа и объясню без математики, на пальцах, что такое вообще каррирование и что же под капотом у kari.hpp, с помощью которой мы и будем каррировать функции. Ну и как тут принято: заинтересовавшихся — прошу под кат.
Rust developer
Введение в Beautiful Capi, инструмент создания С++ оберток для С++ библиотек
Beautiful Capi — это инструмент облегчающий создание динамических библиотек на языке С++ с внешним интерфейсом на языке Си. Данный инструмент генерирует также С++ обертки для этого Си интерфейса. Beautiful Capi написан на языке Python 3.
Основная головная боль разработчиков библиотек на С++ в отсутствии единого стандарта ABI. Различные компиляторы имеют разный ABI, соглашения о именовании, схемах перехвата исключений и т.д. Поэтому программистам на С++ приходится каждый раз брать исходники библиотеки и собирать ее при помощи нужного компилятора.
Это хорошо, если библиотека популярная, и для нее добрый дядя уже выложил бинарные файлы для большинства компиляторов С++. Опять таки, для большинства компиляторов. Компиляторов С++ достаточно много, и, если учитывать разные версии одного и того же компилятора, имеющими несовместимый ABI, то вероятность того, что уже собранная библиотека вам не подойдет — достаточно высока. Плюс, добавим к этому различные настройки компиляторов, влияющие на двоичную совместимость.
Асинхронность 3: Субъекторная модель

Предисловие
Эта статья является продолжением цикла статей про асинхронность:
Спустя 3 года я решил расширить и обобщить имеющийся спектр асинхронного взаимодействия с использованием сопрограмм. Помимо этих статей также рекомендуется ознакомиться с универсальным адаптером:
Введение
Рассмотрим электрон. Что он из себя представляет? Отрицательно заряженная элементарная частица, лептон, обладающий некоторой массой. Это означает, что он может участвовать по меньшей мере в электромагнитных и гравитационных взаимодействиях.
Три ошибки iOS-разработчика, которые могут дорого стоить

Создание iOS-приложения – непростая задача. Разработчикам хочется как можно быстрее завершить этот процесс и наконец запуститься в AppStore. Но на этом все не заканчивается: впереди у создателей долгие годы исправления ошибок, улучшения функций и совместной работы с другими разработчиками. Мы бы хотели немного облегчить им жизнь и для этого решили разобрать три вещи, которые нужно избегать при iOS-разработке (спасибо Envato Tuts+ за информацию).
Обзор дефектов кода музыкального софта. Часть 3. Rosegarden

Программы для работы с музыкой имеют маленький объём кода и, поначалу, я сомневался в возможности находить достаточное количество ошибок для статей. Тематику музыкального софта всё равно хотелось затронуть, поэтому я был готов объединять несколько проектов в статье. И вот я пишу уже третью статью, стараясь хоть как-то вместить интересные ошибки в одну статью. Третьим проектом для анализа выбран MIDI-секвенсор и нотный редактор — Rosegarden. Внимание! Прочтение статьи вызывает «Facepalm»!
Профилирование кода на C/С++ в *nix-системах

Александр Алексеев (Postgres Professional)
Отличный обзорный доклад конференции HighLoad++ 2016 о том, как надо проводить профилирование программного кода. О типичных ошибках, происходящих при измерениях. И, конечно, об инструментах:
— gettimeofday
— strace, ltrace, truss
— gprof
— gdb / lldb
— perf
— pmcstat
— SystemTap
— DTrace
— HeapTrack
— BPF / bcc

В начале у меня будет не слишком техническая часть, о том, как не надо делать benchmark’и.
Я наблюдаю, что люди часто делают типичные ошибки, когда делают benchmark’и. И вот первая из них…
Как проверить, находится ли значение указателя в заданной области памяти
byte* regionStart;
size_t regionSize;
Требуется проверить, находится ли значение указателя в пределах этого диапазона. Возможно, вашим первым побуждением будет написать так:
if (p >= regionStart && p < regionStart + regionSize)
Но гарантирует ли стандарт ожидаемое поведение этого кода?
OpenShift.IO: all-in-one платформа для разработки и CI/CD
Универсальный адаптер
Предисловие
Данная статья является авторским переводом с английского собственной статьи под названием God Adapter. Вы также можете посмотреть видео выступления с конференции C++ Russia.
1 Аннотация
В статье представлен специальный адаптер, который позволяет оборачивать любой объект в другой с дополнением необходимой функциональности. Адаптированные объекты имеют один и тот же интерфейс, поэтому они полностью прозрачны с точки зрения использования. Будет последовательно введена общая концепция, использующая простые, но мощные и интересные примеры.
2 Введение
ПРЕДУПРЕЖДЕНИЕ. Почти все методы, указанные в статье, содержат грязные хаки и ненормальное использование языка C++. Так что, если вы не толерантны к таким извращениям, пожалуйста, не читайте эту статью.
Термин универсальный адаптер происходит от возможности универсальным образом добавить необходимое поведение для любого объекта.
Моноиды, полугруппы и все-все-все
Если ты на практике используешь ООП, то хорошо разбираешься в таких вещах, как «паттерны проектирования». А знаешь ли ты, что есть множество полезных паттернов, которые не укладываются в этот стандартный список? К сожалению, многие из них связаны с «функциональным программированием», которое, согласно легенде, сложное и заумное. Если десять раз сказать слово «моноид», можно вызвать Дьявола.
Mark Seeman расскажет о функциональном программировании просто и быстро. Для этого он начал писать цикл статей, посвященных связи между паттернами проектирования и теорией категорий. Любой ООПшник, у которого есть 15 минут свободного времени, сможет заполучить в свои руки принципиально новый набор идей и инсайтов, касающихся не только функциональщины, но и правильного объектно-ориентированного дизайна. Решающим фактором является то, что все примеры — это реальный код на C#, F# и Haskell. Этот хабрапост — перевод самого начала цикла, первых трех статей, слитых воедино для удобства понимания.
Кроме того, с Марком можно пообщаться вживую, посетив конференцию DotNext 2017 Moscow, которая состоится 12-13 ноября 2017 г. в Москве, в «Славянская Рэдиссон». Марк прочитает доклад на тему «From dependency injection to dependency rejection». Билеты можно взять здесь.
Послевкусие от Kotlin, часть 3. Корутины — делим процессорное время

Java позволяет писать последовательный, параллельный и асинхронный код. Асинхронный — это когда регистрируется callback, который запустится после какого-либо события (например, файл прочитан). Это позволяет избежать блокировки потока, но ломает последовательность выполнения, так что на java пишут такой код скорее когда нет других вариантов. Kotlin даёт решение — корутины, с ними асинхронный код выглядит почти так же, как последовательный.
По корутинам мало статей. Конкретных примеров, показывающих их преимущества — ещё меньше.
Что нашёл:
- Избавление от callback hell. Актуально для UI
- Понравились концепции channels и actors. Они не новы, можно и без них, но для event систем должны очень хорошо подойти
- Совет от Романа Елизарова: «Корутины нужны для асинхронных задач, которые ожидают чего-либо большую часть времени»
Последнее интересно — большинство enterprise приложений всё время что-нибудь ждут: БД, другие приложения, изредка и файл нужно прочесть. И всё это может быть полностью асинхронным, а значит всё приложение можно перевести на асинхронную обработку запросов.
Итак, посмотрим как ведут себя корутины под нагрузкой.
Математические основы биткойн-блокчейна
Благодаря этому система функционирует в условиях полного отсутствия доверия между участниками сети, исключая воздействие человеческого фактора.
Поэтому в сегодняшней статье мы бы хотели поговорить о математических основах биткойн-блокчейна — эллиптических кривых, ECDSA и ключах.

Вечные студенты: когда программирование — это постоянная «учеба»

Самые неординарные языки программирования

Признаться честно единственная моя связь с программированием в том, что мой брат программист, ну еще я в школе учил Pascal. Однако, я полностью осознаю всю сложность и красоту программирования. Создать программу, код которой не будет содержать «мусора», достойно похвалы. Что уж говорить о создании самого языка, на котором и пишутся программы. Проще говоря — это сложно, чертовски сложно. И, значит, это должно быть обдуманно и нести какой-то смысл. Но не всегда. Сегодня мы с вами вместе приподнимем брови в удивлении, ознакомившись с самыми нелепыми и смешными языками программирования. Поехали.
Любите статический анализ кода
Весь веб на 60+ FPS: как новый рендерер в Firefox избавился от рывков и подтормаживаний
Но есть ещё одна большая часть технологии Servo, которая пока не вошла в состав Firefox Quantum, но скоро войдёт. Это WebRender, часть проекта Quantum Render.

WebRender известен своей исключительной скоростью. Но главная задача — не ускорить рендеринг, а сделать его более плавным.
При разработке WebRender мы поставили задачу, чтобы все приложения работали на 60 кадрах в секунду (FPS) или лучше, независимо от размера дисплея или от размера анимации. И это сработало. Страницы, которые пыхтят на 15 FPS в Chrome или нынешнем Firefox, летают на 60 FPS при запуске WebRender.
Как WebRender делает это? Он фундаментальным образом меняет принцип работы движка рендеринга, делая его более похожим на движок 3D-игры.
Выпуск Rust 1.21
Команда Rust рада представить выпуск Rust 1.21.0. Rust — это системный язык программирования, нацеленный на скорость, безопасность и параллельное выполнение кода.
Если у вас установлена предыдущая версия Rust, для обновления достаточно выполнить:
$ rustup update stable
Если же у вас еще не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.21.0 можно ознакомиться на GitHub.
Что вошло в стабильную версию 1.21.0
Этот выпуск содержит несколько небольших, но полезных изменений языка и новую документацию.
Первое изменение касается литералов. Рассмотрим код:
let x = &5;
В Rust он аналогичен следующему:
let _x = 5;
let x = &_x;
То есть 5
будет положено в стек или возможно в регистры, а x
будет ссылкой на него.
Однако, учитывая, что речь идет о целочисленном литерале, нет причин делать значение таким локальным. Представьте, что у нас есть функция, принимающая 'static
аргумент вроде std::thread::spawn
. Тогда вы бы могли использовать x
так:
use std::thread;
fn main() {
let x = &5;
thread::spawn(move || {
println!("{}", x);
});
}
C++17
Язык C++ постоянно развивается, и нам как разработчикам статического анализатора важно следить за всеми изменениями, чтобы поддерживать все новые возможности языка. В этой обзорной статье я хотел бы поделиться с читателем наиболее интересными нововведениями, появившимися в C++17, а также продемонстрировать их на примерах.
[CppCon 2017] Matt Godbolt: Что мой компилятор сделал для меня?
Продолжение цикла обзорных статей с конференции CppCon 2017.
- Бьёрн Страуструп: Изучение и преподавание современного C++
- Ларс Кнолл: C++ фреймворк Qt: История, Настоящее и Будущее
- Herb Sutter: Метапрограммирование и кодогенерация в C++
- Matt Godbolt: Что мой компилятор сделал для меня?
На этот раз очень интересное выступление от автора Compiler Explorer (godbolt.org). Обязательно читать всем, кто для быстроты умножает на 2 с помощью сдвига (по крайней мере, на x86-64). Если вы знакомы с ассемблером x86-64, то можете перемотать до разделов с примерами ("Умножение", "Деление" и т.д). Далее слова автора. Мои комментарии в квадратных скобках курсивом.
Моя цель сделать так, чтобы вы не боялись ассемблер, это полезная вещь. И использовали его. Не обязательно все время. И я не говорю, что вы должны все бросить и учить ассемблер. Но вы должны уметь просмотреть результат работы компилятора. И когда вы это сделаете, то оцените, как много работы проделал компилятор, и какой он умный.
GoToChain: как школьники блокчейн в деревне писали
Был жаркий август. Шла очередная летняя школа. На направлении функционального программирования все было неспокойно: вместо пота с нас капали монады, и в небе пролетала хмурая тень Coq-а.
Школа проходила вполне обычно, как и все детские лагеря. После накоживания чисел Пеано на Хаскелле мы пилили компиляторы и интерпретаторы разных сортов и размеров (от самопального до LLVM), писали своё ядро на Rust и обсуждали теорию групп, проводя аналогии с лёгкими французскими романами в общем, было задорно.
А ещё у нас был хакатон. Одна из команд, вдохновившись Zeitgeist и партнёрскими спиннерами, взялась за разработку системы проведения конкурсов и обработки решений с помощью смарт-контрактов, запланировав несколько идей применения блокчейна для сообщества вокруг школы. Какие инновации из этого вышли — под катом.
Information
- Rating
- Does not participate
- Date of birth
- Registered
- Activity