Хендмейд, говорите? )
Мне это напомнило о том авторе, который писал здесь цикл статей про изготовление микросхем в домашних условиях (не помню, к сожалению, его ник). Вот у него дома наверное как-то также все оборудовано )
На рабочем компе Windows 7 x64 — и вот я, как дурак, запускал виртуалку каждый раз, когда нужно было что-то сосканировать, а другого сканера рядом не было.
Вот, в обзоре появилась HostCMS, спасибо )
Но неплохо бы еще указать, что у нее есть два демо-сайта:
один официальный, но без права редактирования demo.hostcms.ru/ логин и пароль demo
а второй неофициальный, с правами на редактирование, но живущий всего полчаса, форма создания здесь www.hostcmsblog.ru/demosites/
логин и пароль на создаваемые сайты — demo1
Google/Yandex/Bing не выдают одинаковые результаты кандидатам на вакансию и людям проводящим собеседование
Да-да, во всех крупных поисковиках сидят специально обученные люди, которые пишут алгоритмы, определяющие к какой категории относится автор поискового запроса и выдающие в зависимости от этого разные результаты! :-)
Ну вообще-то еще есть такая штука как Google Minify — она объединяет и минифицирует и сжимает в gzip файлы «налету» при первом обращении к ним, и кеширует сжатый итоговый файл на диск и в дальнейшем отдает только его, пока какой-либо из исходных файлов не изменится.
В итоге вы работаете с отдельными неминифицированными и несжатыми файлами, а в браузер отдается один объединенный файл, минифицированный и сжатый.
У Google Minify есть плагины под некоторые распространенные CMS — например WordPress, Zend Framework, Yii, HostCMS, с остальными системами Minify можно использовать в чистом виде, с помощью входящего в комплект билдера
К активному? Какое же тут извлечение энергии, если выпрямитель активный? Имхо, КПД динамика в этом случае окажется значительно ниже мощности, потребляемой самим выпрямителем.
Был бы хорошо ввести какую-то разумную фильтрацию на возможные сочетания штекеров на разных концах кабеля.
Например, мне удалось с помощью плагина запросить кабель вида DVI-D — Миниджек 3,5. Автомагии, правда, не получилось, что соверешенно логично, но все же посоветовали обратиться к менеджерам :)
Было бы резонно, если бы после выбора, например, DVI-штекера на одном из концов кабеля, из вариантов для второго конца кабеля исчезли бы всякие расово неверные разъемы, типа джеков или BNC.
Если _действительно_ требуется целый миллион итераций в XSLT, то вероятнее всего имеет место быть некая серьезная ошибка в постороении системы.
Потому что в таком случае действительно единственно верный способ — это учесть такую потребность еще на этапе формирования документа. Тут я с вами совершенно согласен.
Рекурсия это более распростаненный метод организации цикла со счетчиком в XSLT.
Однако он же и более ресурсоемкий.
Метод Пиза позволяет избавиться от рекурсии и тем самым оптимизировать выполнение шаблона. При этом, надо учитывать, что в реальных задачах можно в качестве содержимого переменной $set использовать не набор узлов обрабатываемого XML-документа, а набор узлов самого шаблона, записав переменную как
, и тогда наш цикл не будет зависеть от обрабатываемого документа.
(В данной, чисто условной задаче, это к сожалению, невозможно, из-за малого числа узлов в XSL-шаблоне цикл доходит только до 36. Но тут можно вспомнить о том, что каждый комментарий в шаблоне тоже считается узлом. Поэтому можно написать комментариев к каждой строке, и добить всеь шаблон пустыми комментариями в конце, чтобы цикл дошел до ста, пример ниже)
Ну и если уж совсем удариться в оптимизацию, то имеет смысл вынести деление в отдельные переменные и оптимизировать первое условие, проверяя в нем сначала делимость на 5 а потом только делимость на 3.
Тогда получится следующее:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<!--Программа FizzBuzz-->
<xsl:template match="/">
<!--Выберем все узлы текущего документа-->
<xsl:variable name="set" select="document('')//node()"/>
<!--Создадим цикл со счетчиком-->
<xsl:for-each select="$set[position() <= 100]">
<!--Вычислим значение остатка от деления текущего числа на 5-->
<xsl:variable name="mod5" select="position() mod 5"/>
<!--Вычислим значение остатка от деления текущего числа на 3-->
<xsl:variable name="mod3" select="position() mod 3"/>
<!--Проверим выполение условий задачи-->
<xsl:choose>
<!--Если число кратно и пяти и трем то выведем "FizzBuzz"-->
<xsl:when test="$mod5 = 0 and $mod3 = 0">FizzBuzz</xsl:when>
<!--Если число кратно трем то выведем "Buzz"-->
<xsl:when test="$mod3 = 0">Buzz</xsl:when>
<!--Если число кратно пяти то выведем "Fizz"-->
<xsl:when test="$mod5 = 0">Fizz</xsl:when>
<!--Во всех остальных случаях выведем само число-->
<xsl:otherwise>
<xsl:value-of select="position()"/>
</xsl:otherwise>
</xsl:choose>
<!--Выведем пробел-->
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
<!-- -->
</xsl:stylesheet>
Да, это извращение чистой воды, но… на профайлере ваш способ выполняется примерно 0,0184 с, а мой — 0,0104 с. При этом глубина стека в вашем варианте составляет 301, а в моем — 4.
По-моему это профит, однозначно! :)
Ну то есть я понимаю что именно в данной задаче подобная оптимизация не имеет никакого практического смысла, но мои рассуждения вообще-то к тому, что не стоит всегда пользоваться только стандартными походами. В одном из проектов учет подобных нюансов серёзно облегчил жизнь серверу, а в конечном итоге и мне :-)
Мне это напомнило о том авторе, который писал здесь цикл статей про изготовление микросхем в домашних условиях (не помню, к сожалению, его ник). Вот у него дома наверное как-то также все оборудовано )
VueScan вам в помощь.
Но неплохо бы еще указать, что у нее есть два демо-сайта:
один официальный, но без права редактирования demo.hostcms.ru/ логин и пароль demo
а второй неофициальный, с правами на редактирование, но живущий всего полчаса, форма создания здесь www.hostcmsblog.ru/demosites/
логин и пароль на создаваемые сайты — demo1
Да, совершенно верно, новая ревизия уже с радиатором.
Да-да, во всех крупных поисковиках сидят специально обученные люди, которые пишут алгоритмы, определяющие к какой категории относится автор поискового запроса и выдающие в зависимости от этого разные результаты! :-)
Таки спасибо вам, вы обогатили мою речь новым расово верным словом! :-)
Долго думал :)
В итоге вы работаете с отдельными неминифицированными и несжатыми файлами, а в браузер отдается один объединенный файл, минифицированный и сжатый.
У Google Minify есть плагины под некоторые распространенные CMS — например WordPress, Zend Framework, Yii, HostCMS, с остальными системами Minify можно использовать в чистом виде, с помощью входящего в комплект билдера
Например, мне удалось с помощью плагина запросить кабель вида DVI-D — Миниджек 3,5. Автомагии, правда, не получилось, что соверешенно логично, но все же посоветовали обратиться к менеджерам :)
Было бы резонно, если бы после выбора, например, DVI-штекера на одном из концов кабеля, из вариантов для второго конца кабеля исчезли бы всякие расово неверные разъемы, типа джеков или BNC.
Потому что в таком случае действительно единственно верный способ — это учесть такую потребность еще на этапе формирования документа. Тут я с вами совершенно согласен.
Однако он же и более ресурсоемкий.
Метод Пиза позволяет избавиться от рекурсии и тем самым оптимизировать выполнение шаблона. При этом, надо учитывать, что в реальных задачах можно в качестве содержимого переменной $set использовать не набор узлов обрабатываемого XML-документа, а набор узлов самого шаблона, записав переменную как , и тогда наш цикл не будет зависеть от обрабатываемого документа.
(В данной, чисто условной задаче, это к сожалению, невозможно, из-за малого числа узлов в XSL-шаблоне цикл доходит только до 36. Но тут можно вспомнить о том, что каждый комментарий в шаблоне тоже считается узлом. Поэтому можно написать комментариев к каждой строке, и добить всеь шаблон пустыми комментариями в конце, чтобы цикл дошел до ста, пример ниже)
Ну и если уж совсем удариться в оптимизацию, то имеет смысл вынести деление в отдельные переменные и оптимизировать первое условие, проверяя в нем сначала делимость на 5 а потом только делимость на 3.
Тогда получится следующее:
Да, это извращение чистой воды, но… на профайлере ваш способ выполняется примерно 0,0184 с, а мой — 0,0104 с. При этом глубина стека в вашем варианте составляет 301, а в моем — 4.
По-моему это профит, однозначно! :)
Ну то есть я понимаю что именно в данной задаче подобная оптимизация не имеет никакого практического смысла, но мои рассуждения вообще-то к тому, что не стоит всегда пользоваться только стандартными походами. В одном из проектов учет подобных нюансов серёзно облегчил жизнь серверу, а в конечном итоге и мне :-)
Для краткости кода использован метод Пиза, поэтому число узлов в обрабатываемом xml должно быть не менее ста.