Блог

Переход с WinForms на MVC

Первая реализация ASP.NET использовала WebForms – самая ужасная идея для Web программирования. На то, чтобы это понять, у Microsoft ушло некоторое время, но за это время народ успел уже создать сайты на этой технологии. Но вот Microsoft уже одумалась и уже давно предлагает программистам более интересный и качественный вариант – MVC (Model View Controller).

Но только проблема в том, что старый вариант C# и ASP.NET использовали URL в виде ИмяФайла.aspx, после чего идут параметры страницы. А вот в MVC предлагается немного более гибкий вариант controller/action. Controller определяет файл, который будет обрабатывать запрос, а Action – это имя метода. Это очень удобно, но что делать, если у вас уже есть сайт на WebForms и не хочется терять старые URL, чтобы не терять ссылки, которые уже набраны. Ведь если изменить URL страниц, то все, что ссылается может быть разрушено.

Программирование игр для iPhone

Игрался, игрался собственным движком для игр под iPhone и меня это постепенно так затянуло, что уже стала получаться небольшая игра. Немного усилий и она может стать похожей на завершенный продукт, который можно будет выложить на всеобщее скачивание.

Давно я не работал с графикой особенно OpenGL, поэтому первые шаги давались с трудом. Потом все шло со скрипом, потому что не хватало знаний в Objective-C. Но по мере набора этих знаний все зашевелилось на много быстрее. Сегодня закончил класс аниматора, который должен амнистировать спрайты и сразу же произошел скачок в моей работе.

Ошибки в Objective-C

Играюсь с Objective-C, изучаю его и заодно пишу пару небольших примеров. Один из них связан с интернет программкой, другой – графический движок для себя (вспоминаю OpenGL). В одном месте у мне понадобилось часто использовать однообразные объекты, причем очень много раз. Логично стало не загружать их каждый раз и не освобождать память, а написать кэш, который будет сохранять данные для меня.

В качестве кэша я сделал статичную переменную для менеджера кэша, а сами данные решил размещать в NSMutableDictionary. Это что-то типа хэша. Переменная для хэша была объявлена у класса, а метод получения данных из него выглядит следующим образом:

Прикольные числа Double

На работе у парня возникла проблема, он не мог никак получить нужное число при округлении вещественного числа. Он долго не мог понять, почему следующий пример не дает правильного ответа:

if ((int)(double.parse("19.99") * 100 )== 1999) {
  Счастье
}
else {
  Что за фигня
}

Он никак не мог понять, почему он постоянно оказывается в блоке «что за фигня», вместо счастье. Я говорю ему, что числа double никогда не хранятся точно, они хранятся долбанутом приблизительном формате. После double.parse("19.99") вы никогда не получите double число 19.99. Вместо этого вы получите что-то типа 19.9899999991. Именно так хранится double число в памяти компьютера.

С чего начинать изучать программирование

Сегодня увидел в комментариях на блоге предложение народу начинать изучение программирование с Паскаля. Паскаль и С примерно одинаковы в изучении. У них синтаксис разный, но идея схожая. Недостаток начинать с этих языков - придется изучать указатели, выделения памяти и освобождение ресурсов. Вот почему раньше начинали изучать программирование с бейсика, а я рекомендую сейчас начинать с С#. Просто это проще.

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

С другой стороны, если начать изучение с C# и просидеть на нем хотя бы год, человек привыкнет не освобождать ресурсы и на C++ может даже не захотеть переходить. Я сейчас играюсь с Objective-C и во всех своих проектах включаю автоматический подсчет ссылок. После четырех лет безвылазного программирования на C# (до этого программировал на нем, но меньше, просто последние 4 практически только на нем и писал), мне лень заморачиваться с операторами release. Хватит того, что мне приходится делать две операции alloc и init.

Объединнение таблиц в SQL Server

Сейчас ВОВА в комментариях показал, что не все понимают, как работает SQL сервер. Это нормально, если вы не работали с оптимизацией достаточно долгое время, чтобы знать, как работает оптимизатор SQL Server. А в боьшинстве случаев он работает отлично и иногда даже откровенно тупой запрос может выполнить быстро. Было предложение перенести одно из сравнений в on. Просто для прикола, возьмите и напишите вот такой запрос:

select * 
from Table1 a
	inner join Table2 at on a.ID = at.ID

Замерьте план его выполнения и замерьте статистику (set statistics io on). Для замера статистики выполните запрос пару раз.

Стоит ли использовать LINQ

Еще когда появился Linq, я назвал эту технологию прикольной, но не рекомендовал к использованию. И я сам не использовал его вплоть до ноября прошлого года. В ноябре на работе дали небольшой проект, в котором мы не могли использовать внутренние наработки, потому что весь исходный код мы должны были передать клиенту и сайт хостится на стороне клиента.

Перед началом работы над сайтом я спросил парня, с которым мы делали сайт, что он хочет использовать и он предложил Entity Framework в связке с Linq, потому что он уже имел опыт работы с этими технологиями. Ну и фиг с ним, я учусь мега быстро, поэтому согласился. Ну что я могу сказать. . . , Microsoft уже придумало дофига различных технологий и фреймворков доступа к данным и поверьте мне, Entity Framework – не последний, потому что ничего особенного там нет, только неудобства.

Я с громадным шоком узнал, что операция .OrderBy(string) возможна далеко не всегда. У нас есть правило, что если мы строим какую-то таблицу данных на странице, то таблица должна сортироваться по любой колонке, которую захочет пользователь. Во внутренне корпоративном фреймворке это решается банально:

Запрос умирает при сравнении двух дат

Писал запрос для банковской базы с классическими транзакциями кредита – дебита. Прибыл кредит, его можно потратить. Дебитовая транзакция связывается с кредитовой, чтобы было видно, какая кредитовая транзакция была потрачена. Запрос выглядит примерно так:

select credit.TxnID, credit.Expiry, debit.Transacted, debit.Amount
from credit
   inner join creditdebit on . . .
   inner join debit on . . .
where debit.Transacred > '2012.01.01' 
   and debit.Transacted < ''2012.01.02

Предупреждения warning после компиляции

Меня просто невероятно бесят предупреждения во время компиляции. Я на работе задолбался уже подчищать предупреждения и просить не оставлять их в коде. Один парень регулярно объявляет неиспользуемые переменные и оставляет их, особенно в блоках try:

try {
 . . .
 . . .
}
catch (Exception e) {
}

Странное сообщение об ошибке

Сегодня написал метод, который выглядел примерно так:

public methodName(int id) {
  int i = id + 1;
  ...
  ...
}

О блоге

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

Обратная связь

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

Пишите мне