00:00:19.600
How's everybody day been? Among many other things, here at this final Rails Conf, I am fulfilling a 15
00:00:26.800
years long dream of speaking on the conference stage as an official representative of the conference. Thank you to everybody for showing up here and
00:00:33.600
supporting our lightning talks. Uh this has always been a way for people new to the community or people new to public
00:00:39.280
speaking to uh take a chance and get up in front of people and tell us what they know. And it's always been one of my
00:00:46.239
favorite parts of the conference. And I hope that we will have a great hour and a half together with our amazing Lightning speakers. Some of whom are
00:00:52.800
scholars, some of whom are longtime community members, all of whom have been brave enough to come up here and give
00:00:57.840
what is probably a talk on less preparation than they would like because that's how lightning talks go. But it's going to be great for everybody and
00:01:03.840
we're I hope that we will show the uh support of the Ruby community. Everybody's going to have five minutes
00:01:09.840
and if they don't, I have a keep things moving along gone which hopefully we will never have to strike. Uh, thank you
00:01:17.040
so much for being here. And I will introduce our first speaker, Zoe Stein Cam.
00:01:26.960
I forgot to get my photo. There we go. All right, we're good. All right. So, my
00:01:32.079
name is Zoe Steinamp. I work for a company called ClickHouse DB. We are an analytical database. I'll do the speech
00:01:38.000
later on, but basically, we created an open source Ruby gem analytics on top or
00:01:43.119
rather embedded within our database. The information is there. So, let me go through it. So, SQL Analytics on Ruby
00:01:49.280
gem downloads. So, we have every gem ever downloaded. All that information is here. It's free to use completely for
00:01:55.520
the community. You can I'm going to actually do a demo so I can show you where you can run it. We're actually soon going to have a website. It should
00:02:01.680
be out in like the next week or two, I want to say. I've been watching the PRs on it. Fast SQL queries. So, if you know
00:02:07.759
SQL, you can query it. I'm also going to show you how to query it with our AI agent. And you don't have to know SQL.
00:02:12.879
It'll do it for you. reliable and secure. That's just because ClickHouse Cloud is secure. There's nothing
00:02:18.080
particular about the Ruby gem downloads being secure. So, what can you ask it? You can ask what are the most downloaded
00:02:24.480
gems? What are emerging gems? Downloads over time, downloads of a Ruby version over time, downloads by system, blah
00:02:31.120
blah blah. Very exciting. Uh, so just for context, at first there was Python. So, let me really quick open this link.
00:02:37.599
This is the analytics for Pi Pi packages. And very soon this will be the same kind of website we're building for
00:02:42.800
Ruby gems. It's just not yet done. But basically what you can do is you can do something like here's the top repo right
00:02:49.280
here. I don't know what this one is, but clearly it's very popular. And you can do super cool stuff like this. Like this is querying Clickhouse right now in real
00:02:56.720
time. And it's doing it this quick. I just picked some random time frame. Obviously I didn't do anything super
00:03:02.000
fancy, but yeah, all these graphs are being uh basically filled in by click and that's how fast it is and that's how
00:03:08.239
good it is for analysis. So anyways, at first there was this Python library. Oh yeah. Then we got an email from Ruby
00:03:15.280
Central from Dale and or no, sorry, to my co-orker Dale from Marty. Just for reference here, Dale actually built this
00:03:21.440
out, but he's recently had arm surgery and it's not really great to fly when you've had surgery. So he asked me very
00:03:27.360
nicely, "Hey Zoe, can you please go represent our awesome Ruby Gems project for me here at the conference?" So
00:03:33.040
that's how I landed here. But basically, he got an email and he was like, Marty was like, "Hey, this is pretty cool for,
00:03:38.319
you know, the Python community, but what about us, the Ruby community? What do what are we getting out of this? Come on. And so we did it. We went ahead and
00:03:46.080
got all this data into ClickHouse Cloud. We went ahead and loaded it in in multiple different ways for you to
00:03:51.120
access it. And like I said, very soon there will be a UI interface to interface with as well. We got three
00:03:56.959
data sets. When we did this, we have the download logs, the daily aggregate downloads, and the weekly data dumps.
00:04:02.720
And this is all the information as to where this all comes from. Most of it's covering data all the way back to 2013
00:04:08.799
is some of the oldest stuff for the download logs. I think it's just from 2017 because they might not have been uh
00:04:15.120
you know tracking them any any earlier than that. But basically to do it you could do the SQL playground. I'm going
00:04:21.840
to show like basically what that would look like in the terminal. Um but you can also just use here. Let me pull up
00:04:27.680
my terminal here. Yeah, this is Oh, this is really tiny. Give me a second. This
00:04:32.800
is There we go. a little bit bigger now. So, basically what I've done here, and this has already been pre-loaded just
00:04:39.199
because I get nervous with internet, but basically I went ahead, I loaded in the Ruby gems. I asked it, this is a very
00:04:46.000
like this is a SQL query obviously, so this is a little bit longer, but I was basically asking for how many downloads there were in a specific week and
00:04:52.880
basically the past uh I think this is asking for the past six weeks or past eight eight weeks. Basically, how many
00:04:58.400
downloads there have been. And I don't know why there was such a slow week right here. maybe it was a holiday or something, but on average it's getting
00:05:04.320
between, you know, 13,000 to 20,000 give or take. Uh, and you can see the overall
00:05:09.520
downloads. So, that's one way to do it. That's probably not the most like easy way to do it. We also have the SQL
00:05:14.720
playground. This is uh available online. It's web- based. You can basically come here and come on the left hand side.
00:05:21.360
Sorry, it's a little small to see, but basically you'll see the words Ruby gems, which then I just clicked on and
00:05:26.400
closed. You'll see Ruby gems. You can click on something like emerging gems. You can run it and you will see some of
00:05:32.560
the emerging gems. For example, GitLab crystal ball. I don't know what this does, but it's emerging. It's getting
00:05:38.400
more downloads. It's getting more popular. Great. You can hit on any of these and be able to see that. And
00:05:43.680
finally, this is the agent house that I was talking about. So, this is llm.clickhouse.com.
00:05:48.960
Anyone can access it. It has data from a few different sources. Like you can see some of my old queries here are about
00:05:55.120
like flight data. In fact, this one specifically flight data for Chicago to New York and how commonly it's delayed
00:06:01.360
and all this other stuff. One of these is actually really funny because it noticed COVID and put like a black dot
00:06:06.479
on it and was like, "Look, there was no delays during this time period." And you're like, "Yes, there's no flights. Congratulations." But basically with
00:06:13.440
Ruby Gems, you can do the same. So yesterday, for example, I asked it um I
00:06:18.560
think I asked it, yeah, how many downloads this week on Ruby gems? And then specifically, I think I also asked it a really dumb question. Yeah, I also
00:06:24.960
asked it what is Ruby gems just for the I just was testing agent house. I really wanted to know and then we also wanted
00:06:30.639
to know how many times the bundler gem had been downloaded. But what this is doing on the background is it's actually
00:06:36.000
running select queries. So it's writing the SQL it's querying click house but when you ask it questions like here let
00:06:42.800
me go grab let me go grab this. Okay, can I copy this? I really hope I'm
00:06:48.160
copying it. Yeah, there we go. There's some lines in
00:06:55.840
here I should probably get rid of. With my luck, that will break agent house.
00:07:02.479
I realize now I just asked a horrible question. How often? What does often mean? Well, anyways, it's going to run
00:07:08.000
it. It's going to go run the select query. It has been downloaded almost a million times total. Um, that's quite a
00:07:13.919
specialized gem compared to the bundler. I think that's my Yep, that's the gong. All right, my demo's done. I really
00:07:20.240
quick just wanted to do this. So, we're doing a social after this event wraps. If you grab this QR code here, you are
00:07:26.639
welcome to join us. Uh, thank you, Zoe. Next up, Jeremy Smith.
00:07:34.080
Hey, everybody. This talk is called Programming in the Low Memory Environment of Your Brain. Or
00:07:39.759
it might just be mine. We'll see. Uh, when I saw the lightning talk sign up, I thought, "Oh, I'd like to do
00:07:45.520
that." But, uh, I don't know what I'd give a lightning talk about. And if I just trusted my memory, I wouldn't be
00:07:50.720
standing here. Lucky for me, I don't. I keep a doc called conference talk ideas. I scan the list and this one popped out.
00:07:58.080
And I had totally forgotten that I had shared this idea on Twitter last year and Rails OG Ben Orinstein had
00:08:03.599
encouraged me to to uh start with even the smallest version of this to begin with. And then it clicked. Oh yeah, a
00:08:09.520
lightning talk is the perfect small version of this. So I want to ask you, is it possible that you might be
00:08:15.039
limiting yourself by an overreiance on your memory? All of us are dealing with the
00:08:20.240
relatively small context window of our working memory. In addition to natural limits, our memory is impacted by a
00:08:26.479
whole slew of things, many of which are totally outside of our control and can change very suddenly. And chances are at
00:08:32.880
any given moment, we don't realize the severity of the limitations because we don't remember what we've forgotten.
00:08:39.440
Thankfully, that doesn't have to spell doom as we humans are tool using animals. But in my experience, tools are
00:08:45.920
not the hard part. The hard part is getting over our resistance. Here are
00:08:51.120
all the objections I've I've used to have to relying less on my memory and what I would say to my past self now.
00:08:58.320
I should I should be able to do it on my own. Uh except your fallible memory. There are no points awarded for doing it
00:09:03.519
the hard way. What worked uh for you when you were younger may not scale with greater life demands and difficulties and greater responsibility and
00:09:09.519
criticality. If it's important, I will remember it. You will sometimes, but your hit rate
00:09:14.560
will be much lower than you uh realize. I have plenty of experiences now that show me differently. I won't be doing
00:09:20.800
this again. Sometimes this is clearly untrue, like filing taxes or installing that one package with homebrew. And
00:09:27.600
sometimes you are playing the odds, but more based on hope than on evidence.
00:09:33.040
The cost of relying on tools will be higher than the benefit. It's possible, but you are likely overestimating what's
00:09:39.440
enough to be effective and underestimating the future time saved. You can make tiny experiments to build
00:09:45.040
confidence. I will be collecting too much information or hoarding. Storage is
00:09:51.440
cheap. Spending hours looking for something you've lost or trying to reproduce something that you've done before is expensive.
00:09:57.680
I don't want the record, personal record of my life to consist of the minutiae of all the technical work I've done. Uh
00:10:04.240
this is just life. We all toil and struggle through daily challenges, most of which are mundane and trivial in the
00:10:09.680
grand scheme. But don't diminish the dignity of your labor by believing that it's not worthy of recording.
00:10:16.000
So, with that in mind, here are the tools that I currently use. Project logs, summary, videos, reference
00:10:21.519
materials, and publish content. Let me talk about each one. I keep a log of nearly every project I work on. To
00:10:27.519
borrow from getting things done, a project is anything with more than one step. I'll usually have one main note per
00:10:33.600
project with highle tasks and details at the top and at the bottom, an appendon section with each day I've worked on
00:10:39.760
that project and all the notes that from that day. This will include questions I've had, decisions I've made, tasks
00:10:45.040
I've accomplished, snapshots of current understanding or opinions, errors I've hit and how I resolved them, excerpts of logs from bugs and incidents, all the
00:10:52.000
links related to a research session, snippets of code, commands I ran, and plan next steps.
00:10:58.079
Note, the project logs are for you. Keep those separate from what you put in company project management tools. You
00:11:04.720
want to own these, and you don't own what others can block your access to. I work with two to three clients at a time
00:11:11.040
and the context switching can be a real challenge. By Monday, I've often forgotten completely what I was working
00:11:16.880
on for the first client the week before. Uh I'm increasingly making video walkthroughs of features, proposals, and
00:11:23.519
research for my clients. What has surprised me is that I'm almost always coming back to watch these videos again
00:11:29.760
myself, often several times. They help me find my place again much faster than just looking over code or notes. Most
00:11:36.560
videos are under 10 minutes. making playback at 2x cheap. I use Loom and I
00:11:41.920
think it's absolutely worth paying for a tool that uh reduces friction for recording and sharing.
00:11:48.320
Many things don't fit into a project frame and are more like research topics,
00:11:53.360
areas of study or inquiry or ideas and notes for future projects. Have a collection bucket for each of these and
00:11:59.600
get in the habit of throwing everything you think of in there. It should become ne second nature.
00:12:05.279
The pinnacle is published content. When you publish, you reinforce and generalize your knowledge and provide
00:12:10.800
benefit to others as well as your future self. Publishing doesn't have to be high cost. There are many scales. You can
00:12:17.360
spend five hours on a video, three hours on a blog post, 1 hour on social media thread, or 15 minutes on a GitHub gist.
00:12:23.760
I built Rails Inspire as an intermediate between gists and technical blog posts as an it's an easy way to share code
00:12:30.720
samples with contextual explanation. I have yet to regret the time I spent on
00:12:36.079
publishing content. It always rewards me, often in surprising ways. In all this, keep in mind the goals. Build
00:12:42.720
context quickly. Figure out where you left off. Remind yourself of past diffic uh discoveries and decisions. Provide
00:12:48.240
evidence for past actions. Have materials already collected for creative work. Reinforce your learnings. Increase
00:13:01.920
Next up, we have Sam Pter. Hi. Uh, my name is Sam and this is a
00:13:10.160
crash course on linguistics uh with references to Ruby and Rails. Um, so
00:13:15.600
yeah, as I said, my name is Sam. I'm a CS and linguistics student at Berkeley and in the Rails world, I hope help
00:13:21.360
maintain HCB, which is a open source neo for nonprofits.
00:13:26.880
Cool. So, uh, what is linguistics? Uh, linguistics is the study of language. Uh
00:13:32.000
it's a study of how we speak. Uh how we pronounce words, how we structure our sentences. Why do we study it? Because
00:13:38.399
uh language is one of the most important tools we have as humans. Uh it's how we all communicate to each other. Look at
00:13:43.760
us at a conference communicating with language. Uh and it is also a very interesting thing to study because there
00:13:49.200
are a bunch of puzzles. And I don't know about you all, but I really like solving puzzles. So that's why I like it. Um
00:13:56.160
there are four kind of key branches of linguistics. Uh we have phenology, morphology, semantics, and syntax. I'm
00:14:02.720
going to run through each of these briefly with reference to some sort of Ruby or Rails feature. Uh and they each
00:14:09.440
build on top of each other. So we'll start off with phenology. And here we
00:14:14.560
have the IPA. Does anyone want to try having a shot at what these words are?
00:14:20.639
Yes. Perfect. Uh I maybe chose slightly too easy to guess words. Um but this is
00:14:26.240
the IPA. It's not exactly the like the Latin alphabet, but it's an alphabet we
00:14:31.760
can use to uh communicate how we pronounce things. Uh you'll notice that there are two pronunc pronunciations for
00:14:37.839
Philadelphia. Uh it's cuz that varies throughout the world. Cool. Next up, we
00:14:42.880
have morphology, uh which is the study of the structure of words. How many of you have a concern in your
00:14:49.120
codebase that ends with the like? Yeah. Awesome. Well, that's an example
00:14:55.519
of uh a morphe, which is a subunit of a word that has meaning. So, in attachable, we have the word attach and
00:15:02.959
the like suffixable. All morphes have meanings. For example,
00:15:08.160
uh I pulled a concern that's like has tasks. The has has a meaning. ID has a
00:15:13.519
meaning. And the most simple morphe is the plural morphe, which is just an s in most cases, but indicates that something
00:15:19.920
is a plural. Um, and we can break these down. um into
00:15:25.360
roots which is attach and then suffix of abble um and there's a bunch more you can do with more themes. Each of these
00:15:32.079
is like a semester worth of university content that I'm trying to cram into a minute. Um next up we have semantics
00:15:39.279
which is like the meaning of sentences and phrases. Um one common way of studying sentences and their meaning is
00:15:46.720
uh to have sentences derive their meaning from a series of truth conditions. basically a collection of
00:15:51.759
facts that if all true make that sentence true. For example, the truth conditions of a um
00:16:00.079
a sentence like this, Rails is an awesome programming language would be Rails is awesome and Rails is a
00:16:05.440
programming language. I am now realizing I meant to write Ruby. Uh so this sentence is actually not true.
00:16:13.199
Um so uh if we were to write this in Ruby um you have uh you could write a
00:16:19.519
function like this is true which takes the context of what we're speaking about uh a series of truth conditions and just
00:16:26.000
loops through them and if one of them is false the sentence is therefore false. Um now what do these truth condition
00:16:33.600
functions look like? Well actually the most common way of of understanding these is that they are set inclusion
00:16:38.639
functions. So for example, Rails is awesome would be Rails is in the set of
00:16:44.320
awesome things. Here I have a couple of other things I think are awesome. Um and
00:16:49.360
you could think of those uh a little like this. Um so the second one would be false. Uh so TLDR you can think of every
00:16:57.519
sentence as one or more characteristic functions uh using the set theory version of characteristic functions.
00:17:04.480
Lastly we have syntax um which is the structure of sentences. There are a couple of common ways that language
00:17:10.880
languages structure their sentences. Uh you have subject verb object subject object verb and then verb subject
00:17:17.439
object. Um subjects are the person doing the action. Verbs are the action.
00:17:23.039
Objects are the thing that the action is being done to. Uh it is debatable whether Ruby is SVO or so. Um here's a
00:17:31.760
piece of Rails code that uh you could argue is so you have the subject the user table. uh you're creating uh a the
00:17:39.679
object which is a user called Sam and then but you could also write so for
00:17:45.200
example here you have again uh the user who is taking the action of building a new hobby onto them there isn't a great
00:17:52.720
answer and honestly this is because I'm trying to compare a programming language to a human language um but at the end of
00:17:58.880
the day linguistics is descriptive and not prescriptive uh that's one of the key principles is that you don't as a
00:18:05.039
linguist you don't prescribe rules You try and describe rules. So here I am trying to describe Rails as a Ruby as a
00:18:11.120
human language. So thank you so much.
00:18:16.320
Next up we have Brooke Kman. Thanks.
00:18:22.720
So hey everyone um just really happy to share uh with you Terminus. Uh before I actually talk about this though, I need
00:18:28.799
to give you some context. I work for a company called Terminal with all the valves taped out and we do e- in devices
00:18:34.640
and that's what you're seeing here. E- in devices uh are just a simple technology, right? Just a simple
00:18:39.919
hardware construction. It's a dumb device uh that basically just renders image information. So you can send anything down to this and we'll render
00:18:46.160
it for you. And what's really nice about this is that you can get really creative in terms of like what you want to uh
00:18:52.320
create. Think of whatever kind of data that you want to put onto this device, you can do it very easily.
00:18:58.320
So what is Terminus then? Well, Terminus is our open source solution. uh we call
00:19:04.960
it BYOS so build your own server and this is our reference implementation so that you can have an open source
00:19:10.400
solution to actually uh uh render data on these uh in devices it's private and
00:19:15.840
secure kind of by default right because you get to run the server locally you have your device locally it's all on your own network so it's kind of a
00:19:21.360
closed system it's 100% open source which I'm really proud of it's something that I've cared
00:19:27.039
about for many years I've been doing open source for over uh almost two decades now and the other thing that
00:19:33.039
ties into this is is the unbreakable pledge as a company. Uh something I'm also very proud of because basically
00:19:38.400
what we're saying is hey if we ever go uh under or um can't uh sustain
00:19:44.320
ourselves anymore or just get bought out like we'll open source everything uh so that you'll have everything in addition
00:19:49.840
to all the open source stuff that we're doing right now. So in terms of text stack uh it's
00:19:55.360
basically built on Ruby of course. Uh but the thing that I love about it most is it m it it blends the best of Ruby in
00:20:01.440
my opinion which is object composition with functional composition. This lends itself really well because for the text
00:20:07.440
or the web stack we're using Hanami that blends in really well with that kind of design philosophy. As for the front-end
00:20:13.840
type stuff we try to keep it really light in terms of JavaScript. We're using HTMX, so we can just send uh partial information server rendered uh
00:20:20.320
back and forth and then just using pure CSS because modern browsers have come along so far that you can actually lean
00:20:26.480
into that and have a really good clean design without actually having to bring in a really complex uh uh framework.
00:20:33.360
Lastly, if for some reason, I know we're all rub rubious, but if you just don't want to deal with any of that, you can just grab the Docker image that we build
00:20:40.159
and you can run it that way. In terms of architecture, uh, uh,
00:20:45.360
Terminus sits right here in the lefth hand quadrant of our entire architectural stack, uh, which is the
00:20:50.400
DIY, uh, web server. And that allows you to communicate and send information to your device. What's really nice about
00:20:56.080
this is you can also proxy uh, between uh, uh, Terminus and the core server.
00:21:01.280
And you can actually bring in images and all the uh, plugins and recipes and stuff that we have in the core server
00:21:06.320
down to your device as well. In terms of setup, setup's actually uh fairly simple. Um when you get your
00:21:13.600
device and you unbox it, um you're going to want to connect to the uh Captive Wi-Fi portal. It's going to show up as
00:21:19.280
TRML here. Uh you'll connect to it with your SSID of your network. Uh fill in your password. And the critical thing
00:21:25.520
here is you're going to put in your server address. Uh because by default, the device is going to want to talk to our core server, and you want to talk to
00:21:32.720
Terminus that's running locally. And so you put in your IP address, connect to that and then uh uh it starts syncing
00:21:39.840
and the the syncing it's doing is actually a basic JSON data API. It's very very simple actually. Uh it just
00:21:47.120
wakes up the device D says hey Terminus what's the next image? Uh Terminus sends that JSON response down with a URL to
00:21:53.760
the image and then that renders on the device and then you can just go through multiple screens that way. In terms of
00:22:00.559
uh web UI uh it's very simple at the moment. We're working on making this better and a better uh uh usability uh
00:22:07.200
better pleasant experience for you to uh to to use in your home server, which is a a dashboard to kind of keep stats on
00:22:13.919
things. Uh devices, so you can actually look at the logs, edit them, delete them, add new devices, whatever. Um
00:22:20.640
there's also a little bit of a designer in there. This actually uses HTMX to do serverent events. So as you uh modify
00:22:27.440
your HTML code, you can see the new uh screen render on the lefth hand side. And then you can use that information to
00:22:32.799
actually hit the screens API and uh build a new image that actually gets sent to your device.
00:22:38.880
So uh new features are already uh are being built uh weekly. Uh this is kind of basically my primary job. Uh super
00:22:45.919
excited to be working on this and actually being able to provide something that the community can really enjoy. Uh
00:22:51.360
thanks so much for letting me speak and you can find the slides and uh feel free to reach out and contact me. I'm happy
00:22:57.280
to talk more about this. So, thanks.
00:23:02.960
Next up, Kelly Popco. All right, I'm here to talk about when you might want to use the data object.
00:23:08.320
Uh, data is a relatively new Ruby class introduced in Ruby 3.2. Use data when
00:23:14.720
the intent is to store an immutable atomic value and when you want to define simple classes for value alike objects.
00:23:21.760
Cool. So, how do we use it? um we use uh data.define and we pass it
00:23:29.520
keyword arguments. So here we're using it on a book as an example. We can also
00:23:35.200
optionally pass it a block if we have behavior like methods that we want to add to it. Um
00:23:43.520
then creating an instance of uh the book. Uh notice that we can either call
00:23:49.120
new or use bracket bracket braces bracket and we can
00:23:54.720
optionally use either keyword or positional arguments. So here we're doing one you know both
00:24:02.320
all four combos. Now how does this compare to its arguably closest neighbor
00:24:07.520
strruct? Uh let's take a look at that. Uh in terms of syntax just uh using the
00:24:13.679
uh similar kind of house example uh we use data.define to instantiate the data
00:24:19.200
class uh keyword arguments. Uh with strruct we're going to say strruct new. Um now what is one of the main
00:24:27.039
differences between the two. One of the main differences is going to be mutability. Um let's try out some
00:24:33.200
renovations here. Uh we're going to look at strruct. We have created a house using strruct. Uh we we've created a
00:24:40.320
ranch house with one uh one floor and we're going to try to add a floor. Make it a two-story ranch. We get yeah two
00:24:48.240
floors. Uh and we can also check is ranch frozen. It is not frozen. Let's
00:24:53.360
try to do the same for with data. We're going to define the data the house
00:24:58.880
using data. Uh here we have a ranch house. Um and then we're going to try to increment floors. Notice that we get a
00:25:05.279
no method error raised. Uh we also note too from the error that there's no uh writer method. So what would happen if
00:25:13.600
we define a uh define a writer method? We can define the writer method when you
00:25:20.400
when you when we try to use it though we get a a frozen error. So we can also
00:25:25.440
check is ranch frozen. Yes, ranch is frozen. And just as a as a sideby-side
00:25:30.799
comparison, we're looking at data methods and struck methods and then each
00:25:35.840
respective instance methods. Um you can see the strruct just has way way more that's built right in. Um and then if we
00:25:44.400
compare the diffs of methods, we also can notice that strruct only has one method that data does not whereas uh the
00:25:52.559
reverse is certainly not true. Cool note about width though. with we
00:25:58.159
can create a copy of that instance and change any or all of the attributes um
00:26:03.200
and make a new instance. So to data or not to data we want to
00:26:08.640
look at mutability, behavior and communication. Um when do we want to use
00:26:13.760
data? When do we want to use something else? Uh if we want a lot of methods, if we want to be able to change values, we
00:26:20.559
probably want class. Data is not going to be what we want. If we want to create
00:26:25.679
that simple class for a value object, if we want a well- encapsulated object uh
00:26:30.720
where those changes uh those values once created cannot really be mutated, that's
00:26:36.240
when we want data. Um is data is an instance of data truly completely immutable though.
00:26:43.200
We have some immutability workarounds we can look at. So the instance of data is frozen but the attribute values if those
00:26:50.799
are mutable, they are still mutable. So we can sort of work against the intent of data if we really want to. So just
00:26:58.400
looking at an example where we have um a hash. So we're we're creating a data
00:27:04.640
object color counts where we're passing a hash red blue green and we want to
00:27:10.480
increment say the red count by five for I didn't really think about why but we
00:27:16.320
totally can if we look at it red now has five. So um yeah, so we can update those
00:27:23.440
values. How are we doing? Uh just really another similar version with uh with uh array uh we can also you
00:27:32.000
know knock one of the one of those out with pop or we could push to that array because the array itself is mutable. So
00:27:37.679
just a caveat I suppose. So bringing it all together you might want a data
00:27:43.039
object if you want to avoid a muted a mutated value on the object coming back to haunt you. Um that said there are
00:27:50.240
work workarounds. Um so it's not foolproof. Thank you so much as well. Oh
00:27:56.000
also about communication. Okay. Thank you so much. That was a flyby of the Ruby data class.
00:28:01.919
Thank you so much. Thank you. Next we have Tia Anderson.
00:28:15.520
Okay. Hello party people, all eight million of you.
00:28:23.120
Hello. My name is Tia and I am a Rails Comp 2025 scholar and this is peace,
00:28:30.000
love, and crud. A journey, a Rails journey to calm. So, I totally believe
00:28:36.399
that a lack of internal peace is fueling a whole lot of the chaos and calamity
00:28:41.600
that we're seeing in society right now. from burnout to road rage to constant
00:28:47.679
conflict, we're all kind of running on fumes. Maybe not all, but you know what I mean. Um, and I kind of wanted to
00:28:53.600
change that because that's a lot. Uh, in a world that kind of feels like like it's spiraling politically, socially,
00:29:00.559
and even in just day-to-day interactions. This is my journey to reclaim peace through code.
00:29:09.840
Okay, this is the first thing that you land on when you go to my app, which is POM, which stands for peace of mind.
00:29:18.080
Okay, and it was just made to be soft tones, uh, simple choices, long inner
00:29:23.120
sign up, no extraness, no extra chats or all that kind of stuff. No pressure,
00:29:28.640
just come on in and catch these vibes. Um, I built this during a time of like
00:29:33.840
really really big life changes for me from like being laid off to watching what looks to me like the world burning
00:29:40.880
down and people treating each other like complete garbage routinely. So, I didn't really want more noise. I wanted to a
00:29:48.640
place that was going to let me pull away from the chaos and like center myself again.
00:29:54.880
All right. So when you first log in, you get to the dashboard and um
00:30:01.840
it's just common and simple like everything else. And right now it just offers the two options of journal and
00:30:07.760
gardens, but eventually will offer recipe tracking and the ability to couple recipes andor your plants with
00:30:14.799
journal entries because inner peace doesn't come from doing more. It comes from focusing on what actually matters
00:30:21.440
out here. Now, next we'll go into the gardens. Uh, you can set up several however many
00:30:28.320
gardens you want to and do the notes in the plants and everything like that.
00:30:33.919
Okay. Um, you can track the progress of your plants within there. Uh, and it's
00:30:40.880
the thing is that I don't feel like it's just plants being tracked. It is, you
00:30:47.039
know, you're tracking your care, your progress, your intention, watching something grow over time. Even when you
00:30:54.159
feel stuck, it's kind of a reminder that you're not. And really and truly, sometimes we feel stuck because we need
00:31:01.760
to look inside and grow from literally right where we're planted.
00:31:07.200
All right. And this is what it looks like on the show page for one of the plantings, which is a a user, a plant,
00:31:14.159
and a garden. Um, and you can see that you can add progress notes and things
00:31:19.600
like that so that you can watch it. Uh, and there's timestamps and things like that. Um, honestly, it's a little bit of
00:31:27.200
a metaphor. You know, these little logs added one by one to show your effort, your setbacks, and your joy. Uh, does
00:31:34.799
sound familiar? It's kind of crud, but mindfulness and presence crud.
00:31:40.799
All right. And then we have here's the journaling space.
00:31:47.120
This is, you know, just what it looks like when you first land on it. You can scroll through. This is a screenshot, so
00:31:52.880
I should probably stop trying to scroll. Uh but but this is where um you can actually
00:32:00.880
scroll down and you get all of the months for which you have an entry and it's you know that the first little
00:32:07.200
three accordiums are kind of popped open but you can look at any of them. Um,
00:32:14.000
so entries are organized by month for now, but in the future they'll also be
00:32:19.039
able to be grouped by like category or like event, emotion, stuff like that.
00:32:24.720
Um, there's no way to get like likes or comments. Nobody's looking at it, so there's no pressure, which is amazing.
00:32:31.039
Just thoughts and reflections. Um, because we need somewhere to put the weight that we just we randomly pick up
00:32:38.799
and carry. uh we need to unpack those thoughts and feelings that will otherwise become baggage thus leading to
00:32:46.320
this lack of peace that we're seeing everywhere. The idea here was kind of minimalism and choice. Um all right. So
00:32:54.320
also some days we don't know where to start and we potentially end up avoiding journaling at all. So I integrated chat
00:33:01.760
GPT to generate prompts. So, Rails handles the flow. Open AI brings the
00:33:07.200
idea and you bring the truth. Um,
00:33:12.720
let's see. It's just a little spark to get your gears going.
00:33:20.480
Are you okay? It's just a little spark to get your gears turning when you don't know where to start. Uh, and I do want
00:33:26.559
to say that I I did I came to Rails late in the game after years of working on a
00:33:31.840
front-end platform that runs on Rails. Uh, but learning to build from scratch
00:33:37.039
kind of changed everything. It gave me confidence. It gave me skills. And honestly, it helped me find peace.
00:33:45.679
In closing, peace isn't loud. It isn't flashy. It doesn't go viral, but it changes everything. Because when one
00:33:52.399
person finds calm, it ripples outwards. It changes how we show up in our homes, in our jobs, and even on the road. Peace
00:33:58.880
spreads. But you have to choose it. If even one person chooses to build peace, they give others to uh the permission to
00:34:05.919
do the same. And that is how we begin to change the world. You can find my app and contact info on this final slide. I
00:34:13.520
am Tia Anderson, Rails Comp 2025 scholar, and I wish you peace, love, and
00:34:21.040
crud. Thank you for coming to my TIA talk.
00:34:27.440
Next up, uh next up we have Justin Bowen. Sweet.
00:34:37.200
Okay, I'm Justin Bowen and as most of you have probably already guessed, I'm going to
00:34:42.480
be talking about Rails and AI because that's what I do. Uh, I've been doing
00:34:47.599
Rails for 17 years now. Uh, the last 10 years though, I've been doing a lot of Python computer vision. Uh, this is my
00:34:54.399
cat, Laouie, past and present. She's 17. She's been with me by my side the whole
00:35:00.400
time. And yes, like I said, since Railscom 2021, I have been talking about AI uh and Andrew Kane a lot. Um
00:35:10.480
there was actually Marco one video missing uh from Ruby events. And that is
00:35:17.119
uh again me and Looie thanks to Arena. You guys might have seen that picture twice. I didn't get to see it. So there
00:35:23.839
are a lot of tools missing in our Ruby toolbox if you're familiar. Um, one in particular is not really AI but does
00:35:30.960
kind of have that connotation which are i Ruby notebooks, live notebooks, Jupyter notebooks if you're familiar.
00:35:36.560
GPU accelerated runtimes for inference and training. Onyx runtime Ruby does now
00:35:42.000
support CUDA thanks to Andrew Kane and I just made an issue. That's the word opensource frameworks for AI development
00:35:49.599
and that's what we're going to talk about. Agentoriented programming is actually not a concept I made up. The
00:35:55.760
paradigm was coined like 30 years ago. Wikipedia, this is also sort of from the Wikipedia, but we're not here to talk
00:36:02.400
about vibe coding, and we'll get to that later if there's a little time. But we're here to talk about cool features
00:36:08.079
in your Rails app that are AI powered, like an object. Agents give you
00:36:14.079
functionality, but can decide how to use that functionality where it's not just a
00:36:19.200
lifeless object representing some kind of data structure. It is a lifeless object representing some kind of
00:36:26.640
complexity. Uh active agent compresses that complexity into something that you
00:36:31.839
might be familiar with. Uh it should be MVC models, views, and controllers.
00:36:38.560
Actions render prompt templates uh using action view and uh the prompt context is
00:36:44.240
the model and the agents are controllers. I didn't read the highQ. I probably won't have enough time. This is
00:36:49.680
actually just from the Rails guides uh controllers, you know, NVC. I just
00:36:56.960
slapped an agent class in there. So now you can have a controller, too. And your
00:37:02.000
public methods become actions that can be called. You get cued generation just like you would with action mailer. If
00:37:07.599
you've ever used a controller, you should be pretty familiar with this. Uh two major things that we've probably all
00:37:14.480
attempted to do at this point are interactive conversational AI like chat bots. everyone wants it. They're not
00:37:20.079
that great. Uh, autonomous operational agents. Interesting. Again, chat bots
00:37:25.599
are like long form wizards, and you'd probably be best off just using a form. It's faster and a better user
00:37:31.520
experience. Uh, and then, yeah, interacting with third parties with MCP or tools. That's a thing you can do.
00:37:36.640
Actions can also be tools. Today, we'll be talking about both concepts with translations as a background task that
00:37:43.280
you can do. Uh, okay. This slide is just to indicate that it's demo time. So,
00:37:48.400
we'll get into the code uh in a second. Let's just do the demo real quick and hopefully the internet still works. Uh
00:37:56.079
this is about cat. So, mau I didn't spell it right kind of on purpose. So, we can ask what can you do
00:38:04.400
and hopefully get streamed results back. And it says that it can show cute cat
00:38:10.560
images, which I didn't promise at the beginning, but I will hopefully deliver. Uh, and you can say, "Show me a cat"
00:38:17.280
without the A, but it should still do it hopefully if the internet's good.
00:38:23.040
There's a job running. That's good. Um, ah, cat, it worked.
00:38:30.880
I did break it multiple times today during the hack space. Uh, we also have translate and I do want to get into
00:38:36.400
code, but we only have a minute left. So, let's see. Uh, yeah, this is your agent class. The translate agent has a
00:38:43.119
simple translate action that renders a translate text herb file that you guys
00:38:48.400
have probably felt before or used before. It should feel familiar. You also get before generation after
00:38:54.640
generation call back similar to 40 seconds left. Uh
00:39:00.960
similar to what you would see in action mailer with the deliver uh callbacks
00:39:07.119
and then the chat that you just saw is all just going through the support agent which just gets the content from the
00:39:12.880
message the user typed the chat ids the context and generate later like we were talking about. There's also in the
00:39:19.359
support agent a action called get cat image that goes to
00:39:26.400
cat image as a service to get you that cat from cat as a service and every time
00:39:34.240
you go there it just gives you a random cat and in that agent we also have a
00:39:40.079
call back that we can use for handling stream chunks. Uh, like you saw in the stream chat, on stream callbacks give
00:39:46.720
you the ability to render each of those chunks as they come back. Uh, and before a after actions. 10 seconds left. Hold
00:39:54.160
on. It's going off. And, uh, I'm tons of fun. Uh, if you didn't already catch that on GitHub and
00:40:01.119
tons of fun11 on most of my socials. Uh, the hack space was very inspiring for me. If you're interested Oh, I'm
00:40:07.599
overtime. Okay. Yeah. Scan. Thank you.
00:40:14.240
Next up, Deborah Fernandez.
00:40:19.359
Hi everyone, I'm Deborah. I've been working with Ruben Railos since 20 2012.
00:40:26.160
Now work at power. Please check our booth. And now I'm here with you guys to
00:40:31.359
celebrate the 10 years of Rails Girl S. Paulo. Yay.
00:40:38.400
And what do you have to celebrate? In 2015, two women in S. Paulo had a dream.
00:40:45.520
We had we want to bring more women to technology with rails. Nowadays, people
00:40:52.320
came across long distance to live this experience from the whole Brazil and
00:40:58.880
beyond. And we just really recommend you should try. On the last 10 years, we reached about
00:41:07.440
500 people, 500 women to teach and to develop their careers using ruban rails
00:41:15.040
or another language. We have been empowered human around the Brazil and
00:41:21.119
beyond. And our most common feedback that is
00:41:26.160
most important it is that our space is one of the safest one to then overcoming
00:41:34.720
their fears and be more in several aspects. Another special thing is that
00:41:42.800
often these girls come back as mentors because they ha they want to give back
00:41:49.200
to community the p the power that they have received.
00:41:55.520
Our main goal is that women truly truly believe in themselves and we have
00:42:02.160
reached that. Ray's girls is not just about programming is about changing reality
00:42:09.440
and behind the scenes it would be possible possible if regular people like
00:42:16.240
all of us dedicate themselves to change the world. And this is my invitation for
00:42:23.359
you today. Help people around you, 500 or just one. Want to start something
00:42:30.640
new, a workshop, a small group? Start very small. Be an ally. Find allies.
00:42:37.920
Look for people known for perfection.
00:42:43.440
Be wrong on perfection. It's so funny. We are here here to help Camila, myself,
00:42:49.440
Karolina, Daniela, Eline. We are here to help you of course to receive help too
00:42:56.640
and cheer on you on the next 10 years. There's no great success that change the
00:43:12.000
Thank you. Next up we have Charley Ramulus.
00:43:19.760
Awesome. As I said, uh my name is Charlie Ramlers. I'm a full-sack developer based out of Boston. Uh I
00:43:25.280
learned to code with Ruby, uh which is a garbage collected language, which means that memory is managed automatically for
00:43:31.599
us. Um I've been curious about how memory used to be managed uh pre pre- Ruby and pre- garbage collection. So I
00:43:39.200
took some time to play around with uh C which is the language that Ruby was built on one of the languages uh and uh
00:43:45.680
build some like small small apps and and play play with memory. So uh do manual
00:43:51.920
memory management uh so this talk is going to be about some uh about some small things that I've learned.
00:44:02.079
So, so just as a trivial example, let's say uh we were asked to build like a a
00:44:07.599
small seats management application for like a conference room. Uh let's say the uh the requirements is the the room can
00:44:14.720
only have uh start to start can can only have 20 chairs and uh for attendees and
00:44:21.040
if we were to get more signups, we would we would uh get more chairs to
00:44:26.800
accommodate all these attendees. So if you were to implement that in a C program
00:44:36.079
um uh so so before we we get to that so uh C has uh three main ways to main uh
00:44:44.640
methods to uh kind of like manage memory manually. Uh we have maloc which stands
00:44:50.319
for a memory allocation. It takes one parameter that's that's an energy that
00:44:55.599
you pass to it that kind of like uh you can ask it um returns uh like uh a list
00:45:02.960
of contiguous memory block so that you can store whatever data you want. So if you were to use that uh implementation
00:45:10.000
to uh create uh our little program here. Uh so as you can see in on the right we
00:45:16.079
passing 20 to maloc means that we are like um so the twin chairs initial 20
00:45:21.920
chairs we're passing and we all multiply that by the number uh some number of characters here which is um the the name
00:45:29.440
of the chair so I decided to call each chairs like chair one chair two. So that
00:45:35.680
multiplication would return about like uh 60 uh 60. So that would be um 160
00:45:44.640
bytes that Malo would would return. So we can store all stores all those 20 chairs. Uh so now let's say uh we have a
00:45:52.240
bunch more people like our talk is very popular a bunch more people uh end up signing up for a talk. We can't just
00:45:58.640
just like add all these uh 50 extra people to um uh to our initial like uh
00:46:06.000
room. We like in C. If we do that, we'll potentially um overwrite memory and
00:46:12.319
causing uh issues issues in our program. So, so there's another method called
00:46:17.599
real lock that allows you to uh take the initial u printer slash uh variable
00:46:24.400
variable that we had and you can use it to uh it takes two parameters. you pass
00:46:30.000
in the first pointer that you have and then the second parameter is the amount
00:46:35.760
of memory more memory that you want to add to that. Uh so that's that's what
00:46:40.960
we're doing here on the on the second block and then once you're done let's say the talk is over and then um we need
00:46:49.119
to return uh we need to return the chairs that we had borrow borrowed to to
00:46:54.160
accommodate the extra uh people that were attending. uh so in C the same way
00:46:59.359
we we need to make sure that we we free the memory that we're using so that other parts of the program can use it.
00:47:06.319
One of the main thing that happens if you not do that we can easily cause memory leaks and uh in the past couple
00:47:12.800
of years uh uh the US government have been actively asking um asking uh the
00:47:20.720
the company that they work with to uh to to uh to add u
00:47:27.920
um to add road maps to to their to their uh
00:47:33.119
to their website to to tell them how exactly you they're going uh they're going to um
00:47:40.880
to improve uh so that they can prevent uh their uh any type of memory issues
00:47:47.839
from the program. So uh so if we were to implement the same thing in Ruby
00:47:53.760
sorry so if we were to implement the same thing Ruby in Ruby so like it is it is
00:47:58.880
very very simple uh like we were doing before before we start with a room which
00:48:04.000
is the area that we have and we add the 20 uh chairs that we want to add to it and then um so once more people come to
00:48:13.119
the room we just add the 50 more people that we want to add which is the 70. So
00:48:18.400
we add that and we don't have to worry about calling Maloc or or Kok or free
00:48:23.839
because uh we have garbage collection that takes care of that for for us in the background. Um so um Ruby is a
00:48:32.079
amazing language that's one reason all of us loves it and um so um and this is
00:48:39.440
it. Thank you.
00:48:45.599
Next up, Rachel Wrightman. My name is Ra. Hello.
00:48:54.880
My name is Rachel Wrightman. I go by Chale Codes online and this is gamified developer experiences. I want you to
00:49:01.599
have as much fun in your day job as you do playing a programming game. But first, we need a definition. So, a
00:49:07.599
programming game is any game where a core mechanic is creating or modifying programs. and they can look very
00:49:14.400
different. For example, this one is Battles Snake. So, it's a multiplayer snake game where you build your own
00:49:20.480
where you have your own server deployed and what they do is they send you the board state and you reply with what move
00:49:27.440
you want to make in under 500 milliseconds or your snake just keeps trucking along in the direction it was going. This one is exopunks. You are
00:49:34.319
infected by a disease that is slowly turning your organic parts into machine parts. An AI is giving you nonsensical
00:49:41.599
programming tasks in exchange for medicine to slow the progression of your disease. You're writing programs for
00:49:47.040
exos which are tiny robots that can spawn more tiny robots. Your documentation is a hacking given and you
00:49:53.599
can program your new and you have to program your new machine parts to function as your old organic ones did.
00:49:59.200
This red gift, by the way, is you reprogramming your hand. So, this last one is the most beautiful or uh
00:50:04.480
atmospheric storydriven programming game I've ever seen. It is my favorite, and that is not because I am in it. The
00:50:10.400
reason that I like it is because I played the demo, got involved, not the other way around. So, this is a very
00:50:15.839
meaningful game. It's storydriven and it's heartfelt. So, in this one, uh the
00:50:21.359
coding that you do mostly involves setting and copying variables and getting creative with their usage. And
00:50:27.599
uh so you can actually walk around in this one which is unsurprisingly pretty rare in a programming game. All right,
00:50:32.960
now let's get into why programming games are fun and how we can take this into our day jobs. So there are six topics
00:50:39.200
here and I think we have time for three of them. First of which is the immediate feedback that you can get and the last
00:50:44.880
two we're going to cover purpose and autonomy. So in programming games you can get immediate and visible feedback.
00:50:51.520
So this is what code execution in Exopunks looks like. At any given moment, you are aware of what line you
00:50:57.280
are in, what value is in each of your registers, and you have a representation of your code's execution that is very
00:51:03.119
visible. In fact, if you look at the tape decks over in the feed, the digicam feed up there, you can actually see the
00:51:09.359
correct one rotating whenever you are loading the file. So, this is before we even talk about the fact that your code
00:51:15.520
is run past 100 tests in order to ensure robustness. This is a dream developer
00:51:20.640
experience. you have immediate feedback and unparalleled visibility into execution. So, how do we bring this into
00:51:27.040
your day job? So, I think one of the first things you can do is test-driven development. Red green is uh I think one
00:51:33.599
of the most satisfying ways to write code. You have clear feedback, easy to manipulate parameters, uh immediate
00:51:40.240
regressions, and you don't have to write tests at the end because they're already done. The next one is live reloading. So, we talked about that visibility and
00:51:46.720
feedback. When I'm working with my Jackal blog, I have my code on one side and then I have the uh site on the other
00:51:53.440
one. So every single time I make a change and save it, I can immediately see that feedback on the other side. And
00:51:58.559
the last one is your debugging tools. So I want you to think about your debugging tools like how close can you get to that experience that you have in Exopunks
00:52:04.880
where you know exactly which line you're executing, what each of the values are and the uh parameters and uh everything
00:52:11.119
that you can see in them. So our next topic is going to be purpose. So, in games, there's always this larger story
00:52:16.800
or purpose that you're taking part in. In uh I mentioned that in One Dreamer,
00:52:23.760
this is a story that made me cry. You're exploring what happened to Frank. You're exploring his history. You're
00:52:28.880
understanding what happened. That story is what draws you through your tasks and gives it meaning. So, how do we apply
00:52:35.200
this to your job? The first thing that you can do is you can talk to customers. You can talk to product owners. You can
00:52:40.319
start to understand how your work impacts the users that you're working with. Next, you can do meaningful work.
00:52:45.839
So, I always feel good about contributing to Ruby for good because I know that that's an organization that is helping to make the world a better
00:52:51.599
place. The last thing you can do is you can learn something new. So, sometimes we can't work on something inspiring and
00:52:57.200
helpful to the world, but at the bare minimum, you can work on something that's interesting and new to you. All of these points are really about caring
00:53:03.599
about your work because if you don't care, why bother? And that's no fun at all. So, our last one is a meta point.
00:53:10.240
So with programming games, you are choosing to sit down and spend your time on it. This really comes down to autonomy. This is relevant for cases
00:53:18.079
like Battlesnake where it's your own hosted code. It's your own development environment. It's the test cases that
00:53:23.520
you're running. And I think we see this with advent of code as well. I think this applies particularly in cases where
00:53:29.200
you're looking at side projects and open source. I think that this autonomy is part of the reason that you enjoy it.
00:53:34.880
It's more fun when you have a choice. expanding on that. I think that's one of the things that can potentially cause
00:53:41.200
maintainer burnout. I think maintainer burnout can happen when a product project becomes an obligation instead of
00:53:46.960
a choice. So, how do we apply this to your job? I'm not sure. 20% time uh open
00:53:53.440
source contributions. If you know and you figure it out, please let me know. I go by Chale or Rachel. You can find me
00:53:59.839
at chale codes. Chale. For all the social media platforms, hello at chale.codes for my email. Also, I'm
00:54:06.079
looking for work and you can find my resume at that link right there. Thank you very much for your time.
00:54:16.559
Next up, we have Lucy Chen.
00:54:22.640
Hi everyone. Um, I'm Lucy. I'll be talking about Ugly Colors, how I built a
00:54:28.559
web app to rank ugly colors. So, a little bit about myself. I'm a
00:54:34.720
born and raised New Yorker, a Rails scholar, and a firsttime Rails Conf attendee. I studied fashion design in
00:54:41.520
college, and I just started learning programming on my own about six months ago. It felt overwhelming at times, but
00:54:48.880
also very rewarding. Today, I'll be sharing my Oops. Today, I'll be sharing
00:54:55.280
my project color. It's a Rails app I built that lets people vote on whether
00:55:00.480
colors are ugly or nice. Basically, it's hot or not, but for colors.
00:55:06.559
It's a little silly, but it was the perfect way for me to practice Rails.
00:55:12.800
So, the reason I chose to build this app is because colors are a big part of my life as both an artist and a designer. I
00:55:20.079
tend to love a wide range of colors from soft pastels to overly saturated neons, even though I wear black all the time.
00:55:27.520
So, I wanted to build something fun, visual, simple, and fully Rails to see
00:55:32.720
how far I could take a playful idea and learn as much as I could along the way.
00:55:40.000
How it works is in the homepage there are two color rankers, one for single colors and one for color pairs. You vote
00:55:47.040
on whether you like what you see. If you're not sure, you can generate a new color using the buttons or just click on
00:55:52.880
the color itself. Both ugly and nice colors go to a
00:56:00.640
leaderboard, and you can reorder them if you think one is uglier than the other.
00:56:14.400
And if you mess up, you can delete it and revote on another. And to keep
00:56:19.440
things short, there's a voting limit. Just three votes per list. And when you reach the limit, you get a little
00:56:25.839
surprise. If you log in, there's a personal
00:56:31.520
history page called my votes where you can see every color you've ever judged.
00:56:39.040
I track votes by session and user, and I use controller logic to make sure the
00:56:44.319
same color doesn't show up twice, even if it might look the same.
00:56:51.119
So my future steps is to get a deeper understanding of user authentic authentication. Allow sharing profiles
00:56:58.319
both individual and blending color profiles between two users. Create different dual color visual formats such
00:57:05.680
as polka dots or stripes instead of just color blocks. Allow users to input custom hex codes
00:57:12.960
and make my web app uh mobile friendly.
00:57:20.000
It's a simple Rails app, but it's taught me so much. Not just technically like writing custom controller logic and
00:57:26.640
working with models and device, but also patience, debugging, writing really ugly
00:57:31.839
code, and that I could build something I'm really proud of.
00:57:38.000
It's been a lot of fun and I'm excited to meet others during the week and learn about your experiences. If you have any
00:57:44.559
questions or advice for me, I would always love to learn more and get to know you better as a person, too. Thank
00:57:50.799
you all. Okay, next up, Alan Rattlever.
00:58:03.520
Fear. It's not something we talk about, but it's here. It's here with us because
00:58:09.920
we take it with us everywhere we go. Now, fear leads us to build emotional fortresses around our true selves so
00:58:16.799
that we can cower behind them with our imposttor syndrome. Or is that just me?
00:58:22.720
Hi, I'm Alan Ry Hoover and everything I have ever wanted has been on the other
00:58:27.839
side of fear. Fear comes in many shapes and sizes, but what I want what I want to talk about today is the fear of
00:58:34.559
rejection. Like a virus, it causes us to put on masks and wear and and practice social
00:58:41.920
distancing. It lies dormant within us until we approach a new person or a new situation and then it flares up rapidly.
00:58:50.240
For example, do you remember the first time you ever wanted to kiss someone?
00:58:55.280
You likely in that moment experienced anxiety triggered by a fear of rejection
00:59:00.480
alongside a rush of intoxicating endorphins caused by Cupid. Now, even
00:59:06.319
with Cupid's support, asking that question, "May I kiss you?" is an incredibly vulnerable act. You're
00:59:12.960
putting yourself out there. Asking for intimacy.
00:59:18.079
If you fear rejection at all, you won't ask the question, and fear will have kept you apart. Now, at work, we
00:59:24.640
experience it differently. Many of us have imposttor syndrome. Some of us who
00:59:29.760
have been there like myself uh know how know how it affects them. I fear people
00:59:36.880
are going to discover that I'm a fraud. I that my accomplishments will be discredited
00:59:42.640
and that I will be shunned. And ultimately it all boils down to that fear of rejection.
00:59:48.559
It leads me to fortify those defenses that prevent me from connecting with my colleagues. So how can I get past this?
00:59:55.440
How can we all get past this and truly connect with each other? The key is
01:00:01.280
trust. Trust is the vaccine for fear. A large enough dose can inoculate us,
01:00:08.319
mitigating fear's worst symptoms, but it's not free. It comes at the cost of vulnerability.
01:00:14.880
Someone must take a leap of faith, let their guard down, and share something of themselves. But then, crucially, someone
01:00:22.240
else has to reciprocate that vulnerability. Now, often people express vulnerability
01:00:27.920
in the form of a question. For example, if I were to ask, "How does that work? I'm revealing the fact that I don't
01:00:34.000
know." That's a risk in an environment where people don't trust each other.
01:00:39.520
It's a vulnerable act. Now, a few years ago, I observed a co-orker named Stephanie do something magical in this
01:00:45.760
situation. She was teaching a class at work, and when someone asked a question, she responded with, "I don't know. Let's
01:00:52.400
figure it out." Now, I love that. It was such a beautifully humane way of answering the question. Stephanie
01:00:58.880
acknowledged that the person might be feeling vulnerable by reciprocating and admitting her own lack of knowledge.
01:01:05.839
Then, she invited them to participate in finding the right answer together. Now, Stephanie leveraged that small
01:01:12.240
small expression of vulnerability to build trust. She made it easy. She made it okay to not know. And that's the
01:01:19.200
foundation of psychological safety. That's what gives teammates confidence
01:01:24.720
that they won't be humiliated or punished for sharing an idea, asking a question, or making a mistake. And
01:01:31.520
without that safety, teams won't perform at their best level.
01:01:36.720
Now, I want to acknowledge there's not always a Stephanie in the room. If your teammates aren't reciprocating your
01:01:42.160
vulnerability with their own, you could try being more explicit about what you're doing by asking or saying
01:01:47.200
something like at the risk of being vulnerable. You can talk to your manager about the lack of safety on your team.
01:01:53.599
But if the situation's beyond repair, if vulnerability is seen as a weakness
01:01:59.359
rather than the strength that it is, you may need to find a safer team. When
01:02:04.799
you're looking for one, try answering an interview question like this. I don't know. Can I look it up and see how they
01:02:11.680
respond? And remember, you're interviewing them as well as them interviewing you.
01:02:17.280
Ultimately, I believe that the fear of rejection prevents us from truly seeing each other and actually being there for
01:02:23.280
one another, which is a shame because we all have so much to offer. The way past
01:02:28.640
that fear is to build trusting relationships through vulnerability. That's what will guide us to the
01:02:34.400
psychological safety on the other side of fear. So go ahead, ask the vulnerable question
01:02:41.359
because everything you've ever wanted is on the other side of fear. And who knows, you might even get kissed.
01:02:55.760
Uh, next up we have Yashar Shell.
01:03:03.040
My name is Yashar and I'm from Turkey. If you're not pronouncing it correctly, it doesn't matter. You can call me as
01:03:09.599
Yasha or what you want to do. It's okay for me. So, uh, today I'm here for
01:03:16.400
saving your coffee money in your pockets and I'm one of the organizers of uh,
01:03:22.880
Rubier and also one of the scholars too. So,
01:03:28.640
let's ah before to start I have a disclaimer. Um, first things first. So
01:03:34.880
sorry my English because I was in New York City for just few days. So I'm
01:03:42.160
nervous about it. So uh today's thing about memory management. Yeah. Uh like
01:03:49.200
shortly already mentioned about it. There is something to do about your
01:03:54.720
memory. Yeah. Right. And Ruby handles for it uh for us. So, uh,
01:04:05.440
sorry for that. Uh, they just trying to, uh, keep it really, um, optim uh, sorry
01:04:14.480
for that. Let me rephrase. Um,
01:04:26.240
thank you. Uh actually Linux managed your memory re pretty well
01:04:33.039
and doing just all of the stuff keep similar things closer and remove the
01:04:38.079
unused ones and reorganize it regularly. It's just really good and it done by
01:04:46.000
Melo. It's pretty fine and it works really good. It comes with gypsy and
01:04:52.480
it's good but it doesn't work really good Ruby I think just some cases so we
01:05:01.359
can figure it out and optimize in a way we just setting things before of that we
01:05:09.520
have to uh take um actually you have to measure before and after uh maybe it's
01:05:17.680
not a thing for your case or your stuff etc. And maybe you can set malocar max
01:05:24.480
2. It's popular thing. Everyone knows and it's a really easy thing. Uh what if
01:05:31.440
it already had been done by someone else? There is one thing to do is J
01:05:38.960
malog comes from the stage. So uh actually they are looking for new
01:05:45.200
maintainers or new forks. Maybe you already heard about it and there's a blog post about it. I have to suggest to
01:05:53.119
you look for it and maybe you already seen about these
01:05:58.559
screenshots over the net. Uh for example from Nate Baropek or somebody else they
01:06:05.760
has lots of savings with using GMAL. So if you want to using GMAL log jalog
01:06:14.400
or uh how can it be done in your codebase
01:06:19.599
too easy actually it comes by default with uh 7.2 to rails and if you if
01:06:28.079
you're using docker file it works perfectly but if you're not it's easy
01:06:33.280
install lip gml 2 on your server how can it be done you can you if you're using
01:06:39.119
uh heroku just add this this build pack it works pretty perfect and you have to
01:06:45.359
just set a flag which galo enabled too it works pretty well and if you're using
01:06:52.000
docker file or something else just uh just one line and after that you have to
01:06:59.359
uh flag it uh where it comes from. So that's all uh thanks and tesar.
01:07:07.520
Yeah.
01:07:13.440
So our last one is Enrique and Goen.
01:07:20.640
Hey guys, I'm really happy to be here. So I will share my journey from react to
01:07:25.839
hotwire real quick. Um I am one of the organizers of proc on rails. So it's a
01:07:31.599
rails conference in Brazil. Everyone's invited. We were going to have a really nice t-shirt if you go. So besides that
01:07:40.720
I am also a founder of a company called Linkana. And back then when I was
01:07:46.319
starting my first company, uh, I went to that clickbait saying that I would be 10
01:07:51.920
times faster using GraphQL and Apollo. Thanks, Adam. I don't know him, but
01:07:57.359
yeah, I fell on that. But it ends up that I learned a nice few
01:08:04.799
things, you know, the things that we actually don't have on the Rails ecosystem like Radix and Redless UI.
01:08:13.599
That's our component library that is unstyled. That means that they doesn't
01:08:19.839
have CSS. They just handle the hard parts, the behavior of components and
01:08:27.199
the accessibility. The accessibility is for the the the most difficult part of
01:08:33.679
crafting uh a component. So uh because I was working with React, I had the
01:08:39.279
opportunity to to learn that and learn a little bit of tailwind and I end up
01:08:46.799
learning uh knowing uh a component library called Chad CN. I don't know how
01:08:52.480
many of you have already heard about it, but it's a very popular component
01:08:57.679
library in the JavaScript world. In a couple of years, they uh went from zero
01:09:04.400
to more than 80k stars on on GitHub. Everyone seems to
01:09:11.600
really love it. And it's a little bit weird because for the alert that you
01:09:17.759
guys are seeing over there, you have to define the arlet the terminal that is
01:09:23.759
the icon, the artlet title, description, and everything else. It's weird weird
01:09:30.000
for us that are used it to just call a hander or a helper and everything is
01:09:37.520
there just in one line. But there is a reason for that and a few people
01:09:43.199
understands why that component library are doing that is because uh everyone
01:09:49.759
remember the bootstrap era that every websites used to look the same and
01:09:56.159
people say oh I have to craft my own uh component library my design system
01:10:01.440
because I don't want to look like bootstrap. So because of that uh component libraries
01:10:09.040
like um Chad CNN does that every component is
01:10:15.199
HTML tag. So with that it's very easy to just put tail in and customize a little
01:10:23.199
piece of that component. So it's meant to be customized. So that's why it's
01:10:29.840
that weird. And another thing is that instead of you
01:10:36.800
have that dependence there, it's meant to be ejected. You just copy and paste
01:10:42.320
the code and put in your own project. And I end up having that code, you know,
01:10:51.280
it's supposed to be a Ruben Rails code, but it's end up to be a JavaScript code.
01:10:57.440
That was my reality back then using React. So, uh, I decided to look for
01:11:03.600
alternatives out there and I find out that project flexi. Maybe some of you
01:11:09.360
guys have seen on Reddit people fighting or it's faster, it's slower than ERB,
01:11:14.719
but doesn't matter. It's not the point. Uh, but I have find out that project. I
01:11:19.760
didn't start the project, but they had everything that I was looking for. Uh,
01:11:25.760
it was 100% open source using flags. I will not I will not try to sell flex for
01:11:32.400
you guys not talk about flex but it's using hot wire it was inspired by Chad
01:11:38.560
CN and I start contributing to that project and I change everything you know
01:11:44.960
the language to look very similar to what I was used it to with the react
01:11:52.400
part you can see that's very similar and one year later I have a rails
01:11:59.280
project again and now we have more than 43 components ready to be used. I'm
01:12:06.800
using in production in my own company. The looks look and feel are awesome.
01:12:11.920
Everything is hotwire based. So I invited you guys to use it and to go to
01:12:18.320
tropical rails next year guys. That's it.