суббота, 23 февраля 2008 г.

Книжка про ИИ

Читаю сейчас книгу "Исскуственный интеллект - современные подходы". Скачать можно тут.

Рекомендую :)

P.S.: Больше всего меня поразил ее размер - 1400 страниц!

среда, 13 февраля 2008 г.

Книжки по C# 3.0

Нашел тут несколько книжек по C# 3.0:

OReilly.Programming.C.Sharp.3.0.5th.Edition.Jan.2008.pdf

OReilly.C.Sharp.3.0.Design.Patterns.Jan.2008.pdf

OReilly.C.Sharp.3.0.Cookbook.3rd.Edition.Jan.2008.pdf

Пожалуй стоит почитать... Особенно про паттерны.

P.S.: на сайте надо будет зарегистрироваться - иначе скачать не получится

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

Гугл знает всё!

Хотите узнать будущее? По крайней мере историю освоения космоса Гугл знает :)

P.S.: терпеливо пролистал результаты поиска - последняя известная дата - 2706. Видимо тогда и наступит конец света. Или гугл сломается :)

четверг, 31 января 2008 г.

Немного о малоиспользуемых операторах С# №2

Прочитал сейчас вот это и сильно удивился. Как-то мне показалось, что оператора ?? в языке C# нет. Просто читал я о нем в контексте "неплохо было бы добавить вот такую фичу" и почему-то решил что это относится к 3.5 фреймворку. На всякий случай решил проверить - действительно работает во втором фреймворке :)

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

Обычно такая проверка осуществляется следующими способами (в зависимости от контекста):

#1

if(value1 != null)
{
  ... //работаем с value1
}


#2

if(value1 == null)  return;


#3

value3 = value1 != null ? value1 : value2;
... // работаем с value3


Лично я предпочитаю использовать вариант №2 там где это возможно. Это позволяет уменьшить уровень вложенности внутри функции. А это, в свою очередь, упрощает ее чтение.

Использование же оператора ?? позволяет упростить запись #3:

#3.1

value3 = value1 ?? value2;
... // работаем с value3


Удобно!

пятница, 25 января 2008 г.

Немного про почту

Последние три дня при слове "почта" громко матерюсь и скреплю зубами :)

Собственно, начну с начала.

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

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

Облом. Нету. И не было. Т.е. SMTP - есть, а POP3 - нету! Громко ругаюсь и лезу в гугловский поиск по исходникам. Нахожу несколько вариантов, но... все с разными глюками и на нужных мне письмах - падают. Наконец, после некоторого времени мучений и экспериментов я собираю из двух проектов более-менее рабочую конструкцию.

И все было-бы хорошо, пока я не попытался отправить письмо стандартными средствами фреймворка самому себе.

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

Естественно, хлипкая конструкция для получения писем начала падать :( Путем целого дня отладки выяснилось, что научить ее корректно обрабатывать заголовки сообщения, написанные с маленькой буквы невозможно - фактически пришлось бы переписать 90% кода парсинга сообщений.

Сегодня опять полез в гугл - на этот раз нашел кое что более полезное проект OpenPOP.Net. Удивительно, но он не упал ни на одном письме из почтового ящика, включая и подписанные сертификатами :)

P.S.: кстати, после формирования и отсылки письма, содержащего аттачмент средствами класса System.Net.Mail.SmtpClient необходимо вызвать метод MailMessage.Dispose (т.е. у переменной, в которой производилось формирование письма). В противном случае файл-вложение окажется заблокирован на неопределенное время и его нельзя будет ни удалить ни перезаписать пока не отработает сборщик мусора или программа не завершится.