CLR via C# third Edition


Так и не дождавшись перевода CLR via С#,заказал оригинальное издание на Amazon. На удивление почта России не подвела — при оценке срока доставки 1 сентября, уведомление о посылке я увидел 2 числа. Жалко, что обложка мягкая, но не помню, когда в последний раз видел такую белую бумагу в российских книжках. Книга не зря наделена пятью звездочками рейтинга. Конечно, Рихтер иногда чересчур уходит в особенности реализации платформ, но тем не менее, пожалуй, это единственный способ узнать все подробности внутреннего устройства платформы CLR. Постоянное внимание к вопросам производительности, особенностям реализации той или иной функциональности, конечно, не пригодится при клепании формочек, но дает более глубокое понимание того, зачем вообще нужна эта функциональность, почему она работает именно так, а не иначе. Книга просто обязательна к прочтению любым профессиональным C# программистом.

Парсинг HTML в .NET приложении

Вопрос разбора данных HTML страниц для вытаскивания из них данных может встать перед любым разработчиком. Для того, чтобы уменьшить количество рутинной работы можно воспользоваться библиотекой Html Agility Pack

Например, на странице с аудио-записями Вконтакте альбомы хранятся в блоках div с атрибутом class= «audio_filter»

Пример:

<div id="album99999" class="audio_filter"
onmouseover="Audio.listOver(this)"
onmouseout="Audio.listOut(this)"
onclick="Audio.loadAlbum(11103462)">Trip-hop</div>

Код поиска таких блоков на C#:

      String page;
      //Получение содержимого html-страницы в строку page
      //...
      byte[] byteArray = Encoding.GetEncoding(1251).GetBytes(page);
      MemoryStream stream = new MemoryStream(byteArray);

      HtmlDocument doc = new HtmlDocument();

      doc.Load(stream);
      HtmlNode root = doc.DocumentNode;

      foreach (HtmlNode div in root.SelectNodes("//div"))
      {
        HtmlAttribute att = div.Attributes["class"];
        if ((att == null) || (att.Value == null) || (!att.Value.Equals("audio_filter")))
          continue;

        int index = div.Id.IndexOf("album");
        if (index != 0)
          continue;

        Album album = new Album() { Name = div.InnerText, ID = div.id };     //Новый альбом, где название содержимое блока

      }

Скачивание музыки из Вконтакте по альбомам — VKontakte Music Backuper

Vkontakte Music Backuper

Те, кому интересно конечное приложение для скачивания музыки из Вконтакте по альбомам, могут скачать его по ссылке. Для запуска требуется .Net Framework 3.5 — можно скачать с сайта Microsoft.com. Пользоваться очень просто — ввести электронную почту, пароль, авторизоваться. Если нужно, изменить ID пользователя для которого показан список аудио. Далее поставить галочки на альбомах, которые нужно скачать и нажать кнопку «скачать альбомы». Можно качать отдельные композиции. С теми же, кого интересуют буквы и реализация, продолжаем. Пользователи Linux и Mac Os могут воспользоваться приложением с помощью проекта Mono, в Ubuntu мне было достаточно выполнить полную установку Mono командой sudo apt-get install mono-complete. Далее можно запускать программу из консоли командой mono VkontakteMusicBackuper.exe либо обычным двойным кликом. Кроме того,можно воспользоваться сервисом Muzico.biz, чтобы слушать и скачивать и записи прямо с сайта.

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

Конечно же, ссылки на mp3-файлы доступны в исходном коде страницы. Кроме того, есть расширения в виде букмарклетов, такие как savefrom.net, которые отображают ссылку на скачивание прямо при воспроизведении музыки или видео. Существует очень удобное приложение для поиска и скачивания музыки из вконтакте под названием VKMusic. Хоть там и заявлена поддержка альбомов, те альбомы, что создает сам пользователь скачать нельзя.

Поэтому пишем свой велосипед. Знания о том на C# сделать скачивание файлов по http, парсить html  рано или поздно пригодятся. Правильнее было бы использовать Вконтакте API, но там все равно тоже нет возможности получения альбомов.

1. Авторизация

При авторизации пользователя в ответе возвращается ID пользователя, а так же remixsid — ключ, хранящийся в cookies браузера и передаваемый при последующих запросах к сайту. Повторяем авторизацию Вконтакте:

 public class VKUserInfo
  {
    public String SID { get; set; }
    public int UserID { get; set; }
  }

  public static class VKUtils
  {
    /// <summary> Авторизация к Vkontakte.ru с получением id и SID пользователя </summary>
    public static VKUserInfo LoginToVkontakte(String email, String password)
    {
      //создаем запрос
      HttpWebRequest wrGETURL = (HttpWebRequest)WebRequest.Create("http://vkontakte.ru/login.php?m=1&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;email=" + email + ";pass=" + password);

      //Запрещаем редирект
      wrGETURL.AllowAutoRedirect = false;
      //Выставляем таймаут
      wrGETURL.Timeout = 100000;

      //получаем весь ответ
      HttpWebResponse myHttpWebResponse = (HttpWebResponse)wrGETURL.GetResponse();

      //получаем Headers,пришедшие в ответе
      string headers = myHttpWebResponse.Headers.ToString();

      //записываем ответ в поток
      StreamReader myStreamReadermy = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));
      //получаем строку с ответом
      string page = myStreamReadermy.ReadToEnd();

      //это регулярное выражение,которое выдирает из переменной headers(а ее мы получили выше) значение sid
      Regex sidregex = new Regex("sid=([a-z0-9]+); exp");
      Match ssid = sidregex.Match(headers);
      String sid = ssid.Groups[1].Value;

      //Получение ID пользователя
      int id = 0;
      String location = myHttpWebResponse.Headers["Location"];
      if ( (location != null ) &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; (location.Length>3))
      {
        location = location.Substring(3);
        Int32.TryParse(location, out id);
      }

      VKUserInfo info = new VKUserInfo(){ SID =  sid, UserID  = id};
      return info;
    }
}

2.Получение списка аудио-записей

Читать далее Скачивание музыки из Вконтакте по альбомам — VKontakte Music Backuper

Библиотека транслитерации для .Net

Одно из возможных решений для транслитерации в приложении на C# — это  библиотека Unidecode. Единственным недостатком является большой размер библиотеки (660Кб) из-за того, что библиотека позволяет транслитерировать весь юникод(почти весь).

Использовать библиотеку очень просто:

using BinaryAnalysis.UnidecodeSharp;
String translit = "Русский текст".Unidecode();

Здесь можно найти более лаконичное решение только для русского языка.

 

 

Удобный выбор цвета из палитры System.Drawing.Color

Microsoft позаботился  о программистах, создав очень качественную стандартную палитру цветов в структуре System.Drawing.Color. Чтобы легче выбрать подходящий цвет лучшего всего пользоваться следующей картинкой(кликабельно):

В этом топике рассказано, как построить подобную табличку самому  и приводится еще одно представление с упорядочением по близости цвета:

Когда Path.Combine не работает

Метод Path.Combine, предназначенный для облегчения жизни разработчика, в действительности, содержит подводный камень, не позволяющий его использовать так бездумно, как хотелось бы.  Нелогичность (логичность от Microsoft) замечена не только мною и заключается в том, что если второй путь является абсолютным, то возвращается только второй путь.

Например:

Path.Combine("dir1", @"dir2");

В Microsoft серьезно думают, что разработчик ожидает  получить dir2. Логичной  была  бы  проверка настоящего абсолютного пути(c именем диска c:dir2) , а не просто наличие слеша(Path.DirectorySeparatorChar) в начале.

Следующий вызов Path.Combine возвращает полную бессмыслицу «dir1.dir2»

String path = Path.Combine("dir1", @".dir2");

Мораль проста — помнить об этой особенности и писать свой костыльный Path.Combine.

Используем Google Voice Search в своем приложении .NET

Публикую свой топик с хабрахабра.

Функция распознавания речи с некоторого времени доступна в браузере Google Chrome . Посмотреть как это выглядит можно, например, здесь.

Так как исходный Chromium открыт, возникает закономерное желание подсмотреть, можно ли использовать технологию в своих корыстных целях наступления мира на земле.

Как это часто бывает, все уже сделано за нас в этой статье. Все оказывается очень просто, необходимо сделать POST запрос на адрес https://www.google.com/speech-api/v1/recognize со звуковыми данными в формате FLAC или Speex. Реализуем демонстрацию распознавания WAVE-файлов с помощью C# .

Читать далее Используем Google Voice Search в своем приложении .NET