<?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: Jim Christian Dale</title>
    <description>The latest articles on DEV Community by Jim Christian Dale (@christiandale).</description>
    <link>https://dev.to/christiandale</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%2F1035718%2Fb191a740-263c-48e8-a76e-3626be46ad09.jpg</url>
      <title>DEV Community: Jim Christian Dale</title>
      <link>https://dev.to/christiandale</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/christiandale"/>
    <language>en</language>
    <item>
      <title>Why I created kernel.css and what it is</title>
      <dc:creator>Jim Christian Dale</dc:creator>
      <pubDate>Thu, 17 Jul 2025 17:19:32 +0000</pubDate>
      <link>https://dev.to/christiandale/why-i-created-kernelcss-and-what-it-is-1gk7</link>
      <guid>https://dev.to/christiandale/why-i-created-kernelcss-and-what-it-is-1gk7</guid>
      <description>&lt;p&gt;Over the years, I've built a handful of tools, frameworks, and odd little utilities to make my own development life easier. Some of them stayed in the drawer. Others made it into real projects. One of them — a lightweight CSS library I called kernel.css — has lived quietly on GitHub Pages for a while, but now I've decided to work on an update.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built kernel.css
&lt;/h2&gt;

&lt;p&gt;Back when I was working on the a simple open source p2p chat and VoIP app, I needed something simple: a clean foundation for styling web apps and sites, without having to fight against opinionated frameworks. I didn't want a bloated UI kit — I wanted a base. Although, in retrospective I realized that kernel.css was way to ambitious, and thats why for v2 I'm focused more on real-world value and usability. It's mostly a CSS library for making websites and simple web apps, and probably not the best choice for complex applications.&lt;/p&gt;

&lt;p&gt;If you're building a complex app, I would probably look into something like &lt;a href="https://react.dev" rel="noopener noreferrer"&gt;React&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But on the other hand, if you need something that is simple and easy to understand, kernel.css would probably be easier to pick up and use.&lt;/p&gt;

&lt;h2&gt;
  
  
  From the Ionogy GitHub to the christian-dale GitHub
&lt;/h2&gt;

&lt;p&gt;I originally hosted kernel.css on the Ionogy GitHub, but I've been moving my projects to my personal GitHub account. It's cleaner, more organized, and lets me showcase my work more effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  Still evolving
&lt;/h2&gt;

&lt;p&gt;Like all of my projects, this one is not "finished". It's usable, but it's not done, and might never be. That's the point. I evolve the tools as I grow. If you want to contribute, the repo's available here:&lt;br&gt;
&lt;a href="https://github.com/christian-dale/kernel.css" rel="noopener noreferrer"&gt;https://github.com/christian-dale/kernel.css&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There you'll find the SCSS source files, the build process (npm run build), and some examples. It's not a big project, but it's functional. And maybe It's useful to someone else too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger picture
&lt;/h2&gt;

&lt;p&gt;This small move is part of a larger shift of bringing more of my projects under one roof, consolidating my work, and putting it all under one identity. Not fragmented across GitHub, SoundCloud, and random subdomains without any clear linking between them. My website, christiandale.no aims to solve this issue, and serves as a central place that connects all my work.&lt;/p&gt;

&lt;p&gt;This website uses kernel.css as its base, and although it's not a full-fledged UI kit, it provides the foundation I need to build a clean, functional site.&lt;/p&gt;

&lt;p&gt;Thanks for checking it out. If you use kernel.css, or want to suggest improvements, I'd love to hear from you.&lt;/p&gt;

&lt;p&gt;Regards,&lt;/p&gt;

&lt;p&gt;JCD&lt;/p&gt;

&lt;p&gt;Check out my website at &lt;a href="https://christiandale.no" rel="noopener noreferrer"&gt;christiandale.no&lt;/a&gt; for more content.&lt;/p&gt;

</description>
      <category>kernelcss</category>
      <category>webdev</category>
      <category>css</category>
      <category>programming</category>
    </item>
    <item>
      <title>kernel.css v2.0.0-beta.1 Released</title>
      <dc:creator>Jim Christian Dale</dc:creator>
      <pubDate>Mon, 14 Jul 2025 00:29:13 +0000</pubDate>
      <link>https://dev.to/christiandale/kernelcss-v200-beta1-released-4e4h</link>
      <guid>https://dev.to/christiandale/kernelcss-v200-beta1-released-4e4h</guid>
      <description>&lt;p&gt;I'm excited to announce the release of kernel.css v2.0.0-beta.1! This version is a major rewrite of the library, focusing on ease of use, and the use of modern CSS features. Some features where removed, some were added, and alot of changes were made to the existing features. This release is a beta, meaning that it is not yet stable, and may contain bugs. However, I believe that it is ready for testing and feedback.&lt;/p&gt;

&lt;p&gt;The goal of the library is to provide a simple and lightweight starting point for building websites, without the need for JavaScript. An issue I had with other CSS libraries / frameworks is that they where to complex and bloated, and I wanted to create something that is easy to use and understand. It's not meant to be a full-featured framework, but rather something that gets you moving quickly with a solid foundation.&lt;/p&gt;

&lt;p&gt;kernel.css is a project I created almost 10 years ago, and I've been using it here and there for my own projects, which has given insights into which features are useful and which are not. This new release is a culmination of that experience, and I hope that it has some use to others as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/christian-dale/kernel.css" rel="noopener noreferrer"&gt;Check out on github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a summary of the changes in this release:&lt;/p&gt;

&lt;p&gt;✨ Added&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Added accordion module.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧹 Changed&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replaced Stylus with SCSS.&lt;/li&gt;
&lt;li&gt;Refactored the grid system to use CSS Grid.&lt;/li&gt;
&lt;li&gt;Reworked color, transition and animation systems.&lt;/li&gt;
&lt;li&gt;Fixed various bugs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧽 Removed&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removed Material Icons support and related variables.&lt;/li&gt;
&lt;li&gt;Removed bold text from label module.&lt;/li&gt;
&lt;li&gt;Removed background from blockquote.&lt;/li&gt;
&lt;li&gt;Removed old test files.&lt;/li&gt;
&lt;li&gt;Removed sidebar and tabs modules (these did not fit with the CSS only approach).&lt;/li&gt;
&lt;li&gt;JavaScript dependencies are no longer included in the library.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out my website at &lt;a href="https://christiandale.no" rel="noopener noreferrer"&gt;christiandale.no&lt;/a&gt; for more content.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>kernelcss</category>
      <category>programming</category>
    </item>
    <item>
      <title>My Linux Journey: Top 5 Distros Based on Trial and Error</title>
      <dc:creator>Jim Christian Dale</dc:creator>
      <pubDate>Sun, 26 May 2024 14:48:53 +0000</pubDate>
      <link>https://dev.to/christiandale/my-linux-journey-top-5-distros-based-on-trial-and-error-dam</link>
      <guid>https://dev.to/christiandale/my-linux-journey-top-5-distros-based-on-trial-and-error-dam</guid>
      <description>&lt;p&gt;I remember the first time I tried out Linux. I must have been around 12 years old, around 2010. The first Linux distro I tried was Ubuntu; this was during the GNOME 2 days, and the interface looked a bit dated even then.&lt;/p&gt;

&lt;p&gt;What was great about Ubuntu at that time—and much of this still holds true—was its ease of use and how lightweight it was. It could run perfectly fine on a Windows XP era computer.&lt;/p&gt;

&lt;p&gt;I remember fondly the library of games it had like Mines (a Minesweeper clone), Solitaire, Chess, GNOME Sudoku, and Mahjongg. There were also a collection of other apps like OpenOffice and GIMP. It was fun to experiment with these games and apps for a while, but after some time, I got bored with them. That was about it for my Linux experience at that time.&lt;/p&gt;

&lt;p&gt;A few years later, I decided to try out Ubuntu again. This was around the time GNOME 3 was released, and when Ubuntu decided to go their own way with their desktop environment called Unity. I didn’t like GNOME 3 and Unity at the time—but I must admit my opinion has changed in later years.&lt;/p&gt;

&lt;p&gt;Now, after deciding that Ubuntu didn’t fit my needs, I began looking at alternatives. This is where I found Linux Mint—an Ubuntu-based distro. What I liked about Linux Mint was that it looked more traditional, especially for someone coming from Windows.&lt;/p&gt;

&lt;p&gt;This list is not ordered in any particular way. These picks are my opinion, of course, and should not be taken as gospel, but instead as general recommendations based on what your needs are.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Debian - Best for security and stability
&lt;/h2&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%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Ff%2Ff8%2FScreenshot_of_Debian_12_%2528Bookworm%2529_GNOME_43.9%25E2%2580%2594English.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%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Ff%2Ff8%2FScreenshot_of_Debian_12_%2528Bookworm%2529_GNOME_43.9%25E2%2580%2594English.png" alt="A screenshot of Debian 12 (Bookworm) GNOME 43.9 with the Firefox browser on the Wikipedia and Debian webpages, as well as Neofetch displaying system information" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Image by &lt;a href="https://commons.wikimedia.org/wiki/User:Motor8" rel="noopener noreferrer"&gt;Motor8&lt;/a&gt; on &lt;a href="https://commons.wikimedia.org/wiki/File:Screenshot_of_Debian_12_%28Bookworm%29_GNOME_43.9%E2%80%94English.png" rel="noopener noreferrer"&gt;Wikimedia Commons&lt;/a&gt; / &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servers&lt;/li&gt;
&lt;li&gt;Stable desktops&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have found Debian to be an excellent pick for desktops that need to be stable, like your work computer, for example. This is where I use Debian at the moment, although some of my colleagues might find Debian a bit boring ;)&lt;/p&gt;

&lt;p&gt;Debian is also great for servers, as its lack of frequent function updates ensures a stable environment. In addition, this distro seems to have lesser resource requirements than Ubuntu—although I don’t have specific measurements, it seems logical considering how bare-bones Debian is. Although Ubuntu usually has a greater market share in the server space, you might want to consider running Debian instead.&lt;/p&gt;

&lt;p&gt;By the way, I currently run GNOME on Debian, where a vanilla version of GNOME 3 is the default choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Arch Linux - Best for those who like to «live on the edge»
&lt;/h2&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%2Fpv83k92phtld7ajifg0g.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%2Fpv83k92phtld7ajifg0g.png" alt="Screenshot of neofetch on Arch Linux" width="800" height="377"&gt;&lt;/a&gt;&lt;br&gt;
Image by &lt;a href="https://commons.wikimedia.org/wiki/User:VulcanSphere" rel="noopener noreferrer"&gt;VulcanSphere&lt;/a&gt; on &lt;a href="https://commons.wikimedia.org/wiki/File:Arch_Linux_neofetch_screenshot.png" rel="noopener noreferrer"&gt;Wikimedia Commons&lt;/a&gt; / &lt;a href="https://www.gnu.org/licenses/gpl-3.0.html" rel="noopener noreferrer"&gt;GPL&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Home computer&lt;/li&gt;
&lt;li&gt;Development desktops and servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I find using Arch Linux a lot of fun, and it is certainly the best pick for anyone who likes to try out the latest software and tinker and customize their system to the fullest.&lt;/p&gt;

&lt;p&gt;I used to run Arch Linux on my main computer. The rolling release model ensures you have the latest packages and updates, making it ideal for those who want to stay on the cutting edge of technology. However, it requires a hands-on approach and is best suited for experienced users.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Ubuntu - A great general purpose operating system
&lt;/h2&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%2Fmgxaonqnq30su2jyv24f.jpg" 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%2Fmgxaonqnq30su2jyv24f.jpg" alt="Ubuntu 20.04 LTS (Focal Fossa) main desktop" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Image by &lt;a href="https://commons.wikimedia.org/wiki/User:Esstro" rel="noopener noreferrer"&gt;Esstro&lt;/a&gt; on &lt;a href="https://commons.wikimedia.org/wiki/File:Ubuntu-20.04.jpg" rel="noopener noreferrer"&gt;Wikimedia Commons&lt;/a&gt; / &lt;a href="https://creativecommons.org/licenses/by-sa/4.0/" rel="noopener noreferrer"&gt;CC BY-SA 4.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;General purpose computers.&lt;/li&gt;
&lt;li&gt;Servers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ubuntu is a fantastic all-rounder. It has great support for most hardware, so if you experience some issues with getting drivers for your devices on Debian, this might be the pick for you. With its regular updates and vast community support, Ubuntu remains a solid choice for both newcomers and seasoned users.&lt;/p&gt;

&lt;p&gt;Ubuntu's community and documentation are extensive, making it an excellent choice for beginners. The Ubuntu Software Center provides a user-friendly interface for installing applications, simplifying the software management process. Additionally, Ubuntu's Long Term Support (LTS) releases ensure stability and security for those who prefer not to upgrade frequently.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Linux Mint - Great for those who like a more traditional look and feel.
&lt;/h2&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%2Fiq4reh52a72lpbpt1aqs.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%2Fiq4reh52a72lpbpt1aqs.png" alt="Linux Mint Cinnamon 21.1" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
Image by &lt;a href="https://commons.wikimedia.org/wiki/User:Clement_Lefebvre" rel="noopener noreferrer"&gt;Clement Lefebvre&lt;/a&gt; on &lt;a href="https://commons.wikimedia.org/wiki/File:Linux_Mint_21.1_Cinnamon_eng.png" rel="noopener noreferrer"&gt;Wikimedia Commons&lt;/a&gt; / &lt;a href="https://www.gnu.org/licenses/gpl-3.0.html" rel="noopener noreferrer"&gt;GPL&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everyday use.&lt;/li&gt;
&lt;li&gt;Transitioning from Windows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After my experience with Ubuntu’s Unity, I sought out a more traditional desktop experience, and Linux Mint seemed like the perfect fit. Mint is based on Ubuntu and provides a desktop environment called Cinnamon as the default, which offers a familiar interface for Windows users. The Cinnamon desktop environment provides a stable and customizable user experience. Whether you’re a newcomer to Linux or an experienced user, Linux Mint is a safe choice.&lt;/p&gt;

&lt;p&gt;Linux Mint's emphasis on simplicity and ease of use makes it an ideal choice for users who want a hassle-free Linux experience. The Mint Update Manager ensures that system updates are managed efficiently, allowing users to stay up-to-date with security patches and software enhancements. Moreover, the inclusion of multimedia codecs and proprietary drivers out of the box enhances the out-of-the-box experience for users, especially those transitioning from Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Raspbian - The best pick for embedded Linux.
&lt;/h2&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%2Fpemt5psq9x9l8vqb0zkl.jpg" 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%2Fpemt5psq9x9l8vqb0zkl.jpg" alt="Raspbian 2019.04 Desktop" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
Image by &lt;a href="https://commons.wikimedia.org/wiki/User:Raspbian_Project" rel="noopener noreferrer"&gt;Raspbian Project&lt;/a&gt; on &lt;a href="https://commons.wikimedia.org/wiki/File:Raspbian_2019.04_application_menu.jpg" rel="noopener noreferrer"&gt;Wikimedia Commons&lt;/a&gt; / &lt;a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en" rel="noopener noreferrer"&gt;CC BY-SA 4.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Raspberry Pi projects&lt;/li&gt;
&lt;li&gt;IoT (Internet of Things)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For enthusiasts and developers working with Raspberry Pi and embedded systems, Raspbian seems like the obvious choice. Based on Debian, Raspbian is optimized for running on the Raspberry Pi’s hardware architecture. It is lightweight, efficient, and comes pre-loaded with educational tools and programming languages, making it perfect for both beginners and advanced users working on IoT projects.&lt;/p&gt;

&lt;p&gt;Raspbian's compatibility with the Raspberry Pi ecosystem ensures seamless integration with the hardware, allowing users to leverage the full potential of the device for various projects. The inclusion of tools like Scratch and Python make it an excellent platform for educational purposes, enabling users to learn programming and electronics in a hands-on manner. Additionally, Raspbian's active community provides ample support and resources for users to troubleshoot issues and explore new projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ending remarks
&lt;/h2&gt;

&lt;p&gt;My journey with Linux has been one of continuous learning and discovery. Each distro has its unique strengths and caters to different needs. Whether you're looking for stability, cutting-edge technology, or a familiar interface, there's a Linux distro out there for you. Have fun!&lt;/p&gt;

&lt;p&gt;Check out my website at &lt;a href="https://christiandale.no" rel="noopener noreferrer"&gt;christiandale.no&lt;/a&gt; for more content.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Using Deno KV with Deno deploy guide</title>
      <dc:creator>Jim Christian Dale</dc:creator>
      <pubDate>Mon, 10 Jul 2023 23:59:50 +0000</pubDate>
      <link>https://dev.to/christiandale/using-deno-kv-with-deno-deploy-guide-171o</link>
      <guid>https://dev.to/christiandale/using-deno-kv-with-deno-deploy-guide-171o</guid>
      <description>&lt;p&gt;Deno KV is a new key-value storage system released with version 1.32 of the Deno runtime.&lt;br&gt;
It allows for persistant data storage, meaning that the date is stored on disk between system reboots.&lt;/p&gt;

&lt;p&gt;At the time of writing, Deno KV is still experimental and the API is subject to change.&lt;br&gt;
It is therefore recommened to keep data backed up, as is always advicable.&lt;br&gt;
Deno KV is also designed to be very fast and optimized.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Overview of Deno KV&lt;/li&gt;
    &lt;ul&gt;
        &lt;li&gt;Example of a simple KV application&lt;/li&gt;
        &lt;li&gt;More advanced example&lt;/li&gt;
        &lt;li&gt;Atomic operations&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li&gt;Getting access to Deno Deploy KV beta&lt;/li&gt;
    &lt;li&gt;Conclusion&lt;/li&gt;
    &lt;li&gt;Additional resources&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Overview of Deno KV
&lt;/h2&gt;

&lt;p&gt; Because of Deno KV being experimental, it is only accessable by using the &lt;strong&gt;&lt;em&gt;--unstable&lt;/em&gt;&lt;/strong&gt; flag.&lt;/p&gt;

&lt;p&gt;Deno KV can be accessed through the Deno.KV API. The API is simple, and concists of the following main methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;const kv = Deno.OpenKv()&lt;/strong&gt; - Returns a new instance of the Deno KV object.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;kv.set(key, val)&lt;/strong&gt; - Allows you set a value at the specified key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;kv.get(key)&lt;/strong&gt; - Allows you to get the value associated with the specified key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;kv.delete(key)&lt;/strong&gt; - Delete the specified key from the Database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;kv.list(selector)&lt;/strong&gt; - Receives a list of items matching the selector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;kv.atomic()&lt;/strong&gt; - Allows you to chain multiple methods to be saved on the datastore all in one go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;kv.close()&lt;/strong&gt; - Close the the database connection, which will prevent any further operatings from taking place and cancelling currently running operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also other more specialiced API methods which are beyond the scope of this article.&lt;br&gt;
Please refer to the &lt;a href="https://deno.land/api@v1.34.3?unstable&amp;amp;s=Deno.Kv" rel="noopener noreferrer"&gt;Deno KV docs&lt;/a&gt; for more info.&lt;/p&gt;

&lt;p&gt;The keys in the key-value store are javascript types which means they can be strings, numbers or booleans.&lt;br&gt;
The values can be arrays, objects or other javascript primitive types.&lt;/p&gt;


&lt;h3&gt;
  
  
  Example of a simple KV application
&lt;/h3&gt;

&lt;p&gt;Here is a simple example that shows how to use the API.&lt;br&gt;
In this example we add a couple of users to a database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const kv = await Deno.openKv(); // Create a new instance of the Deno KV API.

kv.set(["users", "jim"], "Jim"); // Sets the key "jim" with the prefix "users"
kv.set(["users", "peter"], "Peter"); // Sets the key "peter" with the prefix "users"

// Receives a list of all keys with "prefix" users.
for await (const res of kv.list({prefix: ["users"]})) {
  console.log(res.key);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What confused me at first about the kv.set() method is that it does not accept a string as its argument,&lt;br&gt;
but instead expects an array as an argument.&lt;/p&gt;

&lt;p&gt;Altough this might seem weird at first, it allows for a powerful way to categorize and query data.&lt;br&gt;
For example when using the &lt;strong&gt;&lt;em&gt;kv.list()&lt;/em&gt;&lt;/strong&gt; we can query data with a &lt;strong&gt;prefix&lt;/strong&gt; or a &lt;strong&gt;range selector&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  More advanced example
&lt;/h3&gt;

&lt;p&gt;The simple example above shows the &lt;strong&gt;prefix&lt;/strong&gt; selector, but it also support the &lt;strong&gt;range&lt;/strong&gt; selector, which is used in a similar fashion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Receives a list of all items with "prefix" users, and that has a key of j up to p.
kv.list({start: ["users", "j"], end: ["users", "p"]});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Atomic operations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Atomic operations&lt;/strong&gt; are a powerful way to combine multiple methods in one go. This can improve performance by letting the system combine operations. The order of which you call methods on an atomic operation is guaranteed to be executed in the same order.&lt;/p&gt;

&lt;p&gt;The Deno.AtomicOperation object also contains a number of unique and useful methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;check()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commit()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;delete()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;enqueue()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;max()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;min()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mutate()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;set()&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sum()&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can read more on what these atomic methods does in the &lt;a href="https://deno.land/api@v1.34.3?s=Deno.AtomicOperation&amp;amp;unstable=" rel="noopener noreferrer"&gt;Deno API Docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is a simple example showing the use of Atomic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Sets a certain key to a value, and then deletes key peter from users.
kv.atomic().set(key, value).delete(["users", "peter"]).commit();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Getting access to Deno Deploy KV beta
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;This is only applicable to those who wants to run Deno KV on Deno Deploy&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At the time of writing Deno Deploy KV is currently only available as a closed beta.&lt;/p&gt;

&lt;p&gt;You can join the waitlist by visit this link: &lt;a href="https://deno.com/kv" rel="noopener noreferrer"&gt;https://deno.com/kv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you have access you will see a new tab called "KV (beta)" in your Deno Deploy project dash.&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%2F1ob9ep814anvdd9pl2ld.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%2F1ob9ep814anvdd9pl2ld.png" alt="Deno Deploy dash" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The Deno Key-value storage API is useful and it´s nice to have it integrated into the language, and that it requires no configuration.&lt;br&gt;
My only gripe with it is that it is too simple for advanced querying, altough that might not be negative if that´s all you need.&lt;br&gt;
If you require more advanced querying I would recommend MySQL or MongoDB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://deno.land/manual/runtime/kv" rel="noopener noreferrer"&gt;https://deno.land/manual/runtime/kv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deno.com/deploy/docs/kv" rel="noopener noreferrer"&gt;https://deno.com/deploy/docs/kv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deno.com/kv" rel="noopener noreferrer"&gt;https://deno.com/kv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deno.land/api@v1.34.3?unstable&amp;amp;s=Deno.Kv" rel="noopener noreferrer"&gt;https://deno.land/api@v1.34.3?unstable&amp;amp;s=Deno.Kv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out my website at &lt;a href="https://christiandale.no" rel="noopener noreferrer"&gt;christiandale.no&lt;/a&gt; for more content.&lt;/p&gt;

</description>
      <category>deno</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Best laptop for coding or programming</title>
      <dc:creator>Jim Christian Dale</dc:creator>
      <pubDate>Sun, 05 Mar 2023 20:22:49 +0000</pubDate>
      <link>https://dev.to/christiandale/best-laptop-for-coding-or-programming-4o6o</link>
      <guid>https://dev.to/christiandale/best-laptop-for-coding-or-programming-4o6o</guid>
      <description>&lt;p&gt;&lt;strong&gt;Which laptop to choose for school / university, and which to choose for a developement job?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Which laptop to choose depends on a number of factors, like your budget, open source ethics, choice of operating system and what kind of developement software you use. Altough these factors are important to consider, in general, most programming related activities, are low on resource intensivenes and would therefore not require great amounts of processing power. The exceptions to this rule would be using or creating cpu / gpu heavy software like games, 3D or managing wast amounts of data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choice of operating system
&lt;/h3&gt;

&lt;p&gt;There are three main contenders when it comes to choosing an operating system: Windows, Mac OSX and Linux. The choice of operating system will depend on what type of laptop you buy. Altough it´s possible to run Mac OSX on a non Apple device, I would not recommend it based on lack of stability and support. The legality of it is also questionable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt; is a good choice for most software developement, unless you require proprietary software, in which case you are probably out of luck. It is therefore important to identify your use cases (choice of development software, etc ...) and the requirements from your school or place of work.&lt;/p&gt;

&lt;p&gt;In my experience, &lt;strong&gt;many universities require you to run proprietary software on your computer&lt;/strong&gt; - which locks down your system - when taking exams in order to prevent you from cheating. I had to learn this the hard way when I was running &lt;a href="https://archlinux.org" rel="noopener noreferrer"&gt;Arch Linux&lt;/a&gt; on my laptop hehe.&lt;/p&gt;

&lt;p&gt;The Linux ecosystem is wast, and there are many different &lt;a href="https://distrowatch.com" rel="noopener noreferrer"&gt;distributions&lt;/a&gt; or variations of Linux to choose from. I would personally recommend Ubuntu for the beginner, and Arch Linux for the more intermediate Linux user.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lenovo Thinkpad
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://www.lenovo.com" rel="noopener noreferrer"&gt;Thinkpad&lt;/a&gt; line of laptops where originally developed by IBM before being bought by Lenovo. Lenovo has thus far been true to the laptops origins and still develop good quality Thinkpads fit for developement.&lt;/p&gt;

&lt;p&gt;The Thinkpad is very conventient for developers as it´s known to be reliable. It has a true and time tested design, with an alright keyboard. The Lenovo line of computers run Windows by default, but Linux support is also great.&lt;/p&gt;

&lt;p&gt;Thinkpads are also more affordable than the other contenders, offering latest models to as low as $800 dollars. Even the lower priced models have good specs. Altough, if you´re looking for an even greater deal, you can find previous models to half the price, or lower.&lt;/p&gt;

&lt;h3&gt;
  
  
  Macbook Pro / Air
&lt;/h3&gt;

&lt;p&gt;I use a Macbook pro 14 inch for work, as its small form factor makes it convenient. It fits nicely in a small backpack which is something I value. The Macbook Pro also packs quite a lot of power, which is nice if the need for running more demanding software comes down the line. Mac OSX supports most of the same developement software that Windows and Linux does.&lt;/p&gt;

&lt;p&gt;As Mac OSX is based on Unix, just like Linux is, it´s easy to transfer terminal based knowledge between the two systems.&lt;br&gt;
Apple´s ecosystem makes it seamless to pair a mac with an iPhone, altough it might be a turnoff for some to have to buy into the Apple ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  System 76 and Purism
&lt;/h3&gt;

&lt;p&gt;Both these vendors offer Linux based laptops in different performance brackets. &lt;a href="https://system76.com" rel="noopener noreferrer"&gt;System 76&lt;/a&gt; offers laptops running either Pop!_OS or Ubuntu. They offer systems with great performance, altough the form factor and weight is bigger than that of a Macbook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://puri.sm" rel="noopener noreferrer"&gt;Purism&lt;/a&gt;, at the time of writing, offers the Librem 14 laptop, which they claim to be the first 14 inch laptop to protect your digital life. It is ultra portable, and designed from the ground up to be privacy, secure, and freedom respecting. Purism also offers the privacy respecting Librem 5 phone, with an alternative version being manufactured in the USA.&lt;/p&gt;

&lt;p&gt;Check out my website at &lt;a href="https://christiandale.no" rel="noopener noreferrer"&gt;christiandale.no&lt;/a&gt; for more content.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>linux</category>
    </item>
    <item>
      <title>Network Security Essentials</title>
      <dc:creator>Jim Christian Dale</dc:creator>
      <pubDate>Sat, 04 Mar 2023 18:46:03 +0000</pubDate>
      <link>https://dev.to/christiandale/network-security-essentials-5n7</link>
      <guid>https://dev.to/christiandale/network-security-essentials-5n7</guid>
      <description>&lt;p&gt;These are some general tips on network security I wrote for an assignement. Most of the advice applies to Ubuntu GNU / Linux, but the methods would be just as important in any other operating system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perimeter security
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Firewall
&lt;/h3&gt;

&lt;p&gt;In Ubuntu the firewall is handled with a program called "ufw". Ufw, lets you block certain ports or applications on the network from ever being handled by any networking software on your computer. This program is already included in most GNU / Linux distributions and can be used with the following commands.&lt;/p&gt;

&lt;p&gt;sudo ufw status – Check which ports are allowed in the network.&lt;br&gt;
sudo ufw allow … - Allow a port access on the network.&lt;br&gt;
IDS / IPS&lt;/p&gt;

&lt;p&gt;IDS (Intrusion Detection System) and IPS (Intrusion Prevention System) are both important parts of a network. They work by checking the content of network packets with a central repository and checking if it matches already known exploits. The main difference between these is that IDS doesn't alter the packets in any way, while IPS prevents malicious packets from being delivered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anti-virus
&lt;/h3&gt;

&lt;p&gt;Anti-virus is something most people are familiar with, and know the importance of having it installed, especially on Windows machines. Although Unix based machines are more secure by design because of its authorization and security model, it can still get viruses. An anti-virus works by scanning your filesystem for files that match the hash of know vulnerabilities and quarantining them if any match is found. It can also check current running programs for vulnerabilities, depending on the anti-virus used.&lt;/p&gt;

&lt;p&gt;Popular free anti-virus solutions for GNU / Linux are Comodo Antivirus for Linux, ClamAV and ESET NOD32 Antivirus for Linux Desktop. These can be installed using your package manager of choice on GNU / Linux distributions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentication / Authorization controls
&lt;/h3&gt;

&lt;p&gt;It is important to make sure that only the intended persons have access to a network, and that other unintended persons don't gain access. One such method of authentication on a server would be the use of SSH (secure shell), which allows remote access for user accounts. SSH also encrypts traffic using TLS much in the same way as with HTTPS.&lt;/p&gt;

&lt;p&gt;Authorization is a method in which you give access to an already authenticated user to specific information. For example, one user would be a guest, and another would be an admin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fail2ban
&lt;/h3&gt;

&lt;p&gt;Fail2ban is designed to hinder brute-force attacks and many other possible attack vectors. It pairs well with popular web servers like Apache, and even with SSH. The software works by blocking the ip of the attacker when blocking criteria are met. Read more about fail2ban here.&lt;/p&gt;

&lt;h3&gt;
  
  
  How potential security threats would be handled
&lt;/h3&gt;

&lt;p&gt;Of course, some data on a network is more important than other data, for example private user information. Therefore, it is important to secure this especially well, with methods like username and password and two factor authentication. This is what is referred to as preventative measures.&lt;/p&gt;

&lt;p&gt;It is also important to take backups so that if data loss where to happen, either by hardware or software error, or by malicious attacks, the information would still be stored.&lt;/p&gt;

&lt;p&gt;A note on two factor authentication - Two factor authentication works by generating a random link on the server, and then sending this link to the receiver by either message or email. Once the user presses this link, it is compared to the one generated one the server, and if a match is detected, the user is authenticated.&lt;/p&gt;

&lt;h2&gt;
  
  
  On web server security
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How the methods from the last section would be important
&lt;/h3&gt;

&lt;p&gt;The methods discussed earlier in the last section would be essential for proper web server security. Especially authentication controls and a firewall.&lt;/p&gt;

&lt;h3&gt;
  
  
  TLS Security
&lt;/h3&gt;

&lt;p&gt;TLS is a method for encrypting the packets sent to and from a web server. It uses a method called public / private key cryptography, where the server has a private key, and the client has a public key which it shares with the server. This method is referred to as https (hyper-text transfer protocol secure), as opposed to http (hyper-text transfer protocol).&lt;/p&gt;

&lt;h3&gt;
  
  
  MYSQL Injections
&lt;/h3&gt;

&lt;p&gt;MYSQL injections is a method of hacking an insecure server in which there is sent a request to the server that contains escape characters in its query string that will be queried to the database. An example of this would be if you have a login form which takes the username field and stores it directly to the database.&lt;/p&gt;

&lt;p&gt;Let's say we have the following query.&lt;/p&gt;

&lt;p&gt;SELECT * FROM users WHERE username = '?' AND password = '?'&lt;br&gt;
Something like the following example could be used in that case to check if the server is vulnerable to MYSQL injections. We could set the password field to "' OR 1=1;" to achieve a bypass of the authentication system and gain access to the system. The database query would now look like this.&lt;/p&gt;

&lt;p&gt;SELECT * FROM users WHERE username = ? AND password = '' OR 1=1;&lt;br&gt;
This tells the database to either check if the username and passwords match, or if 1 = 1, which is always true, thus gaining login to the system. If a system is vulnerable to such attacks, the result could be even worse, in this example the whole database table would be deleted.&lt;/p&gt;

&lt;p&gt;SELECT * FROM users WHERE username = ? AND password = '' OR DROP TABLE users;&lt;br&gt;
MYSQL injection attacks can be prevented by using correct sanitation of all information sent to the network by users.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>tooling</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Getting Eta to work with Deno Deploy</title>
      <dc:creator>Jim Christian Dale</dc:creator>
      <pubDate>Wed, 01 Mar 2023 17:13:40 +0000</pubDate>
      <link>https://dev.to/christiandale/getting-eta-to-work-with-deno-deploy-45hc</link>
      <guid>https://dev.to/christiandale/getting-eta-to-work-with-deno-deploy-45hc</guid>
      <description>&lt;p&gt;Deno Deploy is a great service for hosting your Deno projects on the cloud for free. Unfortunately it does not work with the eta templating language.&lt;/p&gt;

&lt;p&gt;The reason for this is that eta uses the Deno.exists function, which is depreciated, and removed on the Deno Deploy service.&lt;/p&gt;

&lt;p&gt;After looking for a solution to this myself, but not finding any, I decided to try to come up with my own fix, which has been posted on the eta github page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/eta-dev/eta/issues/172" rel="noopener noreferrer"&gt;https://github.com/eta-dev/eta/issues/172&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a temporary fix that allows you to at least use templates on Deno Deploy :)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Eta.config.includeFile = function(path, data) {
  return Eta.templates.get(path)(data, Eta.config);
};
I would then write something like this:

Eta.templates.define("main", Eta.compile(
  await Deno.readTextFile(`${Deno.cwd()}/views/main.eta`)));

const template = await Eta.render(await Deno.readTextFile(`${Deno.cwd()}/views/home.eta`), {
    title: "My webpage"
  });
And this in the templates:

// home.eta

&amp;lt;% layout("main") %&amp;gt;

&amp;lt;h1&amp;gt;Welcome to my home page&amp;lt;h1&amp;gt;
// main.eta

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;%= it.title %&amp;gt;&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;%~ it.body %&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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