<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Okinea Dev</title>
    <description>The latest articles on Forem by Okinea Dev (@okineadev).</description>
    <link>https://forem.com/okineadev</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%2F1469640%2F14d5f897-ecdf-45c2-bdd1-705fe6f0c120.jpeg</url>
      <title>Forem: Okinea Dev</title>
      <link>https://forem.com/okineadev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/okineadev"/>
    <language>en</language>
    <item>
      <title>🤖 Use AI to speed up writing commit messages (bonus: custom prompt for improved generation)</title>
      <dc:creator>Okinea Dev</dc:creator>
      <pubDate>Wed, 13 Nov 2024 09:25:24 +0000</pubDate>
      <link>https://forem.com/okineadev/use-ai-to-speed-up-writing-commit-messages-bonus-custom-prompt-for-improved-generation-1hc5</link>
      <guid>https://forem.com/okineadev/use-ai-to-speed-up-writing-commit-messages-bonus-custom-prompt-for-improved-generation-1hc5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.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%2Fxlfez3hkov3kmj3409uw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fxlfez3hkov3kmj3409uw.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating commits is an integral part of working with &lt;strong&gt;Git&lt;/strong&gt; , and it’s equally important to create &lt;strong&gt;understandable&lt;/strong&gt; commit messages, but we (most likely) are too lazy to describe them in detail and clearly, but we don’t want our commit history to look something like this: “&lt;em&gt;update this&lt;/em&gt; “, “&lt;em&gt;fix&lt;/em&gt;”, “&lt;em&gt;fix&lt;/em&gt;”, “&lt;em&gt;wjkwefjke&lt;/em&gt;”, “&lt;em&gt;…&lt;/em&gt;” and etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; comes to the rescue! — the &lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat" rel="noopener noreferrer"&gt;GitHub Copilot extension for &lt;strong&gt;VS Code&lt;/strong&gt;&lt;/a&gt; has a function for generating commit messages&lt;/p&gt;

&lt;h4&gt;
  
  
  📋 Requirements
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt; access on your *&lt;em&gt;GitHub *&lt;/em&gt; account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VSCode&lt;/strong&gt; with GitHub Copilot enabled.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Flpf2anyno7fqnhgid8lc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flpf2anyno7fqnhgid8lc.png" alt="Commit menu in VS Code" width="673" height="323"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Commit menu in VS Code&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There is an icon with sparks (✨) on the right of the commit input field, this is the button for generating a commit message&lt;/p&gt;

&lt;p&gt;When we click on the commit generation button — the &lt;strong&gt;AI&lt;/strong&gt; ​​will generate a message based on the diff of the changed files, you can see the result below 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fw6md4s58l118rt18ytvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fw6md4s58l118rt18ytvu.png" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copilot wrote the following commit message: &lt;code&gt;_fix: 🩹 update uninstall command to handle optional PREFIX variable_&lt;/code&gt; and he wrote it correctly because I really fixed the uninstall command&lt;/p&gt;

&lt;p&gt;This can really save you time, you don’t have to waste your time writing commit messages anymore, let &lt;strong&gt;Copilot&lt;/strong&gt; do it for you 😉&lt;/p&gt;
&lt;h4&gt;
  
  
  🎁 Bonus: Custom prompt for improved commit message generation
&lt;/h4&gt;

&lt;p&gt;I made a &lt;strong&gt;custom prompt&lt;/strong&gt; for Copilot with commit generation rules, you can apply it with these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to vscode://settings/github.copilot.chat.commitMessageGeneration.instructions or type this in &lt;strong&gt;VS Code settings&lt;/strong&gt; : &lt;code&gt;_github.copilot.chat.commitMessageGeneration.instructions_&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fdgxa3wf65r6o2vnz2wvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fdgxa3wf65r6o2vnz2wvu.png" alt="Visual Studio Code settings menu" width="800" height="422"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Visual Studio Code settings menu&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click “ &lt;strong&gt;Edit in settings.json&lt;/strong&gt; ”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy and paste this into &lt;strong&gt;settings.json&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"github.copilot.chat.commitMessageGeneration.instructions": [
  {
    "text": "Follow the **Conventional Commits** format strictly. Use the structure below:\n\n```

\n&amp;lt;type&amp;gt;[optional scope]: &amp;lt;gitmoji&amp;gt; &amp;lt;description&amp;gt;\n\n&amp;lt;detailed body&amp;gt;\n

```\n\n## Guidelines:\n\n1. **Type and Scope** : Choose a commit type (e.g., `feat`, `fix`) and an optional scope to describe the affected module or feature.\n2. **Gitmoji** : Include a relevant `gitmoji` that **best** represents the nature of the change.\n3. **Description** : Write a **concise** and **informative** description in the header. Use **backticks** if referencing code or specific terms.\n4. **Body** : For additional details, use a well-structured body section:\n- Use bullet points (`*`) for clarity.\n- Always clearly describe the motivation, context, or technical details behind the change if applicable.\n\nCommit messages should be **clear** , **informative** , and **professional** , aiding readability and project tracking."
  }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.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%2F442sgoddfzfgtnc66wx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F442sgoddfzfgtnc66wx4.png" alt="Editing the Visual Studio Code settings file" width="800" height="253"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Editing the Visual Studio Code settings file&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This prompt defines the format of commit messages according to &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" rel="noopener noreferrer"&gt;&lt;strong&gt;Conventional Commits&lt;/strong&gt;&lt;/a&gt; with the addition of emoji (&lt;a href="https://gitmoji.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;gitmoji&lt;/strong&gt;&lt;/a&gt;). It consists of the following elements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Type and Scope&lt;/strong&gt; : Specify the commit type (eg &lt;code&gt;_feat_&lt;/code&gt;, &lt;code&gt;_fix_&lt;/code&gt;) and, if applicable, the scope describing the module or functionality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gitmoji&lt;/strong&gt; : Added the appropriate &lt;a href="https://gitmoji.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;gitmoji&lt;/strong&gt;&lt;/a&gt; that best represents the changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt; : Concise and informative title section, using backticks to refer to code or terms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit Body&lt;/strong&gt; : More detailed information organized as a bulleted list describing the motivation, context, or technical details of the changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal is to make commits clear, understandable, and professional to improve project change tracking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Done!&lt;/strong&gt; Now that you’ve applied a custom prompt to generate commits, let’s take a look at the new output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F8k3z52c4of0mtz3u1mff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F8k3z52c4of0mtz3u1mff.png" width="800" height="344"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix: 🩹 update uninstall command to handle optional PREFIX variable

* Adjusted the uninstall command in `README.md` to use `${PREFIX:-/usr}` for better flexibility.
* This change allows the command to default to `/usr` if the PREFIX variable is not set.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, it now writes a detailed commit description and wraps filenames and code in backticks ( &lt;strong&gt;``&lt;/strong&gt; )&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Conclusion:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AI can significantly speed up routine tasks, including writing commit messages&lt;/li&gt;
&lt;li&gt;Quality prompt — quality messages&lt;/li&gt;
&lt;li&gt;Trust but check — check what the AI ​​wrote and correct it if it was wrong&lt;/li&gt;
&lt;/ul&gt;

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

</description>
      <category>git</category>
      <category>programming</category>
      <category>writing</category>
      <category>commit</category>
    </item>
    <item>
      <title>How to set up VNC on a headless Raspberry Pi with Ubuntu Server 24.04</title>
      <dc:creator>Okinea Dev</dc:creator>
      <pubDate>Sat, 05 Oct 2024 14:29:09 +0000</pubDate>
      <link>https://forem.com/okineadev/how-to-set-up-vnc-on-a-headless-raspberry-pi-with-ubuntu-server-2404-402</link>
      <guid>https://forem.com/okineadev/how-to-set-up-vnc-on-a-headless-raspberry-pi-with-ubuntu-server-2404-402</guid>
      <description>&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AxVs03KkvqExKCk_i" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AxVs03KkvqExKCk_i"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Jainath Ponnala on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you have &lt;strong&gt;Ubuntu Server&lt;/strong&gt; installed on your &lt;strong&gt;Raspberry Pi&lt;/strong&gt; and you want to connect to its interface without a monitor or mouse?&lt;br&gt;&lt;br&gt;
Then you have come to the right place!&lt;/p&gt;

&lt;p&gt;After all, here are instructions on how to install the &lt;a href="https://www.gnome.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;Gnome&lt;/strong&gt;&lt;/a&gt; graphical interface and how to connect to it via  &lt;strong&gt;VNC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First of all. we need to update the packages using below command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, we will already install the minimal &lt;a href="https://www.gnome.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;Gnome&lt;/strong&gt; shell&lt;/a&gt; (you need to download &lt;em&gt;~350&lt;/em&gt; MB):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;gnome-core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, install the &lt;a href="https://tigervnc.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;TigerVNC&lt;/strong&gt;&lt;/a&gt; server and other add-ons for its operation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;tigervnc-standalone-server xserver-xorg-core xserver-xorg-video-fbdev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have installed the graphical shell and all the other packages, we can now start configuring the VNC server&lt;/p&gt;

&lt;p&gt;You need to create a password to connect to the VNC server, to do this, run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vncpasswd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Come up with a strong password, minimum length —  &lt;strong&gt;6&lt;/strong&gt; characters.&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%2Fojl9vb59qtjwsebb140s.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%2Fojl9vb59qtjwsebb140s.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we need to configure the &lt;em&gt;~/.vnc/xstartup&lt;/em&gt; file in order to enter the &lt;strong&gt;GUI&lt;/strong&gt; when connecting via VNC&lt;/p&gt;

&lt;p&gt;Run this command to open the &lt;em&gt;~/.vnc/xstartup&lt;/em&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.vnc/xstartup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then paste this into it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Start Gnome 3 Desktop&lt;/span&gt;

&lt;span class="nb"&gt;unset &lt;/span&gt;SESSION_MANAGER
&lt;span class="nb"&gt;unset &lt;/span&gt;DBUS_SESSION_BUS_ADDRESS

&lt;span class="c"&gt;# Set the X session type and GDK backend to X11.&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;XDG_SESSION_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;x11
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GDK_BACKEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;x11

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-x&lt;/span&gt; /etc/vnc/xstartup] &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exec&lt;/span&gt; /etc/vnc/xstartup
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.Xresources] &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; xrdb &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.Xresources

&lt;span class="c"&gt;# Enable access control for X server&lt;/span&gt;
xhost +

&lt;span class="c"&gt;# Start the Gnome session.&lt;/span&gt;
&lt;span class="nb"&gt;exec &lt;/span&gt;gnome-session
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, be sure to give this file executable rights:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ~/.vnc/xstartup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Now we are almost done!
&lt;/h4&gt;

&lt;p&gt;All we have to do is start the VNC server and connect to it.&lt;br&gt;&lt;br&gt;
We will connect via &lt;strong&gt;ssh&lt;/strong&gt; with &lt;strong&gt;port-forwarding&lt;/strong&gt; using this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Replace `okineadev@rpi.local` with the &lt;/span&gt;
&lt;span class="c"&gt;# username and address of your Raspberry Pi&lt;/span&gt;

ssh &lt;span class="nt"&gt;-L&lt;/span&gt; 5901:localhost:5901 okineadev@rpi.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will connect you to the &lt;strong&gt;Raspberry Pi&lt;/strong&gt; as usual, but with port &lt;strong&gt;5901&lt;/strong&gt; forwarded to your computer, this is necessary because &lt;strong&gt;TigerVNC&lt;/strong&gt; itself is not secure and the connection can be intercepted by attackers, so we will connect via port-forwarding because ssh itself provides encryption and connection security&lt;/p&gt;

&lt;p&gt;Now we can start the VNC server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vncserver :1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fq71zjikbnyie0eoa5958.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%2Fq71zjikbnyie0eoa5958.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Now we can connect using TigerVNC:
&lt;/h4&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%2F8fh3pjho7nqr274hfnra.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%2F8fh3pjho7nqr274hfnra.png"&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%2Fdbmbtx8g6j6evhbbn9a4.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%2Fdbmbtx8g6j6evhbbn9a4.png"&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%2F61k3k6e7s7xxu9lj24ux.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%2F61k3k6e7s7xxu9lj24ux.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  And voila — now we were able to connect to the Raspberry PI using VNC! 😄
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;If you notice any mistakes in my instructions — report it in the comments&lt;br&gt;&lt;br&gt;
If you liked this guide, don’t forget to give it a few 👏&lt;br&gt;&lt;br&gt;
👇&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ubuntu</category>
      <category>ubuntuserver</category>
      <category>vnc</category>
      <category>raspberrypi</category>
    </item>
    <item>
      <title>How to get a free macOS machine for testing?</title>
      <dc:creator>Okinea Dev</dc:creator>
      <pubDate>Fri, 13 Sep 2024 08:11:05 +0000</pubDate>
      <link>https://forem.com/okineadev/how-to-get-a-free-macos-machine-for-testing-4la0</link>
      <guid>https://forem.com/okineadev/how-to-get-a-free-macos-machine-for-testing-4la0</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fTFNyPvc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AQ2Fal4qTIXomyZTI" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fTFNyPvc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AQ2Fal4qTIXomyZTI" alt="image" width="800" height="529"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Tianyi Ma on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It happens that you have created a program and want to test it on different operating systems (including &lt;strong&gt;macOS&lt;/strong&gt; ), but if you do not have a Macbook, you can ask a friend to test your program, but what if he also does not have a Macbook?&lt;/p&gt;

&lt;p&gt;How then to test the program on &lt;strong&gt;macOS&lt;/strong&gt;  anyway??&lt;/p&gt;

&lt;p&gt;There is a &lt;strong&gt;solution&lt;/strong&gt;! — you can use the &lt;a href="https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners" rel="noopener noreferrer"&gt;runners&lt;/a&gt; that &lt;a href="http://github.com" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; provides for free for open source projects, on which you can run a script or whatever&lt;/p&gt;

&lt;p&gt;First of all, remember these simple rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Don’t abuse virtual machines&lt;/em&gt;&lt;/strong&gt; (abuse of free services is bad.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Do not use them for illegal purposes and for DDoS attacks&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;If you agree to the rules, here’s a step-by-step guide:&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. First of all, you need to create a separate public repository for testing (github.com/new)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ejutcneixh3n49vxbks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ejutcneixh3n49vxbks.png" alt="Screenshot of creating a public repository on GitHub" width="800" height="619"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create a workflow in &lt;code&gt;_.github/workflows/macos-runner.yml_&lt;/code&gt; with the following content:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: macOS Runner

# Controls when the workflow will run
on:
  workflow_dispatch:

jobs:
  test:
    # The type of runner that the job will run on
    # See https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#standard-github-hosted-runners-for-public-repositories
    runs-on: macos-13

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      - name: Setup tmate session
        uses: mxschmitt/action-tmate@v3

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Go to the “ &lt;strong&gt;Actions&lt;/strong&gt; ” tab
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aDPwPt04--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/668/0%2A9DKMXG8qmLhaA3N5" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aDPwPt04--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/668/0%2A9DKMXG8qmLhaA3N5" alt="Screenshot of “Actions” tab" width="668" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Then click on the “Run workflow” button:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rnAoS1AI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AOcjKaDNiAlCDGVEr" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rnAoS1AI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AOcjKaDNiAlCDGVEr" alt="image" width="800" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Now after launch, in the logs you will be given a link and ways to connect via ssh
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EPbY0nnH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AiB_tiYKPQVwJvn-n" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EPbY0nnH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AiB_tiYKPQVwJvn-n" alt="GitHub Runner logs" width="800" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Done! 🎉
&lt;/h3&gt;

&lt;p&gt;Now you can debug your application in macOS or any other environment!&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;Original page source: &lt;a href="https://gist.github.com/okineadev/b80d7f9a065543655e203471d582f3f1" rel="noopener noreferrer"&gt;https://gist.github.com/okineadev/b80d7f9a065543655e203471d582f3f1&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>github</category>
      <category>testing</category>
      <category>githubactions</category>
      <category>macos</category>
    </item>
  </channel>
</rss>
