<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Roman Glushko</title>
    <description>The latest articles on Forem by Roman Glushko (@roma_glushko).</description>
    <link>https://forem.com/roma_glushko</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F133976%2F4461104c-1fa6-4d8c-ab82-c9ec952663f9.jpg</url>
      <title>Forem: Roman Glushko</title>
      <link>https://forem.com/roma_glushko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/roma_glushko"/>
    <language>en</language>
    <item>
      <title>What's OAuth2, anyway?</title>
      <dc:creator>Roman Glushko</dc:creator>
      <pubDate>Sun, 26 Jan 2025 13:30:51 +0000</pubDate>
      <link>https://forem.com/roma_glushko/whats-oauth2-anyway-3a70</link>
      <guid>https://forem.com/roma_glushko/whats-oauth2-anyway-3a70</guid>
      <description>&lt;p&gt;I have finally gotten a chance to dive into the weeds of the OAuth2 protocol and ask all why questions around its components and design 🙌&lt;/p&gt;

&lt;p&gt;I have posted my notes and thoughts as the article that covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤔Why do we need OAuth2 and what were the alternatives before it came?&lt;/li&gt;
&lt;li&gt;🤝The OAuth2 roles, the general workflow and TOFU&lt;/li&gt;
&lt;li&gt;🤖OAuth2 Client Applications, Static Registration and Credentials&lt;/li&gt;
&lt;li&gt;🔒Authorization Servers and their typical API&lt;/li&gt;
&lt;li&gt;🎟️Access tokens. Why do we need them?&lt;/li&gt;
&lt;li&gt;🔄 What’s the point of having access tokens and what they represent?&lt;/li&gt;
&lt;li&gt;📚OAuth2 Scopes. What do they really mean?&lt;/li&gt;
&lt;li&gt;💃 OAuth2 Authorization Code Flow. Why is it designed this way? The PKCE extension.&lt;/li&gt;
&lt;li&gt;💃 OAuth2 Implicit Flow. What’s so implicit about it? Why it was created in OAuth2.0 and deprecated in the OAuth2.1 Draft &lt;/li&gt;
&lt;li&gt;🤖 OAuth2 Client Credentials Flow or how to access the Resource Server on Client Application behalf? &lt;/li&gt;
&lt;li&gt;🔑 OAuth2 ROC Flow and why was it “deprecated” from day one?&lt;/li&gt;
&lt;li&gt;📟 OAuth2 Device Flow or how to do OAuth2 when there is no browser on your target device?&lt;/li&gt;
&lt;li&gt;🗺️ Guide how to pick the right flow for your use case&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.romaglushko.com/blog/whats-aouth2/" rel="noopener noreferrer"&gt;The full article ⬅️&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope someone find this helpful 🙌&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>standards</category>
      <category>authorization</category>
    </item>
    <item>
      <title>The Era of LLM Infrastructure</title>
      <dc:creator>Roman Glushko</dc:creator>
      <pubDate>Thu, 15 Feb 2024 21:18:36 +0000</pubDate>
      <link>https://forem.com/einstack/the-era-of-llm-infrastructure-5ai</link>
      <guid>https://forem.com/einstack/the-era-of-llm-infrastructure-5ai</guid>
      <description>&lt;p&gt;API access to large language models has opened up a world of opportunities. We have seen many simple proof-of-concept applications show promise in being effective. However, as the complexity of these applications grows, several crucial issues arise when putting these systems into production. These issues include unreliable API endpoints, slow token generation, LLM lock-in, and cost management. Clearly, the LLM era will require solutions to manage LLM API endpoints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://glide.einstack.ai/get-started/introduction"&gt;Glide&lt;/a&gt; is a cloud-native LLM gateway that provides a lightweight interface to manage the complexity of working with multiple LLM providers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfchxe2p122gzgt9iex1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfchxe2p122gzgt9iex1.png" alt="The new way of building GenAI apps" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Unified API
&lt;/h2&gt;

&lt;p&gt;Glide offers a comprehensive API that facilitates interaction with multiple LLM providers. Instead of dedicating considerable time and resources to developing custom integrations for individual LLM providers, Glide provides a single API interface that allows users to interact with any LLM provider. Adopting this approach can significantly &lt;strong&gt;enhance application development efficiency&lt;/strong&gt;. By working off a standardized API, engineers can minimize complexity and development time, leading to faster and more efficient application development. Additionally, there is zero LLM model lock-in, as underlying models can be switched without knowledge from the client application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Glide Routers
&lt;/h2&gt;

&lt;p&gt;A fundamental principle in Glide is the concept of routers. Routers enable you to group models together for shared logic. An excellent example of this is illustrated by a RAG power chatbot, which allows users to search over a documentation set. It is directly built on GPT-3.5 Turbo and entirely depends on OpenAI to keep its API operable. This dependency poses a significant risk to the application and user experience. Therefore, it is recommended to set up a Glide router in resilience mode by adding a single backup model to a router. If the OpenAI API fails, Glide will automatically send the API call to the next model specified in the configuration. In addition, &lt;strong&gt;model failure knowledge is shared across all routers&lt;/strong&gt;, reducing wasteful retries when an LLM provider has a known issue.&lt;/p&gt;

&lt;p&gt;Another essential router type is the least-latency router. This router selects the model with &lt;strong&gt;the lowest average latency per generated token&lt;/strong&gt;. Since we don’t know the actual distribution of model latencies, we attempt to estimate it and keep it updated over time. Over time, old latency data is weighted lower and eventually dropped from the calculation. This ensures latencies are constantly updated. As with all routers, if a model becomes unhealthy, it will pick the second-best, etc. &lt;/p&gt;

&lt;p&gt;Other routing modes are available, such as round-robin, which is excellent for A/B testing, and weighted round-robin, which helps specify the percentage of traffic that should be sent to a set of models.&lt;/p&gt;

&lt;p&gt;One Glide deployment can support multiple applications with diverse requirements since it can support numerous routers. There are also exciting routers on the roadmap, such as intelligent routing, which ensures your request is sent to the model best suited for that request. &lt;/p&gt;

&lt;h2&gt;
  
  
  Declarative Configuration
&lt;/h2&gt;

&lt;p&gt;Glide simplifies the setup process through declarative configuration, which defines the state of the Glide gateway in one place. This also means that secret management is centralized, enabling the rotation of API keys from a single location. &lt;/p&gt;

&lt;p&gt;Furthermore, this approach enables the separation of responsibilities between teams. One team can manage the infrastructure, deploy Glide, and make it available to other teams (such as AI/DS teams) while also being responsible for rotating keys. Meanwhile, other teams can solely focus on working with models and not worry about these configurations.&lt;/p&gt;

&lt;p&gt;Here is a bare-bones configuration example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;routers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-chat-app&lt;/span&gt;
      &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;priority&lt;/span&gt;
      &lt;span class="na"&gt;models&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;primary&lt;/span&gt;
          &lt;span class="na"&gt;openai&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-3.5-turbo"&lt;/span&gt;
            &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${env:OPENAI_API_KEY}&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;secondary&lt;/span&gt;
          &lt;span class="na"&gt;azureopenai&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${env:AZUREOAI_API_KEY}&lt;/span&gt;
            &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;glide-GPT-35"&lt;/span&gt; &lt;span class="c1"&gt;# the Azure OpenAI deployment name&lt;/span&gt;
            &lt;span class="na"&gt;base_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://mydeployment.openai.azure.com/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this simple configuration a priority/fallback router has been created. All requests will be sent to OpenAI, should the OpenAI API fail the request will be sent to an Azure OpenAI deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;The future of LLM applications will be multi-modal, with text, speech, and vision models employed together to create rich user experiences. Glide will be the go-to gateway for these applications. Glide plans to support various features over the next several months, including exact and semantic caching, embedding endpoints, speech endpoints, safety policies, and monitoring features.&lt;/p&gt;




&lt;p&gt;If you are interested in using Glide, here is a list of links for you to check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🛠️ Github: &lt;a href="https://github.com/EinStack/glide"&gt;https://github.com/EinStack/glide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 Docs: &lt;a href="https://glide.einstack.ai/"&gt;https://glide.einstack.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 Discord: &lt;a href="https://discord.gg/upVttzRfpn"&gt;https://discord.gg/upVttzRfpn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🗺️ Roadmap: &lt;a href="https://github.com/EinStack/glide/blob/develop/ROADMAP.md"&gt;https://github.com/EinStack/glide/blob/develop/ROADMAP.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>chatgpt</category>
      <category>genai</category>
      <category>llms</category>
      <category>llmops</category>
    </item>
    <item>
      <title>360-degree Review is Dead</title>
      <dc:creator>Roman Glushko</dc:creator>
      <pubDate>Mon, 26 Jul 2021 06:59:11 +0000</pubDate>
      <link>https://forem.com/roma_glushko/360-degree-review-is-dead-1c7e</link>
      <guid>https://forem.com/roma_glushko/360-degree-review-is-dead-1c7e</guid>
      <description>&lt;p&gt;No reasons to be sad about it, because there is a better ways to organize your feedback flow.&lt;/p&gt;

&lt;p&gt;I have shared my experience of 360 review applications in the real world and how I replaced it with a much more effective approaches.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.romaglushko.com/thoughts/360-review-is-dead/"&gt;https://www.romaglushko.com/thoughts/360-review-is-dead/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope this will be useful for someone 🙌&lt;/p&gt;

</description>
      <category>management</category>
    </item>
    <item>
      <title>Awesome List of Distributed System Projects</title>
      <dc:creator>Roman Glushko</dc:creator>
      <pubDate>Wed, 07 Jul 2021 07:38:29 +0000</pubDate>
      <link>https://forem.com/roma_glushko/awesome-list-of-distributed-system-projects-45ff</link>
      <guid>https://forem.com/roma_glushko/awesome-list-of-distributed-system-projects-45ff</guid>
      <description>&lt;p&gt;I have recently dug into distributed system design. I have found lots of open source projects to inspire from 💫&lt;/p&gt;

&lt;p&gt;So I decided to start composing an awesome list on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/roma-glushko/awesome-distributed-system-projects"&gt;https://github.com/roma-glushko/awesome-distributed-system-projects&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The list currently contains projects like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Databases (SQL, NoSQL, KV)&lt;/li&gt;
&lt;li&gt;Locking services&lt;/li&gt;
&lt;li&gt;Streaming Services&lt;/li&gt;
&lt;li&gt;Message Queues&lt;/li&gt;
&lt;li&gt;Task Schedulers&lt;/li&gt;
&lt;li&gt;File Systems&lt;/li&gt;
&lt;li&gt;OS, Service Discovery&lt;/li&gt;
&lt;li&gt;frameworks and components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the projects are written in Golang, some in Java, Erlang, C++ and a few in Python, Rust, Kotlin.&lt;/p&gt;

&lt;p&gt;Hope this is going to be helpful 🙌&lt;br&gt;
Feel free to give it a star if you like it and share your fav projects which is not yet on the list 🚀&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>architecture</category>
      <category>distributedservices</category>
      <category>go</category>
    </item>
    <item>
      <title>How to design LRU cache?</title>
      <dc:creator>Roman Glushko</dc:creator>
      <pubDate>Wed, 16 Jun 2021 12:57:28 +0000</pubDate>
      <link>https://forem.com/roma_glushko/how-to-design-lru-cache-2d3a</link>
      <guid>https://forem.com/roma_glushko/how-to-design-lru-cache-2d3a</guid>
      <description>&lt;p&gt;This is, by the way, not a random question, but a popular coding interview challenge and an interesting problem by itself which made me write a whole blog post:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.romaglushko.com/blog/design-lru-cache/"&gt;https://www.romaglushko.com/blog/design-lru-cache/&lt;/a&gt; ⬅️&lt;/p&gt;

&lt;p&gt;TLDR: you need to design a kind of custom data structure in order to make the cache storage to work in constant time which actually makes it practically useful. So be sure to check out the whole walkthrough above. &lt;/p&gt;

</description>
      <category>datastructures</category>
      <category>computerscience</category>
      <category>interviewquestions</category>
      <category>coding</category>
    </item>
    <item>
      <title>Learn Heaps via Visualizations</title>
      <dc:creator>Roman Glushko</dc:creator>
      <pubDate>Sun, 16 May 2021 08:31:46 +0000</pubDate>
      <link>https://forem.com/roma_glushko/learn-heaps-via-visualizations-2o35</link>
      <guid>https://forem.com/roma_glushko/learn-heaps-via-visualizations-2o35</guid>
      <description>&lt;p&gt;Heaps (or priority queues) are tree-based data structure that makes it fast to track order of retrieving priority items 🛠&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8s3wloy4ilf1gy486pwx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8s3wloy4ilf1gy486pwx.png" alt="Alt Text" width="800" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have reviewed how heaps work in depth in the following blog post ⬇️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.romaglushko.com/blog/heapify/"&gt;https://www.romaglushko.com/blog/heapify/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The article contains a lot of visualizations and could be a good way to understand how heaps work, especially for beginners. Also, heap is a popular topic on coding interviews.&lt;/p&gt;

&lt;p&gt;Hope it'll be helpful 🙌&lt;/p&gt;

</description>
      <category>datastructures</category>
      <category>computerscience</category>
      <category>interview</category>
    </item>
    <item>
      <title>How I built my deep learning workstation?</title>
      <dc:creator>Roman Glushko</dc:creator>
      <pubDate>Wed, 21 Apr 2021 15:17:58 +0000</pubDate>
      <link>https://forem.com/roma_glushko/how-i-built-my-deep-learning-workstation-2n5j</link>
      <guid>https://forem.com/roma_glushko/how-i-built-my-deep-learning-workstation-2n5j</guid>
      <description>&lt;p&gt;Recently I have managed to build my little deep learning workstation 🎉&lt;br&gt;
And I wanted to share my experience with you. So I wrote a blog post where tried to cover all aspects of building such a project including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reasons why I went for this&lt;/li&gt;
&lt;li&gt;PC parts selection&lt;/li&gt;
&lt;li&gt;hardware installation&lt;/li&gt;
&lt;li&gt;software and CUDA installation&lt;/li&gt;
&lt;li&gt;my current workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I feel like this may be helpful for enthusiasts like myself who think about own GPU-accelerated machine:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.romaglushko.com/blog/how-i-built-my-ml-workstation/"&gt;https://www.romaglushko.com/blog/how-i-built-my-ml-workstation/&lt;/a&gt; ⬅️&lt;/p&gt;

&lt;p&gt;I hope this will be helpful. Let me know what do you think in the comments!&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>deeplearning</category>
      <category>hardware</category>
      <category>computers</category>
    </item>
    <item>
      <title>Tango is on the scene 💃</title>
      <dc:creator>Roman Glushko</dc:creator>
      <pubDate>Sun, 23 Feb 2020 09:37:36 +0000</pubDate>
      <link>https://forem.com/roma_glushko/tango-is-on-the-scene-1hl2</link>
      <guid>https://forem.com/roma_glushko/tango-is-on-the-scene-1hl2</guid>
      <description>&lt;p&gt;Everybody, Tango is on the scene 💃&lt;/p&gt;

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

&lt;p&gt;I have released a simple CLI tool to streamline access log analyzing workflow 🎉&lt;/p&gt;

&lt;p&gt;Wondering what's inside?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/roma-glushko/tango" rel="noopener noreferrer"&gt;https://github.com/roma-glushko/tango&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tango is designed to generate different reports to be helpful during log analyzing routine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;analyzing how incoming traffic affects website performance&lt;/li&gt;
&lt;li&gt;investigating security incidents and their impact on the website&lt;/li&gt;
&lt;li&gt;filtering/aggregating logs to get other kinds of insights from them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Currently, the following reports are available for you 🛠:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom Report: converts access logs to CSV format with the ability to filter records&lt;/li&gt;
&lt;li&gt;Geo Report: collects GEO information for all IPs that accessing the website with the ability to sort by countries and continents.&lt;/li&gt;
&lt;li&gt;Browser Report: groups requests by browsers/crawlers&lt;/li&gt;
&lt;li&gt;Request Report: see which URLs were requested and how many times on the website&lt;/li&gt;
&lt;li&gt;Pace Report: check how many requests were sent during a certain time frame by each IP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is possible to install Tango on macOS/Linux/Windows 📦&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS (via Homebrew)&lt;/span&gt;
brew tap roma-glushko/tango
brew &lt;span class="nb"&gt;install &lt;/span&gt;roma-glushko/tango/tango

&lt;span class="c"&gt;# Linux (via Snap)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;snap &lt;span class="nb"&gt;install &lt;/span&gt;tango

&lt;span class="c"&gt;# Windows (via Scoop)&lt;/span&gt;
scoop bucket add tango https://github.com/roma-glushko/scoop-tango.git
scoop &lt;span class="nb"&gt;install &lt;/span&gt;tango

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, here are some examples of usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# generate the pace report&lt;/span&gt;
tango pace &lt;span class="nt"&gt;-l&lt;/span&gt; access-log.log &lt;span class="nt"&gt;-r&lt;/span&gt; custom.csv

&lt;span class="c"&gt;# get all requests from 128.2.3.4 IP&lt;/span&gt;
tango &lt;span class="nt"&gt;--ip-filter&lt;/span&gt; &lt;span class="s2"&gt;"128.2.3.4"&lt;/span&gt; custom &lt;span class="nt"&gt;-l&lt;/span&gt; access-log.log &lt;span class="nt"&gt;-r&lt;/span&gt; custom.csv

&lt;span class="c"&gt;# get all requests to /newsletter/subscriber/new URL&lt;/span&gt;
tango &lt;span class="nt"&gt;--keep-uri-filter&lt;/span&gt; &lt;span class="s2"&gt;"/newsletter/subscriber/new/"&lt;/span&gt; custom &lt;span class="nt"&gt;-l&lt;/span&gt; access-log.log &lt;span class="nt"&gt;-r&lt;/span&gt; custom.csv

&lt;span class="c"&gt;# get all IPs that requested /admin URL with GEO data&lt;/span&gt;
tango &lt;span class="nt"&gt;--keep-uri-filter&lt;/span&gt; &lt;span class="s2"&gt;"/admin/"&lt;/span&gt; geo &lt;span class="nt"&gt;-l&lt;/span&gt; access-log.log &lt;span class="nt"&gt;-r&lt;/span&gt; custom.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Give it a try today and you won't be disappointed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/roma-glushko/tango" rel="noopener noreferrer"&gt;https://github.com/roma-glushko/tango&lt;/a&gt; 💃💃💃&lt;/p&gt;

</description>
      <category>server</category>
      <category>accesslogs</category>
      <category>go</category>
      <category>tool</category>
    </item>
  </channel>
</rss>
