 Jadi, saya sedang memperkenalkan diri saya. Nama saya Wei Liang. Saya bekerja di Engage Rocket bersama Ted, yang ialah kawan saya. Kami telah bersama untuk datang hari ini bersama. Apa? Apa ini? Baiklah. Jadi, saya suka bermula dengan berkata, saya tidak mempunyai jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis. Jadi, saya suka memperkenalkan jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis jenis j Pada contoh, perbincangan ini sebenarnya anda dapat faham adalah perbincangan real. Apabila anda menggunakan perbincangan, anda perlu mencubanya model, model utama. Tetapi anda tidak perlu mencubanya kontrol. Anda tidak perlu mencubanya perbincangan. Ia berfungsi. Anda boleh mencubanya perbincangan dan perbincangan, tetapi anda tidak perlu mencubanya diri. Apa yang anda perlu lakukan adalah mencubanya perbincangan di file rotam anda dan ia sepatutnya berhasil. Jadi jika anda melihat kode sosial dan saya beritahu anda, saya hanya melihat kode sosial kerana saya ingin mendapatkan kode sosial yang saya ingin mendapat. Bukan cara saya mengambil kode sosial. Anda memperkenalkan, ia mempunyai folder app. Dalam mana ada folder kontrol dan folder perbincangan, semua kode sosial yang anda mencubanya perbincangan normal. Dan tentu saja, ada beberapa file jem file di dalam juga. Jadi ini beritahu anda bahwa perbincangan real lebih sepatutnya adalah jem. Yang mempunyai perbincangan real, kemudian anda boleh mencubanya perbincangan real. Dan perbincangan real mesti adalah jem. Jadi saya ada di sisi sekarang. Apa yang membuat perbincangan real untuk perbincangan real? Kerana jelas tidak semua perbincangan real adalah perbincangan real. Biasanya mereka tidak. Mereka tidak berhasil dalam perbincangan real. Jadi tidak perlu menjadi perbincangan real. Jadi saya cuba melihat ini. Di Rubyland, kami mempunyai banyak perbincangan real. Yang paling kode adalah perbincangan real. Ada beberapa perbincangan real yang kita nama sebagai perbincangan real. Dan beberapa perbincangan real yang kita nama sebagai perbincangan real. Perbincangan real sebenarnya terdapat masa yang lalu. Tapi mereka berubah sekarang. Jadi saya lupa flow saya. Ini adalah perbincangan Ruby. Biasanya perbincangan Ruby mesti memiliki dua perbincangan. Biasanya mesti mempunyai file jem. Mesti mempunyai folder lip. Biasanya. Jadi apabila anda mempunyai jem seperti ini. Ini adalah contoh yang digunakan dari website jem Ruby. Jem yang dipanggil Hola. Selepas mempunyai jem ini, anda akan dapat mempunyai Hola di dalam kode Ruby. Dan itu akan mempunyai file lip.hola.rb ke program Ruby. Itu sepatutnya. Itu semua jem. Saya rasa semua orang tahu apa yang Ruby jem adalah. Jadi ini adalah update PSA. Kerana saya melihat jem-jem Ruby. Kerana jem-jem Ruby itu mempunyai jem. Jadi Ruby jem website mesti meminta anda mempunyai jem. Yang anda mesti melakukan secukup. Tapi jika anda tidak mempunyai jem. Ada yang hanya ditemukan pada tahun ini. Jadi memperkenalkan command ini. Dan memperkenalkan lock jem. Jika anda memperkenalkan lock jem. Pada pertanyaan, bagaimana plug-in jem? Pada plug-in jem yang sangat tinggi, plug-in jem adalah cara untuk memperkenalkan plug-in jem. Jika anda mahu plug-in jem untuk tidak memperkenalkan plug-in jem. Atau anda mahu mengambil perkara baru untuk plug-in jem. Kerana anda rasa ini sepatutnya mempunyai jem. Anda dapat membuat plug-in jem. Jadi bukan plug-in Ruby. Dan kemudian anda dapat memperkenalkan plug-in jem atau memperkenalkan perkara baru untuk plug-in jem. Dan kemudian plug-in jem juga. Anda membuat plug-in jem. Dan ia adalah cara yang sangat sama. Anda membuat aplikasi yang baru. Ada command yang disebut plug-in jem. Dan kemudian anda menyebut nama plug-in jem. Jadi jauh-jauh baik-baik saja. Mereka tidak akan membuat plug-in jem. Atau jika anda mempunyai jem. Jika anda memperkenalkan plug-in jem. Jadi jika anda datang kembali. Ini mewajib untuk orang-orang melihat jem telah membentuk desa sebaik saja sehingga jem. Dengan jem. Dengan jem. Kembali di sini. Dengan jem. Menurut jem. Hanggian jeng yang telah digunakan jika jem. Selain jem. ...untuk membuat perjalanan raya yang sama, tetapi sebenarnya ia adalah aplikasi mini raya, seperti yang saya katakan sekarang. Jadi anda membuat perjalanan raya yang baru, tetapi anda masuk ke pilihan yang sepatutnya, atau pilihan yang berbentuk. Dan di sini anda membuat perjalanan raya yang baru. Ada juga jem. Dan jika anda mempunyai jem, anda boleh kemudian mempunyai jem ke aplikasi raya yang lain. Dan kemudian mempunyai aplikasi raya ini di dalam aplikasi raya anda. Jadi, dalam sesuatu, aplikasi raya ini adalah jem yang mempunyai aplikasi raya yang lain yang anda boleh mempunyai ke aplikasi raya yang lain. Yang benar-benar jika anda fikir tentangnya, apa perjalanan raya itu? Perjalanan raya beri anda perjalanan, perjalanan, perjalanan. Anda hanya perlu membuat perjalanan yang anda boleh menggunakan. Dan itu sepatutnya bekerja di dalam aplikasi raya. Sudah tentu, aplikasi raya lebih berguna di dalam aplikasi raya. Tetapi, tidak akan berlaku di dalam aplikasi raya. Kenapa anda akan peduli tentang aplikasi raya? Jadi, ini adalah tempat saya membuat perjalanan raya di sini. Saya rasa ada dua sebab yang anda mungkin peduli. Pertama, anda membuat perjalanan raya. Anda membuat perjalanan raya atau perjalanan raya yang anda ingin berbagi dan membuat orang menggunakan aplikasi raya. whyI i i dont want to it was that the product requirements demands that we're going to build a whole new module where it's supposed to work independently from current module but we don't want to complicate our devops. We kind of want it to be in the same Rails app instance. So basically a RAIL engine yang berlaku di luar jenis kentera untuk membuat, dalam perjalanan, aplikasi aplikasi beberapa aplikasi aplikasi dalam aplikasi aplikasi. Jadi anda boleh memadamkan bahawa ada beberapa masalah dengan itu, yang akan saya bincangkan pada masa ini. tetapi ini adalah satu yang kita memilih, kerana kita ingin mengalami beberapa masalah logisika dengan mempunyai sebuah modul baru. Kita telah membuat yang ini. Kami menggunakan wajah yang baru untuk menggunanya. Ini adalah permainan jenis jenis jenis jenis yang banyak file dan juga perlu dipercabai untuk pilih aplikasi dan menggunakan su Chan구 langkah yang baru. Kemudian kita membutuhkan su Chanjin ini. Kali dalam file kecent properties kamu meletakkan senjata. Apa yang menghubungkan adalah apa-apa pun yang berlaku di dalam senjata menjadi kekuatan yang akan berlebihan dengan aplikasi yang kemintaan. URL sub-paf dan kemudian apa yang perlu anda lakukan di aplikasi main-app, jem file, ingatlah jem ini adalah jem, jadi anda perlu pastikan aplikasi main-paf jem ini jadi bundler ini mempunyai syntax yang menjadikan jem dengan menjadikan aplikasi jem yang mempunyai jem. Jadi ini yang kita lakukan. Dan dengan itu, sebenarnya anda boleh mulakan masuk ke sana dan mulakan membuat model dan kontrol dan periksaan dan sebagainya. Dan ini sepatutnya bekerja. Seperti jika ia hanya aplikasi lain yang dipunyai di aplikasi ini. Sebenarnya. Yang berfungsi untuk bahagian terbaik. Ya. Jadi ini adalah perkara yang anda patut tahu. Pertama, anda akan belajar di dokumentasi yang anda ada di file ini, yang adalah file konfigurasi, aplikasi.rb di aplikasi main-paf jem. Ini adalah versi jem. Anda akan mempunyai pilihan yang anda inginkan di sana disebut isolat namespace. Apa yang anda lakukan, anda perlu tahu apa yang anda lakukan. Ia tidak lakukan segala-galanya untuk anda. Tetapi pastikan dalam kode jem. Jika anda menyebabkan jem. itu akan menyebabkan jem. Jadi bagaimana jika saya mempunyai kontrolur jem. Dan saya menyebabkan jem. Sebelum kode jem. Itu akan menyebabkan jem. Jem. Jem. Jem. Jem. Jem. Jem. Jem. Jem. Jem. Jem. Pada pakaian pakaian pemain pakaian pakaian. Jadi... ...berbincangkan sebuah pakaian pakaian kita... ...sebelum pakaian perajaran dan pakaian pakaian pakaian pakaian. Kemudian, pergabungan model berkongsi nama tersebut. Apabila pakaian mempergabungan pakaian. Apa maksudnya? Saya akan tunjukkan contoh. Jika pakaian pakaian mempunyai banyak beritahu, ia akan mencari kepadaan yang menganggung... ...pakaian dalam pakaian pakaian pakaian pakaian... ...pakaian pakaian perajaran. Jadi, contohnya di sana. Pertama, perkara yang terakhir adalah jika anda menggunakan model rail generator, model rail generator, etc. Di dalam keadaan rakan rakan rakan rakan, ia akan menghasilkan versi namas yang diperlukan dari kelas itu. Jadi, semuanya menjadi namas dan ini adalah cara rakan rakan rakan rakan berkongsi dari kode aplikasi main rakan rakan rakan. Jadi, sebagai contoh, dan ini adalah salah satu pembentangan rakan rakan rakan rakan. Jika anda mempunyai model kode aplikasi main rakan rakan, acara itu adalah url jarum, kerana saya mempunyai Ngin slash rail engine namanya. Dan saya mempunyai App slash Mods dengan included. Dan saya mempunyai Ngin name lagi kerana nama pembentangan rakan rakan saya dan nama pos.Rb. Ini adalah nama kelas, nama kelas di sana. Dan jika saya mempunyai banyak komentar, saya perlu menjelaskan penjelasan penjelasan penjelasan di post-ID. Kenapa? Kerana jika anda menggunakan nama kelas isolasi dan sebagainya, kelas nama kelas anda akan menjelaskan tabu database dengan pre-fix juga. Anda akan menjelaskan tabu database untuk post-pre-fix. Jadi kelas kelas kelas anda akan menjelaskan tabu database anda juga. Ini adalah bagaimana tabu database tidak mempunyai perangkatan dan aplikasi anda. Jika anda menjelaskan tabu database yang aktif, ini adalah contoh dan contoh yang besar kerana untuk menggunakan tabu database yang aktif, anda perlu membuat dua tabu database yang baru dan mereka semua mempunyai perangkatan aktif, saya percaya. Saya tidak pasti dengan perangkatan aktif, tapi saya percaya perangkatan aktif di sana. Ya. Jadi dalam perangkatan, perangkatan adalah perkara yang sama dengan perangkatan. Dan di sini, perangkatannya adalah yang dua kelas terdapat perangkatan perangkatan perangkatan. Anda ada perangkatan yang terdapat, jika Anda mencari perangkatan, itu sepatutnya adalah kelas kelas kelas saya. Anda ada perangkatan, kelas nama dan perangkatan perangkatan, atau anda boleh melakukan modul perangkatan, dan kelas nama. Perangkatan adalah bagaimana anda menyebabkan kelas nama dan perangkatan di dalam. Anda tidak boleh melakukan perangkatan ini jika anda melakukan modul perangkatan itu. Karena jika anda melakukan perangkatan, anda akan menjelaskan perangkatan perangkatan auto-loading. Perangkatan perangkatan auto-loading. Yang saya tidak akan mengenali hari ini kerana ia adalah perangkatan perangkatan lain. Sebenarnya, memilih satu, jika anda melakukan perangkatan perangkatan. Pertama-tama, membuat perangkatan unik. Okey. Pertama-tama, perangkatan perangkatan perangkatan tidak dalam perangkatan yang sama seperti perangkatan perangkatan perangkatan. Tetapi pada masa perangkatan, perangkatan auto-loading mempunyai bagaimana berlainan. Jika anda dalam perangkatan perangkatan normal dan anda ingin berkongsi dengan perangkatan di luar, selalu-salu, selalu-salu, selalu-salu, menggunakan perangkatan kedua. Atau anda akan menjelaskan. Ya. Jadi, perangkatan pertama hanya berlainan. Perangkatan pertama hanya berlainan. Ya. Sebabnya jika anda melihat perangkatan, anda tidak akan melihat perangkatan ini. Jika anda melihat perangkatan, mereka tidak akan menggunakan perangkatan itu. Mereka akan menggunakan perangkatan kedua. Dan ia akan berlainan dengan perangkatan modul dan sebagainya. Jadi, perangkatan kedua, ini adalah jelas jelas dari perangkatan yang terlebih dahulu, tetapi, ada sebuah masalah yang dipanggil perangkatan yang terbaik, yang sekarang dah hilang. Tetapi jika anda tidak di-Ruby 2.5, anda akan dapat melakukan perangkatan yang terbaik seperti ini. Ya. Selama-lamanya. Anda dapat terus menggunakan perangkatan yang berlainan, perangkatan yang berlainan, selama-lamanya. Sehingga anda selesai, anda akan tetap dapat perangkatan yang terbaik. Ini adalah masalah dalam perangkatan kerana anda membuat perangkatan yang terbaik. Sekarang, Ruby 2.5, anda tidak dapatnya. Jadi, perangkatan untuk Ruby 2.5, itu tidak perlu gebe sebuah were店 coaching какие. Saya penuh banyak penting es. Jika anda menggunakan perangkatan- perangkatan yang berlainan, conocir说ang jinas j atau anda betul-betul ingin b dompil dalam firma acet tanpa perangkatan dalam perangkatan dengan bentuk, tapi perangkat ugly bilih j기� c loss. Lihat saya ringan itu. Kemudian apabila anda mempunyai model di dalam perjalanan anda, anda akan menghubungkan diri sendiri. Sebenarnya, cerita ini adalah bahawa ini tidak berlaku dengan Ruby 2.5. Cerita itu bahawa perjalanan itu adalah salah. Perjalanan itu... okey, baiklah. Saya belum berkata tentang itu. Biasanya, ini adalah sesuatu yang saya tahu kalau anda tidak pada Ruby 2.5. Yang lain yang anda tahu adalah tentang perjalanan dan perjalanan. Jadi, terutamanya dalam perjalanan. Kerana jika anda menulis perjalanan, perjalanan perjalanan anda tidak dapat dilakukan dengan perjalanan. Yang biasanya, apa yang kita dapat dalam perjalanan apabila perjalanan. Anda harus mempunyai perjalanan ini, perjalanan, perjalanan perjalanan. Dan itu akan mempunyai perjalanan perjalanan perjalanan anda. Dan perjalanan perjalanan di sana. Sekarang, jika anda menulis perjalanan perjalanan untuk perjalanan perjalanan untuk Ruby, yang membutuhkan perjalanan perjalanan, kerana anda membuat perjalanan yang digunakan. Cara untuk membuat perjalanan itu di perjalanan, adalah untuk memperkenalkan perkara yang sama, tetapi untuk membentuk perjalanan perjalanan. Apabila anda tidak dapat mencari dokumentasi tentang perkara ini, saya memperkenalkan perkara ini oleh perjalanan dan perjalanan. Jadi, anda terima kasih. Okey. Yang lain yang anda tahu adalah bahawa semua kelas yang digunakan di jalanan. Jadi, jika anda memakai perjalanan perjalanan dari aplikasi main, anda dapat menyebabkan kelas perjalanan. Dan ke kedua, sehingga di aplikasi main enquem yang anda boleh menyebabkan, jika anda menulis perjalanan seperti itu dan memberi perjalanan dari aplikasi. Anda menyorakan aplikasi perjalanan dari aplikasi main perjalanan, bahawa bukan perjalanan perjalanan perjalanan perjalanan. Adalah ia berlaku di dalam kes anda. Jadi, sesuatu yang terlalu terjadi. Okey, jadi apa yang saya fikir? Saya fikir ia telah menjadi cara yang menyebabkan kode separat. Tidak ada masalah, tetapi teruk untuk kami jika anda ingin berjumpa dengan masalah. Ada masalah lain yang telah saya menyebabkan, yaitu konfigurasi. Jika anda menggunakan jemput yang membuat konfigurasi di aplikasi minyak, untuk contohnya, jika anda mempunyai jemput yang membuat konfigurasi di aplikasi minyak, dan jika jemput yang membuat konfigurasi di aplikasi minyak, ia tidak berfungsi, anda tidak boleh melakukan begitu. Kerana jemput yang membuat konfigurasi minyak di aplikasi minyak, bukan jemput yang membuat konfigurasi minyak. Jadi ia tidak akan berfungsi. Dan anda boleh berfikir tentang beberapa kes di mana ini penting, seperti jika anda membuat aplikasi minyak, dan anda perlu mempunyai konfigurasi minyak, atau apa-apa pun, jika anda menggunakan konfigurasi minyak. Pertanyaan kedua adalah bahawa, dalam kes kita, semuanya adalah dalam satu repositor. Ia bermaksud bahawa di GitHub, dalam tab pull request, anda akan melihat pull request untuk kedua aplikasi minyak dan aplikasi minyak. Dan apa-apa lagi aplikasi minyak dalam repositor itu. Ia bermaksud bahawa anda perlu mengejar pull request per aplikasi minyak atau aplikasi menggunakan pull request. Jadi apa yang kita lakukan adalah, kita mempunyai label PR, yang berlainan untuk membuat pull request, untuk ingat untuk menggunakan label PR pada PR. Jadi, itu adalah fikiran saya. Saya percaya itu saja. Terima kasih. Terima kasih. Kamu mempunyai pelajaran yang anda boleh berkongsi untuk aplikasi minyak yang berlainan untuk aplikasi minyak. Bagaimana dengan aplikasi minyak dan aplikasi minyak? aplikasi minyak bukan masalah. Masalah yang terbaik adalah yang saya cakap tentang, iaitu adalah menggunakan sebuah alat untuk kerjakan. Jika anda boleh meletak aplikasi minyak tanpa aplikasi minyak, anda boleh meletak aplikasi minyak dengan aplikasi minyak. Bagaimana dengan mengubah periuk dengan kerja? Dan anda perlu mengubah periuk, semuanya akan membuat jen. Anda membuat periuk untuk mengubah periuk. Ya, periuk untuk mengubah periuk. Sebenarnya, anda meletakkan satu aplikasi yang besar. Ya. Jadi, anda menghubungi kita untuk aplikasi yang seluruh dan tidak meletakkan suara sub-system. Ya. Sebenarnya, kembali ke contoh, anda hanya menghubungi dengan aplikasi. PSA untuk semua orang yang tak nampak perhatian. aplikasi ini sekarang mempunyai. Mereka mengharapkan bahawa mereka menggunakan aplikasi yang aktif. Ya. Jadi, ya. Jadi, bagaimana seberapa bulan tidak mengambil perhatian seluruh itu? Sebenarnya, anda tidak berfikir sangat lama. Saya tidak tahu apa yang berkata tentang kami. Tetapi, anda tidak berfikir sangat lama. Jadi, kita mempunyai perjalanan kerja dalam beberapa minggu, dua minggu. Dan kita dapat memulangkan kontrol dan model. Sebenarnya, bagaimana perjalanan perniagaan, perniagaan perniagaan perniagaan. Bukan sebab kita gembira. Anda tidak akan berhak. Ya. Saya akan beritahu anda bahawa kita memilih keadaan ini, bermakna setiap jenis keadaan kita, kita perlu memasak perniagaan. Kita akan memasak keadaan ini dulu. Tetapi, sehingga kita hanya dapat menggunakan perniagaan, ada percayaan yang berlaku tentang ini. Dan apabila anda melihat perniagaan keadaan di kode, ia adalah sebuah alasan untuk anda yang anda bekerja dalam aplikasi dan tidak, hanya beberapa jenis perniagaan lain. Jadi, saya percayakan perniagaan itu. Walaupun anda... jika anda memilih perniagaan keadaan ini, jika anda memilih perniagaan keadaan ini, anda masih dapat melakukan perniagaan keadaan. Ia akan masih bekerja. Ia hanya bahawa anda dapat melakukan ini, dan sehingga anda akan terpaksa melakukan itu, dan sehingga anda melakukan itu. Dan ia menyebabkan perniagaan keadaan ini? Ya, menyebabkan perniagaan keadaan ini. Ya. Tetapi anda ada penjualan keadaan ini? Jika anda memiliki perniagaan keadaan ini, anda harus mencuba. Ya, kami memiliki perniagaan keadaan ini. Dan kami mempaksa perniagaan keadaan ni, saya juga memakai pilihan untuk penjualan keadaan. Yang saya gunakan dalam penjualan krim-krim kita, tidak terkenal, tidak ada masalah. Jadi, kami tidak mencuba pilihan perniagaan keadaan ini. Selain perniagaan keadaan ini, seonesa-sansai kami membuat perniagaan keadaan ini. Our Rails Engine has a spec folder just like our Minerals app and it works exactly like the Minerals app. Except that when you want to run the specs, you have to do our spec space, the directory path to that folder if you're running the specs from your Minerals app root directory. Ya. So personally, I've wrapped my head around it 100%. In terms of, is this a good way to do it? I think there's people seeing on both sides of the fence on whether Rails Engines are a good way to organize your code into modules basically. Basically, what Rails Engines do is you can organize your application code into modules that work in isolation from one another, right? Ya. No. So, we just have one big Rails repository right now. Because it would be a mess, right? Basically, what? Okay, I don't know how much. Okay. The idea was to organize it according to the sub modules. So, it was easier to maintain in that if we wanted to work on one of the modules, we don't really have to care that it's interacting in any way with the other modules. Okay, so essentially, we do think several products that are not related to each other other than they're used by the same companies. So, we think of products with Google Suite. So, there is some strategic reuse, but we don't have any dependency scheme between products other than those shared dependencies. Right. We want to be able to evolve the components into modules. So, instead of putting, say, 500 models into that one Rails app, we decided to go with the engines because it also allows us to maintain a unidirectional dependency graph. Yes. So, we don't create circular dependencies or accidentally create dependencies between the products. Thank you. So, when we run the tests for one of the products, we will only lower these dependencies and nothing else. So, that if we accidentally create dependencies, we don't want the tests to run. I'll just comment the link in what component of our now legacy products. We made engines work reasonably well, but the next major attention that that project received, the engine was the justification for moving to a message bus. Yes. This is the sort of the... So, that metathesis to microservices, Well, not even just... Technically, not even just microservices because there really wasn't any discovery involved. You just had main application A and components B and C. And A always talked to B and C over the bus. B and C had no clue how each other existed. Okay, they were in complete isolation. Once we broke them out from the engine, they were completely independently versioned and developed and maintained. So, as long as you're running the major version of either B or C that A expects, it'll work just fine. Simver will save your ass if you let it. Ya, so there's a lot to say about this decision. But at the point in time, we felt the right decision because if we wanted to pull it out as a real engine, we could pull it out into a separate app or other thing. We've already got it in a gym so taking it further out is pretty easy. So, this was an intermediate step to... Ya, so that was the high level strategy. Did you have issues with versioning of gems used inside the engine as well as the main app? So, for now, no. For now no because our engine uses the same gems as the main rules app. We haven't encountered those problems yet. So, I consider it a bit of a feature that discourages you from creating snowflakes. So, if you have seven products, ideally you don't want seven completely different products so you can't have any developer mobility. Alright. Our solution to that, by the way, for the ABC scenario was we actually had a do nothing... do nothing gem D that had all our dependencies. Okay. We depended... B and C depended on D. And A had simver dependencies on B and C. So, as long as we kept D consistent, we were good to go. Maybe you should give a real start. Sorry. I know these. Sorry to keep it on. No, it's okay. This is my point that I titled this thought learning about Rails engines after much deliberation because I am still learning and I think most of us are because Rails engines is this strange thing. Most people don't know about or know to use. And maybe that's why some people don't think it's the right thing because maybe they're using it the wrong way. You can use Rails the wrong way and then it becomes a big mess and you hate Rails because of that. It may not be the tool, maybe just how you're using the tool. So, maybe this should have been a panel thing. I don't know. But anyway, that was the talk. Happy to talk more about anything Rails engines. Thank you.