Incorrect characters in the list of audio devices in Java

Every­one knows, that audio devices are list­ed in Java with AudioSystem.getMixerInfo(). Mac users know, that the only sound device they have for Mac­in­tosh is Built-in Input, Built-In out­put and Java Sound Audio Engine, ver­sion 1.0. And only the ones who use non-latin sym­bols in OS, know about the prob­lem with this func­tion: Cyril­lic let­ters looks like a habra­cadabra with it. I’m not sure about Japan­ese ones, has to be checked still..
Like this:
It hap­pens because get­Mix­erIn­fo() returns device data in Win­dows-1252 charset, but tries to out­put it in Win­dows-1251. We have to help it some­how
It might be cool to write a wrap­per for javax.sound.sampled.Mixer.Info, but toString() and get­Name() meth­ods in this class are final. Let’s use helper func­tions:
public class Shared {
 private static String OS = null;
 public static String getOsName()
  if(OS == null)
   OS = System.getProperty("");
     return OS;
 public static boolean isWindows()
    return getOsName().startsWith("Windows");
 public static String toLocalString(Object info)
   return info.toString();
  String defaultEncoding = Charset.defaultCharset().toString();
   return new String(info.toString().getBytes("windows-1252"), defaultEncoding);
  catch(UnsupportedEncodingException ex)
   return info.toString();
Then we use Shared.toLocalString(item.getName()) for every such an instance. All of the titles are ok now:


Free and open-source software licenses

There’re plen­ty of free and open-source soft­ware licens­es and not all of them are as sim­ple as Do What the Fuck You Want to Pub­lic License. And even if you col­lect­ed all 4 free­doms and 650 poke­mons, it isn’t enough.

The main thing a devel­op­er has to know about free and open-source licens­es – some of them let the code be linked from code in anoth­er lan­guage, and some of them don’t.

For exam­ple, if you use some­thing licensed as GNU GPLyour project has to be under GNU GPL too. In oth­er hand, if you use BSD license, you can sell it to Apple to make OS X from it.

Please, check the license before using some­thing from GitHub or Google Code.

Google Code allows only OSI-Approved licens­es. You have to remem­ber this table to be safe using projects from it:

License Link with code using a dif­fer­ent license Release changes under anoth­er license
Apache License + +
Artis­tic License + !
Eclipse Pub­lic + -
GNU GPL 3 - -
GNU GPL 2 - -
GNU Less­er + -
Mozil­la Pub­lic + !
New BSD + +
Microsoft Pub­lic License* + -

+ – allowed
— – not allowed
! – lim­it­ed
* Microsoft Pub­lic License isn’t includ­ed in offi­cial list on Google Code, but is approved by OSI too and is very pop­u­lar on Code­plex.


Git: How to rename a GitHub repo

GitHub allows to rename your repos. I real­ly like this solu­tion.

Install curl if you haven’t and use ter­mi­nal (or cyg­win under win­dows):

newName='{"name": "NewNameForRepo"}'
curl -u "$user:$pass" -X PATCH -d "$newName"$user/$oldName

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 и залит в основную ветку.

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

# 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
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 @EndOfPrevWeek DateTime
DECLARE @StartOfPrevWeek DateTime
SET @TodayDayOfWeek = datepart(dw, GetDate())
SET @EndOfPrevWeek = DATEADD(dd, -@TodayDayOfWeek, GetDate())
SET @StartOfPrevWeek = DATEADD(dd, -(@TodayDayOfWeek+6), GetDate())

--- Тут выборка
CONVERT(DATE, @StartOfPrevWeek,7)
CONVERT(DATE, @EndOfPrevWeek+2,7)

Если воскресенье учитывать не надо – вместо @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)

---- тут выборка
CONVERT(DATE, @StartOfPriod,7)
CONVERT(DATE, @EndOfPeriod,7)

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

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

Georges Simenon – Le Chien jaune

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

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

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

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