Заметки

Category: Программирование

Про C++

Современный C++ всё-таки странная штука.
Как было в девяностые? Когда-то я выучил основу BASIC, прочитав книжку за вечер. Потом Pascal, прочитав книжку день-два. C и самые необходимые основные функции библиотеки - тоже за пару дней (спасибо отличной книжке от K & R). На C++ перешёл, осилив книжку "От C к C++" за пару подходов. Delphi - зная Pascal и C++, просто сразу начал писать и разбираться по ходу дела.
Вчера я с помощью сначала всех интернетов, а потом нескольких вопросов к ChatGPT 4 (она тоже с первого раза правильно не подсказала), два часа сначала ваял такой фрагмент, а потом разбирался, что тут написано и почему именно так. И эта конструкция функционально ничего не делает, она просто замедляет компиляцию приложения и позволяет избежать копипасты и сэкономить букв (возможно, меньше, чем она сама длиной). В общем, я на освоение малополезной фичи потратил столько времени, сколько раньше было нужно на половину языка. И я даже не напишу второй раз то же самое с первой попытки без шпаргалки.

template<typename Func, typename Obj, typename Arg, typename = void>
struct is_callable_with_arg : std::false_type {};
template<typename Func, typename Obj, typename Arg>
struct is_callable_with_arg<Func, Obj, Arg, std::void_t<decltype((std::declval<Obj>().*std::declval<Func>())(std::declval<Arg>()))>> : std::true_type {};
void call_impl(VAR_TYPE arg, std::true_type) { (clz_->*sig_)(arg); }
void call_impl(VAR_TYPE, std::false_type) { (clz_->*sig_)(); }
...
call_impl(var_, std::integral_constant<bool, is_callable_with_arg<MEMBER, CLASS, VAR>::value>{});

Сниппет для сэмплинга пользователей или A/B тестирования (Java)

Допустим, у нас есть стабильный идентификатор пользователя userId. С помощью этой функции мы превращаем строковый идентификатор в псевдослучайное число:

int userNumber = stringIdToSamplingMillis(userId);

Теперь мы можем использовать это число так:

if (userNumber < 50) ... // Пользователь попал в 5% тестовую выборку
if (userNumber < 500) ... // Пользователь попал в категорию A
else ... // Пользователь попал в категорию B

Функция:

    // Генерирует по строке псевдослучайное число от 0 до 999 включительно.
    private static int stringIdToSamplingMillis(final String str) {
        // Используем MD5 в качестве генератора псевдослучайного числа на базе строки
        final MessageDigest hasher = MessageDigest.getInstance("MD5");
        final byte[] data = str.getBytes();
        hasher.update(data, 0, data.length);
        // Получим MD5 в виде длинного целого числа
        final BigInteger bigInt = (new BigInteger(hasher.digest())).abs();
        // Получим хвост длинного целого в виде обычного int-а [0..999]
        return bigInt.mod(BigInteger.valueOf(1000)).intValue();
    }

PHP function to read friends-only LiveJournal posts through RSS

The code is pretty self-explanatory. The only know-how is the combination of the options which works with LJ.
The global variables $digest_username and $digest_password should be set to your LiveJournal username and password, respectievely.
The $url should like like: http://www.livejournal.com/users/tl1/data/rss/?auth=digest

UPD: (The Russian version):
PHP-код для чтения закрытых постов в ЖЖ через RSS
Ищу способ снова читать ЖЖ и массу других блогов в одном централизованном приложении. Естественно, это возможно только через RSS. Как оказалось, у ЖЖ есть возможность читать защищённые записи через RSS, но не всё так просто, т.к. отдавалка RSS требует определённых уговоров и, например, Tiny Tiny RSS не справляется с получением защищённых фидов. В интернетах также нет работающего в настоящий момент примера кода, поэтому я решил запостить результат своих изысканий. Код тривиальный, фишка только в наборе параметров cURL.
$digest_username, $digest_password - глобальные переменные с вашим логином и паролем в ЖЖ.
URL защищённого фида: http://www.livejournal.com/users/tl1/data/rss/?auth=digest
(Замените tl1 на произвольный %USERNAME% ЖЖ.)
Вы получите RSS с записями пользователя, включая приватные, которые он открыл вам.

·· [Read more · Читать дальше] ·· »»»

My & 2GIS Open-Source Repos Migrated to GitLab (Qt for Android and other stuff)

Since gitorious.org is going to be shut down within 1.5 months the open-source repos have been moved here:

https://gitlab.com/u/sergeygalin
https://gitlab.com/groups/2gisqtandroid

This includes Qt 4.8 and patched Qt 5 for Android (grym-android-lighthouse, grym-qt, grym-qt5), ex qtandroidoffscreenviews and related stuff.

Here Be Dragons

Надо сделать скрипт, который в репозитории в файлах, не редактировавшихся неск. мсяцев, рэндомно втыкает коммент "Here be dragons!"

Archives

                                                                                                                                                                                                                                                                   


© Sergey A. Galin, 1998-2021 sageshome.net/blog/