суббота, 4 октября 2014 г.

Ошибки .NET Runtime 2.0

В процессе работы, приложение .NET может столкнуться с исключением, которое оно по тем или иным причинам не обрабатывает. В этом случае вдело вмешивается среда CLR. Принимая пропущенное приложением исключение, CLR обрабатывает его и выдаёт пользователю на экран монитора информационное окно .NET Runtime 2.0 Error Reporting с сообщением о возникшей у приложения проблеме. После закрытия окна, CLR завершает работу некорректного приложения. При этом описание и параметры возникшего исключения дублируются CLR в событийном логе Windows в разделе приложений. Возникает естественный вопрос - а можно ли по зафиксированной в логе информации понять в каком месте приложения возникла исключительная ситуация, с тем чтобы внести необходимые исправления? Ответ Да. Посмотрим как это можно сделать.

среда, 3 сентября 2014 г.

InputBox в C#

C# предлагает разработчику удобный класс MessageBox в пространстве имён System.Windows.Forms. Однако ориентирован он исключительно на диалоговые окна вывода различного рода сообщений. Диалоговых окон ввода данных (InputBox) не предусмотрено. Странная асимметрия. А ведь получать данные от пользователя приходится почти в каждом проекте! Конечно, можно создать собственный класс диалогового окна и реализовать весь необходимый функционал. Но гораздо быстрее и проще в условиях ограниченности времени использовать InputBox из сборки Microsoft.VisualBasic.dll. Подключив сборку к проекту, можно написать в тексте программы
var s = Interaction.InputBox("Text", "Caption", "Value", posX, posY);
Первые три параметра имеют формат строки. Последние два в формате целого числа управляют расположением окошка на экране монитора. Это очень важные параметры, так как InputBox не предлагает никаких средств для привязки его к родительскому окну. Поэтому, чтобы окошко не появлялось на экране где попало используется его позиционирование. Значение введённое пользователем возвращается функцией InputBox в виде строки.

пятница, 27 июня 2014 г.

Работа с zip в C#

Работая в рамках NET Framework 3.5 не нашел понятных и простых в использовании встроенных средств для создания zip архивов. В версии 4.5 такой проблемы нет. Сборка System.IO.Compression содержит класс ZipFile удовлетворяющий меня вполне. Однако в низших версиях указанная сборка содержит только два класса GZipStream и DeflateStream. Есть конечно еще и сборка System.IO.Packaging, но формат генерируемого ею файла zip несколько отличается от стандартного и заточен скорее под XML. Таким образом, встроенных средств работы со стандартными zip файлами в dotNET 3.5 попросту нет. Осознав этот печальный факт я скрипя сердце стал искать сторонние средства. Таких нашлось немало, но я упомяну лишь два из них.

понедельник, 2 июня 2014 г.

Пакет R

Скромная буква R английского алфавита открылась передо мной совершенно неожиданной гранью. За казалось бы рядовой буквой скрывается мощнейший пакет по обработке, анализу и визуализации данных, причем вся эта мощь в рамках GNU. Это ли не радость! Кому как, но я определенно испытываю некоторое удовольствие от осознания сего факта. Чувство такое, будто среди  полчища разнообразных инструментов ты нашел тот, который давно искал. И как раньше я не замечал его? Лирика это прекрасно, но - ближе к инструменту...

Собственно для работы потребуется движок R, существующий под разные платформенные оси, и некоторый IDE слой позволяющий этим мотором управлять. Движок лежит здесь http://www.r-project.org/, IDE здесь http://www.rstudio.com/.

Сначала качаем и устанавливаем движок. Затем IDE. Процесс установки не описываю, так как сие действие прошло без единого сучка и с минимальным количеством усилий. Однозначно, чувствуется класс разработчиков. А как же иначе, если пакетом пользуются очень солидные учебные, научные учреждения, промышленные корпорации и холдинги с высокой долей научного участия. После окончания установки запускаем RStudio. Выполним небольшой примерчик - построим график функции sin(x)/x.

Слева у нас располагается окно консоли в котором будем набирать команды. R является интерпретатором поэтому сначала мы формулируем действие, затем передаем его на исполнение движку. Правая часть предназначена для вывода и разбита горизонталью на две секции.

Первым делом сформируем массив значений абсциссы x в виде дискретной выборки интервала [-10, 10] с шагом 0.1, подав на консоль команду
> x=seq(-10, 10, by=0.1)
После нажатия на клавишу Enter в верхней секции правой части появиться массив с рассчитанными значениями. Далее вычислим в каждой точке массива значение функции
> y=sin(x)/x
Рассчитанные значения ординаты появятся под значениями абсциссы. Осталось только построить график, например по точкам
> plot(x, y)
Построенный график смотрим в нижней секции правой части.
P.S. Остальное, как говориться, по вкусу. Хотите большего, посетите ссылку
http://r-analytics.blogspot.ru/


пятница, 16 мая 2014 г.

Вызов внешней программы из приложения C#

В практике программирования бывает возникает необходимость вызова из приложения некоторой внешней программы возможно с передачей ей списка аргументов. В C# эта задача решается средствами System.Diagnostics.Process. Приведу небольшой пример, показывающий имеющиеся в распоряжении программиста возможности.

понедельник, 17 февраля 2014 г.

Восстановление пароля в Debian

Вот и случилось событие, с которым рано или поздно может столкнуться пользователь. Я забыл пароль на вход в Debian (Wheezy). Произошло это совершенно незаметно. Как ни напрягал я свою память, какие комбинации не пробовал, ничто не помогало. В общем приключилась печалька. Однако процесс восстановления пароля оказался на удивление тривиальным. Я буду рассматривать подход с применением установленного в систему загрузчика GRUB...

В загрузочном меню GRUB выбираем образ, используемый по умолчанию и нажимаем клавишу с англицкой буквой 'E' (Edit). В появившемся окне находим строку ядра (в которой указан vmlinuz), переходим в ней на ro и заменяем на rw init=/bin/bash. Остальную часть строки удаляем. Нажимаем F10 для загрузки. Система вывалиться в консоль с которой пароль пользователя можно задать командой passwd. Эта команда однако может быть не обнаружена. Если это случилось, консоль выдаст bash: passwd: command not found. Причина в том, что каталог usr размещается на отдельном разделе, который не монтируется автоматически. Сделаем это ручками подав на консоль команду mount /dev/устройство_с_каталогом_usr. Такой синтаксис предписывает mount монтировать в соответствии с файлом fstab. Всё! 
Немного больше информации о проблеме можно найти здесь: Сброс пароля root.