Friday, March 28, 2008

Genius Navigator R820BT Bluetooth рулит и бибикает

Пользуюсь мышью Genius Navigator R820BT месяц. Очень доволен. Отличное решение для лэптопа. В начале казалась очень тяжелой. Работает от аккумуляторов очень долго. При работе 3-5 часов в день заряжал за месяц 3 раза. Причем не от того, что разрядилась, а просто как-то дико не заряжать совсем...
Из минусов - не на всех поверхностях работает хорошо, хотя может так работают все мыши :) Ведь с проводной не будешь работать на стеклянном столе или на одеяле.
И думаю это не геймерская мышь. Если хочется погамать, то лучше сесть за стол и подцепить обычную мышь, и желательно не к ноуту :)

Saturday, March 15, 2008

Blogger :: textarea tag & code to html converter

Помучился я с поиском того, как втыкать свой код в блог. Сначала хотел использовать тег textarea, но blogger заменяет <enter>'ы на <br>'ы. Долго искал как это побороть. Так и не нашел :) Зато нашел замечательный конвертер кода в html. Теперь блог будет выглядеть поприличнее.

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

Visual studio :: Отображение массивов в Watch

Давно меня бесило то, что массивы в watch отображаются весьма бестолково. И никак не получалось найти способа повлиять на это. Собственно я и сейчас не представляю как спросить у гугла то, что мне надо не зная названия класса-атрибута, который отвечает за отображение в watch.
Решение нашлось случайно, когда я смотрел "исходники" Dictionary. Заметил там аттрибут DebugDisplay.
Теперь, чтобы отображать в watch то, что мне надо - пишу подходящий wrapper. Например, чтобы в двумерном массиве посмотреть третью строку, пишу обертку для одномерного массива:

        [DebuggerDisplay("{_array[2]}")]
class DebugArray
{
double [] _array;
public DebugArray(int len)
{
_array = new double[len];
}
public double this[int i]
{
get { return _array[i]; }
set { _array[i] = value; }
}
}
, т.е. для массива будет отображаться значение третьего элемента, а не кол-во элементов. И использую массив таких врапперов для получения двумерного массива:
            List<DebugArray> v = new List<DebugArray>();
v.Add(new DebugArray(dimension));
v[0][3] = 0.123;
Собственно все весьма просто. Достаточно только знать о существовании аттрибута DebugDisplay :)

Friday, March 14, 2008

Serialization of Hashtable & Dictionary

Сегодня долго тупил почему у меня не сериализуется класс, у которого дальний предок - Dictionary. Тупил, искал в msdn до тех пор пока не полез в гугл. Гугл сразу выдал правильные ссылки прям по моей мессаге:

The constructor to deserialize an object of type 'SRM.BusinessLayer.Objects.Dictionary.MaterialFieldMemberCollection' was not found.
Все просто. Надо было добавить в класс конструктор:
protected MaterialFieldMemberCollection(SerializationInfo info, StreamingContext context) : base(info, context) { }

Monday, March 10, 2008

Кривость alglib? - нет. кривость рук...

Часто пользуюсь библиотекой alglib.
И вот переписал я сегодня одну программу с шарпа на плюсы - работать стало медленней на порядки. В обоих вариантах использовал модуль решения ду из alglib.
Замерил скорость отработки 10^6 шагов по рунгекутту там и там:
плюсы 24.5 сек
шарп 0.5 сек
Списываю это на кривость транслятора из algoPascal в alglib. Но надо конечно разбираться...

добавлено:
Поразбирался. Нашлось множество подводных камней, и наверное еще далеко не все.
Первое что сделал - избавился от массивов alglib. Не помогло. Изначально казалось, что вся проблема должна быть в алглибе и его надстройке в виде массивов, которые нумеруются с 1, а не с нуля. Однако, переход на обычные double[] ничего не дал.
Главная причина тормозов оказалась весьма тупа. Надо было включить оптимизацию /Ox и запускать не из IDE (из-под ide работает в разы медленнее).
Потом выяснилось еще, что точность DateTime.Now оставляет желать лучшего. Заменил на Stopwatch.
Написал тестовые примеры для замера скорости:
1) на шарпе


int rep = 1000000;
double d = 0;
for (int i = 0; i < rep; i++)
{
int arrLen = 100;
double[] arr = new double[arrLen];
for (int j = 0; j < arrLen; j++)
arr[j] = j;
for (int j = 0; j < arrLen; j++)
d += arr[j];
}


2) и на плюсах:

double d = 0;
for (int i = 0; i < rep; i++)
{
double* arr = new double[size];
for (int j = 0; j < size; j++)
arr[j] = j;
for (int j = 0; j < size; j++)
d += arr[j];
delete[] arr;
}

Однако, и этого мало. По прежнему код на шарпе работал быстрее на 40%. Полез искать в инете, как можно оптимизировать код на плюсах. На rsdn нашел такой совет:
заменить

double* arr = new double[size];
for (int j = 0; j < size; j++)
d += arr[j];

на

double* arr = new double[size];
double* iter = arr;
double* endIter = arr + size - 1;
int j = 0;
iter = arr;
while (iter < endIter)
{
d += *iter;
iter++;
}

если я все правильно понял, то авторы этого совета ошиблись у себя забыв, что нумерация массива идет от нуля. поэтому endIter = arr + size - 1, а не arrIter = arr + size. хороший пример преимущества шарпа - на надо мучить мозги ерундой.
такая замена дала прирост производительности на 10%, но до сих пор обогнать шарп у меня не получилось.

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

Vista :: Отключение автоматического определения типа папки

Чтоб отключить эту гадость:


[-HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\Bags]

[HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\Bags\AllFolders\Shell]
“FolderType”=”NotSpecified”


Чтоб вернуть:

[-HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\Bags\AllFolders]

(с) сперто

Monday, March 3, 2008

Windows Media Player нашел нужный кодек

На днях меня порадовал Windows Media Player. Есть у меня один видео файл, который ничем не открывался. Ставил я разные кодек-паки и никак не мог подобрать подходящий. Собственно никакого алгоритма подбора нужного кодек-пака у меня нет, поэтому просто перебирал. А решение оказалось в самом неожиданном месте. WMP в отличие от всех других плееров сразу предложил загрузить нужный кодек с инета. Хотя самим ВМП пользоваться неудобно, но эта вот его фича оказалась очень полезной. Раньше думал вообще убить его, а теперь точно оставлю, по крайней мере до тех пор, пока не найду другой лучший плеер с такой же фичей.