Быстро разобраться в новом проекте

Довольно часто возникает необходимость разобрать новый большой проект и не совсем очевидно с какой стороны подступиться к огромной горе исходных кодов которая свалилась на вас. Если вам повезло и проект написан на C++, C, Objective-C, Python, Java, PHP, C#, Фортран или VHDL то простое решение есть – Doxygen + GraphWiz.

Я не буду вдаваться в такие базовые вещи, как создание проектов в Doxygen, с этим и так все очень просто. Заметка базируется на предположении что базовый проект создан, пути к исходным кодам, которые необходимо изучить, прописаны и осталось сделать так, что бы по генерируемой Doxygen документации можно было быстро легко разобраться в проекте.

В качестве примера я решил взять LLVM с размером исходного кода около 12Мб. На построение документации ушло около 2 минут, что, конечно, не мало, но с учетом однократности подобной операции совершенно не критично. Continue reading

WTFPL

Я долгое время был уверен что лучшая лицензия для открытого ПО – это The BSD 3-Clause License. Но сегодня, внезапно, наткнулся на Do What The Fuck You Want To Public License (WTFPL) и как-то даже засомневался. Эта лицензия мне нравится еще больше предыдущей, хотя, конечно, изрядная доля шутки в ней есть

Дизассемблер под OSX

Иногда бывыет нужно что-то по-быстрому дизассемблировать, понять как работает или почему работает не так, как ожидалось. Недавно, в очередной раз вознила такая задача и я стал думать чем же мне воспользоваться. По большому счету, под OSX с дизассемблерами не очень: возможности OTool как дизассемблера (им я раньше и пользовался, но уж больно не удобно что-либо дизассемблировать в командной строке) очень скудные, IDA Pro за $1129 (да, именно Pro, а не Starter, которую я еще согласен оплатить из своего кармана) и очень понравившееся мне приложение с великолепным соотношением цена/качество – Hopper Disassembler.
Безусловно, по возможностям Hopper Disassembler основательно уступает IDA Pro, но, в большинстве случаев вся мощь IDA Pro не очень-то нужна и возможностей Hopper вполне хватает. Так что, будет кому-то нужен недорого дизассемблер под OSX – поглядите в сторону Hopper.

Pip, update all

Хотелось бы, да? А нету. Нашлось вот такое решение:

import pip
import sys
from subprocess import call

def pip_ver():
    if sys.version_info.major == 3:
        return "pip3"
    else:
        return "pip"

cmd_line = pip_ver() + " install --upgrade "

for dist in pip.get_installed_distributions():
    call(cmd_line + dist.project_name, shell=True)

Использовать просто:

python script_name.py

Делать файл исполнимым не стал, т.к. при явном вызове Python можно указать нужную версию 2.X или 3.X

Явное удаление функций в C++11

Думаю что все помнят что в C++03 для того, что бы сделать какой-либо класс защищенным от копирования было необходимо объявить его конструктор копирования и защищенными.

class Foo {
public:
    Foo(){}
    ~Foo(){}
private:
    Foo(const Foo&);
    Foo& operator=(const Foo&);
};

Continue reading

Переменные окружения в OSX

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

Стандартный путь довольно прост: необходимо вписать в файл /etc/launchd.conf новые пути, следующим способом.

setenv PATH /new/path/a:/new/path/b

Собственно, я так делал всегда и все было нормально. Но, внезапно, а может и не очень, к примеру после какого-то обновления, ряд приложений (тот же Eclipse и Wireshark) перестал видеть что-либо за пределами переменных, прописанных в /etc/launchd.conf. В итоге, по мнению этого ряда приложений “исчезло” все, VJM, dir, ls да совсем-совсем все.

Гугла подсказала, что пользовательские переменные, которые должны стать доступны всем, можно добавить еще в пару файлов, например в /private/etc/paths. Формат файла прост: одна линия – один путь.

/new/path/a
/new/path/b