Проблема с FPU при вызове .NET-логики из Delphi



Ситуация: мы пишем основную логику приложения на C#, но есть необходимость использовать её из Delphi. Для этих целей пользуемся COM-обёрткой, которая успешно справляется с поставленной задачей. Целевая функция перед возвращением результата показывает диалоговое WPF-окно, с которым можно сделать что-нибудь полезное. Проверяем на простом примере — всё отлично работает.

Проблема: в некоторых Delphi приложений окно выбрасывает исключение. Но исключение странное: при формировании WPF-окна падает, скажем, выставление ширины некоторого элемента. Но это только в некоторых приложениях. А в остальных — тот же самый код на тех же самых данных отлично работает.

В чём же дело?


Читать дальше


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



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


Читать дальше


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



Основные:

Интерактивные обучалки:
Читать дальше


Просмотр истории коммитов в 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

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


Читать дальше