понедельник, 30 марта 2009 г.
установка IE8 ломает Visual C++
после установки последнего IE8 в Visual C++ 2005/2008 не работают(выдают ошибки в скрипте) несколько визардов:
- Add Function
- Add Variable
- Smart Device – New Project Creation
- Smart Device – Add Class
причины в изменение поведения IInternetSecurityManager интерфейса, описание и воркараунд в Visual C++ Team Blog
среда, 25 марта 2009 г.
В Украине создается реестр легально ввезеных телефонов
1. до 30 сентября мобильные операторы обязаны предоставить УГЦР информацию об IMEI-номерах телефонов, обслуживаемых их сетью,– они будут включены в реестр и считаться легальными.
2. В дальнейшем операторов мобильной связи обяжут проверять IMEI-коды телефонов. Если окажется, что аппарат отсутствует в реестре, на экране мобильного телефона при его включении будет высвечиваться предупреждение и предложение обратиться в УГЦР, где телефон смогут внести в реестр (только предупреждение? сеть будет обслуживать телефон? это пока не ясно, но скорей всего со временем запретят обслуживать такие телефоны)
ps: вот мы и доприкалывались с беларусов, где тоже создается такоей реестр.
вторник, 24 марта 2009 г.
Interview Question: implement itoa
относительно atoi на интервью, меня поправили, имелось в виду itoa, но назвали ее atoi.
Вопрос про itoa популярен, но реализация через деление не интересна, слишком скучно и просто. Поэтому реализовал без использования умножения и деления, только сложение и работа со строками.
ф-ция получилась короткой - табличка с уже подсчитаными степенями двойки и куча сложений. Почти половину в этом коде занимает реализация добавления первого символа в строку без использованя дополнительного буфера. А весь magic происходит в SymbolicAdd.
char* power_of_two[] =
{
"1","2","4","8", "16","32","64","128",
"256","512","1024","2048","4096","8192","16384","32768",
//custom itoa implementation limited to radix 10
//idea is: each digit in position N in binary value means
//"add Digit(1 or 0) * 2^N to common sum"
//lets do it, but use symbol strings instead of binary values
char* CustomITOA(int value, char *dst)
{
bool below_zero = value < 0;
if(below_zero)
value *= -1;
*dst = '0';
*(dst+1) = 0;
int nbins = sizeof(int) * 8 - 1;
for(int i=0; i < nbins; i++)
{
if(value & 0x1)
{
SymbolicAdd(dst, dst, power_of_two[i]);
}
value = value >> 1;
}
if(below_zero)
{
//add leading "-" to result string
char cbuffer_first = '-';
char cbuffer_second = cbuffer_first;
char* str_cursor = dst;
do
{
cbuffer_second = *str_cursor;
*str_cursor = cbuffer_first;
if(0 == cbuffer_first)
break;
cbuffer_first = cbuffer_second;
++str_cursor;
}
while(true);
}
return dst;
}
Получилось просто, но SymbolicAdd намного сложнее(детали в сырцах). Что она делает: берет две строки вида "125", "236" и возвращает строку "361", а всередини реализован своеобразный алгоритм сложения в столбик.
понедельник, 23 марта 2009 г.
реализовать atoi на интервью
Вот мой вариант сделаный на коленках (проверка на переполнение опущена) в основном из спортивного интереса(своеобразная разминка от багфиксинга). Алгоритм - первое что пришло в голову, возможно есть и более эфективные:
#define SPACE_SYM ' '
#define MINUS_SYM '-'
int atoi_custom(char* src)
{ int result = 0; //really returns int value
char* current_symbol = src; int digit_indx = 1; if (!src) return 0; //let`s treat first word in string as a decimal number bool first_symb_found = false;
// second part of the IF expression can be optimized, //but it is more human readable as is while(*current_symbol != 0 && (SPACE_SYM != *current_symbol || !first_symb_found))
{ //ignore leading spaces if(!first_symb_found && *current_symbol != SPACE_SYM) first_symb_found = true; current_symbol++;
}
//string not found, exit if(current_symbol == src) return 0; for(current_symbol--; current_symbol >= src && SPACE_SYM != *current_symbol;
digit_indx*=10, current_symbol--)
{ //process negative integers, leading '-' is symbol of it. if(MINUS_SYM == *current_symbol) { if(src == current_symbol || SPACE_SYM == *(current_symbol - 1))
return (int)(-1 * result);
else return 0;//incorrect syntax
}
//convert symbol into integer, 0 is 0x30, 1 is 0x31, etc int val = (int)*current_symbol - 0x30;
if(val <0 || val >9)//it is not a number
return 0; result += val * digit_indx;
}
return result; }
пятница, 20 марта 2009 г.
в интренете стало немного чище
это была партнерка, продающая "как-бы антивирус" под названием "Antivirus 360", который отличился тем, что один из самых распостраненых червей Conficker(он же Downup, Downadup и Kido, за голову автора майкрософт предлагало 250к$) пробовал стянуть и поставить этот "антивирус". Еще были мелкие шалости - програма перехватывала обращение к серваку гугла и модифицировала контент, после этого юзер видел рекомендацию от гугла "активировать" антивирус.
Страдали в основном любители разных порносайтов, афиляты (каждый получал 30$ за продажу) скидывали мусорных трафик на трафикконвертер. Некоторые зарабатывали очень неплохие деньги (первая десятка заработала 330к$ за месяц в 2008)
Прикрыли трафикконвертер после статьи в Washington Post похоже что хакнутые с сайта данные (в статье написано откуда взялись данные про заработки афилятов) были использованы чтобы заблокировать перечисляение выручки афилятам