# collect

Published articles for collect.

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

## GHarchive data has become unreliable for measuring GitHub activity

DevFeed: [GHarchive data has become unreliable for measuring GitHub activity](<https://devfeed.tech/articles/how-much-should-you-trust-your-oss-data-34319.md>)

Original publisher: [Read original article](<http://opensource.googleblog.com/2026/09/how-much-should-you-trust-your-oss-data.html>)

Author: KD (noreply@blogger.com)

Published: 2026-09-03T16:00:00Z

Content type: opinion

Language: en

Sources: [Google Open Source Blog](<https://devfeed.tech/sources/google-open-source-blog.md>)

Topics: [data](<https://devfeed.tech/topics/data.md>), [datasets](<https://devfeed.tech/topics/datasets.md>), [GitHub](<https://devfeed.tech/topics/github.md>), [Crawler](<https://devfeed.tech/topics/crawler.md>), [GitHub API](<https://devfeed.tech/topics/github-api.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [GraphQL](<https://devfeed.tech/topics/graphql.md>)

Tags: [collect](<https://devfeed.tech/tags/collect.md>), [data](<https://devfeed.tech/tags/data.md>), [dataset](<https://devfeed.tech/tags/dataset.md>), [datasets](<https://devfeed.tech/tags/datasets.md>), [github](<https://devfeed.tech/tags/github.md>), [google](<https://devfeed.tech/tags/google.md>), [google-open-source](<https://devfeed.tech/tags/google-open-source.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [open-data-sets](<https://devfeed.tech/tags/open-data-sets.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [oss](<https://devfeed.tech/tags/oss.md>), [pipeline](<https://devfeed.tech/tags/pipeline.md>), [pull-requests](<https://devfeed.tech/tags/pull-requests.md>), [retention](<https://devfeed.tech/tags/retention.md>), [stream](<https://devfeed.tech/tags/stream.md>), [volume](<https://devfeed.tech/tags/volume.md>)

### AI overview

This article examines the reliability of open source data, focusing on GHarchive's coverage of GitHub events. It argues that GHarchive should not be used for real-time or volume-based metrics because event retention has declined and some activity is omitted by the GitHub Event stream and API limitations.

### Source excerpt

by Sophia Vargas, Google Open Source & Andrew Nesbitt, Ecosyste.ms Every second, open source contribution quietly shapes the software we rely on, and yet our view of this open ecosystem is surprisingly opaque. Open source development is performed in public spaces -- we can see the commits, issues and comments, the APIs and endpoints are free to use -- the logs are just sitting there, so why can't we just collect all of the data? ...Said every researcher, everywhere. However in most cases of open source related data, we are only looking at part of the whole. Why am I writing this post? Because many of us (including many business decision-makers) are too comfortable with unsubstantiated data. We've gotten used to it. Our models assume that it's smelly and we adjust the logic and weights to compromise. When it comes to open source, our confidence is even lower, even though our resulting decisions can directly impact individuals whom we collectively depend on. Let's consider one of my favorite datasets: GHarchive. Started as a hobby project in 2011, this crawler has amassed more than 15 years of event data from GitHub. While this source provides a historical record of open source development on GitHub, as a real-time or comprehensive source of metrics, it's unreliable and should not be a source for volume-based metrics. In 2025, GHarchive captured 14% fewer events than in 2024, despite steady growth in platform adoption. Since 2025, we estimate that data retention in GHarchive has fallen to ~50% and in 2026 it may be as low as 20% for some event types (see figure below). Prior to 2025, you could make the general assumption that the majority of events would be represented in this pipeline. Since 2025, we must now assume we may be missing at least half of events and possibly more -- not to mention all of the additional activity that's left out of the event API (see GitHub's GraphQL API.) The crawler logic behind this dataset is simple: give me all the events from the GitHub Ev

## Kubelet Metrics: How cAdvisor and CRI Collect Kubernetes Stats

DevFeed: [Kubelet Metrics: How cAdvisor and CRI Collect Kubernetes Stats](<https://devfeed.tech/articles/kubelet-metrics-how-cadvisor-and-cri-collect-kubernetes-stats-19138.md>)

Original publisher: [Read original article](<https://learnkube.com/kubernetes-metrics-cadvisor-kubelet-cri>)

Author: Gulcan Topcu

Published: 2026-05-18T00:00:00Z

Content type: tutorial

Language: en

Sources: [Learnk8s](<https://devfeed.tech/sources/learnk8s.md>)

Topics: [Kubernetes](<https://devfeed.tech/topics/kubernetes.md>), [container](<https://devfeed.tech/topics/container.md>), [telemetry](<https://devfeed.tech/topics/telemetry.md>), [gRPC](<https://devfeed.tech/topics/grpc.md>), [Kernel](<https://devfeed.tech/topics/kernel.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [api-server](<https://devfeed.tech/tags/api-server.md>), [cgroups](<https://devfeed.tech/tags/cgroups.md>), [collect](<https://devfeed.tech/tags/collect.md>), [container](<https://devfeed.tech/tags/container.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [data](<https://devfeed.tech/tags/data.md>), [deployment](<https://devfeed.tech/tags/deployment.md>), [grafana](<https://devfeed.tech/tags/grafana.md>), [kernel](<https://devfeed.tech/tags/kernel.md>), [kubernetes](<https://devfeed.tech/tags/kubernetes.md>), [linux](<https://devfeed.tech/tags/linux.md>), [metrics](<https://devfeed.tech/tags/metrics.md>), [monitoring](<https://devfeed.tech/tags/monitoring.md>), [performance](<https://devfeed.tech/tags/performance.md>), [pipeline](<https://devfeed.tech/tags/pipeline.md>), [prometheus](<https://devfeed.tech/tags/prometheus.md>), [trace](<https://devfeed.tech/tags/trace.md>), [visibility](<https://devfeed.tech/tags/visibility.md>)

### AI overview

This tutorial explains how Kubernetes collects and exposes container, pod, and node metrics through kubelet, cAdvisor, the Linux kernel, and the Container Runtime Interface (CRI). It describes the shift toward CRI-native metrics over gRPC and how Prometheus, Grafana, and other observability systems consume the data.

### Source excerpt

Learn how kubelet collects Kubernetes metrics from cgroups, cAdvisor, containerd and CRI, and when pod and container stats move to the runtime.

## What Is Indirect Tax? The SaaS Founder's Compliance Primer

DevFeed: [What Is Indirect Tax? The SaaS Founder's Compliance Primer](<https://devfeed.tech/articles/what-is-indirect-tax-the-saas-founder-s-compliance-primer-10443.md>)

Original publisher: [Read original article](<https://dodopayments.com/blogs/what-is-indirect-tax-saas/>)

Author: Ayush Agarwal

Published: 2026-05-07T00:00:00Z

Content type: tutorial

Language: en

Sources: [Dodo Payments Blog](<https://devfeed.tech/sources/dodo-payments-blog.md>)

Topics: [Software as a service](<https://devfeed.tech/topics/saas.md>)

Tags: [business](<https://devfeed.tech/tags/business.md>), [checkout](<https://devfeed.tech/tags/checkout.md>), [collect](<https://devfeed.tech/tags/collect.md>), [compliance](<https://devfeed.tech/tags/compliance.md>), [cross-border](<https://devfeed.tech/tags/cross-border.md>), [customer](<https://devfeed.tech/tags/customer.md>), [eu](<https://devfeed.tech/tags/eu.md>), [global](<https://devfeed.tech/tags/global.md>), [operational](<https://devfeed.tech/tags/operational.md>), [saas](<https://devfeed.tech/tags/saas.md>), [tax](<https://devfeed.tech/tags/tax.md>), [us](<https://devfeed.tech/tags/us.md>), [vat](<https://devfeed.tech/tags/vat.md>)

### AI overview

A practical primer for SaaS founders on indirect tax, including how it differs from direct tax, why cross-border SaaS creates tax obligations, and the responsibilities for charging, filing, and remitting tax.

### Source excerpt

What indirect tax is, how it differs from direct tax, why it matters for SaaS founders, and the practical steps to stay compliant across global markets.

## Expanding a Running Netlab Topology

DevFeed: [Expanding a Running Netlab Topology](<https://devfeed.tech/articles/expanding-a-running-netlab-topology-11214.md>)

Original publisher: [Read original article](<https://blog.ipspace.net/2025/07/expanding-netlab-topology/>)

Published: 2025-07-07T06:11:00Z

Content type: tutorial

Language: en

Sources: [ipSpace.net blog](<https://devfeed.tech/sources/ipspace-net-blog.md>)

Topics: [configuration](<https://devfeed.tech/topics/configuration.md>), [Cisco](<https://devfeed.tech/topics/cisco.md>), [dell](<https://devfeed.tech/topics/dell.md>), [Linux](<https://devfeed.tech/topics/linux.md>)

Tags: [cisco](<https://devfeed.tech/tags/cisco.md>), [collect](<https://devfeed.tech/tags/collect.md>), [config](<https://devfeed.tech/tags/config.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [dell](<https://devfeed.tech/tags/dell.md>), [devices](<https://devfeed.tech/tags/devices.md>), [ios](<https://devfeed.tech/tags/ios.md>), [linux](<https://devfeed.tech/tags/linux.md>), [merge](<https://devfeed.tech/tags/merge.md>), [mikrotik](<https://devfeed.tech/tags/mikrotik.md>), [netlab](<https://devfeed.tech/tags/netlab.md>), [nx](<https://devfeed.tech/tags/nx.md>), [sonic](<https://devfeed.tech/tags/sonic.md>)

### AI overview

This tutorial explains how to expand a netlab topology while preserving configuration changes made to existing devices. It recommends collecting configurations to a separate folder, checking whether they can be reloaded, rebuilding the lab with the modified topology, and applying the saved configurations. The procedure has platform-specific limitations and may fail when device interfaces or configuration formats differ.

### Source excerpt

One of the happy netlab users sent me an interesting challenge: He's built a large lab and added tons of extra configuration to the lab devices. Afterwards, he realized he'd like to add a few more devices to the lab and was worried about losing all the changes he had made. Unfortunately, you cannot add new devices to an already-running lab. You must shut down the lab, change the topology description, and start a new lab. However, there are things you can do to preserve the extra work you already did: Read more ...

## Collecting items from the Flow in chunks💦

DevFeed: [Collecting items from the Flow in chunks💦](<https://devfeed.tech/articles/collecting-items-from-the-flow-in-chunks-25706.md>)

Original publisher: [Read original article](<https://blog.shreyaspatil.dev/collecting-items-from-the-flow-in-chunks/>)

Author: Shreyas Patil

Published: 2023-10-23T04:46:23Z

Content type: tutorial

Language: en

Sources: [Shreyas Patil's Blog](<https://devfeed.tech/sources/shreyas-patil-s-blog.md>)

Topics: [kotlin-flow](<https://devfeed.tech/topics/kotlin-flow.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/topics/kotlin-coroutines.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [reactive](<https://devfeed.tech/topics/reactive.md>), [SQLite](<https://devfeed.tech/topics/sqlite.md>)

Tags: [collect](<https://devfeed.tech/tags/collect.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [flow](<https://devfeed.tech/tags/flow.md>), [guide](<https://devfeed.tech/tags/guide.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-coroutines](<https://devfeed.tech/tags/kotlin-coroutines.md>), [kotlin-flow](<https://devfeed.tech/tags/kotlin-flow.md>), [multithreading](<https://devfeed.tech/tags/multithreading.md>), [reactive-programming](<https://devfeed.tech/tags/reactive-programming.md>)

### AI overview

A practical guide to collecting Kotlin Flow items in time-based chunks without losing produced data. It explains why batching high-frequency analytics events can reduce the cost of repeated database or network operations and outlines an operator implementation.

### Source excerpt

Learn how to collect Kotlin Flow items in chunks or intervals without losing data. A practical guide to handling high-frequency data streams efficiently.

## How To Measure the Value of Internal Tools

DevFeed: [How To Measure the Value of Internal Tools](<https://devfeed.tech/articles/how-to-measure-the-value-of-internal-tools-15681.md>)

Original publisher: [Read original article](<https://developer.squareup.com/blog/how-to-measure-the-value-of-internal-tools>)

Author: Chang Liu

Published: 2023-08-02T16:00:00Z

Content type: tutorial

Language: en

Sources: [Square Corner Blog RSS Feed](<https://devfeed.tech/sources/square-corner-blog-rss-feed.md>)

Topics: [Low-Code / Internal Tools](<https://devfeed.tech/topics/internal-tools.md>), [Data analysis](<https://devfeed.tech/topics/data-analysis.md>), [data-processing](<https://devfeed.tech/topics/data-processing.md>)

Tags: [analysis](<https://devfeed.tech/tags/analysis.md>), [collect](<https://devfeed.tech/tags/collect.md>), [collection](<https://devfeed.tech/tags/collection.md>), [cost](<https://devfeed.tech/tags/cost.md>), [data-analysis](<https://devfeed.tech/tags/data-analysis.md>), [data-science](<https://devfeed.tech/tags/data-science.md>), [efficiency](<https://devfeed.tech/tags/efficiency.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [internal-tools](<https://devfeed.tech/tags/internal-tools.md>), [metrics](<https://devfeed.tech/tags/metrics.md>)

### AI overview

This tutorial introduces Square's internal products and explains how to measure their effectiveness using internal metrics. It discusses evaluating impact, improving features with data, identifying anomalies, and designing appropriate data collection processes for different types of tools.

### Source excerpt

Introduction to Square internal products and the metrics we use to track their effectiveness

## Building a Note-Taking App in Compose

DevFeed: [Building a Note-Taking App in Compose](<https://devfeed.tech/articles/building-a-note-taking-app-in-compose-20024.md>)

Original publisher: [Read original article](<https://technology.doximity.com/articles/building-a-note-taking-app-in-compose>)

Author: Doximity

Published: 2023-07-05T19:47:00Z

Content type: tutorial

Language: en

Sources: [Doximity](<https://devfeed.tech/sources/doximity.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [App](<https://devfeed.tech/topics/app.md>), [Code](<https://devfeed.tech/topics/code.md>), [Template](<https://devfeed.tech/topics/template.md>)

Tags: [app](<https://devfeed.tech/tags/app.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [build](<https://devfeed.tech/tags/build.md>), [building](<https://devfeed.tech/tags/building.md>), [class](<https://devfeed.tech/tags/class.md>), [clean-architecture](<https://devfeed.tech/tags/clean-architecture.md>), [code](<https://devfeed.tech/tags/code.md>), [collect](<https://devfeed.tech/tags/collect.md>), [compose](<https://devfeed.tech/tags/compose.md>), [data-class](<https://devfeed.tech/tags/data-class.md>), [di](<https://devfeed.tech/tags/di.md>), [extension-function](<https://devfeed.tech/tags/extension-function.md>), [flow](<https://devfeed.tech/tags/flow.md>), [icons](<https://devfeed.tech/tags/icons.md>), [implement](<https://devfeed.tech/tags/implement.md>), [koin](<https://devfeed.tech/tags/koin.md>), [list](<https://devfeed.tech/tags/list.md>), [state](<https://devfeed.tech/tags/state.md>), [state-management](<https://devfeed.tech/tags/state-management.md>), [view](<https://devfeed.tech/tags/view.md>)

### AI overview

A case study showing how to build a note-taking app with Jetpack Compose. It models note state, renders the notes UI, collects note data through a presenter and Clean Architecture use cases, and plans events for adding, editing, checking, and deleting notes.

### Source excerpt

In this case study, we will build a note-taking app that lets the user add, edit and delete notes. It uses Compose for both the view and presentation layers! Note: This is a follow up to Part 1: Simplifying State Management with Compose and assumes the reader is already familiar with Jetpack Compose. The Template I find it useful to start with the model that represents the state of the screen we're building. It will have a list of notes, with each note containing properties for the text and checkbox: data class NotesUiModel(val notes: List<Note>) : UiModel { data class Note(val text: String, val isChecked: Boolean) : UiModel } It'll be the job of the presenter to produce this model. Initially, let's implement a stub to return an empty list of notes (we'll ignore parameters for now): class NotesListPresenter : Presenter<NotesUiModel, Unit> { @Composable override fun present(params: Unit): NotesUiModel { return NotesUiModel(notes = emptyList()) } } Then we can build our view to render the model that's returned by the presenter: @Composable fun NotesScreen() { val presenter: NotesListPresenter = koinInject() // we use koin for DI val uiModel = presenter.present(Unit) Column { TopAppBar(title = { Text("Notes") }) Notes(uiModel) } } } The View The views themselves are pretty self-explanatory if you're already familiar with building UIs in Compose. For the notes, we'll take in a NotesUiModel argument and create a LazyColumn with the notes property. A FAB button is used for adding new notes, although we'll skip the triggering of events and return to this part in a little bit: @Composable private fun Notes(uiModel: NotesUiModel) { Box { LazyColumn { items(uiModel.notes) { note -> Note(note) } } FloatingActionButton(onClick = { /* TODO */ }) { Icon(imageVector = Icons.Rounded.Add) } } } Then we can render each note with a checkbox, text field and delete button: @Composable private fun Note(uiModel: Note) { Row { Checkbox( checked = uiModel.isChecked, onCheckedChange = { /* T

## "Practical Math" Preview: Collect Sensitive Survey Responses Privately

DevFeed: ["Practical Math" Preview: Collect Sensitive Survey Responses Privately](<https://devfeed.tech/articles/practical-math-preview-collect-sensitive-survey-responses-privately-40454.md>)

Original publisher: [Read original article](<https://www.jeremykun.com/2022/05/14/practical-math-preview-collect-sensitive-survey-responses-privately/>)

Published: 2022-05-14T09:40:49Z

Content type: tutorial

Language: en

Sources: [Jeremy Kun](<https://devfeed.tech/sources/jeremy-kun.md>)

Topics: [math](<https://devfeed.tech/topics/math.md>), [Statistics](<https://devfeed.tech/topics/statistics.md>), [Code](<https://devfeed.tech/topics/code.md>), [Software](<https://devfeed.tech/topics/software.md>)

Tags: [bias](<https://devfeed.tech/tags/bias.md>), [code](<https://devfeed.tech/tags/code.md>), [collect](<https://devfeed.tech/tags/collect.md>), [differential-privacy](<https://devfeed.tech/tags/differential-privacy.md>), [mathematics](<https://devfeed.tech/tags/mathematics.md>), [politics](<https://devfeed.tech/tags/politics.md>), [practical](<https://devfeed.tech/tags/practical.md>), [practical-math](<https://devfeed.tech/tags/practical-math.md>), [privacy](<https://devfeed.tech/tags/privacy.md>), [programming](<https://devfeed.tech/tags/programming.md>), [python](<https://devfeed.tech/tags/python.md>), [random](<https://devfeed.tech/tags/random.md>), [randomized-algorithm](<https://devfeed.tech/tags/randomized-algorithm.md>), [research](<https://devfeed.tech/tags/research.md>), [responses](<https://devfeed.tech/tags/responses.md>), [survey](<https://devfeed.tech/tags/survey.md>)

### AI overview

This chapter preview explains randomized response, a survey technique for estimating aggregate statistics about sensitive questions while preserving respondents' privacy. Respondents use private coin flips to introduce randomization and maintain plausible deniability.

### Source excerpt

This is a draft of a chapter from my in-progress book, Practical Math for Programmers: A Tour of Mathematics in Production Software. Tip: Determine an aggregate statistic about a sensitive question, when survey respondents do not trust that their responses will be kept secret. Solution: import random def respond_privately(true_answer: bool) -> bool: '''Respond to a survey with plausible deniability about your answer.''' be_honest = random.random() < 0.5 random_answer = random.random() < 0.

## Quests along the Road to Devcon

DevFeed: [Quests along the Road to Devcon](<https://devfeed.tech/articles/quests-along-the-road-to-devcon-16964.md>)

Original publisher: [Read original article](<https://blog.ethereum.org/en/2021/05/19/quests-along-the-road>)

Author: Devcon

Published: 2021-05-19T00:00:00Z

Content type: news

Language: en

Sources: [Ethereum Foundation Blog](<https://devfeed.tech/sources/ethereum-foundation-blog.md>)

Topics: [Ethereum](<https://devfeed.tech/topics/ethereum.md>), [Blockchain](<https://devfeed.tech/topics/blockchain.md>), [Canvas](<https://devfeed.tech/topics/canvas.md>), [Discord](<https://devfeed.tech/topics/discord.md>)

Tags: [art](<https://devfeed.tech/tags/art.md>), [badge](<https://devfeed.tech/tags/badge.md>), [blockchain](<https://devfeed.tech/tags/blockchain.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [collect](<https://devfeed.tech/tags/collect.md>), [community](<https://devfeed.tech/tags/community.md>), [contribute](<https://devfeed.tech/tags/contribute.md>), [devcon](<https://devfeed.tech/tags/devcon.md>), [digital](<https://devfeed.tech/tags/digital.md>), [discord](<https://devfeed.tech/tags/discord.md>), [ethereum](<https://devfeed.tech/tags/ethereum.md>), [event](<https://devfeed.tech/tags/event.md>), [events](<https://devfeed.tech/tags/events.md>), [experiment](<https://devfeed.tech/tags/experiment.md>), [learn](<https://devfeed.tech/tags/learn.md>), [livestream](<https://devfeed.tech/tags/livestream.md>), [nfts](<https://devfeed.tech/tags/nfts.md>), [pixel](<https://devfeed.tech/tags/pixel.md>), [pixel-art](<https://devfeed.tech/tags/pixel-art.md>), [youtube](<https://devfeed.tech/tags/youtube.md>)

### AI overview

The article announces Road to Devcon Quests, periodic community activities designed to encourage collaboration, contribution, and learning while Devcon 6 planning continues. It highlights online events with the EthStaker community, including a POAP.art livestream where participants can create pixel art and earn POAP badges.

### Source excerpt

Friends, As the Ethereum ecosystem continues to grow and mature at break-neck speeds, we continue to work hard on delivering an amazing Devcon 6. Though the timing is still unclear as to when we'll all be able to reunite in Bogota, we want to keep our community involved along...

## When multiple subscribeOn()s do have effect

DevFeed: [When multiple subscribeOn()s do have effect](<https://devfeed.tech/articles/when-multiple-subscribeon-s-do-have-effect-24817.md>)

Original publisher: [Read original article](<https://akarnokd.blogspot.com/2017/11/when-multiple-subscribeons-do-have.html>)

Author: David Karnok (noreply@blogger.com)

Published: 2017-11-29T12:33:00Z

Content type: tutorial

Language: en

Sources: [Akarnokd - Advanced RxJava](<https://devfeed.tech/sources/akarnokd-advanced-rxjava.md>)

Topics: [Code](<https://devfeed.tech/topics/code.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>)

Tags: [collect](<https://devfeed.tech/tags/collect.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [filter](<https://devfeed.tech/tags/filter.md>), [flowable](<https://devfeed.tech/tags/flowable.md>), [io](<https://devfeed.tech/tags/io.md>), [main-thread](<https://devfeed.tech/tags/main-thread.md>), [map](<https://devfeed.tech/tags/map.md>), [scheduler](<https://devfeed.tech/tags/scheduler.md>), [subscribeon](<https://devfeed.tech/tags/subscribeon.md>), [take](<https://devfeed.tech/tags/take.md>), [thread](<https://devfeed.tech/tags/thread.md>), [tutorials](<https://devfeed.tech/tags/tutorials.md>)

### AI overview

This article explains why multiple subscribeOn() operators can sometimes have observable effects. It distinguishes source operators that perform subscription side effects from instance operators that mainly subscribe upstream, and shows how different schedulers can determine the threads where those effects occur.

### Source excerpt

Introduction In many tutorials and explanations, it has been said that having multiple subscribeOn()s has no effect and only the one closest to the source wins. I often tell this with the wording "no practical effect". However, it is possible to demonstrate the effects of multiple subscibeOn()s that have some actual effects. What is subscribeOn again? The most precise definition of this operator I can formulate is as follows: subscribeOn changes where (on what thread) the (side) effects of calling subscribe() on the parent/upstream Observable (Flowable, Single, etc.) happen. So what are these subscription (side) effects look like in code? Observable.create(emitter -> { for (int i = 0; i < 10; i++) { emitter.onNext(i + ": " + Thread.currentThread().getName()); } emitter.onComplete(); }) .subscribeOn(Schedulers.io()) .blockingSubscribe(System.out::println); // Prints: // ------- // 0: RxCachedThreadScheduler-1 // 1: RxCachedThreadScheduler-1 // 2: RxCachedThreadScheduler-1 // 3: RxCachedThreadScheduler-1 // 4: RxCachedThreadScheduler-1 // 5: RxCachedThreadScheduler-1 // 6: RxCachedThreadScheduler-1 // 7: RxCachedThreadScheduler-1 // 8: RxCachedThreadScheduler-1 // 9: RxCachedThreadScheduler-1 In this example, the effect of subscribing is that the body of the ObservableOnSubscribe starts running on the thread provided via the io() Scheduler. Applying yet another subscribeOn after the first one won't change what is printed to the console. Most source-like operators, such as create(), fromCallable(), fromIterable(), do have subscription side-effects as they often start emitting event(s) immediately. Most instance operators, such as map(), filter(), take(), don't have subscription side-effects on their own and just subscribe() to their upstream. Instance operators with subscription side-effects However, there are a couple of instance operators that do have subscription side-effects. Specifically, any operator that offers a way to specify a per subscriber initial state via