суббота, 16 февраля 2013 г.

chromium

"Гонять" v8 придется под chromium. Выгрузка его кодовой базы и настройка сборки заняли не так уж и мало времени и не прошли гладко: gclient заявил (если я верно понял, устами svn), что не может продолжить работу вследствие наличия папки (развернутой из bootstrap-архива), не принадлежащей проекту. Удалил её вручную, надеюсь, именно так и нужно было поступить. В ходе дальнейшего конфигурирования gсlient выдал два десятка предупреждений с рекомендацией удалить те или иные каталоги. Переместил их в отдельную папочку. Запустил сборку. Если всё пойдет хорошо, это на часы или даже десятки часов.

UPD.
Chromium успешно собрался, примерно за 3.5-4 часа. Папка с репозиторием потяжелела до 14 Гб., бинарный файл (собранный в дебаге, конечно) "весит" 1.6 Гб. На первый взгляд всё работает, пока заметил только странный эффект при обновлении экрана - мелькает сплошная зелёная заливка. Дебажная версия отличается не только отладочными символами в бинарных файлах - в консоль много чего логируется при работе.

v8

Кажется, настала пора ковырять JavaScript-движок от Google v8. Собрался он на ура, благо подробные (и при том простые) инструкции по сборке присутствуют в документации. Пока только было замечено, что движок неплохо покрыт тестами - их очень много и они долго выполняются (много дольше довольно шустрой сборки), хотя не все проходят успешно несмотря на то, что собиралась релизная версия десятидневной давности. Посмотрим, как быстро закончится документация.

суббота, 21 июля 2012 г.

Подключение к VirtualBox физического жесткого диска

Вы можете создать виртуальную машину, работающую со специальным *.vmdk-диском, в действительности напрямую отображаемом в реальный жесткий диск, в том числе внешний.

Так создается описанная связь (предполагается, что вы хотите создать *.vmdk-диск с именем usb-hdd320 и соединить его с пустым физическим диском /dev/sdc, и все происходит в ОС семейства Linux):

# cd ~/VirtualBox\ VMs
# sudo vboxmanage internalcommands createrawvmdk -filename usb-hdd320.vmdk -rawdisk /dev/sdc

Вы должны получить сообщение "RAW host disk access VMDK file usb-hdd320.vmdk created successfully", если все прошло хорошо. Далее необходимо создать виртуальную машину с именем, например, minilab, для работы с жестким диском через *.vmdk файл:

# sudo vboxmanage createvm --name minilab --ostype Ubuntu --register
# sudo vboxmanage modifyvm minilab --memory 512
# sudo vboxmanage storagectl minilab --name "IDE Controller" --add ide
# sudo vboxmanage storageattach minilab --storagectl "IDE Controller"--port=0 --device=0 --type hdd --medium ~/VirtualBox\ VMs/usb-hdd320.vmdk

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

# sudo vboxmanage storageattach minilab --storagectl "IDE Controller" --port=0 --device=1 --type dvddrive --medium ~/VirtualBox\ VMs/installation_cd.iso

Запускается виртуальная машина minilab так:

# sudo vboxmanage startvm minilab

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

понедельник, 30 апреля 2012 г.

Objective-C

Если вы давно хотели попробовать, что же такое Objective-C, но не знали, с чего начать, то вам определенно будет более, чем достаточно на первое время материала двух лишь только статей:
википедии и руководства по GNUstep

UPD.
Ну и разумеется замечательная страничка документации по GNUstep.

среда, 11 апреля 2012 г.

Qt & multiple definition

QГрабля#5


При инстанцировании шаблонов внутри классов, использующих мета-объектную систему Qt, а также в ряде других ситуаций при использовании этой библиотеки (на практике особенно часто - при создании Unit-тестов силами QTestLib) возможно возникновение ошибки линковки multiple definition. Связано это с тем, что moc парсит заголовочные файлы и для всех файлов, содержащих класс с макросом Q_OBJECT генерирует *.cpp-файл с необходимым для функционирования мета-объектной системы Qt кодом. Такой файл становится отдельной единицей компиляции, и если в нем, как пример, инстанцируется какой-либо шаблон, то он, согласно правилам компиляции шаблонов C++, полностью включается в генерируемый объектный файл. Врочем, ровно то же происходит при инстанцировании такого шаблона в любом другом *.cpp файле, например, содержащем main(). В итоге в ходе линковки один и тот же шаблон обнаруживается сразу в нескольких объектных файлах, что и приводит к возникновению описанной выше ошибки.

Поправить ситуацию можно несколькими способами. Можно все методы шаблона сделать
inline-овыми (см. описание похожей ситуации), можно модифицировать сборку Qt-проекта вручную так, чтобы генерируемый moc'ом файл просто включался в файл, по которому он был сгенерирован (именно это в простых случаях автоматизировано выполняет этот скрипт (см. замечания)) Либо можно позволить линковщику самостоятельно разрешать такие конфликты, просто выбирая первое из многочисленных определений (ключ -z muldefs для *nix-линковщика ld) Интегрировать нужные ключи можно автоматически в Makefile с помощью этого скрипта (см. описание), либо просто ключив в *.pro-файл строку вида:

QMAKE_LFLAGS += -z muldefs


понедельник, 12 марта 2012 г.

Перенесу сюда сообщение из своего аккаунта в контакте:
Выяснение отношений с непокорным C++ привело меня к заключению, что чтобы детально разбираться во всех тонкостях инициализации и уничтожения объектов классов нужно положить на это жизнь. Если при попытке писать что-то ООП-шное вы часто получаете непонятные ошибки, возможно, причина кроется как раз в непонимании одного из 847528345-и моментов, касающихся именно этой области C++. Очень хорошо эти вопросы освещены в соответсвующих главах Брюса Эккеля "Философия C++, том 1", в которых будет проще и продуктивнее следить за мыслью автора с помощью вот этого: https://github.com/ramntry/constructors
Получить пакет и попробовать запустить пример на *nix-совместимых системах можно следующим образом:

git clone git://github.com/ramntry/constructors.git
cd constructors
./constructors -f examples/virtual_destructors.cpp
В системе должны быть установлены bash (или другой совместимый shell), git, g++ (gcc) и sed