Comments 26
Конечно автор — царь и Бог, но под катом хотелось бы увидеть, что-нибудь более специфичное для Unix. За статью, спасибо.
Не хотелось опускаться на уровень конкретных примеров. Но в будущих статьях обязательно что-нибудь придумаю
конкретные примеры скорее будут мешать. хоть и говорится о принципах программирования под Unix, но я думаю и для других они тоже будут полезны. А примеры для Unix могут сбить с толку.
Конкретно про юникс: как и в случае с модульностью, с простотой в юниксах — полный швах, хотя сам принцип и имеет право на жизнь.
Лучший пример принципа «Зачем нам дизайн, если можно сделать ОВЕРдизайн» — это знаменитый x.org
Я не разбираюсь в X настолько глубоко, как Julien Danjou, но для того, чтобы понять насколько там все печально достаточно подумать о том, когда Вы в последний раз использовали сетевые возможности X вместо, скажем, vnc? Кроме того, что эти сетевые возможности практически нигде не используются, они открывают забавный вектор атаки (подозреваю, что в переусложненном коде 80-х годов, который никто уже не понимает есть некоторое количество ошибок) — одной из которых долгое время являлась возможность снятия keylog-а с удаленной системы, не имея даже аккаунта на ней. С появлением xauth осталась только возможность делать keylog ЛЮБОЙ активности на десктопе (в том числе gksudo, терминала и вообще всех рутовых процессов) из-под непривилегированного пользователя.
Чтобы обойти высокую латентность и низкую пропускную способность сетевых протоколов, в конце концов появляются расширения типа MIT-SHM, которые полностью отказываются от сетевых возможностей во имя производительности, при этом все еще оставляя видимость, что все таки происходит по сети. Этого оказывается мало и появляется DRI/DRM, имеющий полный доступ к аппаратуре и физической памяти, но «для галочки» работающий как user-mode процесс.
Да и сама юзермодовость X сервера — не более, чем «потемкинская деревня» для демонстрации как все хорошо. Если углубиться в детали, оказывается что он работает от root-а, что в сочетании с довольно дурацкой юникс-безопасностью автоматически означает то же, что и kernel-mode модуль — то есть полное и ничем неограниченное доверие (даже если кому то захочется ограничить x сервер с помощью какого нибудь LSM, о которых отдельный разговор, то придется оставить R/W доступ на /dev/mem, что опять таки означает полный и ничем не ограниченный доступ к системе).
Был ли выучен урок? не думаю (зато аудиостек нативно поддерживает стриминг по сети, кроме случаев, когда он вообще не работает).
xkcd 619 появилось не на пустом месте, да
Лучший пример принципа «Зачем нам дизайн, если можно сделать ОВЕРдизайн» — это знаменитый x.org
Я не разбираюсь в X настолько глубоко, как Julien Danjou, но для того, чтобы понять насколько там все печально достаточно подумать о том, когда Вы в последний раз использовали сетевые возможности X вместо, скажем, vnc? Кроме того, что эти сетевые возможности практически нигде не используются, они открывают забавный вектор атаки (подозреваю, что в переусложненном коде 80-х годов, который никто уже не понимает есть некоторое количество ошибок) — одной из которых долгое время являлась возможность снятия keylog-а с удаленной системы, не имея даже аккаунта на ней. С появлением xauth осталась только возможность делать keylog ЛЮБОЙ активности на десктопе (в том числе gksudo, терминала и вообще всех рутовых процессов) из-под непривилегированного пользователя.
Чтобы обойти высокую латентность и низкую пропускную способность сетевых протоколов, в конце концов появляются расширения типа MIT-SHM, которые полностью отказываются от сетевых возможностей во имя производительности, при этом все еще оставляя видимость, что все таки происходит по сети. Этого оказывается мало и появляется DRI/DRM, имеющий полный доступ к аппаратуре и физической памяти, но «для галочки» работающий как user-mode процесс.
Да и сама юзермодовость X сервера — не более, чем «потемкинская деревня» для демонстрации как все хорошо. Если углубиться в детали, оказывается что он работает от root-а, что в сочетании с довольно дурацкой юникс-безопасностью автоматически означает то же, что и kernel-mode модуль — то есть полное и ничем неограниченное доверие (даже если кому то захочется ограничить x сервер с помощью какого нибудь LSM, о которых отдельный разговор, то придется оставить R/W доступ на /dev/mem, что опять таки означает полный и ничем не ограниченный доступ к системе).
Был ли выучен урок? не думаю (зато аудиостек нативно поддерживает стриминг по сети, кроме случаев, когда он вообще не работает).
xkcd 619 появилось не на пустом месте, да
UFO just landed and posted this here
почему все ругаются на сетевую составляющую иксов
Потому что она плохо себя зарекомендовала для сетевого доступа (все пользуются компрессированными vnc/rdp), и создает кучу проблем для локального доступа (уже упоминавшиеся здесь MIT-SHM и DRI как раз ОБХОДЯТ сетевую составляющую иксов, чтоб выжать производительности). Более того, давно и успешно разрабатываются всякие библиотеки, типа нотификаторов в трее, которые используют чисто локальные штуки типа d-bus. Вот и получится, что x-сервер у Вас будет на одном компьютере, а трей — будет отображаться (если будет) локально на машине с клиентом. В общем овердизайн в чистом виде.
Сетевая составляющая pulseaudio — очень хорошая фишкаНе совсем. Это наружение слоистоисти же. Слой который отвечает за вывод и микширование звука не должен знать, как к нему этот самый звук приходит. А TCP/UDP стриминг PCM звука — не совсем то, что нужно подавляющему большинству пользователей.
Потому что она плохо себя зарекомендовала для сетевого доступа (все пользуются компрессированными vnc/rdp), и создает кучу проблем для локального доступа (уже упоминавшиеся здесь MIT-SHM и DRI как раз ОБХОДЯТ сетевую составляющую иксов, чтоб выжать производительности). Более того, давно и успешно разрабатываются всякие библиотеки, типа нотификаторов в трее, которые используют чисто локальные штуки типа d-bus. Вот и получится, что x-сервер у Вас будет на одном компьютере, а трей — будет отображаться (если будет) локально на машине с клиентом. В общем овердизайн в чистом виде.
Сетевая составляющая pulseaudio — очень хорошая фишкаНе совсем. Это наружение слоистоисти же. Слой который отвечает за вывод и микширование звука не должен знать, как к нему этот самый звук приходит. А TCP/UDP стриминг PCM звука — не совсем то, что нужно подавляющему большинству пользователей.
Специфичного хватает в оригинальной книге. Лучше что-нибудь не специфичное и не UNIX-овое. Должно же быть отличие?
UFO just landed and posted this here
В загловке используется UNIX, потому что именно так называется оригинальная книга Реймонда, откуда все эти статьи почти полностью и беруться. Книжка конечно хорошая, но в своем роде беллетристика, мне она пользы много не принесла.
Ну, виндузятники, которые не читают статью только потому, что в заголовке есть слово UNIX — сами себе злобные бакланы. Хотя пока в этом цикле статей я не увидел ничего про UNIX. Да и вещи банальные.
А примеры на Схеме отсекают s-exp'офобов от SICP. ССЗБ.
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Оффтоп: А у вас нет такой же бритвочки, но в PNG с прозрачностью? :)
А вы остальные 8 статей напишете в таком же стиле? Или они будут более информативные и на тему юникса?
Если честно, это имеет прямейшее отношение к UNIX, поэтому даже примеров нет :)). Да и нафиг Вам описание того, чем read() отличается от pread() и про то, чем отличается поддержка Linux'ом спецификации SUS 3 от таковой во FreeBSD и Solaris :)? Это всё достаточно просто изучается с помощью man'ов, и уж точно вряд ли кого-то заинтересует на хабре…
Вкратце содержание статьи: Исскуство погромированния на ЮНИКС для тех, кто не умеет читать по английски.
А для тех кто умеет catb.org/esr/writings/taoup/html/
А для тех кто умеет catb.org/esr/writings/taoup/html/
К Юниксу статья отношения не имеет.
Она для всех в тему, включая Web, Windows, Unix, embedded и всякие Баду.
Она для всех в тему, включая Web, Windows, Unix, embedded и всякие Баду.
Хочу отметить — правила изложенные в статье — есть правила функционального программирования.
Скажем так — начальный уровень.
Скажем так — начальный уровень.
мне показалось, что упоминание Оккама/П.Д.О. было бы уместнее в предыдущей статье — про модульность. здесь же он ясности не добавил). в программировании нередко приходится добавлять обозначения для того, чтобы повысить ясность. сравните:
и
первый пример несомненно короче. но где больше ясность?
Кроме того:
print 1 * 3
и
price_of_apples = 1
number_of_apples = 3
print price_of_apples * number_of_apples
первый пример несомненно короче. но где больше ясность?
Кроме того:
Последующее развитие логики показало, однако, что отнесение Принципа Достаточного Основания к числу логических законов лишено /достаточных/ оснований.wiki: Принцип достаточного основания) иными словами, бритва Оккама не нужна))
Ну если весь ваш пример и есть вся программа — то первый пример лучше намного :)
А вообще очень напоминает metaleks.net/programming/the-evolution-of-a-python-programmer
А вообще очень напоминает metaleks.net/programming/the-evolution-of-a-python-programmer
А чем лучше? Мы не будем говорить про вычисления на калькуляторе, где «программа» живет лишь до получения первого результата. Давайте рассмотрим более привычную для разработчиков ситуацию ситуацию, когда программа должна использоваться и поддерживаться в течении продолжительного времени. Как это часто бывает, проходит полгода, и цены на яблоки вырастают на на 1 рубль. Этот факт нужно отразить в чудо-программе. Разумеется, предыдущего гения-программиста уже месяц, как схантил йандекс, и задачу предстоит решать другому. Что он видит? Он видит в коде две волшебные константы: что из них цена, которую нужно менять «1» или «3»? В исходнике нет ответа, поэтому он идет выяснять состояние прайса на яблоки в предыдущем периоде, проклиная всех долбаных гениев, решивших (уж не знаю чем вам этот код приглянулся) — допустим, сэкономить 10 секунд на написание 2 строчек проясняющего суть текста. :)
Вы ничего не понимаете в ясности. ООП — наше всё! :P
(let ((apples-cost 42))
(defun apples-update-price (new-price)
(setf apples-cost new-price))
(defun apples-calculate-cost (&key (number 1) (discount 0))
(when (/= discount 0)
(error «Discount not supported yet»))
(* apples-cost number)))
(apples-update-price 1)
(prin1 (apples-calculate-cost :number 3))
(let ((apples-cost 42))
(defun apples-update-price (new-price)
(setf apples-cost new-price))
(defun apples-calculate-cost (&key (number 1) (discount 0))
(when (/= discount 0)
(error «Discount not supported yet»))
(* apples-cost number)))
(apples-update-price 1)
(prin1 (apples-calculate-cost :number 3))
Моноширинный шрифт использовать не могу. Кармы не хватает.
а че это такое?
Common Lisp. Подробности во второй главе LOL: letoverlambda.com/textmode.cl/guest/chap2.html
Sign up to leave a comment.
Искусство программирования под Unix (и не только). Часть вторая, Ясность лучше заумности