<?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: cycool29</title>
    <description>The latest articles on DEV Community by cycool29 (@cycool29).</description>
    <link>https://dev.to/cycool29</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%2F724617%2Fd3bb6a05-619b-4c3e-8624-ae4f740e705e.jpeg</url>
      <title>DEV Community: cycool29</title>
      <link>https://dev.to/cycool29</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cycool29"/>
    <language>en</language>
    <item>
      <title>Storing Large Files on GitHub with Git LFS</title>
      <dc:creator>cycool29</dc:creator>
      <pubDate>Fri, 11 Aug 2023 15:06:05 +0000</pubDate>
      <link>https://dev.to/cycool29/storing-large-files-on-github-with-git-lfs-2d31</link>
      <guid>https://dev.to/cycool29/storing-large-files-on-github-with-git-lfs-2d31</guid>
      <description>

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Understanding the Challenge&lt;/li&gt;
&lt;li&gt;Introducing Git LFS&lt;/li&gt;
&lt;li&gt;Installation&lt;/li&gt;
&lt;li&gt;Set-up Git LFS&lt;/li&gt;
&lt;li&gt;How it Works?&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://ko-fi.com/cycool29" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcycool29%2Fcycool29%2Fraw%2Fmain%2Fgithubbutton_sm.svg" alt="ko-fi"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;GitHub has become the go-to platform for collaborative software development, allowing developers to work together seamlessly on projects of all sizes. &lt;/p&gt;

&lt;p&gt;However, when it comes to version control for projects that involve large files, the standard Git repository can fall short due to its limitations. &lt;/p&gt;

&lt;p&gt;This is where Git LFS (Large File Storage) comes into play. Git LFS is a fantastic solution that enables developers to manage and store large files efficiently within their GitHub repositories, without compromising on performance or slowing down the development process.&lt;/p&gt;

&lt;h2&gt;&lt;span id="understanding-the-challenge"&gt;Understanding the Challenge&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;Git, the distributed version control system that powers GitHub, was primarily designed to manage text-based source code files. While it excels at tracking changes in code, it struggles with large binary files like images, videos, audio files, and other non-text assets. Attempting to store large files directly in a Git repository can lead to several issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Large files can slow down cloning, pushing, and pulling operations, making collaboration and development inefficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Storing large files in a Git repository can quickly bloat its size, making it difficult to clone and maintain, especially for developers with limited bandwidth.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Traditional Git version control is based on changes within files. Storing binary files directly in the repository can cause issues with versioning, as even small changes can lead to complete file duplication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developers can encounter conflicts when attempting to merge or resolve differences in large binary files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub only allows up to 100MB file upload limit, which may not be enough for some large binary files.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;&lt;span id="introducing-git-lfs"&gt;Introduction Git LFS&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;Git LFS is an open-source extension to Git that addresses these challenges by providing an efficient way to manage large files in a Git repository. Instead of storing the actual content of large files in the repository, Git LFS stores pointers (or metadata) to these files. The actual file content is then stored on a remote server, typically provided by GitHub itself or other supported Git hosting platforms.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Git LFS stores large files on remote servers, allowing your repository to remain compact and fast, even when dealing with large binary files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloning, pushing, and pulling operations are significantly faster since you're only dealing with pointers to large files rather than the files themselves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By storing the actual binary files separately, you can keep your repository size manageable, which is crucial for maintaining a smooth development process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developers can collaborate without the burden of large files, avoiding the typical slowdowns and conflicts associated with them.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;&lt;span id="installation"&gt;Installation&lt;/span&gt;&lt;/h2&gt;

&lt;h3&gt;
  
  
  On Linux
&lt;/h3&gt;

&lt;p&gt;Debian and RPM packages are available from packagecloud, see the &lt;a href="https://github.com/git-lfs/git-lfs/blob/main/INSTALLING.md" rel="noopener noreferrer"&gt;Linux installation instructions&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  On macOS
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://brew.sh" rel="noopener noreferrer"&gt;Homebrew&lt;/a&gt; bottles are distributed and can be installed via &lt;code&gt;brew install git-lfs&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  On Windows
&lt;/h3&gt;

&lt;p&gt;Git LFS is included in the distribution of &lt;a href="https://gitforwindows.org/" rel="noopener noreferrer"&gt;Git for Windows&lt;/a&gt;.&lt;br&gt;
Alternatively, you can install a recent version of Git LFS from the &lt;a href="https://chocolatey.org/" rel="noopener noreferrer"&gt;Chocolatey&lt;/a&gt; package manager.&lt;/p&gt;
&lt;h3&gt;
  
  
  From binary
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/git-lfs/git-lfs/releases" rel="noopener noreferrer"&gt;Binary packages&lt;/a&gt; are&lt;br&gt;
available for Linux, macOS, Windows, and FreeBSD.&lt;br&gt;
The binary packages include a script which will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Git LFS binaries onto the system &lt;code&gt;$PATH&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;git lfs install&lt;/code&gt; to perform required global configuration changes.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ./install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Note that Debian and RPM packages are built for multiple Linux distributions and versions for both amd64 and i386.&lt;br&gt;
For arm64, only Debian packages are built and only for recent versions due to the cost of building in emulation.&lt;/p&gt;
&lt;h3&gt;
  
  
  From source
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ensure you have the latest version of Go, GNU make, and a standard Unix-compatible build environment installed.&lt;/li&gt;
&lt;li&gt;On Windows, install &lt;code&gt;goversioninfo&lt;/code&gt; with &lt;code&gt;go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@latest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;make&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Place the &lt;code&gt;git-lfs&lt;/code&gt; binary, which can be found in &lt;code&gt;bin&lt;/code&gt;, on your system’s executable &lt;code&gt;$PATH&lt;/code&gt; or equivalent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;&lt;span id="set-up-git-lfs"&gt;Set-up Git LFS&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;After installation, &lt;code&gt;cd&lt;/code&gt; into your repository and configure your repository to use Git LFS by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git lfs install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Selecting Large Files
&lt;/h3&gt;

&lt;p&gt;Determine which files in your cloned local repository need to be tracked using Git LFS. Git LFS can be used when you want to version large files, usually, valuable output data, which is larger than the Github limit (100Mb). These files can be plain text or binaries.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Track Files: To start tracking large files, use the command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   git lfs track "&amp;lt;file_pattern&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command tells Git LFS to manage files matching the specified pattern.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Commit and Push: After tracking the necessary files, commit and push your changes to the repository.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git commit
   git add &lt;span class="nb"&gt;.&lt;/span&gt;
   git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all! Git LFS will handle the rest, replacing the large files with pointers.&lt;/p&gt;

&lt;h2&gt;&lt;span id="how-it-works"&gt;How it Works?&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;Git LFS operates on a simple yet ingenious principle: it offloads the storage and management of large files from the primary Git repository.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Instead of storing large files directly, Git LFS generates small pointer files containing metadata about the files. These pointers replace the actual content in the repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Large files are hosted on an external Git LFS server, either GitHub's or a custom one you set up. The pointer files reference the server's location.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you clone a repository or fetch updates, only the pointer files are transferred initially, making the process quick and efficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As you work, Git LFS fetches the actual large file content from the server only when needed, keeping your local repository light.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Git LFS is a game-changer for teams working with large files in Git repositories. By separating file pointers from the actual content, Git LFS optimizes storage, enhances performance, and streamlines collaboration. Whether you're building a game with high-resolution assets, working on video production, or dealing with any project involving large binary files, Git LFS can help you maintain a lean repository without sacrificing version control capabilities. Embrace the power of Git LFS to unlock the full potential of version control for projects of all sizes.&lt;/p&gt;

&lt;p&gt;Thanks for reading! 😎&lt;/p&gt;




&lt;p&gt;If you find this article helpful, consider buying me a coffee!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/cycool29" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcycool29%2Fcycool29%2Fraw%2Fmain%2Fko-fi.png" alt="ko-fi"&gt;&lt;/a&gt; &lt;/p&gt;

</description>
      <category>gitlfs</category>
      <category>git</category>
      <category>github</category>
      <category>largefiles</category>
    </item>
    <item>
      <title>ConfigParser - manage user-editable settings for your Python programs</title>
      <dc:creator>cycool29</dc:creator>
      <pubDate>Mon, 04 Apr 2022 10:12:23 +0000</pubDate>
      <link>https://dev.to/cycool29/configparser-manage-user-editable-settings-for-your-python-programs-3a88</link>
      <guid>https://dev.to/cycool29/configparser-manage-user-editable-settings-for-your-python-programs-3a88</guid>
      <description>

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is ConfigParser?&lt;/li&gt;
&lt;li&gt;What does a ConfigParser INI file look like?&lt;/li&gt;
&lt;li&gt;How to read configs?&lt;/li&gt;
&lt;li&gt;how to write configs?&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;User-configurable settings are important for big applications. They make your application more user-friendly and improve the efficiency of your application.&lt;/p&gt;

&lt;p&gt;But you may be curious, &lt;strong&gt;where and how to store those configurations?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here I am gonna introduce you &lt;strong&gt;&lt;a href="https://docs.python.org/3/library/configparser"&gt;ConfigParser&lt;/a&gt;&lt;/strong&gt;, one of the standard libraries in Python 3, which is used to save settings for your Python applications.&lt;/p&gt;

&lt;h2&gt;&lt;span id="what-is-configparser"&gt;What exactly is ConfigParser? 🤔&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.python.org/3/library/configparser.html"&gt;ConfigParser&lt;/a&gt; is a Python 3 standard library (You can install it on Python2 by doing &lt;code&gt;pip install configparser&lt;/code&gt;) that implements a basic configuration language for Python programs. &lt;br&gt;
The file format used by ConfigParser is &lt;code&gt;INI&lt;/code&gt; file, which is similar to the format used by older versions of Microsoft Windows. &lt;/p&gt;

&lt;p&gt;The configuration files are organized into sections, and each section can contain name-value pairs for configuration data. The section names are delimited with &lt;code&gt;[]&lt;/code&gt; characters. The pairs are separated either with &lt;code&gt;:&lt;/code&gt; or &lt;code&gt;=&lt;/code&gt;. Comments start either with &lt;code&gt;#&lt;/code&gt; or with &lt;code&gt;;&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;&lt;span id="what-does-ini-file-look-like"&gt;What does a ConfigParser INI file look like? 🧐&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;I think the example from the &lt;a href="https://docs.python.org/3/library/configparser.html#supported-ini-file-structure"&gt;official docs&lt;/a&gt; is the perfect one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Simple Values]
key=value
spaces in keys=allowed
spaces in values=allowed as well
spaces around the delimiter = obviously
you can also use : to delimit keys from values

[All Values Are Strings]
values like this: 1000000
or this: 3.14159265359
are they treated as numbers? : no
integers, floats and booleans are held as: strings
can use the API to get converted values directly: true

[Multiline Values]
chorus: I'm a lumberjack, and I'm okay
    I sleep all night and I work all day

[No Values]
key_without_value
empty string value here =

[You can use comments]
# like this
; or this

# By default only in an empty line.
# Inline comments can be harmful because they prevent users
# from using the delimiting characters as parts of values.
# That being said, this can be customized.

    [Sections Can Be Indented]
        can_values_be_as_well=True
        does_that_mean_anything_special=False
        purpose=formatting for readability
        multiline_values=are
            handled just fine as
            long as they are indented
            deeper than the first line
            of a value
        # Did I mention we can indent comments, too?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That says it all, right?&lt;/p&gt;

&lt;h2&gt;&lt;span id="how-to-read-config"&gt;How to read config from ConfigParser INI file? 📄&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;This is the sample INI file we are using, name it as &lt;code&gt;configurations.ini&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[DEFAULT]&lt;/span&gt;
&lt;span class="py"&gt;host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;
&lt;span class="py"&gt;log&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;True&lt;/span&gt;

&lt;span class="nn"&gt;[MySQL]&lt;/span&gt;
&lt;span class="py"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;4000&lt;/span&gt;
&lt;span class="py"&gt;user&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;john&lt;/span&gt;
&lt;span class="py"&gt;passwd&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;IDontwannatellyouhehe123&lt;/span&gt;

&lt;span class="nn"&gt;[Postgresql]&lt;/span&gt;
&lt;span class="py"&gt;user&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;peter&lt;/span&gt;
&lt;span class="py"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="py"&gt;passwd&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;AnotherPasswd22223&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First, we need to import the ConfigParser module, create a ConfigParser object, and read from an &lt;code&gt;INI&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;configparser&lt;/span&gt;

&lt;span class="n"&gt;configs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;configparser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConfigParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'configurations.ini'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the configs are initialized as an object. Let's see how we can the values in it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Get a value from a section
&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'Postgresql'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# returns: 'peter'
&lt;/span&gt;
&lt;span class="c1"&gt;# Assign it to variable
&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'Postgresql'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# returns: 'peter'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To check what sections do we have in the INI file, do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# List all sections in the INI file
&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# returns: ['MySQL', 'Postgresql']
&lt;/span&gt;
&lt;span class="c1"&gt;# See specific section is in the INI file
&lt;/span&gt;&lt;span class="s"&gt;'MySQL'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt; &lt;span class="c1"&gt;# returns: True
&lt;/span&gt;&lt;span class="s"&gt;'NotExistingSection'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt; &lt;span class="c1"&gt;# returns: False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see all value names in a section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'MySQL'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Returns: 
# port
# user
# passwd
# host
# log
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also generate a dictionary for values in a section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'MySQL'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# returns: [('host', 'localhost'), ('log', '1'), ('port', '4000'), ('user', 'john'), ('passwd', 'IDontwannatellyouhehe123')]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you may confuse - why did the &lt;code&gt;MySQL&lt;/code&gt; section contains &lt;code&gt;host&lt;/code&gt; and &lt;code&gt;log&lt;/code&gt; value? Are you having a typo there?&lt;/p&gt;

&lt;p&gt;No no no, that is &lt;strong&gt;magic&lt;/strong&gt; in ConfigParser, the values are in the &lt;code&gt;DEFAULT&lt;/code&gt; section (Note that section titles are cAsE-sEnSiTiVe), which is used to provide default values for &lt;strong&gt;all other sections&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Well, another thing you may notice is, why the &lt;code&gt;PORT&lt;/code&gt; value is printed in lowercase letters? &lt;/p&gt;

&lt;p&gt;That's because value names are case-insensitive, and all of them are stored in &lt;strong&gt;lowercase letters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One last note here: ALL values in ConfigParser are stored as &lt;strong&gt;strings&lt;/strong&gt;.&lt;br&gt;
Therefore, you will need to convert them manually if you want them to be some other data types. There are inbuilt functions for this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'MySQL'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;get_boolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'log'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# returns: True
&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'MySQL'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;get_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'port'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# returns: 4000
&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'MySQL'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;get_float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'port'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# returns: 4000.0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tips for &lt;code&gt;get_boolean()&lt;/code&gt; - the method is case-insensitive and recognizes Boolean values from 'yes'/'no', 'on'/'off', 'true'/'false', and '1'/'0'.&lt;/p&gt;

&lt;h2&gt;&lt;span id="how-to-write-config"&gt;OK... Now I know how to read the configs, but how to write configs to the INI file? ✍&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;It's SUPER easy, just assign them any string you want them to be, and write to the &lt;code&gt;configurations.ini&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;Here you go 😎:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Assign the values you want 
&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'MySQL'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'sam'&lt;/span&gt;

&lt;span class="c1"&gt;# Or you can use the `set` method
&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'Postgresql'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'log'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'False'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Write it to the file
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'configurations.ini'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;configfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;configfile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done! Now your settings are written in &lt;code&gt;configurations.ini&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if I want a new section or change the name of a section?
&lt;/h3&gt;

&lt;p&gt;You can use &lt;code&gt;add_section&lt;/code&gt; to create a new section, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_section&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'New Section Name'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Well, there is no way to directly &lt;strong&gt;rename&lt;/strong&gt; a section. But what you can do is &lt;strong&gt;create a new section&lt;/strong&gt;, &lt;strong&gt;copy values to the new section&lt;/strong&gt; and &lt;strong&gt;delete the old section&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Create a new section
&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_section&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'New Section'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Copy values to the new section
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'MySQL'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'New Section'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&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="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# Delete the new section
&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_section&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'MySQL'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks for reading! 😎&lt;/p&gt;




&lt;p&gt;If you find this article helpful, consider buying me a coffee!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/cycool29"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0RR4pkkd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/cycool29/cycool29/raw/main/ko-fi.png" alt="ko-fi" width="700" height="191"&gt;&lt;/a&gt; &lt;/p&gt;

</description>
      <category>python</category>
      <category>configs</category>
      <category>tutorial</category>
      <category>module</category>
    </item>
    <item>
      <title>How much do you earn from sponsoring?</title>
      <dc:creator>cycool29</dc:creator>
      <pubDate>Wed, 30 Mar 2022 09:19:25 +0000</pubDate>
      <link>https://dev.to/cycool29/how-much-do-you-earn-from-sponsoring-4apn</link>
      <guid>https://dev.to/cycool29/how-much-do-you-earn-from-sponsoring-4apn</guid>
      <description>&lt;p&gt;I am a student and I am finding ways to earn some money from blogging and maintaining GitHub projects. I found there are many sponsoring platforms nowadays, for example &lt;a href="//buymeacoffee.com"&gt;Buy me a Coffee&lt;/a&gt;, &lt;a href="//ko-fi.com"&gt;Ko-fi&lt;/a&gt;, &lt;a href="https://github.com/sponsors"&gt;GitHub Sponsor&lt;/a&gt; and &lt;a href="//patreon.com"&gt;Patreon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But does anyone really make money from that? &lt;br&gt;
How much do you earn from sponsoring every month?&lt;br&gt;
How long did you take to get your first sponsor?&lt;/p&gt;




&lt;p&gt;Anyway, if you are generous, consider buying me a coffee! 😎&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/cycool29"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ll2v0ujm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/cycool29/cycool29/raw/main/githubbutton_sm.svg" alt="ko-fi" width="223" height="30"&gt;&lt;/a&gt; &lt;/p&gt;

</description>
      <category>discuss</category>
      <category>sponsoring</category>
    </item>
    <item>
      <title>Understanding `__init__` Method in Python</title>
      <dc:creator>cycool29</dc:creator>
      <pubDate>Wed, 30 Mar 2022 01:44:20 +0000</pubDate>
      <link>https://dev.to/cycool29/understanding-init-method-in-python-3fko</link>
      <guid>https://dev.to/cycool29/understanding-init-method-in-python-3fko</guid>
      <description>

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is Object-Oriented Programming?&lt;/li&gt;
&lt;li&gt;What is &lt;code&gt;__init__&lt;/code&gt; method?&lt;/li&gt;
&lt;li&gt;Example usecase of &lt;code&gt;__init__&lt;/code&gt; method&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://ko-fi.com/cycool29"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ll2v0ujm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/cycool29/cycool29/raw/main/githubbutton_sm.svg" alt="ko-fi" width="223" height="30"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Whenever we have object oriented programming in Python, we mostly come across &lt;code&gt;__init__&lt;/code&gt; method which we usually don’t fully understand. &lt;/p&gt;

&lt;p&gt;Today, programmers are bound to come across Object-Oriented Programming (OOP) during their career. As a modern and popular programming language, Python provides all the means to implement the object-oriented philosophy. The &lt;code&gt;__init__&lt;/code&gt; method is at the core of Object-Oriented Programming and is one of the essential parts to create objects.&lt;/p&gt;

&lt;h2&gt;&lt;span id="what-is-oop"&gt;What is Object-Oriented Programming? 🧐&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;Before looking at &lt;code&gt;__init__&lt;/code&gt;, it's very helpful if we have the idea of what is &lt;strong&gt;Object-Oriented Programming (OOP)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Object Oriented programming (OOP) is a programming paradigm that relies on the concept of classes and objects. It is used to structure a software program into simple, reusable pieces of code blueprints (usually called classes), which are used to create individual instances of objects.&lt;/p&gt;

&lt;p&gt;An object is a collection of complex variables and functions and can be used to represent real entities like a button, an airplane, or a person.&lt;br&gt;
To declare, initialize, and manipulate objects in Python, we use classes. They serve as templates from which objects are created. &lt;/p&gt;

&lt;h2&gt;&lt;span id="what-is-init"&gt;Now the point comes... What is `__init__` method? 🤔&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;__init__&lt;/code&gt; method is a reseved method in Python classes. It is the Python equivalent of the C++ constructor in an object-oriented approach. When you create a new object of a class, Python automatically pass your arguments to the &lt;code&gt;__init__&lt;/code&gt; method and call it to &lt;strong&gt;initialize&lt;/strong&gt; the object’s attributes.&lt;br&gt;
The &lt;code&gt;__init__&lt;/code&gt; method lets the class initialize the object’s attributes and serves no other purpose. It is &lt;strong&gt;only used within classes&lt;/strong&gt;. &lt;/p&gt;

&lt;h2&gt;&lt;span id="example-usecase"&gt;Example usecase of `__init__` method 💡&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;Let's see how we can use &lt;code&gt;__init__&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;First, we create a &lt;code&gt;Book&lt;/code&gt; class, with a simple &lt;code&gt;__init__&lt;/code&gt; method to initialize informations of the book and a function to print the book info.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Initialize book informations
&lt;/span&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;print_book_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'Title: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'Author: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'Language: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we will create an object of the class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;book1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'Harry Potter and the Sorcerer Stone'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'JK. Rowling'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'English'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you create the object above, &lt;code&gt;__init__&lt;/code&gt; method was called and initialized the book infos.&lt;br&gt;
To prove that, let's print the book info.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;book1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print_book_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output should be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Title: Harry Potter and the Sorcerer Stone
Author: JK. Rowling
Language: English
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks for reading! 😎&lt;/p&gt;




&lt;p&gt;If you find this article helpful, consider buying me a coffee!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/cycool29"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0RR4pkkd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/cycool29/cycool29/raw/main/ko-fi.png" alt="ko-fi" width="700" height="191"&gt;&lt;/a&gt; &lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>init</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Setting up headless Raspberry Pi</title>
      <dc:creator>cycool29</dc:creator>
      <pubDate>Mon, 28 Feb 2022 06:08:34 +0000</pubDate>
      <link>https://dev.to/cycool29/setting-up-headless-raspberry-pi-1m9b</link>
      <guid>https://dev.to/cycool29/setting-up-headless-raspberry-pi-1m9b</guid>
      <description>

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is headless setup?&lt;/li&gt;
&lt;li&gt;Install OS to your SD card&lt;/li&gt;
&lt;li&gt;Enable VNC in your Raspberry Pi &lt;/li&gt;
&lt;li&gt;Connect VNC to your Raspberry Pi &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;You may just want to use your Raspberry Pi as a low-cost Linux computer.&lt;/p&gt;

&lt;p&gt;However, you will need a monitor, keyboard, mouse... etc. This will be associated with a huge amount of money (that's not &lt;em&gt;low-cost&lt;/em&gt; anymore...). 💰&lt;/p&gt;

&lt;p&gt;But, You may use a headless setup for your Pi to cut down all the cost. 😎&lt;/p&gt;

&lt;h2&gt;&lt;span id="what-is-headless-setup"&gt;What is headless setup? 🤔&lt;/span&gt;&lt;/h2&gt;    

&lt;p&gt;A headless setup is the Raspberry Pi minus the monitor, keyboard, and mouse. Running a headless setup lets us forego the extra peripherals and directly control the Raspberry Pi wirelessly from any other PC in local network.&lt;/p&gt;

&lt;p&gt;In this tutorial, you need to install &lt;a href="https://www.raspberrypi.org/software/" rel="noopener noreferrer"&gt;Raspberry Pi Imager&lt;/a&gt;, &lt;a href="https://angryip.org/download/" rel="noopener noreferrer"&gt;Angry IP Scanner&lt;/a&gt; and &lt;a href="https://www.realvnc.com/en/connect/download/viewer/" rel="noopener noreferrer"&gt;RealVNC Viewer&lt;/a&gt;.&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%2Fr5rzy0qgieffqb7sc2c4.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%2Fr5rzy0qgieffqb7sc2c4.png" alt="RPI Imager"&gt;&lt;/a&gt;&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%2Fro5zrvkykglulvmgneiy.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%2Fro5zrvkykglulvmgneiy.png" alt="Angry IP Scanner"&gt;&lt;/a&gt;&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%2Fdr34s3c98hf5vgyk7c3i.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%2Fdr34s3c98hf5vgyk7c3i.png" alt="RealVNC Viewer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;&lt;span id="install-os"&gt;Install OS to your SD card ⏬&lt;/span&gt;&lt;/h2&gt;    

&lt;p&gt;Your Raspberry Pi needs an operating system to work. If your SD card is not arrived with Raspberry Pi OS or NOOBS pre-installed, you will need to install an operating system into it first. &lt;/p&gt;

&lt;p&gt;Insert your SD card into the SD card slot or SD card reader of your &lt;strong&gt;external PC&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Open &lt;strong&gt;Raspberry Pi Imager&lt;/strong&gt;. You will use this tool to flash OS to your SD Card.  &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%2Fkwn63hzaygh5ywa271nb.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%2Fkwn63hzaygh5ywa271nb.png" alt="Raspberry Pi Imager"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;CHOOSE OS&lt;/strong&gt;.  &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%2Fw0v69lgvc8ww9xonsngw.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%2Fw0v69lgvc8ww9xonsngw.png" alt="Choose OS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose any OS you want to install on your Raspberry Pi. &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%2Fob28fgok557ioz1t5f99.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%2Fob28fgok557ioz1t5f99.png" alt="Choose OS"&gt;&lt;/a&gt;&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%2F6n4pcgw1n8buw7elzqrh.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%2F6n4pcgw1n8buw7elzqrh.png" alt="Choose OS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;CHOOSE STORAGE&lt;/strong&gt;.&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%2Flj4ob0ovjfdw3urje7qt.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%2Flj4ob0ovjfdw3urje7qt.png" alt="Choose Storage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose the SD card you want to flash to your Raspberry Pi.&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%2Ffsf1mc0omvekqhu67un5.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%2Ffsf1mc0omvekqhu67un5.png" alt="Choose Storage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, press Ctrl + Shift + X. This will open an &lt;strong&gt;Advanced options&lt;/strong&gt; dialog.&lt;/p&gt;

&lt;p&gt;Toggle on &lt;strong&gt;Enable SSH&lt;/strong&gt; and &lt;strong&gt;Use password authentication&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Create a &lt;strong&gt;login password&lt;/strong&gt; for your Raspberry Pi and fill it in the &lt;strong&gt;Set password for the 'pi' user&lt;/strong&gt; . You must remember it as we will need this password later for SSH login.&lt;/p&gt;

&lt;p&gt;If you are going to use WiFi for your Raspberry Pi's connection, toggle on &lt;strong&gt;Configure wifi&lt;/strong&gt; and configure your WiFi settings there. &lt;/p&gt;

&lt;p&gt;Lastly, check &lt;strong&gt;Set locale settings&lt;/strong&gt;. Choose your Time zone and Keyboard layout there and click &lt;strong&gt;Save&lt;/strong&gt;.&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%2Fcmqx40ktmblw8h9en1f1.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%2Fcmqx40ktmblw8h9en1f1.png" alt="Advanced options"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check all configurations are correct and click &lt;strong&gt;Write&lt;/strong&gt;. This will start writing the Raspberry Pi OS to the chosen SD Card. It might take a while so you may have a coffee break. &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%2Flcs91ynibna3ww6el0jz.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%2Flcs91ynibna3ww6el0jz.png" alt="Writing image to SD card"&gt;&lt;/a&gt;&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%2Fgoohgqiccbfc2tuu4imt.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%2Fgoohgqiccbfc2tuu4imt.png" alt="Verifying image is writen to SD card"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Now you have flashed an OS to your SD card. Safely unmount it and plug it into Raspberry Pi's SD card slot.&lt;/li&gt;
&lt;/ol&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%2Fsmoiqptrmjmal0n9a1fr.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%2Fsmoiqptrmjmal0n9a1fr.png" alt="Flash done"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;&lt;span id="enable-vnc"&gt;Enable VNC in your Raspberry Pi ✅&lt;/span&gt;&lt;/h2&gt;  

&lt;p&gt;Connect your Raspberry Pi to power source.&lt;/p&gt;

&lt;p&gt;Launch &lt;strong&gt;Angry IP Scanner&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Start&lt;/strong&gt; to discover your Raspberry Pi.&lt;/p&gt;

&lt;p&gt;You should see a list of IP addresses after scanning. Find &lt;code&gt;raspberrypi&lt;/code&gt; or &lt;code&gt;raspberrypi.local&lt;/code&gt; and note down the IP address.&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%2Fhoejjx9agohl11acgph6.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%2Fhoejjx9agohl11acgph6.png" alt="Ipscan scan result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exit Angry IP Scanner.&lt;/p&gt;

&lt;p&gt;If you are on Windows, you will need to enable OpenSSH first. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Settings, select Apps &amp;gt; Apps &amp;amp; Features, then select Optional Features.&lt;/li&gt;
&lt;li&gt;Scan the list to see if the OpenSSH is already installed. If not, at the top of the page, select Add a feature, then: Find OpenSSH Client, then click Install. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open a terminal window on your PC replacing &lt;code&gt;&amp;lt;IP&amp;gt;&lt;/code&gt; with the IP address of the Raspberry Pi you’re trying to connect to.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh pi@&amp;lt;IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the connection works you will see a security/authenticity warning. Type &lt;strong&gt;yes&lt;/strong&gt; to continue. You will only see this warning the first time you connect.&lt;/p&gt;

&lt;p&gt;You will be prompted for the password for the &lt;code&gt;pi&lt;/code&gt; login, enter the password you set just now in Raspberry Pi Imager.&lt;/p&gt;

&lt;p&gt;Now you should see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pi@raspberrypi ~ $
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can execute commands on your Pi. But there is no graphical desktop, yet.&lt;/p&gt;

&lt;p&gt;Enter &lt;code&gt;sudo raspi-config&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Do the following to enable VNC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Interfacing Options&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Scroll down and select &lt;strong&gt;VNC&lt;/strong&gt; &amp;gt; &lt;strong&gt;Yes&lt;/strong&gt;.&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%2Ffjuhdnr6szqgyi7smj97.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%2Ffjuhdnr6szqgyi7smj97.png" alt="Raspi-config VNC"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you have enabled VNC on your Raspberry Pi. Close the SSH session by entering &lt;code&gt;exit&lt;/code&gt; or just simply close the terminal window.&lt;/p&gt;

&lt;h2&gt;&lt;span id="connect"&gt;Connect VNC to your Raspberry Pi 🔗&lt;/span&gt;&lt;/h2&gt;    

&lt;p&gt;Launch &lt;strong&gt;RealVNC Viewer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;File &amp;gt; New connection&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Enter the IP address of your Raspberry Pi in &lt;strong&gt;VNC Server&lt;/strong&gt; field and give it a name in &lt;strong&gt;Name&lt;/strong&gt; field.&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%2F4mm9hzrbjcyqqwx21o4s.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%2F4mm9hzrbjcyqqwx21o4s.png" alt="VNC property"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Leave all other options default and click &lt;strong&gt;OK&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Right click at the property you just added and select &lt;strong&gt;Connect&lt;/strong&gt;&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%2F6q67j9ka26vevx67utck.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%2F6q67j9ka26vevx67utck.png" alt="VNC connecting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it prompts you this window, simply click &lt;strong&gt;Continue&lt;/strong&gt;.&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%2Fkh5z530ydf26xmnszmxw.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%2Fkh5z530ydf26xmnszmxw.png" alt="VNC warning"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fill &lt;strong&gt;pi&lt;/strong&gt; in the &lt;strong&gt;Username&lt;/strong&gt; field and your Raspberry Pi's password in the &lt;strong&gt;Password&lt;/strong&gt; field.&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%2Fnlfjdkof5shz22aoaw1e.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%2Fnlfjdkof5shz22aoaw1e.png" alt="VNC username password"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Finally, you will be presented with your Raspberry Pi desktop!&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%2Ft2gwpfd3rt2o7y5qrlq5.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%2Ft2gwpfd3rt2o7y5qrlq5.png" alt="VNC desktop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;BTW, today is the 10th anniversary of Raspberry Pi! &lt;br&gt;
Wish happy birthday to them in the comment box! 🎂&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1498221458815864834-434" src="https://platform.twitter.com/embed/Tweet.html?id=1498221458815864834"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1498221458815864834-434');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1498221458815864834&amp;amp;theme=dark"
  }



&lt;/p&gt;




&lt;p&gt;If you find this article helpful, consider buying me a coffee!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/cycool29" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcycool29%2Fcycool29%2Fraw%2Fmain%2Fko-fi.png" alt="ko-fi"&gt;&lt;/a&gt; &lt;/p&gt;

</description>
      <category>raspberrypi</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>linux</category>
    </item>
    <item>
      <title>Pi-Apps - The most powerful app store for Raspberry Pi</title>
      <dc:creator>cycool29</dc:creator>
      <pubDate>Fri, 25 Feb 2022 07:35:05 +0000</pubDate>
      <link>https://dev.to/cycool29/pi-apps-the-most-powerful-app-store-for-raspberry-pi-105l</link>
      <guid>https://dev.to/cycool29/pi-apps-the-most-powerful-app-store-for-raspberry-pi-105l</guid>
      <description>

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is Pi-Apps?&lt;/li&gt;
&lt;li&gt;How to install Pi-Apps?&lt;/li&gt;
&lt;li&gt;How to launch Pi-Apps?&lt;/li&gt;
&lt;li&gt;How to update Pi-Apps?&lt;/li&gt;
&lt;li&gt;Basic usage&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;While ago, I got my first Raspberry Pi. Like most of the Linux users (specifically, Raspberry Pi users) transferring from Windows, I am getting crazy with these questions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How to install emoji font on my pi?&lt;/p&gt;

&lt;p&gt;Why Discord is not supporting ARM architecture?&lt;/p&gt;

&lt;p&gt;The built-in screenshot tool really sucks... &lt;/p&gt;

&lt;p&gt;Where can I install ZOOM?????&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I found a bunch of tutorials online, but most of them are &lt;strong&gt;outdated&lt;/strong&gt;, and even &lt;strong&gt;broke my system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And... I found Pi-Apps! 🤩&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Botspot" rel="noopener noreferrer"&gt;
        Botspot
      &lt;/a&gt; / &lt;a href="https://github.com/Botspot/pi-apps" rel="noopener noreferrer"&gt;
        pi-apps
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Raspberry Pi App Store for Open Source Projects
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
    &lt;a href="https://pi-apps.io" rel="nofollow noopener noreferrer"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fproglogo.png%3Fraw%3Dtrue" alt="Pi-Apps logo"&gt;
    &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The most popular app store for Raspberry Pi computers. 100% free, open-source and written in shell scripts
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/Botspot/pi-apps/blob/master/CHANGELOG.md" rel="noopener noreferrer"&gt;
    View changelog&lt;/a&gt;
  |
  &lt;a href="https://pi-apps.io/wiki/getting-started/apps-list/" rel="nofollow noopener noreferrer"&gt;
    Apps List&lt;/a&gt;
  |
  &lt;a href="https://github.com/Botspot/pi-apps/issues/new?template=bug-report.yml" rel="noopener noreferrer"&gt;
    Report an error&lt;/a&gt;
  |
  &lt;a href="https://github.com/Botspot/pi-apps/issues/new?template=suggestion.yml" rel="noopener noreferrer"&gt;
    Make a general suggestion&lt;/a&gt;
  |
  &lt;a href="https://github.com/Botspot/pi-apps/issues/new?assignees=&amp;amp;labels=App+Request&amp;amp;template=app-suggestion.yml&amp;amp;title=EDIT+ME+Include+the+app+name" rel="noopener noreferrer"&gt;
    Suggest new app&lt;/a&gt;
  |
  &lt;a href="https://github.com/Botspot/pi-apps/issues/new?assignees=&amp;amp;labels=App+Request%2CZip%2FPR+included&amp;amp;template=app-submission.yml&amp;amp;title=EDIT+ME+Include+the+app+name+and+if+it+is+a+Package+app+or+an+Install+based+App" rel="noopener noreferrer"&gt;
    Submit a new app&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://github.com/Botspot/pi-apps/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7ef4ef46949fcef92f2a5693cc0a9d35cfb06c95fd5963c6e6afad5e6a076b35/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f426f7473706f742f70692d61707073" alt="stars"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/Botspot/pi-apps/network/members" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c57b064c4b487ac7d999385ac30ea55b7533f30d7dd07051a8c5b6934af5a6d4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f426f7473706f742f70692d61707073" alt="forks"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/Botspot/pi-apps/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d98159f1c0b4fcc413a4325befe68346fa1aa4a8a4250e30f6338e0170e0a290/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f426f7473706f742f70692d61707073" alt="contributors"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/Botspot/pi-apps/pulls" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b487d885008d55ee86003a6a181a4acf2320ce4909e80c7927b5e96608db9bea/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d70722f426f7473706f742f70692d61707073" alt="prs"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/Botspot/pi-apps/issues?q=is%3Aopen+is%3Aissue+label%3Abug" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e703dff0dae7c6dceed52f989fe1a26864fe0d39b610381e3f595ca7f67e5a4d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f426f7473706f742f70692d617070732f6275673f636f6c6f723d726564266c6162656c3d62756773"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/Botspot/pi-apps/issues?q=is%3Aopen+is%3Aissue+label%3A%22App+Request%22" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b01ef3ec528faaf8f7d69d52d4341544e54305ab6a7d0469b54113bb5fa38668/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f426f7473706f742f70692d617070732f417070253230526571756573743f636f6c6f723d477265656e266c6162656c3d6170702532307265717565737473"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/Botspot/pi-apps/blob/master/COPYING" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/09456e757dbda2ef3d841f37bb3d45449aac4c55bfbfb060d8d10499f88a1224/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f426f7473706f742f70692d61707073" alt="license"&gt;&lt;/a&gt;
    &lt;a href="https://discord.gg/RXSTvaUvuu" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cb6bf69120b8ae181a907e0c90ea30042596a00d351094ca6191874d44ca6a69/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3737303632393639373930393432343135392e7376673f636f6c6f723d373238396461266c6162656c3d446973636f7264253230736572766572266c6f676f3d646973636f7264" alt="Join the Discord server"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Made with ❤ by &lt;a href="https://github.com/Botspot" rel="noopener noreferrer"&gt;Botspot&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://github.com/theofficialgman" rel="noopener noreferrer"&gt;theofficialgman&lt;/a&gt;&lt;/strong&gt;, and &lt;a href="https://github.com/Botspot/pi-apps/graphs/contributors" rel="noopener noreferrer"&gt;contributors&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    Check out our website: &lt;a href="https://pi-apps.io" rel="nofollow noopener noreferrer"&gt;pi-apps.io&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Introduction&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Let's be honest: &lt;strong&gt;Linux is harder to master than Windows.&lt;/strong&gt; Sometimes it's not user-friendly, and following an outdated tutorial may break your Raspberry Pi's operating system.&lt;br&gt;
There is no centralized software repository, except for the &lt;code&gt;apt&lt;/code&gt; repositories which lack many desktop applications.&lt;br&gt;
Surely there is a better way! &lt;strong&gt;There is.&lt;/strong&gt;&lt;br&gt;
Introducing Pi-Apps, a well-maintained collection of app installation-scripts that you can run with &lt;strong&gt;one click&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pi-Apps now serves &lt;strong&gt;over 1,000,000 people&lt;/strong&gt; and hosts &lt;a href="https://pi-apps.io/wiki/getting-started/apps-list/" rel="nofollow noopener noreferrer"&gt;over 200 apps&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install Pi-Apps&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Open a terminal and run this command:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;wget -qO- https://raw.githubusercontent.com/Botspot/pi-apps/master/install &lt;span class="pl-k"&gt;|&lt;/span&gt; bash&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Botspot/pi-appsicons/screenshots/main%20window.png?raw=true"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-appsicons%2Fscreenshots%2Fmain%2520window.png%3Fraw%3Dtrue" height="270px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Supported systems:&lt;/h3&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Botspot/pi-apps" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Now I am able to install emoji fonts, a usable Discord client, a powerful screenshot tool, and even ZOOM Meeting client!&lt;/p&gt;



&lt;h2&gt;&lt;span id="what-is-pi-apps"&gt;What is Pi-Apps? 🤔&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;Pi-Apps is a well-maintained collection of app installation-scripts that you can run with one click. &lt;/p&gt;

&lt;p&gt;In short, it is an &lt;strong&gt;app store&lt;/strong&gt;.&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%2F9pabl9zu2vxpnetg85ow.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%2F9pabl9zu2vxpnetg85ow.png" alt="Main window"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unlike the tutorials or blog posts on the web, Pi-Apps has a beautiful GUI, constantly maintained scripts, bug reporting system, and &lt;a href="https://discord.gg/RXSTvaUvuu" rel="noopener noreferrer"&gt;a cheerful community&lt;/a&gt;! &lt;/p&gt;

&lt;p&gt;Pi-Apps now serves over &lt;strong&gt;1,000,000&lt;/strong&gt; people and hosts &lt;a href="https://github.com/Botspot/pi-apps/wiki/Apps-List" rel="noopener noreferrer"&gt;nearly 200 apps&lt;/a&gt;.&lt;/p&gt;



&lt;h2&gt;&lt;span id="how-to-install"&gt;Looks cool... How can I install it on my Pi? ⏬&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;Here is the one-liner command 😎 :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &lt;span class="nt"&gt;-qO-&lt;/span&gt; https://raw.githubusercontent.com/Botspot/pi-apps/master/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Supported systems:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.raspberrypi.com/software/operating-systems/" rel="noopener noreferrer"&gt;Raspberry Pi OS&lt;/a&gt; (32-bit/64-bit) (Buster/Bullseye)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully supported.

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


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href="https://twisteros.com/download.html" rel="noopener noreferrer"&gt;Twister OS&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully supported, preinstalled.

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


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Kali Linux, Ubuntu, Ubuntu Mate, any other Debian-based ARM OS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pi-Apps should mostly work but you may encounter errors for some apps.

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


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Android, ChromeOS, non-ARM, non-Debian operating systems&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not supported. Your mileage may vary.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;To install Pi-Apps manually&lt;/strong&gt; if you prefer to see what happens under the hood&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/Botspot/pi-apps ~/pi-apps
~/pi-apps/install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;To uninstall Pi-Apps&lt;/strong&gt;&lt;br&gt;
This will not uninstall any apps that you installed through Pi-Apps.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/pi-apps/uninstall
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;&lt;span id="how-to-launch"&gt;Now I have it installed... How to launch it? 🤟&lt;/span&gt;&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;From the start menu on Raspberry Pi OS:

&lt;ul&gt;
&lt;li&gt;Accessories -&amp;gt; Pi Apps&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Use the terminal-command: &lt;code&gt;pi-apps&lt;/code&gt;
&lt;/li&gt;

&lt;li&gt;Run Pi-Apps from its directory: &lt;code&gt;~/pi-apps/gui&lt;/code&gt;
&lt;/li&gt;

&lt;/ul&gt;



&lt;h2&gt;&lt;span id="how-to-update"&gt;How To Update Pi-Apps? ⏫&lt;/span&gt;&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pi-apps will automatically check for updates on boot and display a notification to update.&lt;/li&gt;
&lt;li&gt;To manually run the updater, use this command: &lt;code&gt;~/pi-apps/updater gui&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;It also supports a cli interface: &lt;code&gt;~/pi-apps/updater cli&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;&lt;span id="basic-usage"&gt;Basic usage 🔧&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;Pi-Apps is very easy to use!  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is the &lt;strong&gt;main window&lt;/strong&gt;.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fmain%2520window.png%3Fraw%3Dtrue" alt="main window"&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Fsearch.png%3Fraw%3Dtrue" alt="icon"&gt; Search for apps.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Finfo.png%3Fraw%3Dtrue" alt="icon"&gt; Open the selected category. (you can also double-click on the category)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Opening a category will reveal a &lt;strong&gt;list of apps&lt;/strong&gt;:
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fapp%2520list.png%3Fraw%3Dtrue" alt="app list"&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Fback.png%3Fraw%3Dtrue" alt="icon"&gt; Go back to the main list of categories.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Finstall.png%3Fraw%3Dtrue" alt="icon"&gt; Install the selected app.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Funinstall.png%3Fraw%3Dtrue" alt="icon"&gt; Uninstall the selected app.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Finfo.png%3Fraw%3Dtrue" alt="icon"&gt; See more details about the app. (see &lt;strong&gt;details window&lt;/strong&gt; below)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;This is the &lt;strong&gt;details window&lt;/strong&gt;:
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fdetails%2520window.png%3Fraw%3Dtrue" alt="details"&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Fback2.png%3Fraw%3Dtrue" alt="icon"&gt; Go back to the list of apps.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Fscripts.png%3Fraw%3Dtrue" alt="icon"&gt; View the shell-scripts responsible for installing or uninstalling the selected app.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Fedit.png%3Fraw%3Dtrue" alt="icon"&gt; Modify the app's description, icons, or scripts. (This button is hidden unless you enable it in Settings)&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Finstall.png%3Fraw%3Dtrue" alt="icon"&gt; Install the selected app.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Funinstall.png%3Fraw%3Dtrue" alt="icon"&gt; Uninstall the selected app.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Fcredits.png%3Fraw%3Dtrue" alt="icon"&gt; See who played a part in adding the app.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Ferrors.png%3Fraw%3Dtrue" alt="icon"&gt; If the selected app failed to install, this button will allow you to see its error log.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Pi-Apps Settings can be configured by launching Menu -&amp;gt; Preferences -&amp;gt; Pi-Apps Settings.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fsettings.png%3Fraw%3Dtrue" alt="settings"&gt;
In addition to changeable settings, this window also gives access to these tools:

&lt;ul&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Fcategories.png%3Fraw%3Dtrue" alt="icon"&gt; Does that one app seem to be in the wrong category? With this button, you can change it.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Fnew%2520app.png%3Fraw%3Dtrue" alt="icon"&gt; Create a new app with a wizard-style set of dialogs. We recommend reading &lt;a href="https://github.com/Botspot/pi-apps/wiki/Creating-an-app" rel="noopener noreferrer"&gt;the tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Flog%2520files.png%3Fraw%3Dtrue" alt="icon"&gt; View the past weeks-worth of installation logs. This is useful if you ever encounter an app that won't install and want to see the terminal output after you closed the terminal.&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBotspot%2Fpi-apps%2Fraw%2Fmaster%2Ficons%2Fscreenshots%2Fbuttons%2Fimport%2520app.png%3Fraw%3Dtrue" alt="icon"&gt; This allows you to easily import a 3rd-party app from elsewhere. It helps Pi-Apps developers test upcoming apps for reliability on a variety of systems.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;



&lt;p&gt;To learn more about Pi-Apps, read &lt;a href="https://github.com/Botspot/pi-apps/blob/master/DOCUMENTATION.md" rel="noopener noreferrer"&gt;the documentation&lt;/a&gt; and the &lt;a href="https://github.com/Botspot/pi-apps/wiki" rel="noopener noreferrer"&gt;wiki&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;If you find this article helpful, consider buying me a coffee!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/cycool29" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcycool29%2Fcycool29%2Fraw%2Fmain%2Fko-fi.png" alt="ko-fi"&gt;&lt;/a&gt; &lt;/p&gt;

</description>
      <category>raspberrypi</category>
      <category>beginners</category>
      <category>appstore</category>
      <category>raspbian</category>
    </item>
    <item>
      <title>Pro way of making a GitHub Profile views-counter</title>
      <dc:creator>cycool29</dc:creator>
      <pubDate>Mon, 14 Feb 2022 10:04:52 +0000</pubDate>
      <link>https://dev.to/cycool29/pro-way-of-making-a-github-profile-views-counter-3blg</link>
      <guid>https://dev.to/cycool29/pro-way-of-making-a-github-profile-views-counter-3blg</guid>
      <description>

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Step 1: Create Bitly Link&lt;/li&gt;
&lt;li&gt;Step 2: Embed to your GitHub Profile&lt;/li&gt;
&lt;li&gt;Bonus: Show GitHub Profile Views badge&lt;/li&gt;
&lt;li&gt;
How it works

&lt;ul&gt;
&lt;li&gt;How a Bitly link count profile views? &lt;/li&gt;
&lt;li&gt;How the badge is generated?&lt;/li&gt;
&lt;/ul&gt;


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




&lt;p&gt;You might want to see how many times your GitHub profile has been viewed. It reflects your popularity on GitHub.&lt;/p&gt;

&lt;p&gt;There are many tools for similar purposes &lt;a href="https://github.com/search?q=github+profile+counter"&gt;on GitHub&lt;/a&gt;, but here, we are using &lt;strong&gt;Bitly link&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Before starting, you will need to create a Profile README. GitHub Docs has &lt;a href="https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/managing-your-profile-readme"&gt;nice documentation&lt;/a&gt; on it.&lt;/p&gt;

&lt;h2&gt;&lt;span id="step-1"&gt;Step 1: Create Bitly Link&lt;/span&gt;&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;a href="https://bitly.com/"&gt;https://bitly.com/&lt;/a&gt;, if you don't have a Bitly account, create one. And if you have one, just log in. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3ZLvbq3H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3k23ljrgygm9hb2kiq43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3ZLvbq3H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3k23ljrgygm9hb2kiq43.png" alt="Create button" width="880" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the &lt;strong&gt;ENTER LONG URL&lt;/strong&gt; box, type &lt;code&gt;https://example.com/&lt;/code&gt;.   &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave all other fields default and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aj8k6M0a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/icv8hrztf5fgaw5o1svh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aj8k6M0a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/icv8hrztf5fgaw5o1svh.png" alt="Create link" width="286" height="939"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Enter any name you'd like for your link in the &lt;strong&gt;TITLE&lt;/strong&gt; box. For me, it is &lt;code&gt;Profile Views&lt;/code&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then, click the &lt;strong&gt;Copy&lt;/strong&gt; button to copy your Bitly link.&lt;br&gt;
After that, click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Js8xWhK6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ss1ow5ans840cnaug0y0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Js8xWhK6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ss1ow5ans840cnaug0y0.png" alt="Save" width="297" height="940"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you've got your Bitly link set up!&lt;/p&gt;

&lt;h2&gt;&lt;span id="step-2"&gt;Step 2: Embed to your GitHub Profile&lt;/span&gt;&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Head over to your GitHub profile repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Put &lt;code&gt;![]([your-bitly-link])&lt;/code&gt; at the end of the README file. For example: &lt;code&gt;![](https:/bit.ly/abcd123)&lt;/code&gt;. Don't panic if you forgot your Bitly link, just head back to bitly.com and you can copy it again there.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Commit changes&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now your GitHub Profile Counter is done! &lt;br&gt;
You can check how many people land on your profile at bitly.com.&lt;/p&gt;

&lt;h2&gt;&lt;span id="bonus"&gt;Bonus: Show GitHub Profile Views badge&lt;/span&gt;&lt;/h2&gt;

&lt;p&gt;You may notice &lt;a href="https://github.com/cycool29"&gt;my GitHub Profile&lt;/a&gt; has a &lt;code&gt;GitHub Profile Views&lt;/code&gt; badge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wmGf-CDo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ci9u3klbnd8sz9jt5qoy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wmGf-CDo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ci9u3klbnd8sz9jt5qoy.png" alt="GitHub Profile Views" width="621" height="129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is how to create it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;First, back to &lt;a href="https://bitly.com"&gt;https://bitly.com&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Launch Developer Tools by pressing Ctrl+Shift+I &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the &lt;code&gt;Network&lt;/code&gt; tab. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Press Ctrl+R to refresh the tab. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From a list of network requests, find a line named &lt;code&gt;clicks&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Right-click at that line, click &lt;code&gt;Copy&lt;/code&gt;, and &lt;code&gt;Copy as cURL&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now back to your GitHub profile repository &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;code&gt;Settings&lt;/code&gt; -&amp;gt; &lt;code&gt;Secrets&lt;/code&gt; -&amp;gt; &lt;code&gt;Actions&lt;/code&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;New repository secret&lt;/strong&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fill &lt;code&gt;PROFILE_VIEWS&lt;/code&gt; in the &lt;strong&gt;Name&lt;/strong&gt; field and paste the cURL command in the &lt;strong&gt;Value&lt;/strong&gt; field. Then, click &lt;code&gt;Add secret&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a file &lt;code&gt;.github/workflows/update-profile-views.yml&lt;/code&gt; in your GitHub profile repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy these lines to the file.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Update Profile Views&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;*/5&lt;/span&gt;&lt;span class="nv"&gt;  &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&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="na"&gt;COLOR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;00ff00&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;update-profile-views&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&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;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&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;Update Profile Views&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;VIEWS="$(${{ secrets.PROFILE_VIEWS }} 2&amp;gt;/dev/null | jq | grep -B 2 '"hash": "YOUR_HASH"' | head -n 1 | grep -o "[1234567890]*")"          &lt;/span&gt;
          &lt;span class="s"&gt;echo '&amp;lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="214" height="20" role="img" aria-label="${{ github.actor }}&amp;amp;apos;s GitHub Profile Views: 259"&amp;gt;&amp;lt;title&amp;gt;${{ github.actor }}&amp;amp;apos;s GitHub Profile Views: 259&amp;lt;/title&amp;gt;&amp;lt;linearGradient id="s" x2="0" y2="100%"&amp;gt;&amp;lt;stop offset="0" stop-color="#bbb" stop-opacity=".1"/&amp;gt;&amp;lt;stop offset="1" stop-opacity=".1"/&amp;gt;&amp;lt;/linearGradient&amp;gt;&amp;lt;clipPath id="r"&amp;gt;&amp;lt;rect width="214" height="20" rx="3" fill="#${{ env.COLOR }}"/&amp;gt;&amp;lt;/clipPath&amp;gt;&amp;lt;g clip-path="url(#r)"&amp;gt;&amp;lt;rect width="183" height="20" fill="#000"/&amp;gt;&amp;lt;rect x="183" width="31" height="20" fill="#4c1"/&amp;gt;&amp;lt;rect width="214" height="20" fill="url(#s)"/&amp;gt;&amp;lt;/g&amp;gt;&amp;lt;g fill="#${{ env.COLOR }}" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"&amp;gt;&amp;lt;text aria-hidden="true" x="925" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="1730"&amp;gt;${{ github.actor }}&amp;amp;apos;s GitHub Profile Views&amp;lt;/text&amp;gt;&amp;lt;text x="925" y="140" transform="scale(.1)" fill="#${{ env.COLOR }}" textLength="1730"&amp;gt;${{ github.actor }}&amp;amp;apos;s GitHub Profile Views&amp;lt;/text&amp;gt;&amp;lt;text aria-hidden="true" x="1975" y="150" fill="#${{ env.COLOR }}" fill-opacity=".3" transform="scale(.1)" textLength="210"&amp;gt;259&amp;lt;/text&amp;gt;&amp;lt;text x="1975" y="140" transform="scale(.1)" fill="#000" textLength="210"&amp;gt;259&amp;lt;/text&amp;gt;&amp;lt;/g&amp;gt;&amp;lt;/svg&amp;gt;' | sed "s/259/$VIEWS/g" &amp;gt; profile-views.svg&lt;/span&gt;
          &lt;span class="s"&gt;git config user.email "41898282+github-actions[bot]@users.noreply.github.com"&lt;/span&gt;
          &lt;span class="s"&gt;git config user.name "github-actions[bot]"&lt;/span&gt;
          &lt;span class="s"&gt;git pull&lt;/span&gt;
          &lt;span class="s"&gt;git add -A&lt;/span&gt;
          &lt;span class="s"&gt;git diff-index --quiet HEAD || git commit -m "Update profile views to ${VIEWS}"&lt;/span&gt;
          &lt;span class="s"&gt;git push          &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Replace &lt;code&gt;YOUR_HASH&lt;/code&gt; with your Bitly link hash (the text after &lt;code&gt;bit.ly/&lt;/code&gt; in your Bitly link). &lt;br&gt;
You can also customize the color by replacing &lt;code&gt;00ff00&lt;/code&gt; with the HEX code of the color you want&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Commit new file&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Place this line of code anywhere in the file you'd like to show the badge. Replace &lt;code&gt;[your-github-username]&lt;/code&gt; with your GitHub username.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[&amp;lt;img src="https://raw.githubusercontent.com/[your-github-username]/[your-github-username]/main/profile-views.svg" height="50"/&amp;gt;](https://github.com/[your-github-username])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Commit changes&lt;/strong&gt; to save your changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well done! You should see a beautiful badge in your GitHub profile!&lt;/p&gt;

&lt;h2&gt;&lt;span id="how-it-works"&gt;How it works&lt;/span&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;span id="bitly-link-how"&gt;How a Bitly link count profile views? &lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;The principle is very simple.&lt;/p&gt;

&lt;p&gt;We made the link in a &lt;code&gt;img&lt;/code&gt; tag. Hence, everytime when users loads your profile page, GitHub will requests to the link.&lt;br&gt;
Although actually it is not an image, the request is still recorded in the Bitly server.&lt;/p&gt;

&lt;h3&gt;&lt;span id="badge-how"&gt;How the badge is generated? &lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;As of the Profile Views badge, we just created a GitHub workflow to automatically update our profile views from Bitly and create a SVG image in the profile repository root every five minutes (it is not &lt;em&gt;exactly&lt;/em&gt; five minutes, it runs about 2 to 3 times each hour). &lt;/p&gt;

&lt;p&gt;We embed the image in our profile README.&lt;/p&gt;




&lt;p&gt;If you find this article helpful, consider buying me a coffee!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/cycool29"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0RR4pkkd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/cycool29/cycool29/raw/main/ko-fi.png" alt="ko-fi" width="700" height="191"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Your support is the greatest motivation for me to create great content continuously!&lt;/p&gt;

</description>
      <category>github</category>
      <category>profile</category>
      <category>readme</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>My first year to Hacktoberfest.</title>
      <dc:creator>cycool29</dc:creator>
      <pubDate>Wed, 13 Oct 2021 05:23:06 +0000</pubDate>
      <link>https://dev.to/cycool29/my-first-year-to-hacktoberfest-372k</link>
      <guid>https://dev.to/cycool29/my-first-year-to-hacktoberfest-372k</guid>
      <description>&lt;h3&gt;
  
  
  Hi there!
&lt;/h3&gt;

&lt;p&gt;Hey guys! I am cycool29, first year on programming, Github, DEV and also Hacktoberfest. &lt;/p&gt;

&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;I am just a beginner to programming, and Github. Fans of bash, learning Python.&lt;/p&gt;

&lt;h3&gt;
  
  
  Progress
&lt;/h3&gt;

&lt;p&gt;Since I am just a beginner, I look through Github and I found &lt;a href="https://github.com/Botspot/pi-apps"&gt;Pi-Apps&lt;/a&gt; is suitable for me. So I created plenty of PR there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reflections
&lt;/h3&gt;

&lt;p&gt;This program is a great program, encouraged me to make more contributions to open-source (I almost made a PR every day in October lol). Of course I will participate again this program in the future, when my skill is improved and able to contribute to other projects.&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
    </item>
  </channel>
</rss>
