Skip to content

Instantly share code, notes, and snippets.

View sohang3112's full-sized avatar
:octocat:

Sohang Chopra sohang3112

:octocat:
View GitHub Profile
@sohang3112
sohang3112 / terminal_show_links.py
Created March 2, 2026 04:17
Show web url-like behaviour in terminal using ANSI escape codes
@sohang3112
sohang3112 / tee.py
Created January 27, 2026 15:27
Implementing tee() function of itertools
def tee(it):
it = iter(it)
cache = []
counts = [0,0]
class _Iterator:
def __init__(self, i, j):
self.i = i
self.j = j
@sohang3112
sohang3112 / parse_outlook_safe_link.py
Created December 22, 2025 06:24
Parse actual url from "safe links" of Outlook
@sohang3112
sohang3112 / mathjax_NOTES.md
Last active March 14, 2026 00:44
Notes on MathJAX (a Latex-like mini language using which pretty math expressions can be embedded in Github Markdown documents)

MathJAX NOTES

Reference: MathJAX Macros table - macros start with \. Github Markdown allows a limited subset of MathJAX and no MathJAX extensions can be used. But in static site generators, extensions can be installed using <script> tag.

Inline expressions are written within $ $, block expressions within $$ $$. Curly Brackets { } are required for grouping multiple symbols where otherwise only a single character/symbol is expected

  • eg. after _ (superscript under) and ^ (power/subscript over).
@sohang3112
sohang3112 / git_squash_merge_commits.py
Created December 4, 2025 19:16
Shrink .git folder size by converting merge commits into normal squash commits
# 'Squash Merge' video by anthonywritescode, this is script shown at timestamp 16:50 :
# https://youtu.be/5_8FTivl8Vs?si=krcdLDevrAC_DLuo&t=1013
# Uses https://github.com/newren/git-filter-repo (python script)
# Explanation: `git cat-file commit COMMIT_ID` shows parent commit id
# normal commits have 1 parent, merge commits have 2 parents
# this script simply deletes 1 parent (keeping only parent id of main branch),
# converting merge commit into normal (squash) commit
# An impressive example of this script is shown,
@sohang3112
sohang3112 / gpg_sign_commits_github.md
Created December 3, 2025 12:09
GitHub: Create GPG key and sign commits with it (required by some open source projects)
$ gpg --full-generate-key
$ gpg --list-secret-keys --keyid-format=long
$ gpg --armor --export GPG_KEY_ID    # get key id from prev list command - see details in above link

Copy output of last command (gpg armor export). Go to Github > Settings > SSH and GPG Keys > New GPG Key and paste it.

@sohang3112
sohang3112 / pdf2ipynb.py
Created November 17, 2025 12:53
Convert PDF files to Jupyter Notebook .ipynb file
#! /usr/bin/env python3
import os
import fitz # PyMuPDF
import nbformat
# Source: https://www.reddit.com/r/learnpython/comments/1ji0qwz/comment/mjblesy/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button
def pdf_to_ipynb(pdf_path: os.PathLike, ipynb_path: os.PathLike) -> None:
"""Convert PDF -> Jupyter Notebook .ipynb file."""
doc = fitz.open(pdf_path)
@sohang3112
sohang3112 / compress_consecutive_chars.hs
Last active April 13, 2025 08:33
(Haskell) Compresses a string by counting consecutive repeating characters.
{-# LANGUAGE BangPatterns #-}
import Data.List (foldl')
-- | Compresses a string by counting consecutive repeating characters.
--
-- Returns a list of tuples where each tuple consists of a character and the
-- number of its consecutive occurrences in the string.
--
-- This function uses 'reverse', 'foldl'' and bang patterns for strict accumulation.
@sohang3112
sohang3112 / git_fork.sh
Created April 8, 2025 21:10
Fork repo to a different Git platform.
# Example of forking ziglings repo from CodeBerg to Github
UPSTREAM=https://codeberg.org/ziglings/exercises.git
FORK=git@github.com:sohang3112/ziglings.git # mk empty Github repo & copy SSH url (as Github doesn't support push with HTTPS)
git clone $UPSTREAM ziglings/ # (optional argument) used custom cloned folder name ziglings/
cd ziglings/ # go to cloned repo
git remote set-url origin $FORK
git remote add upstream $UPSTREAM
git push
@sohang3112
sohang3112 / default_dict_implementation.py
Last active February 25, 2025 21:50
Re-implementing DefaultDict (from Python standard library) using __missing__ dunder method
"""Using dict __missing__() to implement DefaultDict."""
from typing import Any, Callable
class DefaultDict(dict):
"""Implementing typing.DefaultDict.
A dict that returns a default value (instead of raising KeyError) when a key is missing.
>>> d = DefaultDict(list, {'a': 1, 'b': 2})
>>> d['a']