Skip to content

Instantly share code, notes, and snippets.

View dinhkhanh's full-sized avatar

Tran Dinh Khanh dinhkhanh

View GitHub Profile
@dinhkhanh
dinhkhanh / CompAI-vs-Drata.md
Last active June 27, 2025 05:04
Comp AI vs. Drata: Deep Dive Comparison for Modern Compliance Automation
Feature Comp AI (Open Source) Drata (Closed Source)
Cost Free/self-hosted or $1,000/mo ~$10,000–$20,000+/year
Frameworks SOC 2, ISO 27001, GDPR (+custom) SOC 2, ISO 27001, HIPAA, etc.
Audit Experience Auditor flexibility, custom prep Integrated network, less flexible
Evidence Collection AI-driven, agentic, open API 250+ integrations, real-time
Customization Full (code, controls, workflows) Limited
Transparency Complete (open code) Limited
Support Community, marketplace, direct Email/chat, partner network
@dinhkhanh
dinhkhanh / CompAI-vs-Vanta.md
Last active June 27, 2025 05:00
Comp AI vs. Vanta: A Deep Dive Comparison for 2025
Feature Comp AI (Open Source) Vanta (Closed Source)
Cost Free/self-hosted or $1,000/mo ~$10,000–$20,000+/year
Frameworks SOC 2, ISO 27001, GDPR (+custom) SOC 2, ISO 27001, HIPAA, etc.
Audit Experience Auditor flexibility, 1-click export Integrated network, streamlined but less flexible
Evidence Collection AI-driven, agentic, open API 250+ integrations, real-time
Customization Full (code, controls, workflows) Limited
Transparency Complete (open code) Limited
Support Community, marketplace, direct Email/chat, partner network
@dinhkhanh
dinhkhanh / proximity-prefetch.tsx
Created April 6, 2025 07:43 — forked from pontusab/proximity-prefetch.tsx
Next.js Proximity Prefetch (PPF)
"use client";
import { useRouter } from "next/navigation";
import type { ReactNode } from "react";
import { useCallback, useEffect, useState } from "react";
interface ProximityPrefetchProps {
children: ReactNode;
threshold?: number;
predictionInterval?: number;

Folder Structure

Please note

While this gist has been shared and followed for years, I regret not giving more background. It was originally a gist for the engineering org I was in, not a "general suggestion" for any React app.

Typically I avoid folders altogether. Heck, I even avoid new files. If I can build an app with one 2000 line file I will. New files and folders are a pain.

@dinhkhanh
dinhkhanh / script.py
Created September 29, 2021 23:57
Get Google Search Results
import undetected_chromedriver.v2 as uc
from selenium.webdriver.common.by import By
import re
opts = uc.ChromeOptions()
# opts.add_argument('--headless')
# opts.add_argument('--disable-gpu')
driver = uc.Chrome(options=opts)
keywords = ['Kể', 'từ', 'khi', 'dẫn', 'dắt', 'các', 'đội', 'tuyển', 'Việt', 'Nam', 'cuối', 'năm', '2017,', 'HLV', 'Park', 'chưa', 'từng', 'thua', 'các', 'đối', 'thủ', 'Đông', 'Nam', 'Á.', 'Ông', 'đặc', 'biệt', 'có', 'duyên', 'với', 'Malaysia', 'và', 'Indonesia.', 'Tại', 'vòng', 'loại', 'thứ', 'hai', 'World', 'Cup', '2022,', 'đội', 'tuyển', 'cùng', 'bảng', 'G', 'với', 'hai', 'đối', 'thủ', 'này', 'và', 'toàn', 'thắng', 'cả', 'bốn', 'trận.', 'Điểm', 'bất', 'lợi', 'với', 'Việt', 'Nam', 'là', 'cùng', 'lúc', 'thi', 'đấu', 'nhiều', 'mặt', 'trận.', 'Bên', 'cạnh', 'AFF', 'Cup', '2020,', 'đội', 'tuyển', 'còn', 'phải', 'đã', 'vòng', 'loại', 'thứ', 'ba', 'World', 'Cup', '2022', '-', 'khu', 'vực', 'châu', 'Á.', 'Điều', 'này', 'khiến', 'HLV', 'Park', 'phải', 'tính', 'toán', 'về', 'bài', 'toán', 'lực',
@dinhkhanh
dinhkhanh / Disable MDM, DEP notification on Big Sur.md
Created October 31, 2020 13:22
Disable MDM, DEP notification on Big Sur

Disable MDM, DEP notification on Big Sur

Step 1. Disable SIP. Boot into Recovery Mode. Open Terminal, type this and hit Enter

csrutil disable

Step 2. Reboot into Recovery Mode again. Open Terminal, using these commands

class AdsManager {
constructor() {
let supportedAPIs = FBInstant.getSupportedAPIs();
this.canShowInterstitialAds = supportedAPIs.includes('getInterstitialAdAsync');
this.canShowRewardedVideoAds = supportedAPIs.includes('getRewardedVideoAsync');
if (!this.canShowInterstitialAds) {
Sentry.captureMessage(window.platform + ' can\'t show interstitital ads');
}
if (!this.canShowRewardedVideoAds) {
Sentry.captureMessage(window.platform + ' can\'t show rewarded video ads');
@dinhkhanh
dinhkhanh / gdrive-backup-setup.sh
Created March 5, 2018 14:23 — forked from stilliard/gdrive-backup-setup.sh
Backup server files with Google Drive
# ref: https://github.com/prasmussen/gdrive
# prerequisite:
# In google drive, setup your folder for storing the backups
# Then grab the code from the url e.g. https://drive.google.com/drive/folders/xxxxx where xxxxx is the code
# This code will be used later in the cron command, keep it secret, keep it safe
# install gdrive sync for backups
wget https://drive.google.com/uc?id=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA -O /usr/local/bin/gdrive
chmod 755 /usr/local/bin/gdrive
@dinhkhanh
dinhkhanh / hhvm.conf
Created January 13, 2018 02:14 — forked from tomazzaman/hhvm.conf
Monit configurations for commonly used services
check process hhvm with pidfile /var/run/hhvm/pid
group hhvm
start program = "/usr/sbin/service hhvm start" with timeout 60 seconds
stop program = "/usr/sbin/service hhvm stop"
if failed unixsocket /var/run/hhvm/hhvm.sock then restart
if mem > 400.0 MB for 1 cycles then restart
if 5 restarts with 5 cycles then timeout
@dinhkhanh
dinhkhanh / clean-up-boot-partition-ubuntu.md
Created January 11, 2018 01:44 — forked from ipbastola/clean-up-boot-partition-ubuntu.md
Safest way to clean up boot partition - Ubuntu 14.04LTS-x64

Safest way to clean up boot partition - Ubuntu 14.04LTS-x64

Reference

Case I: if /boot is not 100% full and apt is working

1. Check the current kernel version

$ uname -r