Pull to refresh
24
0
Яков @egobrain

Программист

Send message

Зато у GraphQL проблемы с кэшированием тк в основном все библиотеки предлагаю использовать неидемпотентный POST запрос. Получить преимущества от многоуровневой системы с кэширующим proxy (как описано в статье) становится намного сложнее.


Может у кого есть хорошие практики как это решается?

Почему Я могу присоединять и отсоединять вкладки внутри моего браузера или файлового менеджера, но не могу сделать то же самое между 2мя разными приложениями?

Такая фишка была в KDE4 — Tabbed Windows,
но она оказалась не сильно востребована и как следствие пока не портирована в plasma 5 (хотя она есть в листе ожидания)


Почему Я не могу положить файл одновременно в два места моей файловой системы?

в linux вполне можно делать hard links


Почему Я не могу отсортировать файлы по тэгу или метаданным?

в том же kde можно

Если боитесь за производительность foldl можно использовать -compile(inline_list_funcs).


Erlando я тоже использую, но только в собственных pet project-ах.

Как замена pipe чаще всего используется каррирование, замыкания и свертки.


... 
Output = pipe(Input, [
    fetch_users(),
    update_users(),
    store_users_in_database(DbConnection)
]),
...

где pipe/2 — простая свертка, например.


pipe(Data, Funs) ->
    lists:foldl(fun(F, D) -> F(D) end, Data, Funs).

плюс в том что на таких pipe-ах можно построить нечто похожее на монады.


pipe(_Bind, Data, []) -> 
    Data;
pipe(Bind, Data, [H|T]) -> 
    Bind(Data, fun(D) -> pipe(Bind, H(D), T) end).

maybe(F, {just, Data}) -> F(Data);
maybe(F, nothing) -> nothing.

Usage


1> m:pipe(fun m:maybe/2, {just, 11}, [
    fun(A) -> 
        case A > 10 of 
            true -> {just, A}; 
            false -> nothing 
        end 
    end, 
    fun(A) ->  {just, A*2} end
]).

{just, 22}.

или, если причесать через каррирование,


filter_gt(A) -> fun(B) ->
    case A > B of
        true -> {just, A}:
        false -> nothing
    end
end.

do_mult(A) -> fun(B) -> {just, A*B} end.

то будет просто


1> m:pipe(fun m:maybe/2, {just, 11}, [
    m:filter_gt(10),
    m:mult(2)
]).

{just, 22}

но чаще используется pipe не на столько абстрактный, а под конкретный случай, например ok/error.


pipe(D, []) -> D;
pipe({ok, D}, [H|T]) -> pipe(H(D), T);
pipe({error, _}=Err, _) -> Err.

Конечно не сравнится с do нотацией Haskell или for в Scala, но жить можно :)


Очень хорошо такой подход себя показал в нашей библиотеке для работы с Postgres


1> repo:all(m_weather, [
      q:where(fun([#{city := City}]) -> pg_sql:in(City, [<<"Kraków">>, <<"Moscow">>]) end),
      q:order_by(fun([#{temp_lo := T}]) -> [{T, asc}] end),
      q:limit(10)
   ]).

Но также у него есть один минус Dialyzer не сможет провести детальную проверку типов, если State, который передается сквозь функции, меняет тип.


К слову, я экспериментировал с добавлением pipe оператора в нативный синтаксис Erlang и это оказалось проще чем я думал :)

Тому есть несколько причин.

1. Erlang в нашей компании стал использоваться еще до появления Elixir. Соответственно у нас есть множество библиотек и устоявшихся практик как писать код на Erlang быстро и красиво. Взаимодействие Elixir -> Erlang писать достаточно легко, а вот Erlang -> Elixir значительно сложнее. К тому же сам по себе код на языке Erlang, хоть и выглядит поначалу непривычно, из-за своей простоты (малого количества синтаксических конструкций) довольно легко как читать, так и писать (особенно, после того как добавились мапы).
А конструкции как Protocols или pipe оператор вполне можно «повторить».

2. Erlang у нас используется не только для Web API но и для написания внутренних БД (например есть проект riak-core) и очень часто. Elixir же развивается в основном вокруг framework-a Phoenix и в таких проектах не дает ощутимых преимуществ.

3. Erlang стабильнее Elixir и «детские болезни» прошел уже давно. А для нас важна стабильность.

Вы явно что-то путаете. Используется или rebar/rebar3 или erlang.mk
Они заменят, а не дополняют друг друга.
Erlang.mk появился из-за убогости и тормознутости rebar, но rebar3 поборол все (или почти все) детские болезни.
По своему опыту скажу, что работать с rebar3 очень удобно. Мы перевели почти все проекты на него и избавились от тонны проблем.
Отдельная вещь, которую автор упустил, но стоило бы рассказать — это rebar.lock файл, который принудительно фиксирует версии зависимостей в проекте и гарантирует что при сборке на другой машине они будут абсолютной такими же.

Я для Erlang common тестов поднимаю postgresql с данными в tmpfs, если это возможно.
За запуск и останов postgres отвечает само приложение.
Поднимается все быстро. Запуск с кучей миграций (порядка 200 накопилось) проходит за 4 сек (без tmpfs 15 сек).

Таким же образом тестирую opensource типа https://github.com/egobrain/repo
Релиз получился слишком большим. Пришлось временно убрать этот функционал. Ссылка
Правда у автора последняя функция почему-то не работала. Возможно из-за того, что плагин для Elm ещё не был адаптирован для версии 0.17.0.

в релизе 0.17 просто выпилили поддержку hot-swapping и debugger. Что весьма печально.
Сам провозился не один час, пытаясь разобраться что не так.

Есть PR на обновление README
Вспоминаются ребята, которые получили премию Сикорского. У них тоже, своего рода, «квадрокоптер» был :)


А вот судя по фото — не хватает вешалок для курток :)
А так, выглядит приятно. Молодцы!
Спасибо огромное. Обязательно попробую т.к. сейчас какраз озадачен проблемой поиска жилья.

Вот вам еще один способ, который открыла моя супруга:
проверять фото через google/yandex картинки. Часто риэлторы используют одни и те же фотографии в разных объявлениях. Т.к., видимо, их база не большая, таким методом отсекается довольно много спама.
Emacs, erlang-mode, distel + самописаные скрипты
Для меня лично, эта проблема более философская:
Насколько умным будет считаться существо, своим интеллектом создавшее нечто умнее себя?
Ускорение в 5 раз — неплохо, но полученный код не так легко сопровождать.
Мне больше импонирует как сделали ребята из Scalyr. Они просто избавились от лишних watcher-ов, стали использовать DOM cache, что дало довольно большой профит 1200ms to 35ms.
Вот их репозиторий на Github.
Мне кажется намного удобнее ui-router 0.0.2 с его ui-sref
К списку проблем можно добавить еще «прыжок контента» вверх из-за того, что поле «filter bar» переходит в состояние «поверх», а контент в свою очередь занимает освободившееся место.

И совсем здорово если бы в desktop состоянии «filter bar» тоже не скролился. Тогда было бы единство поведения.

А так интересная идея только чуть-чуть не доработана.

В браузере иногда возникает немного другая проблема — ссылки представлены как <a href="http://..."> и получается надо еще их вытащить.
Написал маленький скрипт.
(function openLinks() {
  var selection = window.getSelection();
  var range = selection.getRangeAt(0);
  var allWithinRangeParent = range.commonAncestorContainer.getElementsByTagName("a");
  var href, i, el, links = [];
  for (i = 0, el; el = allWithinRangeParent[i]; i++) {
    if (selection.containsNode(el, true) ) {
      href = el.href;
      if (href != "" || href[0] !="#") {
        links.push(el.href);
      }
    }
  }
  for(i = 0; i < links.length; i++) {
    window.open(links[i],"_blank");
  }
})()


Сжал и сделал ссылку:
javascript:void((function(){var t=window.getSelection();var n=t.getRangeAt(0);var r=n.commonAncestorContainer.getElementsByTagName("a");var i,s,o,u=[];for(s=0,o;o=r[s];s++){if(t.containsNode(o,true)){i=o.href;if(i!=""||i[0]!="#"){u.push(o.href)}}}for(s=0;s<u.length;s++){window.open(u[s],"_blank")}})())

Ссылку закинул на панель закладок и теперь остается только нажать на неё предварительно выделив текст на странице.

Information

Rating
Does not participate
Location
Липецк, Липецкая обл., Россия
Date of birth
Registered
Activity