Skip to content

Instantly share code, notes, and snippets.

View princemaple's full-sized avatar
🏠
Working from home everyday

Po Chen princemaple

🏠
Working from home everyday
View GitHub Profile
@princemaple
princemaple / pg-upgrade.sh
Last active October 28, 2025 09:07
Upgrade pg in docker
#!/usr/bin/env bash
set -euo pipefail
# Configuration
REPLICATION_USER="${REPLICATION_USER:-replicator}"
REPLICATION_PASSWORD="${REPLICATION_PASSWORD:-replpass}"
REPLICATION_PORT="${REPLICATION_PORT:-5432}"
# Cleanup temporary files on exit
trap 'rm -f globals.sql' EXIT
@princemaple
princemaple / extract_signature.py
Created August 20, 2023 11:25
Extract signature photo to a png file with transparent background and minimal bounding box
from PIL import Image
def grayscale(image):
return image.convert("L")
def find_dark_pixels(image, threshold=50):
dark_pixels = []
grayscale_image = grayscale(image)
grayscale_data = grayscale_image.getdata()
@princemaple
princemaple / convert.py
Last active July 16, 2021 02:05
Convert between xls and xlsx with Python (and a simpler version in PowerShell)
from pathlib import Path
import win32com.client as win32
def convert(excel, path: Path):
'''
FileFormat = 51 is for .xlsx extension
FileFormat = 56 is for .xls extension
'''
wb = excel.Workbooks.Open(str(path))
@princemaple
princemaple / scoop.txt
Last active July 15, 2021 03:39
My installed scoop packages
Installed apps:
7zip 19.00
bat 0.18.2 [main]
brotli 1.0.9_5 [main]
cacert 2021-07-05 [main]
ccleaner 5.82.8950 [extras]
dark 3.11.2 [main]
delta 0.8.3 [main]
duf 0.6.2 [main]
@princemaple
princemaple / midi_parser.ex
Created April 24, 2018 02:47
Midi parser in Elixir
defmodule MidiParser do
def parse(b) do
{:ok, pid} = StringIO.open("")
b |> parse_header(pid) |> parse_body(pid)
{:ok, {_in, out}} = StringIO.close(pid)
out
end
def parse_header(<<
"MThd",
@princemaple
princemaple / objViewer.html
Created November 18, 2017 12:15
obj file viewer
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden;
{
init: function(elevators, floors) {
var minLevel = floors[0].floorNum(),
maxLevel = floors[floors.length - 1].floorNum();
var F = floors.map(function(floorInfo) {
var info = {
requireUp: false,
requireDown: false,
comingElevator: null,