<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ravi Ranjan]]></title><description><![CDATA[Ravi Ranjan]]></description><link>https://blog.ravir.in</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 05:57:01 GMT</lastBuildDate><atom:link href="https://blog.ravir.in/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Beyond Transformers: Exploring Mixture-of-Recursions (MoR), the Next Step in AI]]></title><description><![CDATA[Looking Back: The Transformer Revolution
In 2017, Google DeepMind unveiled the revolutionary Transformer architecture in the now-iconic "Attention is All You Need" paper. Like many in the AI community, I remember my early experiments vividly—I used t...]]></description><link>https://blog.ravir.in/beyond-transformers-exploring-mixture-of-recursions-mor-the-next-step-in-ai</link><guid isPermaLink="true">https://blog.ravir.in/beyond-transformers-exploring-mixture-of-recursions-mor-the-next-step-in-ai</guid><category><![CDATA[AI]]></category><category><![CDATA[llm]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[LLM models]]></category><category><![CDATA[Mixture of Recursions]]></category><dc:creator><![CDATA[Ravi Ranjan]]></dc:creator><pubDate>Fri, 25 Jul 2025 10:21:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1753438735698/eb755ae5-3d27-4add-8208-75eefe293005.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-looking-back-the-transformer-revolution"><strong>Looking Back: The Transformer Revolution</strong></h2>
<p>In 2017, Google DeepMind unveiled the revolutionary Transformer architecture in the now-iconic "Attention is All You Need" paper. Like many in the AI community, I remember my early experiments vividly—I used transfer learning with Transformers to classify images of my friends. The results were astonishing, even on that small, personal dataset.</p>
<p>That breakthrough changed everything. Transformers quickly became the backbone for countless advances in artificial intelligence, powering state-of-the-art language models and making the democratization of AI a reality. Every major large language model released since then—whether for text, images, or multi-modal tasks—has stood on the shoulders of this architecture.</p>
<h2 id="heading-enter-mixture-of-recursions-mor-the-next-frontierhttpsarxivorgpdf250710524"><a target="_blank" href="https://arxiv.org/pdf/2507.10524"><strong>Enter Mixture-of-Recursions (MoR): The Next Frontier</strong></a></h2>
<p>But now, the landscape is shifting again. The introduction of <strong>Mixture-of-Recursions (MoR)</strong> offers a compelling solution to a fundamental challenge in large language models: how to allocate computational resources—<em>dynamically</em> and <em>efficiently</em>—based on the specific demands of each input token. As the paper discusses here are some highlights:</p>
<h2 id="heading-game-changing-efficiency">Game-Changing Efficiency</h2>
<ul>
<li><p><strong>Training time reduction:</strong> up to 19%.</p>
</li>
<li><p><strong>Peak memory usage:</strong> 25% less, compared to standard Transformers.</p>
</li>
<li><p><strong>Model size:</strong> can be halved (a 50% reduction) with comparable quality.</p>
</li>
<li><p><strong>Adaptive per-token inference cost:</strong> making computation smartly distributed.</p>
</li>
</ul>
<p>With MoR, you get similar—or even better—accuracy at much <em>lower</em> cost, using less memory and compute. Imagine deploying powerful AI models on edge devices or in enterprise settings with strict hardware constraints. Suddenly, things like real-time translation or advanced on-device assistants become much more feasible.</p>
<h2 id="heading-how-does-mor-differ-from-transformers">How Does MoR Differ from Transformers?</h2>
<p>At its core, MoR extends transformer-based models by introducing a <strong>recursive processing mechanism per token</strong>:</p>
<ul>
<li><p><strong>Adaptive Computation:</strong> Each token’s embedding passes through a recurrent computation block, where the number of steps is determined “on the fly” for each token.</p>
</li>
<li><p><strong>Flexible Routing:</strong> An attention-like gating mechanism decides, for every token, how much computation it actually needs.</p>
</li>
<li><p><strong>Preserving Training Power:</strong> All routing decisions remain differentiable, so the entire model can be trained end-to-end with gradient-based methods.</p>
</li>
</ul>
<p>In traditional Transformers, every token, regardless of simplicity or complexity, is processed identically through each layer. MoR changes the game: the depth of computation per token adapts based on context and difficulty, so easy tokens pass quickly, while hard tokens get more attention. It’s as if each word in a sentence gets the exact amount of consideration it deserves—no more, no less.</p>
<h2 id="heading-implications-and-applications">Implications and Applications</h2>
<ul>
<li><p><strong>Language Models:</strong> Faster, cheaper inference for straightforward inputs—full horsepower for nuanced, tricky parts.</p>
</li>
<li><p><strong>Resource-Constrained Environments:</strong> MoR is perfect for mobile, IoT, and edge devices where saving every millisecond (and every megabyte of RAM) counts.</p>
</li>
<li><p><strong>Interpretability:</strong> The recursion depth of tokens offers a visible indicator of which parts of text the model finds most challenging or important.</p>
</li>
</ul>
<h2 id="heading-why-this-matters">Why This Matters</h2>
<p>Scaling language models isn't just about adding more GPUs or bigger clusters. It's about <em>efficiency</em>—using computational resources where they're needed most. <strong>Mixture-of-Recursions marks a leap toward truly adaptive, resource-savvy AI systems</strong>, with huge implications for everything from cloud-based translation services to personal, privacy-focused AI assistants running right on your device.</p>
<p>With each wave of innovation, AI becomes more accessible, more powerful, and more energy-efficient. MoR could very well be the architecture that defines the <em>next</em> era of AI—just as Transformers did eight years ago.</p>
<p>Head on to the git page to delve into more deeply: <a target="_blank" href="https://github.com/raymin0223/mixture_of_recursions"><strong>https://github.com/raymin0223/mixture_of_recursions</strong></a></p>
]]></content:encoded></item><item><title><![CDATA[Building a Local Speech-to-Speech Translator in Java]]></title><description><![CDATA[Introduction
Creating a local speech-to-speech translator is now more accessible than ever, thanks to advancements in open-source speech recognition, translation, and text-to-speech technologies. In this blog, I'll walk you through how I built a full...]]></description><link>https://blog.ravir.in/building-a-local-speech-to-speech-translator-in-java</link><guid isPermaLink="true">https://blog.ravir.in/building-a-local-speech-to-speech-translator-in-java</guid><category><![CDATA[AI]]></category><category><![CDATA[ollama]]></category><category><![CDATA[whisper]]></category><category><![CDATA[Local LLM]]></category><category><![CDATA[Java]]></category><category><![CDATA[langchain4j]]></category><category><![CDATA[langchain]]></category><dc:creator><![CDATA[Ravi Ranjan]]></dc:creator><pubDate>Wed, 18 Jun 2025 21:40:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1750282609787/96c11262-f080-489e-a146-991965513dc9.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>Creating a local speech-to-speech translator is now more accessible than ever, thanks to advancements in open-source speech recognition, translation, and text-to-speech technologies. In this blog, I'll walk you through how I built a fully local Speech-to-Speech Translator in Java, leveraging cutting-edge tools like Whisper for speech recognition, a multilingual LLM for translation, and Edge TTS for natural-sounding speech synthesis—all running on your own machine.</p>
<hr />
<p><strong>Project Repository:</strong></p>
<p><a target="_blank" href="https://github.com/ravi2519/local-speech-to-speech-translator">local-speech-to-speech-translator on Github</a></p>
<hr />
<h2 id="heading-1-project-overview"><strong>1. Project Overview</strong></h2>
<p>The goal of this project is to enable real-time speech translation from English to French, entirely on your local system. The pipeline consists of:</p>
<ul>
<li><p><strong>Speech-to-Text:</strong> Convert spoken English to text using Whisper, run locally.</p>
</li>
<li><p><strong>Translation:</strong> Translate the recognized English text to French using a local LLM model (LLaMAX3-8B-Alpaca-GGUF) running Ollama.</p>
</li>
<li><p><strong>Text-to-Speech:</strong> Synthesize French speech from the translated text using Edge TTS, integrated with JavaFX.</p>
</li>
</ul>
<hr />
<h2 id="heading-2-whisper-speech-to-text-local-and-efficient"><strong>2. Whisper Speech-to-Text: Local and Efficient</strong></h2>
<p><a target="_blank" href="https://github.com/openai/whisper">OpenAI's Whisper</a> is a state-of-the-art speech recognition model. To use Whisper locally from Java, I integrated it through Java Native Interface (JNI), which allows Java code to call native libraries written in C/C++ or Python.</p>
<pre><code class="lang-java">WhisperJNI.loadLibrary();
WhisperJNI.setLibraryLogger(<span class="hljs-keyword">null</span>);
<span class="hljs-keyword">var</span> whisper = <span class="hljs-keyword">new</span> WhisperJNI();
whisperContext = whisper.init(Path.of(System.getProperty(<span class="hljs-string">"user.home"</span>), <span class="hljs-string">"ggml-large-v3.bin"</span>));
</code></pre>
<p><strong>How it works:</strong></p>
<ul>
<li><p>The Java application records audio input from the user.</p>
</li>
<li><p>Through JNI, the Java code calls the locally installed Whisper model to transcribe the audio to English text.</p>
</li>
<li><p>This approach ensures all processing stays on your machine, maintaining privacy and reducing latency.</p>
</li>
</ul>
<hr />
<h2 id="heading-3-translation-multilingual-llm-with-ollama"><strong>3. Translation: Multilingual LLM with Ollama</strong></h2>
<p>For translation, I use the <a target="_blank" href="https://ollama.com/mrjacktung/mradermacher-llamax3-8b-alpaca-gguf">mrjacktung/mradermacher-llamax3-8b-alpaca-gguf</a> model running on <a target="_blank" href="https://ollama.com/">Ollama</a>. LLaMAX3-8B is a multilingual language model, fine-tuned for translation tasks and supporting over 100 languages, including English and French.</p>
<pre><code class="lang-bash">&gt; ollama serve mrjacktung/mradermacher-llamax3-8b-alpaca-gguf
</code></pre>
<p><strong>Why LLaMAX3-8B-Alpaca-GGUF?</strong></p>
<ul>
<li><p>It provides robust translation quality, outperforming similarly sized models on benchmarks like Flores-101.</p>
</li>
<li><p>Runs locally via Ollama, so no internet connection or cloud API is required.</p>
</li>
<li><p>Easy integration with Java: The Java app sends the English text to Ollama's API, specifying English as the source and French as the target language. The model returns the French translation.</p>
</li>
</ul>
<p><strong>Sample translation logs:</strong></p>
<pre><code class="lang-java"><span class="hljs-number">2025</span>-<span class="hljs-number">06</span>-<span class="hljs-number">18</span>T22:<span class="hljs-number">40</span>:<span class="hljs-number">26.472</span>+<span class="hljs-number">02</span>:<span class="hljs-number">00</span> DEBUG <span class="hljs-number">42692</span> --- [Semantic Sardine] [nuous-processor] d.l.http.client.log.LoggingHttpClient    : HTTP request:
- method: POST
- url: http:<span class="hljs-comment">//localhost:11434/api/chat</span>
- headers: [Content-Type: application/json]
- body: {
  <span class="hljs-string">"model"</span> : <span class="hljs-string">"mrjacktung/mradermacher-llamax3-8b-alpaca-gguf"</span>,
  <span class="hljs-string">"messages"</span> : [ {
    <span class="hljs-string">"role"</span> : <span class="hljs-string">"system"</span>,
    <span class="hljs-string">"content"</span> : <span class="hljs-string">"You are an English-to-French translation assistant.\n\nStrict rules:\n1. Always translate the input text from English to French only. Never translate to any other language.\n2. If the input is not in English, or is ambiguous, return an empty string.\n3. Output only the French translation as plain text. Do not include any explanations, comments, formatting, quotes, or repetition of the input.\n4. Never apologize, never explain, and never provide meta-comments.\n5. If the input contains both English and non-English, translate only the English parts and ignore the rest.\n6. After translating, always verify that your output is in French. If it is not French, return an empty string.\n7. Under no circumstances should you output any language but French.\n\nExamples:\n    Input: Hello, how are you?\n    Output: Bonjour, comment ça va ?\n\n    Input: What time is it?\n    Output: Quelle heure est-il ?\n\n    Input: This is a test.\n    Output: Ceci est un test.\n\n    Input: Bonjour, comment ça va ? (already in French)\n    Output:\n\n    Input: 你好，你会说英语吗？ (Chinese)\n    Output:\n\n    Input: Hello, bonjour, how are you? (mixed English and French)\n    Output: Bonjour, comment ça va ?\n\n    Input: (empty input)\n    Output:"</span>
  }, {
    <span class="hljs-string">"role"</span> : <span class="hljs-string">"user"</span>,
    <span class="hljs-string">"content"</span> : <span class="hljs-string">"A tiny door appears in my bedroom window."</span>
  } ],
  <span class="hljs-string">"options"</span> : {
    <span class="hljs-string">"temperature"</span> : <span class="hljs-number">0.0</span>
  },
  <span class="hljs-string">"stream"</span> : <span class="hljs-keyword">false</span>
}

<span class="hljs-number">2025</span>-<span class="hljs-number">06</span>-<span class="hljs-number">18</span>T22:<span class="hljs-number">40</span>:<span class="hljs-number">28.272</span>+<span class="hljs-number">02</span>:<span class="hljs-number">00</span> DEBUG <span class="hljs-number">42692</span> --- [Semantic Sardine] [nuous-processor] d.l.http.client.log.LoggingHttpClient    : HTTP response:
- status code: <span class="hljs-number">200</span>
- headers: [Content-Length: <span class="hljs-number">386</span>], [Date: Wed, <span class="hljs-number">18</span> Jun <span class="hljs-number">2025</span> <span class="hljs-number">20</span>:<span class="hljs-number">40</span>:<span class="hljs-number">28</span> GMT], [Content-Type: application/json; charset=utf-<span class="hljs-number">8</span>]
- body: {<span class="hljs-string">"model"</span>:<span class="hljs-string">"mrjacktung/mradermacher-llamax3-8b-alpaca-gguf"</span>,<span class="hljs-string">"created_at"</span>:<span class="hljs-string">"2025-06-18T20:40:28.266696Z"</span>,<span class="hljs-string">"message"</span>:{<span class="hljs-string">"role"</span>:<span class="hljs-string">"assistant"</span>,<span class="hljs-string">"content"</span>:<span class="hljs-string">"Une petite porte apparaît dans ma fenêtre de chambre."</span>},<span class="hljs-string">"done_reason"</span>:<span class="hljs-string">"stop"</span>,<span class="hljs-string">"done"</span>:<span class="hljs-keyword">true</span>,<span class="hljs-string">"total_duration"</span>:<span class="hljs-number">1775358458</span>,<span class="hljs-string">"load_duration"</span>:<span class="hljs-number">35716958</span>,<span class="hljs-string">"prompt_eval_count"</span>:<span class="hljs-number">299</span>,<span class="hljs-string">"prompt_eval_duration"</span>:<span class="hljs-number">1301636250</span>,<span class="hljs-string">"eval_count"</span>:<span class="hljs-number">14</span>,<span class="hljs-string">"eval_duration"</span>:<span class="hljs-number">435475000</span>}
</code></pre>
<p>The Java code handles this interaction seamlessly, making the translation step transparent to the end user.</p>
<hr />
<h2 id="heading-4-text-to-speech-javafx-amp-edge-tts"><strong>4. Text-to-Speech: JavaFX &amp; Edge TTS</strong></h2>
<p>The final step is converting the translated French text into natural-sounding speech. For this, I use <a target="_blank" href="https://www.youtube.com/watch?v=4rWaZRF4NiE">Edge TTS</a><a target="_blank" href="https://github.com/travisvn/openai-edge-tts">5</a>, Microsoft's advanced text-to-speech technology, which supports over 300 voices in 40+ languages.</p>
<p><strong>Integration in Java:</strong></p>
<ul>
<li><p>The JavaFX library provides the GUI and audio playback capabilities.</p>
</li>
<li><p>Edge TTS is accessed via local wrappers, allowing you to select the French voice, adjust speed, and synthesize speech from the translated text.</p>
<pre><code class="lang-java">          &lt;dependency&gt;
              &lt;groupId&gt;io.github.whitemagic2014&lt;/groupId&gt;
              &lt;artifactId&gt;tts-edge-java&lt;/artifactId&gt;
              &lt;version&gt;<span class="hljs-number">1.2</span>.<span class="hljs-number">6</span>&lt;/version&gt;
          &lt;/dependency&gt;
</code></pre>
</li>
<li><p>The resulting audio is played back to the user via the JavaFX application.</p>
</li>
</ul>
<hr />
<h2 id="heading-5-bringing-it-all-together"><strong>5. Bringing It All Together</strong></h2>
<p>The entire workflow runs locally:</p>
<ol>
<li><p><strong>User speaks in English.</strong></p>
</li>
<li><p><strong>Whisper (via JNI) transcribes speech to English text.</strong></p>
</li>
<li><p><strong>Java app sends text to LLaMAX3-8B-Alpaca-GGUF (Ollama) for translation to French.</strong></p>
</li>
<li><p><strong>Translated French text is synthesized to speech using Edge TTS and played to the user.</strong></p>
</li>
</ol>
<p>This architecture ensures:</p>
<ul>
<li><p><strong>Privacy:</strong> No audio or text leaves your machine.</p>
</li>
<li><p><strong>Speed:</strong> No network latency for inference.</p>
</li>
<li><p><strong>Flexibility:</strong> Swap out models or languages as needed.</p>
</li>
</ul>
<hr />
<h2 id="heading-6-why-java"><strong>6. Why Java?</strong></h2>
<p>Java remains a powerful choice for cross-platform applications, offering robust libraries for audio, GUI (JavaFX), and native integration (JNI). This project demonstrates that even advanced AI workflows can be effectively orchestrated in Java, making it a viable option for modern, privacy-focused language tools.</p>
<hr />
<h2 id="heading-7-try-it-yourself"><strong>7. Try It Yourself</strong></h2>
<p>Check out the <a target="_blank" href="https://github.com/ravi2519/local-speech-to-speech-translator/tree/main">GitHub repository</a> for setup instructions, code samples, and details on running the translator locally. Contributions and feedback are welcome!</p>
<hr />
<p><strong>References:</strong></p>
<ul>
<li><p><a target="_blank" href="https://github.com/ravi2519/local-speech-to-speech-translator/tree/main">Project GitHub</a></p>
</li>
<li><p><a target="_blank" href="https://ollama.com/mrjacktung/mradermacher-llamax3-8b-alpaca-gguf">LLaMAX3-8B-Alpaca-GGUF on Ollama</a><a target="_blank" href="https://ollama.com/mannix/llamax3-8b-alpaca">3</a></p>
</li>
<li><p><a target="_blank" href="https://huggingface.co/ggerganov/whisper.cpp/tree/main">GGML Large Whisper model</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/openai/whisper">OpenAI Whisper</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Angular Renaissance (v17)]]></title><description><![CDATA[A leap forward
Yes, an amazing pre-release event and wonderful new updates are on our way. Here is a concise and ready-to-use set of features introduced in the Special Angular Event
Angular.dev
What they call a future home for Angular development is ...]]></description><link>https://blog.ravir.in/angular-renaissance-v17</link><guid isPermaLink="true">https://blog.ravir.in/angular-renaissance-v17</guid><category><![CDATA[Angular]]></category><dc:creator><![CDATA[Ravi Ranjan]]></dc:creator><pubDate>Wed, 08 Nov 2023 16:25:44 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-a-leap-forward">A leap forward</h2>
<p>Yes, an amazing pre-release event and wonderful new updates are on our way. Here is a concise and ready-to-use set of features introduced in the <a target="_blank" href="https://www.youtube.com/live/Wq6GpTZ7AX0?si=OdvlaXlyDvkQ90mV">Special Angular Event</a></p>
<h2 id="heading-angulardev">Angular.dev</h2>
<p>What they call a future home for Angular development is just documentation embedded with coding playgrounds and "run and see" tutorials.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699454019379/da7c8004-d937-45e7-9cf1-bebfb7aceb1b.png" alt class="image--center mx-auto" /></p>
<p><a target="_blank" href="https://angular.dev/">angular.dev</a></p>
<h2 id="heading-bye-bye-ngfor-ngif">Bye-bye ngFor, ngIf</h2>
<p>Yes that's true</p>
<h3 id="heading-earlier">Earlier</h3>
<p><strong>ngFor and ngIf</strong></p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> *<span class="hljs-attr">ngFor</span>=<span class="hljs-string">"let item of items; trackBy: trackByItems"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"color:red"</span> *<span class="hljs-attr">ngIf</span>=<span class="hljs-string">"item.sold"</span>&gt;</span>({{ item.id }}) {{ item.name }}<span class="hljs-tag">&lt;/<span class="hljs-name">red</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"color:green"</span> *<span class="hljs-attr">ngIf</span>=<span class="hljs-string">"item.sold"</span>&gt;</span>({{ item.id }}) {{ item.name }}<span class="hljs-tag">&lt;/<span class="hljs-name">red</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<h3 id="heading-now">Now</h3>
<pre><code class="lang-xml">@for (item of items) {
    @if(item.sold) {
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"color:red"</span>&gt;</span>({{ item.id }}) {{ item.name }}<span class="hljs-tag">&lt;/<span class="hljs-name">red</span>&gt;</span>      
    } @else {
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"color:green"</span>&gt;</span>({{ item.id }}) {{ item.name }}<span class="hljs-tag">&lt;/<span class="hljs-name">red</span>&gt;</span>
    }
} @empty {
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>No items<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
}
</code></pre>
<p>In addition, we have <em>switch</em> with <em>case</em> and <em>default</em></p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
  @switch (user.country) {
    @case ('france') {
      <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Bonjour!<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
    }
    @case ('germany') {
      <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Hallo!<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
    }
    @case ('india') {
      <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Namaste!<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
    }
    @default {
      <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Hello!<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
    }
  }
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<h3 id="heading-deferred-loading">Deferred Loading</h3>
<p>New template syntax that can defer the loading of a component till some condition is met.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
    @defer{
        <span class="hljs-tag">&lt;<span class="hljs-name">really-big-component</span> /&gt;</span>
    }
    @placeholder (minimum 500ms) {
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Data Not Ready<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    }
    @loading (after 100ms; minimum 1s) {
        <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"loading..."</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"loading.gif"</span> /&gt;</span>
    }
    @error {
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Failed to load the data<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    }
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p><code>@defer</code> uses <code>on</code> or/and <code>when</code> triggers.</p>
<pre><code class="lang-xml">@defer (on viewport; on timer(5s)) {
  <span class="hljs-tag">&lt;<span class="hljs-name">calendar-cmp</span> /&gt;</span>
} @placeholder {
  <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"placeholder.png"</span> /&gt;</span>
}

@defer (when cond) {
  <span class="hljs-tag">&lt;<span class="hljs-name">calendar-cmp</span> /&gt;</span>
}
</code></pre>
<h2 id="heading-standalone-components-and-app">Standalone components and app</h2>
<p>With the new update, the <code>ng new</code> and <code>ng g component</code> will create standalone components or app by default.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>A lot of new interesting features and updates are on the way and they will certainly make developer life easy.</p>
<p>Happy Coding!</p>
]]></content:encoded></item><item><title><![CDATA[My attempt for Java 11 Certification]]></title><description><![CDATA[On the 18th, January 2021, I passed my "Oracle Certified Professional: Java SE 11 Developer" certification. And this post is all about what i did to prepare for it.
Old Rules
So I started my journey to get certified in Java 11 to receive Oracle Certi...]]></description><link>https://blog.ravir.in/my-attempt-for-java-11-certification</link><guid isPermaLink="true">https://blog.ravir.in/my-attempt-for-java-11-certification</guid><category><![CDATA[Java]]></category><category><![CDATA[Certification]]></category><category><![CDATA[Oracle]]></category><dc:creator><![CDATA[Ravi Ranjan]]></dc:creator><pubDate>Sat, 30 Jan 2021 18:30:00 GMT</pubDate><content:encoded><![CDATA[<p>On the 18th, January 2021, I passed my "Oracle Certified Professional: Java SE 11 Developer" certification. And this post is all about what i did to prepare for it.</p>
<h1 id="old-rules">Old Rules</h1>
<p>So I started my journey to get certified in Java 11 to receive Oracle Certified Professional Java SE 11 Developer credentials. Before 1st, October 2020, it was fairly a two-step process:</p>
<ul>
<li>Take a 815 exam Post 1st, October 2020, it is displaying a 404.</li>
<li>And a 816 exam Post 1st, October 2020, it is displaying a 404.</li>
</ul>
<p>Both were for 11,300 INR each and covers a different set of the syllabus.</p>
<p>You have to purchase the exam voucher from Oracle for each one of these. The voucher will be valid for the next 6 months. And during this period, you can schedule the exam anytime.</p>
<p>I did that too, but then...</p>
<h1 id="oracle-did-it-again">Oracle did it again!!</h1>
<p>And as if 2020 was less weird, Oracle discontinued Java certification test 815 and 816. And in place of it,  <a target="_blank" href="https://education.oracle.com/java-se-11-developer/pexam_1Z0-819">Java Test 819</a>  was introduced.</p>
<h2 id="few-features-of-this-new-exam">Few features of this new exam</h2>
<ul>
<li>It is a 90 min exam as compared to 180 min ( for 815 and 816 each ).</li>
<li>The total number of questions is reduced to 50, and you need to mark 34 questions correctly to pass.</li>
<li>It costs approximately 18,538 INR plus taxes.</li>
<li>Covers almost all the topics from exam 815 and 816, with few exceptions. Check out the 819 links for a detailed syllabus.</li>
<li>You will receive <strong>"Oracle Certified Professional: Java SE 11 Developer"</strong> as Oracle recognition.</li>
</ul>
<h2 id="important-topics">Important Topics</h2>
<p>Below is the list for some of important topics and resources that is used to prepare them. Apart from these Youtube helped me a lot in understanding quickly and visualizing a lot of stuff.</p>
<h3 id="stream-lambdas-and-functional-interfaces">Stream, Lambdas and Functional Interfaces</h3>
<ul>
<li><a target="_blank" href="https://www.linkedin.com/learning/functional-programming-with-streams-in-java-9">Streams, Lambdas, Functional Interfaces</a> </li>
<li><a target="_blank" href="https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html">Stream API Java 8</a> </li>
<li><a target="_blank" href="https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps">Stream Operations</a> </li>
<li><a target="_blank" href="https://www.baeldung.com/java-8-streams">Stream Tutorial</a> </li>
<li><a target="_blank" href="https://www.oracle.com/technical-resources/articles/java/ma14-java-se-8-streams.html">Processing Data with Java SE 8 Streams</a> </li>
<li><a target="_blank" href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html">Method detail of Object class</a></li>
</ul>
<h3 id="secure-coding-in-java-se-application">Secure Coding in Java SE Application</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630406533601/mZeEEI2Ml.png" alt="exploits_of_a_mom.png" /></p>
<ul>
<li><a target="_blank" href="https://www.oracle.com/java/technologies/javase/seccodeguide.html#9">Oracle Secure Coding Guide</a> </li>
</ul>
<h3 id="mock-tests">Mock Tests</h3>
<ul>
<li><a target="_blank" href="https://enthuware.com/java-certification-mock-exams/oracle-certified-professional/ocp-java-11-exam-1z0-819">Enthuware 819 Mock Test</a> </li>
<li><a target="_blank" href="https://www.udemy.com/course/java-11_1z0-815/">Java Certification (1Z0-815) Topic-wise Tests [2020]</a>  </li>
<li><a target="_blank" href="https://www.udemy.com/course/java-se-11_1z0-815/">Java Certification (1Z0-815) Exam Simulation [2020]</a> </li>
<li><a target="_blank" href="https://www.udemy.com/course/java-se-programmer-ii-1z0-816-practice-test/"> Java SE Programmer II (1Z0-816) - Practice Test</a> </li>
<li><a target="_blank" href="https://certify.cybervista.net/products/oracle/java-se-11-programmer-i-ocp-free-trial/">Java SE 11 free test trial</a> </li>
</ul>
<h3 id="helpful-resources-from-oracle">Helpful resources from Oracle</h3>
<ul>
<li><a target="_blank" href="https://www.oracle.com/a/ocom/img/dc/ww-java11-programmer-study-guide.pdf?intcmp=WWOUCERTBLOGECBYK051720">815 and 816 Study Guide and Sample Questions</a> </li>
<li><a target="_blank" href="https://ondro.inginea.eu/index.php/new-features-between-java-8-and-java-14/">List of Java Features Added from Java 8 to Java 14</a></li>
<li><a target="_blank" href="https://blogs.oracle.com/javamagazine/quiz-2">Java Quizzes</a></li>
<li><a target="_blank" href="https://learn.oracle.com/ols/module/overview/40805/79727">More than 6 hours of free training by Oracle Universtity</a></li>
</ul>
<h1 id="github-resources-from-my-fellow-wanderers">Github Resources from my fellow wanderers</h1>
<ul>
<li><a target="_blank" href="https://github.com/springapidev/java-certification">Contains examples and 8008 dumps</a></li>
<li><a target="_blank" href="https://github.com/mariazevedo88/java-certification-oca">Java Certification 815</a></li>
<li><a target="_blank" href="https://github.com/MohamedDhiaJemai/Books-to-Prepare-Oracle-Java-Certification-Exams">808, 809 and older PDF files</a></li>
<li><a target="_blank" href="https://github.com/egenerat/java-8-certification">OCA and OCP/808 and 809</a></li>
<li><a target="_blank" href="https://github.com/boyarsky/sybex-1Z0-815-chapter-11">All about modules - some handy modules command-lines</a></li>
</ul>
<h1 id="ocp-819-stories">OCP 819 Stories</h1>
<ul>
<li><a target="_blank" href="https://enthuware.com/oca-ocp-java-certification-resources/255-java-certification-819-experience">Enthuware</a></li>
<li><a target="_blank" href="https://www.selikoff.net/2020/09/26/jeannes-experience-taking-the-1z0-819-in-the-time-of-covid-19/">Jeanne Boysky</a></li>
<li><a target="_blank" href="https://www.selikoff.net/2020/10/06/taking-the-1z0-819-exam-study-everything-and-watch-the-clock-part-2-of-2/">Scot Selikoff</a></li>
</ul>
<h1 id="coderanch">Coderanch</h1>
<ul>
<li><a target="_blank" href="https://coderanch.com/f/24/java-programmer-OCPJP">OCJCP Page</a></li>
<li><a target="_blank" href="https://coderanch.com/wiki/659976/OCPJP-Wall-Fame">OCJCP Wall Of Fame</a></li>
<li><a target="_blank" href="https://coderanch.com/wiki/707568/certification/OCP-FAQ">OCP 11 FAQ</a></li>
</ul>
<h1 id="most-recommended">Most recommended!</h1>
<ul>
<li>Selikof/Boyarsky book ( Oracle Certified Professional: Java SE 11 Developer : Complete Study Guide)</li>
<li><a target="_blank" href="https://enthuware.com/java-certification-mock-exams/oracle-certified-professional/ocp-java-11-exam-1z0-819">Enthuware 819 Mock Test</a></li>
</ul>
<h1 id="java-code-in-my-respositoryhttpsgithubcomravi2519javacertification">Java Code in my <a target="_blank" href="https://github.com/ravi2519/JavaCertification">respository</a></h1>
<ul>
<li><a target="_blank" href="https://github.com/ravi2519/JavaCertification/tree/master/basics">Basic</a> : Inheritance, Arrays, Final, Initialization, Overloading, Overriding, Primitives, etc.</li>
<li><a target="_blank" href="https://github.com/ravi2519/JavaCertification/tree/master/advanced">Advanced</a> : Annotations, Collections, Concurrency, Enums, Exceptions, Functional Interfaces, Generics, Inner Classes, NIO2, etc</li>
<li><a target="_blank" href="https://github.com/ravi2519/JavaCertification/tree/master/streams">Streams</a></li>
</ul>
]]></content:encoded></item></channel></rss>