ChanServ changed the topic of #crystal-lang to: The Crystal programming language | http://crystal-lang.org | Crystal 0.24.2 | Fund Crystal's development: http://is.gd/X7PRtI | GH: https://github.com/crystal-lang/crystal | Docs: http://crystal-lang.org/docs/ | API: http://crystal-lang.org/api/ | Gitter: https://gitter.im/crystal-lang/crystal
pabs has quit [Ping timeout: 264 seconds]
pabs has joined #crystal-lang
pabs has quit [Ping timeout: 240 seconds]
pabs has joined #crystal-lang
pabs has quit [Ping timeout: 264 seconds]
pabs has joined #crystal-lang
duane has joined #crystal-lang
pabs has quit [Ping timeout: 245 seconds]
pabs has joined #crystal-lang
akaiiro has quit [Remote host closed the connection]
pabs has quit [Ping timeout: 256 seconds]
pabs has joined #crystal-lang
rohitpaulk has joined #crystal-lang
duane has quit [Ping timeout: 260 seconds]
<FromGitter> <svs> Hello I have a JSON with a value 'Not Married' which I'd like to map to an enum as Not married. How can I do this?
<FromGitter> <svs> Sorry enum as NotMarried
maxpowa has quit [Ping timeout: 276 seconds]
maxpowa has joined #crystal-lang
maxpowa has quit [Ping timeout: 245 seconds]
<FromGitter> <svs> How can I map the following JSON ⏎ ⏎ ```enum MaritalStatus ⏎ NeverMarried ⏎ end``` [https://gitter.im/crystal-lang/crystal?at=5b1778a7e26c847ac8bee9c4]
maxpowa has joined #crystal-lang
<FromGitter> <bew> Directly you can't because there is a space, but you can make a converter that will replace the space by an underscore and run `MaritalStatus.parse` for it
<FromGitter> <svs> I put the enum and a converter inside a module ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b1779a5a45f930a65052dd3]
<FromGitter> <svs> but I get ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b1779ccedd06f7d1512d51f]
<FromGitter> <svs> my class is ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b1779e6b0d8ca5f1a821b25]
hightower3 has quit [Ping timeout: 248 seconds]
akaiiro has joined #crystal-lang
hightower3 has joined #crystal-lang
dragonkh has joined #crystal-lang
dragonkh has quit [Quit: My iMac has gone to sleep. ZZZzzz…]
<FromGitter> <svs> Found the answer! ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b178a0422a05f5e710521bd]
dragonkh has joined #crystal-lang
dragonkh has quit [Client Quit]
<ben___> Oh no
<ben___> Shit 😃
<ben___> @HCLarsen @Willamin about mapping hash etc. there's no need to create another hash. Simply change values or add new key and delete old key...
<ben___> key = iterator.next
<ben___> iterator = hsh.each_key
<ben___> hsh = {"foo" => "bar", "baz" => "qux"}
<ben___> hsh[key.to_s] = "dfgh"
<ben___> hsh.delete(key.to_s)
<ben___> hsh["newKey"] = "new"
<ben___> key = iterator.next
<ben___> hsh[key.to_s] = "1234"
<ben___> puts key
<ben___> hsh.each do |key, value|
<ben___> puts value
<ben___> end
<ben___> gives:
<FromGitter> <hmans> Had another dream about Crystal 0.25.0
<FromGitter> <hmans> Probably triggered by the release of Shards 0.8
<FromGitter> <hmans> Crystal 0.25 looked like a clown, and it was hunting me
<FromGitter> <hmans> Make it stop
<FromGitter> <bararchy> lol
<ben___> I had another dream too 😨😨😨 https://usercontent.irccloud-cdn.com/file/raT7FOa5/IMAG1121.jpg
<FromGitter> <bararchy> lol
<FromGitter> <bararchy> nooooo
<ben___> 😁😁
<FromGitter> <bararchy> I belive in @bcardiff
<ben___> YES
<ben___> He's traveling
<ben___> ⛵
<FromGitter> <bararchy> let's belive in he's data package then
<FromGitter> <bararchy> lol
<FromGitter> <bararchy> his
<ben___> lol
<ben___> Good way
<ben___> He's dreaming on Budapest, nice things, burgers and swimming, and talking with people never heard of Crystal or the Number 25
<ben___> 😄
<FromGitter> <hmans> /o\
<ben___> 🇧🇨🇦🇷🇩🇮🇫🇫
<ben___> Oh shit what's that?
<ben___> This should nt be
<ben___> 😃
<ben___> I don't know why the flag comes in
<ben___> Sorry 😌
<ben___> 🇬🇴🇴🇩 🇬🇺🇾
<ben___> Ok, big letters on my keyboard are stupid
<ben___> Just want to puts good guy
<ben___> 😊
<ben___> waiting is hard
<ben___> Oh no, on gitter on my phone everything is ok ... oh oh ... That happens when release is hanging
<ben___> Maybe he's getting faster if we use release flag? crystal run bcardiff --release 😁
Raimondii has joined #crystal-lang
<FromGitter> <schoening> I want to try and deploy my game server, is there a good way to kill and restart when an error occured?
Raimondi has quit [Ping timeout: 244 seconds]
Raimondii is now known as Raimondi
<FromGitter> <schoening> Sometimes I get a broken pipe thingy with kemal and it messes up everything :p
<ben___> On https://github.com/veelenga/awesome-crystal there are some dev tools to watch and restart, maybe help you
<FromGitter> <extremety1989> @schoening what kind of game is it ? can we play it?
<FromGitter> <schoening> I am trying my hands on a multiplayer tank game. I can post it here in a moment, just gotta re-deploy. ⏎ I think I found the bug that crashes the server occasionally when a connection drops and it still looks for the socket + game_object in the hash so I wrapped it in #has_key? for now..
<FromGitter> <extremety1989> @schoening fater you delploy,link it , i wanna see how much fps it has, never played games build with crystal ...
<FromGitter> <schoening> Well the client side is non optimized and using canvas so it wont tell much yet :) but the server is at least 10 times faster than the typescript version.
<FromGitter> <extremety1989> @schoening :)
<FromGitter> <bararchy> @schoening Waiting too
<FromGitter> <schoening> Haha.. the pressure is rising. Hopefully itll work
<FromGitter> <schoening> Alright. Lets see how long before it crashes.
<FromGitter> <schoening> http://46.101.168.60:3000/index.html
<FromGitter> <schoening> Well damn. That was a fail. Something messed up :p
<FromGitter> <schoening> Back to the drawing board, I post a bit later again...
<FromGitter> <bararchy> lol it's dead
<FromGitter> <extremety1989> haha
<FromGitter> <extremety1989> @schoening is your server in digitalocean ?
<FromGitter> <bararchy> well, not the worst publish event I have seen
<FromGitter> <schoening> Yeah, I killed it, I messed something up. Thats typical when I try and showcase haha
<FromGitter> <schoening> HAHA @bararchy
<FromGitter> <schoening> yes @extremety1989
<FromGitter> <schoening> Always found them very easy to work with + bitbucket
<FromGitter> <schoening> Looks like it was a git pull that got messed up, but not enough for crystal to see a problem :p
<FromGitter> <schoening> Ok, try again
<FromGitter> <schoening> I havent added client side smoothing yet, so there is that ofc.
<FromGitter> <bararchy> @schoening How do I shoot?
<FromGitter> <schoening> You just get into range
<FromGitter> <bararchy> oh
<FromGitter> <bararchy> I get killed really fast, I want to buy upgrades
<FromGitter> <extremety1989> i am 78
<FromGitter> <bararchy> are there loot crates?
<FromGitter> <bararchy> XD
<FromGitter> <extremety1989> now 90
<FromGitter> <extremety1989> 130
<FromGitter> <schoening> Yeah, its the uuid of the game_object. Just for debugging
<FromGitter> <schoening> Haha! Well, I was thinking to add health packs, and coins to upgrade, and seeker missiles you can pick up.
<FromGitter> <extremety1989> how did you hide your javscript script game logic ?
<FromGitter> <schoening> What do you mean
<FromGitter> <extremety1989> you are using javscript in front end right ?
<FromGitter> <schoening> Yes
<FromGitter> <bararchy> What about naming your tank
<FromGitter> <schoening> Yes, absolutely, there will be a login screen. Its all gonna be quite similar to other io games.
<FromGitter> <schoening> But with a much better backend :p
<FromGitter> <extremety1989> o i see
<FromGitter> <extremety1989> compressed.js
<FromGitter> <schoening> Yeah, but once I focus on the client side its gonna be TypeScript + WebPack
<FromGitter> <extremety1989> what i do not like in javascript that everybody can not hide logic
<FromGitter> <extremety1989> i mean everybody can see your game logic
<FromGitter> <schoening> Yeah thats why I at least compressed it. But the client for this game is gonna be so dumb and everything is gonna be server side anyways.
<FromGitter> <schoening> I tried using Construct 3 for client side, its a visual game editor. But it coulndt handle so many updates even with custom scripts. So I am gonna use Phaser3 I think.
<FromGitter> <schoening> Cool. Well if this turns out great then I guess its my turn to write a blog post on the crystal website lol
<FromGitter> <extremety1989> try to learn webgl2
<FromGitter> <extremety1989> well damn difficult =(
<FromGitter> <schoening> sentry is a godsend for developing btw.
<FromGitter> <schoening> Damn. Still getting that key error.
TCZ has joined #crystal-lang
pabs has quit [Ping timeout: 264 seconds]
pabs has joined #crystal-lang
DTZUZO has quit [Ping timeout: 268 seconds]
DTZUZO has joined #crystal-lang
pabs has quit [Ping timeout: 256 seconds]
pabs has joined #crystal-lang
Yxhuvud has quit [Remote host closed the connection]
<FromGitter> <fgimian> Hey guys, little one for ya
<FromGitter> <fgimian> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b17bd7a4eaffb692d86f585]
<FromGitter> <fgimian> when the two lines are commented out above, the program simply hangs and waits forever
<FromGitter> <fgimian> is that expected?
Yxhuvud has joined #crystal-lang
<FromGitter> <fgimian> test.txt is a larger text file too
<FromGitter> <fgimian> the file is 717 kb
<FromGitter> <fgimian> another issue I'm seeing is, if I attempt to read the error output first (which is empty), the script also hangs, even if I have the lines uncommented
<FromGitter> <fgimian> e.g.
<FromGitter> <fgimian> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b17be7b352b9e1a4b62a4c2]
<crystal-gh> [crystal] sdogruyol pushed 1 new commit to master: https://git.io/vh0J2
<crystal-gh> crystal/master a64e603 Johannes Müller: Use qualified type Crystal::Path in compiler specs (#6071)
<FromGitter> <anicholson> @fgimian hmm. I think `cat` would be buffering the output into the `output` pipe. It's not going to close the pipe until the process on the other end of it (your program) reads it in. Your program's not doing that, so there's a stalemate.
<FromGitter> <anicholson> w.r.t. the second one, I'm guessing `gets_to_end` is a blocking IO call. It's hogging the main thread until it gets something. It doesn't, so your program hangs. I think you'd find that if you wrapped those in `spawn` calls (to put them in different Fibers) you wouldn't see this problem.
<RX14> @fgimian thats expected
<RX14> pipes have a limited fixed-size buffer
<RX14> cat writes into the buffer, but if you don't read from the buffer it will fill up the buffer and wait for you to read from the buffer
<FromGitter> <fgimian> interesting, thanks guys
<RX14> which you never do, and the pipes dont get closed until cat exists
<RX14> so you deadlock
<FromGitter> <fgimian> I suppose the tricky thing is, if you're executing an external program, it's hard to know if it will write to stdout or stderr
<FromGitter> <fgimian> so which one do you read first?
<RX14> both
<RX14> at the same time
<RX14> using fibers
<FromGitter> <fgimian> gotcha
<RX14> alternatively, you can just pass an IO as the output and error arguments
<RX14> for example... a String::Builder
<FromGitter> <fgimian> very interesting problem indeed, I haven't come across it before tbh
<RX14> and then it's nice and neat
<FromGitter> <fgimian> gotcha, out of interest, why would that work as opposed to the pipe?
<FromGitter> <fgimian> (forgive me if that's a stupid question)
<FromGitter> <fgimian> I'm just looking at process.cr and trying to understand it as we speak in fact
<RX14> because a String::Builder doesn't have a fixed sized buffer
<RX14> it'll read up to 2 gigabytes
<FromGitter> <fgimian> aaah wow
<RX14> then fail in a nasty way
<FromGitter> <fgimian> I see
<RX14> because we have no overflow detection lol
<FromGitter> <fgimian> also @anicholson thanks so much for the reply too
<FromGitter> <fgimian> lol!
<FromGitter> <fgimian> oh dear
<FromGitter> <fgimian> :)
<FromGitter> <anicholson> yw @fgimian - now you're set with pipes :)
<RX14> internally Process.new with an IO uses a pipe
<RX14> then spawns a fiber to read from the pipe and write in the IO
<RX14> so really it's the same thing going on either way
<RX14> it's just one is neater to write and already in the stdlib
<FromGitter> <fgimian> awesome, really appreciate all the help!! 😄
<RX14> note that also gets_to_end uses a string builder internally so it really is the same code just layed out differently
<FromGitter> <fgimian> ah yes
<FromGitter> <fgimian> I'll try out String::Builder now and see how I go
<RX14> you can read how it works internally if you really want to understand it fully!
<RX14> one of my favourite parts of crystal
<RX14> reading the source is so easy
<FromGitter> <anicholson> now it's my turn with a Q!:
<FromGitter> <anicholson> Consider the following: https://gist.github.com/anicholson/6a5dd95590f7faed69c0ef9021c09ed0
<FromGitter> <fgimian> RX14: Totally agreed, the source of Crystal is beautiful
<FromGitter> <anicholson> This fails to compile on 0.24.2, claiming `Error` doesn't implement `andThen`. What have I missed?
<RX14> heh
<RX14> @anicholson you havent typed the block in the subclass
<RX14> also can i see the full error just for interest?
<FromGitter> <anicholson> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b17c4a2b6eece791de35346]
<RX14> @anicholson you can't usually just write `&block` with no arguments because blocks need to have their arguments typed
<FromGitter> <anicholson> ahh
<RX14> in `andThen` in Ok you `yield self`, which means your argument is typed
<RX14> but in `Error` you don't
<RX14> i'd recommend pulling down the explicit type annotations everywhere
<RX14> @anicholson https://carc.in/#/r/4810
<RX14> also `Result` class isn't needed in crystal, so I hope you're only doing this for a learning excersise
<FromGitter> <anicholson> :P
<FromGitter> <anicholson> @RX14 if I wanted all monads all the time I'd go and write some Haskell ;)
<crystal-gh> [crystal] sdogruyol pushed 1 new commit to master: https://git.io/vh0Iw
<crystal-gh> crystal/master 9ddaf28 Johannes Müller: Add handling for invalid responses to Response.from_io (#5630)
<FromGitter> <anicholson> but it's still a useful way of thinking about flows
TCZ has quit [Quit: Leaving]
rohitpaulk has quit [Ping timeout: 256 seconds]
rohitpaulk has joined #crystal-lang
<travis-ci> crystal-lang/crystal#a64e603 (master - Use qualified type Crystal::Path in compiler specs (#6071)): The build passed. https://travis-ci.org/crystal-lang/crystal/builds/388711877
<DeBot> https://github.com/crystal-lang/crystal/pull/6071 (Use qualified type Crystal::Path in compiler specs)
<FromGitter> <fgimian> In case anyone is really bored, I wrote a little blog post an whY I'm hoping Crystal will be my next language: https://fgimian.github.io/blog/2018/06/06/why-crystal-is-my-next-language/
<FromGitter> <fgimian> :)
rohitpaulk has quit [Ping timeout: 260 seconds]
rohitpaulk has joined #crystal-lang
TCZ has joined #crystal-lang
<FromGitter> <faustinoaq> @fgimian Very Nice 👍
<travis-ci> crystal-lang/crystal#9ddaf28 (master - Add handling for invalid responses to Response.from_io (#5630)): The build passed. https://travis-ci.org/crystal-lang/crystal/builds/388719815
<DeBot> https://github.com/crystal-lang/crystal/pull/5630 (Add handling for invalid responses to Response.from_io)
<FromGitter> <fgimian> thank you so much @faustinoaq 😄
<FromGitter> <Blacksmoke16> i hope you did the crystal test with `--release` ;)
<FromGitter> <svs> @fgimian you said precisely what was on my mind. Also I wanted to use a language with type safety but without union types it becomes very unweildy very quickly. I have the exact same problems with Go, Elixir, Rust..... Crystal just hits that sweet spot in terms of language design. Hope it lives long!
<FromGitter> <fgimian> @Blacksmoke16 yep I did 😄
<FromGitter> <fgimian> @svs awesome! me too 😄
<FromGitter> <fgimian> I'll be honest, I hadn't heard of Crystal until very recently. I was basically looking at Nim as my choice.
<FromGitter> <fgimian> And fortunately a friend of mine at work told me about Crystal
<FromGitter> <fgimian> so it all worked out in the end
<FromGitter> <fgimian> my team at work is using Elixir for all their new work, and they're quite happy with it; it fits their use case well
<FromGitter> <fgimian> I personally work on platform automation, so mostly I'm dealing with Terraform, CloudFormation, Jenkins .etc, and some scripting in Python. My initial goal with Crystal is indeed automation for my own personal projects.
<FromGitter> <fgimian> 😄
<FromGitter> <Blacksmoke16> write a program to do your programming for you ;)
TCZ has quit [Quit: Leaving]
<FromGitter> <fgimian> hahaha, that's what we all need 😄
duane has joined #crystal-lang
<FromGitter> <S-YOU> Static binaries on OSX is actually possible, if you implement everything like Go 😄
rohitpaulk has quit [Ping timeout: 256 seconds]
<FromGitter> <S-YOU> Nice to read that, @fgimian 👍
<FromGitter> <sdogruyol> please submit your questions before the session :) It's gonna be fun
<FromGitter> <fgimian> thank you so much @S-YOU 😄
TCZ has joined #crystal-lang
dragonkh has joined #crystal-lang
dragonkh has quit [Quit: My iMac has gone to sleep. ZZZzzz…]
<FromGitter> <hugoabonizio> @sdogruyol 🎉
TCZ has quit [Quit: Leaving]
dragonkh has joined #crystal-lang
<ben___> @fgimian great blog post 😊 🎉
<ben___> Q&A is out of my time 😣 maybe I can switch for short views 😊
<FromGitter> <schoening> Its not possible that an array is being modified while I am looping over it inside a fiber right? The program halts while the fiber executes?
akaiiro has quit [Remote host closed the connection]
akaiiro has joined #crystal-lang
rohitpaulk has joined #crystal-lang
<FromGitter> <Grabli66> Hi! Is it possible to get a result of a block in this example? https://play.crystal-lang.org/#/r/484c
<FromGitter> <j8r> look at `#send` and channels
<FromGitter> <bcardiff> @Grabli66 https://play.crystal-lang.org/#/r/484e
<FromGitter> <bcardiff> you need to add some type information in the block in this case
<FromGitter> <Grabli66> Great thanks.
<FromGitter> <j8r> I didn't understand the question 😅
dragonkh has quit [Quit: My iMac has gone to sleep. ZZZzzz…]
pabs has quit [Ping timeout: 248 seconds]
pabs has joined #crystal-lang
<ben___> @schoening Crystal isn't parallel yet, so you can do only one (blocking) thing per time yet - the scheduler times this, you can communicate via channels or switch via Fiber.yield
GoldenBear has joined #crystal-lang
dragonkh has joined #crystal-lang
<FromGitter> <bew> @schoening if you have an IO operation or a sleep or a channel send/receive, it could change. Otherwise, no it won't change. (because Cr is not parallel)
sz0 has joined #crystal-lang
That_Guy_Anon has joined #crystal-lang
pabs has quit [Ping timeout: 240 seconds]
<FromGitter> <bararchy> When RX14 finishes his new pchan shard it would be possible using that (to parallel)
<RX14> no it wouldn't
<RX14> because pchan has no shamed memory
<RX14> shared*
<RX14> ok - no shared heap
pabs has joined #crystal-lang
akaiiro has quit [Read error: Connection reset by peer]
akaiiro has joined #crystal-lang
rohitpaulk has quit [Ping timeout: 248 seconds]
nathanj has joined #crystal-lang
ua_ has joined #crystal-lang
ua has quit [Ping timeout: 248 seconds]
Groogy has joined #crystal-lang
pabs has quit [Ping timeout: 248 seconds]
pabs has joined #crystal-lang
aurieeeh has quit [Ping timeout: 248 seconds]
pabs has quit [Ping timeout: 240 seconds]
pabs has joined #crystal-lang
pabs has quit [Ping timeout: 240 seconds]
pabs has joined #crystal-lang
<faustinoaq> Would be possible to minimize this: https://codegolf.stackexchange.com/a/166376/80978 ? ;-)
<FromGitter> <fgimian> Thanks so much ben__, sorry I had gone to bed 😄
<FromGitter> <fgimian> @faustinoaq Thanks for the comment buddy, I got an email notification about it but for some reason it's not appearing on my blog page. Did you delete it by any chance?
<FromGitter> <fgimian> Or is Disqus just being weird 😄
<faustinoaq> @fgimian No, I didn't delete it :)
<faustinoaq> @fgimian Maybe Disqus detected it as spam :-P
<OvermindDL1> Disqus is very spam-detection happy, it hasn't caught any legit spam on my blog but it catches lots of legitimate postings... >.<
<FromGitter> <fgimian> That's so weeeeeird, let me see what I can do. I'm so sorry about that, it was an awesome comment and I would really love to see it on my post.
<FromGitter> <fgimian> @OvermindDL1 lol yeah
<OvermindDL1> The owner can check the spam list in disqus though, but they get no message about it, have to manually check it, it's irritating
<FromGitter> <fgimian> I'm just checking no, I haven't done it before so just trying to find it in the Disqus admin page
<FromGitter> <faustinoaq> @fgimian lol
<FromGitter> <fgimian> oh it was lmao
<FromGitter> <faustinoaq> I'm a spammer :-P
<FromGitter> <fgimian> I'm so sorry, stupid Disqus
<FromGitter> <fgimian> you are!!!
<FromGitter> <fgimian> hahaha
<FromGitter> <fgimian> 😄
<FromGitter> <fgimian> let me see what I can do mate
<FromGitter> <fgimian> sorry about this
<FromGitter> <faustinoaq> hehe, no problem! 😉
<FromGitter> <fgimian> 😺
<OvermindDL1> Lol
<FromGitter> <fgimian> you called it @OvermindDL1 hahaha
<FromGitter> <fgimian> 😄
duane has quit [Ping timeout: 256 seconds]
<FromGitter> <fgimian> just approved
<FromGitter> <fgimian> man, there's so much "spam" here ... this is terrible
<FromGitter> <fgimian> most these comments are legit
<FromGitter> <fgimian> :(
<FromGitter> <fgimian> 😟
<FromGitter> <fgimian> out of all the comments marked as spam (maybe 10 - 15), only 1 was ACTUALLY spam 😄
<OvermindDL1> Eyup, that's been my experiences too
<OvermindDL1> It really sucks for the commenter, makes them think their comment wasn't wanted
<FromGitter> <fgimian> tottally!
pabs has quit [Ping timeout: 264 seconds]
pabs has joined #crystal-lang
baweaver is now known as lemur
lemur is now known as baweaver
<FromGitter> <fgimian> What do you guys think of the following code to implement a plugin system in Crystal?
<FromGitter> <fgimian> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b186afedb98e07a9a7824c9]
<FromGitter> <fgimian> I'm not aware if there's a better way but I think this looks rather pretty and elegant.
TCZ has joined #crystal-lang
<FromGitter> <bew> Why is action_name a property? In which case do you modify it?
<FromGitter> <fgimian> I actually was hoping for that to be static, more like a constant. Perhaps I should make it a constant in fact.
<FromGitter> <fgimian> can you think of a scenario where you would want it to be modified after being defined in this case?
<FromGitter> <bew> No, a constant is a good idea i think
dragonkh has quit [Ping timeout: 264 seconds]
TCZ has quit [Quit: Leaving]
sz0 has quit [Quit: Connection closed for inactivity]
TCZ has joined #crystal-lang