Elixir in Action, Second Edition /
Elixir in Action, Second Edition teaches you how to build production-quality distributed applications using the Elixir programming language. Author Saša Juric introduces this powerful language using examples that highlight the benefits of Elixir's functional and concurrent programming. You...
Clasificación: | Libro Electrónico |
---|---|
Autor principal: | |
Autor Corporativo: | |
Formato: | Electrónico eBook |
Idioma: | Inglés |
Publicado: |
Manning Publications,
2019.
|
Edición: | 2nd edition. |
Temas: | |
Acceso en línea: | Texto completo (Requiere registro previo con correo institucional) |
Tabla de Contenidos:
- Intro
- Elixir in Action
- Copyright
- brief contents
- contents
- praise for the first edition
- front matter
- preface
- acknowledgments
- about this book
- Who should read this book
- How this book is organized
- About the code
- Book Forum
- about the author
- about the cover illustration
- 1 First steps
- 1.1 About Erlang
- 1.1.1 High availability
- 1.1.2 Erlang concurrency
- 1.1.3 Server-side systems
- 1.1.4 The development platform
- 1.2 About Elixir
- 1.2.1 Code simplification
- 1.2.2 Composing functions
- 1.2.3 The big picture
- 1.3 Disadvantages
- 1.3.1 Speed
- 1.3.2 Ecosystem
- Summary
- 2 Building blocks
- 2.1 The interactive shell
- 2.2 Working with variables
- 2.3 Organizing your code
- 2.3.1 Modules
- 2.3.2 Functions
- 2.3.3 Function arity
- 2.3.4 Function visibility
- 2.3.5 Imports and aliases
- 2.3.6 Module attributes
- 2.3.7 Comments
- 2.4 Understanding the type system
- 2.4.1 Numbers
- 2.4.2 Atoms
- 2.4.3 Tuples
- 2.4.4 Lists
- 2.4.5 Immutability
- 2.4.6 Maps
- 2.4.7 Binaries and bitstrings
- 2.4.8 Strings
- 2.4.9 First-class functions
- 2.4.10 Other built-in types
- 2.4.11 Higher-level types
- 2.4.12 IO lists
- 2.5 Operators
- 2.6 Macros
- 2.7 Understanding the runtime
- 2.7.1 Modules and functions in the runtime
- 2.7.2 Starting the runtime
- Summary
- 3 Control flow
- 3.1 Pattern matching
- 3.1.1 The match operator
- 3.1.2 Matching tuples
- 3.1.3 Matching constants
- 3.1.4 Variables in patterns
- 3.1.5 Matching lists
- 3.1.6 Matching maps
- 3.1.7 Matching bitstrings and binaries
- 3.1.8 Compound matches
- 3.1.9 General behavior
- 3.2 Matching with functions
- 3.2.1 Multiclause functions
- 3.2.2 Guards
- 3.2.3 Multiclause lambdas
- 3.3 Conditionals
- 3.3.1 Branching with multiclause functions
- 3.3.2 Classical branching constructs.
- 3.3.3 The with special form
- 3.4 Loops and iterations
- 3.4.1 Iterating with recursion
- 3.4.2 Tail function calls
- 3.4.3 Higher-order functions
- 3.4.4 Comprehensions
- 3.4.5 Streams
- Summary
- 4 Data abstractions
- 4.1 Abstracting with modules
- 4.1.1 Basic abstraction
- 4.1.2 Composing abstractions
- 4.1.3 Structuring data with maps
- 4.1.4 Abstracting with structs
- 4.1.5 Data transparency
- 4.2 Working with hierarchical data
- 4.2.1 Generating IDs
- 4.2.2 Updating entries
- 4.2.3 Immutable hierarchical updates
- 4.2.4 Iterative updates
- 4.2.5 Exercise: importing from a file
- 4.3 Polymorphism with protocols
- 4.3.1 Protocol basics
- 4.3.2 Implementing a protocol
- 4.3.3 Built-in protocols
- Summary
- 5 Concurrency primitives
- 5.1 Concurrency in BEAM
- 5.2 Working with processes
- 5.2.1 Creating processes
- 5.2.2 Message passing
- 5.3 Stateful server processes
- 5.3.1 Server processes
- 5.3.2 Keeping a process state
- 5.3.3 Mutable state
- 5.3.4 Complex states
- 5.3.5 Registered processes
- 5.4 Runtime considerations
- 5.4.1 A process is sequential
- 5.4.2 Unlimited process mailboxes
- 5.4.3 Shared-nothing concurrency
- 5.4.4 Scheduler inner workings
- Summary
- 6 Generic server processes
- 6.1 Building a generic server process
- 6.1.1 Plugging in with modules
- 6.1.2 Implementing the generic code
- 6.1.3 Using the generic abstraction
- 6.1.4 Supporting asynchronous requests
- 6.1.5 Exercise: refactoring the to-do server
- 6.2 Using GenServer
- 6.2.1 OTP behaviours
- 6.2.2 Plugging into GenServer
- 6.2.3 Handling requests
- 6.2.4 Handling plain messages
- 6.2.5 Other GenServer features
- 6.2.6 Process lifecycle
- 6.2.7 OTP-compliant processes
- 6.2.8 Exercise: GenServer-powered to-do server
- Summary
- 7 Building a concurrent system
- 7.1 Working with the mix project.
- 7.2 Managing multiple to-do lists
- 7.2.1 Implementing a cache
- 7.2.2 Writing tests
- 7.2.3 Analyzing process dependencies
- 7.3 Persisting data
- 7.3.1 Encoding and persisting
- 7.3.2 Using the database
- 7.3.3 Analyzing the system
- 7.3.4 Addressing the process bottleneck
- 7.3.5 Exercise: pooling and synchronizing
- 7.4 Reasoning with processes
- Summary
- 8 Fault-tolerance basics
- 8.1 Runtime errors
- 8.1.1 Error types
- 8.1.2 Handling errors
- 8.2 Errors in concurrent systems
- 8.2.1 Linking processes
- 8.2.2 Monitors
- 8.3 Supervisors
- 8.3.1 Preparing the existing code
- 8.3.2 Starting the supervisor process
- 8.3.3 Child specification
- 8.3.4 Wrapping the supervisor
- 8.3.5 Using a callback module
- 8.3.6 Linking all processes
- 8.3.7 Restart frequency
- Summary
- 9 Isolating error effects
- 9.1 Supervision trees
- 9.1.1 Separating loosely dependent parts
- 9.1.2 Rich process discovery
- 9.1.3 Via tuples
- 9.1.4 Registering database workers
- 9.1.5 Supervising database workers
- 9.1.6 Organizing the supervision tree
- 9.2 Starting processes dynamically
- 9.2.1 Registering to-do servers
- 9.2.2 Dynamic supervision
- 9.2.3 Finding to-do servers
- 9.2.4 Using temporary restart strategy
- 9.2.5 Testing the system
- 9.3 "Let it crash"
- 9.3.1 Processes that shouldn't crash
- 9.3.2 Handling expected errors
- 9.3.3 Preserving the state
- Summary
- 10 Beyond GenServer
- 10.1 Tasks
- 10.1.1 Awaited tasks
- 10.1.2 Non-awaited tasks
- 10.2 Agents
- 10.2.1 Basic use
- 10.2.2 Agents and concurrency
- 10.2.3 Agent-powered to-do server
- 10.2.4 Limitations of agents
- 10.3 ETS tables
- 10.3.1 Basic operations
- 10.3.2 ETS powered key/value store
- 10.3.3 Other ETS operations
- 10.3.4 Exercise: process registry
- Summary
- 11 Working with components
- 11.1 OTP applications.
- 11.1.1 Creating applications with the mix tool
- 11.1.2 The application behavior
- 11.1.3 Starting the application
- 11.1.4 Library applications
- 11.1.5 Creating a to-do application
- 11.1.6 The application folder structure
- 11.2 Working with dependencies
- 11.2.1 Adding a dependency
- 11.2.2 Adapting the pool
- 11.2.3 Visualizing the system
- 11.3 Building a web server
- 11.3.1 Choosing dependencies
- 11.3.2 Starting the server
- 11.3.3 Handling requests
- 11.3.4 Reasoning about the system
- 11.4 Configuring applications
- 11.4.1 Application environment
- 11.4.2 Varying configuration
- 11.4.3 Config script considerations
- Summary
- 12 Building a distributed system
- 12.1 Distribution primitives
- 12.1.1 Starting a cluster
- 12.1.2 Communicating between nodes
- 12.1.3 Process discovery
- 12.1.4 Links and monitors
- 12.1.5 Other distribution services
- 12.2 Building a fault-tolerant cluster
- 12.2.1 Cluster design
- 12.2.2 The distributed to-do cache
- 12.2.3 Implementing a replicated database
- 12.2.4 Testing the system
- 12.2.5 Detecting partitions
- 12.2.6 Highly available systems
- 12.3 Network considerations
- 12.3.1 Node names
- 12.3.2 Cookies
- 12.3.3 Hidden nodes
- 12.3.4 Firewalls
- Summary
- 13 Running the system
- 13.1 Running a system with Elixir tools
- 13.1.1 Using the mix and elixir commands
- 13.1.2 Running scripts
- 13.1.3 Compiling for production
- 13.2 OTP releases
- 13.2.1 Building a release with distillery
- 13.2.2 Using a release
- 13.2.3 Release contents
- 13.3 Analyzing system behavior
- 13.3.1 Debugging
- 13.3.2 Logging
- 13.3.3 Interacting with the system
- 13.3.4 Tracing
- Summary
- Index
- Lists of Figures, Tables and Listings
- List of Illustrations
- List of Tables
- List of Listings.