вторник, 11 ноября 2008 г.

Новый Blend!

Совсем недавно (в октябре) Microsoft наконец-то выпустила Microsoft Expression Blend 2. Сие чудо облегчает жизнь дизайнерам до невозможного! Перетаскиваем контролы, крутим/вертим, рисуем на них. Устанавливаем браши и градиенты.
Что бросается в глаза - IntelliSens-a нету. =( К сожалению. А может к радости. Объясню почему. 

В Студии например, когда пишешь программу, сразу видишь какие переменные, классы, функции у тебя есть. Здесь же этого не видно. С другой же стороны - лучше будешь XAML знать. (Напоминает ситуацию лет 6 назад. Были люди, которые писали на HTML в блокноте, а некоторые писали в Macromedia(сейчас Adobe) DreamViewer). Так вот. Знание основ - залог успеха в любом деле. В этом я убедился.

Что еще можно сказать по Blend? Приятный дизайн, куча функций, интуитивный интерфейс делают его незаменимым средством для разработки современных приложений. 
После установки, не забудьте сделать Update. Без него нельзя будет разрабатывать Silverlight 2 - приложения.

Интеграция со Студией делает процесс переключения между программами почти незаметным. Два раза щелкаете по *.cs файлу и вы уже в студии. Свернулись, открыли Blend - и дальше... =)
Стоит отметить, что стоимость Blend довольно дорогая для российского рядового разработчика. Но, я вам скажу, оно того стоит. Blend экономит кучу времени и дает тех возможностей, что не дает Студия. 

Например, редактировать контролы визуально. А это очень важно. Ведь не всегда же можно подобрать положение того или иного элемента вручную. А "на глаз" - самое оно!
Blend - клевая прога для творческих людей!

Знакомство с LINQ

Что за зверь? Этим вопросом я задался. Оказалось - это новая фишка от Microsoft. Позволяет делать прикольные штуки. Например выборку из массива, сортировку, упрощает работу с SQL.

Начну с простого примера!
Создаем консольное приложение (.Net Framework 3.5):

using System;
using System.Collections.Generic;
using System.Linq; //Вот наша прелесть ;)
using System.Text;

namespace LinqTests
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.WriteLine("***Fun with LINQ***");
            Console.ReadLine();
        }
    }
}

Теперь допишу функцию QueryOverStrings():
        static void QueryOverStrings()
        {
            string[] currentVideoGames = {"Morrowind", "Bioshock", "Portal", "Hover Ace", "Freelancer",  "Sonic"};
            IEnumerable subset = from game in currentVideoGames where game.Length > 6 orderby game select game;
            foreach (string s in subset)
            {
                Console.WriteLine("Item {0}:", s);
            }
            Console.ReadLine();
        }

Начну по порядку. Мы создали строковый массив currentVideoGames. Записали в него названия нескольких игрушек ;). Далее самое интересное! Используем LINQ. Мы создаем запрос subset, по которому выбираем из нашего массива только те игры, название которых больше 6-ти символов в алфавитном порядке.
Вот и все! Далее используем цикл foreach для отображения нашего запроса на экране, т.е. будут показаны игры, названия которых больше 6-ти символов, как мы и хотели.

Ну и конечно же вызываем эту функцию в main:
QueryOverStrings();
Console.ReadLine();

P.S. Посвящается всем моим знакомым, которые, по не понятным мною причинам, не хотят изучать книги по C# на английском языке.

пятница, 7 ноября 2008 г.

Регистрация и авторизация в ASP.Net

Задумал я тут сделать простенький сайт на ASP.Net
С языком разобраться не составило проблем. А вот с функциональной частью я намучался. Оказалось, что лучше всего использовать для регистрации и авторизации - базу данных MSSQL 2005. А вот как подключиться - я не знал.
Какието SQL Connection, какие-то Query. Что за ConnectionString?

Вот здесь я и расскажу что это такое и как можно подключаться к БД MSSQL не только с сайта, но и с обычных WPF или WinForms программ.

Начнем с того, что нам нужно подключиться к БД. Для этого вам нужно установить MS SQL 2005. (Сейчас уже появился MS SQL 2008) Потом вы создаете таблицу, скажем users. В таблице будет 2 поля: логин и пароль. Это просто.
Теперь нужно подключиться к этой БД из нашей программы или сайта.
Для этого мы пишем простой обработчик события. Ниже приведен код простейшей регистрации пользователя на сайте:

protected void RegBut_Click(object sender, EventArgs e)
        {
            System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection("Data Source=LH-38QGJLY27BK5;Initial Catalog=NG;Integrated Security=True");
            sqlConn.Open();

            System.Data.SqlClient.SqlCommand sqlCmd = new System.Data.SqlClient.SqlCommand("INSERT INTO users values('"+LogBox.Text+"','"+PassBox.Text+"')", sqlConn);
            sqlCmd.ExecuteNonQuery();

            sqlConn.Close();

            Server.Transfer("index.aspx",true);
        }

В первой строчке мы соединяемся с БД NG, находящейся на MSSQL-сервере LH-38QGJLY27BK5 (это имя моего компьютера, но если база находится на удаленном хосте, то здесь надо указывать его адрес).
Потом открываем подключение. И создаем запрос на языке SQL. В данном случае - записи логина и пароля в таблицу users. Выполняем этот запрос и закрываем соединение. После чего редирект на index.aspx. Т.е. после регистрации вы будете автоматически перенаправлены на главную страницу.

Авторизация делается схожим образом. Также коннектимся к БД. Только вместо команды INSERT, будет команда SELECT:

protected void EnterBut_Click(object sender, EventArgs e)
        {
            System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection("Data Source=LH-38QGJLY27BK5;Initial Catalog=NG;Integrated Security=True");
            sqlConn.Open();
            System.Data.SqlClient.SqlCommand sqlCmd = new System.Data.SqlClient.SqlCommand("SELECT * FROM users", sqlConn);
            System.Data.SqlClient.SqlDataReader sqlRead = sqlCmd.ExecuteReader();

            while (sqlRead.Read())
            {
                if (LogBox.Text == sqlRead[1].ToString() && PasBox.Text == sqlRead[2].ToString())
                {
                    AuthoTable.Visible = false;
                    LoginInfoLabel.Text = " Авторизация прошла успешно";
                    //Здесь поднимаем флажок для привилегий
                }
                else
                {
                    LoginInfoLabel.Text = "Неверный логин и(или) пароль";
                }
            }
            sqlRead.Close();

        }

вторник, 28 октября 2008 г.

Zip-архивирование в C#

Все гениальное - просто. И все простое - просто гениально! Это так!
Программирование - это тоже просто! Если программирование - сложно, значит вы не программист.

Суть в чем? В том, чтобы писать программы коротко, ясно и понятно. И работают тогда они, на удивление быстро. Самое лучшее решение - обычно самое короткое, и как показывает практика - самое лучшее.

К чему такое предисловие? Решил я заархивировать файл в C#. И как это сделать я никак не мог понять.
Иду в www.google.ru
Ввожу - "Zip архивирование в C#"
Выдает! Какая-то библиотека - SharpZipLib.
Качаю, начинаю разбираться. Вот здесь папочка Samples. Вот здесь то, вот здесь сё. Ну и так далее. Значит запускаю я эти сэмплы - вылетают эксэпшны. Не какит, думаю... Лезу в документацию. Ноль пользы.

Итак... Время поджимает. Прогу писать надо. Лезу в www.google.ru
Ввожу то же самое. Нахожу - DotNetZipLib!
На главной странице библиотеки нахожу пример кода! Вот он!
<---------------------------------------------------------------------->
try
{
using (ZipFile zip = new ZipFile("C:\\MyZipFile.zip"))
        {
         zip.AddFile("c:\\Base.txt");
zip.Save();
}
}
catch (System.Exception ex1)
{
            System.Console.Error.WriteLine("exception: " + ex1);
}
<---------------------------------------------------------------------->

Вот это да! Нет, вы представляете! "zip.AddFile("c:\\Base.txt");"
AddFile - Добавить Файл! Все просто!
Я смело подключаю библиотеку к своему проекту:
"using Ionic.Utils.Zip;"

И все! Программа работает!
Более того с помощью библиотеки DotNetZipLib можно также разархивировать архив(ы), добавить в архив(ы), и еще много чего!

Удачи!

четверг, 25 сентября 2008 г.

Как починить WMI или почему не устанавливается SQL 2005.

Недавно я решил посмотреть HD-фильм на своем ноутбуке. Но фильм начал тормозить непонятно из-за чего. Естественно дальше мои действия были такими: Диспетчер задач.

Отключил процессы. Не отключаются. Иду в services.msc. Отключаю SQL-сервисы и службы, все что нашел!

Ликую! Наслаждаюсь HD - картинкой добрых 3 часа. Потом собираюсь включать SQL, а он, зараза, не включается! =) И так и сяк. В общем напортачил до того, что у меня сломался WMI.

Переустановка MS SQL спотыкается на каком-то *.dof файле. Ну, думаю... Все, приехали. Переустановка Windows и все, что к нему прилагается займет порядка дня. Но тут один мой знакомый - системщик скинул по аське *.bat - файл. Запусти, говорит!

И произошло чудо! MS SQL 2005 поставился! =) Все заработало!

Ниже находится листинг этого *.bat файла. 

@echo on 

cd /d c:\temp 
if not exist %windir%\system32\wbem goto TryInstall 
cd /d %windir%\system32\wbem 
net stop winmgmt 
winmgmt /kill 
if exist Rep_bak rd Rep_bak /s /q 
rename Repository Rep_bak 
for %%i in (*.dll) do RegSvr32 -s %%i 
for %%i in (*.exe) do call :FixSrv %%i 
for %%i in (*.mof,*.mfl) do Mofcomp %%i 
net start winmgmt 
goto End 

:FixSrv 
if /I (%1) == (wbemcntl.exe) goto SkipSrv 
if /I (%1) == (wbemtest.exe) goto SkipSrv 
if /I (%1) == (mofcomp.exe) goto SkipSrv 
%1 /RegServer 

:SkipSrv 
goto End 

:TryInstall
if not exist wmicore.exe goto End 
wmicore /s 
net start winmgmt 
:End

Я думаю он может многим пригодиться =)

вторник, 23 сентября 2008 г.

Некоторые аспекты databinding, показ datatable в listbox

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



Во-первых необходимо связать содержимое, загружаемое из файла в listbox:

добавляем в код XAML:

< itemtemplate="{StaticResource nodsTemplate}" itemssource="{Binding}" name="listBoxNods" margin="0,30,0,0">


ItemsSource="{Binding}" означает, что источник данных, показываемых в этом листбоксе забинден к нему, т.е. они соединены между собой постоянной связью, и изменения в одном могут(если это не запрещено специально) сразу отображаться в другом.

ItemTemplate="{StaticResource nodsTemplate}" - это темплейт, с помощью которого мы рассказываем listbox'у как и что мы хотим отображать конкретно:



< key="nodsTemplate"> < name="grid">
< name="nodsPanel0" orientation="Horizontal">
< name="nodsPanel1" width="100" horizontalalignment="Left">
< text="{Binding Path = x}">
< name="nodsPanel2" width="50" horizontalalignment="Right">
< text="{Binding Path = y}">

как все происходит - listbox разбивается на StackPanelи первого вида(nodsPanel0), которые будут отображаться одна под другой, далее, каждая из этих стак-панелей разбивается еще на 2, горизонтально(за это отвечает атрибут Orientation), и в каждой из этих стак-панелей уже запихиваем те элементы которые нам нужны, в данном случае - TextBox и TextBlock, к которым привязываем конкретные данные, которые будем доставать из источника. Собствено в чем отличие текстбокса и текстблока - в том, что текстбокс изменяем, мы можем изменить в нем наши данные, и если DataTable к которой мы привязаны позволяет это - то данные от этого изменятся и в ней. Текстблок же - это просто статический текст. Т.к. стакпанели будут по умолчанию прилегать в плотную друг к другу, и занимать столько места, какова длинна данных, записаных в них, то имеет смысл для наведения красоты и для более удобного чтения данных установить фиксированную длинну через атрибут Width.в этом темплейте можно сделать еще очень много чего, но это уже не относится к теме данной статьи :) переходим в код C#.

Теперь нам необходимо указать, собственно какие данные мы забиндим к listbox:

DataTable _nods = new DataTable();

****

_nods.Columns[0].ColumnName = "x";
_nods.Columns[0].ReadOnly = false;
DataColumn tc1 = new DataColumn("y", typeof(double));
_nods.Columns.Add(tc1);
_nods.Columns[1].ReadOnly = true;

Binding bind = new Binding();
this.listBoxNods.DataContext = _nods;
this.listBoxNods.SetBinding(ItemsControl.ItemsSourceProperty, bind);

Сначала мы создаем и заполняем(это необязательно :) ) DataTable, и назначаем названия Columns. Необходимо, чтобы названия в Text="{Binding Path = x}" совпадали с названиями колонок таблицы, далее выставляем значения атрибута ReadOnly - если мы хотим чтобы данные в колонке не менялись из-за внешних воздействий(либо, например, чтобы запретить определенному кругу пользователей изменять какие-либо данные)

теперь, собственно, создаем биндинг и назначаем для листбокса его датаконтекст, и применяем биндинг. Вот и все :)


воскресенье, 21 сентября 2008 г.

XNA CTP & Future of the Xbox console...

Познакомившись с XNA Game Studio 2.0, я обнаружил в интернете упоминание об XNA Game Studio 3.0 Community Technical Preview. В прилагаемом файле было указано, что поддерживаются пиксельные и вершинные шейдеры только 3-й версии. Ограничение обосновано тем, что Xbox базируется на DirectX 9, что в принципе и понятно. Возникает резонный вопрос. Подходит ли XNA для разработки игр для Windows? Весь мир сейчас переходит на DirectX 10. Вспомним хотя бы Assasin's Creed, MS Flight Simulator X и Crysis. Эти игры сделали большой шаг к игровой индустрии. Я полагаю, что вскоре должна выйти новая консоль от Microsoft, иначе они проиграют. Идея Live! - сервиса для Xbox, где пользователи могут скачивать игры прямиком к себе на консоль, где пользователи общаются, ставят мировые рекорды в играх, вполне удачна. Если не одно но. А то, что Xbox 360 вышел в конце 2005 года. А DX10 появился в конце 2006. Следовательно можно предположить, что качество графики в играх 2007+ играх на PC превосходит качество графики на их же аналогах Xbox 360. Приставка оказывается скажем таки не в лучшем свете. Хотя тут включаются другие аспекты. Например сферы влияния. Если выпустить игру на PC, Xbox и PS3 то средненький проект окупится гораздо больше, чем если проектировать лучший проект только под одну платформу.

Мой вывод: XNA прекрасно подходит для ускоренного проектирования игр среднего масштаба и для PC и для Xbox. Причем портировать игру на Xbox совсем не сложно. А значит, меньше затрат и больше прибыли. И DirectX 10 здесь существенной роли не играет.

P.S. Следующим летом Microsoft хотят представить новую операционную систему Windows, по заявлению офф. лиц, она будет содержать DX11. Новая технология - новый шаг в будущее. Или... Увидим.