Блог

Прикольные числа 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;
  ...
  ...
}

Убить процесс в MacOS X

У меня программы зависают не так часто, и в большинстве случаев падаем ModoDevelop, XCode, MAMP или Word. Как видишь большинство из этого относится к программированию. О зависании Microsoft Word я уже писал, у него есть прямо болезнь какая-то при вставке текста. Я в Word очень часто пишу тексты для заметок, а потом с помощью Command+V расставляю теги типа <p>. Проблема в том, что при выполнении Command+V иногда Word зависает. Его убивать достаточно просто, достаточно нажать Option+Command+Esc (почти аналог Ctrl+Alt+Del), появляется окно выбора программы, выбираем Word и нажимаем Force Quit.

Среды разработки – ModoDevelop и XCode, просто падают. Они не зависают, а вылетают с ошибкой. Так что их убивать не приходится. Ну а MAMP иногда зависает при перезагрузке компьютера. Это бесит, потому что это останавливает процесс перезагрузки и никаких предупреждений. Просто перезагрузка не идет. В первый раз я начал методом тыка убивать программы и после того, как убил MAMP, перезагрузка пошла без проблем.

Как изменить параметр в Request в C#?

Как изменить параметр в Request в C#? Проблема в том, что MS сделала этот параметр только для чтения.

Интересно, а нафига Microsoft сделала параметры Request только для чтения. Вот реально не вижу смысла защищать их от изменения пользователям. В PHP перед выполнением сценария я могу пройтись по всем значениям $_GET, $_POST и $_COOKIES и экранировать их так, чтобы никакая зараза не проникла в мои сценарии.

У меня в каждом сценарии вызывается функции подключения к базе данных. В этой же функции я экранирую все, что может вызывать опасность. Например, $_GET параметры экранируются так:

 foreach ($_GET as $inx => $val) {
 $_GET[$inx] = htmlspecialchars($_GET[$inx]);
 $_GET[$inx] = ini_get(magic_quotes_gpc)?$_GET[$inx]:addslashes($_GET[$inx]); 
}
 

О блоге

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

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

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

Пишите мне