пятница, 2 сентября 2011 г.

Здравствуйте, я ваш кастомер!

История одного фэйла :)

Сегодня к нам приехал из Штатов кастомер. Сам он индус,  живет там уже почти 30 лет. Прикольный дядька,компанейский такой. Ну, короче, познакомились, "хау ду ю ду?", "глэд ту си ю!", то да сё, и кто-то предложил вечером сходить двинуть пивка в ближайший кабак. Да гавно вопрос!... Сидим в кабаке пьем. А Рао(кастомер) последние полтора суток питался только ништяками, которые в самолетах дают, стало быть голодный как волк, но молчит из вежливости. "Давай", - говорим, - "покушать себе закажи, пока сознание не потерял". А он: "Да я, мол, не в курсе чего у вас тут съедобное, закажите мне чего-нибудь на ваш выбор". Ну и я, от всей души желая спасти Рао от голодной смерти, выискал в меню самый увесистый стэйк из телятины и картошку-фри и попросил официантку все это как можно быстрее приготовить и подать. Когда блюдо принесли, Рао бросил на нас озадаченный взгляд и сконфужено спросил "Is it beef?"("Это телятина?"). Ну мы в ответ - "Йес, мол, да - самая лучшая телятина, вкусно, ням-ням!".

FAIL: Только через полчаса меня осенило! Корова у индусов - священное животное, её не то что есть, пальцем трогать грешно! И было мне и стыдно, и смешно одновременно. Вот такая фигня сегодня случилась.


А стэйк Рао все-таки съел. :) Голод даже индусу не тётка.

среда, 6 июля 2011 г.

Идиллия

Настоящая идиллия глазами программера:
Приходишь с работы часиков в 9 вечера, дома бардак, комп занят, за компом любимая девушка шпилит в "Как достать соседа". Зашел, рыкнул - ррраз! кушать подано, комп свободен, кот забился в кладовку. Лепота!


пятница, 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