*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

вторник, 6 сентября 2011 г.

Типы в C++ с явным указанием размера

Наш продукт выпускается на нескольких типах UNIX и на Windows. К счастью, все релизы с этого года только 64-бит, включая Windows (Server 2008 и Studio 2010).

Увы, но наследие 32-х бит сильно мешает и засоряет код. И одна их ключевых проблем - базовые типы.

Сейчас мы пришли к выводу, что зоопарк типов надо прекращать.

Итак, правило.

Слова char, short, long, long long, __int64 по умолчанию запрещены. Их использование придется объяснить на code review. Если нужна переменная, которая логически не является смещением в памяти, и ее предельные значения с запасом укладываются в интервал от -2^31 до 2^31-1, по это просто int. Если это индекс или смещение в памяти - это size_t.

Если же нужен беззнаковый тип, или конкретный размер, то надо использовать типа из stdint.h (int8_t, uint8_t, uint16_t, int16_t, uint32_t, int64_t, uint64_t), которые аккуратно реализованы для каждой платформы в одном единственном месте.

Шаг радикальный, посмотрим как пойдет.

Кстати, как вы справляетесь вот с этим?

for (int i = 0; i < s.length(); ++i)

Убрать предупреждение о приведении size_t к int можно, изменив на:

for (size_t i = 0; i < s.length(); ++i)

Но как быть с:

for (int i = s.length(); i >= 0; --i)

Тут уже на size_t не изменить и надо внучную писать "int i = static_cast<int>(s.length())", что, конечно, плохо.

Похожая петрушка с "strlen()", также возвращающей size_t.

воскресенье, 4 сентября 2011 г.

Сравнение программ из коробки в Windows и Mac OS X

Что обычно происходит после установки Windows? Обычно начинается установка "нужных" программ, так как "родными" программами пользоваться нереально. На Маке же почти всеми программами "из коробки" можно и нужно пользоваться.

Рассмотрим некоторые.

Телнет

Windows: telnet.exe

Этой программой можно пользоваться только случайно, по несколько минут, когда ничего другого нет под рукой, а надо быстренько зайти. Если надо именно ssh, а не telnet - ставим SecureCRT или на худой конец putty. Проблема не в telnet.exe как таковой, а в реализации консоли.

Mac: благодаря нормальной консоли (табы, полноэкранный режим, масштабирование) можно просто пользоваться штатным telnet и ssh.

Просмотр картинок

Windows: штатный просмотр картинок - голимая программа. Реально хочется сразу поставить XnView или ACDSee.

Mac: Preview в сочетании с Finder (см. ниже) - удобнейшая вещь, понимающая не только картинки, но и PDF, текстовики и т.д. Для картинок есть встроенный редактор для минимального редактирования. В Windows надо открывать Paint.

Скриншоты

Windows: Можно сделать снимок либо окна, либо всего экрана. Снимок ложится в буфер обмена, откуда его надо куда-то перенести. Хочется сразу поставить, например, FastStone Capture.

Mac: встроенная система снятия снимков экрана умеет все. Можно даже делать это из командной строки.

Веб-браузер

Windows: IE - без комментариев. Нужен FF/Chrome/Opera.

Mac: Safari является одним из топовых браузеров. Хотя Chrome на Maке все еще актуален из-за синхронизации с Google, Flash и расширений.

Почта

Windows: Windows Mail (бывший Outlook Express) вполне можно использовать от лени, но Thunderbird лучше поставить.

Mac: Apple Mac (особенно 5.0 в Lion) даст фору Thunderbird'у и даже Microsoft Outlook'у (хотя надо отдать должное - Microsoft Outlook 2011 for Mac чертовски хорош).

Командная строка и скриптование

Windows: cmd.exe - без комментариев. Это не скриптование, а ёрзанье. cscript может еще как-то спасти ситуацию.

Mac: ksh/bash/csh/python/php/ruby - на выбор из коробки.

Автоматизация работы с окнами

Windows: встроенных программ для этого нет. Может через cscript можно?!

Mac: AppleScript и Automator позволяют делать почти все. Уж как минимум кнопочки на окнах нажимать можно.

Backup

Windows: вообще есть люди, реально использующие встроенную в Windows систему архивирования?

Mac: Time Machine является удобнейшей системой инкрементального бэкапа. Можно в любой папке "отмотать" время назад и вернуть файлы к нужной дате. Сохранения могут делаться локально, без внешнего накопителя, если место есть на диске, а когда накопитель появится в доступности (по USB или сети), то сохранения автоматически уходят туда.

Например, когда ноут у меня дома, то по Wifi он всегда видит NAS, и делает сохранения туда, периодически. Если у меня много изменений, то я могу подключиться кабелем, чтобы слилось быстрее. А когда ноут не дома, все накапливается локально, и по приходу домой происходит сливание. Да, заметьте, все описанное происходит автоматически, в фоне.

Словарь

Windows: нет

Mac: Приложение Dictionary интегрировано в систему и вызыватся кликом на слове или фразе почти отовсюду. Для русского языка есть словари от Лингво, правда неофициальные.

Запуск программ и документов из командной строки

Windows: В XP я использовал TypeAndRun. В Vista и 7 уже неактуально, так как в Start > Run можно набирать имя программы, и будут выводиться варианты программ и документов, доступных в системных путях. Жить можно.

Mac: Увы, но Spotlight (вызываемый по Сmd+Space) - это глобальный индекс по всему, что есть на файловой системе, обновление которого происходит каждый раз при ее изменении. Какие-либо логические "пути" тут не при чем.

Работа с файлами

Windows: Explore (Проводник). В целом с этой программой можно жить. Но лично моя программистская натура требует двух панелей в том или ином виде. Обычно это кончается FAR'ом или Total Commander'ом.

Mac: У меня есть двухпанельный менеджер файлов на Маке, muCommander. До Фара или TC, конечно, как до луны, но жить можно. Но! Поработав в Finder ("Проводник" на Маке) некоторое время, я начал замечать, что запускаю muCommander все реже и реже. Не могу точно описать почему, просто не нужно. Возможно просто из-за общей продуманности интерфейса и возможностей Finder'а.

Пока все, что волнует лично меня.

Как-то не понятно - почему Windows комплектуется столь недоразвитыми штатными средствами? Увы, часто понять это можно только поработав там, где программы "из коробки" нормальные.

P.S. Не хочу развязывать религиозные споры, но замечания с реальными проблемами и методами их решения, конечно, приветствуются.