вторник, 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

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

LaTeXTemplates.com — подборка LaTeX-шаблонов

Обнаружил в интернете свежую бесплатную подборку LaTeX-шаблонов: www.latextemplates.com. По шаблонам организована удобная навигация, для каждого доступен предварительный просмотр с кратким описанием. На текущий момент имеются следующие категории: академические журналы, статьи, задания, книги, календари, постеры для конференций, сопроводительные письма, резюме, эссэ, деловые письма, лабораторные книги, лабораторные отчёты, разное, презентации, диссертации и титульные листы.

Увы, это на все случаи жизни шаблонов не сделаешь. Для написания русской кандидатской диссертации пришлось делать собственный: Russian-Phd-LaTeX-Dissertation-Template.

Ручное размещение полей структуры в C#

Начнём с задачки. Имеется структура:

struct MyStruct
{
    public Int16 Value;
}

Требуется научится получать младший байт поля Value. Но сделать это нужно так, чтобы обеспечить максимально возможную производительность.

LaTeX-ссылки

Основные

Литература

Шаблон диссертации в LaTeX

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


Написать диссертацию — дело нелёгкое. А оформить её ещё сложнее. Благо, есть LaTeX, который может нам в этом помочь. Но для начала было бы здорово обзавестись шаблоном, на основе которого можно было бы сразу приступить к написанию научной работы. Я такого шаблона не нашёл, поэтому решил сделать его сам, возможно кому-то пригодится: https://github.com/AndreyAkinshin/Russian-Phd-LaTeX-Dissertation-Template. В шаблоне используется моя любимая кодировка UTF-8. Список литературы генерируется BibTeX-ом, а в отдельной папке аккуратно сложены всевозможные библиографические UTF-8-стили. Используются красивые PSCyr-шрифты, все наиболее часто используемые пакеты подключены. Помимо шаблона диссертации, проект также включает шаблоны автореферата, презентации и черновика для промежуточных наработок.

Рекомендации по созданию постера

В интернете есть много разной информации про то, как нужно делать хорошие презентации. А вот про создание постеров почти ничего нет. Мне недавно довелось присутствовать на одной постер-сессии. Некоторые постеры мне очень понравились, а над некоторыми ещё нужно работать и работать. И я решил сформулировать некоторые небольшие рекомендации для тех, кто собирается сделать хороший постер.

Операторы +=, -= в R

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


Продолжаем писать полезные операторы для языка R. В большинстве современных языков есть операторы +=, -= и т.п., они делают синтаксис более лаконичным. А давайте и в R определим подобные операторы, чтобы вместо
x <- x + 3
y <- y - 2
мы могли бы писать:
x %+=% 3
y %-=% 2

Множественное присваивание в R

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


R — мощный и лаконичный язык. С помощью коротких инструкций можно сделать очень многое. Но давайте сделаем R ещё лаконичнее.

Чего мне всегда не хватало в R — так это множественного присваивания. Из-за отсутствия этой возможности приходится иногда писать не совсем красивый код для получения результата функции, который должен распределиться по нескольким переменным:

x <- solve(matrix(c(2, 0, 0, 3), ncol=2), c(1, 1))
x1 <- x[1]
x2 <- x[2]
А вот было бы здорово если бы такие вещи можно было записывать в одну строчку, например так:
с(x1, x2) %=% solve(matrix(c(2, 0, 0, 3), ncol=2), c(1, 1))
Нет ничего проще!

R Syntax Highlighter — раскрашиваем R-код на вашем сайте

Появился новый прекрасный highlighter для языка R: http://highlight.r-enthusiasts.com/. Подключаем в head-секцию вашей веб-страницы нужный js-файл, оборачиваем R код в <pre></pre>, а затем из js говорим на него: $("#code").r_syntax_highlight();. И наш код раскрашивается прекрасным образом. И не просто раскрашивается: у всех команд появляется ToolTip с документацией, а сами команды — ссылки на удобную online-документацию. Всё сделано, прям как людей, это радует.

Работаем с rgl на Shiny


Shiny — это замечательный пакет, который позволяет развёртывать веб-страницы на основе R-скриптов. rgl — это замечательный пакет, который позволяет строить в R красивые интерактивные трёхмерные графики. А ещё более замечательным является тот факт, что эти пакеты можно совместить, получив в результате интерактивный трёхмерный график для вашего сайта. О том, как это сделать, рассказывает и показывает Jeff Allen в своём посте. Вы можете сразу посмотреть результат на двух примерах: arbitrary 3d points и color plots. Исходный код доступен на GitHub.

Progress bar в R

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


Давайте поговорим о долгих расчётах, ведь они не так редко встречаются в мире вычислений. Когда вы запускаете скрипт, который будет заведомо долго работать, то приятно смотреть на состояние прогресса. Эта информация поможет прикинуть время до конца вычислений («осталось ещё 30%, я успею выпить чашку кофе») или просигнализировать о бесконечном цикле («1438% выполнено, что-то пошло не так...»). Давайте научим наш скрипт сообщать пользователю о проценте выполненных работ.

stringr — работаем со строками

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

Rprofile — кастомизируем рабочее окружение

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


Давайте поговорим о задании окружения в R. Для этой цели имеется два волшебных файла:
  • Rprofile.site — глобальный файл настроек для всех сессий. Путь в Windows: c:\Program Files\R\R-x.y.z\etc\Rprofile.site, путь в Linux: /etc/R/Rprofile.site.
  • .Rprofile — локальный файл настроек для текущей сессии. Лежит в домашней директории пользователя.
Эти файлы строятся единообразно, в них можно задать глобальные настройки окружения и объявить две полезных функции:
  • .First <- function() { ... } — функция, которая запускается в начале R-сессии
  • .Last <- function() { ... } — функция, которая запускается в конце R-сессии
На Stackoverflow можно посмотреть какие .Rprofile-файлы используют люди. Взглянем, что же можно полезного сделать в таком файле на небольших примерах.

Конкатенация строк в R

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


Давайте поговорим о конкатенации строк. Новички в R пытаются пробовать стандартную конструкцию
"a" + "b"
Но их постигает неудача — R так не работает. Оператор плюс — это арифметическая операция, её нельзя применять к строкам. В R полагается использовать функцию paste:
paste (..., sep = " ", collapse = NULL)
paste0(..., collapse = NULL)

colorfulVennPlot — рисуем цветные диаграммы Венна

Диаграммы Вена — это эффективный способ графически изображать отношения между множествами. В R есть замечательный пакет VennDiagram, который успешно решает эту задачу. Но получающиеся диаграммы получаются чёрно-белыми. Сделать картинки немного интереснее поможет пакет colorfulVennPlot. Он позволяет создавать цветные диаграммы для трёх множеств следующего вида:
Давайте разберёмся с тем, как он работает.

Рисуем комиксы в стиле xkcd

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


Многие слышали о таком замечательном комиксе, как xkcd. Это веб-комикс от Рэндела Манро о романтике, сарказме, математике и языке. Для некоторых комиксов есть переводы на русский. Для поиска и просмотра ваших любимых комиксов в R есть отдельный пакет: RXKCD. Давайте установим этот пакет и подключим его:
install.packages("RXKCD")
library("RXKCD")
Давайте поищем какой-нибудь комикс, а затем нарисуем его. Функция searchXKCD выдаст нам список всех комиксов, в описании которых встречается заданная фраза. А getXKCD выдаст нам полную информацию о комиксе по заданному номеру (включая рисование картинки).
searchXKCD("someone is wrong")
getXKCD(386)

А теперь помимо стандартных комиксов научимся рисовать свои!

Cairo — делаем графики гладкими

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


R обладает богатейшим функционалом по формированию различных графиков. К сожалению, иногда графики получается не настолько красивыми, как бы нам хотелось. Давайте нарисуем график синуса:
x <- seq(0, 10, by = 0.1)
y <- sin(x)
plot(x, y, type="l")
Если вы хорошо вглядитесь в это изображение, то увидите, что функция получилась не совсем гладкой. Дело в том, что стандартное графическое устройство не поддерживает anti-aliasing. Но не стоит грустить! Нам поможет Cairo!

R-ссылки

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


Английские полезные R-ресурсы:
  • R-project — официальный сайт
  • CRAN — официальный репозиторий пакетов
  • Bioconductor — ещё один репозиторий пакетов
  • R graph gallery — графическая галерея R
  • Inside-R — замечательно R-сообщество
  • Full manual — полные оригинальные спецификации
  • R Cookbook — разные полезные R-сниппеты для решения типовых задач
  • Quick-R — краткий обзор языка
  • Try R — online-обучалка основам языка
  • R Wiki — небольшая вики про язык R
  • R Seek — поиск информации про R
  • R Journal — журнал про R
  • Google's R Style Guide — стандарты оформления R-кода от Google
  • R by example — подборка примеров использования R
  • R FAQ — официальный FAQ
  • Functional programming — учимся функциональному программированию на R
  • crantastic — ещё одно R-сообщество
  • omegahat — ещё один R-репозиторий
  • ProgrammingR.com — и ещё один полезный сайт
  • fractalswithr — фракталы на R

Инструментарий для R

Ниже представлены разные полезные штуки, призванные сделать работу с R более приятной.
  • RStudio — прекрасная IDE для работы в R. Тут можно на русском подробно почитать про работу с этим замечательным программным продуктом.
  • Pretty R — online-сервис, который умеет красиво раскрашивать R-код.
  • Sweave, knitr — замечательные пакеты, которые позволяют встраивать R-скрипты в LaTeX-документ
  • Shiny — пакет, позволяющий развёртывать интерактивные web-приложения на основе R-скрипта (с графиками, элементами управления и т.п.)
  • StatET — плагин для Eclipse для написания на языке R
  • RPy — используем R из Python-а
  • R markdown — разметка простых документов на основе R

Функции в R

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


В R очень много разных полезных функций. И многие большие вещи можно сделать весьма быстро, написав очень мало кода. На официальном сайте есть замечательная шпаргалка на английском языке: R reference card. В сети есть несколько вольных урезанных переводов, но они не очень удобные. Ниже вашему вниманию представляется русифицированная модифицированная версия обзора основных функций R. Команды снабжены ссылками на online-мануал.