Проблема с FPU при вызове .NET-логики из Delphi
Ситуация: мы пишем основную логику приложения на C#, но есть необходимость использовать её из Delphi. Для этих целей пользуемся COM-обёрткой, которая успешно справляется с поставленной задачей. Целевая функция перед возвращением результата показывает диалоговое WPF-окно, с которым можно сделать что-нибудь полезное. Проверяем на простом примере — всё отлично работает.
Проблема: в некоторых Delphi приложений окно выбрасывает исключение. Но исключение странное: при формировании WPF-окна падает, скажем, выставление ширины некоторого элемента. Но это только в некоторых приложениях. А в остальных — тот же самый код на тех же самых данных отлично работает.
В чём же дело?
Читать дальше
FastColoredTextBox — божественный RichTextBox для .NET
Появилась у меня недавно задачка сделать в WPF-приложении красивый редактор форматированного текста с определённой логикой обработки. И решил я использовать для этой задачи стандартный RichTextBox. Увы, практика показала, что этот контрол ужасно медленный. Можно было, конечно, написать свою реализацию, но это занятие долгое, а функционал нужно было прикрутить побыстрее. Первая мысль была захостить стандартный RichTextBox из WinForms. Он работает достаточно быстро, но его функционала мне не хватило. И тогда я пустился в поиск сторонних контролов. Каким же счастливым я стал, когда наткнулся на FastColoredTextBox! Изучение контрола лучше всего начать со статьи на CodeProject. Увы, NuGet-пакет автор по каким-то причинам делать не хочет, но зато есть исходники на GitHub. Итак, небольшой обзор.
Читать дальше
Материалы по Git
Основные:
- Pro Git [EN]
- Pro Git [RU]
- Git: наглядная справка [RU]
- Git: наглядная справка [EN]
- Git User’s Manual [EN]
- Git magic [EN]
- Волшебство Git [RU]
Читать дальше
Просмотр истории коммитов в Git
Изучение истории коммитов — важная составляющая работы с репозиторием. Увы, ввиду ветвления с этой историей не всегда просто разобраться. Обычно я для этой цели пользуюсь различными визуальными оболочками, но не всегда есть такая возможность. Временами приходится пользоваться средствами консоли, а именно командой
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 сокращёнными хешами, ссылками на коммиты и относительной датой. Используемый формат: синий сокращённый хеш коммита, зелёная дата, белые сообщение и автор, жёлтые ссылки на коммит.
Читать дальше
Использование изменяемых структур в свойствах классов
все совпадения абсолютно случайны.
Занимался я как-то раз улучшением кода проекта. И наткнулся вот на такие строчки:
public class Image
{
public Rectangle Bounds;
}
«Ай-яй-яй! Публичное поле в классе, как же нехорошо-то! Нужно срочно превратить его в свойство!» — подумал я. И превратил:
public class Image
{
public Rectangle Bounds { get; set; }
}
Сделал я такое невинное изменение и сразу пошёл дальше рефакторить — ведь ещё такое количество кода нуждалось в улучшении! Ну а в конце решил я запустить на всякий случай Unit-тесты. Какого же было моё удивление, когда половина тестов упала. «Да как же так! Ведь я особо-то ничего и не менял!» Ну, поехали разбираться.
Читать дальше
Cairo — делаем графики гладкими
R обладает богатейшим функционалом по формированию различных графиков. К сожалению, иногда графики получается не настолько красивыми, как бы нам хотелось. Давайте нарисуем график синуса: x <- seq(0, 10, by = 0.1) y <- sin(x) plot(x, y, type="l") Если вы хорошо вглядитесь в это изображение, то увидите, что функция получилась не совсем гладкой. Дело в том, что стандартное графическое устройство не поддерживает anti-aliasing. Но не стоит грустить! Нам поможет Cairo! Cairo — это программная библиотека, предназначенная для рендеринга векторной графики с не зависящим от оборудования API. А для языка R есть одноимённый пакет. Вы можете почитать документацию к этому пакету, но пока что мы посмотрим работу на примере. Для начала установим пакет и подключим его: install.packages("Cairo") library("Cairo") Допустим, я работаю под операционной системой Windows и хочу просто посмотреть на гладкий график функции. Нет ничего проще: CairoWin() plot(x, y, type="l") А теперь давайте ещё раз нарисуем наш график, но результат получим в виде png-файла: CairoPNG("sin.png") plot(x, y, type="l") dev.off() # Завершаем формирование файла В Cairo-функциях можно указывать множество дополнительных параметров, таких как ширина и высота изображения, тип файла, его качество, цвет фона и многое другое. Конечно, для рабочего процесса Cairo не так уж и нужен, но при формировании отчётов о проделанной работе он поможет сделать ваши графики более привлекательными.
Читать дальше
Progress bar в R
Давайте поговорим о долгих расчётах, ведь они не так редко встречаются в мире вычислений. Когда вы запускаете скрипт, который будет заведомо долго работать, то приятно смотреть на состояние прогресса. Эта информация поможет прикинуть время до конца вычислений («осталось ещё 30%, я успею выпить чашку кофе» ) или просигнализировать о бесконечном цикле (1438% выполнено, что-то пошло не так… ). Давайте научим наш скрипт сообщать пользователю о проценте выполненных работ.
Читать дальше
R-ссылки
Английские полезные 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
Читать дальше
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-скрипта с аргументами из консоли
Для выполнения 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
Разберём эти команды чуть подробней.
Читать дальше