Задать вопрос
  • Go или Erlang для стриминг сервера?

    sim3x
    @sim3x
    Сам стриминг у тебя будет на плюсах (если у тебя скиловая команда с кучей синьйоров) или ерланге - остальные ЯП не так хороши при работе с сетью и потоками

    Обвязку пиши - на чем хочешь

    Using pre-release versions of Go 1.2, it was able to serve over 500,000 concurrent users from each physical host without special tuning
    тюненный ерланг там бы сервил 10М, но твитч не умеет писать на нем

    https://blog.twitch.tv/gos-march-to-low-latency-gc...
    В статье описано почему для обвязки (сайта, чата, етц) нужно использовать ерланг, тк он не имеет описанных проблем
    Ответ написан
  • Что производительнее Go или Erlang?

    5HT
    @5HT
    Erlang
    Если задача померяться с пацанами в ЖЖ цифрами и продемонстрировать что ты быстрее эрланга на 5-10% — то Го. Если ты хочешь более-менее фунциональный веб, то Erlang конечно. Но на Го так быстро слепить бенчмарк для веб, который нагнет Erlang не так то просто.
    Ответ написан
    Комментировать
  • Как получить опыт работы во front-end разработке?

    5HT
    @5HT
    Erlang
    Если "полный ноль" то нужно сначала немного вводной информации.

    1. Платформа
    * ECMA-262 или другими словами спецификация на язык JavaScript
    * V8, SpiderMonkey, Chakra — имплементации этой спецификации встроенные в основные браузеры
    Это платформа с которой вам придется работать. Фронт энд — это стало быть виртуальная машина (например V8 в Google Chrome), описание языка, а также программы написанные на JavaScript.

    2. Виды графических приложений
    В любом из этих трех видов приложения (могут быть также комбинации), используется разный основной механизм типогрфического либо графического отображения, в тоже время каждое из этих трех типов приложений использует JavaScript как основной язык для управлением этим механизмом.
    * HTML/CSS приложения — это обычные HTML приложения со стилями CSS (возможно с анимацией), обычно это бизнес приложения или то что называется UI состоящее из контрольные элементов: кнопок, полей ввода, чекбоксов, радиокнопок, лейблов, окон и т.д. Сюда например входят большинства всех сайтов в интернете также и Windows Phone приложения. Буквально тысячи фрейморков.
    * SVG приложения — сюда входят векторные игрушки либо другие приложения, где объекты вместо DOM элелментов HTML являются SVG элементы. Тут самая крутые библиотеки это paper.js, d3.js и т.п.
    * Canvas приложения — сюда входят игрушки или приложения которые самостоятельно рендерят растр для прямоугольной области экрана. Специфический вид приложений.

    3. Транспорт
    Разрабатывая приложения вы должны будете общаться с серверами приложений, которые могу быть написаны на множестве языков. Тут уже начинается бекенд, поэтому вы просто должны быть готовы к тому что на сервере может быть любой язык. Но чтобы сэкономить на времени вы можете использовать базовые примеры из node.js для разработки, так как node.js — это бекенд на JavaScript, т.е. на той же платформе что и браузер, только занимается не графическим окружением, а хранением фалов, доступом к базам данных и прочим. Но что вы должны будете знать, так это протоколы и форматы по которым общаются между собой клиент (браузер) и сервер (который может быть написан на любом языке).
    Протоколы:
    * HTTP 1.0,1.1,1.2,2.0 — основной протокол интернет
    * REST — использование HTTP протокола для организации доступа к ресурсам приложения, которые находятся на сервере (GET POST PUT HEAD OPTIONS DELETE, могут быть свои расширения протокола). Основные виды ресурсов — это скалярные (конкретные объекты /users/joe) и векторные (перечисления объектов /users/).
    * WebSocket — спецификация на сокет-протокол поверх которого вы можете создавать свои протоколы.
    Форматы:
    * JSON — основной формат, который является подмножеством JavaScript.
    * XML — формат с которым вам возможно придется столкнуться. Сама страница XHTML например является XML документом.
    * MessagePack — один из возможных бинарных форматов, с которыми возможно когда-то придется иметь дело.

    Если в этом разобраться хорошо, тогда нужно найти фреймворк и придумать какой-то проект (может быть даже с бизнес идеей) и попытаться его реализовать под наставлением человека, который бедет следить и говорить правильно вы делаете или нет.
    Ответ написан
    5 комментариев
  • Erlang. Почему возникает ошибка при установке релиза с помощью rebar?

    5HT
    @5HT
    Erlang
    В отличии от reltool, новые релиз менеджеры relx и mad сами резолвят все зависимости (сортировка последовательности запуска приложений на основании зависимостей), а mad делает еще и маленькие компактны релизы размером 8МБ. Работает так же как и relx, через sasl/systools. Делать релизы через reltool/rebar — это медленный и deprecated способ.
    Ответ написан
    4 комментария
  • Как запустить cowboy сервер?

    5HT
    @5HT
    Erlang
    Вот пример как запускать cowboy одним файлом под супервизором приложения. Пример взят из документации по N2O — Setup Web Server, это стандартный шаблон application и supervisor в одном флаконе. Здесь использованы два статических эндпойнта, один вебсокет эндпойнт и один HTTP/1 эндпойнт.

    -module(sample).
      -behaviour(supervisor).
      -behaviour(application).
      -export([init/1, start/2, stop/1, main/1]).
    
      start(_,_) -> supervisor:start_link({local,review},review,[]).
      stop(_)    -> ok.
      init([])   -> case cowboy:start_http(http,3,port(),env()) of
                         {ok, _}   -> ok;
                         {error,_} -> halt(abort,[]) end, sup().
    
      sup()    -> { ok, { { one_for_one, 5, 100 }, [] } }.
      port()   -> [ { port, application:get_env(n2o,port,8000)  } ].
      env()    -> [ { env, [ { dispatch, points() } ] } ].
      static() ->   { dir, "apps/sample/priv/static", mime() }.
      n2o()    ->   { dir, "deps/n2o/priv",           mime() }.
      mime()   -> [ { mimetypes, cow_mimetypes, all   } ].
      points() -> cowboy_router:compile([{'_', [
    
                  { "/static/[...]",       n2o_static,  static()},
                  { "/n2o/[...]",          n2o_static,  n2o()},
                  { "/ws/[...]",           n2o_stream,  []},
                  { '_',                   n2o_cowboy,  []} ]}]).
    Ответ написан
    Комментировать
  • Загрузка файлов в Erlang и Cowboy

    5HT
    @5HT
    Erlang
    Вот пример бинарного File Upload без всяких XML, jQuery, Base64, XHR, MIME, miltipart, используя только WebSocket канал. Скорость без буферов 22МБ/s при загрузке CPU 40%, поддерживает докачку при обрывах соединения с обоих сторон: N2O Binary File Transfer Protocol. Описание технологии тут: 5ht.co/ftp.htm Цена вопроса 100 строк кода, код не зависит особо от N2O и может быть перенесен на чистый ковбой.
    Ответ написан
    Комментировать
  • Как доработать логотип?

    @YuriKob
    Первое и самое главное, качественный дизайн - это почти всегда серьезная стилизация.
    Данному логотипу этого сильно не хватает, детали в виде складок и прочих должны отрисовываться более четкой и "чистой" линией, при этом характер собаки не должен теряться (работы с dribble как пример) Это приходит с опытом и практикой.
    Второе, в чб версии правый нижний и верхний левый углы залить серым который будет светлее чем другие углы, обводки само собой не будет. в шрифтовом блоке "show" будет тем же цветом что и углы. ( чб с градациями цвета)
    Третье, иллюзии и прочее это отлично, но сейчас это собака с двумя головами - по центральной оси необходимо сделать разделение объектов, возможно поиграть с рамкой итд.
    Четвертое, композиционно лица собак прилипли к краям лого - не есть гуд, необходим воздух.

    P.S Если нужна качественная разработка лого - обращайтесь.
    designwork.leo@gmail.com
    Ответ написан
    Комментировать
  • Правильно ли рисовать для сайта каждый раз новый UI?

    font
    @font
    В поисках самого лучшего
    Для каждого сайта, новый UI.
    Иначе десигн как-то не десигн будет.
    Если рисовать новый UI для каждой страницы (для регистрации один, для контактной формы -- другой), то надо обоссать дизайнера, потому что он явно считает что он -- творец, а его "творчество" неоспоримо.
    Ответ написан
    5 комментариев
  • Есть в природе ноутбук, чтобы мал да удал?

    @SlivTime
    MacBook Air 11' же.
    - до 8гб памяти.
    - 1.4 ггц, с TurboBoost до 2.7
    - 9 часов
    - 1кг

    На днях могут представить 12-дюймовый эйр, вообще идеальный вариант получится.
    Ответ написан
    Комментировать
  • Что на самом деле дает сжатие памяти в Mac OS X? Как работает?

    Как показывает практика - MacOS 10.9+ стал работать не совсем адекватно, если у меня запущена тонна софта, я не перезагружаю комп месяцами, у меня крутится веб сервер, у меня фотошоп.... и только 8 гиг памяти.

    Отключив swap, при 16 гигах оперативки я ловил пару раз в месяц зависания системы, пришлось включить обратно.

    На ноутбуке я наблюдал за использованием памяти на макбуке:
    1. У меня 8 гиг оперативки, я умудрился забить 12 гиг до момента задействования свопа, т.е. сперва память долго жмется, а потом только выгружается в своп
    2. Файловый кеш не всегда выгружается, например программы занимаю 3 гига, а файловый кеш 5, я запускаю виртуалку с выделенным 1 гигом памяти, из файлового кеша освобождается 1 гиг. Но иногда начинает включаться своп, а кеш так и не выгружается.
    3. После очистки памяти - своп тоже не всегда выгружается в оперативку.

    В общем 10.8 работала лучше, а в 10.9 и 10.10 что то нахимичили, хотя в 10.10.2 боле-мене адекватно работает, почти не зависает комп.
    Ответ написан
    2 комментария
  • Выбор архитекруты для websockeт'ов. eventloop или акторы?

    5HT
    @5HT
    Erlang
    TL;DR: Имплементация любой системы актеров автоматически является ивент лупом.

    Ивентлупом обычно называются планировщики, например в виде С библиотек таких как libuv, которая используется в node.js, Julia, Rust, а также в ивентлупом называют такие библиотеки как в D, например Vibe.D. Актеры Эрланга это больше чем просто планировщик, это также еще и система обмена сообщениями.

    Если вам не нужно чтобы ваши единицы планирования общались между собой, вам возможно не нужна система актеров, и можно будет быстро это написать прямо на C с использование libuv. Как только вы захотите чтобы единицы планирования общались между собой вам потребуется что-то больше чем просто цикл по стекам.

    Вопрос, к сожалению, не имеет смысла, так как Эрланг предоставляет даже больше чем просто систему актеров. Вы не найдете WebSocket сервер для Erlang который не поддерживает концепцию актеров, а также не найдете WebSocket сервер для Erlang который не поддерживает концепцию event loop.
    Ответ написан
    Комментировать
  • Кто как деплоит Erlang приложения?

    5HT
    @5HT
    Erlang
    Я предпочитаю делать git pull в каталоге на сервере который я патчу в реальном времени.
    После того, как я сделал патч я его комичу прямо из сервера.
    Я пересобираю релизы и докер контейнеры из гита.
    По очереди тушу линию контейнеров кольца и переподнимаю новые.

    Такой worklfow преполагается в mad deploy. Но он будет общаться не по ssh с серверами, а с сервисом в составе архитектуры voxoz, который управляет докер контейнерами slice. Но это пока еще не выложено в публику.
    Ответ написан
    Комментировать
  • Как закодировать/раскодировать текст в Erlang?

    5HT
    @5HT
    Erlang
    AES-CBC шифрование с HMAC можно использовать из стандартной библиотеки N2O:

    pickle(Data) ->
        Message = term_to_binary({Data,now()}),
        Padding = size(Message) rem 16,
        Bits = (16-Padding)*8, Key = secret(), IV = crypto:rand_bytes(16),
        Cipher = crypto:block_encrypt(aes_cbc128,Key,IV,<<Message/binary,0:Bits>>),
        Signature = crypto:hmac(sha256,Key,<<Cipher/binary,IV/binary>>),
        base64:encode(<<IV/binary,Signature/binary,Cipher/binary>>).
    
    secret() -> wf:config(n2o,secret,<<"ThisIsClassified">>).
    
    depickle(PickledData) ->
        try Key = secret(),
            Decoded = base64:decode(wf:to_binary(PickledData)),
            <<IV:16/binary,Signature:32/binary,Cipher/binary>> = Decoded,
            Signature = crypto:hmac(sha256,Key,<<Cipher/binary,IV/binary>>),
            {Data,_Time} = binary_to_term(crypto:block_decrypt(aes_cbc128,Key,IV,Cipher),[safe]),
            Data
        catch E:R -> wf:info(?MODULE,"Depicke Error: ~p",[{E,R}]), undefined end.

    https://github.com/5HT/n2o/blob/master/src/handler...

    pickle/1 и depickle/1 прошли верификацию: https://github.com/5HT/n2o/issues/63
    Ответ написан
    Комментировать
  • Какой веб-фреймворк использовать, n2o или Zotonic ?

    5HT
    @5HT
    Erlang
    N2O стоит только потому хотябы что у него есть русскоязычное сообщество и поддержка.

    с ChicagoBoss (полностью выключенные логи) проблемы
    https://github.com/sebastianhoitz/todomanager
    По сути пустая страница на 1КБ. Все сжирает роутинг. Я думаю, что на чикагобосс никто не релизил сайты в продакшен.

    $ wrk -c 50 -r 50 -t 4 -k http://localhost:8001/
    Making 50 requests to http://localhost:8001/
      4 threads and 50 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency   162.69ms  483.80ms   1.69s    89.58%
        Req/Sec     0.00      0.00     0.00    100.00%
      48 requests, 48 sock connections in 1.75s, 47.53KB read
    Requests/sec:     27.42
    Transfer/sec:     27.15KB
    Ответ написан
    Комментировать
  • Как в добавить произвольный процесс в gproc?

    begemot_sun
    @begemot_sun
    Программист в душе.
    > Соответственно передать какие-либо аргументы в момент запуска я не могу.
    Можете. См start_child: www.erlang.org/doc/man/supervisor.html#start_child-2
    > If the case of a simple_one_for_one supervisor, the child specification defined in Module:init/1 will be used and ChildSpec should instead be an arbitrary list of terms List. The child process will then be started by appending List to the existing start function arguments, i.e. by calling apply(M, F, A++List) where {M,F,A} is the start function defined in the child specification.

    Регистрация в gproc:
    gproc:add_local_name(Name) ( https://github.com/uwiger/gproc/blob/master/doc/gp... )
    Ответ написан
    Комментировать
  • Какой веб-фреймворк использовать, n2o или Zotonic ?

    wiz
    @wiz
    Ортодоксальный хаскелит
    Однозначно n2o. Остальные все протухли.
    Ответ написан
    Комментировать
  • Erlang как получить текущий урл?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Вам видимо поможет cowboy_req:path + функции из модуля re в случае ЧПУ.
    и насколько помнится cowboy_req:qs + cow:parse_qs в случае id в виде GET-параметра.

    Ссылочки для изучения исходников:
    https://github.com/ninenines/cowboy/blob/master/sr...
    https://github.com/ninenines/cowlib/blob/master/sr...

    А также мануал: ninenines.eu/docs/en/cowboy/HEAD/manual
    Ответ написан
    2 комментария
  • Erlang. Как передать поток от одного процесса другому?

    begemot_sun
    @begemot_sun
    Программист в душе.
    в gen_server есть обработчик
    handle_call(Msg, From, State) ->
    PidBa ! { Msg, From },
    { noreply, State };

    вот этот From -- это есть указатель на того, кто ожидает.
    Т.о. вы в Ба должны каким то образом передать этот From.
    Далее Ба может ответить:
    gen_server:reply(From, Answer).

    Cам по себе супервизор не содержит такого функционала. Вам надо использовать промежуточный процесс и отправлять сообщения ему, и он будет разруливать куда отправлять дальше.

    P.S. handle_call вызывается с помощью gen_server:call(Pid, Msg, Timeout).

    Более подробно почитать можно тут:
    www.erlang.org/doc/man/gen_server.html
    а в более популярной форму тут:
    learnyousomeerlang.com/clients-and-servers
    или по русски в районе этого:
    https://github.com/dyp2000/Russian-Armstrong-Erlang
    Ответ написан
    9 комментариев
  • F#, erlang и прочее - насколько востребованны?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Erlang не любит больших и сложных вычислений. Его идеальное применение это перекладывание байтиков из одного процесса в другой с реализацией несложной логики. Для более призводительнных веще к нему подключают NIF-библиотеки, это просто бибилиотеки на C / c++ для большей производительности
    Ответ написан
    Комментировать
  • Nginx redirect from http to https?

    @metajiji
    Согласно официальной документации рекомендуют использовать такую конструкцию:
    server {
            listen 80;
            server_name example.com;
            return 301 https://$server_name$request_uri;  # enforce https
    #        rewrite ^(.*) https://www.example.com$uri permanent;
    }
    Ответ написан
    6 комментариев