BigTom

BigTom

What are the remaining gaps in the elixir ecosystem?

With Phoenix, Liveview, Ash, Oban Web, Nx, Livebook, Beacon, Liveview Native, Flame, Nerves etc all getting mature, are there any major gaps in the elixir ecosystem that means its not suitable for some popular use case out there?

What is the next big space it is going to get a kick-ass solution for?

Most Liked

Eiji

Eiji

I would like to see a scenic-like solution for desktop apps that is based on a NIF which uses the same crates as in zed code editor. This way we would have a native desktop apps that are rendered using by GPU where each UI component could have it’s own beam process. :heart_eyes:

19
Post #2
garrison

garrison

IMO the biggest thing missing from the ecosystem is a proper database. Mnesia doesn’t cut it, so we’re all left using Postgres et al which feels like a total waste of the BEAM’s potential.

I actually started an experimental side project in this area several months ago and it has been going surprisingly well. Will have to make a post about it soon.

bartblast

bartblast

Creator of Hologram

TLDR: There was no copyright issue. I own the copyright to the logo, and the agency’s claims were baseless. After I hired a law firm to analyze the situation, they confirmed my position. The agency CEO has agreed to issue a public apology on LinkedIn.

Longer version:

For those unaware of the situation: After releasing Hologram, I announced it on LinkedIn with our project logo and name. Shortly after, the CEO of a design agency publicly accused me of stealing both their company name and logo. Instead of reaching out privately first, he sent me an email demanding I change the project’s name (and the logo).

The situation was quite stressful. I released Hologram at around 3-4 AM and announced it on various platforms, and his aggressive accusations were literally the first thing I saw when I woke up. What made it worse was that his employees then flooded the LinkedIn announcement thread, engaging in public shaming and bullying behavior.

The logo concept itself is based on common iconography - a minimalist representation of a 2D projection of a hologram machine projecting a hologram. While it’s true that one element of the logo (the icon) is similar, the text treatment is completely different, and they typically only use text in their branding anyway. More importantly, there are thousands of companies and GitHub projects using “Hologram” in their names, and the agency doesn’t hold any trademark rights.

I took this seriously and hired a law firm specializing in trademarks and patents. They thoroughly analyzed the situation and confirmed that the agency’s claims were completely unreasonable. I have clear documentation proving independent creation of our logo and hold the copyright.

The CEO has since removed his LinkedIn post, and we’re awaiting his public rectification. While I understand his initial reaction seeing a similar name and icon, this could have been handled much more professionally through direct communication. If he doesn’t follow through with the agreed-upon public apology, we’ll have to resolve this in court.

Interesting tidbit: After dozens of iterations and finalizing all the geometric calculations, I actually generated the final logomark using an Elixir script that outputs an SVG:

# alfa = 60 degrees
sin_alfa = :math.sqrt(3) / 2
tan_alfa = :math.sqrt(3)

x1 = 0
y1 = 0

x2 = 100
y2 = 0

x3 = 50
y3 = tan_alfa * 50

a = 18
b = a / sin_alfa

x4 = (a + b * tan_alfa) / tan_alfa
y4 = a

x5 = 100 - x4
y5 = a

x6 = 50
y6 = tan_alfa * (50 - b)

File.write!("logomark.svg", """
<svg width="100" height="#{y3 + a}" xmlns="http://www.w3.org/2000/svg">
  <path d="
    M #{x1} #{y1} L #{x2} #{y2} L #{x3} #{y3} Z
    M #{x4} #{y4} L #{x5} #{y5} L #{x6} #{y6} Z
  " fill="#a78bfa" fill-rule="evenodd" />

  <rect x="#{a}" y="#{y3}" width="#{100 - 2 * a}" height="#{a}" fill="#a78bfa" />
</svg>
""")

This whole experience has been quite draining…I appreciate your concern about this situation! @hubertlepicki

zachdaniel

zachdaniel

Creator of Ash

I’d suggest that this is a common misconception driven typically by past experiences with things that resemble Ash. The tools we provide work independently of data interactions (although there are some cases that you can’t put X & Y together w/o a data layer or with only certain data layers, but that is just a reality of software engineering).

This is a perfectly valid resource:

defmodule MyApp.Hello do
  use Ash.Resource

  actions do
    action :say_hello, :string do
      argument :to, :string, allow_nil?: false

      run fn input, _context -> 
        {:ok, "Hello #{input.arguments.to}"}
      end
    end
  end
end

If you want to add that to a GraphQL API:

defmodule MyApp.Hello do
  use Ash.Resource,
    extensions: [AshGraphql.Resource]

  graphql do
    queries do
      action :say_hello
    end
  end

  actions do
    action :say_hello, :string do
      argument :to, :string, allow_nil?: false

      run fn input, _context -> 
        {:ok, "Hello #{input.arguments.to}"}
      end
    end
  end
end

Or if you want to build a form for it:

# make a form
form = AshPhoenix.Form.for_action(MyApp.Hello, :say_hello)

# validate it with inputs from the client
form = AshPhoenix.Form.validate(form, %{to: "fred"})

# submit it
form = AshPhoenix.Form.submit(form)
# {:ok, "Hello fred"}

The benefits that Ash provide are that in the cases that you need persistence as you often do when building applications, you can opt into it without a bunch of choreography.

defmodule MyApp.Person do
  use Ash.Resource,
    extensions: [AshGraphql.Resource],
    data_layer: AshPostgres.DataLayer

  postgres do
    table "table"
    repo Repo
  end

  graphql do
    queries do
      action :say_hello
    end

    mutations do
      create :create
    end
  end

  actions do
    defaults [:create]

    action :say_hello, :string do
      argument :to, :uuid, allow_nil?: false

      run fn input, _context ->
        with {:ok, user} <- Ash.get(user, input.arguments.to) do
           {:ok, "Hello #{user.name}"}
        end
      end
    end
  end

  attributes do
    uuid_primary_key :id
    attribute :name, :string, allow_nil?: false
  end
end

Oftentimes folks will have resources with data layers and without.

Ash isn’t about slapping an API on top of a database. Things like calculations, generic actions (that action/3 that I showed up there), and tons of configuration for how various extensions work with your resources give you the best of both worlds in terms of simple powerful tools derived from resources, with the ability to progressively enhance as complexity increases.

Obviously I’m biased, so grain of salt and all that :person_shrugging:

venkatd

venkatd

Honestly I feel like the biggest things missing are not new libs/features, but improving what we already have!

For example:

  • More contributors to the Elixir language server (the LSP team is very busy!)
  • The Livebook ecosystem
  • Improving the ergonomics of Telemetry, debugging, and performance optimization tools

Where Next?

Popular in Discussions Top

artimath
I think I’ve tried 5 different graph database libraries in the last two days and not a single one has been able to connect to a remote/lo...
New
garrison
The Elixir ecosystem is one of our biggest strengths, and the BEAM really lends itself to native implementations (e.g. Cachex over Redis,...
New
stefannovak
Hi all, I’m going to be giving a little 20 minute tech talk at my company which uses .NET C# across all of our 100ish size IT team. I’m ...
New
f0rest8
Hi everyone :waving_hand: Posting here to showcase and announce that Metamorphic is now officially live on a public-facing domain at htt...
New
neilberkman
Carson Katri from DockYard posted today about swift-erlang-actor-system, which enables Swift programs to join Erlang clusters as distribu...
New
bartblast
Hey there! :slight_smile: I’m working on updating the Hologram website home page and would love to get your input. Current situation: ...
New
derpycoder
So, anyone got a chance to look at this?!? I’m kind of glad this came along. We can just throw this into our Auth pages and won’t have t...
New
New
Crowdhailer
It is rare to use direct calls to send in elixir. The call is normally wrapped in a function which is responsible for sending the correct...
New
ronindev
Hey everyone! :waving_hand: I just wanted to recommend https://seenode.com/ for deploying Phoenix apps. I’ve been using it recently and ...
New

Other popular topics Top

Tee
can someone please explain to me how Enum.reduce works with maps
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
Jim
As a follow up to my earlier question: I have the code compiling and running but not getting a successful login from the rest server. ...
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
lk-geimfari
What is most correct way to open, read and parse JSON file with poison? For example if we have example.json file in root of some projec...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? https://hexdocs.pm/ecto/Ecto.Repo.h...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
AstonJ
by Lance Halvorsen Elixir and Phoenix are generating tremendous excitement as an unbeatable platform for building modern web application...
460 27162 124
New

We're in Beta

About us Mission Statement