[HN Gopher] Marten: a Crystal web framework
___________________________________________________________________
 
Marten: a Crystal web framework
 
Author : ellmetha
Score  : 68 points
Date   : 2022-10-30 20:22 UTC (2 hours ago)
 
web link (martenframework.com)
w3m dump (martenframework.com)
 
| dom96 wrote:
| It's quite amazing how many web frameworks are built for Crystal
| (in comparison to other languages of the same size, for example
| Nim)
 
| wheels wrote:
| I'd love to hear stories about actual Crystal use.
| 
| Of all the languages I've seen emerge in recent years, it was the
| one I was most conceptually fond of.
| 
| It's basically (progressively-) statically typed Ruby, but fast
| (compiled). I enjoy writing Ruby, but I hate maintaining it.
 
  | noaheverett wrote:
  | We use it in production for our products at https://ark.fm and
  | are actively working to move all of our Rails apps over to
  | Crystal which ironically this framework looks great and may be
  | a good choice for us. (Thank you to the author!)
  | 
  | Our email service runs an image proxy (to hide your IP from
  | email trackers) with probably about 30-50 lines of code in
  | Crystal that's been in production for multiple years and it
  | just works.
  | 
  | Current project (in the cloud hosting space) that will heavily
  | use Crystal for backend management and WASM which was recently
  | introduced into Crystal and is a game changer for our use-case.
  | 
  | Also wrote a command-line tool with it and it feels like I'm
  | cheating at how easy it is to do so.
  | 
  | Coming from the Ruby/Rails world where you have to cap
  | deploy/bundle etc to push to a production server and hoping
  | nothing breaks on dependancies makes Crystal's single binary
  | deploy a breath of fresh air...not to mention the performance.
  | We run our own hardware so being able to (eventually once we've
  | moved over fully to Crystal) run the same workloads on LESS
  | hardware with electric prices spiking is financially
  | attractive.
  | 
  | As you can tell I'm a fan boy. I'm betting heavily on Crystal
  | and going all in with our stack.
  | 
  | Did I mention it is fast?
 
  | shafyy wrote:
  | Kagi (the search engine) is built on Crystal.
 
  | fdr wrote:
  | The Crunchy Bridge CLI is written in crystal:
  | https://github.com/CrunchyData/bridge-cli/. The program that
  | monitors databases is likewise a crystal program. There are a
  | few other crystal programs rolling around.
  | 
  | My biggest grievance with Crystal is the lack of incremental
  | compilation. I understand why it's difficult to achieve given
  | the language model, and some of the conveniences of that model.
  | I've been watching the Crystal Interpreter with interest, it
  | would be pretty cool if it could speed up my `M-x crystal-spec-
  | line` interactions, along with all the other usual benefits of
  | an interpreter.
  | 
  | On the other hand, there's a lot to like about Crystal: it has
  | a convenient yet powerful type system, good error messages,
  | good support for invoking C subroutines in libraries, and
  | generates efficient object code in a straightforward manner.
 
  | compumike wrote:
  | My side project https://totalrealreturns.com/ is now about 5k
  | lines of Crystal. There are some rough edges: in particular I
  | think it could use a better templating solution (a port of HAML
  | would be ideal!), and there are some failure modes with the
  | Redis connection pool that have required workarounds.
  | 
  | This includes unit tests: the built-in spec framework is great
  | and much like rspec. https://crystal-
  | lang.org/reference/1.6/guides/testing.html
  | 
  | I'm now starting to use Crystal for internal backend
  | infrastructure and microservices.
  | 
  | For anyone who wants to kick the tires on Crystal, I built a
  | crystal-docker-quickstart project template:
  | https://github.com/compumike/crystal-docker-quickstart works
  | without having to install anything locally. (Assuming you have
  | docker.) You can have your own, home-built "Hello world" static
  | binary in under a minute:                   git clone
  | https://github.com/compumike/crystal-docker-quickstart.git
  | my_app && cd my_app && ./d_dev         # in the shell that
  | appears:         make && out/my_app
  | 
  | Then just edit src/main.cr and you're off and running :)
 
    | paulgb wrote:
    | That is one fast-loading page, especially for (what looks to
    | be) dynamic data!
    | 
    | Are you doing anything special or just using a good CDN?
 
      | compumike wrote:
      | Thanks :) No CDN actually -- it's just a side project
      | served straight from a single VPS at the moment.
      | 
      | You're probably just seeing the speed of response caching
      | (which I've written in Crystal too, using Redis and local
      | disk as storage backends). If you request a new ticker
      | symbol that isn't already cached, or specify custom date
      | ranges, it will recompute or even have to fetch data from
      | upstream data provider, and those requests will take a bit
      | longer.
      | 
      | Also, the whole site is currently served up as a single
      | HTTP request, except for a few external JS and CSS files
      | (Bootstrap, uPlot) which are served from public CDNs.
 
    | karol wrote:
    | Nice project, learned a bit from it about some Vanguard funds
    | I didn't know about previously.
 
  | nerdponx wrote:
  | I enjoyed poking around at Crystal, but its library ecosystem
  | seems heavily oriented towards web development (understandably,
  | because its creators are a web dev consultancy), and I don't do
  | much web development for my hobby programming.
  | 
  | Also, I found that its static analysis tooling (eg LSP server)
  | was really slow. Compiling small programs was also rather slow,
  | and it generated large binaries.
  | 
  | I also had some difficulty understanding the documentation
  | related to importing and including modules and classes; it
  | seemed written from a perspective assuming that the reader
  | already knows Ruby, which I do not.
  | 
  | At the time, I was also curious about Common Lisp and Nim, so I
  | spent a bunch of time learning the former, and have lately been
  | writing small personal scripts/tools using the latter.
  | 
  | My experience using Python for backend web development has been
  | mixed. If I had to do work like that professionally in the
  | future, I would be happy to do it in a language like Crystal.
  | It seems a lot more comfortable to me than Go, less
  | intimidating than a JVM language (Kotlin?), and less "weird"
  | than Common Lisp or a functional language like OCaml.
  | 
  | It doesn't seem like a bad choice for a company willing to
  | invest in engineers while they learn the language, and maybe
  | invest in writing some of their own libraries while the
  | ecosystem is still young. I felt like I was able to get
  | productive fairly quickly.
  | 
  | I think an interesting project would be to write a fairly
  | simple web server (maybe some basic REST CRUD thing using
  | idiomatic code) in several languages and frameworks, and
  | compare their performance, ease of getting started, and
  | complexity of the code. I had started working on this myself at
  | one point, and it seems like it could be worthwhile to pick up
  | again, especially now that all of the language ecosystems I had
  | in mind have matured a little bit.
 
    | mhenders wrote:
    | Regarding different languages and frameworks, I found this
    | informative: https://www.youtube.com/watch?v=FQPlEnKav48
 
  | hamandcheese wrote:
  | > I enjoy writing Ruby, but I hate maintaining it.
  | 
  | Sorbet helps immensely in this regard (though it does perhaps
  | make writing ruby a bit less joyful). The Sorbet language
  | server works great (at least with VSCode) - I have pretty
  | reliable go-to-definition and intellisense.
  | 
  | I would imagine that if crystal had a decent language server
  | the experience would be even better than Ruby+Sorbet.
 
    | wheels wrote:
    | Refactoring tools are nice (I guess; I've honestly only used
    | them in Java; I'm mostly an Emacs person), but my main gripes
    | with Ruby maintenance are harder to fix with type
    | annotations:
    | 
    | - In duck-typed languages you have to write a lot of tests to
    | do verify things that the compiler does for you in statically
    | typed languages. That neuters much of the benefit of the
    | concision of such languages. Crystal shoots for the best of
    | both worlds. (Static type checking, but usually without
    | explicit signatures.) My main refactoring tool in statically
    | typed languages is the compiler: if I break something, it'll
    | tell me.
    | 
    | - Monkey-patching, open classes, etc. I do it too. Pretty
    | much every Ruby-ist does. But it makes it damn near
    | impossible to track down bugs sometimes, because even finding
    | out what file the relevant code is in isn't trivial. Again,
    | Crystal seems to mostly side-step that pitfall.
    | 
    | - Speed. I don't even attempt to write fast code in Ruby
    | (though I have written a few C++ extensions for Ruby in a
    | pinch). But if I could get near-to systems-language level
    | performance out of something that was almost Ruby, that'd be
    | pretty amazeballs.
 
      | galaxyLogic wrote:
      | > My main refactoring tool in statically typed languages is
      | the compiler: if I break something, it'll tell me.
      | 
      | That really helps. But what's even better in practice is if
      | compiler is integrated into an IDE which can highlight
      | type-errors already while you are editing the code, before
      | you explicitly invoke the compiler. For instance Eclipse
      | IDE does that for Java code.
      | 
      | If you need to run the compiler by hand before you get any
      | error-messages it becomes a huge delay and you lose the
      | immediate feedback which is needed to keep your focus on
      | the code, not on compiler error-messages.
 
      | pmontra wrote:
      | > In duck-typed languages you have to write a lot of tests
      | to do verify things that the compiler does for you in
      | statically typed languages
      | 
      | Would you give some examples? I think I'm testing only
      | functionality but maybe I'm not realizing that I'm testing
      | the types of arguments.
 
        | wheels wrote:
        | Sure.
        | 
        | Ruby:                 def foo(a)         raise
        | ArgumentError unless [ :bar, :baz, :quux ].include?(a)
        | return 1       end            def test_foo
        | assert_raise(ArgumentError) { foo(1) }
        | assert_raise(ArgumentError) { foo(:moo) }
        | assert_instance_of(foo(:bar), Integer)       end
        | 
        | In C++ I'd write:                 enum class Value
        | {         Bar,         Baz,         Quux        };
        | int foo(Value a)       {         return 1;       }
        | 
        | In a strongly typed language you don't need to do any of
        | the input validation. I'm not sure that I'd do that level
        | of granularity of tests in an application, but I spend a
        | lot of times writing libraries, where it's pretty
        | important.
        | 
        | You also _have_ to call all code paths with your tests in
        | Ruby because otherwise you won 't hit errors. Just basic,
        | "this thing runs, the methods it calls exist, it returns
        | a value, and it's of this type" is all guaranteed in a
        | strongly typed language and doesn't need to be explicitly
        | tested.
 
        | wheels wrote:
        | Actually, here's another example:                 def
        | foo(a)         if a == 1           bar         else
        | baz         end       end            def test_foo
        | foo(1)         foo(2)       end
        | 
        | In the C++ equivalent there's no need to test those
        | values because the compiler will tell you that the
        | methods exist. In Ruby you need to test them so that you
        | catch those paths in refactoring.                 void
        | foo(int a)       {         if(a == 1)           bar();
        | else           baz();       }
 
  | freediver wrote:
  | The backend for Kagi Search is powered by Crystal.
 
| cutler wrote:
| Rails clone?
 
  | joshmn wrote:
  | What's your definition of Rails clone? MVC? If it is, sure,
  | yeah, this and a whole bunch of other frameworks are Rails
  | clones. Laravel is a Rails clone. Django is a Rails clone.
  | We're all Rails clones!
  | 
  | Does the design of some of the logic look heavily-inspired by
  | Rails? Sure, and I think it's a great choice.
  | 
  | But in reality, calling it a Rails clone is a disservice to
  | Rails. Rails is much more than MVC and patterns implemented
  | from Patterns of Enterprise Application Architecture. The power
  | of Rails isn't in any single one of the patterns -- sure, it
  | may have started that way when it was common to ship PHP copy-
  | pasted from php.net and deployed using Filezilla (or
  | explorer.exe!) -- but since, what, 2.3? the power of it has
  | been it's ecosystem: nothing can come close to the vastness and
  | maturity of Rubygems.
 
    | Scarbutt wrote:
    | I don't know, the vastness of the JS ecosystem seems bigger
    | to me? I have come across many third party service providers
    | that do not offer Ruby SDKs but do for JS,Java,Python etc...
 
    | 0xblinq wrote:
    | I think the Laravel ecosystem is pretty comparable, if not
    | better, than the rails one.
 
  | jbverschoor wrote:
  | Yeah, I never like it when they don't simply state that's the
  | case.
 
| gortok wrote:
| Not to be confused with the C# document database built on
| Postgres.
| 
| https://martendb.io/
 
| mtrycz2 wrote:
| All I want form a framework is for it to be boring.
| 
| Am I the only one? Am I crazy?
 
  | jstummbillig wrote:
  | I certainly don't mind if a framework is boring, if it comes
  | with qualities I am interested in. Being boring is not one of
  | them - but neither is being exciting.
 
  | [deleted]
 
| jbverschoor wrote:
| Congrats with the release and docs. Curious about:
| 
| Refresh/compile times, esp with more models and controllers
| 
| Do you get a single binary for deployment which includes all
| assets, such as a .war?
| 
| Is there debugger, similar to the one in rails?
 
  | wazbug wrote:
  | Not a Crystal expert, but the Marten tutorial mentions a
  | `crystal play` command that will run a web-interface with an
  | interactive "playground" that you can interact with your
  | program's functionality in:
  | https://martenframework.com/docs/getting-
  | started/tutorial#in....
 
  | chrisseaton wrote:
  | > Do you get a single binary for deployment which includes all
  | assets, such as a .war?
  | 
  | I think they mean such as an .exe
  | 
  | > Is there debugger, similar to the one in rails?
  | 
  | What debugger are you using for Rails? In my experience Rails
  | has been significantly lacking in a debugger (it's improved
  | recently with the debug gem.)
  | 
  | (Not an expert.)
 
| mfkp wrote:
| My company has donated thousands of dollars to the crystal
| development budget. Always excited to see new additions to the
| ecosystem!
| 
| This framework is looking very nice if you're looking for a
| rails-style framework. I'll definitely give it a shot on my next
| project.
 
| viraptor wrote:
| I'd love to see two docs there:
| 
| - What's different from Lucky https://luckyframework.org/
| 
| - What's different from Amber https://amberframework.org/
| 
| There's probably something exciting there, but finding out the
| differences in features for yourself... please don't make me do
| that.
 
| prh8 wrote:
| Love Crystal and love seeing it here more. Ruby has been day job
| for years, but Crystal is so much fun for side projects and
| random things to build. Easily approachable, especially for Ruby
| devs.
 
___________________________________________________________________
(page generated 2022-10-30 23:00 UTC)