Магазин фантастики в ДК Крупской

Ден Абнетт, Ольга Громыко, Артём Каменистый, Гарри Гарриссон, Айзек Азимов — если эти имена вам о чём-то говорят, то категорически рекомендую посетить магазин фантастики в ДК Крупской.
Просто зайдите туда и спросите что-нибудь почитать, такого начитанного продавца вы больше нигде не найдете. Создается впечатление, что он читает абсолютно все книги, которые поступают в магазин.

Также в продаже для любителей японских порномультиков есть манга и прочие комиксы.

Группа вконтакте: ДК Крупской 16 павильон фантастика и детективы.

Конструктор, деструктор и автоматический стек в C++

С удивлением узнал об интересном способе использования стека в нестандартных целях. Посмотрите внимательно на код ниже.

Его фишка в том, что класс Sample в конструкторе сохраняет предыдущий инстанс типа Sample, а в деструкторе — восстанавливает. При этом метод Sample::instance() всегда будет возвращать текущий объект типа Sample.

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

class Sample
{
public:
    Sample()
        : prevInst_s(curInst_s)
    {
        curInst_s = this;
    }
 
    ~Sample()
    {
        curInst_s = prevInst_s;
    }
 
    static Sample *instance()
    {
        return curInst_s;
    }
 
private:
    Sample *prevInst_s;
    static Sample *curInst_s;
};
 
Sample *Sample::curInst_s = NULL;

Пример использования такого функционала под катом. (в комментариях указано — какой instance сейчас текущий)

#include <stdio.h>
 
class Sample
{
public:
    Sample(const char *name)
        : name_(name)
        , prevInst_s(curInst_s)
    {
        curInst_s = this;
        printf("current: %s\n", name_);
    }
 
    ~Sample()
    {
        curInst_s = prevInst_s;
 
        if (curInst_s)
        {
            printf("restore: %s\n", curInst_s->name_);
        }
    }
 
    static Sample *instance()
    {
        return curInst_s;
    }
 
private:
    const char *name_;
    Sample *prevInst_s;
    static Sample *curInst_s;
};
 
Sample *Sample::curInst_s = NULL;
 
 
int main()
{
    /*
     *
     * Sample::instance() => NULL
     *
     */
    {
        Sample sampleA("A");
        /*
         *
         * Sample::instance() => A
         *
         */
        {
            Sample sampleB("B");
            /*
             *
             *  Sample::instance() => B
             *
             */
        }
        /* 
         * 
         * Sample::instance() => A
         *
         */
        {
            Sample sampleC("C");
            /*
             *
             * Sample::instance() => C
             *
             */
            {
                Sample sampleD("D");
                /*
                 *
                 * Sample::instance() => D
                 *
                 */
            }
            /*
             *
             * Sample::instance() => C
             *
             */
        }
        /*
         *
         * Sample::instance() => A
         *
         */
    }
    /*
     *
     * Sample::instance() => NULL
     *
     */
}
Мытье окон в квартире — полезный совет

Антидождь Runway При наступлении весны многие люди моют окна в квартирах. Лично меня всегда раздражало, что окна после мойки в течение недели снова покрываются пылью и грязью. Особенно после дождя. Получается бесполезная работа.

У нас окна выходят на оживленное шоссе, поэтому ровно через два дня окна становятся такими же грязными, как и были.

Этой осенью решил ради интереса попробовать обработать окна средством «антидождь» для автомобилей. Ведь на лобовом стекле хороший «антидождь» держится пару месяцев, значит на оконном (в теории) должен держаться намного дольше, ведь там нет дворников и летящей из-под машин грязи.

Результат эксперимента превзошел все ожидания: четыре месяца спустя окна выглядят так, как будто их только что помыли. Так что категорически рекомендую!

Лично я пользовался средством от компании Runway (на фото слева) по советам ЖЖ сообщества spb_auto. Вы можете воспользоваться любым другим на ваше усмотрение.

Линейная интерполяция между углами

Иногда бывает необходимо выполнить линейную интерполяцию между углами. Ситуация осложняется тем, что углы в градусах бывают равны при совершенно разных значениях (например угол -360, 360 и 0 на самом деле одно и тоже). Делюсь методом правильной интерполяции между углами (подсмотрено в исходниках Quake).

float lerpAngle(float a1, float a2, float t)
{
    if (a1 - a2 > 180) 
    {
        a1 -= 360;
    }
    if (a1 - a2 < -180)
    {
        a1 += 360;
    }
    return a1 + t * (a2 - a1);
}

Если вам необходимо вычислить расстояние в градусах между углами, то можно переписать код так:

float distAngle(float a1, float a2)
{
    if (a1 - a2 > 180) 
    {
        a1 -= 360;
    }
    if (a1 - a2 < -180)
    {
        a1 += 360;
    }
    return abs(a2 - a1);
}
Блог Евгения Жирнова