<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Zeliot </title>
    <description>The latest articles on DEV Community by Zeliot  (@zeliotofficial).</description>
    <link>https://dev.to/zeliotofficial</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2710%2Fd31008f8-2415-45c7-81bb-fbc19ad30ca7.png</url>
      <title>DEV Community: Zeliot </title>
      <link>https://dev.to/zeliotofficial</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zeliotofficial"/>
    <language>en</language>
    <item>
      <title>Real-Time Data Streaming vs Batch Data ETL: Why Timing Matters</title>
      <dc:creator>Sachin Kamath</dc:creator>
      <pubDate>Tue, 02 Jun 2026 02:26:41 +0000</pubDate>
      <link>https://dev.to/zeliotofficial/real-time-data-streaming-vs-batch-data-etl-why-timing-matters-1d4m</link>
      <guid>https://dev.to/zeliotofficial/real-time-data-streaming-vs-batch-data-etl-why-timing-matters-1d4m</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Batch ETL moves and processes data on a schedule, delivering insights with built-in latency, ideal for historical analysis and compliance, but ineffective for urgent, real-time business actions. Real-Time Streaming pipelines process each event instantly, enabling on-the-fly fraud detection, predictive maintenance, and hyper-personalized engagement. Timing isn’t just a throughput metric; it determines whether data delivers competitive value or is just hindsight. Condense makes real-time streaming practical and production-ready, letting enterprises turn events into actions within their own cloud, while traditional batch workflows remain valuable for long-term reporting and analytics.&lt;/p&gt;

&lt;p&gt;For decades, batch ETL defined how enterprises integrated and analyzed data. Jobs were scheduled, data was extracted from sources, transformed into a unified schema, and loaded into warehouses or lakes for reporting. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This was enough when businesses primarily asked: what happened yesterday? &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the operational environment has changed. Industries now compete on the ability to respond instantly whether blocking fraud at the moment of authorization, detecting anomalies in connected fleets, or personalizing customer engagement as interactions unfold. In this landscape,  Real-Time Data Streaming and modern streaming pipelines are not optimizations. They are requirements. &lt;/p&gt;

&lt;p&gt;This blog examines the technical differences between batch ETL and  Real-Time streaming, explains why timing is more than a performance metric, and explores how streaming pipelines are reshaping enterprise architectures. &lt;/p&gt;

&lt;h2&gt;
  
  
  Batch ETL: Strengths and Boundaries
&lt;/h2&gt;

&lt;p&gt;Batch ETL (Extract, Transform, Load) pipelines move data in discrete intervals. They typically operate as follows: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Extract&lt;br&gt;
Pull records from transactional systems, APIs, or files. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transform&lt;br&gt;
Apply schema normalization, deduplication, or business logic in staging. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Load&lt;br&gt;
Insert processed batches into a target system (warehouse or data lake). &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Technical strengths&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Throughput: Bulk processing of millions of records is efficient on modern compute clusters. &lt;/li&gt;
&lt;li&gt;Determinism: Fixed jobs are easier to validate and audit, making them suitable for compliance. &lt;/li&gt;
&lt;li&gt;Maturity: Tooling (Informatica, Talend, dbt, Airflow) is well established and battle-tested. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations inherent to the design&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latency: The time between data generation and availability is at least the batch interval minutes, hours, or days. &lt;/li&gt;
&lt;li&gt;Operational blind spots: Events between runs remain invisible. Failures may not be discovered until the next batch completes. &lt;/li&gt;
&lt;li&gt;Rigid scheduling: Workflows are brittle under changing workloads. Rescheduling impacts dependencies downstream. &lt;/li&gt;
&lt;li&gt;Resource spikes: Large jobs create uneven load, with clusters often over provisioned to handle peak windows. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Batch ETL is indispensable for historical analysis and compliance reporting, but unsuitable when insights must drive immediate operational action. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Real-Time Data Streaming: A Continuous Model
&lt;/h2&gt;

&lt;p&gt;Real-Time Data Streaming inverts this paradigm. Instead of moving data in scheduled intervals, every event is treated as a discrete, time ordered signal that can be processed immediately. Kafka and similar log based systems provide the backbone for this architecture. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core mechanics of streaming pipelines:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immutable logs: Events are appended to partitions, guaranteeing order and durability. &lt;/li&gt;
&lt;li&gt;Replayability: Consumers can reprocess events from any offset, enabling recovery and backfills. &lt;/li&gt;
&lt;li&gt;Stateful stream processing: Operators maintain state across windows, joins, and aggregations (e.g., “total purchases by customer in the last 5 minutes”). &lt;/li&gt;
&lt;li&gt;Continuous enrichment: Streams are augmented with contextual data (e.g., geolocation, device metadata) in motion. &lt;/li&gt;
&lt;li&gt;Low-latency sinks: Events are delivered to APIs, dashboards, or control systems within milliseconds to seconds. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This model does not merely accelerate batch. It enables workflows that batch cannot support because the business outcome depends on acting while the event is still unfolding. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Timing Is Strategic
&lt;/h2&gt;

&lt;p&gt;Timing is not a secondary concern; it directly determines the value of data. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fraud detection: A fraudulent card transaction must be flagged before the authorization completes. A nightly batch report identifies fraud after the funds are gone. &lt;/li&gt;
&lt;li&gt;Predictive maintenance: An abnormal vibration detected mid route can prevent breakdown. Batch ETL will surface it only after the vehicle is already sidelined. &lt;/li&gt;
&lt;li&gt;Customer personalization: Recommending a product while a customer is browsing drives conversion. A next day email is often irrelevant. &lt;/li&gt;
&lt;li&gt;Logistics visibility: A delayed shipment must trigger re routing in the moment. Reporting it after delivery deadlines have passed is operationally useless. &lt;/li&gt;
&lt;li&gt;Cybersecurity: Intrusion attempts must be analyzed in flight to prevent compromise. Batch ETL provides forensic evidence, not active defense. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;In each case, the same data is processed. The difference is timing. Batch delivers hindsight. Streaming delivers foresight. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Demand for Streaming Pipelines
&lt;/h2&gt;

&lt;p&gt;Enterprises are increasingly building streaming pipelines because the nature of their industries leaves no tolerance for latency. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Financial services:  Real-Time AML checks, fraud detection, and instant payment processing are both competitive and regulatory mandates. &lt;/li&gt;
&lt;li&gt;Mobility and automotive: Vehicles generate telemetry that must be analyzed continuously for safety and efficiency. &lt;/li&gt;
&lt;li&gt;Telecom and IoT: Billions of device signals require filtering, aggregation, and anomaly detection at scale. &lt;/li&gt;
&lt;li&gt;Retail and digital platforms: Context aware personalization drives customer engagement. Delayed data undermines the business model. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The demand side is clear: data is only valuable if it can be acted upon within the time window that matters. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Coexistence: Batch and Streaming Together
&lt;/h2&gt;

&lt;p&gt;This is not a zero sum choice. Batch ETL and streaming coexist in most enterprises: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Batch ETL: Best for historical analytics, compliance archiving, financial reporting, and periodic aggregations. &lt;/li&gt;
&lt;li&gt;Real-Time Data Streaming: Best for operational intelligence, anomaly detection, personalization, SLA monitoring, and IoT telemetry. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The shift is not about replacement, but about recognizing that streaming pipelines increasingly occupy the critical front line of enterprise decision making. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Real Time Data Streaming Platforms like Condense Matters Here
&lt;/h2&gt;

&lt;p&gt;This is where &lt;a href="https://www.zeliot.in/condense" rel="noopener noreferrer"&gt;Condense&lt;/a&gt; makes a difference. It is a Kafka Native platform designed to deliver production-ready streaming pipelines inside the enterprise’s own cloud environment (BYOC). With &lt;a href="https://www.zeliot.in/condense" rel="noopener noreferrer"&gt;Condense&lt;/a&gt;, organizations don’t just get Managed Kafka brokers they get a complete runtime that manages ingestion, stream processing, stateful recovery, observability, and domain-specific transforms. &lt;/p&gt;

&lt;p&gt;That means enterprises can move from raw events to actionable insights in minutes, without taking on the operational weight of building pipelines from scratch. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Batch ETL will remain valuable, but the competitive edge lies in  Real-Time. Condense enables enterprises to capture that edge by making  Real-Time Data Streaming both practical and production-ready. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions (FAQs)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;What is the main difference between batch ETL and Real-Time Data Streaming? &lt;br&gt;
Batch ETL processes data in scheduled intervals, while Real-Time Data Streaming processes each event as it happens. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Why are streaming pipelines faster than batch ETL? &lt;br&gt;
Streaming pipelines handle events continuously with low latency, unlike batch jobs that wait for scheduled runs. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When should enterprises use batch ETL instead of streaming? &lt;br&gt;
Batch ETL is best for historical reporting, compliance archives, and workloads where timing is not critical. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Why is timing important in Real-Time Data Streaming? &lt;br&gt;
Timing ensures events drive immediate actions, such as fraud blocking, predictive maintenance, or real-time personalization. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can batch ETL and streaming pipelines coexist? &lt;br&gt;
Yes, most enterprises use streaming pipelines for live operations and batch ETL for long-term analytics. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What industries benefit most from Real-Time Data Streaming? &lt;br&gt;
Finance, mobility, logistics, IoT, and retail depend on Real-Time Data Streaming for mission-critical decisions. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How does Condense improve the adoption of streaming pipelines? &lt;br&gt;
&lt;a href="https://www.zeliot.in/condense" rel="noopener noreferrer"&gt;Condense&lt;/a&gt; is a Kafka Native platform that lets enterprises build production-ready streaming pipelines in minutes inside their own cloud. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>etl</category>
      <category>eventdriven</category>
      <category>kafka</category>
      <category>dataplatform</category>
    </item>
    <item>
      <title>AIDL deep dive post does not exist! Part - I</title>
      <dc:creator>Prasanna</dc:creator>
      <pubDate>Sat, 18 Jul 2020 06:33:30 +0000</pubDate>
      <link>https://dev.to/zeliotofficial/aidl-deep-dive-post-does-not-exist-part-i-4po8</link>
      <guid>https://dev.to/zeliotofficial/aidl-deep-dive-post-does-not-exist-part-i-4po8</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Hello there! I am going to talk about Android's parliamentary conversations. What do I mean by that? I mean, the IPC(Inter Process Communication) that is happening inside Android system. We are going to use AIDL for the so called "conversation". I will explain better and deeper in this article.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;We all know it!&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Why is this a brand new post? Because, it's not about the IPC of components inside one Android application. It's about the communication of two different applications. Most people agree to disagree that it's pretty easy to understand AIDLs. But, there is saying(of mine), &lt;code&gt;"If you understand interfaces in OOP, you shall understand AIDL!"&lt;/code&gt;. Well, Let's see what that saying really means, in detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The AIDL unbolted.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Android Interface Definition Language(AIDL), is what you every time you Google AIDL. This doesn't explain what it really is. Let me explain! AIDL is an Android implementation to achieve Inter Process Communication(IPC) in between Android components. Diving deep, there is a program called &lt;code&gt;aidl&lt;/code&gt;, which compiles the AIDL source code and generates client(Proxy) and server(Stub) Java interfaces.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fprgype5k7uh08zi40kly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fprgype5k7uh08zi40kly.png" alt="Alt Text" width="675" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Initial building blocks.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Let us start with the basics. To create an AIDL, we need to open an Android Project and click &lt;code&gt;File -&amp;gt; New -&amp;gt; AIDL -&amp;gt; AIDL File&lt;/code&gt;. Write your first AIDL file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface IMyAidlInterface {
    String getMessage();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, do not forget to &lt;code&gt;Build -&amp;gt; Rebuild&lt;/code&gt;. The &lt;code&gt;IMyAidlInterface&lt;/code&gt; class will be generated. Create a class which extends the &lt;code&gt;IMyAidlInterface.Stub&lt;/code&gt;. Please remember to override &lt;code&gt;getMessage()&lt;/code&gt; method in this class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class MyImplementor extends IMyAidlInterface.Stub {
    @Override
    public String getMessage() {
        return "Hello from AIDL Stub!";
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once we have extended the Stub class and implemented(overridden) the method, we must create a Service which is going to expose the APIs to the applications which need bind the AIDL functionalities.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class MyService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyImplementor();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, add the &lt;code&gt;&amp;lt;service&amp;gt;&lt;/code&gt; tag in &lt;code&gt;AndroidManifest.xml&lt;/code&gt; inside &lt;code&gt;&amp;lt;application&amp;gt;&lt;/code&gt; tag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;service
    android:name=".MyService"
    android:enabled="true"
    android:exported="true"
    android:process=":remote"&amp;gt;
    &amp;lt;intent-filter&amp;gt;
        &amp;lt;action android:name="MyService" /&amp;gt;
    &amp;lt;/intent-filter&amp;gt;
&amp;lt;/service&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Now that we have implemented the Service part, we should go ahead and create another Android project for the client part. Please note that the AIDLs are very &lt;strong&gt;case-sensitive&lt;/strong&gt;. Unfortunately, Android Studio is not mature enough to detect the syntax errors in an AIDL file. Any changes in an AIDL file would need a rebuild of the project.&lt;br&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;The Real River to cross!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We are done with the server(Service) part. Now, we should create another application which will be our client part. So, create a new project in Android Studio. After creating the project, we have to do one of the most important things.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;In Android Studio, select the Project view in the left top menu. Inside &lt;code&gt;app/src/main/&lt;/code&gt;, create a folder called &lt;code&gt;aidl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcpc4t7zilznasmno0eeh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcpc4t7zilznasmno0eeh.png" alt="Alt Text" width="800" height="321"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;After this, go to the AIDL service application, and copy the contents of &lt;code&gt;aidl&lt;/code&gt; folder.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fht0bxlgcj9a6o834a47y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fht0bxlgcj9a6o834a47y.png" alt="aidl2" width="397" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Switch back to the client application and paste the contents into &lt;code&gt;aidl&lt;/code&gt; folder. &lt;code&gt;Build -&amp;gt; Rebuild&lt;/code&gt;. The project should build without any errors.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;Go to MainActivity.java and create a &lt;code&gt;ServiceConnection&lt;/code&gt; object and &lt;code&gt;IMyAidlInterface&lt;/code&gt; instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private IMyAidlInterface iMyAidlInterface;
private final ServiceConnection mServiceConnection =
    new ServiceConnection() {
        @Override
        public void onServiceConnected(
                    ComponentName name, IBinder service) {

            iMyAidlInterface =
                    IMyAidlInterface.Stub.asInterface(service);

            Log.d(TAG, "Service Connected.");
            Toast.makeText(MainActivity.this, "Service Connected.", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            iMyAidlInterface = null;
            Toast.makeText(MainActivity.this, "Service Disconnected.", Toast.LENGTH_SHORT).show();
        }
    };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;In &lt;code&gt;onCreate()&lt;/code&gt; of &lt;code&gt;MainActivity.java&lt;/code&gt;, bind the service. Note that we need the action and the package name to successfully bind to the service.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent intent = new Intent();
    intent.setPackage("com.zeliot.aidldemo");
    intent.setAction("MyService");
    bindService(intent, mServiceConnection, BIND_AUTO_CREATE);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, create a button and while clicking the button, call &lt;code&gt;iMyAidlInterface.getMessage()&lt;/code&gt; to receive the String from the AIDL service.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;We are done with client and server parts. As of now, the Service is connected from another application. We can do any type of operations using the same. We can have data trasnfer,aynchronous calls, callbacks. More detailed implementation will be released in the second part of this series.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/prasan29/aidl-blog" rel="noopener noreferrer"&gt;AIDL source code&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Thank you, for reading. Happy interfacing!! 😀 🙂
&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprofile-counter.glitch.me%2Fprasan29%2Fcount.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprofile-counter.glitch.me%2Fprasan29%2Fcount.svg" alt="Visits" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>aidl</category>
      <category>java</category>
      <category>kotlin</category>
    </item>
  </channel>
</rss>
