<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: dacbreakpoint</title>
    <description>The latest articles on DEV Community by dacbreakpoint (@dacbreakpoint).</description>
    <link>https://dev.to/dacbreakpoint</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%2F866230%2F056ccd12-90f6-4303-92c6-afd2d7147d63.jpeg</url>
      <title>DEV Community: dacbreakpoint</title>
      <link>https://dev.to/dacbreakpoint</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dacbreakpoint"/>
    <language>en</language>
    <item>
      <title>Increased productivity with IntelliJs Issue Navigation</title>
      <dc:creator>dacbreakpoint</dc:creator>
      <pubDate>Thu, 26 May 2022 10:06:59 +0000</pubDate>
      <link>https://dev.to/dacbreakpoint/increased-productivity-with-intellij-s-issue-navigation-4k9n</link>
      <guid>https://dev.to/dacbreakpoint/increased-productivity-with-intellij-s-issue-navigation-4k9n</guid>
      <description>&lt;p&gt;Today I want to present you a handy feature within &lt;a href="https://www.jetbrains.com/idea/"&gt;IntelliJ IDEA&lt;/a&gt; that will make your everyday work easier when trying to understand specific code parts.&lt;/p&gt;

&lt;p&gt;It enables you to navigate directly from the &lt;em&gt;Version Control&lt;/em&gt; or &lt;em&gt;Annotate-Sidebar&lt;/em&gt; to the corresponding JIRA-Page by simply clicking at the ticket-id, when the id-pattern is detected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ASEUI8nz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/649qvdodkubvfjv7uf3f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ASEUI8nz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/649qvdodkubvfjv7uf3f.png" alt="IntelliJ, Issue Navigation" width="880" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Case
&lt;/h2&gt;

&lt;p&gt;When working in a corporate environment, bigger team or project, you probably use an &lt;strong&gt;Issue Tracking Software&lt;/strong&gt; like &lt;a href="https://www.atlassian.com/software/jira"&gt;Atlassian JIRA&lt;/a&gt;. Depending on how strict your commit rules are, you will have to write the ticket number within the commit messages. This common practice will help other people to understand the context of the change better. Furthermore, when looking at a ticket, there is a detailed description and maybe a discussion within the comment section,  which will help to understand why certain decisions were made.&lt;/p&gt;

&lt;p&gt;During software development, you will stumble across code that you want to understand in more detail. Therefore you are probably using the &lt;em&gt;Annotate with Git Blame&lt;/em&gt; feature to get more insights of the current line or section. When there is a ticket number in the commit message, you probably copy it out, navigate manually to JIRA, and paste the ticket number into the search bar.&lt;br&gt;
IntelliJ´s &lt;a href="https://www.jetbrains.com/help/idea/settings-version-control-issue-navigation.html"&gt;&lt;strong&gt;Issue Navigation&lt;/strong&gt;&lt;/a&gt; feature is the solution for this manual and annoying process. It maps the ticket-id with the JIRA page and makes the ticket-ids clickable across the whole IDE.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improves your productivity&lt;/li&gt;
&lt;li&gt;Well integrated into the IDE&lt;/li&gt;
&lt;li&gt;It makes the everyday work easier&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;You can enable and configure the issue navigation within the settings menu.&lt;br&gt;
It is possible to check if your expression is working by entering your ticket-id in the &lt;em&gt;Example&lt;/em&gt; section and you will see if the issue link is generated correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expression:&lt;/strong&gt; &lt;code&gt;[A-Za-z\d]+-\d+&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link:&lt;/strong&gt; &lt;code&gt;https://example.atlassian.net/browse/$0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U_NOy47F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/deme87u45mn685c0acdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U_NOy47F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/deme87u45mn685c0acdy.png" alt="IntelliJ, Configure Issue Navigation" width="880" height="527"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Thank you for reading! If you know other less-known tips or have feedback to share, feel free to write it in the comments.&lt;br&gt;
You’re also welcome to share this guide with other friends and colleagues. Thanks!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tooling</category>
      <category>intellij</category>
      <category>tips</category>
    </item>
    <item>
      <title>Setup your private LanguageTool server</title>
      <dc:creator>dacbreakpoint</dc:creator>
      <pubDate>Sun, 22 May 2022 17:04:46 +0000</pubDate>
      <link>https://dev.to/dacbreakpoint/setup-your-private-languagetool-server-4l9o</link>
      <guid>https://dev.to/dacbreakpoint/setup-your-private-languagetool-server-4l9o</guid>
      <description>&lt;h1&gt;
  
  
  General
&lt;/h1&gt;

&lt;p&gt;This year I started my new job in my first English-speaking company. As a senior software engineer, I have to write many emails, complex task- and bug descriptions and create presentations about various topics. Therefore it is great to have an assistant to improve my grammar and spelling.&lt;/p&gt;

&lt;p&gt;When looking at some great applications I stumbled across LanguageTool -  an &lt;strong&gt;open-source&lt;/strong&gt; grammar, style and spell checker. To increase your privacy and be the owner of your data, it is possible to host your &lt;strong&gt;own instance&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This blog post will guide you through the setup and configuration.&lt;/p&gt;

&lt;h1&gt;
  
  
  LanguageTool and Grammarly
&lt;/h1&gt;

&lt;p&gt;From time to time, I also write emails that contain &lt;strong&gt;sensitive&lt;/strong&gt; information and I developed an awareness of how often these tools are going to process this critical information. I was getting the uncomfortable feeling that this data could be &lt;strong&gt;intercepted&lt;/strong&gt; or &lt;strong&gt;used&lt;/strong&gt; in some way I did not want. &lt;/p&gt;

&lt;p&gt;When using closed source software, you have to trust the company and as soon as they store the data on their server - the data is out of my hand. When writing a blog post about LanguageTool, I have to be fair and mention Grammarly. From my &lt;strong&gt;personal experience&lt;/strong&gt;, it is much more powerful and the premium features "readability" and "fluency" are really good. The &lt;a href="https://www.grammarly.com/privacy-policy"&gt;Privacy Policy&lt;/a&gt; from Grammarly says that they don't sell my "information".&lt;/p&gt;

&lt;p&gt;LanguageTool comes with its &lt;strong&gt;own embedded HTTP server&lt;/strong&gt; so that a text can send to your own instance of LanguageTool. It is also possible to write your own application and use the &lt;a href="https://languagetool.org/http-api/swagger-ui/#!/default/"&gt;HTTP API&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Installation
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Docker Compose
&lt;/h2&gt;

&lt;p&gt;I like to host every application within a dedicated &lt;em&gt;docker-compose&lt;/em&gt; file. When doing so, the HTTP reverse proxy &lt;a href="https://github.com/traefik/traefik"&gt;traefik&lt;/a&gt; integrates very well with docker and enables you a dynamic configuration - it is worth taking a look!&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Infrastructure with docker, docker-compose and traefik&lt;/li&gt;
&lt;li&gt;Approximately 20 GB of free storage&lt;/li&gt;
&lt;li&gt;Prepare your n-gram datasets

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://languagetool.org/download/ngram-data/"&gt;Download&lt;/a&gt; the n-gram datasets onto your server - I am using the &lt;code&gt;de&lt;/code&gt; and &lt;code&gt;en&lt;/code&gt; dataset for my daily work which is consuming &lt;strong&gt;18 GB&lt;/strong&gt; in total! "n-gram" data sets are used to detect errors with words. For more information, see &lt;a href="https://dev.languagetool.org/finding-errors-using-n-gram-data"&gt;here&lt;/a&gt; and &lt;a href="http://storage.googleapis.com/books/ngrams/books/datasetsv2.html"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ensure that you have the following folder structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;├── languagetool &lt;span class="c"&gt;# base folder&lt;/span&gt;
│   ├── docker-compose.yml &lt;span class="c"&gt;# configuration file&lt;/span&gt;
│   └── ngrams
│       ├── de &lt;span class="c"&gt;# downloaded n-gram data for de&lt;/span&gt;
│       │   ├── 1grams
│       │   ├── 2grams
│       │   └── 3grams
│       └── en
│           ├── 1grams
│           ├── 2grams
│           └── 3grams
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  docker-compose.yml
&lt;/h3&gt;

&lt;p&gt;Following, you can see &lt;em&gt;my personal&lt;/em&gt; &lt;code&gt;docker-compose.yml&lt;/code&gt;, which you can use as a reference. For a more detailed description, you can look at the image description &lt;a href="https://hub.docker.com/r/erikvl87/languagetool"&gt;erikvl87/languagetool&lt;/a&gt;.&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;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;languagetool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;languagetool&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;erikvl87/languagetool&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;langtool_languageModel=/ngrams&lt;/span&gt;  &lt;span class="c1"&gt;# OPTIONAL: Using ngrams data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Java_Xms=512m&lt;/span&gt;  &lt;span class="c1"&gt;# OPTIONAL: Setting a minimal Java heap size of 512 mib&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Java_Xmx=1g&lt;/span&gt;  &lt;span class="c1"&gt;# OPTIONAL: Setting a maximum Java heap size of 1 Gib&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./ngrams:/ngrams&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;8010&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;traefik.enable=true&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;traefik.http.services.languagetool.loadbalancer.server.port=8010&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;traefik.http.routers.languagetool-http.rule=Host(`languagetool.example.com`)&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;traefik.http.routers.languagetool-http.entrypoints=web&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;traefik.http.routers.languagetool-http.middlewares=resecure@file&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;traefik.http.routers.languagetool-https.rule=Host(`languagetool.example.com`)&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;traefik.http.routers.languagetool-https.entrypoints=websecure&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;traefik.http.routers.languagetool-https.tls=true&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;traefik.http.routers.languagetool-https.tls.certresolver=le&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;traefik.docker.network=web&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once everything is up and running, you can verify container logs or query a test request like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s2"&gt;"language=en-US&amp;amp;text=a simple test"&lt;/span&gt; https://languagetool.example.com/v2/check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Using your own languagetool server
&lt;/h1&gt;

&lt;p&gt;LanguageTool is &lt;em&gt;well-integrated&lt;/em&gt; within popular browsers and various tools. When editing markdown files, I mainly use it within my primary browser &lt;em&gt;Google Chrome&lt;/em&gt; and within my source-code editor vscode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser-Plugin
&lt;/h2&gt;

&lt;p&gt;When using the LanguageTool browser-plugin, you need to navigate to the options-menue and setup your own LanguageTool server like this: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QUnYpmjf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cgaq1zsaju4tagfcmjwd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QUnYpmjf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cgaq1zsaju4tagfcmjwd.png" alt="LanguageTool, Browser plugin configuration" width="880" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Visual Studio Code Extension
&lt;/h2&gt;

&lt;p&gt;If you want language-tool support for your markdown files within &lt;strong&gt;vscode&lt;/strong&gt; you can use the &lt;a href="https://github.com/valentjn/vscode-ltex"&gt;LTEX Extension&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;It will provide &lt;em&gt;issue highlighting&lt;/em&gt;, supports &lt;em&gt;comment checking&lt;/em&gt; for many programming languages (opt-in) and you can use the &lt;em&gt;replacement suggestions&lt;/em&gt; via the quick-fixes dialog, which looks like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgAwaJ8M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qlg8p3a1dqvj4n8hkgwe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgAwaJ8M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qlg8p3a1dqvj4n8hkgwe.png" alt="vscode, replacement suggestion" width="880" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To use your &lt;strong&gt;own&lt;/strong&gt; LanguageTool server, you have to configure the root url within the &lt;code&gt;ltex.languageToolHttpServerUri&lt;/code&gt;setting:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9S1CggAg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kapd3sab4i5zk1l4qz5q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9S1CggAg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kapd3sab4i5zk1l4qz5q.png" alt="LanguageTool, Configure vscode extension" width="880" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>languagetool</category>
      <category>vscode</category>
    </item>
  </channel>
</rss>
