пятница, 1 июля 2011 г.

Константная ссылка на временный объект

Век живи - век учись!

Только намедни узнал о том, что привязка временного объекта к константной ссылке продлевает жизнь временного объекта до тех пор, пока живет сама ссылка. Это декларирует Стандарт(р12.2.5).

Например, в результате работы следующего кода, на экран будет выведено "temporary string". Удивительно, не правда ли!

string foo()
{
    return string("temporary string");
}

int _tmain(int argc, _TCHAR* argv[])
{
    const string& str = foo();
    cout << str.c_str(); // outputs "temporary string"

    return 0;
}

суббота, 25 июня 2011 г.

Интересные задачки для собеседований по C++

Помимо выслушивания зазубренных ответов на стандартные вопросы типа

"Что такое полиморфизм?",
"Что представляет собой STL?",
"Какое отличие между std::auto_ptr и boost::shared_ptr?",

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

Вот чтобы выявлять таких вот нерадивых кандидатов, я решил помимо  списка вопросов составить список задачек, которые буду предлагать на собеседованиях. Приглашаю всех поучаствовать в составлении.
  • Заменить в битовом представлении числа самый правый ноль на единицу.
int ReplaceLastZeroWithOne( int i )
{
    return i | ( i + 1);
}

  • Вывести число как последовательность битов в прямом и обратном порядке.
// Решение в лоб
void OutputBitsReverse( int i )
{
    while( i )
    {
        if( i < 2 )
        {
            cout << i;
        }
        else
        {
            short bit = i % 2;
            cout << bit;
        }

        i /= 2;
    }
}
 
void OutputBitsReverse(unsigned val)
{
    unsigned reverseMask = 1;
    printf("%u = ", val);

    for( unsigned i = 1; i <= 32; i++)
    {
        putchar(val & reverseMask ? '1' : '0');
        val >>= 1 ;
    }   
}

void OutputBitsForward(unsigned val)
{
   unsigned forwardMask = 1 << 31;
   printf("%u = ", val);

   for( unsigned i = 1; i <= 32; i++)
   {
      putchar(val & forwardMask ? '1' : '0');
      val <<= 1 ;
   }
}
  • Реализовать функцию atoi() для целых неотрицательных чисел в десятичном формате.
// Решение в лоб, без дополнительных проверок на переполнение
int atoi_( const char* src )
{
    if( !src )
    {
        return 0;
    }
 
    int result = 0;
    int strlen = 0;
    const char* tmp = src;
    char ch;

    while( ch = *tmp++ )
    {
        if( ( '0' > ch ) || ( '9' < ch ) )
        {
            return 0;
        }

        ++strlen;
    }

    while( *src )
    {
        int digit = *src++ - '0';
        double base = 10;
        result += digit * pow( base, --strlen );
    }

    return result;
}

воскресенье, 12 июня 2011 г.

Кто что слушает на работе?

Open space - есмь Зло! Хрен оспоришь. Постоянный гул, ржач, коллы с кустомерами, споры и холивары. Конечно, все эти прелести во многом зависят от культуры вас окружающих людей, но факт остается фактом - Open Space = Ад! В одной из моих прошлых контор, я мог начать работать только часов в 5 вечера, соответственно домой приходил к ночи.

Вот почему в опен спейсе у каждого работника есть огромные студийные наушники - Коссы, Шенхейзеры, Свэны и т.д. Иногда просто нужно сосредоточиться на некоторое время, чтобы ни на что не отвлекаться и никого не слышать.

Но интеллектуальная деятельность совместима далеко не с любыми видами музыки, и музыка может отвлекать и мешать сосредоточиться не меньше чем факторы окружающей среды. Например, тяжелая музыка просто вырубает мозг, рэпчик отвлекает внимание так как начинаешь вслушиваться в речетатив, ну и так далее. Мне более всего подходит jazz, ambient, просто легкая фоновая музыка, new age, иногда. У меня нет любимых исполнителей на этом поприще, я даже не задумываюсь, что я слушаю и для души я слушаю совершенно другую музыку. Но для фона такая музыка самое оно - успокаивает, поднимает настроение, помогает сконцентрироваться, отрешиться от окружающего мира.

Чаще всего я слушаю радио Abalone. Попробуйте, может и вам поможет.

ЗЫ Это не реклама =)



вторник, 7 июня 2011 г.

Получение букв дисков приаттаченых к USB девайсам (Enum drive letters attached to USB devices)

WinAPI-шная функция GetDriveType() имеет существенный недостаток - она определяет USB hard drive'ы как фиксированные диски DRIVE_FIXED. Недавно мне понадобился функционал, который бы отличал настоящие жесткие диски от USB. Как оказалось, задача почему-то решается нетривиально - либо через WMI, либо через SetupAPI. WMI не подходил всвязи со спецификой проекта, оставался SetupAPI. Полдня изучения основ SetupApi и полдня гугления, изучения экзэмплов и чтения форумов привели меня на CodeProject, где я и нашел решение.  Так вот хочу я вам сказать, мои дорогие друзья, я бы в жизни не подумал, что эта задача решается настолько через жопу!
Но нашелся у меня в тиме человек, который буквально за полтора часа  родил компактное и лаконичное решение. Собственно, не могу не поделится.

bool IsUsbDevice( wchar_t letter )
 {
  wchar_t volumeAccessPath[] = L"\\\\.\\X:";
  volumeAccessPath[4] = letter;

  HANDLE deviceHandle = CreateFileW(
   volumeAccessPath,
   0,                // no access to the drive
   FILE_SHARE_READ | // share mode
   FILE_SHARE_WRITE, 
   NULL,             // default security attributes
   OPEN_EXISTING,    // disposition
   0,                // file attributes
   NULL);            // do not copy file attributes

  // setup query
  STORAGE_PROPERTY_QUERY query;
  memset(&query, 0, sizeof(query));
  query.PropertyId = StorageDeviceProperty;
  query.QueryType = PropertyStandardQuery;
  
  // issue query
  DWORD bytes;
  STORAGE_DEVICE_DESCRIPTOR devd;
  STORAGE_BUS_TYPE busType = BusTypeUnknown;

  if (DeviceIoControl(deviceHandle,
   IOCTL_STORAGE_QUERY_PROPERTY,
   &query, sizeof(query),
   &devd, sizeof(devd),
   &bytes, NULL))
  {
   busType = devd.BusType;
  }
  else
  {
   std::wcout << L"Failed to define bus type for: " << letter;
  }
  
  CloseHandle(deviceHandle);

  return BusTypeUsb == busType;
 }

четверг, 26 мая 2011 г.

Проблемы со Skype - Май 26, 2011

Тем временем как весь мир находится в панике по поводу неработающего Skype, у меня все очень даже работает =) Тем не менее, я не могу не поделится со страждущими.

Переводить лень, так что как-нибудь сами


A small number of you may have had problems signing in to Skype. This predominantly affects people using Skype for Windows. We have identified the problem and will issue a fix in the next few hours.
In the meantime, you can follow the steps below to fix the problem manually.

Windows

       
  1. Click Start, type run and press Enter. (On Windows XP: Click Start and then Run.)
  2.    
  3. Type the following and click OK.
  4.    %appdata%\skype    
  5. Locate and delete the file shared.xml
  6.    
  7. If you cannot find this file:    
             
    1. Click Start, type run and press Enter. (On Windows XP: Click Start and then Run.)
    2.        
    3. Type the following and click OK.
    4.        control folders        
    5. In the View tab, ensure that Show hidden files and folders is enabled.
    6.        
    7. Repeat steps 1-3.
    8.    
       
  8.    
  9. Restart Skype. 

Mac

       
  1. Open Finder and locate the following folder:
  2.    ~/Library/Application Support/Skype    
  3. Delete the file shared.xml.
  4.    
  5. Restart Skype.
Please note that the ~ sign means your home folder. You can find your home folder by opening Finder and selecting Go > Home from the menu bar or pressing Command (Apple), Shift and H keys at the same time.

Linux

       
  1. Go to the following folder:
  2.    /home/YourLinuxUserName/.Skype    
  3. Delete the file shared.xml.
  4.    
  5. Restart Skype.
Remember: The Skype folder is a hidden folder - please check Show hidden files in your file browser to view and access it.

Обновляющееся ссылко на первоисточник http://heartbeat.skype.com/2011/05/problems_signing_into_skype_an.html

пятница, 4 марта 2011 г.

[ВИДЕО] Волшебники Электронной Эры

Достопочтенный хабровчанин artifex поделился очень интересным документальным фильмом "Hackers - Wizards of the Electronic Age" снятом в 1984 году, и рассказывающем о хакерах того времени.

При участии:  Steve Wozniak, Andy Hertzfeld, Bill Atkinson, Lee Felsenstein, Richard Stallman, Richard Greenblatt, Steven Levy and others.

 Фильм оказался очень интересным и весьма познавательным. Ну, во-первых, начнем с того, что в контексте фильма "хакерами" называют не тех людей, которые взламывают сайты Пентагонов или пишут вирусы, а компьютерных энтузиастов, создающих революционные продукты ради забавы. Также оказалось, что понятие share-ware и open-source software возникло в начале 80-х годов, и уже тогда люди делали на этом бизнес, сапортя ПО и занимаясь консалтингом. И уж вообще я офигел, когда некий бородатый малый продемонстрировал програмулину до боли похожую на старый добрый Paint, в которой он редактировал фотографии, залитые с цифровой камеры. Я почему-то думал, что в те годы единственным интерфейсом пользователя были зелененькие буквочки на черном экране размером меньшим чем у моего КПК. В 1995 году отец притащил с работы системник от Sinclair'a, он переделал старую ч/б Березку под моник и  раздобыл где-то квадратную клаву, похожую на печатную машинку - я думал, что это крутейший комп. Там стоял TR-DOS, был текстовый редактор, можно было катать в Принца Персии, и даже писать музыку! И теперь я понял, что являлся обладателем винтажного барахла. Немного, знаете ли обидно за трудное детство...

Ну да ладно воспоминаний - давайте смотреть кино...