Рекомендую хорошую статью о сравнении чисел с плавающей точкой.
В частности, там подробно разбираются некоторые тонкости при реализации относительного сравнения.
Я недавно столкнулся с задачей отослать почту с exe'ником, а у принимающей стороны резалось почти всё: архивы, архивы в архивах, архивы с паролем, неизвестный файлы и прочее…
Удалось обойти с помощью Word'а:
Есть замечательный OLE-объект «Пакет» (в about его зовут Microsoft Упаковщик объектов), в который я поместил свой исполняемый файл, и он наконец-то дошёл до места назначения.
Меня очень удивило, что с пакетом можно связать команду — идеальная вещь для распростронения троянов :)
Ещё есть GenGetopt, которая упрощает использование getopt_long. Мне она ещё понравилась тем, что при необходимости, для систем у которых в библиотеках нет такой функции (под Windows, например), позволяет добавить в генерируемый код реализацию getopt.
«Сто пленников заперты в комнате с тремя пиратами, один из которых утром пройдёт по доске (с борта в воду). У каждого пленника 10 бутылок вина, одна из которых отравлена; у каждого пирата 12 монет, одна из которых поддельная и весит больше или меньше, чем настоящая. В комнате есть переключатель, который пленник может оставить как есть или повернуть. Перед тем, как отвести пленников в комнаты, на них одевают красный или синий колпак; пленники видят колпаки всех остальных пленников, но не свой. Тем временем, шестизначное простое число обезьян умножают, пока их число не перевернётся, затем они все должны перебраться через реку на каное, в которую помещаются максимум две обезьяны. Но половина обезьян постоянно лжёт, а вторая половина всегда говорит правду. Зная, что N-й пленник знает, что одна из обезьян не знает, что пират не знает произведение двух чисел от 1 до 100, не зная перевернул ли N+1'ый пленик переключатель в своей комнате или не определив какая бутылка вина была отравлена и какого цвета его колпак, ответьте, какое решение у этой загадки.»
(как-то так)
Как показала практика использования par2 и дохлых болванок есть возможность восстановления, даже когда повреждены сами файлы восстановления.
К практике записи дисков порекомендую сразу задуматься о восстановлении и планировать процентов 10–15 под резервирование.
У меня есть готовый образ-шаблон с необходимыми программами: par2 (резервирование) и NSCopy (для собственно считывания файлов с пропуском битых секторов).
Для Си++ есть OpenSource фреймворк ACE, в котором реализован паттерн Active Object, который, по моему (я из него только объект Future использовал), делает то же самое.
Это демонстрационный рабочий пример, которым я хотел показать, что DSL и синтаксический/лексический разбор — это не страшно, быстро и, в некотором роде, удобно.
Этой статьёй я хотел привести несколько другой, чем стандартные калькуляторы, пример, показать как возникает из задачи возможность применить DSL, как увидеть грамматику, как воспользоваться flex/bison.
Программа получилась маленькая, с очень небольшим довеском обвязывающих алгоритмов. Она выполняет конкретную задачу, и, на мой взгляд, идеальный обучающий пример.
Зачем для такой мелкой задачи придумывать DSL со своим синтаксисом, если можно описать то же самое в рамках XML
Y–комбинатор больше концептуальная вещь, которая позволяет больше узнать о внутренних свойствах рекурсии. Например, для огранизации рекурсии, нет необходимости знать имени функции, поэтому приведён пример для анонимной (лямбда) функции. Можно управлять выполнением рекурсии, см. Ycache и Y, при этом, не меняя содержания функции (некий аналог MVC — такое же разбиение по ответственности).
Ещё один факт, который я забыл отметить: вторая форма фундаментально отличается тем, что в ней формально нет рекурсии, а в первой — она есть.
Вторая форма классическая, и является базой, на которой определяют примитивную рекурсию.
Здесь очень примерно происходит следующее:
Y(f)(x)=>(g(g))(x)=>[f(λ a: (k(k))(a))](x)=>
=>[f(λ a: (g(g)(g(g)))(a))](x)=>
=>[f(λ a: (f(λ a: (g(g)(g(g)))(a))))](x)
т.е. тоже получаем бесконечную развёртку. (В скобках мог и намудрить)
В частности, там подробно разбираются некоторые тонкости при реализации относительного сравнения.
Удалось обойти с помощью Word'а:
Есть замечательный OLE-объект «Пакет» (в about его зовут Microsoft Упаковщик объектов), в который я поместил свой исполняемый файл, и он наконец-то дошёл до места назначения.
Меня очень удивило, что с пакетом можно связать команду — идеальная вещь для распростронения троянов :)
Выполняют скрипт, в котором присваиваются значения переменным, а потом просто выбирают их значения.
(как-то так)
К практике записи дисков порекомендую сразу задуматься о восстановлении и планировать процентов 10–15 под резервирование.
У меня есть готовый образ-шаблон с необходимыми программами: par2 (резервирование) и NSCopy (для собственно считывания файлов с пропуском битых секторов).
Этой статьёй я хотел привести несколько другой, чем стандартные калькуляторы, пример, показать как возникает из задачи возможность применить DSL, как увидеть грамматику, как воспользоваться flex/bison.
Программа получилась маленькая, с очень небольшим довеском обвязывающих алгоритмов. Она выполняет конкретную задачу, и, на мой взгляд, идеальный обучающий пример.
Можно, но исторически сложилось именно так :)
Вторая форма классическая, и является базой, на которой определяют примитивную рекурсию.
Y(f)(x)=>(g(g))(x)=>[f(λ a: (k(k))(a))](x)=>
=>[f(λ a: (g(g)(g(g)))(a))](x)=>
=>[f(λ a: (f(λ a: (g(g)(g(g)))(a))))](x)
т.е. тоже получаем бесконечную развёртку.
(В скобках мог и намудрить)