Какая-то сквозит безграничная уверенность в просто заоблачных скоростях магического Си :)
Может погоняемся?
У меня вот есть задачка простенькая, минут на 10-20 делов — посчитать частоты слов в текстовом файле (утф-8) и вывести 100 самых частых слов.
Я пишу на Питоне и Java, а вы на Си. Погладим на сколько ваша феррари будет быстрее, если поедет конечно :)
Python значительно более выразительный и логически выдержанный язык нежели PHP.
И в нём постарались избежать явно выраженных проблем с производительностью.
К примеру в Питоне различаются по внутреннему устройству, например,
tuple: (1,2,3,4,) и list: [1,2,3,4,] — первый immutable и поэтому иногда более эффективен.
В Питоне более эффективней, чем в ПХП реализован hash. Так как в ПХП хочешь не хочешь поддерживается последовательность ключей, а в Питоне есть варианты.
Еще одна интересная особенность — это генераторы, советую почитать про них, если действительно интересно могу найти ссылку на pdf. Только читать надо не поверхностно, а разбирать примеры. Иначе не понятно в чём прикол.
Простые примерчики:
[ (a,a*a) for a in (1,2,3,4) if a != 2 ]
результат [(1, 1), (3, 9), (4, 16)]
смысл в том, что конструктор списка выполняется в Си коде, в отличие от
общепринятого интерпретируемого for a in (1,2,3,4) {… }
Это тоже, что выше. НО! Генератор i хранит в себе стейт и начинает выполняться _только_ при первом next().
такого рода вещи позволяют записывать алгоритмы очень компактно и эффективно.
Каким опытом обучения, кроме личного, подкреплена «постоянная фраза» насчет обучения на Си?
По моему опыту как раз начавших с Си очень сложно потом сдвинуть с битов и указателей на что-либо более концептуальное. Тут был упомянут Си++, расскажите а на каком уровне Вы владете STL? А как Вы относитесь к таким вещам у обучении, как блоксхемы?
Если рассматривать идеальную ситуацию с идеальными дизайнерами и верстальшиками готовыми всё заново переделать «чтоб было кошерно», то это всё хорошо и правильно.
Но в реалиях всё далеко не всегда так здорово. В случае с бордером «сделайте мне вот эту табличку повиднее» говорит вовсе не дизайнер, а заказчик. Дизайнер в это время может вообще уже заниматься другими делами. Еще тот же заказчик может попросить дополнительно покрасить определенные ячейки разных таблиц в разные цвета.
И здесь получается выбор — либо звать дизайнера, чтобы он переписал все классы этих таблиц и везде добавил по три варианта цветов, а потом программеры воткнули бы эти новые классы в логику.
Либо просто сделать monkey patch и добавить в логике доп.классы bgclr1,bgclr2,bgclr3
к нужным div/td/… длолго не парясь.
Про прототипирование, когда вообще дизайнер может привлекаться по минимуму я и не говорю.
Всё началось с чего? С того что я написал вопрос — «кому должен?».
Это повод задуматься о том, что абстрактная чистота кода сама по себе мало кому интересна в реальной жизни. Но интересен результат, желательно быстрый и недорогой.
Я реально понимаю, что таким способом очень во многих случаях можно получать быстрый и пригодный результат. Еще я понимаю, что композиция классов действительно отличается от прямого перечисления атрибутов. А Вы?
Пример, кстати, может быть не такой тривиальный и вовсе не с прямым соответствием параметров.
Если искать аналогии в компьютерной науке, то это скорее будет называться как-то вроде «множественное наследование при помощи агрегирования».
В том сообщении, на которое я отвечал написано:
«Вот обьясните чем лучше это class=«clear-both» чем style=«clear:both».»
Я пояснил, чем лучше.
Другими словами тем, что в классах можно как раз семантически отобразить и сгруппировать некоторые стилевые особенности, как указано выше.
Алгоритм реализован в каждом браузере, Гугль так же поступает с большим количеством картинок.
В нужном месте задаётся блок заданного размера, потом в него подставляется бэкграунд со смещением. Смещение в данном случае вычисляется за две арифметических операции.
Не то чтобы очень знатная, но просто в один прекрасный момент уже не хочется разбираться «как там нынче делается этот initrd...». Прелесть Gentoo как раз и заключается в том, что можно с одной стороны не вдаваться во все тонкости сборки различных пакетов с кучей параметров configure, но с другой стороны всегда иметь возможность прописать нужные USE.
Стоит заметить, что Gentoo это не Слакварь, и ядро пересобирать лучше при помощи genkernel.
Я сам долгое время по старинке пользовал make menuconfig и всё прочее,
но не то initrd не то еще какая причина в своё время побудила меня почитать man genkernel и less /etc/genkernel.conf
Тут вопрос даже не в идеальности сисадмина.
Но если вдруг в процессе эксплуатации возникают вопросы насчёт макропрограммирования клавиатуры, то это явно повод задуматься насчёт организации процесса в целом.
И копать надо вовсе не в сторону офигенно мощной переключалки монитор/клава/мышь :)
В какой-то момент после включения питания загружающийся комп запускает PXE,
дальше оно ломится по сети опрашивая dhcp серверы и выбирает наиболее понравившийся.
dhcp сервер в этот момент уже знает MAC адрес машины и еще некоторую информацию про неё, которую сообщает PXE.
На этом этапе dhcp уже может выбрать нужный вариант загрузочного имиджа и указать на него.
Потом PXE грузит указанный имидж и передаёт ему управление.
Если мы имеем дело с линуксовым имиджем, то на нём уже присутствует некий стартовый скрипт, который может, например, почекать диск, опросить кого-надо на предмет чего делать дальше, запустить fdisk,mkfs,cpio или просто выставить какой-нибудь рутовый пароль и запустить sshd.
Каждый из описанных этапов может сильно различаться, но в целом описанное очень похоже на правду. Тем более, что примерно такая схема у меня вполне нормально работала.
Есть такая интересная штука — загрузка по сети, не слыхали?
Можно сделать загрузочный имидж, прописать там разные конфиги для разных ип/мак-адресов и вообще не трогать клавиатуру.
Если уж очень надо, то можно сделать загрузочный имидж с sshd.
Вот мне чуждо разрабатывать что-либо на PHP, однако я стараюсь не делать из своих предпочтений далеко идущих глобальных выводов :)
Может погоняемся?
У меня вот есть задачка простенькая, минут на 10-20 делов — посчитать частоты слов в текстовом файле (утф-8) и вывести 100 самых частых слов.
Я пишу на Питоне и Java, а вы на Си. Погладим на сколько ваша феррари будет быстрее, если поедет конечно :)
И в нём постарались избежать явно выраженных проблем с производительностью.
К примеру в Питоне различаются по внутреннему устройству, например,
tuple: (1,2,3,4,) и list: [1,2,3,4,] — первый immutable и поэтому иногда более эффективен.
В Питоне более эффективней, чем в ПХП реализован hash. Так как в ПХП хочешь не хочешь поддерживается последовательность ключей, а в Питоне есть варианты.
Еще одна интересная особенность — это генераторы, советую почитать про них, если действительно интересно могу найти ссылку на pdf. Только читать надо не поверхностно, а разбирать примеры. Иначе не понятно в чём прикол.
Простые примерчики:
[ (a,a*a) for a in (1,2,3,4) if a != 2 ]
результат [(1, 1), (3, 9), (4, 16)]
смысл в том, что конструктор списка выполняется в Си коде, в отличие от
общепринятого интерпретируемого for a in (1,2,3,4) {… }
а вот еще интересный момент (генератор)
i = ( (a,a*a) for a in (1,2,3,4) if a != 2 )
>>> i.next()
(1, 1)
>>> i.next()
(3, 9)
>>> i.next()
(4, 16)
>>>
Это тоже, что выше. НО! Генератор i хранит в себе стейт и начинает выполняться _только_ при первом next().
такого рода вещи позволяют записывать алгоритмы очень компактно и эффективно.
С реалиями они никак не соотносятся.
Очень удобно бывает использовать гибкость Питона совместно с числодробилками.
numpy.scipy.org/
numpy.scipy.org/numpydoc/numdoc.htm
www.scipy.org/
возможно тогда байндинги на NVIDIA не покажутся такими забавными.
По моему опыту как раз начавших с Си очень сложно потом сдвинуть с битов и указателей на что-либо более концептуальное. Тут был упомянут Си++, расскажите а на каком уровне Вы владете STL? А как Вы относитесь к таким вещам у обучении, как блоксхемы?
Но в реалиях всё далеко не всегда так здорово. В случае с бордером «сделайте мне вот эту табличку повиднее» говорит вовсе не дизайнер, а заказчик. Дизайнер в это время может вообще уже заниматься другими делами. Еще тот же заказчик может попросить дополнительно покрасить определенные ячейки разных таблиц в разные цвета.
И здесь получается выбор — либо звать дизайнера, чтобы он переписал все классы этих таблиц и везде добавил по три варианта цветов, а потом программеры воткнули бы эти новые классы в логику.
Либо просто сделать monkey patch и добавить в логике доп.классы bgclr1,bgclr2,bgclr3
к нужным div/td/… длолго не парясь.
Про прототипирование, когда вообще дизайнер может привлекаться по минимуму я и не говорю.
Всё началось с чего? С того что я написал вопрос — «кому должен?».
Это повод задуматься о том, что абстрактная чистота кода сама по себе мало кому интересна в реальной жизни. Но интересен результат, желательно быстрый и недорогой.
Пример, кстати, может быть не такой тривиальный и вовсе не с прямым соответствием параметров.
Если искать аналогии в компьютерной науке, то это скорее будет называться как-то вроде «множественное наследование при помощи агрегирования».
«Вот обьясните чем лучше это class=«clear-both» чем style=«clear:both».»
Я пояснил, чем лучше.
Другими словами тем, что в классах можно как раз семантически отобразить и сгруппировать некоторые стилевые особенности, как указано выше.
В нужном месте задаётся блок заданного размера, потом в него подставляется бэкграунд со смещением. Смещение в данном случае вычисляется за две арифметических операции.
table class=«amar w80 brd1»
с
table style=«margin-left: auto; margin-right: auto; width: 80%; border: 1px solid #ccc;»
Я вполне нормально вписываю два-три вспомогательных класса и всё.
Какие-то доли процента производительности здесь погоды не делают.
Gentoo на настоящий момент один из лучших и наиболее обновляемых дистрибутов.
Я сам долгое время по старинке пользовал make menuconfig и всё прочее,
но не то initrd не то еще какая причина в своё время побудила меня почитать man genkernel и less /etc/genkernel.conf
Но если вдруг в процессе эксплуатации возникают вопросы насчёт макропрограммирования клавиатуры, то это явно повод задуматься насчёт организации процесса в целом.
И копать надо вовсе не в сторону офигенно мощной переключалки монитор/клава/мышь :)
Рассмотрим бездисковую загрузку без наворотов:
В какой-то момент после включения питания загружающийся комп запускает PXE,
дальше оно ломится по сети опрашивая dhcp серверы и выбирает наиболее понравившийся.
dhcp сервер в этот момент уже знает MAC адрес машины и еще некоторую информацию про неё, которую сообщает PXE.
На этом этапе dhcp уже может выбрать нужный вариант загрузочного имиджа и указать на него.
Потом PXE грузит указанный имидж и передаёт ему управление.
Если мы имеем дело с линуксовым имиджем, то на нём уже присутствует некий стартовый скрипт, который может, например, почекать диск, опросить кого-надо на предмет чего делать дальше, запустить fdisk,mkfs,cpio или просто выставить какой-нибудь рутовый пароль и запустить sshd.
Каждый из описанных этапов может сильно различаться, но в целом описанное очень похоже на правду. Тем более, что примерно такая схема у меня вполне нормально работала.
Можно сделать загрузочный имидж, прописать там разные конфиги для разных ип/мак-адресов и вообще не трогать клавиатуру.
Если уж очень надо, то можно сделать загрузочный имидж с sshd.