Cancellation Token Pattern in Python

Hello! 👋 The Cancellation Token Pattern article is a pattern inspired by C#’s CancellationToken struct and Golang’s context package. The main idea of the pattern is to allow the user of an API to cancel its operations, but in order for this pattern to work, the API must be written with the cancellation token pattern in mind. To use the pattern, you need a class that represents a cancellation token. Here’s my simple version: ...

March 9, 2024 · 3 min · Denis Nutiu

Image tagging with Deep Learning

Hello everyone 👋, I’ve been playing with FastAI and deep learning for a week or so and I’ve decided to combine my passion for software with my passion for photography. I’m working on an app or maybe a library that allows you to generate tags for a photo. For an amateur photographer like me it’s quite useful as I don’t always have inspiration to write tags for my photos and sometimes the tags I write are inconsistent. ...

July 2, 2023 · 3 min · Denis Nutiu

Deploy a FastAI model with FastAPI

Hello everyone 👋, In this quick post I’ll show you how to deploy a FastAI model using FastAPI. It’s a follow-up to my previous post from here and it is partially based on this FastAI lecture: Exporting the Model Before we create the API, we need to export the model as a pickle file. ...

June 21, 2023 · 3 min · Denis Nutiu

FastAI GPU Support

Hello everyone 👋, This is my first blog post about AI, it’s a quick post on how to enable GPU support for the FastAI library. I have avoided getting into AI for some time now, I thought that it would involve lots of complicated math, and I was not sure that it would be worth the effort, I did not get very good grates in my college math classes 😅. ...

June 20, 2023 · 3 min · Denis Nutiu

Overflowing Buckets

Hello everyone 👋, Today I want to share with you a problem I’ve encountered along my journey. The problem is fairly simple: You have a finite number of water units. You have a finite number of buckets. You need to distribute the water units into the buckets. Each bucket has a maximum capacity. When a bucket is full, the water overflows into the next two buckets by splitting evenly. You need to print the number of the buckets that are full. The following diagram illustrates the problem: ...

June 15, 2023 · 3 min · Denis Nutiu

Python Development in Windows with WSL2

Hello, I’ve published a new video on my YouTube channel. It’s a short tutorial on how to develop Python project on Windows by setting the remote interpreter from Pycharm to use a WSL2 Python interpreter or by running Pycharm directly in WSL2. Thank you!

January 15, 2023 · 1 min · Denis Nuțiu

How to install a specific Python version on Linux

Hello, 👋 In this article I will show you how to install Python versions on Linux using the following methods: compiling from source, dead snakes ppa and pyenv. To make things easier, if you want to follow along in an environment that you can break, you can create a local Kubernetes cluster using Minikube. Next, I’m going to use the following yaml file to create an Ubuntu pod: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 apiVersion: v1 kind: Pod metadata: name: ubuntu labels: app: ubuntu spec: containers: - image: ubuntu command: - "sleep" - "604800" imagePullPolicy: IfNotPresent name: ubuntu restartPolicy: Always Save the above yaml in a file ubuntu_pod.yaml and run: ...

February 5, 2022 · 2 min · Denis Nuțiu

LeetCode: Flood Fill

Hello, Here’s my solution for the flood fill problem, found on LeetCode. If you want me to write about certain topics please let me know in the comments, thank you! Link to the problem: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 """ An image is represented by a 2-D array of integers, each integer representing the pixel value of the image (from 0 to 65535). Given a coordinate (sr, sc) representing the starting pixel (row and column) of the flood fill, and a pixel value newColor, "flood fill" the image. To perform a "flood fill", consider the starting pixel, plus any pixels connected 4-directionally to the starting pixel of the same color as the starting pixel, plus any pixels connected 4-directionally to those pixels (also with the same color as the starting pixel), and so on. Replace the color of all of the aforementioned pixels with the newColor. At the end, return the modified image. """ from typing import List, Tuple class Solution: def __init__(self): self.visited = set() def _set_pixel(self, image: List[List[int]], point: Tuple[int, int], value: int): try: image[point[0]][point[1]] = value except IndexError: pass def _get_pixel(self, image: List[List[int]], point: Tuple[int, int]): if point[0] < 0 or point[1] < 0: return None try: return image[point[0]][point[1]] except IndexError: return None def _floodFill(self, image: List[List[int]], point: Tuple[int, int], color: int, newColor: int) -> List[List[int]]: pixel = self._get_pixel(image, point) if pixel is not None and pixel == color and point not in self.visited: self.visited.add(point) self._set_pixel(image, point, newColor) self._floodFill(image, (point[0], point[1] + 1), color, newColor) self._floodFill(image, (point[0], point[1] - 1), color, newColor) self._floodFill(image, (point[0] + 1, point[1]), color, newColor) self._floodFill(image, (point[0] - 1, point[1]), color, newColor) def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]: point = (sr, sc) pixel = self._get_pixel(image, point) self.visited = set() if pixel is not None: self._floodFill(image, point, pixel, newColor) return image if __name__ == '__main__': s = Solution() out = s.floodFill([[1,1,1],[1,1,0],[1,0,1]], 1, 1, 2) print("Output", out) assert out == [[2,2,2],[2,2,0],[2,0,1]] out = s.floodFill([[0,0,0],[0,0,0]], 0, 0, 2) print("Output", out) assert out == [[2,2,2],[2,2,2]] out = s.floodFill([[0,0,0],[0,1,1]], 1, 1, 1) print("Output", out) assert out == [[0, 0, 0], [0, 1, 1]]

July 16, 2020 · 2 min · Denis Nuțiu

LeetCode: Arrays 101: Inserting Items Into an Array

Hello, Here are my solutions for the second part of the card: Arrays 101, from LeetCode. Duplicate Zeroes Given an array of integers, remove duplicate zeroes and shift the remaining elements. 1 2 3 4 5 6 7 8 9 10 11 12 13 class Solution: def duplicateZeros(self, arr: List[int]) -> None: """ Do not return anything, modify arr in-place instead. """ index = 0 arr_length = len(arr) while index < arr_length: if arr[index] == 0: arr.insert(index, 0) arr.pop() index += 1 index += 1 Merge Sorted Array Given two sorted arrays, merge them together into nums1. ...

April 30, 2020 · 2 min · Denis Nuțiu

LeetCode: Add Two Numbers Python 3 iterative solution

[Problem Link] Hello, Here’s my solution for the add two numbers problem on LeetCode. Example: 1 2 3 <strong>Input:</strong> (2 -> 4 -> 3) + (5 -> 6 -> 4) <strong>Output:</strong> 7 -> 0 -> 8 <strong>Explanation:</strong> 342 + 465 = 807. When doing problems on websites such as LeetCode, I like to code in my own IDE, that’s why you’ll see some additional helper functions besides the solution code. ...

March 15, 2020 · 2 min · Denis Nuțiu