суббота, 23 июня 2012 г.

Muse записали новую пластинку

Если они её ещё не доделали, то всё равно в очень скором времени она будет готова. Промо-ролик уже в сети, а группа отправляется в новое турне с 16 октября. До конца года будут колесить по Европе, но в русскоязычные страны не заедут. Ближе всего они будут 23 ноября - в Польше.
Так что ждём к осени новый альбом и откладываем деньги на концерт божественной группы, который будем с нетерпением ждать в ближайшие год-два в Украине.

"Когда я говорил..."

"Когда я* говорил, что нужно вкладывать в сообщество и User Groups, вы вкладывали в теннисные столы. Теперь у нас много средненьких теннисистов и нет коммюнити.
Когда я говорил, что нельзя заманивать айтишников на конференции печеньками и плюшками, вы покупали пиццу, дарили футболки и айпэды. Теперь у нас любое мероприятие начинается с поисков халявы. Этим же мероприятия и заканчиваются.
Когда я говорил вкладывать деньги в обучение специалистов, вы продолжали раздавать деньги за рекомендации. Теперь у нас никто не работает, а все рекомендуют.
Когда я говорил, что нельзя платить тысячи долларов тем, кто не знает, чем абстрактный класс отличается от интерфейса, вы продолжали им платить. Теперь у нас все зарабатывают тысячи долларов, но х*й его знает, чем абстрактный класс отличается от интерфейса.
Когда я говорил, что нужно писать технические статьи, вы продолжали читать хабр и обсуждать компании. Теперь у нас хабр в шоколаде, а технические статьи никто не пишет.
Когда я говорил, что нельзя всех подряд называть «синьорами», вы продолжали их создавать. Теперь у нас куча 23-летних синьоров и все равно х*й его знает, чем абстрактный класс отличается от интерфейса.
Когда я говорил, что люди важнее процессов, вы продолжали устраивать agile тусовки и устанавливать скрам-доски. Теперь у нас тотальный скрам, а проекты, согласитесь, делаются все так же ху*во.
Когда я говорил, что не нужно задавать головоломки на собеседованиях, вы продолжали спрашивать почему люки круглые. Теперь у нас все знают почему люки круглые, но чем абстрактный класс... ну вы поняли...
Когда вы говорите, что программисты зажрались, то вы правы – ведь вы сделали все правильно!
* «Я» - это собирательный образ, любые совпадения случайны."

Пятница, 15 июня 2012, Александр Краковецкий
Оригинал: http://msug.vn.ua/Posts/Details/4752

понедельник, 18 июня 2012 г.

Стал обладателем thl v9

Давно хотел приобрести себе телефон с GPS и двумя сим-картами. Говорю я много, на местности не ориентируюсь. И вот недавно решился-таки сделать себе подарок, прочитав статью на Хабре.
Я убеждён, что телефон - не предмет фетиша и поклонения, потому решил заказать себе китайский аналог знаменитого бренда HTC.

Внезапная морковка

Увидев её сегодня утром, не смог не улыбнуться! И как такую выращивают?!


Хотите знать английский? Делайте себе английское окружение!

Идея поднять тему посетила меня совершенно внезапно. А пока набирал заглавие, вдруг вспомнил, как лет 6 назад я написал статью примерно со следующим заглавием: "Как изучать английский язык?". Ту статью объёмом в пару тысяч символов я выложил на продажу в каком-то копирайтерском агенстве и через три дня её купили за 3,5 доллара. Интересный был опыт, хотя я почему-то сразу с этим завязал.
Бытует мнение, что если человека, совершенно не знающего английский язык, отправить на годик в США, то истечении этого срока он будет хорошо говорить на английском лишь за счёт повседневного общения с иностранцами. Это - заблуждение. Устная речь не отличается большой грамотностью и многословием, поэтому язык необходимо сознательно учить. Именно тратить время и серьёзно учить, а не болтать с американскими ребятами о девочках, думая, что это лучшее учение.
Как следствие вышеприведенного заблуждения рождается ещё одно: без естественного англоговорящего окружения невозможно качественно выучить язык. Тезис тоже не совсем верен. Англоязычная среда нужна, но она не обязательно должна состоять из носителей языка. Именно об англоязычной среде я и хочу сегодня поговорить.
Для начала расскажу, каким образом я "англофицировал" своё окружение.

вторник, 12 июня 2012 г.

Действительные числа в компьютерном мире

Если вы изучали основы работы компьютера или же имели дело с программированием для этой чудо-машины, вы, возможно, помните, что вам запрещали сравнивать действительные числа. По крайней мере говорили делать это с крайней осторожностью.
Лично я совершенно позабыл причины осторожной работы с действительными числами. Недавно, выполняя небольшое задание, столкнулся с требованием: «… мы надеемся не увидеть применения оператора == к операндам типа double…». Решил освежить в памяти вопрос. Начну, пожалуй с маленького примера (1):
Пример 1:
double x = 1.0;
while (x != 0.0)
{
x = x / 2;
       Console.WriteLine(x);
}

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



Объясняется это несложно. Мы знаем, что для хранения действительных чисел компьютер отводит конечное число байт. Длинные числа округляются таким образом, чтоб влезали в это количество байт. В цикле мы постоянно делим x на 2. Таким образом x стремится к очень маленькому и очень длинному числу. Выражаясь языком математики, x бесконечно стремится к нулю, но никогда не принимает нулевое значение. Так происходит в жизни реальной. В жизни компьютерной, когда x выходит за пределы объёма отведённой ему памяти, он округляется до нуля.

Пример 2:


static void Main(string[] args)
        {
            for (int i = 10; i > -10; i--)
            {
                try
                {
                    Console.WriteLine(5 / i);
                }
                catch (Exception exep)
                {
                    Console.WriteLine(exep.Message);
                }
            }
            Console.ReadKey();
        }

Вывод для данного фрагмента следующий:


Видно, что при попытке выполнить операцию 5/0 генерируется исключительная ситуация. Этого и следовало ожидать. Теперь же смените в заголовке цикла фрагмент

int i = 10;

на

double i = 10;

Рассмотрим результат выполнения фрагмента:



Теперь же при попытке выполнить операцию 5/0 исключительная ситуация не генерируется, а результатом операции становится бесконечность. Данный факт наводит на мысль о том, что действительные числа в компьютере хранятся неточно.
Ребята со stackoverflow прокомментировали мой вопрос, созвучный с заголовком данной статейки. Для желающих копать глубже, читайте следующее:


Выводы:

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

    double a, b;
    ...
    if(a == b)
    {
        ...
    }

используйте нечто в стиле

static const double SMALL_NUMBER = 0.000000000001;
inline bool FloatNumbersAreEqual(double a, double b)
{
 return (fabs((a) - (b)) < SMALL_NUMBER);
}

Комментируйте пожалуйста.


среда, 18 апреля 2012 г.

Прелести С-строк


Странно, зачем вообще разрешать этому фрагменту компилироваться? Ну да ладно.

char* symbolArrayNoSize = new char[];
cout << symbolArrayNoSize << endl;


Имеем массив символов неопределённого размера. В результате отображения на экране скорее всего будет выводиться весь хлам до первого символа '\0'. Запуск фрагмента подтвердил предположение:


¤¤¤¤ллллллллю■ю■


Предлагаю вашему вниманию следующий фрагмент:

const int ARRAY_LENGTH = 5;
char* symbolArray = new char[ARRAY_LENGTH];
strncpy(symbolArray, "abcdefghijklmnop", ARRAY_LENGTH);
cout << symbolArray << endl;


Казалось бы, здесь всё по фэн-шую: размер массива задали, в него скопировали именно необходимое количество символов и вывели на экран. Не тут-то было:

abcde¤¤¤¤иR╕ЧиRШ¤¤¤¤

Из этого результата один прискорбный вывод: задаёшь размер массива явным образом - всё равно содержимое будет выводиться до первого встречного '\0'. Так спрашивается, какого хрена задавать размер массива, если он всё равно сомнительную роль играет? Где логика-то?


const int ARRAY_LENGTH = 5;
char* symbolArray = new char[ARRAY_LENGTH + 1];
// Length of useful data is ARRAY_LENGTH plus 1 symbol '\0',

// meaning the end of the string.
symbolArray[ARRAY_LENGTH] = '\0';
// Put the delimiter of the string on its proper position
strncpy(symbolArray, "abcdefghijklmnop", ARRAY_LENGTH);
cout << symbolArray << endl;


И только в результате вот таких манипуляций получаем ожидаемый результат:

abcde

Удобно? Не очень. Используйте обёрточные классы для С-строк. Не выделывайтесь.
Компилировал в Visual Studio 2010.