# window

Published articles for window.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Mir/Wayland-Powered Miracle-WM 0.11 Released With New Overview Mode, Window Urgency

DevFeed: [Mir/Wayland-Powered Miracle-WM 0.11 Released With New Overview Mode, Window Urgency](<https://devfeed.tech/articles/mir-wayland-powered-miracle-wm-0-11-released-with-new-overview-mode-window-urgency-34947.md>)

Original publisher: [Read original article](<https://www.phoronix.com/news/Miracle-WM-0.11>)

Author: Michael Larabel

Published: 2026-09-17T00:58:42Z

Content type: release

Language: en

Sources: [Phoronix](<https://devfeed.tech/sources/phoronix.md>)

Topics: [Wayland](<https://devfeed.tech/topics/wayland.md>), [Library](<https://devfeed.tech/topics/library.md>), [canonical](<https://devfeed.tech/topics/canonical.md>)

Tags: [commands](<https://devfeed.tech/tags/commands.md>), [data](<https://devfeed.tech/tags/data.md>), [desktop-linux](<https://devfeed.tech/tags/desktop-linux.md>), [events](<https://devfeed.tech/tags/events.md>), [github](<https://devfeed.tech/tags/github.md>), [image](<https://devfeed.tech/tags/image.md>), [input](<https://devfeed.tech/tags/input.md>), [ipc](<https://devfeed.tech/tags/ipc.md>), [library](<https://devfeed.tech/tags/library.md>), [linux-benchmarking](<https://devfeed.tech/tags/linux-benchmarking.md>), [linux-hardware-benchmarks](<https://devfeed.tech/tags/linux-hardware-benchmarks.md>), [linux-hardware-reviews](<https://devfeed.tech/tags/linux-hardware-reviews.md>), [linux-how-to](<https://devfeed.tech/tags/linux-how-to.md>), [linux-performance](<https://devfeed.tech/tags/linux-performance.md>), [linux-server-benchmarks](<https://devfeed.tech/tags/linux-server-benchmarks.md>), [open-source-graphics](<https://devfeed.tech/tags/open-source-graphics.md>), [overview](<https://devfeed.tech/tags/overview.md>), [phoronix](<https://devfeed.tech/tags/phoronix.md>), [phoronix-test-suite](<https://devfeed.tech/tags/phoronix-test-suite.md>), [plugins](<https://devfeed.tech/tags/plugins.md>), [release](<https://devfeed.tech/tags/release.md>), [ubuntu-benchmarks](<https://devfeed.tech/tags/ubuntu-benchmarks.md>), [ubuntu-hardware](<https://devfeed.tech/tags/ubuntu-hardware.md>), [update](<https://devfeed.tech/tags/update.md>), [wayland](<https://devfeed.tech/tags/wayland.md>), [window](<https://devfeed.tech/tags/window.md>), [windows](<https://devfeed.tech/tags/windows.md>)

### AI overview

Miracle-WM 0.11, a Wayland compositor built on the Mir library, adds an overview mode, window urgency support, plugin IPC events and commands, and support for newer Mir protocols. The release is built on Mir 2.29.

### Source excerpt

Canonical engineer Matthew Kosarek rolled out Miracle-WM 0.11 today as an end-of-summer update to this Wayland compositor built atop the Mir library...

## Waiting for PostgreSQL 19 - Add IGNORE NULLS/RESPECT NULLS option to Window functions.

DevFeed: [Waiting for PostgreSQL 19 - Add IGNORE NULLS/RESPECT NULLS option to Window functions.](<https://devfeed.tech/articles/waiting-for-postgresql-19-add-ignore-nulls-respect-nulls-option-to-window-functions-33665.md>)

Original publisher: [Read original article](<https://www.depesz.com/2025/10/13/waiting-for-postgresql-19-add-ignore-nulls-respect-nulls-option-to-window-functions/>)

Author: depesz

Published: 2025-10-13T11:13:52Z

Content type: article

Language: en

Sources: [select \* from depesz;](<https://devfeed.tech/sources/select-from-depesz.md>)

Topics: [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>)

Tags: [first-value](<https://devfeed.tech/tags/first-value.md>), [functions](<https://devfeed.tech/tags/functions.md>), [ignore](<https://devfeed.tech/tags/ignore.md>), [lag](<https://devfeed.tech/tags/lag.md>), [last-value](<https://devfeed.tech/tags/last-value.md>), [lead](<https://devfeed.tech/tags/lead.md>), [nth-value](<https://devfeed.tech/tags/nth-value.md>), [null](<https://devfeed.tech/tags/null.md>), [nulls](<https://devfeed.tech/tags/nulls.md>), [pg19](<https://devfeed.tech/tags/pg19.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [uncategorized](<https://devfeed.tech/tags/uncategorized.md>), [waiting](<https://devfeed.tech/tags/waiting.md>), [window](<https://devfeed.tech/tags/window.md>), [window-functions](<https://devfeed.tech/tags/window-functions.md>)

### AI overview

The article describes a PostgreSQL patch adding IGNORE NULLS and RESPECT NULLS options, also called a null treatment clause, to the lead, lag, first_value, last_value, and nth_value window functions. IGNORE NULLS skips NULL values, while RESPECT NULLS remains the default behavior.

### Source excerpt

On 3rd of October 2025, Tatsuo Ishii committed patch: Add IGNORE NULLS/RESPECT NULLS option to Window functions. Add IGNORE NULLS/RESPECT NULLS option (null treatment clause) to lead, lag, first_value, last_value and nth_value window functions. If unspecified, the default is RESPECT NULLS which includes NULL values in any result calculation. IGNORE NULLS ignores NULL values. ... Continue reading "Waiting for PostgreSQL 19 - Add IGNORE NULLS/RESPECT NULLS option to Window functions."

## iOS Safari window.scrollTo / getBoundingClientRect bug

DevFeed: [iOS Safari window.scrollTo / getBoundingClientRect bug](<https://devfeed.tech/articles/ios-safari-window-scrollto-getboundingclientrect-bug-37294.md>)

Original publisher: [Read original article](<https://muffinman.io/blog/ios-safari-get-bounding-client-rect-bug/>)

Author: Stanko

Published: 2018-06-01T00:00:00Z

Content type: tutorial

Language: en

Sources: [Stanko Tadić](<https://devfeed.tech/sources/stanko-tadic.md>)

Topics: [browser](<https://devfeed.tech/topics/browser.md>), [bug](<https://devfeed.tech/topics/bug.md>), [iOS](<https://devfeed.tech/topics/ios.md>)

Tags: [browser](<https://devfeed.tech/tags/browser.md>), [bug](<https://devfeed.tech/tags/bug.md>), [function](<https://devfeed.tech/tags/function.md>), [ios](<https://devfeed.tech/tags/ios.md>), [safari](<https://devfeed.tech/tags/safari.md>), [window](<https://devfeed.tech/tags/window.md>)

### AI overview

An iOS Safari bug can cause getBoundingClientRect to return an incorrect position when window.scrollTo is called immediately with a value beyond the document's maximum scroll. The article provides a workaround that caps the scroll value at the maximum possible scroll position.

### Source excerpt

This is a weird one, and not something you will stumble into every day. But it is a bug nonetheless. On iOS safari, if you use window.scrollTo(0, y) and y is larger than document's maximum scroll, any immediate call to getBoundingClientRect will return incorrect top value.Same will happen for horizontal scroll and left value. What happens is that browser thinks it actually scrolled to y and calculates element's position based on that scroll position. This happens only if scrollTo and getBoundingClientRect are executed one right after the other. Not even requestAnimationFrame will save you. Adding a small timeout will, but that is not a viable solution. Check the demo to see it yourself.Unfortunately I couldn't include the iframe with the demo, because of the other bug. Today's your lucky day, you got two bugs by the price of one! I've tested it only on iOS 11, but I guess other versions are affected as well. Solution # Solution is easy, we need to determine maximum possible scroll and to cap our y value. Helper method: function getPageMaxScroll() { // Cross browser page height detection is ugly return Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight ) - window.innerHeight; // Subtract viewport height } Usage: let top = 1000000; // Value larger than maximum scroll const maxScroll = getPageMaxScroll(); // Fix for bug on iOS devices // When top was larger than maximum page scroll // "getBoundingClientRect" would take that value into calculations if (top > maxScroll) { top = maxScroll; } // Scroll the window to the new position window.scrollTo(0, top); // Get the new position const rect = this.contentWrapperElement.getBoundingClientRect(); Hope that helps! P.S. There is another bug on iOS Safari with getBoundingClientRect and position: fixed, but that one is documented and tracked.

## Small Mac apps I love

DevFeed: [Small Mac apps I love](<https://devfeed.tech/articles/small-mac-apps-i-love-37354.md>)

Original publisher: [Read original article](<https://muffinman.io/blog/small-mac-apps-i-love/>)

Author: Stanko

Published: 2018-05-09T00:00:00Z

Content type: opinion

Language: en

Sources: [Stanko Tadić](<https://devfeed.tech/sources/stanko-tadic.md>)

Topics: [App](<https://devfeed.tech/topics/app.md>), [Tool](<https://devfeed.tech/topics/tool.md>), [Scripting, bash](<https://devfeed.tech/topics/scripting-bash.md>), [Bash](<https://devfeed.tech/topics/bash.md>)

Tags: [application](<https://devfeed.tech/tags/application.md>), [apps](<https://devfeed.tech/tags/apps.md>), [bash](<https://devfeed.tech/tags/bash.md>), [features](<https://devfeed.tech/tags/features.md>), [free](<https://devfeed.tech/tags/free.md>), [oh-my-zsh](<https://devfeed.tech/tags/oh-my-zsh.md>), [shortcuts](<https://devfeed.tech/tags/shortcuts.md>), [tools](<https://devfeed.tech/tags/tools.md>), [window](<https://devfeed.tech/tags/window.md>)

### AI overview

A personal list of small Mac applications and Bash tools, including utilities for uninstalling apps, clipboard management, Touch Bar feedback, calendar access, window management, archive extraction, Finder enhancements, Bash customization, and directory navigation.

### Source excerpt

Recently I switched to a new laptop and had to set it up to my likings.This comic describes my setup pretty accurately. My setup includes a bunch of small apps I found over the years. It seems that most people are not aware of these, so I decided to share a list. All of them are free (with the exception of TotalFinder), and if you like them, consider donating to authors. So here they are in the alphabetical order: AppCleaner # AppCleaner website AppCleaner is a small application which allows you to thoroughly uninstall unwanted apps. CopyClip # CopyClip website Simple clipboard manager, stores what you copied allowing you to quickly find it. HapticKey # HapticKey website This is a weird one. I already ranted about the touch bar, and this app makes it a little bit more bearable. Tapping on touch bar will make your trackpad vibrate(?!) to give you haptic feedback. Give it a try and decide for yourself. Itsycal # Itsycal website If you ever were annoyed by the fact Mac has no built-in calendar in the menu bar, you'll love Itsycal. It is a tiny calendar with option to show your calendar events. By default it displays small calendar icon, with current date in it. Custom date formats are supported as well, allowing you replace Mac's clock completely. Spectacle # Spectacle website Simple window manager - move windows around, across workspaces, resize them. All that by using using customizable global shortcuts. The Unarchiver # The Unarchiver website Well, this is probably the most popularI just realized Unarchiver was acquired by MacPaw, hopefully they'll keep it free and simple. on this list. Unarchiver does exactly what it's name suggests. It supports all of the archive formats you'll ever need. TotalFinder ($12.00) # TotalFinder website I always felt Finder is missing a lot of features. TotalFinder and XtraFinder both fix that to an extent, by adding things like tabs, dual mode, cut and more. There is a catch - both application require system tweak to install. You need

## PostgreSQL Data Types: Ranges

DevFeed: [PostgreSQL Data Types: Ranges](<https://devfeed.tech/articles/postgresql-data-types-ranges-34592.md>)

Original publisher: [Read original article](<https://tapoueh.org/blog/2018/04/postgresql-data-types-ranges/>)

Author: Dimitri Fontaine PostgreSQL Major Contributor; Author

Published: 2018-04-18T11:41:12Z

Content type: tutorial

Language: en

Sources: [Dimitri Fontaine](<https://devfeed.tech/sources/dimitri-fontaine.md>)

Topics: [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [data type](<https://devfeed.tech/topics/data-type.md>), [SQL](<https://devfeed.tech/topics/sql.md>)

Tags: [data-type](<https://devfeed.tech/tags/data-type.md>), [extension](<https://devfeed.tech/tags/extension.md>), [function](<https://devfeed.tech/tags/function.md>), [indexes](<https://devfeed.tech/tags/indexes.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [range](<https://devfeed.tech/tags/range.md>), [sql](<https://devfeed.tech/tags/sql.md>), [transformation](<https://devfeed.tech/tags/transformation.md>), [types](<https://devfeed.tech/tags/types.md>), [window](<https://devfeed.tech/tags/window.md>)

### AI overview

This tutorial introduces PostgreSQL range types, using daterange values to represent exchange-rate validity periods. It demonstrates loading and transforming exchange-rate data, then enforcing non-overlapping periods with exclusion constraints, GiST indexes, and the btree_gist extension.

### Source excerpt

Continuing our series of PostgreSQL Data Types today we're going to introduce the PostgreSQL ranges data type. Range types are a unique feature of PostgreSQL, managing two dimensions of data in a single column, and allowing advanced processing. The main example is the daterange data type, which stores as a single value a lower and an upper bound of the range as a single value. This allows PostgreSQL to implement a concurrent safe check against overlapping ranges, as we're going to see in this article.

## Get scrollbar width in JavaScript

DevFeed: [Get scrollbar width in JavaScript](<https://devfeed.tech/articles/get-scrollbar-width-in-javascript-37275.md>)

Original publisher: [Read original article](<https://muffinman.io/blog/get-scrollbar-width-in-javascript/>)

Author: Stanko

Published: 2017-12-15T00:00:00Z

Content type: tutorial

Language: en

Sources: [Stanko Tadić](<https://devfeed.tech/sources/stanko-tadic.md>)

Topics: [JavaScript](<https://devfeed.tech/topics/javascript.md>), [Web Development](<https://devfeed.tech/topics/web-development.md>), [browser](<https://devfeed.tech/topics/browser.md>)

Tags: [browser](<https://devfeed.tech/tags/browser.md>), [browser-support](<https://devfeed.tech/tags/browser-support.md>), [function](<https://devfeed.tech/tags/function.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [window](<https://devfeed.tech/tags/window.md>)

### AI overview

A JavaScript one-liner calculates the body scrollbar width by subtracting the document's client width from the window's inner width. It returns zero when no scrollbar is shown, including on mobile devices.

### Source excerpt

Another one-liner I love, that returns body scrollbar width. If scrollbar is not shown it will return zero (including mobile devices). function getScrollbarWidth() { return window.innerWidth - document.documentElement.clientWidth; } Click on the button to try it yourself: Get scrollbar width! Browser support # Tested on: Windows: IE9, IE10, IE11, Edge MacOS: Safari, Firefox, Chrome, Opera iOS: Safari, Chrome Android: Chrome

## Moving past averages in SQL (Postgres) - Percentiles

DevFeed: [Moving past averages in SQL (Postgres) - Percentiles](<https://devfeed.tech/articles/moving-past-averages-in-sql-postgres-percentiles-41177.md>)

Original publisher: [Read original article](<https://www.craigkerstiens.com/2015/06/07/Moving-past-averages-in-SQL-Postgres-Percentiles/>)

Author: Map

Published: 2015-06-07T20:55:56Z

Content type: tutorial

Language: en

Sources: [Craig Kerstiens](<https://devfeed.tech/sources/craig-kerstiens.md>)

Topics: [SQL](<https://devfeed.tech/topics/sql.md>), [data](<https://devfeed.tech/topics/data.md>)

Tags: [postgres](<https://devfeed.tech/tags/postgres.md>), [processing](<https://devfeed.tech/tags/processing.md>), [rank](<https://devfeed.tech/tags/rank.md>), [sql](<https://devfeed.tech/tags/sql.md>), [window](<https://devfeed.tech/tags/window.md>), [window-functions](<https://devfeed.tech/tags/window-functions.md>)

### AI overview

This tutorial explains why medians and percentiles can provide more useful insight than averages when analyzing metrics in Postgres. It demonstrates using window functions, ntile, and ordered set functions to calculate percentile rankings directly in SQL.

### Source excerpt

Often when you're tracking a metric for the first time you take a look at your average. For example what is your ARPU - Average Revenue Per User. In theory this tells you if you can acquire new user how much you'll make off that user. Or maybe what's your average life time value of a customer. Yet, many that are more familiar looking and extracting meaning from data median or a few different looks at percentiles can be much more meaningful. And while you can very easily get the AVG in Postgres, with a small amount more effort you can report on percentiles as well. Window functions have been around for some time in Postgres. They allow you to order your result set over a certain group. The most basic example is if you want to order by date, but know which one falls at place 10 in order you can use a window function and project out the rank(). Beyond outputting the rank yourself and doing extra manipulation Postgres has some great utilities to make the most common uses even easier. Being able to compute things such as the perc 95 directly on the data, or lay out for every record in the result where it falls within a percentile is hugely useful. Let's take a look: Assuming you have a table called purchases, which has a total in it we could try: SELECT id, total, ntile(100) OVER (ORDER BY total) AS perc_rank FROM purchases This would give us something like: id | total | perc_rank ----------|---------|----------- 264 | 12034 | 100 643 | 11830 | 100 ... ... 304 | 751 | 95 What this would tell us is we have less than 5% of our purchases that have a total over 751. From here you can start to dig in and extract all sorts of different meanings, and by doing directly in SQL you're closer to the data and have one less processing step. Percentiles get even more fun with the ordered set functions that came out in Postgres 9.4. They even allow you to project out hypothetical values in certain cases. For now I'd encourage adding ntile to your toolbox anytime you're analyzing averag

## Tracking Month over Month Growth in SQL

DevFeed: [Tracking Month over Month Growth in SQL](<https://devfeed.tech/articles/tracking-month-over-month-growth-in-sql-41163.md>)

Original publisher: [Read original article](<https://www.craigkerstiens.com/2014/02/26/Tracking-Month-over-Month-Growth-in-SQL/>)

Author: Map

Published: 2014-02-26T20:55:56Z

Content type: tutorial

Language: en

Sources: [Craig Kerstiens](<https://devfeed.tech/sources/craig-kerstiens.md>)

Topics: [SQL](<https://devfeed.tech/topics/sql.md>), [data](<https://devfeed.tech/topics/data.md>), [Query (disambiguation)](<https://devfeed.tech/topics/query.md>)

Tags: [data](<https://devfeed.tech/tags/data.md>), [formatting](<https://devfeed.tech/tags/formatting.md>), [growth](<https://devfeed.tech/tags/growth.md>), [postgres](<https://devfeed.tech/tags/postgres.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [query](<https://devfeed.tech/tags/query.md>), [revenue](<https://devfeed.tech/tags/revenue.md>), [saas](<https://devfeed.tech/tags/saas.md>), [sql](<https://devfeed.tech/tags/sql.md>), [window](<https://devfeed.tech/tags/window.md>)

### AI overview

A tutorial on calculating month-over-month revenue growth in SQL. It demonstrates aggregating revenue by month and using the window function lag to retrieve the previous month's value for percentage-growth calculations.

### Source excerpt

In analyzing a business I commonly look at reports that have two lenses, one is by doing various cohort analysis. The other is that I look for Month over Month or Week over Week or some other X over X growth in terms of a percentage. This second form of looking at data is relevant when you're in a SaaS business or essentially anythign that does recurring billing. In such a business focusing on your MRR and working on growing your MRR is how success can often be measured. I'll jump write in, first lets assume you have some method of querying your revenue. In this case you may have some basic query similar to: SELECT date_trunc('month', mydate) as date, sum(mymoney) as revenue FROM foo GROUP BY date ORDER BY date ASC; This should give you a nice clean result: date | revenue ------------------------+---------- 2013-10-01 00:00:00+00 | 10000 2013-11-01 00:00:00+00 | 11000 2013-12-01 00:00:00+00 | 11500 Now this is great, but the first thing I want to do is start to see what my percentage growth month over month is. Surprise, surprise, I can do this directly in SQL. To do so I'll use a window function and then use the lag function. According to the Postgres docs lag(value any [, offset integer [, default any ]]) same type as value returns value evaluated at the row that is offset rows before the current row within the partition; if there is no such row, instead return default. Both offset and default are evaluated with respect to the current row. If omitted, offset defaults to 1 and default to null Essentially it orders it based on the window function and then pulls in the value from the row before. So in action it looks something like: SELECT date_trunc('month', mydate) as date, sum(mymoney) as revenue, lag(mymoney, 1) over w previous_month_revenue FROM foo WINDOW w as (order by date) GROUP BY date ORDER BY date ASC; Combining to actually make it a bit more pretty (with some casting to a numeric and then formatting a bit) in terms of a percentage: SELECT date_trunc('mon

## switch-window reaches 0.8

DevFeed: [switch-window reaches 0.8](<https://devfeed.tech/articles/switch-window-reaches-0-8-34391.md>)

Original publisher: [Read original article](<https://tapoueh.org/blog/2010/09/switch-window-reaches-0.8/>)

Author: Dimitri Fontaine PostgreSQL Major Contributor; Author

Published: 2010-09-13T15:45:00Z

Content type: article

Language: en

Sources: [Dimitri Fontaine](<https://devfeed.tech/sources/dimitri-fontaine.md>)

Topics: [coding](<https://devfeed.tech/topics/coding.md>), [Utility Software](<https://devfeed.tech/topics/utility.md>), [GUI](<https://devfeed.tech/topics/gui.md>)

Tags: [keyboard](<https://devfeed.tech/tags/keyboard.md>), [layout](<https://devfeed.tech/tags/layout.md>), [split](<https://devfeed.tech/tags/split.md>), [string](<https://devfeed.tech/tags/string.md>), [window](<https://devfeed.tech/tags/window.md>)

### AI overview

The author describes updating the switch-window utility to use the keyboard layout from quail-keyboard-layout, using the first ten letters as labels and direct-switch keys instead of hard-coded numbers. The change is intended to improve suitability for cssh users. The article also briefly mentions an upcoming el-get release and asks readers to test it and report problems.

### Source excerpt

I wanted to play with the idea of using the whole keyboard for my switch-window utility, but wondered how to get those keys in the right order and all. Finally found quail-keyboard-layout which seems to exists for such uses, as you can see: (loop with layout = (split-string quail-keyboard-layout "") for row from 1 to 4 collect (loop for col from 1 to 12 ("q" "w" "e" "r" "t" "y" "u" "i" "o" "p" "[" "]") ("a" "s" "d" "f" "g" "h" "j" "k" "l" ";" "'" "\\") ("z" "x" "c" "v" "b" "n" "m" "," "." "/" " " " ")) So now switch-window will use that (but only the first 10 letters) instead of hard-coding numbers from 1 to 9 as labels and direct switches. That makes it more suitable to cssh users too, I guess.

## Understanding this in JavaScript Objects, Inner Functions, and Callbacks

DevFeed: [Understanding this in JavaScript Objects, Inner Functions, and Callbacks](<https://devfeed.tech/articles/javascript-objects-and-what-is-this-35421.md>)

Original publisher: [Read original article](<https://darkcoding.net/software/javascript-objects-and-what-is-this/>)

Author: Graham King

Published: 2009-02-23T02:06:41Z

Content type: tutorial

Language: en

Sources: [Graham King](<https://devfeed.tech/sources/graham-king.md>)

Topics: [JavaScript](<https://devfeed.tech/topics/javascript.md>), [callback](<https://devfeed.tech/topics/callback.md>), [bug](<https://devfeed.tech/topics/bug.md>)

Tags: [bug](<https://devfeed.tech/tags/bug.md>), [callback](<https://devfeed.tech/tags/callback.md>), [closure](<https://devfeed.tech/tags/closure.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [local-variables](<https://devfeed.tech/tags/local-variables.md>), [scope](<https://devfeed.tech/tags/scope.md>), [software](<https://devfeed.tech/tags/software.md>), [window](<https://devfeed.tech/tags/window.md>)

### AI overview

This tutorial explains how JavaScript's this behaves in object methods, inner functions, and callbacks. It shows how object context can be lost and how closures and local variables can preserve access to the intended object.

### Source excerpt

"Navigate the tricky waters of 'this' in JavaScript objects and callbacks."