Такое сравнение некорректно, вывод будет идентичен: шелл подставляет переменные окружения ещё до запуска команды, реально выполняться будут echo /usr/local/bin:… и sudo echo /usr/local/bin:…
Для корректного сравнения вторая команда должна быть, например, sudo bash -c 'echo $PATH' с одинарными кавычками.
Win2k и XP их использовали для пользовательских заметок о файлах, вкладка «Сводка» в explorer'овских свойствах файла. Потом убрали, потому что так их слишком легко убить: blogs.msdn.com/b/oldnewthing/archive/2012/05/01/10299322.aspx. BeOS не интересует возможность бэкапа, к примеру, на CD?
«Windows 7 64-бит»? Возможно, он хочет компилятор, способный генерировать 64-битные бинарники? В Express Edition такой просто отсутствует, а в других редакциях, возможно, по умолчанию не поставился. Тут — wiki.cython.org/64BitCythonExtensionsOnWindows — рекомендуют ставить SDK и указывать специальной переменной окружения, чтобы distutils использовал прописанные в PATH бинарники, а не лез в реестр за папками студии.
в нём есть встроенная поддержка проверки границ массивов для отладочной версии программы, которая отключается при компилировании оптимизированной версии
Что толку от проверки, которая включена только в отладочном режиме? Ошибки в безопасности, как правило, при нормальной работе не проявляются, нужно скормить программе специально подобранные данные. Злобные хакеры-то будут смотреть на конечный продукт, в котором компилятор заботливо отключил проверки.
он полностью совместим с кодом C/C++ на уровне объектных файлов, что позволяет получить прямой доступ к функциям и классам, написанным на C/C++ и наоборот
Даже сам C++ несовместим с кодом C++ на уровне объектных файлов. Нестандартизированного манглинга имён уже достаточно, чтобы объектные файлы от разных компиляторов были несовместимы, а уж когда появляются исключения — а они всегда появляются, мало кто использует new(nothrow) — то на переносимости можно смело ставить крест.
Есть утверждения, эквивалентные гипотезе Римана, но не задействующие ни комплексных чисел, ни бесконечных рядов. Простейшее в формулировке: сумма значений функции Мёбиуса по числам от 1 до N есть O(N^{1/2+epsilon}) для любого epsilon>0. Без ограничения общности epsilon можно считать рациональным и даже просто 1/2m, тогда утверждение эквивалентно (\sum_{n=1}^N \mu(n))^{2m} = O(N^{m+1}) для любого натурального m, тогда для формулировки даже не нужно уметь извлекать корни, только возведение в натуральноую степень.
Рантайм не следит за PEB, так что подмена PEB не заставляет кэш обновляться. Наблюдаемый эффект объясняется следующим образом: на момент первого вызова _wdupenv_s unicode-кэша просто нет, потому что до этого никакие unicode-функции работы с окружением не вызывались. Следовательно, первый вызов _wdupenv_s лезет в текущее окружение — в котором NewVar есть — кэширует его и возвращает информацию из текущего окружения. Следующий вызов возвращает кэшированную информацию, поэтому не видит, что PEB изменён.
Пример программы нетипичен. С одной стороны, используется функция main, а не wmain, так что компоновщик выбирает startup-код в ANSI-версии, который заполняет кэш _environ, но не _wenviron. С другой стороны, сама функция main вызывает w-функции. Если заменить main на wmain — дописать одну букву в коде, ага, — эффект исчезнет.
Та же статья упоминает ещё bat-ники, для которых нет понятия перекомпиляции, и конфиги — которые, например, могут адресовать иконки из системных DLL. Кроме того, в случае больших программ вместо «перед компиляцией правим две цифры в путях» вполне может оказаться «перекомпилируем под x64, программа перестаёт работать в том числе из-за этого, непонятные возникшие баги прослеживаем до модуля, который был написан уволившимся пять лет назад человеком, проклинаем Microsoft и отказываемся от поддержки x64».
P.S. Если что, я не защищаю и не обвиняю MS, я привожу ссылки на информацию. Но, по крайней мере, есть определённый смысл в этом безумии.
Плюс ещё время должно быть однородным. Обычно это подразумевается, но лучше уточнить. Если вероятности переходов зависят от номера шага, то легко построить контрпример, где вероятность остаться в игре убывает как угодно.
Ячейка жордановой нормальной формы из одного числа (x) после возведения в степень N становится равной (x^N); поскольку |x|<1, то это экспоненциальное убывание. Ячейка 2*2, то есть (x 1 // 0 x), после возведения в степень N становится равной (x^N Nx^{N-1} // 0 x^N), то есть опять же экспоненциальное убывание. Для больших размеров аналогично — когда матрица фиксирована, при возведении в растущую степень появляются вещи типа C N^k x^N, где C, k, x фиксированы и |x|<1, и при больших N это даёт экспоненциальное убывание.
В общем случае жордановых ячеек много, но они ведут себя независимо, давая в результате что-нибудь типа (x1^N 0 0 0 // 0 x2^N Nx2^{N-1} 0 // 0 0 x2^N 0 // 0 0 0 x3^N).
Замена базиса при приведении к нормальной форме просто перетасовывает эти убывающие элементы с фиксированными коэффициентами.
Число состояний игры заведомо конечно, пусть оно n. Из каждого состояния с какими-то вероятностями можно завершить игру и перейти в другие состояния. Вероятности перехода сведём в матрицу M размера n*n. Рассмотрим для каждого N вектор из n чисел, i-е из которых есть вероятность того, что игра за N ходов не закончилась и находится в состоянии i. Делаем очередной ход, пусть игра не закончилась. Вероятность оказаться после этого хода в фиксированном состоянии рассчитывается по формуле полной вероятности как сумма произведений. На языке матриц это соответствует умножению вектора на M. Таким образом, после N шагов рассматриваемый вектор есть просто N-я степень матрицы M, умноженная на начальное состояние.
Рассмотрим матрицу, транспонированную к M. Сумма в i-й строке в этой матрице есть вероятность перехода из состояния i куда-нибудь; это заведомо число от 0 до 1, причём строго меньшее 1, если из состояния можно закончить игру. Легко видеть, что собственные значения у такой матрицы обязаны быть по модулю нестрого меньше единицы, причём собственное значение, равное по модулю единице, возможно только в случае наличия группы состояний, из которой нет выхода. При наличии оговорки «если удачные перестановки вообще существуют» — которая представляется выполненной — все собственные значения матрицы, транспонированной к M, по модулю строго меньше 1. Соответственно, собственные значения M тоже по модулю строго меньше 1.
Меняя базис, приводим M к нормальной форме; тогда на главной диагонали стоят числа, по модулю меньшие единицы. Возможно, на единицу вправо есть ещё что-то ненулевое, но оно не оказывает влияния на происходящее. Все остальные элементы равны нулю. При возведении в степень N все элементы матрицы экспоненциально убывают по N, так что и итоговый вектор, будучи их фиксированной линейной комбинацией, тоже экспоненциально убывает по N.
Во-первых, 36! / (4! ^ 9) ~ 1.4e29. Во-вторых, это только число вариантов для начального расклада, а там дальше ещё вносится случайность «Важно чтобы карты со стола… при этом также перетасовывались (чтобы исключить возможность циклов)», так что перебор существенно больше. Между прочим, похоже, что возможна сколь угодно длинная партия — если всё время будет случаться неудачная перетасовка — но вероятность партии длины >=N экспоненциально убывает по N — если удачные перестановки вообще существуют, — так что матожидание числа ходов конечно.
Очевидно, имеется в виду Windows Research Kernel aka WRK — несколько урезанные исходники ядра, без HAL и драйверов. Но с ними просто так не ознакомиться — нужно убедить Microsoft, что это нужно, чтобы студентов учить принципам, лежащим в основе ОС.
Для корректного сравнения вторая команда должна быть, например, sudo bash -c 'echo $PATH' с одинарными кавычками.
Что толку от проверки, которая включена только в отладочном режиме? Ошибки в безопасности, как правило, при нормальной работе не проявляются, нужно скормить программе специально подобранные данные. Злобные хакеры-то будут смотреть на конечный продукт, в котором компилятор заботливо отключил проверки.
Даже сам C++ несовместим с кодом C++ на уровне объектных файлов. Нестандартизированного манглинга имён уже достаточно, чтобы объектные файлы от разных компиляторов были несовместимы, а уж когда появляются исключения — а они всегда появляются, мало кто использует new(nothrow) — то на переносимости можно смело ставить крест.
Рядом лежат несколько утилит для работы с ELF: http://www.muppetlabs.com/~breadbox/software/elfkickers.html.
Пример программы нетипичен. С одной стороны, используется функция main, а не wmain, так что компоновщик выбирает startup-код в ANSI-версии, который заполняет кэш _environ, но не _wenviron. С другой стороны, сама функция main вызывает w-функции. Если заменить main на wmain — дописать одну букву в коде, ага, — эффект исчезнет.
P.S. Если что, я не защищаю и не обвиняю MS, я привожу ссылки на информацию. Но, по крайней мере, есть определённый смысл в этом безумии.
Либо да, либо существует ненулевая вероятность бесконечно долгой игры.
В общем случае жордановых ячеек много, но они ведут себя независимо, давая в результате что-нибудь типа (x1^N 0 0 0 // 0 x2^N Nx2^{N-1} 0 // 0 0 x2^N 0 // 0 0 0 x3^N).
Замена базиса при приведении к нормальной форме просто перетасовывает эти убывающие элементы с фиксированными коэффициентами.
Число состояний игры заведомо конечно, пусть оно n. Из каждого состояния с какими-то вероятностями можно завершить игру и перейти в другие состояния. Вероятности перехода сведём в матрицу M размера n*n. Рассмотрим для каждого N вектор из n чисел, i-е из которых есть вероятность того, что игра за N ходов не закончилась и находится в состоянии i. Делаем очередной ход, пусть игра не закончилась. Вероятность оказаться после этого хода в фиксированном состоянии рассчитывается по формуле полной вероятности как сумма произведений. На языке матриц это соответствует умножению вектора на M. Таким образом, после N шагов рассматриваемый вектор есть просто N-я степень матрицы M, умноженная на начальное состояние.
Рассмотрим матрицу, транспонированную к M. Сумма в i-й строке в этой матрице есть вероятность перехода из состояния i куда-нибудь; это заведомо число от 0 до 1, причём строго меньшее 1, если из состояния можно закончить игру. Легко видеть, что собственные значения у такой матрицы обязаны быть по модулю нестрого меньше единицы, причём собственное значение, равное по модулю единице, возможно только в случае наличия группы состояний, из которой нет выхода. При наличии оговорки «если удачные перестановки вообще существуют» — которая представляется выполненной — все собственные значения матрицы, транспонированной к M, по модулю строго меньше 1. Соответственно, собственные значения M тоже по модулю строго меньше 1.
Меняя базис, приводим M к нормальной форме; тогда на главной диагонали стоят числа, по модулю меньшие единицы. Возможно, на единицу вправо есть ещё что-то ненулевое, но оно не оказывает влияния на происходящее. Все остальные элементы равны нулю. При возведении в степень N все элементы матрицы экспоненциально убывают по N, так что и итоговый вектор, будучи их фиксированной линейной комбинацией, тоже экспоненциально убывает по N.