<?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: Khoi Doan (Osbkca)</title>
    <description>The latest articles on Forem by Khoi Doan (Osbkca) (@osbkca).</description>
    <link>https://forem.com/osbkca</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%2F774158%2F658bd421-ed7e-4e2b-bf3e-d2f87a31e048.jpeg</url>
      <title>Forem: Khoi Doan (Osbkca)</title>
      <link>https://forem.com/osbkca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/osbkca"/>
    <language>en</language>
    <item>
      <title>Top 4 Text Recognition Applications in 2024</title>
      <dc:creator>Khoi Doan (Osbkca)</dc:creator>
      <pubDate>Thu, 22 Feb 2024 01:45:15 +0000</pubDate>
      <link>https://forem.com/osbkca/top-4-text-recognition-applications-in-2024-8f7</link>
      <guid>https://forem.com/osbkca/top-4-text-recognition-applications-in-2024-8f7</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the ever-evolving landscape of technology, text recognition applications have become integral tools for various industries and everyday tasks. These applications leverage advanced machine learning and optical character recognition (OCR) technologies to extract and interpret text from images, documents, and other sources. As we step into 2024, let's explore the top five text recognition applications that are making a significant impact across different domains.&lt;/p&gt;

&lt;h3&gt;
  
  
  Xclippy
&lt;/h3&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%2Fb2pperq3p7w6z4y6hec4.jpg" 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%2Fb2pperq3p7w6z4y6hec4.jpg" alt="Xclippy App" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xclippy.com/"&gt;Xclippy.com&lt;/a&gt; remains at the forefront of text recognition applications in 2024. Known for its robust OCR capabilities. With support for multiple languages, Xclippy in accurately extracting text from images, videos, PDF and any documents making it a preferred choice for people looking to enhance their data processing workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  ABBYY FineReader
&lt;/h3&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%2Fpxq8mdqo9x0z1ud82flw.jpeg" 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%2Fpxq8mdqo9x0z1ud82flw.jpeg" alt="ABBYY FineReader" width="560" height="560"&gt;&lt;/a&gt;&lt;br&gt;
ABBYY FineReader has long been recognized as a powerhouse in OCR technology, and in 2024, it continues to hold its place among the top text recognition applications. This versatile tool is adept at converting scanned documents, PDFs, and images into editable and searchable formats. Its exceptional accuracy in recognizing various fonts, layouts, and languages makes it a go-to solution for businesses and individuals alike.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microsoft Azure Cognitive Services - Computer Vision
&lt;/h3&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%2Fue5ymwoh5h6bp9uyqput.jpeg" 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%2Fue5ymwoh5h6bp9uyqput.jpeg" alt="Microsoft Azure Cognitive Services - Computer Vision" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Microsoft's Azure Cognitive Services, particularly the Computer Vision API, is a comprehensive platform that includes powerful text recognition capabilities. With the ability to analyze and extract information from images and documents, this service is widely used in fields such as healthcare, finance, and legal industries. The integration of Azure Cognitive Services with other Microsoft products further enhances its appeal for organizations invested in the Microsoft ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adobe Acrobat DC
&lt;/h3&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%2F19b54f6p556zoyh30xnx.jpeg" 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%2F19b54f6p556zoyh30xnx.jpeg" alt="Adobe Acrobat DC" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
Adobe Acrobat DC, a well-established tool for working with PDF documents, incorporates advanced text recognition features. In 2024, Adobe has enhanced its OCR capabilities, allowing users to convert scanned documents and images into editable and searchable PDFs. With its intuitive interface and seamless integration with other Adobe Creative Cloud applications, Acrobat DC stands out as a preferred choice for professionals dealing with document workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As we navigate through 2024, text recognition applications continue to play a pivotal role in streamlining processes and improving efficiency across various industries. Whether it's extracting information from invoices, digitizing historical documents, or enhancing accessibility for visually impaired individuals, these applications contribute significantly to advancing technological capabilities. Choosing the right text recognition tool depends on specific use cases, requirements, and the level of customization needed, but the options highlighted above represent some of the top choices in the evolving landscape of text recognition in 2024.&lt;/p&gt;

</description>
      <category>ocr</category>
      <category>xclippy</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Boost Your Productivity with Xclippy - Clipboard Manager for macOS!</title>
      <dc:creator>Khoi Doan (Osbkca)</dc:creator>
      <pubDate>Mon, 04 Sep 2023 14:23:26 +0000</pubDate>
      <link>https://forem.com/osbkca/boost-your-productivity-with-xclippy-clipboard-manager-for-macos-10kd</link>
      <guid>https://forem.com/osbkca/boost-your-productivity-with-xclippy-clipboard-manager-for-macos-10kd</guid>
      <description>&lt;p&gt;Are you tired of juggling multiple copy-paste actions on your Mac? Say hello to seamless organization and efficiency with our advanced Clipboard Manager!&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Experience the Power of Xclippy&lt;/strong&gt;&lt;br&gt;
No more lost text snippets or forgotten URLs. Our Clipboard Manager for macOS empowers you to copy and store multiple items, making them readily accessible whenever you need them. Whether you're a student, a professional, or a creative enthusiast, our tool streamlines your workflow.&lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;Why Choose Xclippy?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Effortless Storage&lt;/strong&gt;: Store numerous text snippets, links, and images with a simple copy-paste.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent Organization&lt;/strong&gt;: Group related items, label them, and find what you need in an instant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search in a Flash&lt;/strong&gt;: Our intelligent search feature helps you locate your stored content quickly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy Matters&lt;/strong&gt;: Rest easy knowing your sensitive data remains on your device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seamless Integration&lt;/strong&gt;: Works harmoniously with your favorite apps, boosting your overall productivity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Hotkeys&lt;/strong&gt;: Use shortcuts for even quicker access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User-Friendly Interface&lt;/strong&gt;: Intuitive design for a smooth and enjoyable experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔥 &lt;strong&gt;Get Started Today and Simplify Your Workflow&lt;/strong&gt;&lt;br&gt;
Embrace the convenience of having your frequently used content at your fingertips. Whether you're a researcher, developer, writer, or multitasker, Xclippy enhances your Mac experience.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Try Xclippy Now&lt;/strong&gt;: &lt;a href="https://xclippy.com/"&gt;Xclippy&lt;/a&gt;&lt;/p&gt;

</description>
      <category>macos</category>
      <category>xclippy</category>
      <category>clipboard</category>
    </item>
    <item>
      <title>Build a docker image for backup Mysql database to AWS S3</title>
      <dc:creator>Khoi Doan (Osbkca)</dc:creator>
      <pubDate>Thu, 15 Dec 2022 10:13:04 +0000</pubDate>
      <link>https://forem.com/osbkca/build-a-docker-image-for-backup-mysql-database-to-aws-s3-1opf</link>
      <guid>https://forem.com/osbkca/build-a-docker-image-for-backup-mysql-database-to-aws-s3-1opf</guid>
      <description>&lt;p&gt;In this tutorial, we will build a docker image for cronjob on Kubernetes to auto backup Mysql database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let’s build a docker image with Dockerfile:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; mariadb:latest&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; curl unzip python3 python3-venv

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /usr/bin/python3 /usr/bin/python
&lt;span class="k"&gt;RUN &lt;/span&gt;curl &lt;span class="s2"&gt;"https://s3.amazonaws.com/aws-cli/awscli-bundle.zip"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"awscli-bundle.zip"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; unzip awscli-bundle.zip &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./awscli-bundle/install &lt;span class="nt"&gt;-i&lt;/span&gt; /usr/local/aws &lt;span class="nt"&gt;-b&lt;/span&gt; /usr/local/bin/aws
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; backup_to_s3.sh ./backup_to_s3.sh&lt;/span&gt;

&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; [ "./backup_to_s3.sh" ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this Dockerfile, we use &lt;code&gt;mariadb:latest&lt;/code&gt; to call &lt;code&gt;mysqldump&lt;/code&gt; . In addition, we also install aws-cli to be able to interact with AWS using the command line.&lt;/p&gt;

&lt;p&gt;File &lt;code&gt;backup_to_s3.sh&lt;/code&gt;&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;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Dump and upload to S3&lt;/span&gt;
&lt;span class="nv"&gt;FILE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;backup-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="s2"&gt;"+%Y-%m-%d-%H%M%S"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;.sql
mysqldump &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="nv"&gt;$DATABASE_HOST&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; 3306 &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nv"&gt;$DATABASE_USER&lt;/span&gt; &lt;span class="nt"&gt;--password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DATABASE_PASSWORD&lt;/span&gt; &lt;span class="nv"&gt;$DATABASE_NAME&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$FILE_NAME&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nv"&gt;$FILE_NAME&lt;/span&gt; s3://&lt;span class="nv"&gt;$AWS_S3_BUCKET&lt;/span&gt;/&lt;span class="nv"&gt;$FILE_NAME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don’t forget run &lt;code&gt;chmod a+x backup_to_s3.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; backup_mysql:latest &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I have posted this docker image to my Docker Hub account &lt;a href="https://hub.docker.com/r/osbkca/backup_mysql"&gt;osbkca/backup_mysql&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy a CronJob to Kubernetes&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;mysql-cronjob-backup.yaml&lt;/code&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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;batch/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CronJob&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auto-backup-mysql&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auto-backup-mysql&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;jobTemplate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;affinity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
          &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DATABASE_HOST&lt;/span&gt;
              &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;change_value&amp;gt;&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DATABASE_USER&lt;/span&gt;
              &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;change_value&amp;gt;&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DATABASE_PASSWORD&lt;/span&gt;
              &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;change_value&amp;gt;&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DATABASE_NAME&lt;/span&gt;
              &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;change_value&amp;gt;&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS_S3_BUCKET&lt;/span&gt;
              &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;change_value&amp;gt;&lt;/span&gt;
                        &lt;span class="s"&gt;- name&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;
              &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;change_value&amp;gt;&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;
              &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;change_value&amp;gt;&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;osbkca/backup_mysql:latest&lt;/span&gt;
            &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;backup-container&lt;/span&gt;

  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;12 09 * * *&lt;/span&gt;
  &lt;span class="na"&gt;successfulJobsHistoryLimit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;suspend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To deploy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; mysql-cronjob-backup.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enjoy it! More Info &lt;a href="https://osbkca.me/blog/build-a-docker-image-for-backup-mysql-database-to-aws-s3"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>osbkca</category>
    </item>
    <item>
      <title>Using kubectl to manage multi clusters</title>
      <dc:creator>Khoi Doan (Osbkca)</dc:creator>
      <pubDate>Thu, 08 Dec 2022 04:19:11 +0000</pubDate>
      <link>https://forem.com/osbkca/using-kubectl-to-manage-multi-clusters-51bk</link>
      <guid>https://forem.com/osbkca/using-kubectl-to-manage-multi-clusters-51bk</guid>
      <description>&lt;p&gt;The Kubernetes command-line tool, &lt;a href="https://kubernetes.io/docs/reference/kubectl/kubectl/"&gt;kubectl&lt;/a&gt;, allows you to run commands against Kubernetes clusters. You can use &lt;code&gt;kubectl&lt;/code&gt; to deploy applications, inspect and manage cluster resources, and view logs. For more information including a complete list of kubectl operations, see the &lt;a href="https://kubernetes.io/docs/reference/kubectl/"&gt;kubectl documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this tutorial, I want to share with you how to connect to multi Kubernetes Cluster by using &lt;code&gt;kubectl&lt;/code&gt; on a computer.&lt;/p&gt;

&lt;p&gt;For configuration, &lt;code&gt;kubectl&lt;/code&gt; looks for a file named &lt;code&gt;config&lt;/code&gt; in the &lt;code&gt;$HOME/.kube&lt;/code&gt; directory. To show current configuration, you run command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config view
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result:&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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;clusters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;certificate-authority-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DATA+OMITTED&lt;/span&gt;
    &lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://192.168.1.50:6443&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cluster-one.me&lt;/span&gt;
&lt;span class="na"&gt;contexts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cluster-one.me&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;khoidn&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cluster-one.me&lt;/span&gt;
&lt;span class="na"&gt;current-context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cluster-one.me&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Config&lt;/span&gt;
&lt;span class="na"&gt;preferences&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;osbkca&lt;/span&gt;
  &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;client-certificate-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;REDACTED&lt;/span&gt;
    &lt;span class="na"&gt;client-key-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;REDACTED&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In above configuration, we have one cluster cluster-one.me. If you have another cluster cluster-second.me with file config at ~/.kube/cluster-second.config . Use the following commands to merge configuration files.&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.kube/config:~/.kube/cluster-second.config
kubectl config view &lt;span class="nt"&gt;--flatten&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.kube/config_temp
&lt;span class="nb"&gt;mv&lt;/span&gt; ~/.kube/config_temp ~/.kube/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you run &lt;code&gt;kubectl config get-contexts&lt;/code&gt; to see the differences.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;CURRENT   NAME              CLUSTER            AUTHINFO   NAMESPACE
&lt;span class="k"&gt;*&lt;/span&gt;         cluster-one.me    cluster-one.me     osbkca
          cluster-second.me cluster-sencond.me osbkca
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can switch context of kubectl with the command &lt;code&gt;kubeclt config use-context cluster-sencond.me&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Wooow! Enjoy it. &lt;a href="https://osbkca.me/blog/using-kubectl-to-manage-multi-clusters"&gt;More info&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>osbkca</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Overview some concepts in Kubernetes (K8s)</title>
      <dc:creator>Khoi Doan (Osbkca)</dc:creator>
      <pubDate>Thu, 01 Dec 2022 10:19:05 +0000</pubDate>
      <link>https://forem.com/osbkca/overview-some-concepts-in-kubernetes-k8s-gib</link>
      <guid>https://forem.com/osbkca/overview-some-concepts-in-kubernetes-k8s-gib</guid>
      <description>&lt;p&gt;Hi everyone, In prev post, we already known overview about Kubernetes. In this tutorial, we will learn some core concepts in Kubernetes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pods - a group of one or more containers&lt;/strong&gt;&lt;br&gt;
Pods are the smallest deployable units in Kubernetes system. Pods locates in worker nodes where contains one or more containers. Each Pod like a logic machine ( have IP, hostname, process separate)&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%2Fuploads%2Farticles%2F6rlzjiuajb6h5c9h1yd9.png" 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%2Fuploads%2Farticles%2F6rlzjiuajb6h5c9h1yd9.png" alt="Pod overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do you need Pods?&lt;/strong&gt;&lt;br&gt;
You are wondering why not run containers in worker nodes? Actually, Pod is a high level of a container. With a Pod, you can run one or more containers which will have a IP and share a volume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basic Pod configuration.&lt;/strong&gt;&lt;br&gt;
To create a Pod in Kubernetes, we will config with a yaml file or json file. In this tutorial, I will use a yaml config file.&lt;/p&gt;

&lt;p&gt;Create a file with name &lt;code&gt;pods.yml&lt;/code&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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
 &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-name&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
 &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
 &lt;span class="pi"&gt;-&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;nginx&lt;/span&gt;
     &lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-name&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="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
     &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notes: Indentation is important in yaml file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;apiVersion&lt;/code&gt;: version of Kubernetes API&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kind&lt;/code&gt;: The component will be created (here is Pod)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;metadata&lt;/code&gt;: Give a name for Pod&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;spec&lt;/code&gt;: Describe about image, list containers, .. of the Pod
Run below command to create a Pod:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; pods.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To verify Pod was created, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Using labels in Pods&lt;/strong&gt;&lt;br&gt;
With big system, we have many pods in Kubernetes cluster. To manage effectively, we can use Labels to collect Pods to small groups.&lt;/p&gt;

&lt;p&gt;With Label have two attributes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;app: Example ui, order, …&lt;/li&gt;
&lt;li&gt;rel: Example stable, beta and canary&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2F8xrvll2j8czpnrd27ht8.png" 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%2Fuploads%2Farticles%2F8xrvll2j8czpnrd27ht8.png" alt="Pods with labels"&gt;&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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
 &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-name&lt;/span&gt;
 &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ui&lt;/span&gt;
   &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stable&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
 &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
 &lt;span class="pi"&gt;-&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;nginx&lt;/span&gt;
     &lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-name&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="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
     &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply this change by run below command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; pods.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To get all pods in Kubernetes with labels&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;--show-labels&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ReplicaSet&lt;/strong&gt;&lt;br&gt;
When a Pod run on Kubernetes, it may be shutdown or crash by many suddenly problems. ReplicaSet ensure that when Pod crashed, it will be created immediately again. ReplicaSet will maintain number of Pod which is declared in config file before. 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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ReplicaSet&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;frontend&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tier&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;frontend&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# modify replicas according to your case&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;tier&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;frontend&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;tier&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;frontend&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;php-redis&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;gcr.io/google_samples/gb-frontend:v3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notes: &lt;code&gt;matchLabels&lt;/code&gt; must match with labels in metadata of template section.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service&lt;/strong&gt;&lt;br&gt;
Service like a bridge between components in Kubernetes.&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%2Fuploads%2Farticles%2Fxew6e5bdmgcgel864p9f.png" 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%2Fuploads%2Farticles%2Fxew6e5bdmgcgel864p9f.png" alt="Service in Kubernetes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you know, the Pods have their own IP. Client can connect to the Pods by their IP or hostname. However, when you deploy a new version of Pod or ReplicaSet recreate new versions then IP of Pods will be changed. Furthermore, in Kubernetes has many Pods running at the same time, the clients should not all IPs of Pods. It only should know name of service.&lt;/p&gt;

&lt;p&gt;Read more at &lt;a href="https://osbkca.me/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>osbkca</category>
    </item>
    <item>
      <title>NextJS + Notion build a website</title>
      <dc:creator>Khoi Doan (Osbkca)</dc:creator>
      <pubDate>Tue, 04 Oct 2022 15:58:19 +0000</pubDate>
      <link>https://forem.com/osbkca/nextjs-notion-build-a-website-3849</link>
      <guid>https://forem.com/osbkca/nextjs-notion-build-a-website-3849</guid>
      <description>&lt;p&gt;&lt;strong&gt;Object&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I want to build a blog for myself or my SaSS with the lowest cost? I set the criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Good for SEO&lt;/li&gt;
&lt;li&gt;Having WYSIWUG (What you see is what you get)&lt;/li&gt;
&lt;li&gt;Easy for content editors management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;NextJS for build website&lt;/code&gt;&lt;br&gt;
Referring to good SEO we must mention the NextJS framework. You can build the APIs if you use NextJS, no need to understand too deeply in the project configuration. NextJS gives you a basic layout for your project. You can get started right away without having to install too many things.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Notion for database and editor&lt;/code&gt;&lt;br&gt;
If you've ever used Notion, you will surely be impressed with the way text is organized in Notion. You will be even more impressed if you use the editor on a page of Notion. After using it for a while, I came up with an idea: Why don't I use Notion as a CMS for my website. That's great, if you can do it, you can of course manage the editor with Notion, can use Notion's editor very easily and quickly. Imagine being able to drag and drop to change the position of text, upload images and save on website development fees. I used this stack to build &lt;a href="https://xclippy.com/blog"&gt;Xclippy Website&lt;/a&gt; with no cost :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/getting-started"&gt;Create NextJS App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@notionhq/client"&gt;Notion Library for NodeJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.notion.so/my-integrations"&gt;Create an app on Notion to get an credential&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Demo&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.facebook.com/100003737261345/videos/773599880518651/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VDuFELhY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://scontent.fhan14-3.fna.fbcdn.net/v/t15.5256-10/307194659_462886482437720_6186842375061365721_n.jpg%3Fstp%3Dc135.0.414.414a_dst-jpg_p552x414%26_nc_cat%3D104%26ccb%3D1-7%26_nc_sid%3D08638f%26_nc_ohc%3D64nTDDhJYPYAX819TQz%26tn%3D-3wKLNK6JWR5cMkU%26_nc_ht%3Dscontent.fhan14-3.fna%26oh%3D00_AT-AYPwz8lxGQ5xtitq1V8XF0UpwvbuJPHbBHQYi56fqHQ%26oe%3D63418E66" alt="Demo NextJS + Notion" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding!!&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>notion</category>
      <category>xclippy</category>
      <category>osbkca</category>
    </item>
    <item>
      <title>How to get file path from clipboard in ElectronJS</title>
      <dc:creator>Khoi Doan (Osbkca)</dc:creator>
      <pubDate>Mon, 26 Sep 2022 09:53:27 +0000</pubDate>
      <link>https://forem.com/osbkca/how-to-get-file-path-from-clipboard-in-electronjs-346b</link>
      <guid>https://forem.com/osbkca/how-to-get-file-path-from-clipboard-in-electronjs-346b</guid>
      <description>&lt;p&gt;To get file path of a file which you have copied on the your computer through ElectronJS depends on the operating system run the Electron application on.&lt;br&gt;
In this article, I work on two popular operating system MacOs  and Windows&lt;/p&gt;

&lt;p&gt;On MacOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;clipboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public.file-url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file://&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rawFilePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;clipboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;FileNameW&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rawFilePath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fromCharCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;g&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;clipboard&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;electron&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getFilePathFromClipboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;darwin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;clipboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;public.file-url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;file://&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;win32&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;clipboard&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FileNameW&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fromCharCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;g&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I used above code for my love app &lt;a href="https://xclippy.com"&gt;Xclippy&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  xclippy #osbkca
&lt;/h1&gt;

</description>
      <category>javascript</category>
      <category>electronjs</category>
      <category>clipboard</category>
      <category>xclippy</category>
    </item>
  </channel>
</rss>
