Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode

Пробуем контрактное программирование С++20 уже сейчас

Пробуем контрактное программирование С++20 уже сейчас

В С++20 появилось контрактное программирование. На текущий момент ни один компилятор ещё не реализовал поддержку этой возможности.

Но есть способ уже сейчас попробовать использовать контракты из C++20, так как это описано в стандарте.

TL;DR

Есть форк clang, поддерживающий контракты. На его примере я рассказываю как пользоваться контрактами, чтобы как только фича появилась в вашем любимом компиляторе, вы сразу же могли начать её использовать.

Read full post gblog_arrow_right

Установка сертификатов LetsEncript

Установка сертификатов LetsEncript

Можно установить несколько сертификатов для разных доменов. Если по каким то причинам конфиг Nginx не позволяет вычленить домены то в site-avaible нужно поместить временный конфиг, в котором перечислены домены. потом его убрать и всё будет работать

Описание установки тут:

Установка пакетов:

apt-get install software-properties-common
add-apt-repository ppa:certbot/certbot
apt-get update
apt-get install certbot python-certbot-nginx

Затем можно устанавливать сертификат Что бы получить список опций certbot набираем certbot –help

Read full post gblog_arrow_right

Proxy для Telegram

В связи с попытками блокировок Telegram

Проверено на 5 баксовом тарифе DigitalOcean


Создаём proxy пользователя для аутентификации по паролю:

useradd -d /dev/null teleg
passwd teleg

Сразу же закрываем этому пользователю вход по SSH: (ещё лучше всегда менять ssh порт с дефолтного на кастомный)

nano /etc/ssh/sshd_config

#Port 22
Port 4251

Match User teleg
PasswordAuthentication no
Match all

Рестартим ssh:

Read full post gblog_arrow_right

CRTP и двойной статическая полиморфизм C++

CRTP и двойной статическая полиморфизм

Ниже представлен паттерн проектирования на C++, известный как CRTP (Curiously Recurring Template Pattern).

С его помощью реализовать двойной статический полиморфизм. Пример ниже демонстрирует, как можно строить иерархии классов с использованием шаблонов для достижения поведения, похожего на виртуальные функции, но без накладных расходов раннего связывания.

Зачем нужен этот код?

Обычный полиморфизм в C++ реализуется через виртуальные функции и наследование, что приводит к использованию виртуальной таблицы (vtable) и некоторым накладным расходам. Однако иногда нам требуется полиморфизм без этих издержек, особенно если все типы известны на этапе компиляции. Здесь на помощь приходит CRTP — паттерн, при котором класс-наследник передаёт себя как параметр шаблона базовому классу.

Read full post gblog_arrow_right

Haskell

Мои эксперементы с Haskell

Сделал тоже самое что описано в посте про C++

Haskell – классный язык программирования. Но писатьна нём что то в одиночку очень тяжело.

Мой первый Arduino проект

Пару лет назад подарили отцу на день рождения лодочный электромотор и литиевый тяговый аккумулятор к нему. Хорошая вещь, сплошные положительные эмоции от использования. Но, как оказалось, мотор не рассчитан на работу с этим аккумулятором. В том смысле, что индикация уровня заряда на корпусе мотора оказалась совершенно неадекватной.

Решил попробовать сделать необходимый девайс на Arduino.

До этого с микроконтроллерами дела не имел. Оказалось, это совсем не сложно и даже интересно.

Исходники выложил на GitHub: https://github.com/valmat/BatterySensor

Read full post gblog_arrow_right

Определение по списку в C++

В PHP есть возможность присвоить переменным значения, используя массив:

list($a, $b) = array('str1', 'str2');

В Python это выглядит так:

a, b = ['str1', 'str2']

А вот в C++ такой языковой конструкции нет. Но это совершенно не проблема, потому что ее можно сделать самому.

Вот что у меня получилось:

См также Optimized string concatenation: strjoin.cpp

Read full post gblog_arrow_right

Микро-бенчмарк RocksDB server

В полноценном смысле то, что я тут хочу написать, конечно, бенчмарком не является. Но вполне способно дать понимание области применения RocksDB.

RocksDB — это довольно крутое хранилище, являющееся (на данный момент) встраиваемым решением. Главной фишкой RocksDB является то, что она рассчитана на использование на flash-накопителях, то есть на SSD-дисках.

Лично я давно ждал появления таких решений. Поскольку память всё ещё дорогая, а жёсткие диски медленные, использование SSD для хранения данных — очень логичный шаг.

Read full post gblog_arrow_right

Clang vs gcc performance

Стало мне интересно, и решил я провести такую глупую проверку: сравнить производительность программ, откомпилированных Clang’ом и gcc.

Для эксперимента взял первую попавшуюся реализацию пузырьковой сортировки с GitHub’а.

Компилировал с опциями -g, -O1, -O2, -O3 и без опций.

Получилось интересно и неожиданно.

Для запуска тестов использовал такой скрипт:

#!/bin/bash

OPT="-O3"
g++ $OPT bubble.cpp -o bubble1
clang++ $OPT bubble.cpp -o bubble2   # -stdlib=libstdc++
clang++ $OPT -stdlib=libc++ bubble.cpp -o bubble3 # -stdlib=libc++

# ls -slh
# exit;

sleep 3
time ./bubble1 > /dev/null
sleep 3
time ./bubble2 > /dev/null
sleep 3
time ./bubble3 > /dev/null

Меняя параметр OPT.

Read full post gblog_arrow_right

Отчетность в налоговую на Linux

Как я готовлю отчетность в налоговую.

Выписки у меня достаются в таком формате:

  • 2014.01.20.rtf
  • 2014.01.20-1.rtf

В первую очередь, нужно упорядочить по дате, поэтому переименовываем:

for i in `find . -type f -name "*.rtf*"`; do
  dst=`echo $i | sed -e :a -e 's/\(.*\)\([0-9]\{2\}\)\.\([0-9]\{2\}\)\.\([0-9]\{4\}\)\(.*\)/\1\4.\3.\2\5/;ta'`
  echo mv $i $dst
done

Потом конвертируем в PDF:

libreoffice --invisible --convert-to pdf *.rtf

И соединяем все в один файл:

gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=toprint.pdf -dBATCH `find . -type f -name "*.pdf" | sort`

Всё.