teleren/devto huggingface dataset:
200. Leetcode solution in java
Tags: java
Published: 2022-07-02 12:11:51

```
class Solution {
    public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0)
            return 0;
        int r = grid.length;
        int c = grid[0].length;
        int res = 0;
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (grid[i][j] == '1') {
                    dfs(grid, i, j);
                    res++;
                }
            }
        }
        return res;
    }
    
    private void dfs(char[][] grid, int r, int c) {
        int rowNum = grid.length;
        int colNum = grid[0].length;
        if (r < 0 || r >= rowNum || c < 0 || c >= colNum || grid[r][c] == '0') {
            return;
        }
        grid[r][c] = '0';
        dfs(grid, r + 1, c);
        dfs(grid, r - 1, c);
        dfs(grid, r, c + 1);
        dfs(grid, r, c - 1);
    }
}
```
733. Leetcode solution in Java
Tags: java
Published: 2022-07-02 12:11:16

```
class Solution {
    private static int[][] dir = new int[][]{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
    public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
        if(image == null || image.length == 0 || image[0].length == 0 || image[sr][sc] == newColor)
            return image;
        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[]{sr, sc});
        int height = image.length, width = image[0].length;
        int original = image[sr][sc];
        while(!q.isEmpty()){
            int[] cur = q.poll();
            image[cur[0]][cur[1]] = newColor;
            int tx = 0, ty = 0;
            for(int i = 0; i < 4; i++){
                tx = cur[0] + dir[i][0];
                ty = cur[1] + dir[i][1];
                if(tx >= 0 && tx < height && ty >= 0 && ty < width && image[tx][ty] == original)
                    q.offer(new int[]{tx, ty});
            }
        }
        return image;
    }
}
```
733. Leetcode solution in Cpp
Tags: cpp
Published: 2022-07-02 12:10:35

```
class Solution {
 public:
  vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc,
                                int newColor) {
    dfs(image, sr, sc,
        vector<vector<bool>>(image.size(), vector<bool>(image[0].size())),
        image[sr][sc], newColor);
    return image;
  }

 private:
  void dfs(vector<vector<int>>& image, int i, int j,
           vector<vector<bool>>&& seen, int startColor, int newColor) {
    if (i < 0 || i == image.size() || j < 0 || j == image[0].size())
      return;
    if (image[i][j] != startColor || seen[i][j])
      return;

    image[i][j] = newColor;
    seen[i][j] = true;

    dfs(image, i + 1, j, move(seen), startColor, newColor);
    dfs(image, i - 1, j, move(seen), startColor, newColor);
    dfs(image, i, j + 1, move(seen), startColor, newColor);
    dfs(image, i, j - 1, move(seen), startColor, newColor);
  }
};

```
Debut of ML Powered Programmer Companion - AWS CodeWhisperer
Tags: aws, vscode, codewhisperer, machinelearning
Published: 2022-07-02 11:44:10

Amazon Web Services Inc. launches ML powered programming assistant, [CodeWhisperer](https://aws.amazon.com/codewhisperer/), to help improve developer productivity by generating code based on their comments and existing code. [It is available in preview mode right now.](https://pages.awscloud.com/codewhisperer-sign-up-form.html)

CodeWhisperer is capable of natural language to code generation and code to code generation in programming languages like Java, Python, and JavaScript. Developers can talk to CodeWhisperer in their IDEs, including VS Code, IntelliJ IDEA, Pycharm, and Web Storm.

This intelligent assistant is trained on billions of lines of code from open-source projects, internal code repositories, and other sources.

With the passage of time and usage, CodeWhisperer will be a mature and game changer.
Rough notes about Google reCAPTCHA (v2 checkbox type)
Tags: google, recaptcha, html, javascript
Published: 2022-07-02 10:54:34

---
title: Rough notes about Google reCAPTCHA (v2 checkbox type)
published: true
description: 
tags: google,recaptcha,html,javascript
---
According to official [docs](https://developers.google.com/recaptcha/intro):

There are 2 versions and four types of reCAPTCHA: 
- reCAPTCHA v3
  - returning a score, giving you the ability to take action in the context of your site: for instance requiring additional factors of authentication, sending a post to moderation, or throttling bots that may be scraping content.
- reCAPTCHA v2 
  - "I'm not a robot" Checkbox
  - Invisible reCAPTCHA badge
  - Android


I choose reCAPTCHA v2 Checkbox, seems most site use that type.

1. render the widget
Two ways can do that:

1) Automatically render
```
<html>
  <head>
    <title>reCAPTCHA demo: Simple page</title>
    <script src="https://www.google.com/recaptcha/api.js" async defer></script>
  </head>
  <body>
    <form action="?" method="POST">
      <div class="g-recaptcha" data-sitekey="your_site_key"></div>
      <br/>
      <input type="submit" value="Submit">
    </form>
  </body>
</html>
```

2) Explicitly render
```
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"
    async defer>
</script>
```

[more attributes](https://developers.google.com/recaptcha/docs/display)

2. Server side verifying

3 way to get user's response `token`
1) g-recaptcha-response POST parameter when the user submits the form on your site
2) grecaptcha.getResponse(opt_widget_id) after the user completes the reCAPTCHA challenge
3) As a string argument to your callback function if data-callback is specified in either the g-recaptcha tag attribute or the callback parameter in the grecaptcha.render method

API Request
URL: https://www.google.com/recaptcha/api/siteverify METHOD: POST
```
payload: {
  secret: 'MY_SECRET_KEY', // Required. The shared key between your site and reCAPTCHA.
  response: 'token', // Required. The user response token provided by the reCAPTCHA client-side integration on your site.
  remoteip: 'MY_IP', llOptional. The user's IP address.
}
```

JSON Response
```
{
  "success": true|false,
  "challenge_ts": timestamp,  // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
  "hostname": string,         // the hostname of the site where the reCAPTCHA was solved
  "error-codes": [...]        // optional
}
```
5 Awesome Custom Dialog Designs Made with Jetpack Compose
Tags: android, kotlin, showdev, mobile
Published: 2022-07-02 10:41:41

This post is originally written on [SemicolonSpace Blog](https://semicolonspace.com/jetpack-compose-custom-dialog-designs/).

# #1:

![#1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7k756e7suhr16o3brs1o.png)

This is a loading dialog box. It contains a CircularProgressIndicator with gradient background. The animation is implemented with infinite transition API.

Source Code: [Loading Dialog](https://semicolonspace.com/jetpack-compose-dialog-loading/)

# #2:

![#2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w2amg71i7p2gpyytv0br.png)

It is a delete confirmation pop-up box.

Source Code: [Delete Dialog 1](https://semicolonspace.com/jetpack-compose-custom-dialog/)

# #3:

![#3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ruvimxbl7lj4sj8e0cu1.png)

It looks beautiful. It is the same as the above one but the icon is placed at the top center of the box and the buttons are changed a little bit.

Source Code: [Delete Dialog 2](https://semicolonspace.com/jetpack-compose-custom-dialog-2/)

# #4:

![#4](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ebjsd924weo83s6q1b1z.png)

It is a 2 FA dialog box. It has two buttons. The positive button is for setting up the 2 step verification and the negative one is to dismiss the dialog.

Source Code: [2-FA Pop-up Dialog](https://semicolonspace.com/jetpack-compose-dialog-2fa/)

# #5:

![#5](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aknveo8ib9fg35r4r0e0.png)

This is a full-screen dialog. It shows a congratulations message and a share button.

Source Code: [Full-Screen Dialog](https://semicolonspace.com/jetpack-compose-full-screen-dialog/)

Thanks for reading. These are the custom dialog designs I made with Jetpack Compose. If you have any doubts or suggestions, leave a comment below.
Minimal Blog template with Tailwind CSS
Tags: blog, webdev, tailwindcss, tutorial
Published: 2022-07-02 10:19:21

Minimal Blog template with Tailwind CSS. 

In this tutorial video we create a minimal blog template with Tailwind CSS.  We create a very modern looking blog/magazine front page with tailwind.

**_Youtube video_**

{% embed https://www.youtube.com/watch?v=5osThN2FTsY %}
Why Git(Hub)?
Tags: github, git, discuss, todayilearned
Published: 2022-07-02 10:13:58

## I also asked myself this question
when I started programming. What is GitHub, or even Git even meant for? Why not just use A Zoom meeting and then send an email to the other guy to update their code?
<br>
## GitHub
I was also using repl.it when I was young. That was live-coding and monitoring! To me, I felt GitHub was not useful, as repl.it was better. Also note that only it was only today that I found out that GitHub was older than Repl.it.
<br>
But yeah, why not just send code via email? We can compare it and change it the way we want... so yeah.
<br>
### But the problem is this.
is that nobody knows what is happening to the code, or when to send it, or how to change long lines of code via email and manually scanning the changed stuff. And so, GitHub was needed.<br>
It automatically scans for changes and then tells you, and a person can do a pull request of a fork (or another piece of the code) and then we can review it without even MEETING the person on site or on a video-conferencing software.
<br>
## Git
However, once I started using GitHub, I did not do anything in the first days of creating an account. I did not know how to use Git and did not even learn anything other than Python functions at that time, and now I have not only done cool Python Projects, but also built over 3 websites and have over 5 programming languages under my belt.
<br>
But once I was familiar with Python and HTML, I went on to GitHub to try again. With an HTML file, of course. You can still find my first repo and the silly commit messages I wrote. I really loved the colorful interface of Git Bash and I am still using it today.
<br>
<br>
## My thoughts on these 2 pieces of software
GitHub really helped me meet people and collaborate with them, them unknowingly teaching and familiarizing me with coding and made me more experienced.
<br>
Although other software for collaboration and programming are now more developed, GitHub and Git remain the trusted and most widely used collaboration and cloud storage space, which were the basic problems programmers once had.
<br>
<br>
### So, that was how I had learnt about Git & GitHub.
What do you think about GitHub and features they should include (such as live code editing like repl.it)?
How to upgrade AWS CDK stacks from CDKv1 to v2
Published: 2022-07-02 10:09:20

## **Background**

On June 1, 2023, AWS CDK version 1 will reach the end-of-support. [AWS CDK Maintenance Policy](https://github.com/aws/aws-cdk-rfcs/blob/master/text/0079-cdk-2.0.md#aws-cdk-maintenance-policy)

## **The Old Way**
With CDKv1, we defined our CDK app packages through a requirements.txt file

```
aws-cdk.core=={cdk_version1}",
aws-cdk.aws_codebuild=={cdk_version1}",
aws-cdk.aws_cloudtrail=={cdk_version1}",
aws-cdk.aws_codepipeline=={cdk_version1}",
aws-cdk.aws_codepipeline_actions=={cdk_version1}",
aws-cdk.aws_events=={cdk_version1}",
aws-cdk.aws_events_targets=={cdk_version1}",
aws-cdk.aws_iam=={cdk_version1}",
aws-cdk.aws_lambda_event_sources=={cdk_version1}",
aws-cdk.aws_lambda=={cdk_version1}",
aws-cdk.aws_s3=={cdk_version1}",
aws-cdk.aws_kms=={cdk_version1}
aws-cdk.aws-ec2==cdk_version1
aws-cdk.aws-elasticloadbalancingv2==cdk_version1
aws-cdk.aws-lambda==cdk_version1

boto3
pytest
-e .
```
It could potentially be blocked by the package manager and we might get overwhelmed by the aws-cdk packages name. 

## **CDK version 2**

Now, CDK and all stable constructs are now combined in 1 package/module. Experimental modules still need to be installed one by one.

It makes things much easier with aws-cdk-lib 

## **Preparation** 
To make changes easier, I would create a virtual environment isolated it from my CDKv1, because most my CDK apps are written in python. 

`python3 -m venv .cdkv2 `

And activate your new virtual environment and run pip install to install the cdk v2 lib

`source .cdkv2/bin/activate`

Note: Move all the old aws-cdk v1 package to another txt file, for example - requirements-dev.txt
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c1caznbgtadzem5fk26g.png)

The requirement.txt look similar to below depending on your CDK version, use cdk --version to find out. 

```
aws-cdk-lib==2.15.0
constructs>=10.0.0,<11.0.0
```

The cdk.json needs to be adjusted as well, some of the options in CDK v1 are now deprecated, which also simplify a lot in the cdk.json file

overall, it looks something like below:

```
{
  "app": "python app.py",
  "context": {
    "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": false,
    "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": false,
    "@aws-cdk/aws-rds:lowercaseDbIdentifier": false,
    "@aws-cdk/core:stackRelativeExports": false,
  }
}
```

**## Change the imports**

All the mature and stable release are in the aws-cdk-lib. Most cdk apps only need to change import statements


Example that I have - 

```
from aws_cdk import core
from aws_cdk.core import Tags
import aws_cdk.aws_iam as iam
import aws_cdk.aws_lambda as _lambda 
```

Change to 

```
from constructs import Construct

from aws_cdk import (
    aws_iam as iam,
    aws_lambda as _lambda,
    Stack,
    CfnOutput,
    Tags
)
```

now re-bootstrap the env to the account by simply run

```
cdk bootrap
```

Lukcy that I don't have any error, I saw other people have issue with cdk bootrap version conflict.
[시스템 프로그래밍] 파일 열기, 닫기
Tags: systemprogramming
Published: 2022-07-02 09:52:24

### Low-level vs High-level file IO

- Low-Level File IO (System call)
    - System call을 이용해서 파일 입출력 수행
    - File descriptor 사용
    - Byte 단위로 디스크에 입출력
    - 특수 파일에 대한 입출력 가능
- High-Level File IO (Buffered IO)
    - C Standard library를 사용해서 파일 입출력 수행
    - File pointer 사용
    - 버퍼(block) 단위로 디스크에 입출력
        - 여러 형식의 입출력 지원



### Opening files - open(2)

```c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int	open(const char *pathname, int flags [, mode_t mode]);
```

- `pathname` (file path)
    - 열려는 파일의 경로 (파일 이름 포함)
- `flags` (file state flags. Man page 및 <sys/fcntl.h> 참조)
    - 파일을 여는 방법(access mode) 설정
    - 여러 플래그 조합 가능 (OR bit operation ( | ) 사용)
- `mode` (file access permission. Man page 및 <sys/stat.h> 참조)
    - 파일을 새로 생성(O_CREATE) 할 때만 유효
    - 파일 권한 설정 값 사용 (예, 644)
    - 정의 된 플래그 사용
        - 여러 플래그 조합 가능 (OR bit operation ( | ) 사용)
- return: file descriptor



### File descriptor

- 열려 있는 파일을 구문하는 정수(integer) 값
    - 특수 파일 등 대부분의 파일을 지칭 가능
    - Process별로 kernel이 관리
- 파일을 열 때 순차적으로 할당 됨
    - Process 당 최대 fd 수 = 1,024 (default, 변경 가능)
- Default fds (수정 가능)
    - 0: stdin
    - 1: stdout
    - 2: stderr



### File table

- 열린 파일을 관리하는 표
    - Kernel이 process별로 유지
    - 열린 파일에 대한 각종 정보 관리
        - Access mode, file offset, pointer to files



### Closing Files - close(2)

```c
#include <unistd.h>

int	close(int fd);
```

- `fd` (file descriptor)
    - 닫으려는 file descriptor
- return
    - 0: success
    - -1: error



### 실습

파일 열고 닫기

```c
#include <sys/types,h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int	main(void)
{
    int		fd;
    mode_t	mode;
    
    mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; // 644
    fd = open("hello.txt", O_CREAT, mode);
    if (fd == -1)
    {
        perror("Creat");
        exit(1);
    }
    close(fd);
    return (0);
}
```



### 참고

- https://www.youtube.com/watch?v=prcFDhhxHt8&list=PLBrGAFAIyf5pIIFQv_U1dG36L5rylTvbx&index=8
Topological Sort in Interviews
Tags: programming, interview, tutorial
Published: 2022-07-02 08:55:49

Topological Sort is used to find a linear ordering of elements that have dependencies on each other. For example, if event ‘B’ is dependent on event ‘A’, ‘A’ comes before ‘B’ in topological ordering.

This pattern defines an easy way to understand the technique for performing topological sorting of a set of elements.

The pattern works like this:

Initialization 

a) Store the graph in adjacency lists by using a HashMap 

b) To find all sources, use a HashMap to keep the count of in-degrees

Build the graph and find in-degrees of all vertices 
a) Build the graph from the input and populate the in-degrees HashMap.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1sq0k2oywpsiezifi1zg.png)

Find all sources 
a) All vertices with ‘0’ in-degrees will be sources and are stored in a Queue.
Sort 
a) For each source, do the following things: 
—i) Add it to the sorted list. 
 — ii)Get all of its children from the graph. 
 — iii)Decrement the in-degree of each child by 1.  
— iv)If a child’s in-degree becomes ‘0’, add it to the sources Queue. 

b) Repeat (a), until the source Queue is empty.
How to identify the Topological Sort pattern:

The problem will deal with graphs that have no directed cycles

If you’re asked to update all objects in a sorted order
If you have a class of objects that follow a particular order


Problems featuring the Topological Sort pattern:
Task scheduling
Minimum height of a tree
Leetcode Solutions: Multiply Strings
Tags: python, leetcode, programming
Published: 2022-07-02 08:44:21

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.


```py
class Solution(object):
    def multiply(self, num1, num2):
        """
        :type num1: str
        :type num2: str
        :rtype: str
        """
        
        product = num1 + "*" + num2
        
        return str(eval(product))
        

```
#2. Setting up server , Db connectivity and custom script☀
Tags: webdev, react, mongodb, javascript
Published: 2022-07-02 08:41:04

## Below is the instructions to setting up the server and db connectivity.



## Setting up server in server.js file 💻

1. Create server.js file within the root folder and follow below code. Note that we are using express for the server if you want you can use node or any other lib you want.

```
const express = require('express')
const connectDB = require('./config/db');
const app = express();
connectDB();

const PORT = process.env.PORT || 5000;

app.get('/', (req, res) => res.send('API Test'))


app.listen(PORT, () => {
    console.log(`Server is running at ${PORT}`)
})

```

## For DB follow below instructions 💾


- Create config folder 
- Create default.json file within config folder
- Create db.json file within this folder
- Now write below code

**File system img**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nk7kvyk0ebr9do2565ie.PNG)

```
//default.json file
{
    "mongoURI": "mongodb+srv://<mongodb username>:<password>@app.i967k.mongodb.net/?retryWrites=true&w=majority"
}
```

```
// db.js file

const mongoose = require('mongoose')
const config = require('config')
const db = config.get('mongoURI');

const connectDB = async () => {
    try {
        await mongoose.connect(db);
        console.log('Db connected ...');
    }
    catch (err) {
        console.log(err);
        process.exit(1);
    }
}

module.exports = connectDB;
 
```

## TO run all this add below in your package.json file (highlighted) and run command in terminal

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/idqt9rtacbf6krst8ize.PNG)

- npm run server
Installing RoR on WSL
Published: 2022-07-02 08:39:36

Installation instructions for wsl: https://docs.microsoft.com/en-us/windows/wsl/install-win10

Assuming wsl is already installed and the terminal is up and running.
First install some dependencies
```shell
sudo apt-get update
sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev software-properties-common libffi-dev
```
Then install rbenv, it is preferred over rvm because the later has some security concerns regarding some scripts it runs on your machine.
```shell
cd

git clone https://github.com/rbenv/rbenv.git ~/.rbenv

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc

echo 'eval "$(rbenv init -)"' >> ~/.bashrc

exec $SHELL

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc

exec $SHELL
```
Then use rbenv to install your preferred version of ruby(You can install multiple based on the version needed for your projects)
```shell
rbenv install 2.7.0

rbenv global 2.7.0 #Sets the default version to use

ruby -v #Show current ruby version
```
Install bundler:
```shell
gem install bundler

rbenv rehash
```
Rails requires a lot of dependencies so you should install NodeJs and yarn
```shell
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -

echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

sudo apt update

sudo apt-get install -y nodejs yarn
```
Then install your preferred version of rails
```shell
gem install rails -v 6.0.3
```
Run rbenv rehash so rails executable becomes available
```shell
rbenv rehash


rails -v
```
A Quick 10-Second Programming Joke For Today
Tags: jokes, dailydeveloperjokes
Published: 2022-07-02 08:00:10

---
title: "A Quick 10-Second Programming Joke For Today"
description: "Check out today's daily developer joke! (a project by Fred Adams at xtrp.io)"
series: "Daily Developer Jokes"
published: true
tags: #jokes, #dailydeveloperjokes
---

Hi there! Here's today's Daily Developer Joke. We hope you enjoy it; it's a good one.

![Joke Image](https://private.xtrp.io/projects/DailyDeveloperJokes/public_image_server/images/5e1258999910d.png)

---

For more jokes, and to submit your own joke to get featured, check out the [Daily Developer Jokes Website](https://dailydeveloperjokes.github.io/). We're also open sourced, so feel free to view [our GitHub Profile](https://github.com/dailydeveloperjokes).

### Leave this post a ❤️ if you liked today's joke, and stay tuned for tomorrow's joke too!

_This joke comes from [Dad-Jokes GitHub Repo by Wes Bos](https://github.com/wesbos/dad-jokes) (thank you!), whose owner has given me permission to use this joke with credit._

<!--
Joke text:
___Q:___ Why did 10 get paid less than "10"?

___A:___ There was workplace inequality.
 -->
A simpler way to import files in VS Code
Tags: vscode, showdev, productivity, webdev
Published: 2022-07-02 07:34:01

File Import - Paste the path to other files easily

Copy a file path using the shortcut 'ctrl/cmd+shift+c' and paste relative path to this file using 'ctrl/cmd+shift+v'.

There is no easy way to import files. We need to manually enter the path to another file by looking at the file tree and breadcrumbs.
Simplifying file import by providing 3 ways to import the relative path.
Copy-paste path from:
1. context menu
2. keyboard shortcut (cmd/ctrl+shift+c & cmd/ctrl+shift+v)
3. extension commands


![File import demo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0vpkarbvnu5276ekyb2s.gif)

Checkout the extension on Product Hunt - https://www.producthunt.com/posts/file-ops-2

---
Other products
* [Dev Box](https://chrome.google.com/webstore/detail/devbox/moifkpmfincoglpljkonmgnfaeonlgmo) - A UI for local storage
* [Array Builder](https://bit.ly/array-builder) - A work tracker for software developers
* [Fireboard](https://bit.ly/fireboardapp) - A work tracker for software developers
* [File Ops](https://bit.ly/file-ops) - A VS Code extension to easily tag/alias files & quick switch between files