Янв 302012
 

Только что отбурлили отгремели бои против жопы и пипы SOPA и PIPA. Как оказалось, это был лишь хитрый обходной маневр со стороны хитросопых медиаворотил. На очереди — ратификация ACTA (Anti-Counterfeiting Trade Agreement). Подробности можно почитать на хабре. Вот интересные моменты (как говорится, за что купил, за то и продаю):

  1. Даёт право пограничному контролю на обыск личных вещей на предмет наличия нарушений копирайта. Ордер не требуется.
  2. Вменяет провайдерам и хостерам в обязанность следить за соблюдением копирайта своими абонентами и предоставлять информацию по первому запросу. Ордер не требуется.
  3. Вводит уголовную ответственность за нарушение прав на интеллектуальную собственность во всех странах-участниках соглашения, даже если законодательство конкретной страны не предусматривает такой ответственности.
  4. Вводит уголовную ответственность за обход DRM любыми способами. Вводит запрет на распространение любого программного обеспечения, позволяющего игнорировать DRM, даже если оно может использоваться в иных целях.
  5. Признаёт законным изъятие и ликвидацию любых предметов с фальшивыми товарными знаками без права на получение компенсации.
  6. Даёт управляющему комитету ACTA право выпускать дополнения к соглашению, вступающие в силу незамедлительно без рассмотрения и ратификации странами-участниками.

А вот это уже п***ц так п***ц, особенно пункты 1, 3 и 6. Поэтому, ходит в интернетах ссылка, вроде как собирают подписи против этого самого фашизма. Сам пост имеет цель донести до знакомых, кто не в курсе, суть нависшего над нами экстерминатуса и, собственно, этой ссылки, по которой можно выразить свой безмолвный протест :)

http://www.avaaz.org/en/eu_save_the_internet_spread/?cgKpHcb

P.S. Пункты — бред? По какой статье уголовного кодекса судить? Бред, хз. Но вполне допускаю, что бред реальный. Я давно не верю в свободу, равенство и демократию там, где крутятся большие бабки.

P.P.S. Каким образом это затрагивает Россию, если речь идет пока об ЕС и США? А вот закивает радостно наш любимый царь-батюшка: «Да-да, мы хотим в ВТО!». И скажет ему посол заморский «Дер гроссер Кениг дас Америкен кенигсрайх занде михь! Подпиши-ка, царь и великий кнезе, грамоту, что ACTA кличут, супортив супостатов окаянных, что нашу Американскую казну через свои машины бесовские расхищают.» И пошлет наш царь легким движение перьевой ручки войско, выбить крымского хана с Изюмского шляха. Ну вы поняли.

Янв 232012
 

Небольшой обзор очередного граблеборства из личного опыта.
Предположим, есть примерно такой вот код:

class Class_A
{
public:
    Class_A(TypeSignal& arg);
    ~Class_A();
    // ...
};
 
class Class_B
{
private:
    TypeSignal CommonUsedSignal;
    std::list < Class_A > container;
public:
    // ~Class_B();
    void add()
    {
        Class_A temp(CommonUsedSignal);
        container.push_back(temp);
    }
    // ...
};

Казалось бы, что в нем неправильного? А я вот напоролся на баг, который долго и мучительно искал.
Continue reading »

Ноя 232011
 

У нас в компании сейчас идет активный набор новых сотрудников, поэтому зашел вчера разговор с начальством о вопросах, которые задаются на собеседованиях. Среди них — один хороший, на базовое знание STL, но, как выяснилось, почему-то не все легко и просто на него отвечают.
Сам вопрос звучит примерно так:

Почему для хранения экземпляров класса в контейнере STL достаточно определить только один оператор сравнения «< " и не требуется других (">«, «==», «!=», «< =", ">=»). Напишите функцию сравнения, учитывающую при сортировке значения трех членов класса.

Рекомендую, кстати, самому себе ответить на этот вопрос, прежде чем читать дальше :)

Continue reading »

Сен 142011
 

Кто почитывает иногда ithappens? Видели истории с меткой «факап», когда к заказчикам уплывало то, что для их глаз не предназначено? Ну вот точно такая же оказия и со мной сегодня приключилась :)
У нас есть заказчик. Одно из подразделений всем известного большого и солидного опсоса. У опсоса есть бизнес-партнер, не менее известный, очень большой и не очень уважаемый многими банк (не будем тыкать пальцами :) ).
Пишем мы для опсоса приблуду, которая спрягает его потроха с сервером мобильного банкинга. Из-за криворылости этого самого сервера, и абсолютного нежелания банка что либо чинить, приходится использовать хак и ломать красивую схему наследования классов.
В результате, не удержался и добавил в новую функцию с этим самым хаком трейс вывод (с расчетом потом убрать — софтина еще в стадии разработки)

I wish the <BankName>  programmers to hiccup every time this function is called.

Только вот кто же знал, что технари от заказчика тоже наблюдают за работой программы на сервере и смотрят в логи. Конфуз вышел однако :)

З.Ы. так что, советую не рассчитывать, что что-то в программе никогда не всплывет и этого не увидит конечный пользователь.

Сен 092011
 

Предисловие:
когда вышел boost 1.47.0, я хотел было его уже поставить и использовтаь в своих проектах, но был остановлен своим руководителем с мотивацией «Там есть что-то такое, чего нету в 1.46.1? Ну вот и не заморачивайся.» Как оказалось, зря :)

Сама история:
Пишет мне давеча саппорт:

При обновлении версии <product_name> упал с core.
Ставили <product_name><product_version>.
Присмотрелись, оказывается, что падает из-за прописанной локали в скрипте start
export LC_ALL=ru_RU.Cp1251.

Задумчивое скуривание core в gdb

#0 0x087cde95 in raise ()
#1 0x08974e9e in abort ()
#2 0x08969ac8 in __gnu_cxx::__verbose_terminate_handler ()
#3 0x08961885 in __cxxabiv1::__terminate ()
#4 0x089618c2 in std::terminate ()
#5 0x08968d1a in __cxa_throw ()
#6 0x08907fa0 in std::__throw_runtime_error ()
#7 0x089615e7 in std::locale::facet::_S_create_c_locale ()
#8 0x0890e8a7 in std::locale::_Impl::_Impl ()
#9 0x0891002c in std::locale::locale ()
#10 0x087d7148 in default_locale () at ../v3/src/path.cpp:749
#11 0x087d7194 in path_locale () at ../v3/src/path.cpp:756
#12 0x087d723e in boost::filesystem3::path::wchar_t_codecvt_facet () at ../v3/src/path.cpp:777
#13 0x087d618a in boost::filesystem3::path::codecvt () at ../../../boost/filesystem/v3/path.hpp:377
#14 0x087d89d4 in path (this=0x8cc6714, source=@0x8afe580) at ../../../boost/filesystem/v3/path.hpp:134
#15 0x087d7307 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at ../v3/src/path.cpp:99
#16 0x087d737a in global constructors keyed to _ZN5boost11filesystem34pathdVERKS1_ () at ../v3/src/path.cpp:791
#17 0x08a00a0d in __do_global_ctors_aux ()
#18 0x08048265 in _init ()
#19 0x0896d112 in __libc_csu_init ()
#20 0x0896cbd4 in __libc_start_main ()
#21 0x080482a1 in _start ()

и вываливающаяся при старте ошибка

terminate called after throwing an instance of ‘std::runtime_error’
what(): locale::facet::_S_create_c_locale name not valid

привели меня к мысли, что виноват filesystem из boost 1.46.1. Был нагуглен следующий баг:
https://svn.boost.org/trac/boost/ticket/4688

На мое счастье, ко времени обнаружения бага, уже месяц, как был зарелизен 1.47.0, иначе бы меня с потрохами сожрали :) В новой версии выпущен фикс, с которым приложение успешно запустилось.

Авг 072011
 

Сдох винчестер, на котором был сайт. Последний найденный бэкап — от 02.05.2011, соответственно, все последующие записи и комментарии пролюбились. Восстанавливал вручную — записи из кэша гугла, комментарии — из уведомлений по почте. Какие проблемы:

1) Свои комментарии восстановить не удалось
2) Id последних двух записей поменялись — из гугла по старым ссылкам недоступны
3) Дублирование записей в жж, куда ведется трансляция
4) Возможны мелкие косяки, несоответствия с потерянными оригиналами и т.д.
5) Неделю сайт был недоступен

Всем, кто заглядывает сюда, спасибо за понимание :)

Июл 032011
 

подох винт и умер сайт, этот пост восстанавливался вручную

После очередного обновления чего-то там в арче у меня стал падать Amarok со следующей ошибкой (phonon для воспроизведения использует библиотеку xine)

systemsettings: symbol lookup error: /usr/lib/xine/plugins/1.29/xineplug_inp_dvb.so: undefined symbol: xine_get_homedir

Решается путем убиения черного козла в полнолуние директории ~/.xine

Май 262011
 

подох винт и умер сайт, этот пост восстанавливался вручную

Прежде всего, хотел бы всячески расшаркаться в адрес товарища StarCrafted c #j4fun, именно он натолкнул меня на эту полезнейшую фичу.
Теперь сама суть:
На клавиатуре есть клавиша SysRq, она же PrintScreen. В юниксах эта клавиша является волшебной, способной разговаривать с ядром системы, не смотря на смерть, скажем xorg со всеми его халами.
Для меня в последнее время это особенно актуально, так как, похоже, nvidia накосячила с последними дровами, и с вероятностью 70% запущенные VLC или Java обрушивают либо xorg, либо модуль ядра nvidia (это все с включенными графическими свистелками в KDE).
В моем случае помогают следующие комбинации (Ctrl может понадобиться при живых иксах, которые иначе воспримут нажатие как PrintScreen):
(Ctrl +) Alt + SysRq + K – убить все в текущей консоли – прихлопывает xorg
(Ctrl +) Alt + SysRq + R – передать ядру управление устройствами ввода – это когда hal отправился по Стиксу вслед за xorg

Что бы фича была достпна, должна быть установлена соответствующая переменная ядра kernel.sysrq, прописывается она обычно в /etc/sysctl.conf

Полный список команд:
http://ru.wikipedia.org/wiki/SysRq

Процитируюю еще оттуда это:

Более правильно экстренную перезагрузку стоит проводить, зажав клавиши Alt + SysRq и с интервалом в 2-3 секунды нажать последовательно: R E I S U B
unRaw (перехватить управление клавиатурой),
tErminate (послать SIGTERM всем процессам),
kIll (послать SIGKILL всем процессам, которые не смогли завершиться предыдущей командой),
Sync (синхронизировать файловые системы),
Unmount (перемонтировать файловые системы в режим «только чтение»),
reBoot. (и напоследок, совершить перезагрузку)

Апр 082011
 

Сегодня случился эпик фейл, за который я долго бил себя ушами по щекам.
Веб-программист подсунул пхп скрипт для запихивания оного в крон на веб-сервере. Веб сервер крутится под FreeBSD 6.3. В какой-то неустановленный момент я, похоже, пытаясь запустить crontab от www юзера, лопухнулся, запустил его от рута, и с чистой совестью добавил на исполнение тот самый скрипт. Последствия были самые фатальные. Дада. Именно те, о которых вы и подумали. Кривой скрипт, неправильно определив текущую директорию, выполнил php-шный аналог rm -rf. В корне. От рута. Правда, в силу особенностей пхп, убив все содержимое в первой подвернувшейся директории /bin, скрипт не смог продолжить банкет ввиду отвутствия /bin/rm.
Ситуация:

  1. Вечер пятницы
  2. Боевой веб сервер, стоящий физически далеко в датацентре, без kvm
  3. Открытую ssh-сессию, от непривелигированного юзера
  4. Любые попытки вроде ls, cp и т.д. — /bin/command not found
  5. Отсутствие рутовых прав
  6. Невозможность ни переконнектиться по ссш, ни выполнить su — /bin/csh not found
  7. Порвавшуюся в итоге вифи-связь и отвалившийся ссш
  8. Чуть не поседевшего админа с круглыми глазами и трясущимися руками (меня т.е.)

Накатив для храбрости сто грамм (корвалола конечно же, а вы что подумали?), приступил к возврату пациента с того света. Прежде всего, остались висеть уже запущеные демоны — ссш и апач. У сервера есть веб-морда webmin, которую отдает живой апач. У вебмина есть файловый менеджер, работающий с рутовыми привелегиями (это мракобесие да, но сегодня это спасло сервер).
Кидаю клич на канале #bsdportal — нужны бинарники от 6.3. Находится добрый человек r1PPer (огромное ему спасибо), который их мне дает. Через webmin заливаю csh в /bin и выставляю разрешение на выполнение. Логинюсь по ssh — бинго, бинарник подхватился, повышаю привелегии до рута. Далее через sysinstall пытаюсь залить базовый набор программ. 6.3 — устаревший релиз, поэтому приходится указывать руками следующий адрес для загрузки:
ftp://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/i386/6.3-RELEASE/

И, вот оно, счастье — в /bin лежит изначальный набор программ. Есть одно но — sysinstall потер конфиги из /etc, поэтому приходится в первую очередь бегом восстанавливать юзеров (вход рутом по ссш по дефолту запрещен, старых юзеров уже нет, ссш висит со старым логином, отваливаешься — обратно уже не подцепиться будет), настраивать /etc/ssh/sshd_config, потом конфиги bind’а и т.д. и т.п.

В общем, сервер я с того света выдернул. А мораль все та же — прежде чем рутом что-то делать на боевом сервере, семь раз отмерь, десять раз протри глаза, проверь свои действия, и затем уже отрежь.

З.Ы. а с веб-программистом я пообщаюсь в понедельник }:->

Апр 052011
 

Как-то уже давненько на собеседовании подкинули задачу — написать функцию, проверяющую, является ли число степенью двойки. Циклами задача решается на раз плюнуть, но как следует обмозговать времени не было. Поэтому, задача получилась на «кто знает». Впрочем, секрет мне раскрыли сразу же. Все просто:

bool is_power_of_2 (int arg)
{
     return !(num & (num - 1));
}

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


8 = 00001000
8-1 = 7 = 00000111
7&8 = 00000000