программистское (Мозилла)
Jan. 10th, 2004 06:46 pmИграюсь с исходниками Мозиллы (Firebird).
Какое ужасно запутанное, сложное дерево, сам чёрт голову сломит. Сгрузил самый свежий код из CVS, построил debug-версию. Запускается. Захотел сделать так, чтобы оно пользовалось не моей директорией профиля $HOME/.phoenix, а какой-нибудь другой, скажем, $HOME/.phoenix-devel . Довольно скромное пожелание, правда? Почти час провозился, пока заставил его. Главное, нашёл код, который открывает или создаёт директорию профиля. В Юниксе он берёт $HOME и добавляет к нему DEFAULT_PRODUCT_DIR, который устанавливается в MOZ_USER_DIR, который всегда ".mozilla", и в Firebird тоже. Но чёрт побери, оно ж использует директорию .phoenix всё-таки, и всё там создаёт/редактирует. Я туда, сюда, захожу в gdb, отлавливаю вызовы этой функции — ну да, исправно вызывается много раз и всем говорит "$HOME/.mozilla", а используется тем не менее .phoenix. Что за чёрт? Ну хорошо, делаю глобальный поиск ".phoenix" по всему дереву, ничего интересного не нахожу. Делаю поиск по "phoenix", тоже ничего интересного не нахожу. Мистика. Что он его, по буквам собирает?
Тут я заметил, что директорию $HOME/.mozilla он-таки исправно создаёт при каждом запуске, если я её удаляю. Но всё равно не использует, а испольует .phoenix. Я разозлился окончательно, удалил .phoenix, чтобы заставить его создать, запустил под gdb, и поставил breakpoint на mkdir(2). Вот это не обойдёшь, сволочь. И поймал-таки момент создания, проследил stack trace, и что оказывается? Это идёт от другой функции GetProductDirectory, в совершенно другом месте, классе, файле и модуле, но почти точной копии той, первой, которая, видимо, устарела (но почему вызывается двадцать раз во время работы?). Эта фунцкия, однако, не вставляет зафигаченное в compile-time значение ".mozilla", а добавляет к $HOME значение mProductDir, а его откуда берёт? А вот откуда:
Естественно, aProductName в совсем другом месте определяется как "Phoenix", в результате выходит .Phoenix, а после вызова ToLowerCase — искомый .phoenix. Неудивительно, что я не смог это глобальным грепом найти!
Извращенцы чёртовы.
Главное, у них постоянно такое. Куча кода повторяется два раза, с какими-то мелкими изменениями, и поди разбери, какая из двух версий или какой из двух классов "настоящий", учитывая ещё, что оба компилируются и иногда оба вызываются во время работы программы, только один из них — "по историческим причинам". Необходима радикальная чистка авгиевых конюшен. And don't get me started on their build process.
Какое ужасно запутанное, сложное дерево, сам чёрт голову сломит. Сгрузил самый свежий код из CVS, построил debug-версию. Запускается. Захотел сделать так, чтобы оно пользовалось не моей директорией профиля $HOME/.phoenix, а какой-нибудь другой, скажем, $HOME/.phoenix-devel . Довольно скромное пожелание, правда? Почти час провозился, пока заставил его. Главное, нашёл код, который открывает или создаёт директорию профиля. В Юниксе он берёт $HOME и добавляет к нему DEFAULT_PRODUCT_DIR, который устанавливается в MOZ_USER_DIR, который всегда ".mozilla", и в Firebird тоже. Но чёрт побери, оно ж использует директорию .phoenix всё-таки, и всё там создаёт/редактирует. Я туда, сюда, захожу в gdb, отлавливаю вызовы этой функции — ну да, исправно вызывается много раз и всем говорит "$HOME/.mozilla", а используется тем не менее .phoenix. Что за чёрт? Ну хорошо, делаю глобальный поиск ".phoenix" по всему дереву, ничего интересного не нахожу. Делаю поиск по "phoenix", тоже ничего интересного не нахожу. Мистика. Что он его, по буквам собирает?
Тут я заметил, что директорию $HOME/.mozilla он-таки исправно создаёт при каждом запуске, если я её удаляю. Но всё равно не использует, а испольует .phoenix. Я разозлился окончательно, удалил .phoenix, чтобы заставить его создать, запустил под gdb, и поставил breakpoint на mkdir(2). Вот это не обойдёшь, сволочь. И поймал-таки момент создания, проследил stack trace, и что оказывается? Это идёт от другой функции GetProductDirectory, в совершенно другом месте, классе, файле и модуле, но почти точной копии той, первой, которая, видимо, устарела (но почему вызывается двадцать раз во время работы?). Эта фунцкия, однако, не вставляет зафигаченное в compile-time значение ".mozilla", а добавляет к $HOME значение mProductDir, а его откуда берёт? А вот откуда:
mProductDir.Assign(NS_LITERAL_CSTRING(".") + aProductName);
ToLowerCase(mProductDir);
Естественно, aProductName в совсем другом месте определяется как "Phoenix", в результате выходит .Phoenix, а после вызова ToLowerCase — искомый .phoenix. Неудивительно, что я не смог это глобальным грепом найти!
Извращенцы чёртовы.
Главное, у них постоянно такое. Куча кода повторяется два раза, с какими-то мелкими изменениями, и поди разбери, какая из двух версий или какой из двух классов "настоящий", учитывая ещё, что оба компилируются и иногда оба вызываются во время работы программы, только один из них — "по историческим причинам". Необходима радикальная чистка авгиевых конюшен. And don't get me started on their build process.
no subject
Date: 2004-01-10 09:48 am (UTC)no subject
Date: 2004-01-10 10:10 am (UTC)no subject
Date: 2004-01-11 03:01 am (UTC)no subject
Date: 2004-01-11 03:30 am (UTC)по-моим наблюдениям, на одного фичерописца в больших народных проектах приходится как минимум пара компульсивных починителей/подчищателей.
ежовых рукавиц на них нету, вопчем.
no subject
Date: 2004-01-10 11:36 am (UTC)так всё запутанно у них
no subject
Date: 2004-01-10 04:19 pm (UTC)ЗЫ: 1.4 не будет :) Будет 2.0
no subject
Date: 2004-01-10 01:37 pm (UTC)Я сейчас столкнулся на работе с этой проблемой. Там правда дело не в редантном коде, а в том, что дерево убогое, а весь building procedure - кровоточит. Приходится резать по живому, но я хотя бы код почти весь наизусть знаю... А в Mozilla никто весь код наизусть не знает...
no subject
Date: 2004-01-10 01:48 pm (UTC)no subject
Date: 2004-01-10 02:15 pm (UTC)no subject
Date: 2004-01-10 04:01 pm (UTC)no subject
Date: 2004-01-10 04:11 pm (UTC)no subject
Date: 2004-01-10 08:13 pm (UTC)Единственный реальный результат моей работы, которым я могу поделиться: сделать это правильно сложно :)
no subject
Date: 2004-01-11 10:50 am (UTC)Кстати, ты небось для c++ делал, да? Я слышал что задачи автоматического рефакторинга в Жабе решаются на порядок легче...
no subject
Date: 2004-01-11 02:44 pm (UTC)Но хватит об этом, мне грустно об этом вспоминать :)
Opera
Date: 2004-01-11 12:21 am (UTC)Re: Opera
Date: 2004-01-11 12:24 am (UTC)В этом контексте Opera не лучше и не хуже, чем Internet Explorer.
:-)
Date: 2004-01-11 01:26 am (UTC)Уж очень я её люблю за всё: скорость, настраиваемость, и главное - интэрфейс.
Чтобы хорошо работало, в Опере не нужно изменять исходный код. Надо лишь вставить регистрационный.
А вы линуховскую версию Фаербёрда роете?
не-а
Ого-го!
И сомневаюсь, что "хороших" сайтов. Дайте ссылочку, а? Может быть, они хороши в плане контента, но никак не в плане грамотного кодинга.
Однако, постойте... У меня в ранних версиях(сейчас - 7.23) тоже иногда отображалось не так(...как в IE). Но это недочёт кодеров, которые делают не по спецификации, а по тому, как выглядит в IE и Мозилле.
Последние версии стараюцца идти в ногу с мейнстримом, и ни одного "косяка" в отображении HTML я не встречал.
no subject
Date: 2004-01-11 01:43 am (UTC)heh
Date: 2004-01-11 06:34 am (UTC)Re: heh
Date: 2004-01-11 06:40 am (UTC)Re: heh
Date: 2004-01-11 02:47 pm (UTC)Я это на самом деле к тому, что -I надо делать.