24 декабря 2009 г.

How to convert C to C++

На comp.lang.c++.moderated обнаружилась тема - конвертирование программ из C в C++. Там же есть ссылка на некий скрипт, который делает это автоматически.

Я заглянул на сайт этого скрипта. Похоже, у автора была куча свободного времени, иначе как объяснить появление на свет этого инструмента? Как оказалось, скрипт делает следующее:
Script that translates C to C++ in some steps:
1. generating classes,
2. converting functions to methods,
3. replacing calls to functions by references to methods.

Примечание дальше меня просто покорило:
The main script calls other specialized ones but you can also proceed step by step and modify manually the results of a step before to start the next one. This tool is not easy to use. It is for experienced programmers.

Я не нашел в документации никаких примеров работы этого скрипта. Так что я скачал его себе на Linux, чтобы посмотреть, как работает это чудо. Оказалось, что оно даже имеет configure и setup для инсталляции. Однако, вот незадача, в папку пользователя оно инсталлироваться не умеет и требует администраторских прав для установки в /usr/bin (щаз, ага). Так что, не удалось мне поюзать этот полезный тул. Может, оно и к лучшему...

24 ноября 2009 г.

Wine и Xfce на Ubuntu

Хотел было пересеть с GNOME на Xfce, потому что Xfce вроде как более легковесный, а мне на виртуалке это, конечно, критично.

Оказалось, что Xfce, почему-то не дружит с Wine. В меню Applications->Wine должно быть меню Programs, где создаются подменюшки для устанавливаемых windows-приложений. Под GNOME это так и есть, а под Xfce меню Applications->Wine почему-то превратилось в меню Разное, подменю Programs не появляется, при установке программ подменюшки не создаются, и все иконки установленных windows программ тоже попадают в Applications->Разное. Мешанина получается жуткая.

Наверное, что-то где-то нужно настроить... Но времени разбираться не было, поэтому вернулся обратно на GNOME.

22 ноября 2009 г.

Коррупция и Минкомсвязи

http://cnews.ru/

Минкомсвязи - своим сотрудникам: как реагировать на предложения взяток

Согласно проекту, служащие Минкомсвязи обязаны уведомлять представителя нанимателя, органы прокуратуры или другие государственные органы обо всех случаях обращения к ним каких-либо лиц в целях склонения их к совершению коррупционных правонарушений. (…) Служащий, уклонившийся от уведомления о фактах обращения в целях склонения к совершению коррупционных правонарушений, подлежит привлечению к ответственности в соответствии с законодательством Российской Федерации. полный текст

Источник: CNews


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

И что происходит вообще? Роснано играется на бирже с выделенными им деньгами, вместо финансирования проектов. Минкомсвязи борется с коррупцией вместо своих прямых обязанностей. У меня складывается такое впечатление, что они просто не знают, чем заняться.

16 ноября 2009 г.

Лишние пробелы в коде

Забавная и очень эмоциональная заметка на Coding Horror про лишние пробелы в коде. Забавно в ней то, что я тоже терпеть не могу такие вещи :) И не понимаю, зачем люди оставляют в своем коде эти бесполезные штуки. Вручную бороться устал, пришлось автоматизировать :) Теперь у меня в .vimrc есть вот такие строки:

au BufWritePre,FileWritePre *.h,*.hpp,*.c,*.cpp let au_line=line(".")
au BufWritePre,FileWritePre *.h,*.hpp,*.c,*.cpp let au_col=col(".")
au BufWritePre,FileWritePre *.h,*.hpp,*.c,*.cpp %s/\s\+$//e
au BufWritePost *.h,*.hpp,*.c,*.cpp silent call cursor(au_line, au_col)

Этот код автоматически удаляет лишие пробелы в тексте перед сохранением файла в редакторе vim.

UPDATE: Аналогичное решение для Microsoft Visual Studio можно найти здесь.

10 ноября 2009 г.

Про кино

Два фильма от отечественного производителя — "Царь" и "Книга мастеров".

"Царь" — сильный фильм, немного тяжеловат, но заставляет задуматься. Очень рекомендую. Интересно, смотрит ли наша власть такие фильмы?

"Книга мастеров" — красочная детская сказка с хорошими актерами и добрым юмором. А главное — наша. Я что-то не припомню, чтобы в России сняли какую-нибудь хорошую сказку за последние 15—20 лет. Для взрослых — сколько угодно, а для детей? А «Книга мастеров» рассчитана именно на детей. И это просто замечательно. Еще очень порадовало отсутствие «фекальных тем» в диалогах героев. А то, честное слово, просто надоело — что ни новый мульт, так какие-нибудь сальные шуточки на туалетные темы. Уже даже не смешно.

Фильм на твердую четверку, или даже на четыре с плюсом. Рекомендуется к просмотру вместе с детьми. Искренне не понимаю людей, оставляющих негативные отзывы. Чего ждали-то?

ЗЫ. Вспомнилось, вдруг. Еще один фильм, фильм-эмоция — "Отрыв" Александра Миндадзе. Я его смотрел довольно давно в программе "Закрытый показ". Если попадется вдруг — обязательно посмотрите.

30 октября 2009 г.

Подключение сетевого диска в Ubuntu

Updated 18.12.2010

Предположим, что на компьютере с IP адресом 192.168.0.1 открыта на доступ папка linux и нам нужно подключить ее в Ubuntu, чтобы получить к ней доступ, как к любой другой папке на диске.
  • Подключение сетевого диска вручную
    После выполнения следующих команд содержимое сетевой папки //192.168.0.1/linux будет доступно пользователю в директории /media/sharename на локальном компьютере:

    sudo mkdir /media/sharename
    sudo mount //192.168.0.1/linux /media/sharename/ -o username=myusername,password=mypassword

    Почему-то у меня при попытке подключиться к расшаренным windows-папкам пришлось указывать и username и password, даже для дисков, которые расшарены для всех. Если их вообще не писать, то попытка монтировки происходила под пользователем root, и mount возвращал ошибку -13 (permission denied), а если указать только имя пользователя — высвечивал приглашение ввести пароль доступа к папке.


  • Подключение сетевого диска вручную на чтение/запись для всех пользователей

    sudo mkdir /media/sharename
    sudo mount //192.168.0.1/linux /media/sharename/ -o username=myusername,password=mypassword,dmask=777,fmask=777


  • Подключение сетевого диска на этапе загрузки через fstab

    sudo mkdir /media/sharename
    sudo cp /etc/fstab /etc/fstab_backup


    Создать файл /root/.smbcredentials и добавить следующие строки:
    username=myusername
    password=mypassword


    Сделать файл /root/.smbcredentials недоступным для пользователей, а для root -- только на чтение:
    sudo chmod 400 /root/.smbcredentials

    В файл /etc/fstab добавить следующие строки:
    //192.168.0.1/linux /media/sharename smbfs credentials=/root/.smbcredentials 0 0


    Для доступа на чтение/запись для всех:
    //192.168.0.1/linux /media/sharename smbfs credentials=/root/.smbcredentials,dmask=777,fmask=777 0 0

    На данный момент (в Ubuntu 9.10) тип smbfs устарел, поэтому нужно использовать тип cifs. Для типа cifs вместо dmask и fmask нужно указывать параметры dir_mode и file_mode, причем числовые значения этих параметров должны начинаться с нуля — "dir_mode=0777,file_mode=0777".



  • Подключение дисков из fstab без перезагрузки операционой системы
    sudo mount -a

  • Синтаксис:
    Для smbfs -- //192.168.1.1/foldername
    Для nfs -- 192.168.1.1:/foldername
Дополнения:
  1. Если подключения диска не происходит, то можно посмотреть коды возвращаемых ошибок с помощью команды dmesg, а еще лучше запустить mount с помощью утилиты strace — sudo strace mount ....

  2. Если mount возвращает ошибку (или вообще происходит нечно непонятное), то в первую очередь убедитесь, что у вас установлен mount, соответствующий типу файловой системы, которую вы хотите подключить. Например, для nfs в системе должен быть установлен mount.nfs, для smbfs — mount.smbfs, для cifs — mount.cifs и т.д. В качестве иллюстрации проблемы можно привести пример с cifs: при отсутствующем mount.cifs можно вполне успешно примонтировать cifs-диск используя параметры "username=...,password=...", но при этом попытка использования credential-файлов, будет заканчиваться ошибкой (http://ubuntuforums.org/archive/index.php/t-79612.html).

  3. Ошибка монтирования "mount error 12 = Cannot allocate memory" при попытке подключения к расшаренной папке Windows.

    Возможная причина — не хватает памяти на сервере (то есть, в Windows), а не на клиенте. В этом случае, могут помочь изменения в реестре Windows: ...\LanmanServer
    \Parameters\IRPStackSize
    (для XP, 2000, NT) или .../LanmanServer\Parameters\Size и ...\Session Manager\Memory Management\LargeSystemCache (для Windows 7).

  4. Ошибка монтирования "mount error 5 = Input/output error". В логах dmesg сообщается об ошибке "CIFS VFS: cifs_read_super: get root inode failed".

    Если при этом упоминается "Malformed FILE_UNIX_BASIC_INFO response", то возможно поможет добавление nounix в параметры вызова команды mount.

    Еще одна возможная причина — проблемы с правами доступа к расшаренной папке. У меня такая ошибка возникла, когда на папку, которую, я хотел примонтировать, в числе прочих были установлены права "Everyone - Access denied". После корректировки прав доступа всё успешно примонтировалось.

  5. Проблема монтирования CIFS диска на Ubuntu 9.10 — ресурс расшарен на другой unix-системе и успешно монтируется, но доступен только на чтение, хотя, если подключиться к этому ресурсу с помощью smbclient, то ресурс доступен и на чтение, и на запись.

    Скорее всего проблема в несовпадении uid и gid на клиенте и на сервере. Исправляется добавлением в параметры запуска команды mount значений nounix, а также uid и gid, которые соответствуют вашему пользователю на сервере — "mount //server /client -o username=someone,gid=1000,uid=1000,nounix,file_mode=0777,dir_mode=0777". (http://ubuntuforums.org/showthread.php?t=1310273)

По мотивам ubuntuguide.org, ubuntuforums.org и собственного опыта.

21 октября 2009 г.

Цитата: Саттер

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

Вот правила, которыми я призываю вас руководствоваться:
1. Не оптимизируйте преждевременно.
2. Не оптимизируйте до тех пор, пока не убедитесь в том, что это необходимо.
3. Даже в этом случае не оптимизируйте до тех пор, пока не будете точно знать, что и где надо оптимизировать.

Герб Саттер, "Решение сложных задач на C++"

30 сентября 2009 г.

Задачи на собеседованиях: опять односвязные списки

Еще одна задача в продолжение задачи об односвязных списках.

Дано: односвязный список N1->N2->N3->... и указатель на его голову N1. Существует вероятность, что список зациклен, и узел Nn указывает на любой из узлов списка. Например, так N1->N2->N3->N4->...->Nn->N3->N4->... .

Нужно: разработать алгоритм, определяющий наличие цикла в списке (да/нет).

25 сентября 2009 г.

Секретный порядок разработки

Вчера от ФГУПов "Атлас" и "Интеграл" поступили очередные предложения по спуску лишних миллионов в унитаз. Пара наисвежайших идей по созданию отечественных браузеров и прокси-серверов. Цитатка из документа:

"...аппаратные компоненты комплекса должны функционировать под управлением доверенного (...)  программного обеспечения, порядок разработки которого гарантирует отсутствие ошибок... "

Предложения ФГУП "Атлас" по созданию
защищенного прокси-сервера


Йоу. Оказывается "Атлас" владеет секретным "порядком разработки". Как мило! Просто мечта разработчика.

11 сентября 2009 г.

Сортировка указателей

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

10 сентября 2009 г.

А президент-то и не знает...

Наш президент очень активен. И всех к этому призывает.
Ваши оценки, замечания и предложения будут учтены при подготовке послания президента России Федеральному собранию. Практических планов развития нашего государства. Адрес электронной почты: kremlin@gov.ru.

Видимо, президент не знает, что почтового сервера gov.ru не существует. Так что ни kremlin, ни другие адреса электронной почты нашего правительства не работают.

P.S. Зато, кажется, об этом знают в ФМС, которые завели себе ящик на gmail.com.

P.P.S. Электронное правительство, аааууууууууу!!!

P.P.P.S. Updated 11.09.2009 - Ура! Кажись, заработало :) Неужели было так много желающих высказать свои предложения президенту, что сервер не выдержал?

9 сентября 2009 г.

Ubuntu и g++ 3.4

У меня стоит Ubuntu 9. Понадобился компилятор g++ 3.4. А его нет на Ubuntu. gcc 3.4 — есть, а g++ — нет. Нет, и не будет.

В том же форуме предлагают способ — скачать дебиановские пакеты и установить. Но обнаружилось две проблемы. Первая — эти пакеты старые и их установка сносит крышу убунтовскому менеджеру обновлений. Чтобы восстановить его работоспособность, эти пакеты нужно удалить. Вторая — компилятор-то установился. Но то ли из-за несовместимости версий пакетов, то ли еще из-за чего, но мои сборки рушатся и падают, если я использую g++ 3.4.

В конце концов мне это надоело, я удалил все неродные пакеты и скачал отсюда два архива с исходниками — gcc-core-3.4.6.tar.bz2 и gcc-g++-3.4.6.tar.bz2. Всё собралось на ура и отлично работает. Единственное "но" — собирать нужно c помощью gcc-3.4 (он-то в системе уже есть).

7 сентября 2009 г.

Предупреждения GCC ч.2

Наткнулся тут в тексте статьи на Хабре:
...посмотрим внимательно на вывод компилятора при максимально включенных предупреждениях

$ g++ -W -Wall test.cpp

К самой статье это отношения не имеет, но хочется заметить, что заблуждение насчет максимально включенных предупреждений компилятора встречается довольно часто — -Wall и -Wextra (-W) это еще не все предупреждения. К сожалению, путаница по большей части возникает из-за разработчиков GCC. Начать с того, что имя опции -Wall само по себе вводит в заблуждение, так они еще добавляют или удаляют предупреждения от версии к версии, или вообще меняют их смысл, чем лично меня иногда просто ставят в тупик. Но надо отдать им должное — компилятор все-таки развивается, и сейчас с помощью предупреждений можно узнать гораздо больше, чем в более ранних версиях.

Например, в последней версии GCC (4.4) есть полезные предупреждения, которые нужно включать самостоятельно:
  • -Wcast-qual
    Предупреждает о преобразованиях типа "из const char * в char *".
  • -Wconversion
    Предупреждает, если при преобразовании типов может произойти потеря данных. Например, при преобразовании из long в short.
  • -Wredundant-decls
    Предупреждает об повторном объявлении чего-нибудь в той же области видимости, даже если это ни на что не влияет.
  • -Wshadow
    Предупреждает, если объявление переменной перекрывает объявленную ранее переменную с таким же именем.
  • -Wsign-conversion
    Предупреждает, если результат выражения может изменить знак. Например, при преобразовании из int в unsigned int.
  • -Wunreachable-code
    Предупреждает, если какой-то фрагмент кода никогда не будет выполнен. Например, если перед этим фрагментом стоит return. Этот флаг специально не был включен в группу -Wall для того, чтобы можно было разделять сборки debug и release.

И еще некоторые другие:
  • -Wcast-align
  • -Wformat-nonliteral
  • -Wformat-security
  • -Wformat-y2k
  • -Winit-self
  • -Wlogical-op
  • -Wmissing-format-attribute
  • -Wmissing-include-dirs
  • -Woverlength-strings

Отключение спикера на Ubuntu

Оказывается всё довольно просто. Чтобы отключить PC speaker на Ubuntu, нужно открыть файл /etc/modprobe.d/blacklist и добавить в него строку:

blacklist pcspkr

После этого нужно перезагрузиться.

Источник: ubuntuforums.org

1 сентября 2009 г.

Цитата: Хайнлайн

Любой человек должен уметь менять пеленки, планировать вторжения, резать свиней, конструировать здания, управлять кораблями, писать сонеты, вести бухгалтерию, возводить стены, вправлять кости, облегчать смерть, исполнять приказы, отдавать приказы, сотрудничать, действовать самостоятельно, решать уравнения, анализировать новые проблемы, побросать навоз, программировать компьютеры, вкусно готовить, хорошо сражаться, достойно умирать.
Специализация — это удел насекомых.

Эта цитата из Хайнлайна расползлась по инету в таком количестве, что первые несколько страниц Яндекса — это ссылки на блоги. Цитата настолько популярна, что, говорят, некоторые даже вставляют эту цитату в свое резюме.

Интересно, что народ ссылается на "своего любимого Хайнлайна", но при этом многие не имеют представления из какого произведения эта цитата и по какому поводу она вообще. Еще интересно, что именно в таком переводе эта цитата присутствует в книге "Прометей восставший" Роберта Уилсона (который имхо довольно некорректно ссылается на Хайнлайна), что, видимо, может говорить о том, что люди, не особо знакомые с источником, цитируют текст, вырванный другим человеком из контекста.

Хайнлайн вообще был умнейший мужик, хоть и слегка сдвинутый на сексе. Практически любую его книгу можно разобрать на цитаты. Поэтому я позволю себе тоже привести здесь цитату. Тоже Хайнлайна, и даже из того же самого произведения :)

Фразу: «Я (мы, ты) просто должен…» — следует понимать в том смысле, что делать этого не нужно. Слова: «Это понятно каждому» — предупреждают о возможных сложностях. Если слышишь: «Конечно» — лучше проверить все самому. Эти маленькие клише и прочие им подобные, если уметь правильно читать их, позволяют хорошо ориентироваться.

Роберт Хайнлайн,
"Достаточно времени для любви,
или Жизни Лазаруса Лонга"

26 августа 2009 г.

Нас вырастил Сталин?

Навеяло: http://drugoi.livejournal.com/3029135.html

Просто охренеть можно. Честно говоря, я не понимаю, зачем нашей власти понадобилось продвигать Сталина. Имхо, получилось полное говно под знаменем "реставрации". Это китч такой или какая-то серьезная цель преследуется?

25 августа 2009 г.

Шпаргалки

Совсем недавно открыл для себя замечательный сайт, где собраны ссылки на множество шпаргалок на различные темы в различных форматах.

16 июля 2009 г.

М4. Дорога на юг

Трассу М4 ремонтируют. Практически в каждой области. Расширяют дорогу, делают по две полосы в каждую сторону с разделенкой. Это будет удобно, но сейчас ехать очень тяжело.

15 июля 2009 г.

Ольга Ускова на Финам.ФМ

Отличное интервью с Ольгой Усковой на Финам.ФМ. Настоятельно рекомендуется к прослушиванию или к прочтению.

P.S. Удивительно, насколько интервью с Касперским было нудным и унылым, настолько интервью с Усковой живое и познавательное. И что самое главное, честное. (По крайней мере, выглядит таким.)

24 июня 2009 г.

Цитата: ДеМарко

Любая спецификация делится на две части: первая описывает зависимость между определенными событиями и реакцией системы. Вторая описывает входящие и исходящие данные, благодаря которым события и реакция системы становятся единым целым. Какой бы сложной ни была система, вторую часть всегда достаточно просто описать: все эти входящие и исходящие данные — просто список неких данных и управляющих элементов.

Том ДеМарко, "Deadline. Роман об управлении проектами"

20 мая 2009 г.

О процессорах

Оказывается в Intel Core i7 есть встроенная поддержка CRC32 и алгоритма AES. Похоже, скоро процессоры кофе начнут готовить.

UPD: Поддержка AES будет в серии Westmere, выпускаемой в этом году.

17 мая 2009 г.

Задачи на собеседованиях: односвязные списки

Простая задача на понимание односвязных списков. Однако, несмотря на то, что задача несложная, многие кандидаты пугаются и начинают путаться в показаниях.

Дано: односвязный список N1->N2->N3->...->Nn и указатель на его голову N1.

Нужно: развернуть список за один проход так, чтобы стало Nn->Nn-1->Nn-2->...->N1.

14 мая 2009 г.

Про свиней

Жили-были три поросёнка — Наф-Наф, Нуф-Нуф и H1N1.


Словосочетание "свиной грипп" я первый раз услышал в феврале от вызванного на дом врача, когда мои дети (и я тоже) заболели и валялись дома с температурой. Врач очень расстраивался по поводу того, что есть установка свыше не ставить диагноз "грипп", а тупо ставить всем ОРВИ, "чтобы не было эпидемии". Врач в детском саду сначала посмеивалась, а недели через две смех уже был почти истерическим, когда из 25 заболевших детей диагноз "грипп" был в справке всего у одного ребенка. Но тогда у нас эпидемии не было.

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

8 мая 2009 г.

Про цветное кино

Много мнений по поводу раскрашивания фильмов. Коммунисты — те вообще в суд подали.

А мне, честно говоря, пофиг. Потому, что когда смотришь хорошее кино, то "есть цвет-нету цвета" важно только первые пару минут. Потом уже не важно. Так что, хороший фильм цветом не испортишь :) А плохой и так смотреть не будут.

5 мая 2009 г.

Цитата: Павич

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

Милорад Павич, "Хазарский словарь"

30 апреля 2009 г.

Кстати о GCC

Неделю назад вышла очередная версия компилятора GCC — 4.4.

В новой версии расширены возможности оптимизации кода, ключ -Wconversion теперь выводит предупреждение при некорректных попытках привести целочисленный тип к enum, а также включена экспериментальная поддержка стандарта C++0x. И много чего другого не менее интересного...

suncc в качестве подручного инструмента

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

Наверное, самый лучший способ достичь этого — изучать алгоритмы и приемы оптимизации кода. Но будь ты хоть семи пядей во лбу, когда рядом есть "подручные средства" — грех не воспользоваться ими.

Я хочу рассказать, как использовать компилятор Sun для того, чтобы повысить производительность вашего кода. У этого компилятора есть замечательная особенность — при выполнении оптимизации он может вставлять свои комментарии в объектные файлы, которые можно потом использовать для дальнейшего улучшения кода. Компилятор Sun прилагается к пакету Sun Studio, который является бесплатным и доступен для скачивания с http://developers.sun.com

В качестве примера рассмотрим простую программу:

int main ()
{
  int c = 0;
  int size = 10000;
  int *a = new int[size * size];

  for (int i = 0; i < size; ++i)
  {
    for (int j = 0; j < size; ++j)
    {
      a[j * size + i] = c++;
    }
  }

  delete [] a;
  return 0;
}

Эта программа создает квадратную матрицу размером size на size, и заполняет ее числами от 0 до N по столбцам. Для матрицы 10 на 10 это будет выглядеть так:

0 10 20 30 40 50 60 70 80 90
1 11 21 31 41 51 61 71 81 91
2 12 22 32 42 52 62 72 82 92
3 13 23 33 43 53 63 73 83 93
4 14 24 34 44 54 64 74 84 94
5 15 25 35 45 55 65 75 85 95
6 16 26 36 46 56 66 76 86 96
7 17 27 37 47 57 67 77 87 97
8 18 28 38 48 58 68 78 88 98
9 19 29 39 49 59 69 79 89 99

Проход по столбцам матрицы заведомо неэффективен, поэтому на такой программе должны быть хорошо видны результаты оптимизации. Попробуем замерить усредненное время выполнения программы для size=10000, скомпилированной с помощью g++ и sunCC:

g++ без оптимизации (g++ -O0 a.cpp): 2.6 сек
g++ c оптимизацией (g++ -O2 a.cpp): 2.0 сек

sunCC без оптимизации (sunCC a.cpp): 3.2 сек
sunCC c оптимизацией (sunCC -fast a.cpp): 0.4 сек


Опция -fast в suncc анализирует окружение и подбирает набор опций компилятора для максимального быстродействия. Видно, что sunCC в режиме оптимизации дает результаты в разы лучше, чем g++. А именно — в 5 раз. Хм...

Цель данной статьи совсем не в том, чтобы принизить возможности GCC. Для замеров использовался GCC версии 4.1. На данный момент существуют более новые версии этого компилятора, которые могут показать лучшие результаты оптимизации этого кода.


Давайте посмотрим, что же делает sunCC при оптимизации. Для этого необходимо использовать при компиляции опцию -g0. Эта опция сохраняет в объектном файле отладочную информацию (в том числе и комментарии компилятора), но не запрещает инлайнить функции. Для просмотра комментариев нужно использовать программу er_src, которая также поставляется с Sun Studio.

$ sunCC -g0 -fast a.cpp
$ er_src a.o

Source file: ./a.cpp
Object file: ./a.o
Load Object: ./a.o

1. int main ()

2. {
3. int c = 0;
4. int size = 10000;
5. int *a = new int[size * size];
6.

Source loop below has tag L1
Induction variable substitution performed on L1
L1 interchanged with L2


7. for (int i = 0; i < size; ++i)
8. {

Source loop below has tag L2
Induction variable substitution performed on L2
L2 interchanged with L1


9. for (int j = 0; j < size; ++j)
10. {
11. a[j * size + i] = c++;
12. }
13. }
14.
15. delete [] a;
16. return 0;
17. }

Итак, что же мы видим? Компилятор обнаружил в программе два цикла L1 и L2, которые поддаются оптимизации, о чем и сообщил в комментариях. Давайте попробуем улучшить программу, используя подсказки компилятора.

Подсказка "Induction variable substitution performed" говорит нам о том, что компилятор обнаружил индукционную переменную и произвел ее замену. Это значит, что значение какой-то переменной может быть вычислено через значения итераторов циклов. После недолгого изучения кода заменяем строку "a[j * size + i] = c++;" строкой "a[j * size + i] = i * size + j;". И прогоняем компиляцию еще раз.

Видим, что сообщение об индукционной переменной пропало, но осталось другое сообщение: "L1 interchanged with L2". Это сообщение говорит нам о том, что компилятор поменял циклы местами, то есть заменил проход по столбцам проходом по строкам матрицы. Меняем циклы местами и снова прогоняем компиляцию. И убеждаемся, что сообщения о том, что компилятор что-то оптимизировал, пропали. То есть, оптимизировать больше нечего.

После наших изменений программа приняла вот такой вид:

int main ()
{
  int c = 0;
  int size = 10000;
  int *a = new int[size * size];

  for (int j = 0; j < size; ++j)
  {
    for (int i = 0; i < size; ++i)
    {
      a[j * size + i] = i * size + j;
    }
  }

  delete [] a;
  return 0;
}

Давайте теперь замерим время выполнения программы после всех наших изменений:

g++ без оптимизации (g++ -O0 a.cpp): 1.0 сек
g++ c оптимизацией (g++ -O2 a.cpp): 0.4 сек

sunCC без оптимизации (sunCC a.cpp): 0.6 сек
sunCC c оптимизацией (sunCC -fast a.cpp): 0.4 сек


На мой взгляд, получилось просто прекрасно! :)

Подробнее почитать о комментариях компилятора Sun можно здесь: http://docs.sun.com/app/docs/doc/819-5264/afapn?a=view

16 апреля 2009 г.

Задачи на собеседованиях: синхронизация

Предположим, что из доступных средств синхронизации у нас есть только бинарные семафоры (мьютексы). При этом семафоры поддерживают только операции lock() и unlock().

У нас есть разделяемый ресурс, который поддерживает операции чтения и записи. Существует N одновременно выполняющихся потоков, причем N — величина непостоянная. Одним потокам необходимо читать из разделяемого ресурса, другим необходимо записывать в этот ресурс.

Операция чтения может выполняться одновременно несколькими потоками, то есть когда один поток читает из ресурса, другие потоки тоже могут читать из этого ресурса, но писать в него не могут. Операция записи должна выполняться в эксклюзивном режиме, то есть во время записи никакие другие потоки не могут ни читать, ни писать.

Необходимо создать механизм синхронизации доступа к разделяемому ресурсу, который бы обеспечивал эксклюзивный доступ к ресурсу для записывающих потоков и одновременный доступ для читающих потоков, используя мьютексы. Количество используемых в решении мьютексов — на усмотрение разработчика.

После решения задачи, попытаться найти в решении недостатки и предложить более продвинутый вариант.

Подсказка:
Другими словами нужно самостоятельно реализовать аналог pthread_rwlock. Поэтому для начала нужно определить методы доступа к механизму синхронизации и отталкиваться уже от них. Например, пусть для потоков записи это будут функции writerLock() и writerUnlock(); для потоков чтения - readerLock() и readerUnlock(). Смысл этих функций аналогичен функциям lock() и unlock() для семафоров.

3 апреля 2009 г.

Кодоформатная паранойя

Есть у меня история из древности :)

Давным-давно программисты на Си при объявлении и определении функций не ставили пробелы между именем функции и открывающей круглой скобкой, а при вызове функций — ставили.

Для чего? Для того, чтобы grep'ом можно было легко найти или все вызовы функции или ее объявления.

Почему именно так ставили пробелы, а не наоборот? Потому, что иначе с define'ами была бы проблема. Ведь не напишешь же — "#define FUNC (A) ...". Только так — "#define FUNC(A) ...".

Возможно, некоторые моменты в этой истории спорные, но в общем история кажется мне вполне разумной.

1 апреля 2009 г.

Предупреждения GCC

Как я уже писал, компилятор gcc-4.3 умеет сообщать о потенциальной потере данных при преобразовании типов.

В дополнение к этому, в версии 4.3 появилось предупреждение о том, что объявление вида 'char *str = "abcd";' устарело и больше не должно использоваться. Причем предупреждение появляется даже без флагов -Wall, -Wextra и прочих. Как известно, использование в программе таких объявлений может привести к непредсказуемым последствиям. Вместо этого нужно использовать 'const char *str = "abcd";'. И это правильно.

UPD: Несмотря на дату, это не шутка :)

22 марта 2009 г.

VMWare Tools и Ubuntu 8.10

На гостевую Ubuntu 8.10 инструментарий VMWare Tools устанавливается без особых проблем. Однако после перезагрузки не работает копирование/вставка и автоматическое смена разрешения при переключении в полноэкранный режим — несмотря на то, что vmware-user прописывается в автозапуск, то ли запуска не происходит, либо что-то не срабатывает, я не разбирался.

Как я понял, такая проблема не только у меня и решение есть только временное — либо при перезагрузке запускать vmware-user руками, либо прописать его в System->Preferences->Sessions.

20 марта 2009 г.

Использование GCOV: ошибка при линковке

При сборке программы с включенными опциями для GCOV можно получить ошибку на этапе линковки следующего вида:
/usr/bin/ld: ./a.out: hidden symbol `__gcov_merge_add' in /usr/lib/gcc/i486-linux-gnu/4.1.3/libgcov.a(_gcov_merge_add.o) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output

Скорее всего причина заключается в том, что к исполняемому модулю линкуются библиотеки, которые тоже были скомпилированы с опциями -fprofile-arcs -ftest-coverage.

Простой пример, иллюстрирующий проблему.

Даны два файла:

=== a.cpp
#include <stdio.h>

extern unsigned long myfunc ();

int main (int argc, char **argv)
{
  unsigned long z = myfunc();
  printf("%08x\n", z);
  return 0;
}

=== b.cpp
#include <time.h>

unsigned long myfunc ()
{
  return time(0);
}


Из файла b.cpp делаем статическую библиотеку libmy.a, а из файла a.cpp — исполняемый модуль a.out:

g++ -c -fprofile-arcs -ftest-coverage b.cpp
g++ -shared -o libmy.a ./b.o
g++ -c -fprofile-arcs -ftest-coverage a.cpp
g++ -o a.out a.o -L. -lmy


Получаем ошибку вида "undefined reference to `__gcov_init'" — забыли подключить библиотеку libgcov.a.

Подключаем к сборке требуемую библиотеку как обычно:

g++ -c -fprofile-arcs -ftest-coverage b.cpp
g++ -shared -o libmy.a ./b.o
g++ -c -fprofile-arcs -ftest-coverage a.cpp
g++ -o a.out a.o -L. -lmy -lgcov


Вот здесь-то и получаем странную ошибку:

/usr/bin/ld: ./a.out: hidden symbol `__gcov_merge_add' in /usr/lib/gcc/i486-linux-gnu/4.1.3/libgcov.a(_gcov_merge_add.o) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output


Исправить это просто. Нужно подключить библиотеку libgcov.a не только к сборке исполняемого модуля, но и к сборке статической библиотеки:

g++ -c -fprofile-arcs -ftest-coverage b.cpp
g++ -shared -o libmy.a ./b.o -lgcov
g++ -c -fprofile-arcs -ftest-coverage a.cpp
g++ -o a.out a.o -L. -lmy -lgcov


Вот и всё. Так нужно поступить с каждой библиотекой, исходный код которой скомпилирован с опциями -fprofile-arcs -ftest-coverage.

26 февраля 2009 г.

Про мобилы

Интересно наблюдать за обзорами мобильных телефонов:

9 декабря 2008
20 причин, почему iPhone 3G хуже Nokia 5800 XpressMusic

25 февраля 2009
Nokia 5800 XpressMusic: 100-процентный брак

Что дальше? "Apple купила Nokia с потрохами"? :)

ЗЫ. А первую статью вообще какой-то кретин писал. Возможно, это был Нетупский.

13 февраля 2009 г.

Read The Following Materials!

Обнаружилась тут статья (cпасибо Максиму), в которой проводятся аналогии между архитектурой операционной системы и архитектурой библейской культуры(!)

Подход, хоть и спорный, сам по себе довольно смелый и интересный. Но в глаза бросилась фраза:
Известно, если прикладная программа постоянно сбоит, зависает или падает, то возможно, дело не в ней, а в операционной системе.

Одно время я работал вместе с человеком, который на тот момент имел за плечами десятилетний опыт работы с MSDOS и Borland C++ 3.1. В силу своего опыта и непрерывного стажа на одном месте он смог дослужиться до должности ведущего инженера. Но все это не мешало ему в своих программах копировать произвольные блоки памяти с помощью функции strcpy(). Но вот, настала эра Windows, и появилась задача портировать все старые программы с MSDOS под новую операционную систему. Надо ли рассказывать, что его программы с громким треском валились именно на вызовах strcpy. Реакция была примерно такая: "Эта сраная виндовс! Ни хрена в ней ничего не работает! Руки бы поотрывать этим уродам в майкрософте!.." На попытки объяснить, что, мол, это не виндовс, а программа неправильная, и то, что под виндой валится, так это она тебя от тебя же и защищает, чтоб ты себе случайно глазик не выколол, ответ был прото гениальный: "Но ведь под ДОСом-то работает!.."

Это позиция снобов и лузеров, неспособных к обучению. Такие люди уверены на двести процентов, что они не допускают ошибок, и постоянно ищут ошибки вокруг себя. Обычная фраза "у меня все правильно" - это тревожный звонок.

Возвращаясь к аналогиям, давайте посмотрим, как зачастую идет разработка ПО. Есть ОС и она предоставляет вполне конкретный API. Этот API описан на уровне “как им пользоваться”, а не “как он там внутри работает”. В какой-то момент, когда программа начинает давать сбои, произносится ключевая фраза - “у нас все правильно, это ОС кривая”. Но при детальном анализе вопроса выясняется, что все проблемы из-за того, что программисты все время стараются что-то подхачить “потому что API кривой”, вместо того что читать документацию и следовать ей.

В статье же в качестве неоспоримой истины взят подход "у меня все правильно"... Нет, ребята, "up-grage" вам не поможет. Кризис в головах. RTFM, мать вашу!

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

ЗЫ. Казалось бы, совсем оффтоп, ан нет - про программирование :)

5 февраля 2009 г.

Пару слов о Битриксе

Устанавливая очередное обновление Битрикса, вы рискуете превратить все ваши фичи в баги. И, к сожалению, не только фичи...

...Так уж повелось.

3 февраля 2009 г.

Шо, опять?

Сегодня, 3 февраля, компания AOL, владеющая сервисом ICQ, в очередной раз обновила версию протокола обмена мгновенными сообщениями, что привело к невозможности подключения пользователей альтернативных клиентов, таких как популярный в России QIP, а также Miranda, Adium и других. полный текст

Источник: CNews


Во-первых, Миранда у меня ни разу не отключалась за сегодня. До сих пор работает.

Во-вторых, при внимательном прочтении новостей, бросилось в глаза, что из списка "QIP, а также Miranda, Adium и другие" ссылка в статьях стоит только на "популярный в России QIP". Странно, к чему бы это?

Статья раз
Статья два
Статья три

Эй, кто там волну гонит? Сколько это стоит? ;)

1 февраля 2009 г.

Слесари по наеб...ву

После прочтения вот этой байки вспомнилось вдруг.

В бытность мою молодым и зеленым, только что окончившим университет, довелось мне пойти работать на некое государственное предприятие. Казалось бы, все хорошо, интересная работа, вся карьерная лестница впереди, но что-то мне покоя не давало. Это "что-то" было в несоответсвии озвучиваемых вслух лозунгов (типа "качество, а не количество!" и т. п.) и реальных результатов. То есть, если речь шла о качестве, то в конечном продукте качества было очень мало. И чем дальше, тем несоответствие становилось все заметнее...

Довольно долго я не мог понять, что происходит. Это продолжалось до тех пор, пока некоторые руководители перестали бояться при мне произносить вслух то, что они действительно думают. Как-то раз, при очередном обсуждении какого-то рабочего вопроса, мне сказали: "Нам результат на х... не нужен. Нам за результат не платят. Нам платят за процесс."

После этого я уже ничему не удивляюсь.

22 января 2009 г.

Про аську

Сегодня весь рунет пестрит сообщениями о том, какие там в AOL козлы сидят и как заставить аську работать...

Скажу честно, у меня Миранда с утра тоже сообщила о том, что протокол изменился. А минут через 10 я попробовал еще раз подключиться и все было как обычно. Никаких проблем. Безо всяких обновлений, скачиваний и переустановки.

Такое впечатление, что все эти советы кульных хацкеров "как заставить аську работать" действительно работают только потому, что пока народ скачивает и переустанавливает, все и так начинает работать без проблем.

19 января 2009 г.

Про кино

Видел рекламу фильма "Стиляги", подумал - что, блин, еще за "фильм-праздник"? Вот уж точно фигня какая-то. Но все-таки посмотрел, совершенно случайно, как это часто бывает. Нисколько не жалею и нахожусь в полном восторге.

Я вообще-то мюзиклы не очень жалую, но этот мне очень понравился. Комедийный фильм, местами грустный, местами злой, но очень яркий, позитивный и музыкальный. Причем музыка расчитана на людей, выросших на русском роке 80-90 годов. Я уже успел ознакомиться с рецензиями и очень подозреваю, что фильм не понравился людям, не попадающим в эту категорию. Тема любви, основанная на "Восьмикласснице" Цоя - это находка. Лично я, одобряю :) А Гармаш с баяном, поющий про человека и кошку - полный улет! :)

Юмор там тоже хороший, не тупой, местами даже сатира. И вообще, хорошие песни, хорошие аранжировки, хорошие актеры и красивые картинки. Фильм получился, и за то большое спасибо его создателям.

Отдельно скажу про сайт фильма. Он явно расчитан он на тех, кто фильм уже посмотрел :) Слишком много там дополнительной информации, которая просто непонятна до просмотра.

Еще я посмотрел "Обитаемый остров". Может быть и неожиданно, но фильм мне понравился. Даже специально попытавшись, увы, не смог найти в этом фильме ничего такого, за что можно бы было сказать, что фильм "унылое говно" или что-нибудь подобное. Фильм сделан на твердую четверку. Может быть, продолжение будет полным отстоем, но пока - хорошо. Хотя, на что ругаются в основном? Гламурный чувак в главной роли и драчки плохие? Ню-ню... :) Идите смотрите четвертого крепкого орешка ;)

ЗЫ. Гармаш в обоих фильмах отлично сыграл. Я вообще его как-то зауважал после "12", а тут прям тащиться начинаю от его игры.

14 января 2009 г.

Цветные diff'ы и less

Можно сделать работу с кодом в консоли более удобной, если раскрасить diff'ы. Это сделает текст более наглядным, а значит, упростит работу и увеличит производительность :)

Для этого нужно установить в системе пакет colordiff. После установки можно пользоваться командой colordiff точно так же, как и обычным diff'ом:

colordiff file1 file2

или использовать пайпы

diff file1 file2 | colordiff


Либо просто прописать алиас в .bashrc, если кого устраивает такой вариант:

alias diff=colordiff.


Тем, кто работает с CVS или SVN можно прописать в .bashrc или .profile следующие функции:

# color diffs for CVS
function cvsdiff () {
  if [ "$1" != "" ]; then
    cvs diff $@ | colordiff;
  else
    cvs diff | colordiff;
  fi
}

# color diffs for SVN
function svndiff () {
  if [ "$1" != "" ]; then
    svn diff $@ | colordiff;
  else
    svn diff | colordiff;
  fi
}


Настройка colordiff осуществляется через файл ~/.colordiffrc (настройки по умолчанию находятся в /etc/colordiffrc).

Чтобы использовать новые возможности вместе с командой less нужно заставить less понимать коды цветов. Для этого существует ключ -R:

colordiff file1 file2 | less -R


Для того, чтобы этот ключ использовался по умолчанию, нужно указать его в переменной окружения LESS:

export LESS="-R"


Вот и все.

Подсмотрено у drupal.org и rha7dotcom, а также в man colordiff.