среда, 17 июля 2013 г.

FastColoredTextBox — божественный RichTextBox для .NET

Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/dotnet/fastcoloredtextbox/.


Появилась у меня недавно задачка сделать в WPF-приложении красивый редактор форматированного текста с определённой логикой обработки. И решил я использовать для этой задачи стандартный RichTextBox. Увы, практика показала, что этот контрол ужасно медленный. Можно было, конечно, написать свою реализацию, но это занятие долгое, а функционал нужно было прикрутить побыстрее. Первая мысль была захостить стандартный RichTextBox из WinForms. Он работает достаточно быстро, но его функционала мне не хватило. И тогда я пустился в поиск сторонних контролов. Каким же счастливым я стал, когда наткнулся на FastColoredTextBox! Изучение контрола лучше всего начать со статьи на CodeProject. Увы, NuGet-пакет автор по каким-то причинам делать не хочет, но зато есть исходники на GitHub. Итак, небольшой обзор.

воскресенье, 14 июля 2013 г.

OverAPI.com — Collecting All Cheat Sheets

OverAPI.com — это замечательный ресурс, на котором собраны шпаргалки по самым разным языкам и технологиям. Я очень люблю разные Cheat Sheets: когда пишешь на большом количестве разных языков, то начинаешь забывать где и как называются нужные тебе функции. Конечно, есть google и документация, но с их помощью далеко не всегда можно найти нужную информацию. Намного приятнее, когда все наиболее распространённые шутки собраны в одном месте (особенно, если есть описание и ссылки на мануалы). В этом отношении OverAPI.com — отличный сайт, свёрстан на хорошем уровне, пользоваться удобно. Единственное, для многих технологий шпаргалки пока весьма скудные, но я надеюсь на развитие ресурса. К тому же, можно помочь проекту своими материалами через GitHub.

вторник, 9 июля 2013 г.

Баг поля ввода пароля Skype

Тестирование ПО — очень сложное занятие. А тестирование пользовательского интерфейса — одно из самых сложных в царстве тестирований. Всё дело в том, что количество пользовательских сценариев невообразимо большое, очень сложно предугадать всё то, что пользователь будет делать с вашей программкой. Иной раз в приложение закрадываются хитрые ошибки, которые долгое время никто не правит, т.к. никому не приходит в голову сделать именно эту последовательность действий.

Рассмотрим стартовую форму Skype, тот её участок, в котором предлагается ввести логин и пароль:

Сможете ли вы тут найти хоть сколько-нибудь неверное поведение?

вторник, 25 июня 2013 г.

Вопросы на знание строк в .NET

Меня всегда веселят .NET-разработчики, которые говорят, что они всё знают про строки. Не, ну есть и такие, которые действительно всё знают. Но обычно я с лёгкостью накидываю несколько вопросов, после которых мой собеседник теряет значительную долю уверенности в собственных знаниях. Предлагаю вам список из нескольких достаточно простых вопросов на знание типа System.String.

среда, 19 июня 2013 г.

Материалы по Git

Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/git/links/.


Основные: Интерактивные обучалки:

Просмотр истории коммитов в Git

Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/git/log/.


Изучение истории коммитов — важная составляющая работы с репозиторием. Увы, ввиду ветвления с этой историей не всегда просто разобраться. Обычно я для этой цели пользуюсь различными визуальными оболочками, но не всегда есть такая возможность. Временами приходится пользоваться средствами консоли, а именно командой git log. Основы работы с этой командой можно почитать в чудесной книге ProGit. git log имеет множество различных полезных параметров. Рассмотрим несколько примеров их использования.

Древовидный вид

git log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
Выводим полный граф коммитов c сокращёнными хешами, ссылками на коммиты и относительной датой. Используемый формат: синий сокращённый хеш коммита, зелёная дата, белые сообщение и автор, жёлтые ссылки на коммит.

четверг, 6 июня 2013 г.

Использование изменяемых структур в свойствах классов

Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/dotnet/mutable-structures-as-property/.


Названия всех классов вымышленные,
все совпадения абсолютно случайны.

Занимался я как-то раз улучшением кода проекта. И наткнулся вот на такие строчки:

public class Image
{
  public Rectangle Bounds;
}

«Ай-яй-яй! Публичное поле в классе, как же нехорошо-то! Нужно срочно превратить его в свойство!» — подумал я. И превратил:

public class Image
{
  public Rectangle Bounds { get; set; }
}

Сделал я такое невинное изменение и сразу пошёл дальше рефакторить — ведь ещё такое количество кода нуждалось в улучшении! Ну а в конце решил я запустить на всякий случай Unit-тесты. Какого же было моё удивление, когда половина тестов упала. «Да как же так! Ведь я особо-то ничего и не менял!» Ну, поехали разбираться.

понедельник, 3 июня 2013 г.

Заворачиваем C#-класс в COM

Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/dotnet/wrap-cs-in-com/.


Пусть у нас имеется C#-класс, который делает что-нибудь полезное, например:

public class Calculator
{
    public int Sum(int a, int b)
    {
        return a + b;
    }
}

Давайте создадим для этого класса COM-интерфейс, чтобы его функциональность можно было использовать в других местах. В конце посмотрим на использование этого класса в среде Delphi.

Занимательное о шрифтах в .NET

Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/dotnet/fonts/.


Сегодня мы поговорим о замечательном классе Font. Иногда при работе с шрифтами возникают некоторые вопросы, которые не настолько очевидны, как хотелось бы. Рассмотрим несколько из них.


Q: Как опознать моноширинный шрифт?

A: Это не такой простой вопрос. Если немного погуглить, то можно найти следующий совет: описываем у себя в проекте класс LOGFONT и используем метод ToLogFont для конвертации шрифта в соответствующий объект. После этого (согласно легенде) в поле lfPitchAndFamily первый бит должен определять моноширинность шрифта. Так вот, это враньё, в современном мире поле всегда будет равно нулю. Когда-то где-то этот способ работал, но сейчас не работает. В реальности приходится использовать не очень красивое, но весьма эффективное решение типа такого:

// graphics — заранее созданный экземпляр класса Graphics
public static bool IsMonospace(Font font)
{
    return Math.Abs(graphics.MeasureString("iii", font).Width - 
                    graphics.MeasureString("WWW", font).Width) < 1e-3;
}

Вызов R-скрипта с аргументами из консоли

Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/r/terminal-arguments/.


Для выполнения R-скрипта из консоли нам понадобится помощь утилит Rscript.exe и Rterm.exe. Разница между ними состоит в том, что Rscript.exe в результате выполнения выдаст нам только результат работы R-скрипта, а Rterm.exe выдаст полный лог R-сессии (включая стартовое приглашение к работе и все исполняемые команды). Если быть до конца честными, то Rscript.exe по сути вызывает Rterm.exe с специальными аргументами (об этом немного ниже). Рассмотрим пример запуска скрипта с аргументами командной строки:

Rterm.exe --no-restore --no-save --args 100 image <script.R >output.txt
Rscript.exe script.R 100 image >output.txt

Разберём эти команды чуть подробней.