четверг, 16 августа 2012 г.

NET C# - byte[] to string, string to byte[]

Если мы работаем, например, с кодировкой ASCII, то для таких преобразований нам понадобится абстрактный класс Encoding расположенный в пространстве имен System.Text.

Пример 1:
byte[] helloWord = new byte[] { 72, 101, 108, 108, 111, 33 };
Console.WriteLine(Encoding.ASCII.GetString(helloWord)); // -> Привет

Пример 2:
string helloWord = "Hello!";
byte[] helloWordBytes = Encoding.ASCII.GetBytes(helloWord);
helloWordBytes.ToList().ForEach(n => Console.WriteLine(n)); // -> 72 101 108 108 111 33

Путаница с host файлом в 64-ех разрядной системе


В повседневной жизни довольно часто приходиться править hosts файл. И все мы прекрасно осведомлены, что его месторасположение всегда находилось, находится и будет находиться (возможно) по следующему пути %systemroot%\system32\drivers\etc. Все прекрасно если дело касается 32-ух битных систем. Но если у вас 64-ех битная система (Vista, Windows 7), то тут возникает одна проблема. Дело в том, что в %systemroot% существует две папки system32: System32 и SysWOW64. В какой же из них будет находится "нужный" нам hosts? Быть может их и вовсе два, и какой же нам нужен? На самом деле, hosts файл существует только в одном единственном экземпляре и находится он всегда в папке System32. Стоп, а как насчет SysWOW64? Ведь по логике это должка быть 64-ех битная версия изначальной System32? На самом то деле, именно в папке System32 и находятся 64-ех битные версии исполняемых файлов! Таким образом название папки не изменилось для 64-ех битных систем. Это сделано специально для обратной совместимости. И да, в SysWOW64 находятся 32-ух битные версии исполняемых файлов (при запуске 32-ух битных приложений WoW64 перенаправляет их в папку SysWOW64).

Итак мы разобрались где находится нужный нам hosts файл. Но как же его отредактировать? Дело в том, что я пользуюсь Total Commander'ом и в %systemroot%\system32\drivers я не могу найти папку etc в которой расположен hosts (даже при включенном показе скрытых файлов). Насколько я понял, это связано с тем что 32-ух битные версии программ не могут видеть 64-ех битных "товарищей". Для Total Commander'а это решается просто. В нижнюю строку вводим %Windir%\System32\drivers\etc и оказываемся в папке с нужным нам файлом. Если не хочется вводить путь можно вручную "дойти" до папки drivers и затем ввести "cd etc".

Чтобы hosts сразу отредактировать в notepad или notepad++: нажимаем CTRL-O, вводим уже знакомый нам путь %Windir%\System32\drivers\etc и открываем файл.

PS Обратите внимание, что  %systemroot% и %Windir% указывают на C:\Windows. Можно проверить через консоль.

воскресенье, 5 августа 2012 г.

.NET C# - Особенность модификатора readonly

Каждому известно, что инициализация readonly полей класса может осуществляться только при помощи инициализатора поля или же в конструкторе.
class Person
{
    private readonly int _age;

    public Person()
    {
        _age = 10;
    }
}
А что если нам надо провести инициализацию например в каком-нибудь методе класса и вызвать его из конструктора? Например так
class Person
{
    private readonly int _age;

    public Person()
    {
        Init();
    }

    private void Init()
    {
        _age = 10;
    }
}
Компилятор нам этого сделать не позволит. Выход из данной ситуации есть и состоит он в применении ref и out модификаторов.
class Person
{
    private readonly int _age;

    public Person()
    {
        Init(out _age);
    }

    // Применяем out но можно и ref
    private void Init(out int age)
    {
        age = 10;
    }

}
И это сработает! На этот раз компилятор ругаться не будет. Вот такой вот небольшой обходной путь при инициализации readonly полей из методов класса.

среда, 1 августа 2012 г.

Переменные среды в Windows

Недавно понадобилось усердно поработать с командной строкой. Решил записать то, что вскоре может быстро забыться.

пятница, 13 июля 2012 г.

Android - Gmail login failed

Недавно появилась проблема с логином на электронную почту на моем Андроид устройстве. После ввода стопроцентно-правильного пароля, приложение мне сообщало что-то наподобие этого "You have entered the wrong password or that your account has changed". В общем полный фуфел. В чем же суть?

Суть в том, что если у вас включена двух-этапная верификация аккаунта, то для мобильного телефона, пароль который подходит к почте, не подойдет к самому аппарату. Для него есть отдельный пароль, и называется он application-specific password. Вот ссылка для его получения.


среда, 6 июня 2012 г.

.NET C# - Typesafe Enum Pattern

Недавно понадобилось сделать перечисление со строками. Перечисления в .NET поддерживают только численные типы (byte, sbyte, short, ushort, int, uint, long, ulong) но к сожалению не поддерживают конструкцию типа
enum ImagePath : string
{
    BIcon = "Images/BIcon.jpg",
    PIcon = "Images/PIcon.jpg",
    GIcon = "Images/GIcon.jpg"
}
Но выход есть!

пятница, 1 июня 2012 г.

WPF - Установка Image.Source через код

Предположим вот такую разметку:
<Window x:Class="WPFApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Name="mainWindow"
        Title="WPFApp" Height="550" Width="1045">
    <Grid Name="rootWindow">
        <Image Height="55" Width="55" HorizontalAlignment="Left" Name="img" Stretch="Fill" VerticalAlignment="Top"  />
    </Grid>
</Window>
   
Как мы в этом случае установили бы атрибут Source для указания на нужную для отображения картинку? Нет ничего проще, чем сделать это непосредственно в самой разметке, где мы задаем атрибут Source и указываем путь к изображению.
<Image Source="Images/PIcon.jpg" Height="55" Width="55" HorizontalAlignment="Left" Name="img" Stretch="Fill" VerticalAlignment="Top"  />
В данном случае картинка располагается в папке Images, которая в свою очередь находится в корне всего проекта. Все это конечно прекрасно но что если мы хотим установить путь к картинке из кода? Первым, пришедшим мне в голову решением, был следующий фрагмент кода
img.Source = "Images/PIcon";
Упс! Такая запись в корне неверна. И какая же удовлетворит WPF?

WPF - Добавление элементов через код

Итак, предположим у нас имеется вот такая вот начальная разметка XAML:
<Window x:Class="WPFApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Name="mainWindow"
        Title="WPFApp" Height="550" Width="1045">
    <Grid Name="rootWindow" />
</Window>

Наша цель добавить элемент, ну например Button, в дискриптор Grid'а. То есть, чтобы во время выполнения программы, разметка приняла вот такой вид:
<Window x:Class="WPFApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Name="mainWindow"
        Title="WPFApp" Height="550" Width="1045">
    <Grid Name="rootWindow">
        <Button Content="Press me" Width="75" Height="50" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="100,50,0,0" />
    </Grid>
</Window>

пятница, 18 мая 2012 г.

.NET C# - Multicast Delegates (Part 1)

Все делегаты в C# наследуются от MulticastDelegate класса (который в свою очередь наследуется от базового класса делегатов Delegate). MulticastDelegate содержит в себе массив объектов Delegate. Это означает то, что любой делегат может содержать в себе ссылки на множество методов. Для того чтобы получить список всех методов в каком-либо объекте делегата, необходимо вызвать метод GetInvocationList(). Перейдем к примерам.

четверг, 17 мая 2012 г.

.NET C# - Отправка e-mail'а

Отправляем e-mail на примере яндекса. Необходимые классы находятся в System.Net.Mail.
static void SendEmail()
{
    MailAddress from = new MailAddress("addressFrom@yandex.ru", "Display Message", Encoding.UTF8);
    MailAddress to = new MailAddress("addressTo@yandex.ru");

    using (SmtpClient client = new SmtpClient(@"smtp.yandex.ru"))
       using(MailMessage message = new MailMessage(from, to))
       {
           client.Credentials = new NetworkCredential("userName", "userPassword");

           message.Body = "This is a test e-mail message sent by an application. ";
           message.Body += "Hello wanderer!";
           message.BodyEncoding = Encoding.UTF8;
           message.Subject = "Important note!";
           message.SubjectEncoding = Encoding.UTF8;

           // Optional
           //message.Attachments.Add(new Attachment("D:\\AwesomePicture.gif"));

           client.Send(message);
       }
} 

среда, 16 мая 2012 г.

.NET C# - Замыкания

Реализация замыканий в C# реализована таким образом, что при захвате внешней переменной (по отношению к анонимному методу) захватывается сама переменная, а не ее значение в момент непосредственного захвата. Пример:
static void Main()
{
      int num = 1;
      Action action = () => Console.WriteLine(num);
      num = 2;
      action(); // Outputs: 2
}