«Из тяжелой промышленности в городе развиваются лишь супермаркеты», — сказал Жадан (в переводе на русский). В субботу, когда потребовалось быстро выбрать и купить покрытие на пол в объятую ремонтом квартиру мы поехали в супермаркет. «Дача — это твоё хобби? Оби!» — мой любимый образец идиотского рекламного слогана. Вот туда и поехали.
Не скажу, что выбор линолеума и ковролина там скуден — в итоге мы выбрали и нам это понравилось и нравится до сих пор (3 дня уже) — но определённо не богат. Плюс от 5 до 10% ассортимента были помечены табличками: «Извините, эти образцы висят здесь просто так, но вместо того, чтобы убрать их, мы решили повесить эту табличку».
дальше
А текущем проекте возникла необходимость работать с MySQL базой данных из C++. Кроме базового API на «чистом» C, разработчики MySQL (кому она там сейчас принадлежит?) предоставляют надстройки для различных языков программирования, называя их connector'ами. В их числе имеется и красивая высокоуровневая обвязка для C++. Хорошая альтернатива слабо предназначенному для непосредственного использования libmysqlclient, казалось бы.
Вскоре начались проблемы. Случайные вылеты, причинами которых были баги самого мерзкого характера: какая-то дрянь портила чужие области памяти. Потратив предварительно несколько часов, я так и не сумел сходу решить проблему. Уже тогда я подошёл вплотную к MySQL коннектору, но решил что столь явной проблемы (на максимально простом тест-кейсе) в официальной библиотеке быть просто не может, а значит проблема где-то раньше в моём коде. Потому решено было временно отложить решение (вылеты были регулярными, но не столь частыми) и сначала дописать функционал до определённого уровня, что и было проделано.
Пришло время второго захода. В ход пошли хитроизощрённые отладочные техники с hardware watchpoint'ами и утилитами для отслеживания выделения памяти. Снова несколько часов и снова вижу проблему в connector'е. Тут-то я наконец сосредоточенно погуглил и нагуглил письмо в mailing list MySQL, где описывалась похожая проблема. Автор письма потрудился залезть в исходники коннектора (что я уже было собирался делать) и обнаружил там серьёзные проблемы. Кому интересно, подробно могут почитать по ссылке, но суть в том, что там просто элементарная ошибка (и не одна) с освобождением памяти, которая приводит к самым неприятным последствиям.
В итоге, код работы с базой (благо, ещё не разросшийся) был переориентирован на использование сишной libmysqlclient и счастье наступило.
Мораль:
Терминатор 4 — ужасен. Можно не смотреть. Насыщенность событиями — как в одной серии дешёвого sci-fi сериала. Сюжет можно изложить в трёх предложениях, два из которых есть в анонсе. Голливудские сценаристы продолжают однообразно фантазировать на тему «сигналов», «компьютерных сетей» и прочих типа современных технологичных штучек, в которых ни черта не смыслят. Надоело уже, честное слово.
Резюме: третья часть была лучше, если она вам не понравилась, то на четвёртую даже не стоит тратить времени.