 |


 |
|
 |
 |
 |
 |
|
 |
 |
В данном посте я хочу привести небольшой пример эрланговской nif на окамле. Итак, что для начала почитать: http://www.erlang.org/doc/man/erl_nif.htmlhttp://caml.inria.fr/pub/docs/manual-ocaml/manual032.htmlНапишем небольшую функцию sample, результатом которой будет ее единственный аргумент. На стороне эрланга nif_sample.erl:
-module(nif_sample).
-export([
init/0,
sample/1,
selftest/0
]).
init() ->
erlang:load_nif("./nif_sample", 0).
sample(_) ->
throw({error, "NIF library 'nif_sample' not loaded"}).
selftest() ->
init(),
sample(sample).
Прослойка на C. nif_sample.c:
#include <stdio.h>
#include <erl_nif.h>
#include <caml/mlvalues.h>
#include <caml/callback.h>
static ERL_NIF_TERM sample(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
return ocaml_sample_wrapper(argc, argv);
}
static ErlNifFunc nif_funcs[] =
{
{"sample", 1, sample}
};
static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
{
caml_startup(0);
return 0;
}
ERL_NIF_INIT(nif_sample, nif_funcs, &load, NULL, NULL, NULL)
ocaml_sample.c:
#include <stdio.h>
#include <string.h>
#include <erl_nif.h>
#include <caml/mlvalues.h>
#include <caml/callback.h>
void* ocaml_sample_wrapper(int argc, const ERL_NIF_TERM argv[])
{
static value * ocaml_sample = NULL;
if (ocaml_sample == NULL)
ocaml_sample = caml_named_value("sample_wrapper");
return caml_callback(*ocaml_sample, argv[0]);
}
Ну и непосредственно сам окамл sample_wrapper.ml:
let sample_wrapper a =
a
let _ = Callback.register "sample_wrapper" sample_wrapper
Как все это хозяйство собрать: ocamlc -custom -output-obj -o sample_wrapper.o sample_wrapper.ml ocamlc -c -I /usr/local/lib/erlang/usr/include/ ocaml_sample.c cp /usr/local/lib/ocaml/libcamlrun.a libocamlsample.a ar r libocamlsample.a sample_wrapper.o ocaml_sample.o gcc -fPIC -shared -flat_namespace -undefined suppress -o nif_sample.so nif_sample.c -I/usr/local/lib/erlang/usr/include/ -I/usr/local/lib/ocaml/ libocamlsample.a erlc nif_sample.erl
Что же в конечном итоге вышло:
Erlang R14B02 (erts-5.8.3) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.3 (abort with ^G)
1> nif_sample:selftest().
sample
Tags: fp
|
 |
 |
 |
 |
|
 |
 |

 |
|
 |
 |
 |
 |
|
 |
 |
На больших и толстых системах не единичны случаи невозможности коннекта к эрланговой ноде. Это явно указывает на то, что epmd вдруг растерял всю свою информацию. Если в нормальном своем состоянии он показывает что-то вида > epmd -names epmd: up and running on port 4369 with data: name siden at port 54406
То после "падения": > epmd -names epmd: up and running on port 4369 with data:
Существует общеизветсное решение в узких кругах: допустим у нас пропала нода mynodename@mynode
- определить порт запущенной эрланговой ноды mynodename@mynode на mynode можно тем же netstat-ом (обычно это что-то между 40k и 60k)
> netstat -an | grep LIST ... tcp4 0 0 *.54406 *.* LISTEN ...
- находим ноду из нашего эрлангового кластера, которая "знает" о пропавшей ноде и отвечает на net_adm:ping('mynodename@mynode') понгом (т.е. она уже когда-то коннектилась к пропавшей ноде и данную информацию сохранила)
- с этой найденной ноды делаем rpc:call('mynodename@mynode', erl_epmd, register_node, ['mynodename', 54406]).
И все хорошо. Но что же делать когда нет возможности найти такую ноду.
- находим необходимый порт как в предыдущем решении
- запускаем эмулятор и выполняем следующее
> erl Erlang R14B02 (erts-5.8.3) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.8.3 (abort with ^G) 1> erl_epmd:start(). {ok,<0.33.0>} 2> erl_epmd:register_node(siden, 54406). {ok,2} 3>
- смотрим что нам говорит epmd
> epmd -names epmd: up and running on port 4369 with data: name siden at port 54406
- если сейчас закрыть этот эмулятор, то и информация из epmd пропадет, и все вернется на круги своя
- вместо этого мы открываем еще один эмулятор с коннектом на потерявшийся инстанс
> erl -sname siden2 -remsh 'siden@MacBook-SiDen' Erlang R14B02 (erts-5.8.3) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.8.3 (abort with ^G) (siden@MacBook-SiDen)1>
- epmd теперь нам говорит
epmd: up and running on port 4369 with data: name siden2 at port 54486 name siden at port 54406
- закрываем первый эмулятор и как и следовло ожидать информация о siden в epmd исчезла
epmd: up and running on port 4369 with data: name siden2 at port 54486
- во втором эмуляторе повторно выполняем
> erl_epmd:register_node(siden, 54406).
- статус epmd:
epmd: up and running on port 4369 with data: name siden at port 54406 name siden2 at port 54486
- закрываем второй эмулятор
- статус epmd:
epmd: up and running on port 4369 with data: name siden at port 54406
Ну вот собственно и все. Конектимся к было пропавшей ноде и успешно начинаем её истязать :) Tags: fp
|
 |
 |
 |
 |
|
 |
 |

 |
|
 |
 |
 |
 |
|
 |
 |
Карандашом из Peopleware: Productive Projects and Teams (Tom DeMarco, Timothy Lister) as is. Управление человеческим ресурсом:- серьезные проблемы имеют не столько технологическую, сколько социологическую природу
- ошибка - не грех, итеративное проектирование + поощрение нечастых ошибок
- менеджмент - это не умение пинать сотрудников, пинок не нацеливает на творческий подход, вдумчивость и изобретательность (работать надо меньше, но более вдумчиво)
- уникальность человека - не раздражающий фактор, а залог активности и эффективности внутрипроектных отношений
- стабилизация проекта - его смерть
- сжатые сроки - повод к частым мозговым штурмам и неформальной проектной тусовке для сплочения, а не оголтелому программированию
- всего 5% тратится на исследование новых методов, обучению, чтению книг и т.д.
- испанская теория - ценнтость имеет свою стоимость, богатство - эффективно извлечь эту стоимость из ресурсов (труда)
- английская теория - ценности можно создавать используя изобретательсность и технологии
- сверхурочные имеют смысл только на последней стометровке марафонской дистанции
- сгоревший трудоголик - более бесполезен, не пойдет за изменениями, а просто уйдет
- под давлением люди не работают лучше, а всего лишь быстрее
- существует сильная связь между самооценкой и качеством создаваемого продукта
- рынку наплевать на уровень качества установленный создателем
- качество, серьезно превосходящие запросы конечного пользователя, есть средство достижения более высокой производительности
- давление на сотрудника способно лишь унизить и лишить мотивации, закон Паркинсона(единственный способ добиться выполнения работы - это установить невозможно оптимистические сроки ее сдачи) - не работает
- лучшая опроизводительность при отсутствии оценки сложности. Второе место - оценка третьей стороной (системным аналитиком), затем самими программистами
- необоснованные и нереалистичные оценки роняют дух и приводят к злости и отчаянию
- назначение руководителя не в том, что бы заставить людей работать, а в том, что бы создать им условия для работы
- самый страшный грех руководителя - впустую тратить чужое время
Офисная среда:- есть миллион способов потерять рабочий день и ни одного, который бы компенсировал потерю
- лучшая половину сотрудников выполнит работу в полтора раза быстрее остальных и с допустит в два раза меньше ошибок
- любые два человека из одной организации, как правило, имеют близкую производительность, лучшие работники накапливаются в определенных организациях
- рабочее место должно быть: тихим, уединенным, просторным и защищенным от внешнего вмешательства (по сути неважно, становятся ли там перформерами или они там накапливаются)
- минимальные параметры рабочего места от IBM: 9кв.м. площади, 2.7кв.м. рабочей поверхности, защита от шума
- сотрудник, который жалуется на шум - сообщает вам, что в его работе вероятны ошибки (анализ "военных моневров")
- фактор среды = время непрерывной работы/время присутствия
- красный платок на столе = "Не беспокоить!"
- телефонный звонок вышибает из рабочей колеи на время равно длительности звонка + 15 минут
- наушники(как замена тишине) - ущерб творческому подходу
Подходящие люди:- если сотрудник изначально не подходит для какой-то работы, то он таким и останется
- потребность в единообразии - признак неуверенности руководства
- энтропия в организации постоянно увеличивается
- замена сотрудника стоит от 4 до 5 его месячных зарплат
- текучка кадров порождает новую текучку
- компания должна предоставлять возможность приобретения новых необходимых знаний
- переподготовка создает умонастроение постоянства
- ни одна должность не должна вести в тупик
- "Методология" - болото писанины, ограниченное число методов, отсутствие ответственности, общая потеря мотивации
- объемная документация - часть проблемы, а не ее решение
Создание продуктивных команд:- вызов позволяет сфокусироваться на чем-то всем вместе
- цели организации постоянно критически рассматриваются ее сотрудниками и большинство целей оценивается как бред
- цель компании(увеличение прибыли, рекордный месяц) скорее демотивирует команду, цель команды - общий успех, удовольствие от достижения
- команду нельзя построить, ее можно попробовать вырастить
- препятствует формированию команды: недоверие к сотрудникам, бюрократия, физическое разделение, участие в нескольких проектах одновременно,
- удовольствие от работы снижает необходимость создавать продукт, качество которого слишком низкое для способностей сотрудников (сроки - качество)
- в меру сжатые сроки могут быть для команды приятным вызовом
- лучший успех - тот, в котором нет очевидного участия руководства, а команда работает как содружество равных
- лучший начальник не дает участникам команды догадаться, что ими "руководят"
- доверяйте своим сотрудникам
- работа вне офиса помогает (как минимум избавиться от внешних раздражителей)
- практика выбора команды на проект самими сотрудниками
- возводите качество в ранг культа (лишь идеал для нас достаточно хорош)
- сотрудники соревнуются сами с собой за сохранение качества
- создавайте многочисленные промежуточные финиши, приносящие удовлетворение
- внушайте чувство элитарности
- допускайте и поощряйте неоднородность
- раздавайте стратегические, а не тактические указания
- в идеальной команде нет лидера, лидерство переходит от одного к другому в зависимости от специализации
- большие переработки помогут развалить команду
- конкуренция внутри команды - развалит ее
- должно быть внутрикомандное обучение одних сотрудников другими (например при совместной работе над чем-то)
- отравляющее воздействие на команду производят: ежегодный пересмотр зарплат и заслуг, целеориентированное управление, восхваление определенных сотрудников за достижения, награды и бонусы за производительность, измерение производительности в любой форме
- люди ненавидят перемены
- основная реакция не логическая, но эмоциональная
Удовольствие от работы:- хаос - причина удовольствия от работы на начальных этапах становления
- используйте пилотные проекты
- проведение состязаний команд (в т.ч. суточные)
- проведение мозговых штурмов
- карт-бланш сотрудникам: "определи свою задачу сам"
|
 |
 |
 |
 |
|
 |
 |

|
 |
|
 |