<?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" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[YavarTechWorks - Medium]]></title>
        <description><![CDATA[Today a Reader, Tomorrow a Leader - Medium]]></description>
        <link>https://medium.com/yavar?source=rss----1b2e541f8ed2---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>YavarTechWorks - Medium</title>
            <link>https://medium.com/yavar?source=rss----1b2e541f8ed2---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 12 Nov 2026 20:24:03 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/yavar" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[How to build a talking avatar in a Next.js application #1.]]></title>
            <link>https://medium.com/yavar/how-to-build-a-talking-avatar-in-a-next-js-application-1-808c62de8793?source=rss----1b2e541f8ed2---4</link>
            <guid isPermaLink="false">https://medium.com/p/808c62de8793</guid>
            <category><![CDATA[reactjs]]></category>
            <category><![CDATA[3d]]></category>
            <category><![CDATA[avatar]]></category>
            <category><![CDATA[threejs]]></category>
            <category><![CDATA[nextjs]]></category>
            <dc:creator><![CDATA[Gibson Joseph]]></dc:creator>
            <pubDate>Wed, 14 May 2025 07:55:52 GMT</pubDate>
            <atom:updated>2025-05-14T07:55:52.888Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi developers 👋,<br>I am gibson. In this article, we will learn how to build a <strong>talking avatar in a Next.js application</strong>. Let’s kick off this article.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FhHybevemuG_40rtkNVFWg.jpeg" /><figcaption>Talking avatar #1</figcaption></figure><h4>Tables of contents:</h4><ol><li>Create a Next.js project.</li><li>Setting up the project dependencies. ( packages )</li><li>How to create an avatar using the readyplayer?</li><li>How do we use the created avatar in Next.js?</li><li>How to add a background image to enhance the scene?</li></ol><h4>Create a Next.js project:</h4><p>To create a Next.js project, use the create-next-app CLI tool. Open a terminal, navigate to the directory where you want to create the project, and run npx create-next-app@latest.</p><p>Follow the prompts to name the project, choose whether to use TypeScript, ESLint, Tailwind CSS, and the App Router.</p><pre>$ npx create-next-app@latest demo-avatar<br>$ cd demo-avatar</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OILgipiYy_WWrADod2V7ww.png" /><figcaption>Project setup</figcaption></figure><h4>Setting up the project dependencies. ( packages ):</h4><p>Here is how to set up the project dependencies for a talking avatar in Next.js.</p><p>Several libraries might be needed, depending on the approach for the talking avatar.</p><pre>$ npm install @react-three/fiber @react-three/drei</pre><h4><strong>⚛️ </strong><strong>@react-three/fiber:</strong></h4><p>This package <strong>connects Three.js with React</strong>.</p><ul><li>Instead of writing complex three.js code manually,</li><li>You can write 3D scenes like normal React components using JSX.</li></ul><pre>import { Canvas } from &#39;@react-three/fiber&#39;;<br><br>export default function Home() {<br>  return (<br>    &lt;Canvas&gt;<br>      {/* 3D content goes here */}<br>      &lt;mesh&gt;<br>        &lt;boxGeometry args={[1, 1, 1]} /&gt;<br>        &lt;meshBasicMaterial color=&#39;orange&#39; /&gt;<br>      &lt;/mesh&gt;<br>    &lt;/Canvas&gt;<br>  );<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZdI6yESQq4ClFYNcCT3weQ.png" /><figcaption>Output</figcaption></figure><p>&lt;Canvas /&gt; is the root element that creates the 3D scene.</p><h4>🧰 <strong>@react-three/drei:</strong></h4><p>This gives you so many <strong>ready-made components</strong> to save time.</p><ul><li>Things like camera controls, environment lighting, sky backgrounds, loading spinners, and even 3D text are included.</li></ul><pre>export default function Home() {<br>  return (<br>    &lt;Canvas&gt;<br>      {/* Enable camera orbit controls */}<br>      &lt;OrbitControls enableRotate={false} enableZoom={false} /&gt;<br>      &lt;Environment preset=&#39;sunset&#39; /&gt;<br>      &lt;ambientLight /&gt;<br>      &lt;Text fontSize={1} color=&#39;hotpink&#39; position={[0, 0, 0]}&gt;<br>        Hello 3D!<br>      &lt;/Text&gt;<br>    &lt;/Canvas&gt;<br>  );<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bAj-wgRDSpYt8BwkZBi8Kw.png" /><figcaption>Output</figcaption></figure><h4>How to create an avatar using the readyplayer?</h4><p>Creating a 3D avatar has never been easier, thanks to <strong>Ready Player Me</strong> — a free online platform that lets you build fully customizable avatars.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yyZvAvj1SY1mXIvHtTEr7A.png" /><figcaption>Ready Player Me</figcaption></figure><p>To create an avatar using Ready player me, you should first visit their website and create and account. Then you can use their Avatar Creator to customize your avatar, including choosing your gender, outfit and so on.</p><p><a href="https://studio.readyplayer.me/">Ready Player Me Studio</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mrVU6Otob9zhUp0p4J2ERA.png" /><figcaption>Creating an avatar</figcaption></figure><p>Once you have created your desired avatar, you will receive a unique avatar URL.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_Y0YERhMBqAbOxRd-MOQIg.png" /><figcaption>Unique URL for the avatar</figcaption></figure><p>To download the avatar as <strong>glb file</strong>, simply copy the avatar URL, paste it into your browser, and hit the Enter key, and it will start downloading automatically.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*r3t9OoTcGx15gyWL4ITs4g.png" /><figcaption>Download the avatar</figcaption></figure><h4>How do we use the created avatar in Next.js?</h4><p>Now, in our project in public, create a new folder called models and drag and drop your avatar GLB file here.</p><pre>public/<br>├── file.svg<br>├── globe.svg<br>├── models<br>│   └── avatar.glb<br>├── next.svg<br>├── vercel.svg<br>└── window.svg<br><br>1 directory, 6 files</pre><p>And create the components directory inside the app directory.</p><pre>app/<br>├── components<br>├── favicon.ico<br>├── globals.css<br>├── layout.tsx<br>└── page.tsx<br><br>1 directory, 4 files</pre><p>To use this avatar in our project, we are going to use the <strong>gltfjsx</strong> <strong>tool.</strong></p><p><strong>What is </strong><strong>gltfjsx?<br></strong>gltfjsx is a tool that <strong>converts 3D model files</strong> (like .glb) into a <strong>React component</strong>.<br> This makes it easier to use 3D models directly in a React app.</p><pre>$ npx gltfjsx public/models/avatar.glb -o app/components/Avatar.jsx -r public</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mjuomeVMwxcVLXVd5RKRhA.png" /><figcaption>Create the react component using the <strong>gltfjsx tool</strong></figcaption></figure><ul><li>npx gltfjsxRuns the tool (version 6.5.3).</li><li>public/models/new_avatar.glbThis is the 3D model you want to convert.</li><li>-o src/components/renderings/TalkingAvatar/NewAvatar.jsxThis is where the React component will be saved.</li></ul><pre>app/components/<br>└── Avatar.jsx<br><br>0 directories, 1 file</pre><p>Now you can see the Avatar.jsx component file inside the components directory.</p><p><strong>Avatar.jsx</strong></p><pre>/*<br>Auto-generated by: https://github.com/pmndrs/gltfjsx<br>Command: npx gltfjsx@6.5.3 public/models/avatar.glb -o app/components/Avatar.jsx -r public <br>*/<br><br>import React from &#39;react&#39;<br>import { useGraph } from &#39;@react-three/fiber&#39;<br>import { useGLTF } from &#39;@react-three/drei&#39;<br>import { SkeletonUtils } from &#39;three-stdlib&#39;<br><br>export function Model(props) {<br>  const { scene } = useGLTF(&#39;/models/avatar.glb&#39;)<br>  const clone = React.useMemo(() =&gt; SkeletonUtils.clone(scene), [scene])<br>  const { nodes, materials } = useGraph(clone)<br>  return (<br>    &lt;group {...props} dispose={null}&gt;<br>      &lt;primitive object={nodes.Hips} /&gt;<br>      &lt;skinnedMesh geometry={nodes.Wolf3D_Hair.geometry} material={materials.Wolf3D_Hair} skeleton={nodes.Wolf3D_Hair.skeleton} /&gt;<br>      &lt;skinnedMesh geometry={nodes.Wolf3D_Body.geometry} material={materials.Wolf3D_Body} skeleton={nodes.Wolf3D_Body.skeleton} /&gt;<br>      &lt;skinnedMesh geometry={nodes.Wolf3D_Outfit_Bottom.geometry} material={materials.Wolf3D_Outfit_Bottom} skeleton={nodes.Wolf3D_Outfit_Bottom.skeleton} /&gt;<br>      &lt;skinnedMesh geometry={nodes.Wolf3D_Outfit_Footwear.geometry} material={materials.Wolf3D_Outfit_Footwear} skeleton={nodes.Wolf3D_Outfit_Footwear.skeleton} /&gt;<br>      &lt;skinnedMesh geometry={nodes.Wolf3D_Outfit_Top.geometry} material={materials.Wolf3D_Outfit_Top} skeleton={nodes.Wolf3D_Outfit_Top.skeleton} /&gt;<br>      &lt;skinnedMesh name=&quot;EyeLeft&quot; geometry={nodes.EyeLeft.geometry} material={materials.Wolf3D_Eye} skeleton={nodes.EyeLeft.skeleton} morphTargetDictionary={nodes.EyeLeft.morphTargetDictionary} morphTargetInfluences={nodes.EyeLeft.morphTargetInfluences} /&gt;<br>      &lt;skinnedMesh name=&quot;EyeRight&quot; geometry={nodes.EyeRight.geometry} material={materials.Wolf3D_Eye} skeleton={nodes.EyeRight.skeleton} morphTargetDictionary={nodes.EyeRight.morphTargetDictionary} morphTargetInfluences={nodes.EyeRight.morphTargetInfluences} /&gt;<br>      &lt;skinnedMesh name=&quot;Wolf3D_Head&quot; geometry={nodes.Wolf3D_Head.geometry} material={materials.Wolf3D_Skin} skeleton={nodes.Wolf3D_Head.skeleton} morphTargetDictionary={nodes.Wolf3D_Head.morphTargetDictionary} morphTargetInfluences={nodes.Wolf3D_Head.morphTargetInfluences} /&gt;<br>      &lt;skinnedMesh name=&quot;Wolf3D_Teeth&quot; geometry={nodes.Wolf3D_Teeth.geometry} material={materials.Wolf3D_Teeth} skeleton={nodes.Wolf3D_Teeth.skeleton} morphTargetDictionary={nodes.Wolf3D_Teeth.morphTargetDictionary} morphTargetInfluences={nodes.Wolf3D_Teeth.morphTargetInfluences} /&gt;<br>    &lt;/group&gt;<br>  )<br>}<br><br>useGLTF.preload(&#39;/models/avatar.glb&#39;)</pre><p>I want to rename the component name from <strong>Model to Avatar.</strong></p><p>And I have created one more component Experience.tsx inside the components directory. Inside this component, we will load our Avatar.</p><pre>app/components/<br>├── Avatar.jsx<br>└── Experience.tsx<br><br>0 directories, 2 files</pre><p><strong>Experience.tsx</strong></p><pre>import React from &#39;react&#39;;<br>import { Environment, OrbitControls } from &#39;@react-three/drei&#39;;<br><br>import { Avatar } from &#39;./Avatar&#39;;<br><br>const Experience = () =&gt; {<br>  return (<br>    &lt;&gt;<br>      &lt;OrbitControls /&gt;<br>      &lt;Environment preset=&#39;sunset&#39; /&gt;<br>      &lt;Avatar position={[0, -3, 5]} scale={2} /&gt;<br>    &lt;/&gt;<br>  );<br>};<br><br>export default Experience;</pre><p>The <strong>OrbitControls</strong> allow panning, rotating, and zooming. You can enable/disable each of these. The below JSX disables panning, rotation, and zooming. All three properties are true by default.</p><p>We have used the <strong>Environment</strong> helper, which produces a great effect.</p><pre>&lt;OrbitControls enablePan={false} enableZoom={false} enableRotate={false} /&gt;</pre><p>Here in the Avatar component, we send some props like position and scale to bring our avatar close.</p><p>And then we can load Avatar through the Experience component into the Home component(<strong>page.tsx</strong>)</p><p><strong>page.tsx</strong></p><pre>&#39;use client&#39;;<br>import { Canvas } from &#39;@react-three/fiber&#39;;<br>import Experience from &#39;./components/Experience&#39;;<br><br>export default function Home() {<br>  return (<br>    &lt;Canvas shadows camera={{ position: [0, 0, 8], fov: 42 }}&gt;<br>      &lt;color attach=&#39;background&#39; args={[&#39;#ececec&#39;]} /&gt;<br>      &lt;Experience /&gt;<br>    &lt;/Canvas&gt;<br>  );<br>}</pre><p>Now you can see the 3D avatar in our application.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kK7eZ1FqILiYdcciSaxahQ.png" /><figcaption>Output</figcaption></figure><h4>How to add a background image to enhance the scene?</h4><p>Now we can add the background image to our avatar. I have generated the image using the AI tool. So we are going to use the following image for our avatar scene.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*j4f_mXT5F7sfNIULVwcHqg.png" /><figcaption>Background Image.</figcaption></figure><p>Create a new directory called assets inside the public directory to put the background image.</p><pre>public/assets/<br>└── hospital-background.png<br><br>0 directories, 1 file</pre><p><strong>Experience.tsx</strong></p><pre>import React from &#39;react&#39;;<br>import { Environment, OrbitControls, useTexture } from &#39;@react-three/drei&#39;;<br><br>import { Avatar } from &#39;./Avatar&#39;;<br>import { useThree } from &#39;@react-three/fiber&#39;;<br><br>const Experience = () =&gt; {<br>  const texture = useTexture(&#39;assets/hospital-background.png&#39;);<br>  const viewport = useThree((state) =&gt; state.viewport);<br><br>  return (<br>    &lt;&gt;<br>      &lt;OrbitControls<br>        enablePan={false}<br>        enableZoom={false}<br>        enableRotate={false}<br>      /&gt;<br>      &lt;Environment preset=&#39;sunset&#39; /&gt;<br>      &lt;Avatar position={[0, -3, 5]} scale={2} /&gt;<br>      &lt;mesh&gt;<br>        &lt;planeGeometry args={[viewport.width, viewport.height]} /&gt;<br>        &lt;meshBasicMaterial map={texture} /&gt;<br>      &lt;/mesh&gt;<br>    &lt;/&gt;<br>  );<br>};<br><br>export default Experience;</pre><p>The useTexture hook accepts a URL or an array of URLs as its argument. It returns an Texture object or an array of Texture objects. These textures can then be applied to materials in your 3D scene.</p><p>The useThree hook provides access to low-level Three.js objects like the viewport, camera, and scene. The hook will reactivate if you resize the browser.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*G-IdjlRP6x_KfETVrapNFw.png" /><figcaption>Avatar with background image</figcaption></figure><p>You can get the <strong>entire code</strong> that we have done so far using the following git repository.</p><p><a href="https://github.com/Gibson-Joseph/demo-avatar">GitHub - Gibson-Joseph/demo-avatar</a></p><p>I hope you liked this article. In my upcoming article, we will learn <strong>how to add animation and lip sync</strong> <strong>to our avatar character</strong>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=808c62de8793" width="1" height="1" alt=""><hr><p><a href="https://medium.com/yavar/how-to-build-a-talking-avatar-in-a-next-js-application-1-808c62de8793">How to build a talking avatar in a Next.js application #1.</a> was originally published in <a href="https://medium.com/yavar">YavarTechWorks</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Book a Google calendar by using Gemini LLM]]></title>
            <link>https://medium.com/yavar/book-a-google-calendar-by-using-gemini-llm-e841f2f7607f?source=rss----1b2e541f8ed2---4</link>
            <guid isPermaLink="false">https://medium.com/p/e841f2f7607f</guid>
            <category><![CDATA[google-api]]></category>
            <category><![CDATA[googlecalendarbookingai]]></category>
            <category><![CDATA[calendarbookingbygemini]]></category>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[geiminicalendar]]></category>
            <dc:creator><![CDATA[Edison Devadoss]]></dc:creator>
            <pubDate>Wed, 14 May 2025 07:54:06 GMT</pubDate>
            <atom:updated>2025-05-14T07:54:06.850Z</atom:updated>
            <content:encoded><![CDATA[<p>Hi friends, in this post, I will explain how to build a node application which connects with Gemini LLM and, using a prompt, we book a Google Calendar event.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3nRo6Iw9E9_1dQalASKzuw.png" /><figcaption><a href="https://www.photopea.com/">https://www.photopea.com</a></figcaption></figure><h4>Set up an account in Google APIS.</h4><p>Click <a href="https://console.cloud.google.com/apis">the link</a> and set up a Google account, then access the API services.</p><p>Then search in the service bar “calendar” and enable the calendar API. Consider the image below as a reference.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*M19TB4so-_IlVYwReXvsgg.png" /><figcaption>Enable Google Calendar</figcaption></figure><p>After the calendar is enabled, configure the authorised redirect URI for authorisation.</p><p>Once authorised with our Google account, it will redirect to the configured URL and give an access code. We need this access code for Google Calendar booking.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ap9t4DlHBrb-bic8ywZl_Q.png" /><figcaption>authorization URIs configuration</figcaption></figure><h4>Define the Auth callback</h4><pre>import Fastify from &#39;fastify&#39;;<br><br>const fastify = Fastify({<br>  logger: true<br>});<br><br>// Declare a route<br>fastify.get(&#39;/auth&#39;, async function handler(request, reply) {<br>  console.log(&#39;request&#39;, request);<br>  return { hello: request.query };<br>});<br><br>try {<br>  await fastify.listen({ port: 3000 });<br>} catch (err) {<br>  fastify.log.error(err);<br>  process.exit(1);<br>}</pre><p>The above code is just a Fastify application setup and configured with one route with the GET method. In request.query We can find the access code.</p><pre>$ node server.js</pre><p>Now we can run the application using the above command.</p><h4><strong>Generate Gemini API</strong></h4><p>Once the Google API is configured now we can generate the Gemini API key and configuration.</p><p>Click this <a href="https://aistudio.google.com/apikey">link</a> to generate an API key. After generating of API key, configure it in the .env file.</p><pre>GEMINI_API_KEY=</pre><p>Not only the Gemini API key, but we can also configure the following in .env</p><pre>GOOGLE_CLIENT_ID=&#39;&#39;<br>GOOGLE_CLIENT_SECRET=&#39;&#39;<br>REDIRECT_URI=&#39;&#39;</pre><p>Install the required library in our application.</p><pre>$ npm install @google/genai dotenv fastify googleapis --save</pre><p>Run the above command to install all required libraries.</p><p>Create aindex.js file where we can write our code for calendar booking.</p><pre>import { configDotenv } from &#39;dotenv&#39;;<br>configDotenv();<br><br>import { GoogleGenAI, FunctionCallingConfigMode } from &#39;@google/genai&#39;;<br>import { google } from &#39;googleapis&#39;;<br>import * as readline from &#39;readline&#39;;<br><br>const { GEMINI_API_KEY, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, REDIRECT_URI } =<br>  process.env;<br><br>const rl = readline.createInterface({<br>  input: process.stdin,<br>  output: process.stdout<br>});<br><br>const genAI = new GoogleGenAI({ apiKey: GEMINI_API_KEY });<br>const geminiModel = genAI.models;<br><br>const oauth2Client = new google.auth.OAuth2(<br>  GOOGLE_CLIENT_ID,<br>  GOOGLE_CLIENT_SECRET,<br>  REDIRECT_URI<br>);</pre><p>In the above, we import the library needed for the application and initialise the GoogleGenAI model and the oauthClient library.</p><p>We have used it readline for interaction with the node application via the terminal.</p><pre><br>async function authenticate() {<br>  const authUrl = oauth2Client.generateAuthUrl({<br>    access_type: &#39;offline&#39;,<br>    scope: &#39;https://www.googleapis.com/auth/calendar.events&#39;<br>  });<br>  console.log(&#39;Authorize this app by visiting this url:&#39;, authUrl);<br>  rl.question(&#39;Enter the code from that page here: &#39;, async (code) =&gt; {<br>    try {<br>      const tokenResponse = await oauth2Client.getToken(code);<br>      tokens = tokenResponse.tokens;<br>      oauth2Client.setCredentials(tokens);<br>      calendar = google.calendar({ version: &#39;v3&#39;, auth: oauth2Client });<br>      console.log(&#39;Authentication successful!&#39;);<br>      queryGemini();<br>    } catch (err) {<br>      console.error(&#39;Error retrieving access token&#39;, err);<br>      rl.close();<br>    }<br>  });<br>}</pre><p>The above function is for authentication with the Google API for calendar access.</p><p>rl.question It asks for our input via the terminal. Once we are authorised using authUrl, we can enter the code in our terminal or paste it.</p><p>This function generates a token for our further access. Then it will call queryGemini() function.</p><pre>const chatHistory = [];<br><br>let isBooked = false;<br><br><br>async function queryGemini() {<br>  rl.question(&#39;Ask Gemini (or say &quot;book calendar&quot;): &#39;, async (query) =&gt; {<br>    try {<br>      chatHistory.push({<br>        role: &#39;user&#39;,<br>        parts: [{ text: query }]<br>      });<br><br>      const result = await geminiModel.generateContent({<br>        model: &#39;gemini-2.0-flash-001&#39;,<br>        contents: chatHistory,<br>        config: {<br>          systemInstruction: `<br>You are a smart assistant that helps users with any kind of query.<br><br>If the user explicitly says they want to book a calendar, schedule a meeting, or talk to an agent, interpret it as a request to create a calendar event and use the \`create_calendar_event\` function (if enough information is available). Ask only the necessary missing details.<br><br>Once the calendar event is successfully created, return to normal assistant behavior. Do not continue suggesting or prompting about calendar bookings unless the user explicitly brings it up again.<br><br>For all other types of queries, respond normally as a helpful assistant.<br>`,<br>          toolConfig: {<br>            functionCallingConfig: {<br>              mode: FunctionCallingConfigMode.AUTO<br>            }<br>          },<br>          tools: tools<br>        }<br>      });<br><br>      const response = result;<br><br>      console.log(&#39;Gemini:&#39;, response.text);<br><br>      if (!isBooked &amp;&amp; response.functionCalls?.length &gt; 0) {<br>        const func = response.functionCalls[0];<br>        console.log(&#39;Function call received:&#39;);<br>        console.log(&#39;Function name:&#39;, func.name);<br>        console.log(&#39;Arguments:&#39;, func.args);<br>        const args = func.args;<br><br>        if (func.name === &#39;create_calendar_event&#39;) {<br>          await bookAEvent(<br>            args.title,<br>            args.date,<br>            args.time,<br>            args.email,<br>            args.timezone<br>          );<br>          isBooked = true;<br>        }<br>      } else if (response.text) {<br>        chatHistory.push({<br>          role: &#39;model&#39;,<br>          parts: [{ text: result.text }]<br>        });<br>      }<br>    } catch (error) {<br>      console.error(&#39;Error querying Gemini:&#39;, error);<br>    }<br>    queryGemini(); // Continue the REPL<br>  });<br>}</pre><p>In the above code, using geminiModel.generateContent() We can interact with our Gemini LLM.</p><p>There are a few more things we configured with the generateContent method.</p><ol><li>model — AI model name with version</li><li>contents — we are passing chat history — both user input and model response. We store those values chatHistory array.</li><li>config — In the config, we set up system instruction, toolConfig, and tools.</li><li>systemInstruction — It is a prompt message on how our system should act.</li></ol><p>If you look at the system instructions, we mentioned the call create_calander_event function if the user requests a book an event or talk to an agent.</p><pre>     toolConfig: {<br>            functionCallingConfig: {<br>              mode: FunctionCallingConfigMode.AUTO<br>            }</pre><p>The above configuration defines the mode of function call, it can be <strong>AUTO</strong> or <strong>ANY</strong>.</p><p>If we set ANY it will call the time user chats, it AUTO means once matched with the system instruction.</p><h4>Define the create calendar event function</h4><pre>onst tools = [<br>  {<br>    functionDeclarations: [<br>      {<br>        name: &#39;create_calendar_event&#39;,<br>        description: &#39;Create a calendar event based on user input.&#39;,<br>        parameters: {<br>          type: &#39;object&#39;,<br>          properties: {<br>            title: {<br>              type: &#39;string&#39;,<br>              description: &#39;The title of the event&#39;<br>            },<br>            email: {<br>              type: &#39;string&#39;,<br>              description: &quot;User&#39;s email of the event (e.g., edison@yavar.ai)&quot;<br>            },<br>            date: {<br>              type: &#39;string&#39;,<br>              description: &#39;The date of the event (e.g., 2025-05-10)&#39;<br>            },<br>            time: {<br>              type: &#39;string&#39;,<br>              description: &#39;The time of the event (e.g., 3:00 PM)&#39;<br>            },<br>            timezone: {<br>              type: &#39;string&#39;,<br>              description:<br>                &#39;The timezone of the event (e.g., Asia/Kolkata, America/New_York)&#39;<br>            }<br>          },<br>          required: [&#39;title&#39;, &#39;email&#39;, &#39;date&#39;, &#39;time&#39;, &#39;timezone&#39;]<br>        }<br>      }<br>    ]<br>  }<br>];</pre><p>Using the above code, we defined functionDeclarations and set up a function named create_calendar_event and defined what the inputs are that we need to collect from the user for calendar booking.</p><p>Once the user enters the required fields for calendar booking, we can find values in response.functionCalls.</p><pre> if (response.functionCalls?.length &gt; 0) {<br>      const func = response.functionCalls[0];<br>   console.log(&#39;func is&#39;, func);<br>   console.log(&#39;Function name:&#39;, func.name);<br>   console.log(&#39;Arguments:&#39;, func.args);<br>    const args = func.args;<br><br>  <br>   if (func.name === &#39;create_calendar_event&#39;) {<br>          await bookAEvent(<br>            args.title,<br>            args.date,<br>            args.time,<br>            args.email,<br>            args.timezone<br>          );<br>          isBooked = true;<br>        }<br>      } <br>}</pre><p>Now you can find values in the logs and call bookAEvent function.</p><pre>async function bookAEvent(title, date, time, mail, timezone) {<br>  const startDateTime = new Date(`${date} ${time}`);<br>  const endDateTime = new Date(startDateTime.getTime() + 60 * 60 * 1000); // +1 hour<br><br>  const event = {<br>    summary: title, <br>    start: {<br>      dateTime: startDateTime.toISOString(), <br>      timeZone: timezone<br>    },<br>    end: {<br>      dateTime: endDateTime.toISOString(),<br>      timeZone: timezone<br>    },<br>    attendees: [<br>      { email: &#39;edisonj1996@gmail.com&#39; },<br>      { email: mail }<br>      // Replace with extracted attendees<br>    ],<br>    conferenceData: {<br>      createRequest: {<br>        requestId: &#39;meet-&#39; + Date.now(),<br>        conferenceSolutionKey: {<br>          type: &#39;hangoutsMeet&#39;<br>        }<br>      }<br>    }<br>  };<br>  console.log(&#39;evet is&#39;, event);<br><br>  if (calendar) {<br>    const calendarResponse = await calendar.events.insert({<br>      calendarId: &#39;primary&#39;, // Use &#39;primary&#39; for the user&#39;s main calendar<br>      auth: oauth2Client,      resource: event,<br>      conferenceDataVersion: 1<br>    });<br>    // console.log(&#39;bookAEvent is&#39;, calendarResponse);<br>  }<br>}</pre><p>The above function is for creating an event in the calendar. We need to pass the following details in the resource.</p><ol><li>summary — event tittle</li><li>start — start time with timezone</li><li>end—end time with timezone</li><li>attendees — email of all attendees.</li><li>confererceData — it is for generating a g-meet link</li></ol><p>Now, calling node index.jsWe can run the application and chat with Gemini, and book an event in Google Calendar.</p><h4>References:</h4><p>Access full code — <a href="https://github.com/EdisonDevadoss/gemini-calendar-booking-node-example/tree/main">https://github.com/EdisonDevadoss/gemini-calendar-booking-node-example/tree/main</a></p><p>Google APIs — <a href="https://console.cloud.google.com/apis">https://console.cloud.google.com/apis</a></p><p>Gemini API key — <a href="https://aistudio.google.com/apikey">https://aistudio.google.com/apikey</a></p><p>Thank you for reading. Have a nice day!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e841f2f7607f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/yavar/book-a-google-calendar-by-using-gemini-llm-e841f2f7607f">Book a Google calendar by using Gemini LLM</a> was originally published in <a href="https://medium.com/yavar">YavarTechWorks</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Evolution of Human Ingenuity: Bridging the Gap]]></title>
            <link>https://medium.com/yavar/the-evolution-of-human-ingenuity-bridging-the-gap-d09f138f4f5f?source=rss----1b2e541f8ed2---4</link>
            <guid isPermaLink="false">https://medium.com/p/d09f138f4f5f</guid>
            <category><![CDATA[innovation]]></category>
            <category><![CDATA[inventions]]></category>
            <category><![CDATA[human-evolution]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[cognitive-enhancement]]></category>
            <dc:creator><![CDATA[Stalin]]></dc:creator>
            <pubDate>Mon, 07 Apr 2025 16:23:05 GMT</pubDate>
            <atom:updated>2025-04-07T16:23:05.563Z</atom:updated>
            <content:encoded><![CDATA[<p>Innovation has always been the driving force behind human progress, shaping the way we live, work, and interact. Every major breakthrough throughout history has aimed to achieve one of three things: <strong>empower those with fewer capabilities</strong>, <strong>reduce labor-intensive tasks,</strong> or <strong>enhance entertainment</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*k_MBenvnutOKj0dF" /></figure><h3>Human Innovation: Overcoming Limitations through Invention</h3><p>Throughout history, human inventions have complemented our weaknesses and enhanced our capabilities in various ways:</p><p>🔥 <strong>Taming Fire</strong> — Fire provided warmth, protection, and a means to cook food, addressing our vulnerability to cold, predators, and raw, unsafe food.</p><p>🛞 <strong>The Wheel</strong> — The invention of the wheel facilitated transport and heavy lifting, overcoming human limitations in moving large objects and traveling long distances efficiently.</p><p>⚙️ <strong>Machines (Industrial Revolution)</strong> — Machines and steam engines augmented human physical labor, allowing for mass production and increased productivity, thus addressing our physical limitations and the inefficiencies of manual work.</p><p>💻 <strong>Computing</strong> — Early computing machines, like Babbage’s Analytical Engine and Turing’s theoretical models, performed complex calculations and data processing far beyond human capacity, addressing our cognitive limitations in handling large-scale computations and repetitive tasks.</p><p>🤖 <strong>Artificial Intelligence</strong> — AI systems mimic human intelligence and enhance our cognitive capabilities. They excel in data analysis, pattern recognition, and decision-making, complementing our limitations in processing vast amounts of information quickly and accurately. AI assists in fields such as healthcare, finance, and logistics, where it can identify trends, make predictions, and optimize operations beyond human ability.</p><p>These inventions collectively enhance human strengths and mitigate our weaknesses, enabling us to achieve more than we ever could alone.</p><h3>The Evolution of Human Ability</h3><p>In ancient times, survival relied on physical strength and hunting prowess. As societies progressed, technology replaced the need for such skills, ensuring that people could thrive regardless of their natural physical abilities.</p><p>The next wave of innovation aimed at reducing human labor. From household appliances to AI-powered automation, the focus shifted toward efficiency. Entertainment, too, evolved dramatically, from storytelling to digital media, reshaping how we spend our leisure time.</p><p>However, the most impactful advancements are those that bridge the gap between individuals, ensuring that no one is left behind due to differences in ability. These inventions foster a more inclusive and equitable society.</p><h3>The Next Frontier: Intelligence &amp; Emotion</h3><p>✍️ <strong>Writing &amp; Print</strong> — Once, beautiful handwriting was a valued skill, but the printing press changed that. Later, typing speed became critical, but speech-to-text technology made it less relevant.</p><p>🧠 <strong>Artificial Intelligence</strong> — Now, even critical thinking — the defining trait that sets humans apart from animals — is being supplemented by AI, leveling the playing field in decision-making and problem-solving.</p><p>❤️ <strong>Emotional Intelligence</strong> — As AI continues to evolve, the final frontier is replicating emotional intelligence. When technology can match or surpass human empathy, we will have redefined what it means to be human.</p><h3>The Future of Innovation</h3><p>With every invention, from fire to AI, we move closer to a world where ability differences no longer dictate one’s potential. The ultimate purpose of innovation should not be just to make life easier or more entertaining but to create a society where no one is left behind.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d09f138f4f5f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/yavar/the-evolution-of-human-ingenuity-bridging-the-gap-d09f138f4f5f">The Evolution of Human Ingenuity: Bridging the Gap</a> was originally published in <a href="https://medium.com/yavar">YavarTechWorks</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Understanding Race Conditions in Python and How to Handle Them]]></title>
            <link>https://medium.com/yavar/understanding-race-conditions-in-python-and-how-to-handle-them-98f998708b2c?source=rss----1b2e541f8ed2---4</link>
            <guid isPermaLink="false">https://medium.com/p/98f998708b2c</guid>
            <category><![CDATA[threading]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[concurrency]]></category>
            <category><![CDATA[race-condition]]></category>
            <category><![CDATA[multithreading]]></category>
            <dc:creator><![CDATA[praveenkumar]]></dc:creator>
            <pubDate>Thu, 03 Apr 2025 00:28:22 GMT</pubDate>
            <atom:updated>2025-04-03T00:28:22.517Z</atom:updated>
            <content:encoded><![CDATA[<h3>Introduction</h3><p>In multi-threaded or multi-process Python applications, <strong>race conditions</strong> can cause unpredictable behavior, leading to data corruption, inconsistent states, and hard-to-debug errors. If you’ve ever faced issues where shared resources behave unexpectedly in concurrent execution, a race condition might be the culprit.</p><p>In this article, we’ll explore <strong>what a race condition is, why it happens, and how to handle it effectively</strong> in Python with real-world examples.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/998/1*9aZOybfg06xyAQchDEfKtw.png" /></figure><h3>What is a Race Condition?</h3><p>A <strong>race condition</strong> occurs when multiple threads or processes access and modify a shared resource <strong>simultaneously</strong>, leading to inconsistent results. Since thread execution timing is unpredictable, different execution orders may produce different outputs, making bugs <strong>hard to reproduce and debug</strong>.</p><h3>Example of a Race Condition</h3><p>Let’s consider a simple Python script where multiple threads try to increment a shared counter.</p><pre>import threading</pre><pre>counter = 0  # Shared resource<br>def increment():<br>    global counter<br>    for _ in range(100000):<br>        counter += 1</pre><pre>threads = []<br>for _ in range(5):  # Create 5 threads<br>    t = threading.Thread(target=increment)<br>    threads.append(t)<br>    t.start()</pre><pre>for t in threads:<br>    t.join()</pre><pre>print(f&quot;Final counter value: {counter}&quot;)</pre><h3>Expected Output:</h3><p>Since each thread increments counter <strong>100,000 times</strong> and there are <strong>5 threads</strong>, the expected output should be:</p><pre>Final counter value: 500000</pre><h3>Actual Output (Unreliable Result):</h3><p>Depending on system scheduling, you may see:</p><pre>Final counter value: 423768<br>Final counter value: 479543<br>Final counter value: 500000  # Rarely happens</pre><p>Why? Because counter += 1 is <strong>not an atomic operation</strong>—it consists of:</p><ol><li>Reading the current value of counter</li><li>Incrementing the value</li><li>Writing the updated value back</li></ol><p>If two threads execute this sequence at the same time, <strong>one update may overwrite the other</strong>, causing lost increments.</p><h3>How to Handle Race Conditions in Python?</h3><p>There are several ways to handle race conditions and ensure thread-safe operations.</p><h3>1. Using a Lock (Thread Synchronization)</h3><p>A <strong>lock</strong> ensures that only one thread can modify a shared resource at a time.</p><pre>import threading</pre><pre>counter = 0  # Shared resource<br>lock = threading.Lock()</pre><pre>def increment():<br>    global counter<br>    for _ in range(100000):<br>        with lock:  # Lock ensures only one thread modifies counter at a time<br>            counter += 1</pre><pre>threads = []<br>for _ in range(5):<br>    t = threading.Thread(target=increment)<br>    threads.append(t)<br>    t.start()</pre><pre>for t in threads:<br>    t.join()</pre><pre>print(f&quot;Final counter value: {counter}&quot;)  # Always 500000</pre><h3>Why This Works:</h3><ul><li>The with lock: statement ensures that <strong>only one thread at a time</strong> modifies counter.</li><li>It prevents other threads from accessing counter until the current thread finishes updating it.</li></ul><h4>🔹 When to Use Locks?</h4><ul><li>When modifying shared variables in <strong>multi-threaded</strong> applications.</li><li>When working with <strong>shared resources like files or databases</strong>.</li></ul><h3>2. Using the Queue Module (Thread-Safe Data Structures)</h3><p>Instead of manually managing locks, Python’s queue.Queue provides built-in <strong>thread safety</strong>.</p><pre>import threading<br>import queue</pre><pre>q = queue.Queue()</pre><pre>for _ in range(100000):<br>    q.put(1)</pre><pre>def process_queue():<br>    global counter<br>    while not q.empty():<br>        q.get()<br>        q.task_done()</pre><pre>threads = []<br>for _ in range(5):<br>    t = threading.Thread(target=process_queue)<br>    threads.append(t)<br>    t.start()</pre><pre>for t in threads:<br>    t.join()</pre><pre>print(&quot;Processing complete!&quot;)</pre><h3>Why This Works:</h3><ul><li>queue.Queue ensures only <strong>one thread</strong> accesses an item at a time.</li><li>It eliminates the need for <strong>manual locks</strong>.</li></ul><h4>🔹 When to Use Queue?</h4><ul><li>When handling <strong>producer-consumer</strong> problems.</li><li>When working with <strong>task scheduling</strong>.</li></ul><h3>3. Using Multiprocessing (Process Isolation)</h3><p>Python’s <strong>Global Interpreter Lock (GIL)</strong> prevents multiple threads from executing Python code in parallel. If you need real concurrency, <strong>use the multiprocessing module</strong>.</p><pre>import multiprocessing</pre><pre>def increment(counter):<br>    for _ in range(100000):<br>        counter.value += 1</pre><pre>counter = multiprocessing.Value(&#39;i&#39;, 0)  # Shared variable<br>processes = []<br>for _ in range(5):<br>    p = multiprocessing.Process(target=increment, args=(counter,))<br>    processes.append(p)<br>    p.start()</pre><pre>for p in processes:<br>    p.join()</pre><pre>print(f&quot;Final counter value: {counter.value}&quot;)</pre><h3>Why This Works:</h3><ul><li>Each process runs <strong>independently</strong> in its own memory space.</li><li>multiprocessing.Value ensures safe inter-process communication.</li></ul><h4>🔹 When to Use Multiprocessing?</h4><ul><li>When CPU-intensive tasks require real <strong>parallel execution</strong>.</li><li>When running <strong>machine learning models, video processing, etc.</strong>.</li></ul><h3>Final Thoughts</h3><p>Race conditions can cause serious problems in concurrent applications. Fortunately, Python provides <strong>multiple solutions</strong>:</p><p>Solution Best For <strong>Locks</strong> (threading.Lock()) Ensuring atomic updates in multi-threading <strong>Thread-safe Queues</strong> (queue.Queue()) Task scheduling and producer-consumer problems <strong>Multiprocessing</strong> (multiprocessing.Value()) True parallel execution for CPU-bound tasks</p><p>By understanding and implementing these techniques, you can build <strong>reliable and thread-safe</strong> Python applications. 🚀</p><h3>💡 Have You Faced a Race Condition?</h3><p>If you’ve encountered race conditions in your projects, let me know in the comments! What strategies worked for you? 🔥</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=98f998708b2c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/yavar/understanding-race-conditions-in-python-and-how-to-handle-them-98f998708b2c">Understanding Race Conditions in Python and How to Handle Them</a> was originally published in <a href="https://medium.com/yavar">YavarTechWorks</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I Never Planned to Use Vim — Now I Can’t Imagine Coding Without It]]></title>
            <link>https://medium.com/yavar/i-never-planned-to-use-vim-now-i-cant-imagine-coding-without-it-0f77a4464493?source=rss----1b2e541f8ed2---4</link>
            <guid isPermaLink="false">https://medium.com/p/0f77a4464493</guid>
            <category><![CDATA[vim]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[neovim]]></category>
            <category><![CDATA[productivity]]></category>
            <dc:creator><![CDATA[Bennison J]]></dc:creator>
            <pubDate>Thu, 13 Mar 2025 09:31:21 GMT</pubDate>
            <atom:updated>2025-03-13T09:31:21.093Z</atom:updated>
            <content:encoded><![CDATA[<h3>I Never Planned to Use Vim — Now I Can’t Imagine Coding Without It</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vl03rEfcALRiQ4BDtQNf0A.png" /><figcaption>Tmux and Vim setup on Linux Terminal</figcaption></figure><h4>How It Started</h4><p>I never planned to use Vim. It just happened. While working on a Linux server, I had no choice but to use Vim since it was the default editor. At first, I had just learned some basic commands for editing code. But I kept using it over time whenever I worked on the server.</p><h4>The Turning Point</h4><p>One day, I watched a senior colleague use Vim inside VS Code with incredible speed and efficiency. I had never seen Vim being used that way before, and it amazed me. I didn’t even know Vim had an extension for VS Code, so I immediately installed it and started experimenting.</p><p>I kept watching ThePrimeagen’s YouTube videos, paying close attention to his typing speed and techniques. I wasn’t just learning Vim; I was studying how an expert used it.</p><p>For those interested, here’s one of ThePrimeagen’s introductory videos on using Vim:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FX6AR2RMB5tE%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DX6AR2RMB5tE&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FX6AR2RMB5tE%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/a9a217ca1b8c8ecd79563e42da02b717/href">https://medium.com/media/a9a217ca1b8c8ecd79563e42da02b717/href</a></iframe><h4>Why Vim Worked for Me</h4><p>Even before using Vim, I loved working in the terminal, doing everything from turning Wi-Fi on/off to shutting down my system — all through keystrokes. Since Vim is also terminal-based, it fits perfectly into this workflow, letting me keep my hands on the keyboard and work even faster.</p><h4>Boosting Productivity (And the Common Trap)</h4><p>Vim made me feel more productive — moving around and editing code became easy. But there was a trap: spending too much time customizing Vim instead of coding.</p><p>Many times, I would keep changing my .vimrc, trying new plugins, or switching color schemes. Before I knew it, hours had passed, and I had done no real work.</p><p>The real danger? Over-optimization. When too much time goes into perfecting the workflow rather than getting things done, it defeats the purpose. If you have to battle your setup just to be productive, then you’re not being productive.</p><p><a href="https://stackoverflow.com/questions/1088387/what-specific-productivity-gains-do-vim-emacs-provide-over-gui-text-editors?utm_source=chatgpt.com">What specific productivity gains do Vim/Emacs provide over GUI text editors?</a></p><h4>The Productivity Debate</h4><p>There’s still an argument about whether Vim makes developers more productive. Some say the time spent learning Vim offsets any speed gains. Others believe that once mastered, Vim significantly improves efficiency.</p><p>I feel much faster using Vim, but it ultimately depends on how comfortable you are with it. In the end, the real productivity boost comes from using tools that fit your workflow, not just the fastest ones.</p><iframe src="https://cdn.embedly.com/widgets/media.html?type=text%2Fhtml&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;schema=reddit&amp;url=https%3A//www.reddit.com/r/vim/comments/1fasgd8/is_vim_actually_a_productivity_tool_does_it_rly/%3Futm_source%3Dchatgpt.com&amp;image=" width="600" height="400" frameborder="0" scrolling="no"><a href="https://medium.com/media/c80ce8859cb17ca487026b570603d9b4/href">https://medium.com/media/c80ce8859cb17ca487026b570603d9b4/href</a></iframe><p><a href="https://dev.to/maestromac/vim-wont-make-you-a-more-productive-developer-h9f?utm_source=chatgpt.com">Vim won&#39;t make you a more productive developer</a></p><h4>Switching to Neovim</h4><p>At first, I used Vim inside VS Code. But as I got better, I switched to Neovim (LazyVim) for personal projects. Neovim’s speed and flexibility, customization made it a great choice.</p><p>Still, people argue online about whether Neovim is better than Vim. Some say Vim is stable and widely used, while others prefer Neovim’s modern improvements. But in my opinion, Neovim’s speed and customization make it worth using.</p><p>For beginners, Neovim (LazyVim) offers better defaults and modern features, making it easier to configure, while Vim is great for those who prefer stability and minimal dependencies.</p><iframe src="https://cdn.embedly.com/widgets/media.html?type=text%2Fhtml&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;schema=reddit&amp;url=https%3A//www.reddit.com/r/vim/comments/16cdbyd/why_you_switched_from_neovim_to_vim/%3Frdt%3D33204&amp;image=" width="600" height="400" frameborder="0" scrolling="no"><a href="https://medium.com/media/47f407f3c9e833c77d2da449cc7ae75a/href">https://medium.com/media/47f407f3c9e833c77d2da449cc7ae75a/href</a></iframe><p><a href="https://news.ycombinator.com/item?id=31908731">A question for those of you still using vim. Why do you use it over Neovim (if y... | Hacker News</a></p><h4>The Learning Curve</h4><p>Let’s be honest — Vim is hard to learn. The start is frustrating, and it takes time to get used to. In fact, the struggle is so real that one of the most upvoted Stack Overflow posts ever is just about how to exit Vim! But each small improvement makes things easier.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/958/1*YZNis4vNvBl5zwJV5--8bA.png" /><figcaption>How do I exit Vim?</figcaption></figure><p>Some people debate whether Vim’s learning curve is worth it. Some argue that the time spent learning Vim could be better spent using a more intuitive editor. Others believe that once Vim is mastered, the benefits outweigh the effort. I think it’s worth it. Once you get comfortable, it becomes a powerful tool.</p><h4>Learning Tmux Alongside Vim</h4><p>While learning Vim, I also picked up Tmux, and it completely changed how I work. Instead of opening multiple tabs, I can run everything in a single terminal with multiple panes and switch between them easily. It’s highly customizable, and after tweaking it to fit my workflow, it became an essential tool.</p><p>Using Vim and Tmux together makes my setup smooth, and more efficient. But again, just having a fancy setup doesn’t mean real productivity — it’s only productive if it helps you get work done, not just manage your tools.</p><h4>Final Thoughts</h4><p>Vim wasn’t something I planned to use, but now I can’t imagine coding without it. At first, it felt unfamiliar, but every small improvement made a big difference. Sure, I’ve lost hours tweaking my config, but the speed and efficiency make it all worth it.</p><p>Would I recommend learning Vim? <strong>Absolutely — just don’t spend more time configuring it than actually coding!</strong></p><p>If you’re new to Vim or want to learn some useful commands, I’ve written an article that might help.</p><p><a href="https://medium.com/@bennisondevadoss/vim-essential-commands-techniques-0d02b6e2a0dd">Vim Essential Commands &amp; Techniques</a></p><p>Are you using Vim or Neovim? Do you think the learning curve is worth it?</p><p>📌 Connect with me on <a href="https://www.linkedin.com/in/bennisondevadoss/">LinkedIn</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0f77a4464493" width="1" height="1" alt=""><hr><p><a href="https://medium.com/yavar/i-never-planned-to-use-vim-now-i-cant-imagine-coding-without-it-0f77a4464493">I Never Planned to Use Vim — Now I Can’t Imagine Coding Without It</a> was originally published in <a href="https://medium.com/yavar">YavarTechWorks</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[RAG vs. Fine-Tuning: Understanding the Differences in the Context of SD-WAN and Networking]]></title>
            <link>https://medium.com/yavar/rag-vs-fine-tuning-understanding-the-differences-in-the-context-of-sd-wan-and-networking-8f8c43a73dc9?source=rss----1b2e541f8ed2---4</link>
            <guid isPermaLink="false">https://medium.com/p/8f8c43a73dc9</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[finetune-llm]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[networking]]></category>
            <category><![CDATA[sd-wan]]></category>
            <dc:creator><![CDATA[praveenkumar]]></dc:creator>
            <pubDate>Thu, 13 Mar 2025 09:25:42 GMT</pubDate>
            <atom:updated>2025-03-13T09:25:42.247Z</atom:updated>
            <content:encoded><![CDATA[<p>When it comes to enhancing the performance of Large Language Models (LLMs) in networking and SD-WAN use cases, two primary approaches stand out: Retrieval-Augmented Generation (RAG) and Fine-Tuning. While both methods improve model outputs, they serve different purposes and are best suited for specific scenarios.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1005/1*Q9fRYFxUImwl0envqs0Mvw.png" /></figure><h3>LLM Challenges in Networking and SD-WAN</h3><p>Large Language Models face a few key challenges when applied to networking and SD-WAN environments:</p><ul><li><strong>Lack of up-to-date knowledge:</strong> LLMs are trained on static datasets, meaning they don’t have real-time updates on networking trends or SD-WAN configurations.</li><li><strong>Generic responses:</strong> Out-of-the-box LLMs may not provide precise answers tailored to specific network architectures or troubleshooting scenarios.</li></ul><h3>What is RAG (Retrieval-Augmented Generation)?</h3><p>RAG improves LLMs by retrieving relevant external data and incorporating it into the response generation process. It works in three key stages:</p><ol><li><strong>Retrieval:</strong> Fetching up-to-date data from a database or knowledge base.</li><li><strong>Augmentation:</strong> Structuring and feeding the retrieved data into the LLM as context.</li><li><strong>Generation:</strong> Producing a response based on the combined input from the user and retrieved data.</li></ol><h3>Use Case: RAG for SD-WAN Troubleshooting</h3><p>Imagine a network engineer using an SD-WAN chatbot for troubleshooting. The chatbot doesn’t store fixed responses but instead retrieves real-time configuration logs, recent vendor documentation, and support tickets before generating a precise solution. This approach ensures:</p><ul><li><strong>Dynamic updates</strong> from SD-WAN product documentation.</li><li><strong>Context-aware answers</strong> that are relevant to the latest firmware and configurations.</li></ul><h3>What is Fine-Tuning?</h3><p>Fine-tuning involves training the LLM with specific labeled datasets, making it more precise and efficient in a given domain. This approach is useful when we need to reinforce particular patterns and industry-specific knowledge.</p><h3>Use Case: Fine-Tuning for SD-WAN Policy Recommendations</h3><p>Suppose an SD-WAN solution requires automatic policy recommendations based on past configurations. By fine-tuning an LLM with historical configuration templates and best practices, it can provide:</p><ul><li><strong>Faster responses</strong> tailored to enterprise network policies.</li><li><strong>Consistent recommendations</strong> aligned with industry standards.</li></ul><h3>When to Use RAG vs. Fine-Tuning in Networking and SD-WAN?</h3><p>Feature RAG Fine-Tuning <strong>Data Freshness</strong> Real-time retrieval of current data Static, pre-trained knowledge <strong>Customization</strong> Uses external data dynamically Learns from labeled datasets <strong>Use Case</strong> Handling product updates, chatbot responses Summarizing past SD-WAN logs, policy recommendations <strong>Implementation Complexity</strong> Easier to implement (connect to a knowledge base) Requires extensive labeled training data</p><h3>Combining RAG and Fine-Tuning for SD-WAN Optimization</h3><p>A hybrid approach can deliver the best of both worlds. For instance:</p><ul><li><strong>Fine-tune an LLM</strong> with historical network outage data to recognize recurring patterns.</li><li><strong>Use RAG</strong> to fetch real-time SD-WAN performance metrics before generating a troubleshooting guide.</li></ul><p>This combination ensures:</p><ul><li><strong>Speed and accuracy</strong> by leveraging fine-tuned knowledge.</li><li><strong>Up-to-date insights</strong> by dynamically retrieving relevant information.</li></ul><h3>Conclusion</h3><p>Both RAG and Fine-Tuning have their place in networking and SD-WAN implementations. While RAG is ideal for dynamic, real-time knowledge retrieval, fine-tuning is excellent for structured, domain-specific intelligence. By leveraging both approaches, network engineers and SD-WAN administrators can build powerful AI-driven solutions that enhance automation, troubleshooting, and decision-making.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8f8c43a73dc9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/yavar/rag-vs-fine-tuning-understanding-the-differences-in-the-context-of-sd-wan-and-networking-8f8c43a73dc9">RAG vs. Fine-Tuning: Understanding the Differences in the Context of SD-WAN and Networking</a> was originally published in <a href="https://medium.com/yavar">YavarTechWorks</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Enable Internet Access for an Internal Network in VirtualBox]]></title>
            <link>https://medium.com/yavar/how-to-enable-internet-access-for-an-internal-network-in-virtualbox-92b61accec15?source=rss----1b2e541f8ed2---4</link>
            <guid isPermaLink="false">https://medium.com/p/92b61accec15</guid>
            <category><![CDATA[networking]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[virtualbox]]></category>
            <category><![CDATA[dhcp]]></category>
            <category><![CDATA[vmware]]></category>
            <dc:creator><![CDATA[praveenkumar]]></dc:creator>
            <pubDate>Thu, 13 Mar 2025 09:25:28 GMT</pubDate>
            <atom:updated>2025-03-13T09:25:28.496Z</atom:updated>
            <content:encoded><![CDATA[<p>VirtualBox provides different networking modes for virtual machines (VMs), and one of them is the <strong>Internal Network</strong>, which is completely isolated from the external world. While this is useful for private communication between VMs, sometimes you might want VMs in an Internal Network to access the internet. This guide will show you how to achieve that by setting up a <strong>router VM</strong> using NAT and IP forwarding.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/954/1*fMeHM0TgMV2X_QlVWAbzog.png" /></figure><h3>Understanding Internal Network in VirtualBox</h3><p>An <strong>Internal Network</strong> in VirtualBox allows VMs to communicate with each other but not with the host or the internet. To provide internet access, we need to introduce a VM that acts as a router between the Internal Network and an external network (such as NAT or Bridged Adapter).</p><h3>Method: Using a Router VM (NAT + Internal Network)</h3><p>The easiest way to enable internet access for Internal Network VMs is to configure one VM as a router that has:</p><ul><li><strong>NAT Adapter</strong> (to access the internet)</li><li><strong>Internal Network Adapter</strong> (to communicate with other VMs)</li></ul><h3>Step 1: Configure Network Adapters</h3><ol><li>Select the VM that will act as the router and go to <strong>Settings → Network</strong>.</li><li><strong>Adapter 1</strong>:</li></ol><ul><li>Set <strong>Attached to</strong>: NAT</li><li>This adapter will provide internet access.</li></ul><p><strong>3. Adapter 2</strong>:</p><ul><li>Set <strong>Attached to</strong>: Internal Network</li><li>Name the network (e.g., intnet).</li><li>This will connect to other VMs in the Internal Network.</li></ul><h3>Step 2: Enable IP Forwarding on the Router VM</h3><p>If your router VM runs <strong>Linux</strong>, enable IP forwarding:</p><pre>sudo sysctl -w net.ipv4.ip_forward=1</pre><p>To make it permanent, edit /etc/sysctl.conf and add:</p><pre>net.ipv4.ip_forward = 1</pre><p>Then apply the changes:</p><pre>sudo sysctl -p</pre><h3>Step 3: Configure NAT with iptables</h3><p>Set up Network Address Translation (NAT) so Internal Network VMs can access the internet through the router:</p><pre>sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE</pre><p>Replace eth0 with the interface name of the <strong>NAT adapter</strong> (use ip a to check interface names).</p><h3>Step 4: Assign IPs to Internal Network VMs</h3><ol><li>Assign a <strong>static IP</strong> to the router VM’s Internal Network interface (e.g., 192.168.100.1/24).</li><li>Assign IPs to other Internal Network VMs in the same subnet (e.g., 192.168.100.10/24).</li><li>Set the router VM’s IP (192.168.100.1) as the <strong>Default Gateway</strong> on Internal Network VMs.</li></ol><h3>Step 5: Test Connectivity</h3><p>On an Internal Network VM, try:</p><pre>ping 8.8.8.8</pre><p>If this works, but ping google.com doesn’t, configure DNS:</p><pre>echo &quot;nameserver 8.8.8.8&quot; | sudo tee /etc/resolv.conf</pre><h3>Bonus: Set Up DHCP with dnsmasq (Optional)</h3><p>To avoid manually assigning IPs, you can install dnsmasq on the router VM to serve DHCP:</p><pre>sudo apt install dnsmasq</pre><p>Edit /etc/dnsmasq.conf:</p><pre>dhcp-range=192.168.100.50,192.168.100.100,12h<br>dhcp-option=3,192.168.100.1<br>dhcp-option=6,8.8.8.8,8.8.4.4</pre><p>Restart dnsmasq:</p><pre>sudo systemctl restart dnsmasq</pre><p>Now, Internal Network VMs will get an IP, gateway, and DNS automatically.</p><h3>Conclusion</h3><p>By setting up a router VM with NAT and an Internal Network, you can provide internet access to VMs while keeping them isolated from the host. This setup is useful for testing, security, and private lab environments. With additional configurations like dnsmasq, you can automate IP allocation for a seamless experience.</p><p>Have you tried this setup? Let me know in the comments! 🚀</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=92b61accec15" width="1" height="1" alt=""><hr><p><a href="https://medium.com/yavar/how-to-enable-internet-access-for-an-internal-network-in-virtualbox-92b61accec15">How to Enable Internet Access for an Internal Network in VirtualBox</a> was originally published in <a href="https://medium.com/yavar">YavarTechWorks</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Synchronizing Network Data in Python with DiffSync]]></title>
            <link>https://medium.com/yavar/synchronizing-network-data-in-python-with-diffsync-86a845c605ca?source=rss----1b2e541f8ed2---4</link>
            <guid isPermaLink="false">https://medium.com/p/86a845c605ca</guid>
            <category><![CDATA[diffsync]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[networking-tips]]></category>
            <category><![CDATA[networking]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[praveenkumar]]></dc:creator>
            <pubDate>Thu, 13 Mar 2025 09:25:15 GMT</pubDate>
            <atom:updated>2025-03-13T09:25:15.010Z</atom:updated>
            <content:encoded><![CDATA[<h3>Introduction</h3><p>Managing network data across multiple sources can be challenging. Keeping configurations consistent between databases, monitoring tools, and network devices requires an efficient way to compare and synchronize changes. This is where DiffSync comes in!</p><p>In this blog, we’ll explore DiffSync, a powerful Python library that helps synchronize network data by detecting and resolving differences between datasets. We’ll walk through a real-world example of managing network devices using DiffSyncModel.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1003/1*y9Oi7GQrnoo3dJDj4v-MMw.png" /></figure><h3>What is DiffSync?</h3><p>DiffSync is a Python library designed for comparing and synchronizing structured data across multiple sources. It allows you to:</p><ul><li>Define models representing your data.</li><li>Track changes between different datasets.</li><li>Synchronize data efficiently.</li></ul><p>It’s widely used in networking automation tools like <a href="https://github.com/nautobot/nautobot">Nautobot</a> and <a href="https://github.com/networktocode/network-importer">Network Importer</a>.</p><h3>Installing DiffSync</h3><p>To get started, install DiffSync using pip:</p><pre>pip install diffsync</pre><h3>Building a Network Device Inventory with DiffSync</h3><p>Let’s create a DeviceModel to represent network devices and a NetworkInventory to manage multiple devices.</p><h3>Defining the Device Model</h3><pre>from diffsync import DiffSync, DiffSyncModel</pre><pre>class DeviceModel(DiffSyncModel):<br>    &quot;&quot;&quot;Represents a network device.&quot;&quot;&quot;<br>    _modelname = &quot;device&quot;  # Unique model identifier<br>    _identifiers = (&quot;name&quot;,)  # Unique fields<br>    _attributes = (&quot;ip&quot;, &quot;role&quot;)  # Fields to compare<br>    <br>    def __init__(self, name: str, ip: str, role: str):<br>        super().__init__(name=name, ip=ip, role=role)</pre><h3>Creating the Inventory</h3><p>We now define NetworkInventory, which holds multiple devices and manages synchronization.</p><pre>class NetworkInventory(DiffSync):<br>    &quot;&quot;&quot;Represents a collection of network devices.&quot;&quot;&quot;<br>    device = DeviceModel  # Registering the model<br>    <br>    def __init__(self, name: str):<br>        super().__init__()<br>        self.name = name</pre><h3>Comparing and Synchronizing Data</h3><p>Now, let’s create two inventories: a source (representing the correct state) and a destination (which has outdated or incorrect data).</p><pre># Create inventories<br>source_inventory = NetworkInventory(name=&quot;Source&quot;)<br>dest_inventory = NetworkInventory(name=&quot;Destination&quot;)</pre><pre># Add devices to source inventory<br>source_inventory.add(DeviceModel(name=&quot;Router1&quot;, ip=&quot;192.168.1.1&quot;, role=&quot;Core&quot;))<br>source_inventory.add(DeviceModel(name=&quot;Switch1&quot;, ip=&quot;192.168.1.2&quot;, role=&quot;Access&quot;))</pre><pre># Add devices to destination inventory with different data<br>dest_inventory.add(DeviceModel(name=&quot;Router1&quot;, ip=&quot;192.168.1.1&quot;, role=&quot;Distribution&quot;))  # Role is different<br>dest_inventory.add(DeviceModel(name=&quot;Switch2&quot;, ip=&quot;192.168.1.3&quot;, role=&quot;Access&quot;))  # Different device</pre><pre># Compute Differences<br>diff = dest_inventory.diff_from(source_inventory)</pre><pre># Print Differences<br>print(diff.dict())  # Shows added, removed, or modified devices</pre><h3>Expected Output (Before Sync)</h3><pre>{<br>  &quot;adds&quot;: {&quot;device&quot;: [{&quot;name&quot;: &quot;Switch1&quot;}]},<br>  &quot;removes&quot;: {&quot;device&quot;: [{&quot;name&quot;: &quot;Switch2&quot;}]},<br>  &quot;changes&quot;: {&quot;device&quot;: [{&quot;name&quot;: &quot;Router1&quot;, &quot;role&quot;: {&quot;old_value&quot;: &quot;Distribution&quot;, &quot;new_value&quot;: &quot;Core&quot;}}]}<br>}</pre><h3>Synchronizing Data</h3><p>Once differences are detected, we can synchronize the destination inventory to match the source.</p><pre>dest_inventory.sync_from(source_inventory)<br>print(&quot;Synchronization Completed!&quot;)</pre><h3>Why Use DiffSync?</h3><ul><li><strong>Automation</strong>: Reduce manual configuration errors.</li><li><strong>Data Consistency</strong>: Ensure all systems have up-to-date information.</li><li><strong>Flexibility</strong>: Works with various data sources like APIs, databases, and YAML files.</li></ul><h3>Conclusion</h3><p>DiffSync is a powerful tool for managing network configurations and keeping data consistent across different sources. By defining structured models, detecting differences, and synchronizing changes, you can automate tedious tasks and improve network reliability.</p><p>Give DiffSync a try in your next automation project! 🚀</p><p>Have you used DiffSync before? Share your experiences in the comments below! 👇</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=86a845c605ca" width="1" height="1" alt=""><hr><p><a href="https://medium.com/yavar/synchronizing-network-data-in-python-with-diffsync-86a845c605ca">Synchronizing Network Data in Python with DiffSync</a> was originally published in <a href="https://medium.com/yavar">YavarTechWorks</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Future of Secure Communications: An Introduction to Quantum Networking]]></title>
            <link>https://medium.com/yavar/the-future-of-secure-communications-an-introduction-to-quantum-networking-e500656b42ef?source=rss----1b2e541f8ed2---4</link>
            <guid isPermaLink="false">https://medium.com/p/e500656b42ef</guid>
            <category><![CDATA[quantum-computing]]></category>
            <category><![CDATA[quantum-networking]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[networking]]></category>
            <category><![CDATA[tech-trends]]></category>
            <dc:creator><![CDATA[praveenkumar]]></dc:creator>
            <pubDate>Thu, 13 Mar 2025 09:24:57 GMT</pubDate>
            <atom:updated>2025-03-13T09:24:56.968Z</atom:updated>
            <content:encoded><![CDATA[<p>The world of networking is on the verge of a revolution, and at the heart of this transformation lies <strong>quantum networking</strong>. Unlike traditional communication systems that rely on classical bits (0s and 1s), quantum networking harnesses the principles of quantum mechanics to enable <strong>unprecedented security and speed</strong> in data transmission.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/994/1*a-f_o9a6fMmajeEOSjxqLw.png" /></figure><h3>What is Quantum Networking?</h3><p>Quantum networking is an advanced form of communication that leverages the unique properties of <strong>quantum bits (qubits)</strong>, which can exist in multiple states simultaneously. This allows for more efficient data transmission and introduces new levels of security that are impossible to achieve with classical networks.</p><h3>Key Principles of Quantum Networking</h3><p>🔹 <strong>Quantum Entanglement</strong> — Two or more particles become <strong>entangled</strong>, meaning any change to one particle is instantly reflected in the other, regardless of distance. This could enable near-instantaneous communication across vast distances.</p><p>🔹 <strong>Quantum Superposition</strong> — Unlike classical bits, a qubit can exist as <strong>0 and 1 at the same time</strong>, vastly increasing computational and networking capabilities.</p><p>🔹 <strong>Quantum Key Distribution (QKD)</strong> — A revolutionary cryptographic technique that allows secure key exchange. If an eavesdropper tries to intercept the key, the quantum state collapses, immediately notifying both parties of the security breach.</p><p>🔹 <strong>No-Cloning Theorem</strong> — Quantum information <strong>cannot be copied</strong>, meaning that any interception attempt results in the destruction of the data, preventing unauthorized access.</p><h3>Real-World Applications of Quantum Networking</h3><p>The implications of quantum networking go far beyond theory. Here are some key areas where it is already making an impact:</p><p>✅ <strong>Ultra-Secure Communications</strong> — Governments, financial institutions, and defense organizations can use quantum networks to ensure completely secure messaging and data transfers.</p><p>✅ <strong>The Quantum Internet</strong> — A futuristic concept where <strong>quantum computers and devices communicate securely across a global quantum network</strong>.</p><p>✅ <strong>Distributed Quantum Computing</strong> — Multiple quantum computers can be interconnected to work as a unified system, solving complex problems much faster than classical computers.</p><p>✅ <strong>Cloud Security Enhancement</strong> — Protecting sensitive cloud-stored data with quantum-encrypted channels that prevent unauthorized access.</p><h3>Challenges Facing Quantum Networking</h3><p>Despite its promise, quantum networking faces several hurdles:</p><p>⚠️ <strong>Hardware Limitations</strong> — Quantum communication requires highly sophisticated quantum processors and extreme cooling environments.</p><p>⚠️ <strong>Signal Loss &amp; Noise</strong> — Quantum states are delicate and can be easily disrupted, leading to challenges in long-distance communication.</p><p>⚠️ <strong>Limited Infrastructure</strong> — Today’s fiber-optic and satellite networks are not yet optimized for quantum data transmission.</p><h3>The Future of Quantum Networking</h3><p>Tech giants like <strong>Google, IBM, and China’s Quantum Research Group</strong> are already working towards developing large-scale quantum networks. The race is on to create the <strong>Quantum Internet</strong>, where quantum computers and secure communication channels will redefine global cybersecurity, finance, and cloud computing.</p><p>While still in its early stages, <strong>quantum networking is poised to reshape the future of secure communication</strong>. As advancements continue, we can expect to see widespread adoption in the coming decades, leading to a safer and more efficient digital world.</p><blockquote>What are your thoughts on quantum networking? Do you think it will become mainstream soon? Let’s discuss in the comments! 🚀</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e500656b42ef" width="1" height="1" alt=""><hr><p><a href="https://medium.com/yavar/the-future-of-secure-communications-an-introduction-to-quantum-networking-e500656b42ef">The Future of Secure Communications: An Introduction to Quantum Networking</a> was originally published in <a href="https://medium.com/yavar">YavarTechWorks</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Great Work is Born from Struggle — A Message for All Stakeholders in the Software Industry]]></title>
            <link>https://medium.com/yavar/great-work-is-born-from-struggle-a-message-for-all-stakeholders-in-the-software-industry-bd8df9f1ade8?source=rss----1b2e541f8ed2---4</link>
            <guid isPermaLink="false">https://medium.com/p/bd8df9f1ade8</guid>
            <category><![CDATA[resiliencetech]]></category>
            <category><![CDATA[ai-revolution]]></category>
            <category><![CDATA[software-industry]]></category>
            <dc:creator><![CDATA[Stalin]]></dc:creator>
            <pubDate>Thu, 06 Feb 2025 07:18:56 GMT</pubDate>
            <atom:updated>2025-02-06T07:18:56.164Z</atom:updated>
            <content:encoded><![CDATA[<h3><strong>Great Work is Born from Struggle — A Message for All Stakeholders in the Software Industry</strong></h3><p>The world is shifting fast. AI is automating jobs, the economy is uncertain, and the entire software industry is feeling the pressure. Layoffs, hiring freezes, and constant change make it easy to feel stuck. But here’s the truth: <strong>some of the greatest innovations happen during hard times.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ocD0bxKVY-e_vhun" /></figure><h3>Struggle Fuels Greatness</h3><p>Think about history — powerful literature, groundbreaking inventions, and game-changing businesses often emerge from adversity. Tough times force us to rethink, rebuild, and evolve. The same applies to software professionals, leaders, entrepreneurs, and investors today.</p><p>Some of the biggest tech companies we admire — Airbnb, Uber, and WhatsApp — were founded during economic downturns. Why? Because challenges push people to innovate. <strong>This is your time to rise.</strong></p><h3>Comfort You Must Give Up to Grow</h3><p>Growth doesn’t happen in comfort. In uncertain times, we need to adapt, upskill, and step outside our safe zones. Here are some comforts you might need to give up:</p><h4>1. The Expectation of Immediate Job Security</h4><p>For freshers and employees, long-term stability isn’t always guaranteed. Instead of relying solely on job security, focus on career security — continuously learning, networking, and staying adaptable.</p><h4>2. The Fear of Rejections &amp; Failures</h4><p>For job seekers and startups, rejection is part of the journey. Every setback is a lesson. Whether it’s a job application, a funding pitch, or a failed product, learn, refine, and keep pushing forward.</p><h4>3. The Comfort of Old Business Models</h4><p>For companies and leaders, AI and automation are shifting the landscape. Traditional business models may no longer work — embrace agility, invest in emerging technologies, and foster innovation within your teams.</p><h4>4. Work-Life Balance (Temporarily)</h4><p>For entrepreneurs and professionals, balancing work and personal life is crucial, but certain periods require extra effort. Investing time in learning, upskilling, and networking can position you ahead in the evolving market.</p><h3>What You Can Do Now</h3><p>Instead of worrying about the future, <strong>take action</strong> today: <br>✅ <strong>Upskill</strong> — Learn AI-related tools, automation, and cloud computing. Platforms like Coursera, Udemy, and YouTube have excellent resources.<br>✅ <strong>Build</strong> — Work on real-world projects, contribute to open-source, or create innovative solutions.<br>✅ <strong>Network</strong> — Engage with industry professionals, attend tech meetups, and build strong connections.<br>✅ <strong>Stay Adaptable</strong> — Be open to new technologies, job roles, and business opportunities.</p><h3>The Future Belongs to the Builders</h3><p>The tech landscape is shifting, but that doesn’t mean opportunity is gone. It simply means <strong>opportunity looks different.</strong> The software professionals, leaders, and entrepreneurs who <strong>embrace change, stay curious, and keep building</strong> will lead the next wave of innovation.</p><p>This isn’t the time to sit back. <strong>This is the time to build.</strong> 🚀🔥</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bd8df9f1ade8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/yavar/great-work-is-born-from-struggle-a-message-for-all-stakeholders-in-the-software-industry-bd8df9f1ade8">Great Work is Born from Struggle — A Message for All Stakeholders in the Software Industry</a> was originally published in <a href="https://medium.com/yavar">YavarTechWorks</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>