 Hai, semua. Nama saya Zwan. Saya seorang pemimpin teknikal di Raccoon 10 Vicky. Semoga semua orang telah berminat dengan cukup. Selepas semuanya berjumpa di sini hari ini. Mari kita lanjutkan bahagian lain tentang Ruby. Sebenarnya hari ini, kali pertama saya bercakap di luar Raccoon 10 Vicky, banyak orang dari komuniti belum melihat saya. Terutamanya teman-teman kami di Raccoon 10 belum melihat saya dan melihat saya bercakap tentang perkara lain di luar Raccoon 10 Vicky. Jadi ini adalah kemungkinan untuk anda tahu apa yang saya belajar tentang apa yang saya lakukan. Jadi di Raccoon 10 Vicky, kami bekerja setiap hari untuk membawa kemungkinan kemungkinan kepada pelanggan. Kenapa tidak kami memberikan kemungkinan kemungkinan dan kemungkinan semasa kami melakukannya? Jadi melepaskan kemungkinan dan kemungkinan kemungkinan kemungkinan dan kemungkinan kemungkinan adalah salah satu kemungkinan terkenal di Raccoon 10 Vicky. Jadi hari ini saya akan berkongsi dengan semua orang pengalaman kami bekerja sebagai sebuah teman di luar Raccoon 10 Vicky. Kita akan pertama bercakap tentang perkara-perkara yang kita melakukannya, perkara-perkara yang kita gunakan dan perkara-perkara yang kita lakukannya untuk melakukannya. Jadi pada akhir hari ini, kita semua berkongsi dengan sebuah pelanggan. Jadi bagaimana anda tahu tentang Raccoon 10 Vicky? Bagus, lebih daripada yang saya menunggu. Jadi Raccoon 10 Vicky adalah platform video-streaming yang mengubahkan diri kami dengan kompetitif kami dengan mempunyai sub-title-title-title yang ditanggung oleh komuniti kami di seluruh dunia untuk bahagian yang berlainan. Dan kami juga cuba membuat pengalaman kami untuk menggunakan pengalaman kami untuk menjadi lebih menarik dengan menggabungkan kemungkinan berlainan, berbincang dengan perbincangan, perbincangan dan sos untuk berita anda dan semua pembunuh. Jadi, saya sedang mengambil peringkatan saya. Saya membuat peringkatan peringkatan perniagaan semasa kami mengambil setiap jenis peringkatan Vicky. Kami membentukkan peringkatan peringkatan peringkatan dengan peringkatan peringkatan Vicky. Kami membentukkan peringkatan untuk aplikasi web untuk penggunaan internas, untuk perangkat kami untuk membentuk peringkatan kami, untuk komuniti kami untuk menggabungkan peringkatan Vicky dan semua jenis peringkatan. Jadi, semua ini sebenarnya telah dibuat pada Ruby. Jadi, saya tidak fikir semua orang ada soalan tentang performa. Okey. Jadi, kami memulakan peringkatan ini 5 tahun lalu pada Ruby di Rails, yang adalah, saya rasa, 3 soal sesuatu. Dan kami mempunyai peringkatan yang paling teruk, 4.6. Maksud saya, maaf. Jadi, saya rasa kita memulakan semua soalan yang lebih politikal. Tetapi, kerana Ruby sangat bagus untuk membaca dan menulis. Dan ia membuat peringkatan yang lebih cepat, lebih bergantung kepada bahagian yang lebih kuat, seperti Go, Java, atau Scala. Ia juga memberikan kemasan untuk menulis peringkatan yang cantik, yang boleh dibuat seperti Inggris. Macam mana yang cantik itu? Jadi, semasa kami dapat lebih banyak peringkatan dalam projek kami, peringkatan akan mulai menjadi lebih besar dan lebih besar. Dan kami mempunyai peringkatan yang sangat besar. Jadi, apa yang masalah untuk mempunyai peringkatan besar? Ya, dia mempunyai banyak pula. Jadi, apabila kamu mempunyai banyak pula, kita mempunyai banyak perkara untuk membaca. Anda mempunyai banyak perkara untuk tahu dan peringkatan dalam peringkatan peringkatan kamu menjadi suatu mencuba. Dan sekarang, mempunyai sebuah pembinaan ke dalam gambar ini. Kita dapat orang yang datang dari berbagai begurau, mempunyai pengalaman yang berbeda, mempunyai jenama yang berbeda dan mempunyai peringkatan yang berbeda. Jadi, sebuah sebuah kota boleh dibuat dengan cara yang berbeda Jadi, setelah memperkenalkan keadaan Oh, minta maaf Setelah memperkenalkan keadaan, setelah kita perlu memperkenalkan keadaan orang lain dan bahkan keadaan sendiri setelah masa jika anda tidak memikirkan keadaan Okey, mari kita tambahkan Rubin ke dalam gambar ini lagi Rubin juga mempunyai keadaan, keadaan, flexibiliti keadaan, tidak memperkenalkan keadaan yang hebat anda boleh menghasilkan kota di dalam gambar tetapi tanpa cara yang benar untuk membuatnya tiga keadaan ini bersama sebuah kota bekerja di Rubin ke dalam gambar yang besar kami akan membuat keadaan keadaan ke dalam gambar ke dalam gambar yang kita biasanya disebabkan keadaan keadaan Okey, jadi dalam Vicky, kami akan okey, sekejap jadi semua keadaan bersama, kami akan memperkenalkan keadaan untuk memperkenalkan keadaan untuk memperkenalkan keadaan sebab anda tidak dapat mengalami keadaan untuk memperkenalkan dan mengawal keadaan untuk memperkenalkan keadaan yang hebat dan keadaan memperkenalkan keadaan dan biar saya memisikan anda keadaan keadaan adalah sebenarnya penerangkan keadaan ke ribu ke syarikat dan keadaan keadoan dan keadaan ialah Qedru Baek. Kita clinic tidak mahu itu jadi mari kita mengambil dan kritisia yang kita gunakan untuk menggantikan perkara yang digunakan. Jadi kita akan mula melihat perkara yang saya terus berlalu dan lagi membaca dalam kualiti saya. Jadi mari kita kembali ke semua kursus ini. Kita akan mula melihat cara untuk menggantikan kursus ini sebenarnya kerana kecuali pembentangan kursus. Kursus menggantikan kursus untuk kecuali. Dan semua ini adalah kerana kecuali yang berlaku dan kecemasan. Jadi, pertama perkara yang kita akan menggantikan adalah mempunyai stabilisasi kota. Jadi, apabila anda mempunyai banyak kota, anda tidak benar-benar mempunyai kota dan anda tidak ingin melakukannya. Jadi, anda akan menjadi hebat. Anda dapat melakukan kerja dengan mencari kota yang minimal. Dan anda akan menjadi lebih hebat. Jika anda boleh, tanpa menulis kota itu, anda masih dapat mencari bagaimana kota yang ditunjukkan, bagaimana cara yang digunakan, bagaimana keputusan yang digunakan, dan anda boleh menggunakan metode seperti jika anda adalah orang yang menulis kota. Bagaimana keputusan itu? Sebelum masa, anda akan menyelamatkan banyak masa anda. Jadi, sebelum kita mulakan menulis kota, anda selalu mempunyai kota. Jika kota tidak menulis oleh kita, adakah kita akan menunggu kota di sana? Adakah kita akan menunggu kota untuk membuatnya dengan begitu? Adakah kita akan memperkenalkan keadaan kota yang akan membuatnya? Jadi, setiap keputusan sebelum kita menulis kota. Pertama, ia memperkenalkan keadaan kota. Jadi, sebaiknya anda akan mencari 5 minit untuk mencari dan mengahwini 20 lalu kota. Setiap kali anda menunggu, anda akan perlu terus melakukan ini sebegini dan sebegini. Dan sebarang kota dengan orang di dalam kota anda, pada masa itu anda akan mempunyai sebuah kota yang sangat besar untuk perjalanan dan keadaan kota anda sendiri. Sebelum kita melakukan apa-apa yang kita minta, setelah kita menulis kota, anda akan minta, bagaimana masa yang perlu memahami kota ini untuk kami? Okey, jadi, mari kita bergerak. Jadi, ia sebabnya kita cuba memperkenalkan diri kita sendiri. Kita bekerja bersama di Rakyunan Vicky sebagai sebuah kota dalam organisasi kita. Kita cuba memperkenalkan diri kita sendiri dari sebuah kota yang memperkenalkan keadaan kota yang berbeza. Jadi, kita mempunyai keadaan kota yang terkenal untuk mencapai keadaan kota yang terkenal. Okey, jadi, keadaan kota atau keadaan kota yang terkenal adalah keadaan kota yang terkenal dalam kerja kota. Jadi, saya tidak perlu beritahu lagi tentang itu. Jadi, saya akan pertama bercakap tentang bagaimana kita akan membuat semua ini, seperti memasukkan keadaan kota, keadaan kota, keadaan kota, keadaan kota dalam kota kota dan keadaan kota. Dan semua keadaan kota, keadaan kota, keadaan kota dan keadaan kota. Okey. Okey, jadi, mari kita mulakan dengan sebuah keadaan kota. Apabila kita memperkenalkan kota kita, kami cuba memperkenalkan sebaik-baik saja keadaan kota yang terkenal. Jadi, bagaimanapun, anda dapat melihat keadaan kota. Ia adalah keadaan kota yang hanya mempunyai keadaan keadaan kota. Kota adalah di mana anda mencubanya dan memperkenalkan keadaan kota. Dan tidak ada keadaan kota. Jadi, keadaan kota adalah apabila anda membuat update, memperkenalkan keadaan kota. Kontrol adalah API. Presenter hanya memperkenalkan keadaan kota dan memperkenalkan jason, sml dan apa-apa saja keadaan. Dan setiap ini, saya rasa dalam aplikasi anda akan mempunyai beberapa komponen ini. Jadi, perkara yang bagus tentang mempunyai komponen yang penting adalah anda hanya membaca nama mereka, anda tahu apa yang berlaku. Anda tahu apa yang berlaku, apa yang berlaku. Anda tidak perlu masuk ke dalam aplikasi. Jadi, saya akan berkata, penggunaan penggunaan. Anda tahu bahawa itu hanya mempunyai keadaan kota, keadaan kota. Apabila anda tahu bahawa ia mempunyai metode kofine, kori dan sebagainya, apabila anda tidak mempunyai update, membuat memperkenalkan kota. Okey. Jadi, anda membuatnya lebih berlaku apabila anda membaca, apabila anda memberikan anda masuk ke dalam aplikasi. Okey. Jadi, saya akan memberikan sebuah contoh mengenai apa yang tidak memperkenalkan kota. Jadi, aplikasi aktif adalah komponen yang sangat common dalam aplikasi kota. Jadi, sebenarnya, OIM di dalam aplikasi kota. Di dalam aplikasi kota, ia mempunyai hubungan. Sebenarnya, anda dapat memperkenalkan objek di dalam aplikasi kota. Anda dapat, sebenarnya, mempunyai aplikasi kota di mana anda dapat memperkenalkan data dan memperkenalkan data ke database. Dan ini, dan lebih banyaknya, ia mempunyai semua oop behavior. Okey. Jadi, tidak ada cara anda dapat memperkenalkan, sebelum anda memperkenalkan aplikasi aktif, aplikasi aktif, tidak ada cara anda dapat memperkenalkan apa yang ada di sana. Dan sebaiknya anda tidak dapat memperkenalkan perkara, anda tidak dapat memperkenalkan apa-apa. Okey. Jadi, aplikasi aktif sebenarnya adalah sama dengan aplikasi kota, aplikasi kota, aplikasi kota, dan lain yang saya menyebabkan di dalam slide yang terbaik. Sebabit itu, sebab itulah kita, kita cuba memperkenalkan kebiasaan kebiasaan aktif hanya sebagai model, dan dan menggunakan layak kota di dalam kedai dan repositi sebagai imbimentasi. Dan beberapa perkara lain yang kita akan menyebabkan di atas kota. Sangat baik sejauh. Sangat baik sejauh, maaf. Okey. Okey. Jadi, apabila anda sudah mempunyai semua komponen responsibil ini, semua mereka tidak dapat membuat aplikasi yang lain. Jadi, kita menggunakan memperkenalkan kebiasaan kebiasaan responsibil untuk menghubungkan layak kota yang terbaik. Ini hanya sebuah modul yang lebih tinggi yang menghubungkan objek yang lebih tinggi. Okey. Jadi, mari saya memberikan contoh bagaimana kita mempunyai kebiasaan kebiasaan kota. Jadi, ini adalah cara tradisional yang menulis model model aktif. Apabila saya mahu memperkenalkan e-mel, memperkenalkan e-mails, tetapi apabila anda mempunyai sebuah kebiasaan kebiasaan ini, anda dapat mempunyai apa yang lain. Anda dapat mempunyai pembinaan pengguna, memperkenalkan ke toilet dan sebagainya. Jadi, anda dapat memperkenalkan apa-apa dari sini. Jadi, kami menulis menggunakan pembinaan. Jadi, pembinaan ini hanya membuat satu perkara, memperkenalkan pembinaan. Jadi, kita dapat mengenai pembinaan pembinaan kegiasaan. Jadi, anda akan mengambil pembinaan sebagai pembinaan yang sebenar, pembinaan yang sebenar. Mereka perlu mempunyai pembinaan yang sama seperti ini. Jadi, dengan memperkenalkan pembinaan kepada pembinaan, kami dapat memperkenalkan pembinaan yang mudah dan tidak terpaksa seperti apa yang diperkenalkan. Dan satu perkara yang lebih hebat saya berikan kepada anda bahawa kami bercakap tentang pembinaan yang besar. Apabila anda dalam pembinaan yang besar, faham fazil adalah seorang teman yang terbaik. Tiada siapa mencari pembinaan. Semua orang mencari pembinaan. Apabila anda mempunyai pembinaan yang terbaik dalam pembinaan, ia akan lebih mudah untuk mencari. Jadi, apabila saya mahu memperkenalkan pembinaan yang mudah dan bos saya beritahu saya untuk mengubah atau membaca tentang logik pembinaan. Apa yang saya perlu lakukan adalah membuat pembinaan pembinaan dan pembinaan akan keluar. Jadi, ini akan menjadikan pembinaan yang terbaik dengan pembinaan. Okey? Okey, itu apa yang saya bercakapkan tentang. Mereka tidak memperkenalkan tetapi, kami juga memperkenalkan pembinaan yang sepatutnya kepada pembinaan kami. Jadi, dengan pembinaan yang sepatutnya pembinaan yang sepatutnya bermaksudnya ia hanya memperkenalkan seperti meletakkan kelembangan, menghabiskan kawasan atau apa-apa. Atau ia dapat mengawal pembinaan yang lain pembinaan yang tidak berpempatan. Atau ia membuat agungan untuk pembinaan untuk pembinaan yang tidak berpempatan untuk pembinaan yang sepatutnya untuk pembinaan yang sepatutnya. Mari saya memberikan contoh untuk ke третьa. Jadi, saya minta perempuan saya menjadi pengkeluaran untuk mengubah semua pembinaan daripada daripada rawah-rawah kepada perempuan yang baru. So it's a code being written. So you take quite a amount of time to find what's happening here even just by English alone. So by rewriting it here, you can read it's just like English which is pretty hard to do in another language. So you can read it like, My great financial actually equal to my great role from the old roles to the new role. Okay, so it's much easier for significantly improve the readability of a code. So this actually only prepare the arguments for this method which actually can generally apply for everything for any group of arguments. Okay, so let's move on to code readability. So far we've done with predictability and searchability. So inside the loose typing world, service discreetly naming is your best friend. It's the only thing that can tell you what is there, anything for you to expect before you do something. Okay, let's talk about service naming. So far, I want to create a service that do subtitle import, to import subtitle. You name subtitle import service, you're going to take all these arguments because this doesn't have any scope. So it means that it give the expectation that it doesn't have any scope. So you need to pass in arguments. So if I want subtitle import to belongs to a specific videos, I'm going to add a scope in. Okay, and before I walk into this file, I'm going to give me expectation that videos is the attribute reader of this method. Or this is our service. And I can use all this method without passing parameters. Okay, so method naming. Yeah, method is pretty much the only way you can know what this method method do. So it's supposed to have actions. It's supposed to imply argument types and quantities. It's supposed to imply return type and quantity. So give me example, fetch users. You're going to imply that it's supposed to return an array of user. Fetch user, supposed to return a single object of user. Far more, if I have an object that mutate the users, I say disable users. When I use it in another context, I need to know that it's supposed to take in an array of users and argument. So it's going to give me more expectation as you read the code or try to reuse a method. Of course, there are boolean method that is like have question mark on the back which is the best signature of Ruby. That's why I'm not mentioning. Okay, variable naming, which is a very common case. Okay, and we do move on to... So Ruby give us the capability of write code as read like English. I can say here it's a capability. You can choose to do it or not. Okay, so let's give an example of this. So pagination is something very common in a controller. So we decided to write a paginate method to take either active record relations or array of objects. And we don't need to care about what object type it is. So we can just use it easily inside of controller. So let's look at how paginated items being written. So if the object, if the items is an active record relation, I'm going to use paginate method of active record. Else I'm using cuminary. Okay, because Ruby is dark typing, so we can just check for the... Use respond to to check for the capability of paginate method inside this. They look pre-fine like a very common Ruby code. So but like one month from now when I'm walking to ochre again, the question I'm going to ask myself is why am I using paginate here? Okay, so it takes me like five minutes, I think it's longer to like, no okay, cool, actually because it's active record related. So I rewrite the code at the immediate variable that is like become more descriptive. So at four, like one month from now and I'm coming back, okay, I got roughly idea like why am I doing this? Okay, so actually you can take actually you can take one step further to make the code look even more like English. So the paginate item you go to if it's record relation, I'm using active record. Else I'm using cuminary. Okay, perfect English. So actually this will save a lot so instead of struggling reading code in Rakuten Riki, we rather spend time to create more values to our customers and some other meaningful stuff. Okay, so let's come back to the requirements again. If the record, if the items is active record relation, we use active record pagination. Else if it's an array, I'm going to use cuminary. So if I'm passing a link list here, what's going to happen? Okay, it's actually going to be paginated using cuminary. Which is going to, it might work. Okay, I don't say it won't work. It might work. But you'll pass something similar to array but it's slightly, the information slightly different from array. You're going to, if you see the code still works, you'll still get whatever you want. And but it's going to be slightly different in production and going to take you a lot of time to debug. Why is it happening? So if we try to be more discreet about what we support and what we don't. Okay, so if you only want to support collections, array, the rest we just read not supported until we encounter it in the review scenario. In production or in most of Ruby code will play in production before we know it. Ya, so I always support what's supposed to be supported. So we can have less side effect and no silent failure. I want to talk more about silent failure later in some other examples. So one another challenge of working with Ruby is crossing context beta passing. What I mean is when you declare a function in a place and you use it on another file. Okay, so let's look at this. Now I want to create a upload method to upload a file, take body, path and expires with all these interface. So now in, so I'm going to use it somewhere else. Just imagine you don't have this inside your review and you write your consumer code. Okay, so for some reason, for some mistake, you switch the place of these two. Your specs to work. Because inside your consumer code, very likely you're going to mock this upload method if it's actually set up or upload request. So there's no way you can notice that your code is actually breaking. And you just say, why is it not uploading? Then you check, okay, why is it, why is the URL look so different? Huh, sorry. Keyword methods or your best friend? It's down and you're down here. I'm coming to it. Okay, so one step to make it to be slightly more predictable is because this actually got different in type. So we're going to use some, so I think everyone starts talking about like strong typing in Ruby. So we start applying it in Viki. So it's like gradual strong typing. So we don't want to bring it all the inflexibility of strong typing into Ruby. Gradually is good. Okay, so this is how the code look like. So if you wrongly flip this, evenly you will know, like why. Okay? But if you flip these two instead, it's no way. It still works. Okay, but, okay. So another way is using name argument or you call hash argument, which is a very cool feature that introduced in Ruby 2.0. Yeah, so this will, you make the code become much more predictable. This one, you will very likely going to make a human mistake here unless you're really drunk. Yeah, yeah. So, okay. So this will actually become, this will be very perfect in this example. But as you, everyone do upload, you know, you're going to start adding on and on and on, more options, more custom mutation into here. So if your argument list actually larger than five arguments, it will to become a bit bulky. So the normal way of people doing it is using hash and hash is the most awesome thing here. There's no way you can identify what the, there's no way you can know what is the key type. Is it a string or a symbol? And what are the keys that you have except you are the writer of the method? Okay. So one of the way to solve it is to document it. Okay. You still know what is here. Look P, okay. So like just imagine, this method need to be, this argument need to be passed over and over again through multiple layers. Controllers to surveys, to survey, to survey, to survey. You need to keep documented over and over again. And you don't want to do it because if you change something, you need to keep doing it. Okay. So if we keep what we do is for this kind of very specific purpose thing, okay, always purpose driven programming is we use value object and we add one more thing is we write our own strong typing library which is we are still POC we now code that's why we are not introducing it on the community yet. So don't ask about it. So, okay. So by having it here, by having it as a value method, a value object and having the strong typing, like gradual strength typing here, you when you got key to here, we will roughly know like what is there and what for you to use. And it much easier to use like attribute rather than using a hash key to assess data. So whenever you need to use it evenly documented with like this class. Ya, so the code documentation will be much structured and it much easier to know what it is. Okay. Yes, that's what I'm talking about. Okay. So let me keep it one I'm not going to tell you about Viki. Viki is following microservices architecture. So our application is actually just a microservice within the whole ecosystem. So we take data from multiple APIs and from external APIs. So if you need to keep go if you want to know what data and setup response you need to keep over come to the documentation of all those over and over again. So just a number of team member you have you going to cost a lot of extra time. So by having it so we usually will just document the model of that third party APIs or even the internal API within our code just the model itself. So when we want to use it we know what is there for us to use. And even so the and the better thing is we actually is the internal tools. We are the we are the only input of all the time to Viki. So we play our role as a gatekeeper trash in trash out so like the bad content coming in bad content coming out. So if someone change the contract like what they going to give us and we don't have like any kind of validation inner validation they going to break our code silently and we don't want that to happen here. So strong tapping actually help us to to guarantee our code to be more reliable at least in term of document self documentation and and validation. I think future documentation is roughly similar to the one I'm talking about pagination. Yeah. Do you know what it is? So so so far we all talk about predictability and exception and predictability never coexist in anywhere. So if for example like if you someone say I just want to add this verify method into the user model because a user supposed to have a verify method. I just want to add this this is the only one but once you make it exception there will be more exception coming in and once the exception there is no way you can predict what is there inside that user model. So exception is the other thing we always say no when we write code. You can make to think to be feasible somewhere else but not inside the higher level code. Okay. Okay. This is what everyone want. So all the thing I have been discussed so far it actually based on all this base requirement where you assume linter is there specs is there and code review are there is there. Sorry. Yeah. So this is so you think I I assume that every good code base and organization we have. Okay. So this is the summary. Ruby is an awesome language. That's why we have like 100 plus people gathering here today to see maths. Ruby is flexible which is awesome but it requires very very good discipline to make it a proper code base. It's just like your self-managed employee where your manager is not looking. Okay. So all of this that I've covered over the convention over configuration consistency key predictability you think you're going to save your ass searchability will save your time readability will save your time no silent fellow will save a lot of your time. Okay. So I think that many people talking like we are talking a lot about like strong typing why am I not why are we not moving to like go Scala Java to enjoy all that but I think that is just a very, very minor cons in all the goodness of Ruby we'd rather overcome that cons and enjoy the goodness of Ruby. Thank you. And question. Okay. You're developing your own validation whether your type validation okay. Have you taken a look at say the DryRB project recently that in the last six months have you taken a look at the DryRB project and a couple of equivalents lately like in the last six months or so DryRB has significantly improved their validation library and I it's in terms of just validating a type validating that it meets specific criteria like a match what like not just a strain but a strain that matches a certain regular expression or so on a I'm 39 years of experience makes me extremely leery of writing tools in-house when etiquette or better tools exist off the shelf. Okay. So you can ask me. I'm Jeff Dickey. Yes. Thanks, chef, for your questions. Okay, so so I think the great thing about Ruby we have a very active community where people keep sharing the goodness that they created in their own code base. So Vicky will soon to be there. Okay, so so let me come back to our okay. So actually every solution will fit certain problems or like scale problems or scope of problems. So when we started this strong typing actually we started two years ago. Okay, so that at the time dry Ruby is not even there. It was vertus. It was vertus. It was strong strong typing or no, it was it called type, I guess. I remember it called type. You're not wrong. So we go through that and there and the interface was somewhat liking of what we want. So let me show you what we meant to every you may want to say. I'm sorry. Far from my side. Okay. Okay, so this is one of the example. Okay, I can go make it bigger. So it's one of the big example of how of how one of our model look like. Okay. So actually you can see here. So actually we've got an option thing called options. Okay. And at that time there's no one giving you a choice of option means that it can be nil. And I think one of them is doesn't give the option and one of them and some other different dissemination and one of them ought to convert your data into the declared format which we don't want. Like if you pass a string if you pass a page assuming you have a pagination model or you have a page as integer and you pass a string 1 it ought to pass it into 1 integer for you which is the thing that we don't want. We will only want this as a self-documented things and as a self-validation to encapsulate the validations. And we also like so we just want to think of something very simple. We just want a very simple solution is checking type give availability for option for like it can be nil and we get availability for this is more awesome already. Okay, then at that time there was no solution to understand but that's all of this advantage. Ya. So that's why we decided to ourselves and regarding dry Rb dry Rb actually is a very good consideration to come to all these of our improving Ruby to be a more predictable code base and stuff but at the moment it's become a bit too big right now. Like you can choose a different combination of all the sub all the smaller libraries like you got like dry type dry validation dry dry struck something. Ya, I think if someone started and would like something that I have more powerful and first of all you can use that but for us like having this here right now is give us like more control first. You have two years of experience with this. Ya. So I think that's roughly why we started doing this and why are we still using it. Okey. Any other question? I guess not. Okey. Thank you. Okey, so I just want to open up the floor to