SlideShare a Scribd company logo
1 of 67
Download to read offline
From Rails-way
to modular architecture
Ivan Nemytchenko — @inemation
Ivan Nemytchenko - @inemation
Me:
• Came to Rails from PHP
(long time ago)
• co-founded two agencies
• co-organized two conferneces
• did a lot of management stuff
• currently freelancer
Ivan Nemytchenko - @inemation
Idea
+
RailsRumble
↓
tequila gem
(HAML for JSON)
Ivan Nemytchenko - @inemation
tequila gem
↓
inspiration for
@nesquena
↓
gem RABL
Ivan Nemytchenko - @inemation
Rails is awesome,
isn't it?
Ivan Nemytchenko - @inemation
Same pattern
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
1. Knowing how to
do it in a Rails-way is
not enough.
Ivan Nemytchenko - @inemation
These things might help you
• SOLID principles
• Design Pattrens
• Refactoring techniques
• Architecture types
• Code smells identification
• Tesing best practices
Ivan Nemytchenko - @inemation
2. Knowing about
something doesn't
mean you know how
to apply it
Ivan Nemytchenko - @inemation
The story
Ivan Nemytchenko - @inemation
Client
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
Problem:
• Current team stuck
Ivan Nemytchenko - @inemation
Problem:
• Current team stuck
Project:
• Monolythic Grails app
• Mysql database of ~70 tables
Ivan Nemytchenko - @inemation
Solution
• Split frontend and backend
• AngularJS for frontend
• Rails for API
Ivan Nemytchenko - @inemation
Solution
• Split frontend and backend
• AngularJS for frontend
• Rails for API
• Keeping DB structure
Ivan Nemytchenko - @inemation
Ok, lets do it!
Ivan Nemytchenko - @inemation
Accessing data (AR models)
class Profile < ActiveRecord::Base
self.table_name = 'profile'
belongs_to :image, foreign_key: :picture_id
end
Ivan Nemytchenko - @inemation
Accessing data (AR models)
class Image < ActiveRecord::Base
self.table_name = 'image'
has_and_belongs_to_many :image_variants,
join_table: "image_image", class_name: "Image",
association_foreign_key: :image_images_id
belongs_to :settings,
foreign_key: :settings_id, class_name: 'ImageSettings'
belongs_to :asset
end
Ivan Nemytchenko - @inemation
Presenting data (RABL)
collection @object
attribute :id, :deleted, :username, :age
node :gender do |object|
object.gender.to_s
end
node :thumbnail_image_url do |obj|
obj.thumbnail_image.asset.url
end
node :standard_image_url do |obj|
obj.standard_image.asset.url
end
Ivan Nemytchenko - @inemation
Let's implement some features!
Feature #1: Users Registration
Ivan Nemytchenko - @inemation
Let's implement some features!
Feature #1: Users Registration
Ivan Nemytchenko - @inemation
Conditional validations?
Anyone?
Ivan Nemytchenko - @inemation
Our model knows about..
• How user data is saved
• How admin form is validated
• How org_user form is validated
• How guest_user form is validated
Ivan Nemytchenko - @inemation
Singe responsibility principle:
A class should have only one
reason to change
Ivan Nemytchenko - @inemation
Form object (Input)
class Input
include Virtus.model
include ActiveModel::Validations
end
class OrgUserInput < Input
attribute :login, String
attribute :password, String
attribute :password_confirmation, String
attribute :organization_id, Integer
validates_presence_of :login, :password, :password_confirmation
validates_numericality_of :organization_id
end
Ivan Nemytchenko - @inemation
Using form object (Input)
input = OrgUserInput.new(params)
if input.valid?
@user = User.create(input.to_hash)
else
#...
end
Ivan Nemytchenko - @inemation
Form objects
Pro: We have 4 simple objects instead of one complex.
Con: You might have problems in case of nested forms.
Ivan Nemytchenko - @inemation
Let's implement more features!
Feature #2: Bonuscode redeem
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
def redeem
unless bonuscode = Bonuscode.find_by_hash(params[:code])
render json: {error: 'Bonuscode not found'}, status: 404 and return
end
if bonuscode.used?
render json: {error: 'Bonuscode is already used'}, status: 404 and return
end
unless recipient = User.find_by_id(params[:receptor_id])
render json: {error: 'Recipient not found'}, status: 404 and return
end
ActiveRecord::Base.transaction do
amount = bonuscode.mark_as_used!(params[:receptor_id])
recipient.increase_balance!(amount)
if recipient.save && bonuscode.save
render json: {balance: recipient.balance}, status: 200
else
render json: {error: 'Error during transaction'}, status: 500
end
end
end
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
bonuscode.redeem_by(user)
or
user.redeem_bonus(code)
?
Ivan Nemytchenko - @inemation
Service/Use case:
class RedeemBonuscode
def run!(hashcode, recipient_id)
raise BonuscodeNotFound.new unless bonuscode = find_bonuscode(hashcode)
raise RecipientNotFound.new unless recipient = find_recipient(recipient_id)
raise BonuscodeIsAlreadyUsed.new if bonuscode.used?
ActiveRecord::Base.transaction do
amount = bonuscode.redeem!(recipient_id)
recipient.increase_balance!(amount)
recipient.save! && bonuscode.save!
end
recipient.balance
end
end
Ivan Nemytchenko - @inemation
Using service:
def redeem
use_case = RedeemBonuscode.new
begin
recipient_balance = use_case.run!(params[:code], params[:receptor_id])
rescue BonuscodeNotFound, BonuscodeIsAlreadyUsed, RecipientNotFound => ex
render json: {error: ex.message}, status: 404 and return
rescue TransactionError => ex
render json: {error: ex.message}, status: 500 and return
end
render json: {balance: recipient_balance}
end
Ivan Nemytchenko - @inemation
Services/Use case
Pro: not mixing responsobilities
Pro: not depending on ActionController
Con: using exceptions for Flow Control is slow
Ivan Nemytchenko - @inemation
Whole picture: before
Ivan Nemytchenko - @inemation
Whole picture: after
Ivan Nemytchenko - @inemation
Are we happy now?
Ivan Nemytchenko - @inemation
Not really happy
if image = profile.image
images = [image] + image.image_variants
original = images.select do |img|
img.settings.label == 'Profile'
end.first
resized = images.select do |img|
img.settings.label == 'thumbnail'
end.first
end
Ivan Nemytchenko - @inemation
Domain-specific
objects
• User
• Profile
• Image
• ImageVariant
• ImageSettings
Ivan Nemytchenko - @inemation
Domain-specific
objects
• User
• Profile
• Image
• ImageVariant
• ImageSettings
Ivan Nemytchenko - @inemation
Domain-specific
objects
• User
• Profile
• Image
• ImageVariant
• ImageSettings
Ivan Nemytchenko - @inemation
Repositories + Entities
Ivan Nemytchenko - @inemation
Entities
class Entity
include Virtus.model
def new_record?
!id
end
end
class User < Entity
attribute :id, Integer
attribute :username, String
attribute :profiles, Array[Profile]
attribute :roles, Array
end
Ivan Nemytchenko - @inemation
Repositories
Ivan Nemytchenko - @inemation
Repositories
def find(id)
if dataset = table.select(:id, :username, :enabled,
:date_created, :last_updated).where(id: id)
user = User.new(dataset.first)
user.roles = get_roles(id)
user
end
end
Ivan Nemytchenko - @inemation
Repositories
def find(id)
dataset = table.join(:profile_status, id: :profile_status_id)
.join(:gender, id: :profile__gender_id)
.select_all(:profile).select_append(*extra_fields)
.where(profile__id: id)
dataset.all.map do |record|
Profile.new(record)
end
end
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
Repositories/Entities
Con: There's no AR magic anymore
Con: Had to write a lot of low-level code
Pro: You have control on what's happening
Pro: Messy DB structure doesn't affect app
Pro: DDD!?
Ivan Nemytchenko - @inemation
Side effect
RABL
Ivan Nemytchenko - @inemation
Presenters
module ProfilePresenter
def self.wrap_one!(obj, viewer)
hash = obj.to_hash
hash.delete(:secret_field) unless viewer.admin?
hash
end
end
Ivan Nemytchenko - @inemation
Presenters
def show
profile = ProfileRepository.find(params[:id])
hash = ProfilePresenter.wrap_one!(profile, current_user)
render json: {profile: hash}
end
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation
Not depending on Rails anymore!
Ivan Nemytchenko - @inemation
Sequel
Virtus
Ivan Nemytchenko - @inemation
Rom.rb
Lotus
Ivan Nemytchenko - @inemation
Arkency
blog.arkency.com
Adam Hawkins
hawkins.io
Ivan Nemytchenko - @inemation
Ivan Nemytchenko - @inemation

More Related Content

Similar to From Rails-way to modular architecture

Polymer & the web components revolution 6:25:14
Polymer & the web components revolution 6:25:14Polymer & the web components revolution 6:25:14
Polymer & the web components revolution 6:25:14mattsmcnulty
 
Dev days. windows phone development
Dev days. windows phone developmentDev days. windows phone development
Dev days. windows phone developmentVolha Banadyseva
 
Yaron Inger - Enlight - Inside the app of the year
 Yaron Inger - Enlight - Inside the app of the year  Yaron Inger - Enlight - Inside the app of the year
Yaron Inger - Enlight - Inside the app of the year tlv-ios-dev
 
sachin presentation.pptx
sachin presentation.pptxsachin presentation.pptx
sachin presentation.pptxMareeswaranM7
 
Angular - Chapter 3 - Components
Angular - Chapter 3 - ComponentsAngular - Chapter 3 - Components
Angular - Chapter 3 - ComponentsWebStackAcademy
 
ExpressionEngine 2: Total Domination
ExpressionEngine 2: Total DominationExpressionEngine 2: Total Domination
ExpressionEngine 2: Total Dominationguestf9c0bc
 
Renee Anderson, Techniques for prioritizing, road-mapping, and staffing your ...
Renee Anderson, Techniques for prioritizing, road-mapping, and staffing your ...Renee Anderson, Techniques for prioritizing, road-mapping, and staffing your ...
Renee Anderson, Techniques for prioritizing, road-mapping, and staffing your ...museums and the web
 
From MEAN to the MERN Stack
From MEAN to the MERN StackFrom MEAN to the MERN Stack
From MEAN to the MERN StackTroy Miles
 
Performance and UX
Performance and UXPerformance and UX
Performance and UXPeter Rozek
 
TechEvent 2019: Nachhaltige Client-Architekturen mit Angular Elements; Thomas...
TechEvent 2019: Nachhaltige Client-Architekturen mit Angular Elements; Thomas...TechEvent 2019: Nachhaltige Client-Architekturen mit Angular Elements; Thomas...
TechEvent 2019: Nachhaltige Client-Architekturen mit Angular Elements; Thomas...Trivadis
 
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...DeNA
 
Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)
Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)
Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)Masayuki Nii
 
2017 Melbourne YOW! CTO Summit - Monolith to micro-services with CQRS & Event...
2017 Melbourne YOW! CTO Summit - Monolith to micro-services with CQRS & Event...2017 Melbourne YOW! CTO Summit - Monolith to micro-services with CQRS & Event...
2017 Melbourne YOW! CTO Summit - Monolith to micro-services with CQRS & Event...Douglas English
 
Active web page chapter for reading purpose
Active web page chapter for reading purposeActive web page chapter for reading purpose
Active web page chapter for reading purposeSambalSwetank
 
Yeoman
YeomanYeoman
Yeomanarybik
 
web test repair.pptx
web test repair.pptxweb test repair.pptx
web test repair.pptxYuanzhangLin
 
Workforce_Management_System
Workforce_Management_SystemWorkforce_Management_System
Workforce_Management_SystemAshok Mishra
 
Android session 2-behestee
Android session 2-behesteeAndroid session 2-behestee
Android session 2-behesteeHussain Behestee
 

Similar to From Rails-way to modular architecture (20)

Polymer & the web components revolution 6:25:14
Polymer & the web components revolution 6:25:14Polymer & the web components revolution 6:25:14
Polymer & the web components revolution 6:25:14
 
Dev days. windows phone development
Dev days. windows phone developmentDev days. windows phone development
Dev days. windows phone development
 
Yaron Inger - Enlight - Inside the app of the year
 Yaron Inger - Enlight - Inside the app of the year  Yaron Inger - Enlight - Inside the app of the year
Yaron Inger - Enlight - Inside the app of the year
 
Advanced Zen
Advanced ZenAdvanced Zen
Advanced Zen
 
sachin presentation.pptx
sachin presentation.pptxsachin presentation.pptx
sachin presentation.pptx
 
Angular - Chapter 3 - Components
Angular - Chapter 3 - ComponentsAngular - Chapter 3 - Components
Angular - Chapter 3 - Components
 
ExpressionEngine 2: Total Domination
ExpressionEngine 2: Total DominationExpressionEngine 2: Total Domination
ExpressionEngine 2: Total Domination
 
Renee Anderson, Techniques for prioritizing, road-mapping, and staffing your ...
Renee Anderson, Techniques for prioritizing, road-mapping, and staffing your ...Renee Anderson, Techniques for prioritizing, road-mapping, and staffing your ...
Renee Anderson, Techniques for prioritizing, road-mapping, and staffing your ...
 
From MEAN to the MERN Stack
From MEAN to the MERN StackFrom MEAN to the MERN Stack
From MEAN to the MERN Stack
 
Performance and UX
Performance and UXPerformance and UX
Performance and UX
 
Reactjs
Reactjs Reactjs
Reactjs
 
TechEvent 2019: Nachhaltige Client-Architekturen mit Angular Elements; Thomas...
TechEvent 2019: Nachhaltige Client-Architekturen mit Angular Elements; Thomas...TechEvent 2019: Nachhaltige Client-Architekturen mit Angular Elements; Thomas...
TechEvent 2019: Nachhaltige Client-Architekturen mit Angular Elements; Thomas...
 
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
 
Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)
Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)
Framework Enabling End-Users to Maintain Web Applications (ICICWS2015)
 
2017 Melbourne YOW! CTO Summit - Monolith to micro-services with CQRS & Event...
2017 Melbourne YOW! CTO Summit - Monolith to micro-services with CQRS & Event...2017 Melbourne YOW! CTO Summit - Monolith to micro-services with CQRS & Event...
2017 Melbourne YOW! CTO Summit - Monolith to micro-services with CQRS & Event...
 
Active web page chapter for reading purpose
Active web page chapter for reading purposeActive web page chapter for reading purpose
Active web page chapter for reading purpose
 
Yeoman
YeomanYeoman
Yeoman
 
web test repair.pptx
web test repair.pptxweb test repair.pptx
web test repair.pptx
 
Workforce_Management_System
Workforce_Management_SystemWorkforce_Management_System
Workforce_Management_System
 
Android session 2-behestee
Android session 2-behesteeAndroid session 2-behestee
Android session 2-behestee
 

More from Ivan Nemytchenko

Breaking Bad Habits with GitLab CI
Breaking Bad Habits with GitLab CIBreaking Bad Habits with GitLab CI
Breaking Bad Habits with GitLab CIIvan Nemytchenko
 
How to stop being Rails Developer
How to stop being Rails DeveloperHow to stop being Rails Developer
How to stop being Rails DeveloperIvan Nemytchenko
 
What I Have Learned from Organizing Remote Internship for Ruby developers
What I Have Learned from Organizing Remote Internship for Ruby developersWhat I Have Learned from Organizing Remote Internship for Ruby developers
What I Have Learned from Organizing Remote Internship for Ruby developersIvan Nemytchenko
 
Breaking bad habits with GitLab CI
Breaking bad habits with GitLab CIBreaking bad habits with GitLab CI
Breaking bad habits with GitLab CIIvan Nemytchenko
 
Lean Poker in Lviv announce
Lean Poker in Lviv announceLean Poker in Lviv announce
Lean Poker in Lviv announceIvan Nemytchenko
 
How to use any static site generator with GitLab Pages.
How to use any static site generator with GitLab Pages. How to use any static site generator with GitLab Pages.
How to use any static site generator with GitLab Pages. Ivan Nemytchenko
 
Опыт организации удаленной стажировки для рубистов
Опыт организации удаленной стажировки для рубистовОпыт организации удаленной стажировки для рубистов
Опыт организации удаленной стажировки для рубистовIvan Nemytchenko
 
Principles. Misunderstood. Applied
Principles. Misunderstood. AppliedPrinciples. Misunderstood. Applied
Principles. Misunderstood. AppliedIvan Nemytchenko
 
Рассказ про RedDotRubyConf 2014
Рассказ про RedDotRubyConf 2014Рассказ про RedDotRubyConf 2014
Рассказ про RedDotRubyConf 2014Ivan Nemytchenko
 
Рефакторинг rails-приложения. С чего начать?
Рефакторинг rails-приложения. С чего начать?Рефакторинг rails-приложения. С чего начать?
Рефакторинг rails-приложения. С чего начать?Ivan Nemytchenko
 
Different approaches to ruby web applications architecture
Different approaches to ruby web applications architectureDifferent approaches to ruby web applications architecture
Different approaches to ruby web applications architectureIvan Nemytchenko
 
От Rails-way к модульной архитектуре
От Rails-way к модульной архитектуреОт Rails-way к модульной архитектуре
От Rails-way к модульной архитектуреIvan Nemytchenko
 
Coffescript - счастье для javascript-разработчика
Coffescript - счастье для javascript-разработчикаCoffescript - счастье для javascript-разработчика
Coffescript - счастье для javascript-разработчикаIvan Nemytchenko
 
Tequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSONTequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSONIvan Nemytchenko
 

More from Ivan Nemytchenko (15)

Breaking Bad Habits with GitLab CI
Breaking Bad Habits with GitLab CIBreaking Bad Habits with GitLab CI
Breaking Bad Habits with GitLab CI
 
How to stop being Rails Developer
How to stop being Rails DeveloperHow to stop being Rails Developer
How to stop being Rails Developer
 
What I Have Learned from Organizing Remote Internship for Ruby developers
What I Have Learned from Organizing Remote Internship for Ruby developersWhat I Have Learned from Organizing Remote Internship for Ruby developers
What I Have Learned from Organizing Remote Internship for Ruby developers
 
Breaking bad habits with GitLab CI
Breaking bad habits with GitLab CIBreaking bad habits with GitLab CI
Breaking bad habits with GitLab CI
 
Lean Poker in Lviv announce
Lean Poker in Lviv announceLean Poker in Lviv announce
Lean Poker in Lviv announce
 
How to use any static site generator with GitLab Pages.
How to use any static site generator with GitLab Pages. How to use any static site generator with GitLab Pages.
How to use any static site generator with GitLab Pages.
 
Опыт организации удаленной стажировки для рубистов
Опыт организации удаленной стажировки для рубистовОпыт организации удаленной стажировки для рубистов
Опыт организации удаленной стажировки для рубистов
 
Principles. Misunderstood. Applied
Principles. Misunderstood. AppliedPrinciples. Misunderstood. Applied
Principles. Misunderstood. Applied
 
Рассказ про RedDotRubyConf 2014
Рассказ про RedDotRubyConf 2014Рассказ про RedDotRubyConf 2014
Рассказ про RedDotRubyConf 2014
 
Рефакторинг rails-приложения. С чего начать?
Рефакторинг rails-приложения. С чего начать?Рефакторинг rails-приложения. С чего начать?
Рефакторинг rails-приложения. С чего начать?
 
Different approaches to ruby web applications architecture
Different approaches to ruby web applications architectureDifferent approaches to ruby web applications architecture
Different approaches to ruby web applications architecture
 
От Rails-way к модульной архитектуре
От Rails-way к модульной архитектуреОт Rails-way к модульной архитектуре
От Rails-way к модульной архитектуре
 
ActiveRecord vs Mongoid
ActiveRecord vs MongoidActiveRecord vs Mongoid
ActiveRecord vs Mongoid
 
Coffescript - счастье для javascript-разработчика
Coffescript - счастье для javascript-разработчикаCoffescript - счастье для javascript-разработчика
Coffescript - счастье для javascript-разработчика
 
Tequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSONTequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSON
 

Recently uploaded

cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningVitsRangannavar
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - InfographicHr365.us smith
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationkaushalgiri8080
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
XpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsXpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsMehedi Hasan Shohan
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...aditisharan08
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 

Recently uploaded (20)

cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learning
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - Infographic
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanation
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
XpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsXpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software Solutions
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 

From Rails-way to modular architecture