26 февраля 2009 г.

Таблица шансов

Данное приложение предназначено для изучения "Таблицы шансов" для игры в покер.

В программе есть два режима работы: тестирование и обучение.

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

Программа разрабатывалась как WindowsForms приложение под .NET Framework 2.0
Применялись следующие технологии и инструменты разработки: C#, XPath, Microsoft Visual Studio 2008 Express.

21 февраля 2009 г.

Нужна ли спецификация для проекта?

Когда-то все свои программы я писал даже не думая о том, чтобы составить хотя бы перечень из функциональностей доступных в программе. Программы писались и даже работали =) да вот только бывало, что работа над одной программой занимала огромное количество времени. И это происходило не из-за того, что программы были огромными и многофункциональными. Нет, скорее наоборот! Они были маленькие и их функциональность была смехотворна. Тогда почему же их разработка занимала много времени? Все просто! У меня небыло и малейшего плана разработки, я не задумывался о взаимодействиях одной части программы со второй.

Это было просто ужасно, так как простейшие часики с настройками, будильником, напоминалками и календарем занял полторы тысячи строк. Подумайте 1500 строк на часы, которые ничего из себя не представляли. Но не только это было причиной таких больших сроков разработки. Порой программа выходила только через несколько версий, т.е. я начинал писать с версии 1.0, а свет увидела только 1.4 =(( И все потому, что напортачив в коде, я не разбираясь начинал писать новую версию, уже более продуманную.

И все-таки, как можно было исправить это плачевное положение? Я думаю каждый программист, который сталкивался с такими проблемами уже знает ответ на этот вопрос. А может кто-то уже и использует, то про что многие знают но мало кто использует, так как считают не нужным. А зря.

Итак, мой разговор пойдет, об одной из частей разработки программного обеспечения - написании спецификации.

Часто мы не любим писать спецификации только по тому, что это достаточно нудное занятие и сразу же переходим к программированию. И в этом основная ошибка, так как написание спецификации один из основных этапов разработки. Ведь невозможно же перейти к тестированнию написанного кода еще не написав его или продавать проект, который еще не создан! Так почему мы так поступаем с написанием спецификации? Мы начинаем писать проект, когда у нас нету информации о том, что писать. Как это возможно?

Так, какую информацию можно изложить в спецификации? Наверное, самое главное это указать, полностью всю функциональность разрабатываемого приложения и определить как должен с каждой из них работать пользователь! Это очень важно, так как на этом шаге мы становимся на место пользователя и пытаемся разобраться как и что будет работать. Часто бывает, что разработчики создав приложение даже не думали как с ним будет работать пользователь. И для того, чтобы пользователю воспользоваться какой либо функциональность приложения ему приходится совершить чудеса эрудиции и свои превосходные знания компьютера. НО!

Не всегда, пользователь хорошо разбирается в компьютере. Часто люди только и знают как работать в некоторых программах и разобраться в чем-то сложном для них просто немыслимо сложно. Мне чуть ли не каждый день звонят люди, которые задают вопросы: "Как записать диск? Почему у меня не работает сеть? Почему у меня фильм открывается не тем проигрывателем?" Я думаю для нормального, хоть чуть-чуть знающего компьютер пользователя, эти вопросы окажутся смешными.

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

Допустим, мы написали о писали всю функциональность приложения и написали как со всем этим будет работать пользователь. Можно ли расширить и добавить в нашу спецификацию какую-нибудь информацию, которая может помочь при программировании? Конечно можем. Этот шаг мало кто делает (я сам так сделал только один раз =)) ) но польза от следующего действия огромна и позволяет сократить время программирования в 2 и более раз. Что это за шаг? Шаг разработки внутренней структуры самого приложения. Т.е. для каждой описанной нами ранее функциональности мы описываем из чего она будет состоять программно. Т.е. классы и для чего они нужны, взаимодействия между классами. После этого действия у нас все приложение будет уже описано, нам только останется создать все эти классы, а именно создать реализацию каждого конкретного класса, их методы.

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

15 февраля 2009 г.

Разработка службы Windows на Microsoft Visual Studio 2008 Express

Часто нам приходится писать приложения, в которых нужно написать Windows службу, которая будет следить за какими-то процессами или выполнять какую-то работу в фоновом режиме. Например, при создании сайта, часто возникает такая потребность как подтверждение email адреса только, что зарегистрировавшегося пользователя. В основе своем для реализации данного решения, мы создаем таблицу, в которой прописаны идентификаторы пользователей, их email адреса и коды подтверждения сгенерированные самим сайтом для каждого. Но вот проблема, если пользователь не прошел авторизацию, то в таблице остаются данные о его регистрации, что не очень хорошо, так как, во-первых, база данных хранит много ненужной информации (ведь таких пользователей может быть не один и не два), во-вторых, так как повторения логинов не допустимо, то может оказаться, что вновь регистрирующийся пользователь не сможет зарегистрироваться под своим любимым ником из-за "мертвой души", которой собственно и нет на сайте. Как поступить в этом случае?

Единственный выход, который пришел на ум мне, это создание службы, которая будет проверять прошел ли пользователь авторизацию в течении заданного периода времени или нет. Если нет, то запись о пользователе просто удаляется и все. Таким способом наша БД, содержит только нужную информацию и ничего более.

Но как же быть, если мы пишем сайт с помощью Microsoft Visual Studio 2008 Express в которой нету проекта для создания службы. Покупать другую версию? Не всегда есть на это деньги, да и если нужно написать всего-то одну службу и все, то это не самый лучший выход. Самым лучшим выходом из этого положения будет создать шаблон приложения Windows сервиса и просто всегда им пользоваться. При этом нам не понадобиться ни новой IDE ни установки каких-то дополнений.

Дело в том, что все, что мы пишем под .NET Framework на любом языке содержится в самой среде. Т.е. для написания ЛЮБОГО приложения не понадобиться абсолютно ничего, кроме рук, головы и соответствующих знаний.

И так, для создания нашего шаблона, запустим Visual C# 2008 Express и создадим новый пустой проект.
File-New Project...->Empty Project

Теперь необходимо добавить нужные файлы и сборки.
Первым делом добавьте в созданный нами проект файл, который будет содержать полную информацию о сборке – Assembly Information File. Назовем его AssemblyInfo.cs. Сразу после добавления его в проект, его можно просто закрыть, так как ничего изменять в этом файле мы не будем.
Далее нужно добавить файл, содержащий весь код нашей службы. Для этого добавьте в проект простой класс с именем WindowsService.cs и отредактируйте его как показано в листинге 1.
Листинг 1.
using System;
using System.Collections.Generic;
using System.Text;

namespace WindowsService
{
public class WindowsService : System.ServiceProcess.ServiceBase
{
public WindowsService()
{
InitializeComponent();
}

private void InitializeComponent()
{

}
}
}

Не забудьте добавить в Reference сборку System.ServiceProcess.
Для этого щелкните правой кнопкой мышки по папке Reference и выберите пункт Add Reference.… На вкладке .NET найдите сборку System.ServiceProcess, выделите её и нажмите кнопку OK.
Теперь нам осталось добавить класс для регистрации службы. Для этого также добавим класс с именем ProjectInstaller.cs. Исходный код данного класса приведен в листинге 2.
Листинг 2.
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;

namespace WindowsService
{
[RunInstallerAttribute(true)]
public class ProjectInstaller : System.Configuration.Install.Installer
{
public ProjectInstaller()
: base()
{
InitializeComponent();
}

private void InitializeComponent()
{

}
}
}

Не забудьте добавить ссылку в раздел Reference на сборку System.Configuration.Install.
Теперь нам осталось только экспортировать проект как шаблон. Для этого выберите File-Export Template…
Перед нами появляется первое окно мастера экспорта, в котором нам предлагается выбрать одно значение из двух:
1.Project template – шаблон проекта, который нам и нужен
2.Item template – шаблон одного файла. Т.е. это один из тех шаблонов, которые мы видим, выбирая пункт Add New Item, когда работаем с текущим проектом.

Жмем Next и видим новое окно мастера, в котором нам предлагается выбрать:
Template Icon: иконку шаблона (она будет ассоциироваться с этим шаблоном при создании нового проекта). Я оставил по умолчанию.
Template name: Имя шаблона. Желательно указать все же имя, по которому можно понять, шаблон какого проекта мы создаем. В данном случае я указал WindowsService.
Template description: Описание шаблона. Я ничего не указывал.
Output location: Папка, в которой будет храниться шаблон. Это значение изменить нельзя, так что после создания шаблона лучше скопируйте данный шаблон в папку, которая точно останется целой даже после переустановке операционной системы, так как каждый раз создавать один и тот же шаблон, все же не так и весело.
Жмем кнопку Finish и все. Наш шаблон готов. Теперь вы можете писать службы Windows и не задумываться о том, что вам нужно покупать новую версию любимой программы.

13 февраля 2009 г.

Любимые программы

Честно говоря смотря на многих блогеров я вижу одну вещь, которую делают все, ну или почти все. Часто в блогах можно увидеть хоть один пост с описанием любимых программ блогера. Я решил не отставать от всех и тоже напишу с чем же я все-таки работаю или просто, чем пользуюсь.

1. Microsoft Visual Studio 2008 Express. Моя основная среда разработки. Легкая, бесплатная и удобная.
2. Microsoft SQL Server 2008 Express.
3. Foobar 2000. По моему, самый лучший аудио плеер. Имеет множество сторонних компонентов, полностью настраивается под себя, качества звучания просто отменное.
4. Opera AC. Отличная сборка одного из популярнейших браузеров.
5. Bred 3. Самый замечательный редактор, который очень хорошо заменяет стандартный блокнот Windows.

Этим постом в блоге, я нисколько не пытался разрекламировать приведенные выше программы. Мне за это никто не платит, единственное, за что мне платят, это за работу.

9 февраля 2009 г.

ASP.NET: Хранение изображений в файловой системе.

При написании приложений ASP.NET у каждого программиста или команды программистов возникает вопрос: "Где хранить изображения? В базе данных или при помощи файловой системы?"

Наверное, у каждого свое мнение на этот счет и каждое из них можно считать верным. Я не претендую на оригинальность и правильность при решении этой проблемы, но лично я для себя выбрал файловую систему. Почему?

Смоделируем себе такую ситуацию, у нас есть сайт, например небольшая социальная сеть. Сервер на котором находится наш сайт достаточно слабый (хотя сейчас такое случается довольно редко) и лишние подключения к базе данных и поиск и выдирание из неё информации будут достаточно ощутимо его грузить. Не спорю при хранении наших изображений в файловой системе мы так же обращаемся к нашему серверу, но тут доступ происходит только к файловой системе, а база данных остается не тронутой и подключения к ней происходят только для выборки данных (информация о пользователях, статьи, новости и т.д.)

У каждого, кто пытается сохранять изображения в файловой системе, возникает один вопрос: "Как добиться оригинальности имен файлов?"

Если на сайте у пользователя есть возможность закачивать файлы, то я предлагаю следующий выход.
В корне сайта создается папка, например Users, в неё в последствии и будут закачиваться файлы. Чтобы файлы закаченные пользователем были упорядоченны, то для каждого пользователя создается папка с его именем. Например для сохранения аваторов пользователя можно воспользоваться двумя способами.

Первый: В каталоге Users создается подкаталог Avatars в который и закачиваются аватары по именам пользователей.
Пример:
/Users/Avatars/Admin.jpg
/Users/Avatars/mr_lolik.jpg
/Users/Avatars/vasja.jpg


Второй: Этот способ ни на много отличается от первого, всего-лишь в папке у каждого пользователя создается файл Avatar.jpg в котором хранится его аватар.
Пример:
/Users/Admin/Avatar.jpg
/Users/mr_lolik/Avatar.jpg
/Users/vasja/Avatar.jpg


Как же поступать с файлами, которые закачивает пользователь, например, для размещения в статьях или новостях? Тут можно размещать файлы в папке пользователя с именем состоящим из времени, когда он был закачен, например так 20081209.jpg. Здесь как видно было указано, что файл закачен 9 декабря 2008 года.

Но, что делать, если пользователь в этот день надумает закачать несколько файлов? Тут можно поступить опять двумя способами, либо добавлять префиксы с номером файла, например 20081209_1.jpg, 20081209_2.jpg, 20081209_3.jpg ... 20081209_n.jpg. Этот способ мне не нравится тем, что при закачке большого количества файлов, проверок на существование файла будет очень много, а именно ровно столько, сколько файлов было сегодня залито, что согласитесь не очень удобно.

Самым на мой взгляд удобный способ это сохранение файла по следующему шаблону: [Год][Месяц][День][Час][Минута][Секунда][Миллисекунда].[расширение файла], то есть файл может выглядеть как 200812092345012.gif

8 февраля 2009 г.

Microsoft объявляет о выходе первого пакета обновлений (SP1) для русской версии Visual Studio 2008

28 октября 2008 года компания Microsoft объявила о выходе русскоязычных версий всех редакций Visual Studio 2008, Библиотеки MSDN и сервера Team Foundation Server 2008. Сегодня мы рады сообщить вам о выпуске первого пакета обновлений (SP1) для всех редакций, в который вошли все изменения и дополнения, ранее доступные только в английской версии. Начиная с этого момента, все последующие выпуски Visual Studio будут выходить с минимальным запозданием по отношению к английской версии.
Больше информации...
Честно говоря, раньше относился немного с сарказмом к русским версиям различных сред разработки. Нет дело не в том, что я так уж хорошо знаю английский, нет скорее наоборот. Просто переводы всегда делали не профессионалы и порой даже не сама компания разработчик ПО, по этой причине после установки русификатора все начинало ужасно глючить и вылетать. По этой причине никогда не использовал переведенные версии сред разработки. Но сейчас смотря на то, что переводы Visual Studio делает сама Microsoft становится интересно. Может стоит скачать и посмотреть, что за зверь такой русская студия.
Русский MSDN я уже активно использую и очень доволен, так как уже не приходится достаточно долго сидеть и переводить, что же написано.

7 февраля 2009 г.

Новые сообщения в блоге

Что-то давно я не заходил в свой блог. Создавая его я думал, что начну писать в нем свои мысли об IT индустрии, да и просто обо всем, но что-то не получилось. То ли из меня плохой блогер, то ли у меня просто нету подходящих мыслей? А может это просто лень? Наверное так. Ведь мыслей много, даже слишком много, так что постараюсь писать почаще. Хотя бы просто для себя, так как читателей у этого блога похоже нету =).