QT: error: cannot find -lQtMultimedia

The QtMul­ti­me­dia library is not avail­able in Ubun­tu. If you’re try­ing to cre­ate in Qt a project that uses it, it will fail with fol­low­ing error:

error: can­not find -lQt­Mul­ti­me­dia

To fix it, you have to install qtmo­bil­i­ty and use mul­ti­me­dia items from this lib. Install qtmo­bil­i­ty-dev and lib­de­clar­a­tive-mul­ti­me­dia. Then remove QT += mul­ti­me­dia from .pro file and add INCLUDEPATH to QtMo­bil­i­ty and QtMul­ti­me­di­aK­it direc­to­ries.

Already defined” linker error

This error is very com­mon, when you try to com­pile in Visu­al Stu­dio a huge cross-plat­form C++ project.

This is because of stan­dart C++ tem­plates, that are released in Visu­al Stu­dio libs and in addi­tion­al UNIX libs too. So, you have to exclude one of them to use anoth­er.
Just add one of them, go to Project Prop­er­ties / Link­er / Input / Ignore Spe­cif­ic Default Libraries and add the stan­dard lib that pro­duces con­flict. For me it was enough to add LIBCMT.LIB.

LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt

LINK : fatal error LNK1123: fail­ure dur­ing con­ver­sion to COFF: file invalid or cor­rupt

It’s a com­mon error when you com­pile C++-projects with Visu­al Stu­dio 2010. Ift hap­pens when 2 ver­sion of Visu­al Stu­dio are installed on same PC (like 2010 and 2012) and cause con­flict between two ver­sions of cvtres.exe.

To fix it, go to the bin direc­to­ry of Visu­al Stu­dio 2010 (c:Program Files (x86)Microsoft Visu­al Stu­dio 10.0VCbin or some­thing like this) and rename cvtres.exe to cvtres0.exe.
Don’t wor­ry, it willn’t break link­er of 2010.

WordCount в Sublime

Sub­lime чудесен. Можно сказать, что проблема отсутствия под lin­ux-ом Notepad++ успешно решена.

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

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

В результате – целый вечер открытий и удивительных экспериментов. Удивился встроенной консоли, попутно оптимизировал код и исправил баг с полем read_time в настройках.

Обновлённый код успешно merged и залит в основную ветку.

А удивил меня сам алгоритм подсчёта. Их там целых два, причём первый закомментирован:

#=====1
# wrdRx = Pref.wrdRx
# """counts by counting all the start-of-word characters"""
# # regex to find word characters
# matchingWrd = False
# words = 0
# for ch in content:
# # # test if this char is a word char
# isWrd = wrdRx(ch)
# if isWrd and not matchingWrd:
# words = words + 1
# matchingWrd = True
# if not isWrd:
# matchingWrd = False
#=====2
wrdRx = Pref.wrdRx
words = len([x for x in content.replace('n', ' ').split(' ') if False == x.isdigit() and wrdRx(x)])

На первый вгляд, алгоритм 1 должен работать лучше и экономней. Фактически, перед нами нечто наподобие state machine, и его сложность не больше o(n). В то время как второй алгоритм создаёт кучу новых элементов только для того, чтобы их пересчитать.

На самом деле алгоритм 2 отрабатывает намного быстрее, чем 1. Например, чтобы подсчитать количество слов в “Петербургских трущобах” Крестовского, 2-ому нужно порядка 1 сек., а первому – 2.

Вот вам и оптимизация.

SQL: Previous Month and Week

Получаем записи за прошлую неделю (от понедельника до полуночи с воскресенье на понедельник):

DECLARE @TodayDayOfWeek INT
DECLARE @EndOfPrevWeek DateTime
DECLARE @StartOfPrevWeek DateTime
SET @TodayDayOfWeek = datepart(dw, GetDate())
SET @EndOfPrevWeek = DATEADD(dd, -@TodayDayOfWeek, GetDate())
SET @StartOfPrevWeek = DATEADD(dd, -(@TodayDayOfWeek+6), GetDate())

SELECT
--- Тут выборка
WHERE
CREATED_DATE BETWEEN
CONVERT(DATE, @StartOfPrevWeek,7)
AND
CONVERT(DATE, @EndOfPrevWeek+2,7)
GROUP BY
p.PRODUCT_NAME

Если воскресенье учитывать не надо – вместо @EndOfPrevWeek + 2 надо писать @EndOfPrevWeek + 1.

Сделать выборку по месяцу намного проще:

DECLARE @EndOfPeriod DateTime
DECLARE @StartOfPriod DateTime
SET @StartOfPriod = DATEADD(mm, DATEDIFF(mm,0,getdate())-1, 0)
SET @EndOfPeriod = DATEADD(mm, 1, @StartOfPriod)

SELECT
---- тут выборка
WHERE
CREATED_DATE BETWEEN
CONVERT(DATE, @StartOfPriod,7)
AND
CONVERT(DATE, @EndOfPeriod,7)

Аналогичные штуки проходят с днём и годом.

Работает в т.ч. в MS SQL 2005 (если MSDN не врёт).

Georges Simenon – Le Chien jaune

Смысл некоторых страниц пока выглядит довольно мутным. Но я всё равно героически дошёл до конца и узнал, кто убийца.

Прочитал вот это издание:

Сам автор утверждает, что романы, вроде этого, он писал за 3 дня. Что ж, 3 дня “Жёлтого пса” оказались просто превосходными. Экранизировали книгу почти сразу, а в наши дни она читается ничуть не хуже, чем в 1931.

Так и появляется неожиданная классика жанра.

Jens Köhn – Die Etruskier. Kinder des Tunia

Ещё одна книга из серии “Alte Kul­turen am Mit­telmeer” – как и предыдущие про критян и микенцев. Книжки про финикийкев в магазине уже не было – только эти три.

Издана в 1991, ещё до орфографической реформы. Единственный серьёзный недостаток – на странице 4 в качестве примера этрусской письменности изображена лемносская стела, которую всё-таки относят к пеласгам или тирсенам.

showModalDialog’s returnValue is undefined in Chrome

С мест сообщают – в Chrome у show­Modal­Dia­log return­Val­ue – unde­fined. Баг известен с 2010 года и пока (16 сентября 2012) не исправлен.

Фиксить так:

В окне, которое вызывает модальное:

window.returnValue = undefined;
var result = window.showModalDialog("modalwindow.aspx", window, "dialogHeight:650px; dialogWidth:900px;");
if (result == undefined)
   result = window.returnValue;
if (result != null && result != "undefined")
  // Do something with the return value
  // defined in "result"

В модальном окне:

if (window.opener) {
    window.opener.returnValue = "your return value";
}
window.returnValue = "your return value";
self.close();

IE теряет фокус на ссылке

В IE обнаружен загадочный баг.

Если ASP.Net страница:

  • делает (например, по нажатию на страницу) redi­rect на другую через anchor (т.е. otherPage.aspx#anchor)
  • в IIS настроен ISAPI_Rewrite (локально повторить не удалось)
  • браузер – IE (повторяется в т.ч. в 9-ом)

То может случиться так, что anchor “отбросится” и страниця загрузится как otherPage.aspx.

Выловить и перенастроить практически невозможно.

Единственный выход – вместо redi­rect вставлять в lit­er­al на странице “<script language=’javascript’>location.href = ‘otherPage.aspx#anchor’;</script>”. Можно дополнительно поставить проверку – делать такой redi­rect только если браузер ie. Название браузера искать в Request.Browser.Type.

О document.ready заботаться не стоит – redi­rect он и есть redi­rect.

Дж. Х. Рейнвотер – Как пасти котов

Книга об управлении программистами. Большинство советов либо слишком абстрактны, либо слишком мелочны чтобы их можно было запомнить. Начинается бодренько, а потом разочаровывает всё – даже немногочисленные коты на буквицах.

Где-то в книге скрывалась история о том, как проектный менеджер Джон завалил проект, потому что даже не пытался понять, что там происходит. Я так и не смог её разыскать. Видимо, она была не очень связана с той главой, в которую её поместили.

Зато я нашёл другую хорошую цитату и выписываю её отдельно, потому что она мне очень понравилась.

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

Возможно, ради неё и стоило читать всю книгу