Сайт для программистов

вторник, 28 октября 2008 г.

Функция StrFormatByteSize

Сегодня хочу рассказать вам об интересной функции Windows API StrFormatByteSize. Особенность этой функции в том, что вы передаете ей большое число (размер вашего диска), а она автоматически выдает результат в удобном виде, например, 1.4кб или 1.4Гб и т.д. Хочу обратить ваше внимание, что ANSI-версия этой функции может работать до 1.99Гб. Конечно, такое ограничение нас не устроит, если даже флешки уже стали по 32 Гб и выше. Но, не все так плохо. Unicode-функция может возвращать до 7.99 Эбайт. Большинство из вас даже не знают, что такое Эбайт. Эбайт (сокр. от Эксабайт) - это очень огромная цифра. Вы уже слышали, что появились жесткие диски с объемом Терабайт. Так вот, после терабайтов идут петабайты и только потом эксабайты. Трудно представить, что в обозримом будущем появятся накопители такой емкости. Еще одна особенность функции - названия байтов выдается на родном языке. На русском - Кб, Мб, Гб, а английском - kb, gb и т.д.
Вот как выглядит объявление функции на C#
[DllImport("Shlwapi.dll", CharSet = CharSet.Auto)]public static extern long StrFormatByteSize( long dw,[MarshalAs(UnmanagedType.LPTStr)] StringBuilder pszBuf, int cchBuf );

Создаем для нее обертку и выводим результат
public static string FormatByteSize(long fileSize)
{
StringBuilder sbBuffer = new StringBuilder(20);
StrFormatByteSize(fileSize, sbBuffer, 20);
return sbBuffer.ToString();
}
// Выбираем максимальное возможное значение
MessageBox.Show(FormatByteSize(long.MaxValue));

Описание параметров и примеры на Visual Basiс будут доступны в моем справочнике по фунциями Windows API.
Счастливого вам программирования!

Два события, достойные вашего внимания

Сегодня хочу поделиться с вами новостями. Первое - наконец-то запущен русский MSDN. Произошло это видимо сразу после полуночи, так как я уже сразу после 12 часов ночи заглянул на этот сайт и увидел страницы на русском. Главный интерес представляет справочный раздел по .NET Framework. Его главная страница находится по адресу http://msdn.microsoft.com/ru-ru/library/d11h6832.aspx. Название не очень удачное, поэтому лучше сразу занести в Избранное. Зато дальше уже лучше. Например, статья о пространстве имен System находится по адресу http://msdn.microsoft.com/ru-ru/library/system.aspx, а статья о его классе Console находится на http://msdn.microsoft.com/ru-ru/library/system.console.aspx, ну и так далее. Принцип уловили?
Этого события я ждал более 10 лет, когда самостоятельно начал изучать Visual Basic. Так как в школе я изучал немецкий (Гитлер капут), то мне было труднее вдвойне. Новому поколению программистов будет гораздо легче. И не согласен с теми консерваторами, которые считают, что изучать язык программирования надо только на английском. Здесь все зависит от поставленных целей в жизни - кому-то вполне хватит и русской документации в работе.
Второе событие - это открытие моего сайта http://developer.alexanderklimov.ru (заносим в Избранное). Да, мы опять переезжаем. Это, наверное, уже четвертая площадка для моих страниц. Может, кто-то еще помнит мой первый проект на http://members.xoom.com/wwwind, открытый лет 10 назад? Тогда, если помните еще не было бесплатных страничех Narod.ru, только-только появился сайт Mail.ru, потом появились ICQ и т.д. К сожалению, я не располагаю возможностями Microsoft, поэтому мой переезд на новое место будет происходить постепенно. Наберитесь терпения. Обратите внимание, что новые материалы будут появляться только на новом сайте.
Счастливого вам программирования!

четверг, 23 октября 2008 г.

Числа прописью на русском

У многих программистов (сужу по форумам) встает задача написать число прописью на русском. Если вам тоже нужно, то взгляните на следующие ссылки:
Число прописью на C# 3.0
http://code.hash.su/374
Говорим по Русски - отображение числительных

Во второй ссылке приводится код, в котором содержится ошибка. Программист забыл, что в русском языке имеется не только женский и мужской род, но и средний. Следовательно, в коде должно быть использовано слово одно (одно яблоко, одно перо). На всякий случай, я написал автору. Но, вы тоже имейте в виду.
В других ссылках обязательно почитайте комментарии, которые дадут вам пищу для размышлений.
Удачного вам подсчета!

пятница, 17 октября 2008 г.

Угадайка

Итак, сегодня пятница и впереди два выходных дня. Развлечемся. Бороздя по бескрайним просторам Интернета, наткнулся на прикольный сайт, где предлагается сыграть в игру на угадывание персонажей. Вы задумываете какую-нибудь известную личность и начинаете отвечать на вопросы (на английском). После короткой серии вопросов вам показывается фотография персонажа. Результаты меня удивили. Судите сами: я загадал Аллу Пугачеву, Арнольда Шварценеггера, Леонардо Да Винчи и Карла Маркса. Отгадывающий угадал три варианта, за исключением Да Винчи. Впрочем, и его он показал в списке подозреваемых. Некоторые даже загадывали чебурашку (и его отгадали). Посетите сайт Akinator и попробуйте свои силы. О результатах можете рассказать в комментариях.

понедельник, 13 октября 2008 г.

Укоротить длинный путь к файлу

В своей книге C#. Советы программистам я приводил пример с использованием функции Windows API PathCompactPathEx. Но сегодня в своих архивах нашел еще один пример, который забыл добавить в книгу. Этот пример использует регулярные выражения и использует следующий алгоритм: оставляет первые две папки, последнюю папку и имя файла, а среднюю часть путь заменяется многоточием (...). Делается это следующим образом:

static string PathShortener(string path)
{
const string pattern = @"^(\w+:\\)(\\[^\\]+\\[^\\]+\\).*(\\[^\\]+\\[^\\]+)$";
const string replacement = "$1$2...$3";
if (Regex.IsMatch(path, pattern))
{
return Regex.Replace(path, pattern, replacement);
}
else
{
return path;
}
}

Теперь, вы можете вызвать данный метод для укорачивания длинного пути.

string myPath = @"C:\Documents and Settings\jatwood\My Documents\Visual Studio 2005
\SimpleEncryption\UnitTests\UnitTests.vb\wumpus\public\Hilo Deliverables\Hilo
Final\Introduction\Code\Intro\App_Themes\cellphone\photo-small.jpg";

MessageBox.Show(PathShortener(myPath));

У вас выведется путь: C:\Documents and Settings\jatwood\...\cellphone\photo-small.jpg
(Источник: Coding Horror).

Системная фукнция работает по другому алгоритму, поэтому вы можете выбрать удобный для вас способ.

пятница, 10 октября 2008 г.

Мой телефон стоит тысячу евро, но я не хочу звонить первой

Я частенько посещаю блог Экслера. Особенно мне нравится читать комментарии к статьям автора блога. Сегодня меня очень порадовала статья об одной песне певицы Массква. Я слышал несколько ее песен, а также видел несколько передач с ее участием, и должен признаться, что ее песни мне нравятся больше, чем песни Тимати, Блестящих или Виагры (хотя я и не меломан). Но речь не о ней, а о песне из фильма Русалка, номинированной на Оскар от России. Алекса Экслера задела строчка из песни Мой телефон стоит тысячу евро, но я не хочу звонить первой. Он предложил свои варианты:
Мой телефон стоит тысячу баксов, но я не хочу носить слаксы.
Мой телефон стоит тысячу йен, но кот сожрал весь пурген.
Мой телефон стоит тысячу тугриков, но я предпочла бы рублики.

Посетителям блога эти варианты понравились, и понеслась...
Каждый изощрялся в своем остроумии. Я читал эти комментарии на работе и еле сдерживал свой смех. Работа просто встала.
Надеюсь, уважаемый Алекс Экслер не обидится, если я размещу некоторые варианты на этой страничке. Ссылка на оригинал находится здесь, почитайте все комменты.
Поехали:
Мой телефон стоит тысячу злоты, но ты сдохнешь от икоты.
Мой телефон стоит тысячу песо, но ты пойдёшь сегодня лесом.
Мой телефон стоит тысячу евро и я не люблю преклонных годов негров.
Мой телефон стоит тысячу денег, а ведь сегодня только понедельник.
Мой телефон стоит тысячу сольдо, но это не повод чтоб выступить сольно.
Мой телефон стоит тысячу зайчиков, у сестры в классе очень много мальчиков.
Мой телефон стоит тысячу гривен, в десятом классе я был очень наивен.
Мой телефон стоит тысячу теньге, четырнадцать дней мы блуждали в тайге.
У меня нет мобилы, есть телефон с будкой, вот такой я лузер с барабаном и дудкой! (ржунимагу)
Мой телефон стоит тыщщу рублей, а ты носи валенки и не болей.

А мой телефон стоит мильон (его мне принес пивной павильон)!
Давай, доставай свой за тысячу евро. Ломаться кончай, и звони первой! (это 5+)

А мой телефон стоит пару монет. Давай, не упрямься, делай минет!
Мой телефон стоит тысячу лари, но я лучше хлебну цинандали
Мой телефон стоит тысячу лат, вот такой я богатый прибалт
Мой телефон стоит тысячу крон, и я им с деревьев сбиваю ворон
Мой телефон стоит 20 КОПЕЕК . Жду Вас на складе Б/У телогреек.
Мой телефон стоит тыщу манат, походу я... ни х№уя не магнат.
Мой телефон стоит тысячу лек, сдуру албанский учил я чучмек.
Мой телефон стоит тыщу динаров, отсоси у меня, я отдам его даром. Мой телефон стоит тыщу песет, "сеть не доступна" - регулярный ответ.

Не все варианты удачны, но какой азарт у людей. Видно, что день у многих прошел не зря, люди занимались творчеством.
Удачных вам песен, певица Массква!

воскресенье, 5 октября 2008 г.

Устаревшая функция MessageBeep

Если в ваших старых проектах встречается функция Windows API MessageBeep, то можете отказаться от нее, и использовать методы класса System.Media.SystemSounds, который появился в .NET Framework/.NET Compact Framework 3.5. Единственное исключение - это проекты для Windows Mobile 6/6.1, в которых встроена версия CF2.0. Там эту функцию еще приходится использовать. Описание и пример использования функции можете посмотреть на странице устаревших функций Windows API.
Счастливого вам программирования!