 and also on Twitter and on the GitHub, so, quite a bit. So, most of us here can work with a relational data model or store data in our application. So, let's imagine the typical sales application where we have customers making orders, orders contain all the items which contain products, and we classify these products by product classes. So, a professional data model is good for storing the individual transactions and doing individual transactions. But, when we got analytical queries on top of the data, for example, one day our CEO asked, ask a question, what were the total sales amounts in California in the Q1 last year by product families? So, we, well, if we are a France programmer, so we try to do everything using A rule methods, so it gets quite complicated. So, and even if we look at the general SQL, or if we would write this SQL by hand, well, it's, it's fine to get quite complex to do analytical queries. And so, these are practical queries that users are asking us all the time. And so, we once tried to launch the Rails console and teach our business users, so it's quite easy to write down these data queries and unfortunately, we failed. So, well, what we can do, well, we asked some consultant, they suggested us, well, you should do a SQL, since it goes back with that. Or maybe we can just go into the history that's some 20 years ago, so there are some books about that, about data warehouses and all the dimensional data modeling. And what these techniques suggest in that, so what is this dimensional modeling? When we look at these analytical questions that our business users ask, we try to identify the data model of that. So, typically, these questions, we have some facts or measures we might analyze like sales amount or quantity, et cetera. And we want to analyze these measures by some dimensions, like by customers or regions, by time, by products. And we should use these dimensions and measures when we're building our data structures and data query. So, one technique is deeply that we store our data, we organize for a store of data in the database in so-called data warehouses using this star scheme where we have these packed tables with these measures and then with foreign keys linked to these dimension tables. But, so when we want to query the data, we probably don't want to limit us to this two-dimensional table model. And a much better data model is this multidimensional data model where we imagine that we have this multidimensional data queue by all these different dimensions. And in the intersection of these dimensions, we store these measure values, like in our example, we have sales data queue and we have a customer's product, time dimension, we have these measures like sales quantity, sales amount, sales cost, et cetera. And in each dimension, we can have also different hierarchies. For example, customers we've done again by geography, by cities, states, countries, et cetera. And there are technologies which handle these multidimensional data models quite well and these are typically called all-act technologies or all-analytic processing technologies. And one of the most popular open source project is the Mondrian, Pentachomondrian project, but which is Java library. And therefore, so when I found it out and so some four years ago, I created a Mondrian all-of-Jekyll Beach End which wraps this Java library and provides with some additional good things, so the first thing I mean. What made you do that? Yeah. Yeah. So to avoid writing XML schemas, we can do in Ruby DSL this kind of schema. And then when the business users ask these business questions, so we get very short and concise DSL for writing these queries which generate corresponding MDX query statements which process by a Mondrian engine and then which retrieves the data in this multidimensional data. And so it does results caching so that when you retrieve that they do the same queries multiple times so it gets from in memory cache so it doesn't do scope queries all the time. So you get some calculation formulas in addition to that sort of thing. Yeah. And yeah, so we use this underlying that technology which enables you to make some nice user from that which we do in Ruby DSL. Last year, you might think that you've already seen this talk, but you haven't. So the language I'm gonna talk about just came out early this year, so you were mistaken. So it's a new language that came out a few months ago. It's imperative for change like all Disney functional languages that just ridiculous. This guy made it, a pretty active guy in the community. People don't see him around that much but he's actually coding. So this is how it looks. It's pretty concise. Most of you will be familiar with it if you've done an Java or a Go. So it's easy to learn, like don't worry about it. It's super minimal. It's not bloated at all. This is the minimum program you can write in some compilers of it. It's also very modular. It has a module system. It's called a C pre-processor and you can just include other modules so you can have your application separate in different files. It's really cool. It's also very clean. It's practical. It's none of this Haskell bullshit. It's really practical, like to the point. It even has type inference. I mean, you don't need to annotate all the types. So if you put a string literally, it knows that it's a string. And with the numbers, it knows that it's numbers. So that's quite smart. It's also very expressive. You can practically do whatever you want. It's pretty nice as well. It's a bit unsafe, but it gives you a lot of freedom. It's really good. Freedom. Well, if you've done any Java, if it compiles, it probably works. Well, with these languages, if you could type it, it probably compiles. That's even better. It also has runtime polymorphism with void star. It's pretty nice. So you can have a function that takes different arguments of different types. It also supports great concurrency. Forget about all these new concurrency models. Threads, they work great. So no problem. It also supports efficient memory management. No garbage collection. That's just too slow. So you just free your references. That works pretty well. It's really fast. Really fast. But not as in fast food, bad for you, but more like really fast and quick. And it has a vibrant community. I mean, you really can't beat that. Look at all this. All of this is in C. Just a few months, all this software. What it doesn't have, it doesn't need. So we don't accept all these people trying to implement things. No. It's very fast. Did I say that already? It's really fast. Really fast. And that's all you need to know. Thank you. Try it out and tell me how it went. So, I have a confession to make. So, I I made this website, which is a biographical, basically a dictionary biography of German designers of the 20th century that stayed in Germany during the period of the Third Reich, which is a project from a guy called Gerald Cinnamon, who's one of the world's most renowned typographers and historians of typography. But this is what he gave me. This is a Word document. It had about 500,000 words in it. That's quite a lot of Word documents. But of course it's just XML because it's a new Word, right? Just XML. So we can use knock a geary to do stuff with it. But, have you seen Word XML? It's kind of this, like, if you've ever done it, is there any here written in any XSLT too? XSLT, right? Who's done monsoon grouping? Right? Like, catholic, monsoon grouping you need to process. XML from Word documents. You need XSLT too, because it makes it quite easy. But, there's no XSLT in knock a geary. No XSLT too, just XSLT1 because it's either LibXML in C or it's Xerxes in Java. There's only one open source XSLT2 processor. It's called Saxon. It's a Java library. It's really awesome. It makes it super nice. Have you seen the Java API for XML processing? So the real question is, faced with the situation like this, do you write horrible code or do you try and do something about it? And actually, it turns out that if you don't like that, you can make it work like the thing that you do like. So I set out to make a gem, which wraps Saxon XSLT processing and makes it look like knock a geary. And that is basically a thing that was so easy after I'd spent a bit of time getting my head around JRuby properly and getting my head around the Java interfaces. I could knock something basic together in a weekend and there's all these things that are super interesting and powerful, they're really hard to use, but actually you can turn them into something that is Ruby-like pretty straightforwardly. Things to remember, put gem platform Java in your gem spec so that people don't try and install it and see Ruby and wonder why it doesn't work. Vendor the Java live in your gem. If it's a simple dependency, just vendor it in there so that people can do gem install, it just works. But the real thing is that you need to put extra work into nail the API because you wanna make something that allows people to write idiomatic Ruby, not just to shim around a complex Java interface. And that took me a little while, but I've got something that works just like knock a geary. You wouldn't know the difference. You can just copy and paste code, change the require, just works. That's it. Thank you very much. That's me. I can go in now.