[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)
        
 (HTM) web link (martenframework.com)
 (TXT) 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)