У математиков есть бесплатный arxiv.org/. Там много сильных работ, кстати там же есть и работы Перельмана — того самого :) Есть конечно и платные журналы, но авторы-математики там как правило не получают за статьи ни копейки, кроме может быть знаменитостей типа Майка Громова или того же Перельмана. По крайней мере я как-то печатался в ROSE — получил только эл. копию статьи по почте, и всё. Мои знакомые, которые печатались в различных журналах, тоже получили только «спасибо за вклад в науку» и никаких денег. Может нам всем конечно не повезло, и другие математики зарабатывают своими доказательствами огромные деньги… но как-то сомнительно.
> «не использовать» в своих доказательствах
Прикольно. Запатентую пожалуй нормальные подгруппы. И все кто использует их в своих доказательствах (а это практически вся алгебра) — мне автоматически должны. Или нет! Лучше запатентую множество. Тогда вообще все мне должны, абсолютно. Маразм, маразм…
Например математики которые придумали что-то толковое вроде доказательства БТФ всегда безвозмездно выставляют свои работы на суд широкой публики. Никто из математиков никогда не скажет: «Я нашел доказательство, но у меня на него патент, так что фиг вам! А ещё у меня патент на квадратный корень, так что если выпускайте учебники математики то только со ссылками на моё доказательство (само доказательство не публиковать!) и на квадратные корни тоже»
>… люди (обычно бедные и необразованные), просиживающие вечера за
> убогим телевизором (просто невозможно смотреть то, что ныне показывают),
> вместо того чтобы прочитать что-то и стать кем-то. Как заставить их встать с
> дивана? Никак, надо спасать детей.
Мораль вообще штука такая… неоднозначная. Часто хочется как лучше, а получается как всегда. В связи с этим почему-то вспомнилось из «Линии грёз»:
\begin{offtop}
\begin{cite}
«Севолд Мартызенски был человеком-легендой. Он создал почти половину моделей оружия Смутной Войны. Лабораторию он покидал раза три в год — когда поблизости проходили манифестации пацифистов. Казалось, что он полностью разделяет свою работу над смертоносным оружием и подчеркнуто мирные убеждения. Демонстранты так не думали, и, несмотря на хорошую охрану, Севолда пытались бить. Безрезультатно попытавшись поучаствовать в демонстрациях, Мартызенски обычно возвращался в лабораторию и в расстроенных чувствах создавал еще более жуткие агрегаты по уничтожению жизни во всех ее проявлениях. Если легенды не врали, то в период его многочисленных творческих кризисов СИБ инсценировала демонстрации пацифистов...»
\end{cite
}\end{offtop}
Касательно защиты — можно подумать и о таком цикле статей тоже. Вообще-то следующее что я собирался написать: серия статей про отладку под iOS без исходного кода, или про «кровавый энтерпрайз», но можно и пересмотреть планы. Хотя если я напишу про защиты — хакеры эти статьи ведь тоже прочитают и будут в курсе дела, верно? Тоже как-то нехорошо получится. Не знаю даже…
Прямо сейчас не могу — пишу статью про отладку native методов без исходных кодов под Android. В интернете про это на русском ничего, на английском скудно, на китайском побольше — но мой китайский очень плох :)
Как закончу — можно будет и про «кровавый энтерпрайз» вспомнить :)
Ну на самом деле это простейший случай конфликта: один и тот же файл ставится двумя MSI инсталляциями, причем компонентами с разными гуидами. И решение конфликта тут тоже элементарное: назначить компонентам одинаковые гуиды, и всё. За свою практику я наблюдал конфликты намного более замысловатые :)
Вообще dependecy & conflic management — это тот ещё хитрый геморрой. Зато если всё делается как надо, то у заказчика может быть хоть по триста приложений на каждой из его десятков тысяч машин включая банкоматы и сервера — всё равно всё работает гладко и не лагает.
Объясню на примере. Допустим есть компонент A с гуидом {A} в файле A.msi, и компонент компонент B с уже другим гуидом {B} в файле B.msi. Оба компонента, и A и B, ставят некую библиотеку X.dll в C:\Windows\System32 (на самом деле это частая ситуация — программы доставляют нужные им версии системных библиотек, всякие comctl и т.п.).
Теперь давайте представим что система разворачивания делает с файлами A.msi и B.msi следующее:
1. Устанавливает A.msi. В результате компонент A установился и зарегистрировался в системе, а библиотека X.dll стала в C:\Windows\System32. Пока все довольны.
2. Устанавливает B.msi. В результате компонент B установился и зарегистрировался в системе. Библиотека X.dll по прежнему в C:\Windows\System32. Пока все всё ещё довольны, но это уже не надолго.
3. Удаляет A.msi. В результате разрегистрируется и удаляется компонент A и, поскольку отмечено что этому компоненту принадлежит библиотека X.dll — удаляется и эта библиотека тоже! Windows Installer плевать что эта библиотека принадлежит еще и компоненту B. И вот тут все становятся несчастными…
4.… потому что при запуске приложения, которое было поставлено B.msi, это приложение не находит нашу X.dll и работать отказывается.
Если инсталляция B.msi сделана правильно и доступна в системе во время запуска приложения — начнется self healing, который восстановит библиотеку X.dll. Но даже если B.ms сделана как надо, self healing возможен не во всех системах разворачивания — например в той же HP OpenView нас ждёт облом, т.к. B.msi будет просто недоступна, в силу архитектуры самой системы. В результате на паре тысяч машин не запустится какое-то ПО. Если это Блокнот, то фиг с ним. А если это система обслуживания клиентов в банке у операторов?
Что бы такой фигни не происходило, нужно синхронизировать гуиды компонентов A и B. Тогда произойдёт следующее:
1. Система разворачивания устанавливает A.msi. В результате компонент A установился и зарегистрировался в системе, а библиотека X.dll стала в C:\Windows\System32.
2. Устанавливает B.msi. У компонента B тот же гуид что и у A. В результате у компонента A просто увеличился счетчик количества установок. Библиотека X.dll по прежнему в C:\Windows\System32.
3. Удаляет A.msi. В результате счетчик установок компонента A уменьшился на один. Сам компонент не удалился, библиотека X.dll на месте!
4. При запуске приложения, которое было поставлено B.msi, это приложение находит нашу X.dll и нормально стартует. Все довольны, все смеются.
Если выполнить msiexec.exe /a %путь_к_msi% /qn TARGETDIR=%куда_распаковывать%
то в папке %куда_распаковывать% мы получим структуру каталогов, которые могут повторять структуру каталогов в %ProgramFiles%\%папка_продукта%. A могут и не повторять — зависит от того что записано в таблице Directory в MSI файле. В результате, если программа имеет возможность запуститься как Portable — её можно запустить из папки %куда_распаковывать%. Но для этого нужно что бы
* программа могла запускаться как Portable
* MSI не должна содержать custom actions без которых программа не ставится и не работает потом нормально (т.к. во время админустановки они не выполняться)
* MSI должна быть правильно сделана — например такая MSI как у инсталлятора JAVA работать на будет, т.к. внутри там один большой архив который распаковывается с помощью custom action
Я так понимаю MSI инсталляция которая обсуждается в данном конкретном случае — работает после админ. установки.
Административная установка кроме всего прочего нужна для того, что бы можно было пропатчить MSI-инсталляцию с помощью MSP (или нескольких), и потом устанавливать уже пропатченный продукт. Намного удобнее чем ставить а потом патчить. А ещё некоторые системы разворачивания (например HP OpenView aka Radia) требуют только админустановку.
Таки да! Microsoft — разработчики стандартов Windows Installer — в большинстве случаев сами этих стандартов не придерживаются. Пичалька, огорченьице, гневик…
Большинство клиентов, с которыми работала моя команда, предпочитали инсталляции без диалогов. Также практически все крупные клиенты (от 10 тыс. машин в филиалах по всему миру) предпочитали чистый не загаженный никакими авторскими примочками MSI. Обычный MSI, сделанный стандартными средствами, который можно запихнуть в conflict management system и сделать components conflict resolving, который без проблем ставится например MS SCCM, которые не даёт туеву хучу ошибок при валидации стандартным CUBом орки. И который легко кастомизировать через Property (хоть трансформом, хоть с командной строки). И который можно поставить из-под Local System, что в случае InstallShield иногда превращается в дикий геморрой. Вот что надо корпоративным клиентам.
У меня шесть лет опыта системного интегратора именно в изготовлении и/или затачивании MSI и не-MSI инсталляций для MS SCCM, HP OpenView, IBM Tivoli, а также для кучи самописных систем-«велосипедов» заказчика. За это время через мои руки прошло около трех сотен различных инсталляций. И вот что я, опираясь на этот опыт, скажу.
Уважаемые товарищи разработчики!
Если Ваше приложение планируется (хотя бы в перспективе) разворачивать в корпоративных сетях — не пишите никаких своих инсталляторов! Не надо, пожалуйста, я от имени всех системных интеграторов Вас очень прошу! Выучите уже наконец обыкновенный стандартный MSI и его штатными средствами сделайте обыкновенную нормальную MSI-инсталляцию! Без хитрых custom actions, без навороченных обёрток со своими командными строками, без InstallShield внутри. Если сами не умеете — доверьте это дело профессионалам, которые занимаются развёртыванием продуктов в корпоративных сетях. Честное слово, они лучше знают как надо это делать!
Со всем уважением, искренне ваши, системные интеграторы.
Перевод конечно дело хорошее, только я чего-то в тексте не нахожу упоминания первоисточника. Возможно я просто невнимательно прочитал — прошу прощения, если так.
Как я уже задолбался выковыривать эту мейлрушную заразу с компьютеров родственников и знакомых. Пусть горят в аду те мейлрушные п… сы который это придумали! «Помсти хочу! Побачить цю падлюку на параші, за грою в „півника“ з неголеним убивцей! Або в канторі сраним інженером!» (с)
Во время обучения в аспирантуре я видел математиков, которые были действительно отличными учеными в одних областях математики и полными фриками в других. Например я знал доктора наук, который в своё время совершил буквально революцию в теории случайных процессов, а потом вдруг увлёкся теорией чисел, совершенно «не своей» областью. В теории чисел он оказался полным фриком — доставал всех подряд якобы единственно правильными доказательствами большой теоремы Ферма в три строчки, и окончательным решением проблемы близнецов. Строил какие-то элементарные с точки зрения теории групп умозаключения и выдавал их за гениальные прорывы, при этом вводил свою терминологию, так что его мало кто понимал… его слушали, чисто из уважения перед прошлыми заслугами, и даже чем-то наградили по случаю юбилея АН. Ему даже удалось протащить свой бред в ВАКовский журнал — в связи с этим самым юбилеем (в вестник чего-то-там, обычную местечковую «мурзилку»)… к чему это я? А, да… иногда когда ученый талантлив в чем-то одном, но полный фрик в другом — иногда потом бывает очень трудно отделить зерна от плевел. И после смерти этого ученого, обычно с подачи журналистов, прижизненное безразличие других к его фриковскому бреду вдруг становится «травлей». А сам бред — «непризнаной теорией, к которой научное общество ещё не готово». Это я так, чисто мысли вслух :)
Ну у меня было пару идей, например:
(1) Прикрутить к Dalvik возможность по протоколу JDWP отзываться на вопросы вроде «Пауза! Какая инструкция выполнялась последней? Какое значение локально регистра v0?» Всё-таки исходники Dalvik открыты, можно поковыряться… Но времени нету, да и C++ программист из меня — как из говна пуля.
(2) Ещё была одна идея, которая заключалась в получении Smali кода (с помощью того же дизассемблера Smali), а потом патчинге этого самого кода так что бы его можно было потом отлаживать. Идея не очень изящная, такой себе мегакостыль…
> «не использовать» в своих доказательствах
Прикольно. Запатентую пожалуй нормальные подгруппы. И все кто использует их в своих доказательствах (а это практически вся алгебра) — мне автоматически должны. Или нет! Лучше запатентую множество. Тогда вообще все мне должны, абсолютно. Маразм, маразм…
>… люди (обычно бедные и необразованные), просиживающие вечера за
> убогим телевизором (просто невозможно смотреть то, что ныне показывают),
> вместо того чтобы прочитать что-то и стать кем-то. Как заставить их встать с
> дивана? Никак, надо спасать детей.
почему-то напомнило «Гадкие лебеди» Стругацких.
\begin{offtop}
\begin{cite}
«Севолд Мартызенски был человеком-легендой. Он создал почти половину моделей оружия Смутной Войны. Лабораторию он покидал раза три в год — когда поблизости проходили манифестации пацифистов. Казалось, что он полностью разделяет свою работу над смертоносным оружием и подчеркнуто мирные убеждения. Демонстранты так не думали, и, несмотря на хорошую охрану, Севолда пытались бить. Безрезультатно попытавшись поучаствовать в демонстрациях, Мартызенски обычно возвращался в лабораторию и в расстроенных чувствах создавал еще более жуткие агрегаты по уничтожению жизни во всех ее проявлениях. Если легенды не врали, то в период его многочисленных творческих кризисов СИБ инсценировала демонстрации пацифистов...»
\end{cite
}\end{offtop}
«Guns don't kill people, people kill people» © Когда я писал эту статью я представлял «по ту сторону монитора» прежде всего вирусных аналитиков и white hats, т.е. людей со стороны света. Хотя я конечно в курсе куда выстлана дорога благими намерениями :)
Касательно защиты — можно подумать и о таком цикле статей тоже. Вообще-то следующее что я собирался написать: серия статей про отладку под iOS без исходного кода, или про «кровавый энтерпрайз», но можно и пересмотреть планы. Хотя если я напишу про защиты — хакеры эти статьи ведь тоже прочитают и будут в курсе дела, верно? Тоже как-то нехорошо получится. Не знаю даже…
Как закончу — можно будет и про «кровавый энтерпрайз» вспомнить :)
Вообще dependecy & conflic management — это тот ещё хитрый геморрой. Зато если всё делается как надо, то у заказчика может быть хоть по триста приложений на каждой из его десятков тысяч машин включая банкоматы и сервера — всё равно всё работает гладко и не лагает.
Теперь давайте представим что система разворачивания делает с файлами A.msi и B.msi следующее:
1. Устанавливает A.msi. В результате компонент A установился и зарегистрировался в системе, а библиотека X.dll стала в C:\Windows\System32. Пока все довольны.
2. Устанавливает B.msi. В результате компонент B установился и зарегистрировался в системе. Библиотека X.dll по прежнему в C:\Windows\System32. Пока все всё ещё довольны, но это уже не надолго.
3. Удаляет A.msi. В результате разрегистрируется и удаляется компонент A и, поскольку отмечено что этому компоненту принадлежит библиотека X.dll — удаляется и эта библиотека тоже! Windows Installer плевать что эта библиотека принадлежит еще и компоненту B. И вот тут все становятся несчастными…
4.… потому что при запуске приложения, которое было поставлено B.msi, это приложение не находит нашу X.dll и работать отказывается.
Если инсталляция B.msi сделана правильно и доступна в системе во время запуска приложения — начнется self healing, который восстановит библиотеку X.dll. Но даже если B.ms сделана как надо, self healing возможен не во всех системах разворачивания — например в той же HP OpenView нас ждёт облом, т.к. B.msi будет просто недоступна, в силу архитектуры самой системы. В результате на паре тысяч машин не запустится какое-то ПО. Если это Блокнот, то фиг с ним. А если это система обслуживания клиентов в банке у операторов?
Что бы такой фигни не происходило, нужно синхронизировать гуиды компонентов A и B. Тогда произойдёт следующее:
1. Система разворачивания устанавливает A.msi. В результате компонент A установился и зарегистрировался в системе, а библиотека X.dll стала в C:\Windows\System32.
2. Устанавливает B.msi. У компонента B тот же гуид что и у A. В результате у компонента A просто увеличился счетчик количества установок. Библиотека X.dll по прежнему в C:\Windows\System32.
3. Удаляет A.msi. В результате счетчик установок компонента A уменьшился на один. Сам компонент не удалился, библиотека X.dll на месте!
4. При запуске приложения, которое было поставлено B.msi, это приложение находит нашу X.dll и нормально стартует. Все довольны, все смеются.
msiexec.exe /a %путь_к_msi% /qn TARGETDIR=%куда_распаковывать%
то в папке
%куда_распаковывать%
мы получим структуру каталогов, которые могут повторять структуру каталогов в %ProgramFiles%\%папка_продукта%. A могут и не повторять — зависит от того что записано в таблице Directory в MSI файле. В результате, если программа имеет возможность запуститься как Portable — её можно запустить из папки%куда_распаковывать%
. Но для этого нужно что бы* программа могла запускаться как Portable
* MSI не должна содержать custom actions без которых программа не ставится и не работает потом нормально (т.к. во время админустановки они не выполняться)
* MSI должна быть правильно сделана — например такая MSI как у инсталлятора JAVA работать на будет, т.к. внутри там один большой архив который распаковывается с помощью custom action
Я так понимаю MSI инсталляция которая обсуждается в данном конкретном случае — работает после админ. установки.
Уважаемые товарищи разработчики!
Если Ваше приложение планируется (хотя бы в перспективе) разворачивать в корпоративных сетях — не пишите никаких своих инсталляторов! Не надо, пожалуйста, я от имени всех системных интеграторов Вас очень прошу! Выучите уже наконец обыкновенный стандартный MSI и его штатными средствами сделайте обыкновенную нормальную MSI-инсталляцию! Без хитрых custom actions, без навороченных обёрток со своими командными строками, без InstallShield внутри. Если сами не умеете — доверьте это дело профессионалам, которые занимаются развёртыванием продуктов в корпоративных сетях. Честное слово, они лучше знают как надо это делать!
Со всем уважением, искренне ваши, системные интеграторы.
Извините, за шесть лет накипело.
Спасибо, так намного лучше.
Извините, просто накипело.
(1) Прикрутить к Dalvik возможность по протоколу JDWP отзываться на вопросы вроде «Пауза! Какая инструкция выполнялась последней? Какое значение локально регистра v0?» Всё-таки исходники Dalvik открыты, можно поковыряться… Но времени нету, да и C++ программист из меня — как из говна пуля.
(2) Ещё была одна идея, которая заключалась в получении Smali кода (с помощью того же дизассемблера Smali), а потом патчинге этого самого кода так что бы его можно было потом отлаживать. Идея не очень изящная, такой себе мегакостыль…