У меня есть несколько ... есть исключения для всего, поэтому они не являются сложными и быстрыми, но в большинстве случаев они применимы.
Никого не волнует, проверяет ли ваш веб-сайт строгость XHTML, стандарты или соответствует значку W3C.
Это может принести вам несколько пятерок от других веб-разработчиков, но остальные люди, просматривающие ваш сайт, могут дать дерьмо, проверяли ли вы свой код или нет. Подавляющее большинство веб-пользователей используют IE или Firefox, и, поскольку оба этих браузера простят нестандартный, не строгий, недействительный HTML-код, вам не нужно об этом беспокоиться. Если вы создали сайт для автодилера, механика, радиостанции, церкви или местного малого бизнеса, как вы думаете, сколько людей в целевой аудитории этих компаний заботится о правильном HTML? Я рискнул бы предположить, что это довольно близко к 0.
Большинство программ с открытым исходным кодом - бесполезная, слишком сложная чушь.
Позвольте мне установить этот замечательный фрагмент OSS, который я нашел. Похоже, он должен делать именно то, что я хочу! Ой, подождите, сначала я должен установить этот другой оконный менеджер. ХОРОШО. Затем мне нужно получить этот инструмент командной строки и добавить его в мой путь. Теперь мне нужны последние версии для X, Y и Z. Теперь мне нужно убедиться, что у меня запущены эти процессы. ок, отлично ... все настроено. Теперь позвольте мне изучить новый набор команд для его использования. О, круто, кто-то создал графический интерфейс для этого. Я думаю, мне не нужно изучать эти команды. Подождите, мне нужна эта библиотека, чтобы заставить работать графический интерфейс. Должен скачать это сейчас. хорошо, теперь это работает ... дерьмо, я не могу понять этот ужасный интерфейс.
звучит знакомо? OSS полон осложнений ради сложности, сложные установки, которые вам нужны, чтобы быть экспертом, и инструменты, которые большинство людей не знают, что делать в любом случае. Так много проектов отходит на второй план, другие настолько ниши, что их используют лишь немногие, а некоторые из приличных (FlowPlayer, OSCommerce и т. Д.) Имеют настолько нелепо чрезмерно сложный и раздутый исходный код, что он лишает возможности быть способным отредактируйте источник. Вы можете редактировать исходный код ... если вы можете выяснить, какой из 400 файлов содержит код, который необходимо изменить. Вы действительно попали в беду, когда узнаете, что их всего 400.
Магические команды в оболочке. Полный список находится в руководстве , но чаще всего я использую следующие:
Горячая загрузка кода. Из вики.
Код загружается и управляется как «модульные» единицы, модуль - это единица компиляции. Система может одновременно хранить в памяти две версии модуля, и процессы могут одновременно запускать код из каждой.
Версии относятся к «новой» и «старой» версии. Процесс не перейдет в новую версию до тех пор, пока он не сделает внешний вызов своего модуля.
.erlang может предварительно загружать библиотеки и запускать команды при запуске оболочки, вы также можете выполнять определенные команды для определенных узлов, выполняя оператор case для имени узла.
.erlang_hosts дает удобный способ обмена именами между машинами
beam_lib: блоки могут получать исходный код из луча, который был скомпилирован с помощью отладки, что может быть действительно полезным
{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
user_default.erl - вы можете создавать свои собственные встроенные оболочки, добавив на свой путь скомпилированный user_default.beam, который может быть довольно изящным
Параметризованные модули! С http://www.lshift.net/blog/2008/05/18/late-binding-with-erlang и http://www.erlang.se/euc/07/ paper / 1700Carlsson.pdf
-module(myclass, [Instvar1, Instvar2]).
-export([getInstvar1/0, getInstvar2/0]).
getInstvar1() -> Instvar1.
getInstvar2() -> Instvar2.
И
Eshell V5.6 (abort with ^G)
1> Handle = myclass:new(123, 234).
{myclass,123,234}
2> Handle:getInstvar1().
123
3> Handle:getInstvar2().
234
Наследование! http://www.erlang.se/euc/07/papers/1700Carlsson.pdf
Родитель
-module(parent).
-export([foo/0, bar/0]).
foo() ->
io:format("parent:foo/0 ~n", []).
bar() ->
io:format("parent:bar/0 ~n", []).
Ребенок
-module(child).
-extends(parent).
-export([foo/0]).
foo() ->
io:format("child:foo/0 ~n", []).
Консоль
23> parent:foo().
parent:foo/0
ok
24> parent:bar().
parent:bar/0
ok
25> child:foo().
child:foo/0
ok
26> child:bar().
parent:bar/0
ok
У сокетов gen___tcp и ssl есть опция сокета {packet, Type} для помощи в декодировании ряда протоколов. Функция erlang: decode_packet / 3 имеет хорошее описание того, какими могут быть различные значения типа и что они делают.
Вместе с настройкой {active, once} или {active, true} каждое значение в рамке будет доставлено в виде одного сообщения.
Примеры: пакетный режим http активно используется для iserve и пакетный режим fcgi для ifastcgi . Я могу представить, что многие другие http-серверы также используют пакетный http.
Можно определить свой собственный итератор для использования QLC. Например, набор результатов из запроса SQL можно преобразовать в таблицу QLC и, таким образом, извлечь выгоду из функций запросов QLC.
Помимо таблиц mnesia, dets и ets имеют функции table / 1,2 для возврата такого «Обработчик запроса» для них.
Эти спецификации соответствия могут быть построены с использованием ets: fun2ms (...), где используется синтаксис Erlang fun и транслируется в спецификацию соответствия с преобразованием синтаксического анализа.
1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end).
[{{'$1','_','$2'},[{'>','$1',0}],[{{'$1','$2'}}]}]
Так что никакого удовольствия- value когда-либо создается, выражение заменяется спецификацией совпадения во время компиляции. Fun может делать только то, что может делать выражение соответствия.
Кроме того, ets: fun2ms доступен для использования в оболочке, поэтому выражения fun можно легко протестировать.
Порты, внешние или связанные с входом, принимают так называемые io-списки для отправки на них данных. Io-list - это двоичный или (возможно, глубокий) список двоичных файлов или целых чисел в диапазоне 0..255.
Это означает, что вместо того, чтобы объединять два списка перед их отправкой в порт, их можно просто отправить как два элемента в списке. Так что вместо
"foo" ++ "bar"
можно сделать
["foo", "bar"]
. В этом примере, конечно, незначительная разница. Но сам по себе iolist позволяет удобно программировать при создании выходных данных. Например, io_lib: format / 2,3 сам возвращает список io.
Функция erlang: list_to_binary / 1 принимает списки io, но теперь у нас есть erlang: iolist_to_binary / 1, который лучше передает намерение. Также существует erlang: iolist_size / 1.
Лучше всего , поскольку файлы и сокеты реализованы как порты, вы можете отправлять им списки списков.
Не так уж и скрыт, но один из наиболее важных аспектов при выборе Erlang в качестве платформы для разработки:
Вы можете скрыть узел Erlang , запустив его с:
erl -sname foo -hidden
Вы все еще можете подключиться к узлу, но он не появится в списке, возвращаемом узлов / 0
.
Не обязательно «скрытый», но я не часто это вижу. Анонимные функции могут иметь несколько предложений, как и функции модуля, например
-module(foo).
-compile(export_all).
foo(0) -> "zero";
foo(1) -> "one";
foo(_) -> "many".
anon() ->
fun(0) ->
"zero";
(1) ->
"one";
(_) ->
"many"
end.
1> foo:foo(0).
"zero"
2> foo:foo(1).
"one"
3> foo:foo(2).
"many"
4> (foo:anon())(0).
"zero"
5> (foo:anon())(1).
"one"
6> (foo:anon())(2).
"many"