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

Proxy для Telegram

В связи с попытками блокировок Telegram Проверено на 5 баксовом тарифе DigitalOcean 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: /etc/init.d/ssh restart Проверяем: ssh -p4251 teleg@<ip> Должно быть
Read full post gblog_arrow_right

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

CRTP и двойной статическая полиморфизм Ниже представлен паттерн проектирования на C++, известный как CRTP (Curiously Recurring Template Pattern). С его помощью реализовать двойной статический полиморфизм. Пример ниже демонстрирует, как можно строить иерархии классов с использованием шаблонов для достижения поведения, похожего на виртуальные функции, но без накладных расходов раннего связывания. Зачем нужен этот код? Обычный полиморфизм в C++ реализуется через виртуальные функции и наследование, что приводит к использованию виртуальной таблицы (vtable) и некоторым накладным расходам.
Read full post gblog_arrow_right

Haskell

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

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

Пару лет назад подарили отцу на день рождения лодочный электромотор и литиевый тяговый аккумулятор к нему. Хорошая вещь, сплошные положительные эмоции от использования. Но, как оказалось, мотор не рассчитан на работу с этим аккумулятором. В том смысле, что индикация уровня заряда на корпусе мотора оказалась совершенно неадекватной. Решил попробовать сделать необходимый девайс на Arduino. До этого с микроконтроллерами дела не имел. Оказалось, это совсем не сложно и даже интересно. Исходники выложил на GitHub: https://github.
Read full post gblog_arrow_right

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

В PHP есть возможность присвоить переменным значения, используя массив: list($a, $b) = array('str1', 'str2'); В Python это выглядит так: a, b = ['str1', 'str2'] А вот в C++ такой языковой конструкции нет. Но это совершенно не проблема, потому что ее можно сделать самому. Вот что у меня получилось: class ListInitializer { public: /** * Assignment operator * Ref-qualified forbids such things: * ListInitializer c(a,b); * c = arr; * You can only use this form: * ListInitializer(a,b) = arr; * VecType must be convertable to DataType */ templateListInitializer& operator=(ContainerType&& arr) && { auto it = arr.
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 .
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 .
Read full post gblog_arrow_right

Документация PHP-CPP

У PHP-CPP появился раздел с документацией. Вообще разработка библиотеки идет семимильными шагами, и, похоже, недолго осталось ждать первого рабочего релиза. Когда будет готово, напишу подробнее про саму библиотеку и её возможности. PS: Вместо того чтобы что-то писать здесь про библиотеку, я просто взял и начал переводить документацию на русский язык: http://phpcpp.ru/ Основная цель этого перевода — познакомить русскоязычное сообщество с библиотекой. Перевод вольный. Поскольку многие вещи в библиотеке так или иначе сделаны с моим участием (да и просто потому что я уже достаточно хорошо в ней разобрался), мой перевод во многих местах дополняет и расширяет оригинальный текст.
Read full post gblog_arrow_right

Сравнение производительности C++ php-расширения с нативным кодом

Давно меня интересовал вопрос: насколько увеличивается производительность при переписывании нативного кода в php-расширение. И вот я решил провести сравнение. В качестве платформы для написания расширения была выбрана библиотека PHP-CPP. Пару слов о самой библиотеке PHP-CPP. Довольно неплохая библиотека. Работать с ней приятно и удобно. Честно говоря, никогда еще не было так легко писать расширения для php. Из минусов могу отметить недостаток документации. Чтобы разобраться с некоторыми вещами, недостаточно даже примеров, которыми автор снабжает код — приходится смотреть исходники.
Read full post gblog_arrow_right