00:00:12.480
This session is called Lightning Talks because it's supposed to be lightning fast. So, everybody gets five minutes. I have a timer here that I'm going to display.
00:00:19.279
When the timer runs out, I want you all to stomp, clap, and shout so loudly that the speaker has to stop talking, okay? Let's try it out now. Make some noise!
00:00:32.640
No, wait! I insist you boo me off the stage. Let's try that, yes? But keep in mind, if you throw things, throw them at him, not at me. Alright, so everyone, please introduce yourselves in two words. You might also want to mention what your talk is about.
00:01:02.879
I am Norbert, and my talk is about words. Okay, rock and roll!
00:01:10.320
I have a confession to make: I am a Ruby programmer by day, and I write Clojure at night. Participating in both communities, I’ve noticed certain things, for example, this talk is about words; I see in the Clojure community that don't show up in the Ruby community and I think it's time to change that.
00:01:21.520
Everyone talks about how happy they are writing Ruby code. The word 'happy' actually comes from the root 'hap,' which means lucky. The word 'joy' comes from a Latin word that means to take delight in. When I write Ruby code, I am most definitely happy, and when I read it, I feel happy. However, I've learned that Clojure code gives me joy.
00:01:39.840
Happiness can be fleeting, whereas joy tends to be more sustainable. The closure community is very vocal about the difference between simple and easy. By definition, simple means not complex, while easy means something familiar that is easy to understand. Just because something is easy doesn’t mean it is simple.
00:02:05.600
Next time you're discussing a library or a language, think about whether it is simple or just easy. For long-term stability, we need to build simple systems, not just easy systems. The concept of 'complex' is one of my new favorite words. It literally means to braid together.
00:02:37.599
On the other hand, 'compose' means to put next to each other. We often talk a lot about refactoring. In Ruby, we discuss moving code into modules or different classes, creating inheritance trees, or even using service objects or microservices. However, simply moving the code does not improve the system if it does not decomplect. You need to ensure that those components don't know about each other and still function properly.
00:03:41.200
Think about how you can decomplect your system because the only way to build a better system is by ensuring composability. Simplifying your system by creating several composable parts will often lead to more pieces, but each will be simpler and will compose in new ways you might not have realized possible.
00:04:10.000
As developers, we are infatuated with building tools and reinventing the wheel to make our lives easier. However, we must remember that we are not in the business of making ourselves happy; we are in the business of making our customers happy.
00:04:30.000
We spend too much time discussing constructs like programming languages, libraries, and tools. These constructs do not necessarily indicate that the final running system is better. They are useful, but let's not lose sight of the actual systems we run. Simple, in this context, tends to be objective, while easy is subjective, depending on our familiarity with it.
00:05:09.280
What I want you to take away is to think about the actual artifacts and how the technology choices you make affect the complexity of the final system. I’ll be around all week, so if you want to discuss this further, feel free to approach me.
00:05:40.000
Thank you!
00:05:47.440
I have an announcement: everyone who gave a lightning talk yesterday or will give one today or tomorrow can win an ebook from Prague Programmer. Please tweet the title of your lightning talk to @wrotelove.rb, and you might win a book.
00:06:14.400
Test, are you ready? Five minutes, you know? Okay, so I need to be very quick. This talk is about the Crystal programming language.
00:06:33.840
So what is Crystal? It has a Ruby-inspired syntax, is as efficient as Ruby when writing code, and as efficient as C when executing code. Crystal compiles to native code using LLVM, and while you can specify types for your variables or method arguments, it is not mandatory.
00:06:51.360
The code is evaluated during compile time, allowing you to catch some errors early rather than at runtime. The installation process is straightforward; based on your operating system, you simply run a specific command and get a nice binary to execute.
00:07:10.800
You can execute Crystal programs in two ways: on the fly, meaning you point to a Crystal program and execute it without generating additional artifacts, or by separating the process into steps.
00:07:33.919
Current status: Crystal is in a pre-alpha stage. While it is stable, it still requires improvements. Interestingly, the compiler for Crystal is written in Crystal itself, featuring a conservative garbage collector that is going to be replaced in the future.
00:08:05.120
Regarding Crystal versus Ruby, porting code from Ruby to Crystal is quite easy, while the opposite can be more challenging. Code written in Crystal behaves similarly to Ruby, and one of the benefits of compiling to Crystal is that you may uncover bugs during compilation that wouldn’t appear until runtime in Ruby.
00:08:38.800
However, there are limitations in Crystal. Incremental compilation is not possible, meaning if you change a type, you have to recompile everything from scratch. Currently, it's not a dynamic language; variable types are assigned after compilation.
00:09:16.480
Before getting into some code examples, here are some resources for deeper understanding of Crystal and its documentation.
00:09:38.880
Now, let's jump to some code. Here’s a naive Fibonacci implementation that calculates Fibonacci numbers, specifically the 36th number, in Ruby.
00:10:03.120
It takes about two seconds to complete. Let's try it in Crystal.
00:10:29.519
As anticipated, it runs much faster, demonstrating one of the primary benefits of Crystal over Ruby.
00:10:37.040
I can also show you another example, demonstrating attribute assignment in a constructor.
00:10:45.560
Thank you very much! Does this work?
00:12:01.440
Hello everyone! I’m Magik, here to discuss pagination in APIs.
00:12:07.120
In our production application, we initially used a simple approach: the client (in this case, an Android app) sends us a timestamp, and we return everything that's newer. This approach worked well until we encountered a situation where the client promised not to send large amounts of data.
00:12:19.120
As it turns out, the promise was broken; we ended up with over 10 megabytes of data, which posed significant challenges for the Android client due to its garbage collector limitations.
00:12:50.000
We began experiencing memory issues both on our Heroku server and on the Android client itself, which led us to realize we needed a pagination system.
00:13:11.360
While the simplest case involves using Kaminari with a constant page size, we encountered issues when items were deleted from the data.
00:13:30.960
For example, if the server initially returns a first page but an item is deleted, what is considered the second page may not contain data we intended to send.
00:14:10.080
To address this, we decided to leverage a timestamp to remember where we left off and continue pagination from there.
00:14:28.000
This approach allowed us to return a second page with a consistent set of data, even if some elements were deleted. The client sends us the first timestamp and the desired page size. Regardless of the deletions, we return the timestamp to the client to maintain sync.
00:15:09.120
Thank you!
00:15:39.120
Hi everybody, I'm Oscar Schreier from Ragnarzone. Today, I am going to talk about the ROM (Ruby Object Mapper).
00:15:57.040
ROM was created by Patricio Niza, who is not here today but is well-known in the community for his contributions. How many of you have used ROM or TRIOM? Not too many, I see.
00:16:19.520
Let me quickly address the common misconceptions: ROM is not the same as Active Record and it doesn’t implement the full Data Mapper pattern; it is focused on mapping.
00:16:54.720
The main components of a ROM setup include a mapper, relation, adapter, and commands. The adapter acts as a bridge between your application and the database, which could be SQL databases, CSV files, or YAML.
00:17:40.960
Commands are where you create, update, or delete data, and they adhere to the CQRS (Command Query Responsibility Segregation) principle. The mapper is crucial as it shapes your entire data structure rather than focusing on individual tables, while relations encapsulate your database logic.
00:18:03.040
Now, let's look at some examples. Here we have ROM set up with the memory adapter, allowing us to query by name to retrieve user data. It’s lazy-loaded, meaning you need to call it explicitly.
00:18:46.240
Using the relation, we can filter users by name or age and create new users effortlessly.
00:19:02.320
Thank you very much!
00:19:31.840
Hello everyone, I want to share how to crash Ruby.
00:19:44.320
How many of you think Ruby 2.x is production ready?
00:19:57.040
To demonstrate this, I'll show you some examples of issues you can encounter.
00:20:10.960
For instance, we can create a recursion with two variables named 'place' that reference each other. This should raise a stack trace exception.
00:20:23.760
Oops, and this is an issue that was reported five days ago.
00:20:32.960
Another example relates to BigNum; when we multiply it and expect a specific result, we end up with unexpected behavior.
00:20:48.640
In this demonstration, we see that the expected outcome is not met, which reflects an issue that was reported four months ago.
00:21:06.560
Yet another scenario involves using a hash with a default value leading to recursion when it tries to generate a default value.
00:21:31.760
For instance, if a method is invoked with a name parameter and we mistakenly use a string instead of a symbol, we run into errors as well.
00:22:01.760
It's crucial to stay cautious and keep Ruby updated to avoid these pitfalls.
00:22:15.760
Thank you!
00:22:23.760
Now, let's talk about React and react hot loader, which allows you to swap your JavaScript without losing application state.
00:22:43.760
Let's take a look at how it works with a simple React application.
00:22:57.760
When I change a component and hit save, it refreshes without needing to reload the entire application.
00:23:10.800
This feature is particularly useful for applications that need to function without an internet connection for extended periods.
00:23:38.560
For example, if you update your production code on the back end, you usually have to refresh to see the changes. With hot swapping, users don't need to refresh their applications, enhancing the user experience.
00:24:11.440
Thank you!
00:24:19.440
Finally, let's discuss software estimation, a common but often flawed practice in the development community.
00:25:00.160
Estimating tasks can become complicated once legacy code is involved. It’s a minefield where assumptions often lead to inaccurate estimates.
00:25:35.520
Software development is not simply about coding, but also a learning process, and learning cannot easily be estimated.
00:25:58.560
Learning tends to be nonlinear and can’t easily fit into a spreadsheet model.
00:26:25.760
Pressure can inhibit learning, and therefore it’s advisable to approach project timelines with that in mind.
00:26:40.960
Lastly, the development process includes not only coding, but significant amounts of waiting and decision-making, all of which can impact productivity.
00:26:54.080
Can we estimate this waiting or decision making? Often, these aspects are what bring projects to a halt.
00:27:05.920
Thank you for your attention!
00:27:18.880
Now let's shift gears and talk about PHP. If you've ever worked with it, you might know about Active Admin. Recently, a new library emerged that improves the customization process, bridging the gap between Active Admin and standard controller functionality. This library is modular, fully customizable, and easy to get started with, featuring a generator to create a basic controller.
00:37:48.000
Additionally, I'm excited to share another project: Code Quack, a platform for learning various IT technologies. This platform is akin to Codeacademy and Code School, providing interactive lessons directly in your browser.
00:38:14.000
Code Quack, which currently caters to Polish speakers, will officially start offering courses on April 15th, covering programming basics and SQL, among others.
00:38:35.000
If you have any questions, feel free to ask me. Thank you very much!