You are viewing sidentdv

entries friends calendar profile
SiDen
Share
В данном посте я хочу привести небольшой пример эрланговской nif на окамле.
Итак, что для начала почитать:
http://www.erlang.org/doc/man/erl_nif.html
http://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:

Share
 На больших и толстых системах не единичны случаи невозможности коннекта к эрланговой ноде.
Это явно указывает на то, что 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:

Share
Карандашом из Peopleware: Productive Projects and Teams (Tom DeMarco, Timothy Lister) as is.

Управление человеческим ресурсом:
  • серьезные проблемы имеют не столько технологическую, сколько социологическую природу
  • ошибка - не грех, итеративное проектирование + поощрение нечастых ошибок
  • менеджмент - это не умение пинать сотрудников, пинок не нацеливает на творческий подход, вдумчивость и изобретательность (работать надо меньше, но более вдумчиво)
  • уникальность человека - не раздражающий фактор, а залог активности и эффективности внутрипроектных отношений
  • стабилизация проекта - его смерть
  • сжатые сроки - повод к частым мозговым штурмам и неформальной проектной тусовке для сплочения, а не оголтелому программированию
  • всего 5% тратится на исследование новых методов, обучению, чтению книг и т.д.
  • испанская теория - ценнтость имеет свою стоимость, богатство - эффективно извлечь эту стоимость из ресурсов (труда)
  • английская теория - ценности можно создавать используя изобретательсность и технологии
  • сверхурочные имеют смысл только на последней стометровке марафонской дистанции
  • сгоревший трудоголик - более бесполезен, не пойдет за изменениями, а просто уйдет
  • под давлением люди не работают лучше, а всего лишь быстрее
  • существует сильная связь между самооценкой и качеством создаваемого продукта
  • рынку наплевать на уровень качества установленный создателем
  • качество, серьезно превосходящие запросы конечного пользователя, есть средство достижения более высокой производительности
  • давление на сотрудника способно лишь унизить и лишить мотивации, закон Паркинсона(единственный способ добиться выполнения работы - это установить невозможно оптимистические сроки ее сдачи) - не работает
  • лучшая опроизводительность при отсутствии оценки сложности. Второе место - оценка третьей стороной (системным аналитиком), затем самими программистами
  • необоснованные и нереалистичные оценки роняют дух и приводят к злости и отчаянию
  • назначение руководителя не в том, что бы заставить людей работать, а в том, что бы создать им условия для работы
  • самый страшный грех руководителя - впустую тратить чужое время
Офисная среда:
  • есть миллион способов потерять рабочий день и ни одного, который бы компенсировал потерю
  • лучшая половину сотрудников выполнит работу в полтора раза быстрее остальных и с допустит в два раза меньше ошибок
  • любые два человека из одной организации, как правило, имеют близкую производительность, лучшие работники накапливаются в определенных организациях
  • рабочее место должно быть: тихим, уединенным, просторным и защищенным от внешнего вмешательства (по сути неважно, становятся ли там перформерами или они там накапливаются)
  • минимальные параметры рабочего места от IBM: 9кв.м. площади, 2.7кв.м. рабочей поверхности, защита от шума
  • сотрудник, который жалуется на шум - сообщает вам, что в его работе вероятны ошибки (анализ "военных моневров")
  • фактор среды = время непрерывной работы/время присутствия
  • красный платок на столе = "Не беспокоить!"
  • телефонный звонок вышибает из рабочей колеи на время равно длительности звонка + 15 минут
  • наушники(как замена тишине) - ущерб творческому подходу
Подходящие люди:
  • если сотрудник изначально не подходит для какой-то работы, то он таким и останется
  • потребность в единообразии - признак неуверенности руководства
  • энтропия в организации постоянно увеличивается
  • замена сотрудника стоит от 4 до 5 его месячных зарплат
  • текучка кадров порождает новую текучку
  • компания должна предоставлять возможность приобретения новых необходимых знаний
  • переподготовка создает умонастроение постоянства
  • ни одна должность не должна вести в тупик
  • "Методология" - болото писанины, ограниченное число методов, отсутствие ответственности, общая потеря мотивации
  • объемная документация - часть проблемы, а не ее решение
Создание продуктивных команд:
  • вызов позволяет сфокусироваться на чем-то всем вместе
  • цели организации постоянно критически рассматриваются ее сотрудниками и большинство целей оценивается как бред
  • цель компании(увеличение прибыли, рекордный месяц) скорее демотивирует команду, цель команды - общий успех, удовольствие от достижения
  • команду нельзя построить, ее можно попробовать вырастить
  • препятствует формированию команды: недоверие к сотрудникам, бюрократия, физическое разделение, участие в нескольких проектах одновременно,
  • удовольствие от работы снижает необходимость создавать продукт, качество которого слишком низкое для способностей сотрудников (сроки - качество)
  • в меру сжатые сроки могут быть для команды приятным вызовом
  • лучший успех - тот, в котором нет очевидного участия руководства, а команда работает как содружество равных
  • лучший начальник не дает участникам команды догадаться, что ими "руководят"
  • доверяйте своим сотрудникам
  • работа вне офиса помогает (как минимум избавиться от внешних раздражителей)
  • практика выбора команды на проект самими сотрудниками
  • возводите качество в ранг культа (лишь идеал для нас достаточно хорош)
  • сотрудники соревнуются сами с собой за сохранение качества
  • создавайте многочисленные промежуточные финиши, приносящие удовлетворение
  • внушайте чувство элитарности
  • допускайте и поощряйте неоднородность
  • раздавайте стратегические, а не тактические указания
  • в идеальной команде нет лидера, лидерство переходит от одного к другому в зависимости от специализации
  • большие переработки помогут развалить команду
  • конкуренция внутри команды - развалит ее
  • должно быть внутрикомандное обучение одних сотрудников другими (например при совместной работе над чем-то)
  • отравляющее воздействие на команду производят: ежегодный пересмотр зарплат и заслуг, целеориентированное управление, восхваление определенных сотрудников за достижения, награды и бонусы за производительность, измерение производительности в любой форме
  • люди ненавидят перемены
  • основная реакция не логическая, но эмоциональная
Удовольствие от работы:
  • хаос - причина удовольствия от работы на начальных этапах становления
  • используйте пилотные проекты
  • проведение состязаний команд (в т.ч. суточные)
  • проведение мозговых штурмов
  • карт-бланш сотрудникам: "определи свою задачу сам"
profile
SiDen
User: sidentdv
Name: SiDen
calendar
Back October 2011
1
2345678
9101112131415
16171819202122
23242526272829
3031
page summary
tags