[{"content":"Using KaTeX in Hugo for math typesetting Rendering latex in hugo can be achieved using KaTeX. This gives us the ability to render equations like below efficiently:\n$\\displaystyle\\sum\\limits_{i=0}^n i^3$\nSteps to follow We want to implement it in such a way that any pages that uses math typesetting can be earmarked with math: true in front-matter and then optionally katex will render the formulas given as below:\n$\\displaystyle\\sum\\limits_{i=0}^n i^3$ with:\n$\\displaystyle\\sum\\limits_{i=0}^n i^3$\n Create a partial template under /layouts/partials/math.html, Make sure to check for the updated version of the extension: \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.css\u0026#34;\u0026gt; \u0026lt;script defer src=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script defer src=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/contrib/auto-render.min.js\u0026#34; onload=\u0026#34;renderMathInElement(document.body);\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; i. If you need inline equations include the following as-well:\n\u0026lt;script\u0026gt; document.addEventListener(\u0026#34;DOMContentLoaded\u0026#34;, function() { renderMathInElement(document.body, { delimiters: [ {left: \u0026#34;$$\u0026#34;, right: \u0026#34;$$\u0026#34;, display: true}, {left: \u0026#34;$\u0026#34;, right: \u0026#34;$\u0026#34;, display: false} ] }); }); \u0026lt;/script\u0026gt;  Include the below partial in the head section. In my case using PaperMod I had to add it to the following file layout/partials/extend_head.html:  {{ if or .Params.math .Site.Params.math }} {{ partial \u0026#34;math.html\u0026#34; . }} {{ end }} Use the parameter math: true in the front-matter or site parameters for enabling KaTeX in your posts.  References  Katex Documentation  ","permalink":"https://rkilingar.me/posts/katex-hugo/","summary":"Using KaTeX in Hugo for math typesetting Rendering latex in hugo can be achieved using KaTeX. This gives us the ability to render equations like below efficiently:\n$\\displaystyle\\sum\\limits_{i=0}^n i^3$\nSteps to follow We want to implement it in such a way that any pages that uses math typesetting can be earmarked with math: true in front-matter and then optionally katex will render the formulas given as below:\n$\\displaystyle\\sum\\limits_{i=0}^n i^3$ with:","title":"Using KaTeX in hugo"},{"content":"Problem Given two points $P_1$ \u0026amp; $P_2$ in a grid, and you need to reach from one of the cells to the other, Allowed moves will be up, down, left and right. What is the minimum steps required to reach the destination?\nTaxiCab Geometry and Manhattan Distance Going by euclidean geometry in a 2D surface, distance between any given two points $(x_1,y_1)$ and $(x_2,y_2)$ is:\n$d = \\sqrt{(y_2^{2}-y_1^{2})-(x_2^2-x_1^2)}$\nThis is the straight line distance drawn as a diagonal between the two points.\nThe moniker Manhattan distance comes from the grid layout of streets in manhattan, This causes the shortest distance between any two points in a taxicab geometry to be the sum of the absolute values of the differences between both sets of coordinates. The above equation becomes:\n$d = |y_2-y_1| + |x_2-x_1|$\nThis can be visualized as the sum of the length of projection between the two coordinate axes of the diagonal.\nReferences  TaxiCab Geometry A* Search Algorithm  ","permalink":"https://rkilingar.me/posts/taxicab-geometry/","summary":"Problem Given two points $P_1$ \u0026amp; $P_2$ in a grid, and you need to reach from one of the cells to the other, Allowed moves will be up, down, left and right. What is the minimum steps required to reach the destination?\nTaxiCab Geometry and Manhattan Distance Going by euclidean geometry in a 2D surface, distance between any given two points $(x_1,y_1)$ and $(x_2,y_2)$ is:\n$d = \\sqrt{(y_2^{2}-y_1^{2})-(x_2^2-x_1^2)}$\nThis is the straight line distance drawn as a diagonal between the two points.","title":"Taxi Cab Geometry and Manhattan Distance"},{"content":"Introduction This article and video will go through the janus plugin interface.\nSo a brief introduction about janus-server would be that it is a WebRTC server which facilitates creation of WebRTC media communication channels and the exchange of communication. You can visit their website for a more detailed communication regarding this software.\nJanus has a plugin interface through which we can create multiple addons that work over WebRTC where one such example would be Video Room. Using combinations of plugins like these we can create multiple Web Applications that serve different purposes which is explained well by Lorenzo Miniero in this video\n  I\u0026rsquo;ll be doing some analysis of the janus plugin interface in this blog post, and I\u0026rsquo;ll be focusing on mainly the Video Room plugin for this purpose\nPlugin Interface Janus requires the following functions to be implemented to satisfy the interface:\nDebugger Setup The following article can be followed to set up janus locally: Link\nAnd you can start debugging the repository using VSCode with the following article: Link\nJanus Server communication and connection establishment The following diagram illustrates the mechanism with which a sample plugin(audio-bridge) establishes connection with Janus WebRTC server, the pattern is similar for other plugins.\nThe main exchange that starts the WebRTC Peer connection is the exchange of JSEP offer and answer SDP\u0026rsquo;s which contains the information required to establish a WebRTC connection\nAudio-Bridge in particular has been designed after MCU Architecture where server does the processing to mix all the streams. So the clients only have to deal with a single outgoing and single incoming stream\n The Audio Bridge demo is a simple example of how to implement an audio conferencing application through Janus. Since it makes use of the AudioBridge plugin, all the audio contributions will be mixed, which means that a single PeerConnection will be created no matter how many participants will join the room.\n References  Janus Documentation Janus Demo Pages  ","permalink":"https://rkilingar.me/posts/janus-plugins/","summary":"Introduction This article and video will go through the janus plugin interface.\nSo a brief introduction about janus-server would be that it is a WebRTC server which facilitates creation of WebRTC media communication channels and the exchange of communication. You can visit their website for a more detailed communication regarding this software.\nJanus has a plugin interface through which we can create multiple addons that work over WebRTC where one such example would be Video Room.","title":"Janus WebRTC Server Plugin Interface"},{"content":"Chromium-WebRTC WebRTC is an open source project providing Real-Time Communication between multiple devices. It was open sourced by google, and the specification is available in IETF.\nOne of the interesting features I\u0026rsquo;ve been using in WebRTC is screen-sharing. So we wanted to tinker with it and understand the architecture and flow on how it manages to avail this feature cross OS platform.\nThe below mentioned method may not be the easiest and efficient way to get to know the underlying flow of WebRTC. But for me personally ability to debug is always the first step towards understanding any new code base.\nSo I hope you\u0026rsquo;ll find this useful :)\nInstall Chromium Development Mode The following instructions can be referred for building chromium in Linux(Please do keep in mind that it\u0026rsquo;s a 20GB Download!):\nChromium build instructions - Linux\nOnce you\u0026rsquo;re setup the last set of commands will build the source code:\nautoninja -C out/Default chrome The first build may take upto 2 hours, which is quite a lot of time. The documentation has a few steps to reduce the amount of time it takes to compile the code, one of the interesting option is to use Goma , which is an open source tool from Google which supports distributed compilation! Haven\u0026rsquo;t tried that out yet\nNow you can run the Chromium version built from the source code using:\nout/Default/chrome VSCode Setup   The following extensions will help in using VSCode along with Chromium source code:\na. Toggle Header/Source\nb. you-complete-me\nc. Rewrap\nd. Highlighter Line\n  Setup Chromium workspace\na. From https://cs.chromium.org/chromium/src/tools/vscode/settings.json5 copy as .vscode/settings.json\n{ // Default tab size of 2, for consistency with internal codebase. \u0026#34;editor.tabSize\u0026#34;: 2, \u0026#34;chrome.outputDir\u0026#34;: \u0026#34;${workspaceRoot}/out/Default\u0026#34;, // Do not figure out tab size from opening a file. \u0026#34;editor.detectIndentation\u0026#34;: false, // Add a line at 80 characters. \u0026#34;editor.rulers\u0026#34;: [80], // Forces LF instead of \u0026#34;auto\u0026#34; which uses CRLF on Windows. \u0026#34;files.eol\u0026#34;: \u0026#34;\\n\u0026#34;, // Trim tailing whitespace on save. \u0026#34;files.trimTrailingWhitespace\u0026#34;: true, // Insert trimmed final new line. \u0026#34;files.insertFinalNewline\u0026#34;: true, \u0026#34;files.trimFinalNewlines\u0026#34;: true, \u0026#34;files.associations\u0026#34;: { \u0026#34;*.grd\u0026#34;: \u0026#34;xml\u0026#34;, \u0026#34;*.gni\u0026#34;: \u0026#34;javascript\u0026#34;, \u0026#34;*.gn\u0026#34;: \u0026#34;javascript\u0026#34;, \u0026#34;ios\u0026#34;: \u0026#34;cpp\u0026#34;, \u0026#34;*.idl\u0026#34;: \u0026#34;cpp\u0026#34; }, \u0026#34;files.exclude\u0026#34;: { // Ignore build output folders. \u0026#34;out*/**\u0026#34;: false }, \u0026#34;files.watcherExclude\u0026#34;: { // Don\u0026#39;t watch out*/ and third_party/ for changes to fix an issue // where vscode doesn\u0026#39;t notice that files have changed. // https://github.com/Microsoft/vscode/issues/3998 // There is currently another issue that requires a leading **/ for // watcherExlude. Beware that this pattern might affect other out* folders // like src/cc/output/. \u0026#34;**/out*/**\u0026#34;: true, \u0026#34;**/third_party/**\u0026#34;: true }, // Wider author column for annotator extension. // https://marketplace.visualstudio.com/items?itemName=ryu1kn.annotator \u0026#34;annotator.annotationColumnWidth\u0026#34;: \u0026#34;24em\u0026#34;, // C++ clang format settings. |workspaceFolder| is assumed to be chromium/src. \u0026#34;C_Cpp.clang_format_path\u0026#34;: \u0026#34;${workspaceFolder}/third_party/depot_tools/clang-format\u0026#34;, \u0026#34;C_Cpp.clang_format_sortIncludes\u0026#34;: true, \u0026#34;editor.formatOnSave\u0026#34;: true, // YouCompleteMe settings. |workspaceFolder| is assumed to be chromium/src. \u0026#34;ycmd.path\u0026#34;: \u0026#34;${HOME}/.ycmd\u0026#34;, // Please replace this path!! \u0026#34;ycmd.global_extra_config\u0026#34;: \u0026#34;${workspaceFolder}/tools/vim/chromium.ycm_extra_conf.py\u0026#34;, \u0026#34;ycmd.confirm_extra_conf\u0026#34;: false }  b. https://cs.chromium.org/chromium/src/tools/vscode/tasks.json5 copy as tasks.json\n{ // Note! // You can set the value used for ${config:chrome.outputDir} in your settings.json // file with a line like: // \u0026#34;chrome.outputDir\u0026#34;: \u0026#34;/path/to/chromium/src/out/Debug\u0026#34;, \u0026#34;version\u0026#34;: \u0026#34;2.0.0\u0026#34;, \u0026#34;runner\u0026#34;: \u0026#34;terminal\u0026#34;, // The default problem matcher matches build output, which is useful for most tasks. \u0026#34;problemMatcher\u0026#34;: [ { \u0026#34;owner\u0026#34;: \u0026#34;cpp\u0026#34;, \u0026#34;fileLocation\u0026#34;: [\u0026#34;relative\u0026#34;, \u0026#34;${config:chrome.outputDir}\u0026#34;], \u0026#34;pattern\u0026#34;: { \u0026#34;regexp\u0026#34;: \u0026#34;^(gen/.*):(\\\\d+):(\\\\d+):\\\\s+(warning|\\\\w*\\\\s?error):\\\\s+(.*)$\u0026#34;, \u0026#34;file\u0026#34;: 1, \u0026#34;line\u0026#34;: 2, \u0026#34;column\u0026#34;: 3, \u0026#34;severity\u0026#34;: 4, \u0026#34;message\u0026#34;: 5 } }, { \u0026#34;owner\u0026#34;: \u0026#34;cpp\u0026#34;, \u0026#34;fileLocation\u0026#34;: [\u0026#34;relative\u0026#34;, \u0026#34;${workspaceRoot}\u0026#34;], \u0026#34;pattern\u0026#34;: { \u0026#34;regexp\u0026#34;: \u0026#34;^../../(.*):(\\\\d+):(\\\\d+):\\\\s+(warning|\\\\w*\\\\s?error):\\\\s+(.*)$\u0026#34;, \u0026#34;file\u0026#34;: 1, \u0026#34;line\u0026#34;: 2, \u0026#34;column\u0026#34;: 3, \u0026#34;severity\u0026#34;: 4, \u0026#34;message\u0026#34;: 5 } }, { \u0026#34;owner\u0026#34;: \u0026#34;cpp\u0026#34;, \u0026#34;fileLocation\u0026#34;: [\u0026#34;relative\u0026#34;, \u0026#34;${config:chrome.outputDir}\u0026#34;], \u0026#34;pattern\u0026#34;: { \u0026#34;regexp\u0026#34;: \u0026#34;^(gen/.*?):(.*):\\\\s+(warning|\\\\w*\\\\s?error):\\\\s+(.*)$\u0026#34;, \u0026#34;file\u0026#34;: 1, \u0026#34;severity\u0026#34;: 3, \u0026#34;message\u0026#34;: 4 } }, { \u0026#34;owner\u0026#34;: \u0026#34;cpp\u0026#34;, \u0026#34;fileLocation\u0026#34;: [\u0026#34;relative\u0026#34;, \u0026#34;${workspaceRoot}\u0026#34;], \u0026#34;pattern\u0026#34;: { \u0026#34;regexp\u0026#34;: \u0026#34;^../../(.*?):(.*):\\\\s+(warning|\\\\w*\\\\s?error):\\\\s+(.*)$\u0026#34;, \u0026#34;file\u0026#34;: 1, \u0026#34;severity\u0026#34;: 3, \u0026#34;message\u0026#34;: 4 } } ], \u0026#34;inputs\u0026#34;: [ { // See \u0026#39;Set Chrome Output Directory\u0026#39;. \u0026#34;type\u0026#34;: \u0026#34;pickString\u0026#34;, \u0026#34;id\u0026#34;: \u0026#34;chromeOutputDir\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Chrome output directory:\u0026#34;, // Configure this to point to all the output directories you use. \u0026#34;options\u0026#34;: [ \u0026#34;${workspaceRoot}/out/pc\u0026#34;, \u0026#34;${workspaceRoot}/out/Debug\u0026#34;, \u0026#34;${workspaceRoot}/Debug_x86\u0026#34; ] } ], \u0026#34;tasks\u0026#34;: [ { \u0026#34;label\u0026#34;: \u0026#34;0-set_chrome_output_directory\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;rm -f ${workspaceFolder}/out/current_link; ln -s ${input:chromeOutputDir} ${workspaceFolder}/out/current_link\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;shell\u0026#34;, // The default problem matcher doesn\u0026#39;t make sense here, so remove it. \u0026#34;problemMatcher\u0026#34;: [], \u0026#34;options\u0026#34;: { \u0026#34;cwd\u0026#34;: \u0026#34;${workspaceFolder}\u0026#34; } }, // Some general-purpose build and test tasks. These all inherit the // problemMatcher at the top of the file. { \u0026#34;label\u0026#34;: \u0026#34;1-build_chrome\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;shell\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;autoninja -C ${config:chrome.outputDir} chrome\u0026#34;, \u0026#34;group\u0026#34;: \u0026#34;test\u0026#34; }, { \u0026#34;label\u0026#34;: \u0026#34;2-build_all\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;shell\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;autoninja -C ${config:chrome.outputDir}\u0026#34; }, { \u0026#34;label\u0026#34;: \u0026#34;3-test_current_file\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;shell\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;${workspaceFolder}/tools/autotest.py -C ${config:chrome.outputDir} --run_all ${file}\u0026#34; }, { \u0026#34;label\u0026#34;: \u0026#34;4-test_current_directory\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;shell\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;${workspaceFolder}/tools/autotest.py -C ${config:chrome.outputDir} --run_all ${fileDirname}\u0026#34; }, { \u0026#34;label\u0026#34;: \u0026#34;5-build_current_file\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;shell\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;compile_single_file --build-dir=${config:chrome.outputDir} --file-path=${file}\u0026#34; }, // Some more specific build tasks, which hard-code the output directory. { \u0026#34;label\u0026#34;: \u0026#34;6-build_chrome_debug\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;shell\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;autoninja -C ${config:chrome.outputDir} chrome\u0026#34; }, { \u0026#34;label\u0026#34;: \u0026#34;7-build_chrome_release\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;shell\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;autoninja -C ${config:chrome.outputDir} chrome\u0026#34; }, { \u0026#34;label\u0026#34;: \u0026#34;8-build_test_debug\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;shell\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;autoninja -C ${config:chrome.outputDir} unit_tests components_unittests browser_tests\u0026#34; } ] }  c. https://cs.chromium.org/chromium/src/tools/vscode/launch.json5 copy as .vscode/launch.json\n{ \u0026#34;version\u0026#34;: \u0026#34;0.2.0\u0026#34;, \u0026#34;configurations\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;Chrome Debug\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;cppdbg\u0026#34;, // \u0026#34;cppdbg\u0026#34; for GDB/LLDB, \u0026#34;cppvsdbg\u0026#34; for Windows Visual Studio debugger \u0026#34;request\u0026#34;: \u0026#34;launch\u0026#34;, \u0026#34;targetArchitecture\u0026#34;: \u0026#34;x64\u0026#34;, \u0026#34;program\u0026#34;: \u0026#34;${workspaceRoot}/out/Default/chrome\u0026#34;, \u0026#34;args\u0026#34;: [\u0026#34;--no-xshm\u0026#34;], // Optional command line args \u0026#34;preLaunchTask\u0026#34;: \u0026#34;6-build_chrome_debug\u0026#34;, \u0026#34;stopAtEntry\u0026#34;: false, \u0026#34;cwd\u0026#34;: \u0026#34;${workspaceRoot}/out/Default/\u0026#34;, \u0026#34;environment\u0026#34;: [ {\u0026#34;name\u0026#34;:\u0026#34;workspaceRoot\u0026#34;, \u0026#34;value\u0026#34;:\u0026#34;${HOME}/datadir/electron/chromium/src\u0026#34;} ], \u0026#34;externalConsole\u0026#34;: true, \u0026#34;setupCommands\u0026#34;: [ { \u0026#34;description\u0026#34;: \u0026#34;Enable pretty printing for gdb\u0026#34;, \u0026#34;text\u0026#34;: \u0026#34;-enable-pretty-printing\u0026#34; }, { \u0026#34;description\u0026#34;: \u0026#34;Load Chromium gdb configuration\u0026#34;, \u0026#34;text\u0026#34;: \u0026#34;-interpreter-exec console \\\u0026#34;source -v ${workspaceRoot}/tools/gdb/gdbinit\\\u0026#34;\u0026#34; }, { \u0026#34;description\u0026#34;: \u0026#34;Load Blink gdb configuration\u0026#34;, \u0026#34;text\u0026#34;: \u0026#34;-interpreter-exec console \\\u0026#34;python import sys; sys.path.insert(0, \u0026#39;${workspaceRoot}/third_party/blink/tools/gdb\u0026#39;); import blink\\\u0026#34;\u0026#34; } ] }, { \u0026#34;name\u0026#34;: \u0026#34;Chrome Release\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;cppdbg\u0026#34;, // \u0026#34;cppdbg\u0026#34; for GDB/LLDB, \u0026#34;cppvsdbg\u0026#34; for Windows Visual Studio debugger \u0026#34;request\u0026#34;: \u0026#34;launch\u0026#34;, \u0026#34;targetArchitecture\u0026#34;: \u0026#34;x64\u0026#34;, \u0026#34;program\u0026#34;: \u0026#34;${workspaceRoot}/out/Release/chrome\u0026#34;, \u0026#34;args\u0026#34;: [], // Optional command line args \u0026#34;preLaunchTask\u0026#34;: \u0026#34;7-build_chrome_release\u0026#34;, \u0026#34;stopAtEntry\u0026#34;: false, \u0026#34;cwd\u0026#34;: \u0026#34;${workspaceRoot}/out/Release/\u0026#34;, \u0026#34;environment\u0026#34;: [], \u0026#34;externalConsole\u0026#34;: true }, { \u0026#34;name\u0026#34;: \u0026#34;Custom Test Debug\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;cppdbg\u0026#34;, // \u0026#34;cppdbg\u0026#34; for GDB/LLDB, \u0026#34;cppvsdbg\u0026#34; for Windows Visual Studio debugger \u0026#34;request\u0026#34;: \u0026#34;launch\u0026#34;, \u0026#34;targetArchitecture\u0026#34;: \u0026#34;x64\u0026#34;, \u0026#34;program\u0026#34;: \u0026#34;${workspaceRoot}/out/Default/unit_tests\u0026#34;, \u0026#34;args\u0026#34;: [ \u0026#34;--gtest_filter=*\u0026#34;, \u0026#34;--single-process-tests\u0026#34;, \u0026#34;--ui-test-action-max-timeout=1000000\u0026#34;, \u0026#34;--test-launcher-timeout=1000000\u0026#34; ], \u0026#34;preLaunchTask\u0026#34;: \u0026#34;8-build_test_debug\u0026#34;, \u0026#34;stopAtEntry\u0026#34;: false, \u0026#34;cwd\u0026#34;: \u0026#34;${workspaceRoot}/out/Default/\u0026#34;, \u0026#34;environment\u0026#34;: [], \u0026#34;externalConsole\u0026#34;: true }, { \u0026#34;name\u0026#34;: \u0026#34;Attach Debug\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;cppdbg\u0026#34;, // \u0026#34;cppdbg\u0026#34; for GDB/LLDB, \u0026#34;cppvsdbg\u0026#34; for Windows Visual Studio debugger \u0026#34;request\u0026#34;: \u0026#34;launch\u0026#34;, \u0026#34;targetArchitecture\u0026#34;: \u0026#34;x64\u0026#34;, \u0026#34;program\u0026#34;: \u0026#34;${workspaceRoot}/out/Default/chrome\u0026#34;, \u0026#34;args\u0026#34;: [ \u0026#34;--remote-debugging-port=2224\u0026#34; ], \u0026#34;stopAtEntry\u0026#34;: false, \u0026#34;cwd\u0026#34;: \u0026#34;${workspaceRoot}/out/Default/\u0026#34;, \u0026#34;environment\u0026#34;: [], \u0026#34;externalConsole\u0026#34;: false } ] }   Debug with VSCode  Editor with all the plugins and settings installed  You can use the option Run And Debug \u0026gt; Chrome Debug to open a new Chromium window with the debugger attached  It might take a little while to open, once the window is open you should be able to see the following  Call stack + Threads VSCode  Chromium Window with debugger attached     With this you should be able to debug the chromium application\nDebugging WebRTC Library Since I\u0026rsquo;m using Linux, the code for capturing screenshot uses X.org Library, which is located in chromium source code at third_party/webrtc/modules/desktop_capture/linux The breakpoint for analyzing a single screen capture can be kept at function: XServerPixelBuffer::CaptureRect from third_party/webrtc/modules/desktop_capture/linux/x_server_pixel_buffer.cc:335\nOnce the breakpoint is set the following link can be opened in the Chromium window to trigger the breakpoint - Link or you can use the Chromium Console with the following code:\nvar displayMediaStreamConstraints = { \u0026#34;aspectRatio\u0026#34;: 1.7777777777777777, \u0026#34;deviceId\u0026#34;: \u0026#34;screen:389:0\u0026#34;, \u0026#34;frameRate\u0026#34;: 15, \u0026#34;height\u0026#34;: 1080, \u0026#34;resizeMode\u0026#34;: \u0026#34;crop-and-scale\u0026#34;, \u0026#34;width\u0026#34;: 1920, \u0026#34;cursor\u0026#34;: \u0026#34;always\u0026#34;, \u0026#34;displaySurface\u0026#34;: \u0026#34;monitor\u0026#34;, \u0026#34;logicalSurface\u0026#34;: true }; if (navigator.mediaDevices.getDisplayMedia) { navigator.mediaDevices.getDisplayMedia(displayMediaStreamConstraints).then(success).catch(error); } else { navigator.getDisplayMedia(displayMediaStreamConstraints).then(success).catch(error); } The breakpoint would be triggered with the following screen: With this setup we\u0026rsquo;d be able to effectively debug, identify and modify code from chromium with VSCode. Those of you who remember previously chromium was not supporting sharing a single screen from a multi screen setup before last year(2020) that issue was resolved with the following fixes. - Link, Fix Link.\nThat\u0026rsquo;s it folks, Happy Debugging!!\nReferences  Debug Chromium with VSCode - gyuyoung Chromium Linux Build Instructions  ","permalink":"https://rkilingar.me/posts/chromium-webrtc/","summary":"Chromium-WebRTC WebRTC is an open source project providing Real-Time Communication between multiple devices. It was open sourced by google, and the specification is available in IETF.\nOne of the interesting features I\u0026rsquo;ve been using in WebRTC is screen-sharing. So we wanted to tinker with it and understand the architecture and flow on how it manages to avail this feature cross OS platform.\nThe below mentioned method may not be the easiest and efficient way to get to know the underlying flow of WebRTC.","title":"Debugging Chromium with VSCode"},{"content":"Quick Summary Senior Software Engineer specializing in cloud infrastructure and observability. Currently driving platform improvements at Intuit where I\u0026rsquo;ve saved ~$1.8M through Karpenter-based node autoscaling and built LLM-powered agentic workflows for incident management.\nExperience Highlights Intuit (Nov 2021 – Present)\n Senior Software Engineer on Cloud Infrastructure Team Decreased cloud costs by 30% and saved ~$1.8M Built LLM-based agentic workflows for incident management Led fleet-wide Kubernetes upgrades across organization Managed 10+ cluster addon components  ZopSmart Technologies Pvt Ltd. (Feb 2019 – Nov 2021)\n Senior Software Engineer Redesigned customer info backend for Kroger (US) Improved throughput near 5k TPS Reduced cart/checkout P95 latency to \u0026lt;500ms using Goroutines  Perfios Software Solutions (Jan 2018 – Feb 2019)\n Data Engineer Modeled credit scoring systems leveraging bank statement data  Skills    Programming Languages GenAI/LLM Tools DevOps \u0026amp; Observability     Golang langgraph Docker   Python langchain Kubernetes   C/C++ langfuse Terraform   TypeScript  AWS     GCP     Prometheus     Grafana    Frontend: ReactJS\nBackend: gorilla/mux, echo, gin-gonic, kubebuilder\nContact Me You can reach out to me @ ravikirankilingar@gmail.com\nResume Link\n GitHub: rkilingr LinkedIn: in/rkilingr  ","permalink":"https://rkilingar.me/aboutme/","summary":"Quick Summary Senior Software Engineer specializing in cloud infrastructure and observability. Currently driving platform improvements at Intuit where I\u0026rsquo;ve saved ~$1.8M through Karpenter-based node autoscaling and built LLM-powered agentic workflows for incident management.\nExperience Highlights Intuit (Nov 2021 – Present)\n Senior Software Engineer on Cloud Infrastructure Team Decreased cloud costs by 30% and saved ~$1.8M Built LLM-based agentic workflows for incident management Led fleet-wide Kubernetes upgrades across organization Managed 10+ cluster addon components  ZopSmart Technologies Pvt Ltd.","title":"About Me"}]