Import Quarto posts and expand blog sync bridge
Some checks failed
Build / build (push) Has been cancelled
|
|
@ -16,8 +16,47 @@ const BlogPosts = ({
|
|||
// Get the first post as the featured post
|
||||
const featuredPost = posts[0];
|
||||
const remainingPosts = posts.slice(1);
|
||||
const slugFor = (post: any) => post.id.replace(/\/index$/, "");
|
||||
const hrefFor = (post: any) =>
|
||||
collection ? `/${collection}/${post.id}/` : `/${post.id}/`;
|
||||
collection ? `/${collection}/${slugFor(post)}/` : `/${slugFor(post)}/`;
|
||||
|
||||
const PostVisual = ({
|
||||
post,
|
||||
featured = false,
|
||||
}: {
|
||||
post: any;
|
||||
featured?: boolean;
|
||||
}) => {
|
||||
if (post.data.image) {
|
||||
return (
|
||||
<img
|
||||
src={post.data.image}
|
||||
alt={post.data.title}
|
||||
className="aspect-video w-full rounded-lg object-cover transition-transform group-hover:scale-[1.02]"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="bg-accent/70 text-accent-foreground flex aspect-video w-full items-center justify-center rounded-lg border px-6 text-center">
|
||||
<span
|
||||
className={
|
||||
featured ? "font-fraunces text-2xl" : "font-fraunces text-lg"
|
||||
}
|
||||
>
|
||||
{post.data.title}
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
if (!featuredPost) {
|
||||
return (
|
||||
<div className="text-muted-foreground container max-w-3xl py-16">
|
||||
No posts yet.
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="relative py-10 md:py-16 lg:py-20">
|
||||
|
|
@ -35,11 +74,7 @@ const BlogPosts = ({
|
|||
<div className="flex flex-col gap-6 lg:flex-row">
|
||||
<div className="lg:w-1/2">
|
||||
<div className="p-2 lg:p-4">
|
||||
<img
|
||||
src={featuredPost.data.image}
|
||||
alt={featuredPost.data.title}
|
||||
className="aspect-video w-full rounded-lg object-cover transition-transform group-hover:scale-[1.02]"
|
||||
/>
|
||||
<PostVisual post={featuredPost} featured />
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-col justify-center p-4 pb-8 lg:w-1/2 lg:pr-8">
|
||||
|
|
@ -89,11 +124,7 @@ const BlogPosts = ({
|
|||
href={hrefFor(post)}
|
||||
>
|
||||
<div className="p-2">
|
||||
<img
|
||||
src={post.data.image}
|
||||
alt={post.data.title}
|
||||
className="aspect-video w-full rounded-lg object-cover transition-transform group-hover:scale-[1.01]"
|
||||
/>
|
||||
<PostVisual post={post} />
|
||||
</div>
|
||||
<div className="px-4 pb-5 pt-2">
|
||||
<h2 className="mb-2 text-xl font-semibold group-hover:underline">
|
||||
|
|
|
|||
|
|
@ -1,40 +0,0 @@
|
|||
---
|
||||
title: "Algorithmic Sketches: Visualizing Data Structures"
|
||||
description: "Hand-drawn illustrations of algorithms and data structures - making the abstract tangible."
|
||||
pubDate: "Jan 25 2024"
|
||||
image: "https://images.unsplash.com/photo-1581337204873-ef36aa186caa?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Algorithmic Sketches: Visualizing Data Structures
|
||||
|
||||
Sometimes the best way to understand an algorithm is to draw it.
|
||||
|
||||
## Today's Sketch: Red-Black Trees
|
||||
|
||||

|
||||
|
||||
The rotation operation finally clicked when I drew it step-by-step. Each node's journey through the rotation becomes a story.
|
||||
|
||||
## The Process
|
||||
|
||||
1. Start with pencil - mistakes are part of learning
|
||||
2. Trace the algorithm's execution
|
||||
3. Add color to highlight invariants
|
||||
4. Annotate with key insights
|
||||
|
||||
## Why Drawing Helps
|
||||
|
||||
- Forces you to slow down and really see the structure
|
||||
- Reveals patterns that code obscures
|
||||
- Creates memorable mental models
|
||||
- Makes teaching more engaging
|
||||
|
||||
## This Week's Challenge
|
||||
|
||||
Draw your own version of quicksort partitioning. Share it and let's learn from each other's visualizations.
|
||||
|
||||
## The Art in Computer Science
|
||||
|
||||
Algorithms are beautiful. Drawing them reminds us that computer science is as much art as it is science.
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
---
|
||||
title: "Generative Art with p5.js: Creating Beauty from Mathematics"
|
||||
description: "Exploring the intersection of code and creativity through generative art experiments."
|
||||
pubDate: "Feb 18 2024"
|
||||
image: "https://images.unsplash.com/photo-1561070791-2526d30994b5?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Generative Art with p5.js: Creating Beauty from Mathematics
|
||||
|
||||
Code becomes canvas when mathematics meets creativity.
|
||||
|
||||
## Today's Creation: Perlin Noise Flows
|
||||
|
||||
```javascript
|
||||
for (let particle of particles) {
|
||||
let angle = noise(particle.x * 0.01, particle.y * 0.01, frameCount * 0.001) * TWO_PI;
|
||||
particle.velocity = p5.Vector.fromAngle(angle);
|
||||
particle.update();
|
||||
particle.draw();
|
||||
}
|
||||
```
|
||||
|
||||
## The Magic of Randomness
|
||||
|
||||
Controlled randomness creates organic patterns. Perlin noise gives us randomness with continuity - nature's own algorithm.
|
||||
|
||||
## Parameters as Paintbrushes
|
||||
|
||||
- Noise scale: Changes pattern density
|
||||
- Particle count: Affects texture
|
||||
- Color mapping: Sets the mood
|
||||
|
||||
## The Joy of Accidents
|
||||
|
||||
The best discoveries come from "mistakes" - a typo that creates unexpected beauty, a parameter pushed to extremes.
|
||||
|
||||
## Share Your Creations
|
||||
|
||||
Art is meant to be shared. Post your generative experiments and let's inspire each other.
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
---
|
||||
title: "Algorithms in Verse: Bubble Sort Sonnet"
|
||||
description: "Classic algorithms reimagined as poetry - where code meets iambic pentameter."
|
||||
pubDate: "Feb 22 2024"
|
||||
image: "https://images.unsplash.com/photo-1455390582262-044cdead277a?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Algorithms in Verse: Bubble Sort Sonnet
|
||||
|
||||
## Bubble Sort: A Sonnet
|
||||
|
||||
```
|
||||
Compare adjacent elements in pairs,
|
||||
If order's wrong, then swap them into place.
|
||||
Through all the list this simple rule declares:
|
||||
The largest bubbles up to find its space.
|
||||
|
||||
Again we start, but now one less to check,
|
||||
The second largest finds its rightful home.
|
||||
Each pass through makes the chaos less a wreck,
|
||||
Until at last no elements must roam.
|
||||
|
||||
Though simple in its elegance and grace,
|
||||
And easy for beginners to perceive,
|
||||
In practice, it's too slow to win the race—
|
||||
O(n²) we sadly must believe.
|
||||
|
||||
But beauty lies in simplicity's pure art,
|
||||
The bubble sort still teaches at the start.
|
||||
```
|
||||
|
||||
## The Challenge
|
||||
|
||||
Can you write Quicksort as a limerick? Or Binary Search as free verse?
|
||||
|
||||
## Why This Matters
|
||||
|
||||
Poetry forces us to find the essence of an algorithm. The constraint reveals understanding.
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
---
|
||||
title: "Code Haikus: Programming in 5-7-5"
|
||||
description: "Expressing programming concepts through the constrained beauty of haiku."
|
||||
pubDate: "Jan 30 2024"
|
||||
image: "https://images.unsplash.com/photo-1481627834876-b7833e8f5570?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Code Haikus: Programming in 5-7-5
|
||||
|
||||
The constraint of haiku forces clarity. Here are programming concepts distilled to their essence.
|
||||
|
||||
## On Recursion
|
||||
|
||||
```
|
||||
Function calls itself
|
||||
Smaller problems, same pattern
|
||||
Base case stops the loop
|
||||
```
|
||||
|
||||
## On Debugging
|
||||
|
||||
```
|
||||
Print statements bloom wild
|
||||
Binary search through the code
|
||||
Bug reveals itself
|
||||
```
|
||||
|
||||
## On Optimization
|
||||
|
||||
```
|
||||
O(n squared) crawls
|
||||
Refactor to n log n
|
||||
Time complexity
|
||||
```
|
||||
|
||||
## On Git Merge Conflicts
|
||||
|
||||
```
|
||||
<<<<<<< HEAD
|
||||
Your changes, their changes clash
|
||||
Resolution waits
|
||||
```
|
||||
|
||||
## On Learning
|
||||
|
||||
```
|
||||
Stack Overflow searched
|
||||
Tutorial incomplete
|
||||
Understanding dawns
|
||||
```
|
||||
|
||||
## Your Turn
|
||||
|
||||
Write a haiku about your coding experience today. The constraint reveals truth.
|
||||
|
|
@ -1,183 +0,0 @@
|
|||
---
|
||||
title: "The 100 Prisoners Problem: A Beautiful Puzzle in Probability"
|
||||
description: "An interactive exploration of one of the most counterintuitive puzzles in probability theory, where 100 prisoners can escape with over 30% chance using a clever strategy."
|
||||
pubDate: "Oct 13 2025"
|
||||
image: "https://images.unsplash.com/photo-1589829545856-d10d557cf95f?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
import PrisonerGameSimulator from '@/components/problems/PrisonerGameSimulator.tsx';
|
||||
import ProbabilityChart from '@/components/problems/ProbabilityChart.tsx';
|
||||
import PermutationExplorer from '@/components/problems/PermutationExplorer.tsx';
|
||||
import StrategyComparison from '@/components/problems/StrategyComparison.tsx';
|
||||
|
||||
# The 100 Prisoners Problem
|
||||
|
||||
Imagine 100 prisoners, numbered 1 to 100, face an unusual challenge. In a room are 100 boxes, also numbered 1 to 100. Inside each box is a randomly assigned number from 1 to 100 (each number appearing exactly once). The prisoners must find their own number by opening boxes, but here's the catch: **each prisoner can open only 50 boxes**.
|
||||
|
||||
The prisoners can devise a strategy beforehand, but once the challenge begins, they cannot communicate. If **all 100 prisoners** find their number, everyone goes free. If even one prisoner fails, all remain imprisoned.
|
||||
|
||||
What's the best strategy? And what are the odds of success?
|
||||
|
||||
## Try It Yourself!
|
||||
|
||||
Before we dive into the mathematics, let's experience the problem firsthand. Below is a simulator where you can play the game yourself. Choose the number of prisoners (between 5 and 100), and then try to help each prisoner find their number by clicking on boxes.
|
||||
|
||||
<PrisonerGameSimulator client:only="react" />
|
||||
|
||||
---
|
||||
|
||||
## The Naive Strategy
|
||||
|
||||
The most obvious approach is for each prisoner to simply open 50 random boxes. This seems reasonable, but the probability of success is dismal.
|
||||
|
||||
For any single prisoner, the probability of finding their number in 50 random boxes out of 100 is exactly 1/2. Since all 100 prisoners must succeed, and their outcomes are independent under random selection, the probability that everyone succeeds is:
|
||||
|
||||
$$P(\text\{success\}) = \left(\frac\{1\}\{2\}\right)^\{100\} \approx 7.9 \times 10^\{-31\}$$
|
||||
|
||||
That's essentially zero! You're more likely to win the lottery while being struck by lightning... multiple times.
|
||||
|
||||
### Naive Strategy: Probability vs Number of Prisoners
|
||||
|
||||
Watch how the probability of success plummets as we increase the number of prisoners:
|
||||
|
||||
<ProbabilityChart strategy="naive" client:only="react" />
|
||||
|
||||
As you can see, even with just 10 prisoners, the probability drops to about 0.1%. With 100 prisoners, it's practically impossible.
|
||||
|
||||
---
|
||||
|
||||
## The Clever Strategy: Following the Loops
|
||||
|
||||
Here's where mathematics reveals something beautiful. Instead of opening random boxes, each prisoner should follow a simple rule:
|
||||
|
||||
1. **Start by opening the box with your own number**
|
||||
2. **Look at the number inside that box**
|
||||
3. **Open the box with that number next**
|
||||
4. **Continue following this chain**
|
||||
|
||||
Why does this work? The key insight involves understanding permutations and cycles.
|
||||
|
||||
### Understanding Cycles in Permutations
|
||||
|
||||
When we randomly assign 100 numbers to 100 boxes, we're creating a **permutation** of the numbers 1 through 100. Every permutation can be decomposed into **cycles**.
|
||||
|
||||
For example, if:
|
||||
- Box 1 contains number 4
|
||||
- Box 4 contains number 7
|
||||
- Box 7 contains number 1
|
||||
|
||||
Then we have a cycle: 1 -> 4 -> 7 -> 1
|
||||
|
||||
Let's explore this with smaller numbers:
|
||||
|
||||
<PermutationExplorer client:only="react" />
|
||||
|
||||
The interactive explorer above lets you:
|
||||
- Generate all permutations for small values of *n* (3, 4, or 5)
|
||||
- See both standard notation and cycle notation
|
||||
- Filter permutations that have at least one "long cycle" (longer than *n*/2)
|
||||
- Understand why long cycles matter
|
||||
|
||||
### Why This Strategy Works
|
||||
|
||||
Here's the crucial insight: **A prisoner succeeds if and only if they are in a cycle of length ≤ 50**.
|
||||
|
||||
When prisoner k follows the loop strategy:
|
||||
1. They start at box k
|
||||
2. They follow a path through boxes determined by the permutation
|
||||
3. This path forms a cycle that eventually leads back to box k
|
||||
4. If this cycle has length ≤ 50, they'll find their number within 50 opens
|
||||
|
||||
The prisoners **all succeed** if and only if there is **no cycle longer than 50** in the permutation.
|
||||
|
||||
### Calculating the Probability
|
||||
|
||||
The probability that a random permutation of 100 elements has no cycle longer than 50 is:
|
||||
|
||||
$$P(\text\{success\}) = 1 - \sum_\{k=51\}^\{100\} \frac\{1\}\{k\}$$
|
||||
|
||||
Computing this sum:
|
||||
|
||||
$$P(\text\{success\}) = 1 - \left(\frac\{1\}\{51\} + \frac\{1\}\{52\} + \cdots + \frac\{1\}\{100\}\right) \approx 0.3118$$
|
||||
|
||||
That's over **31%**! This is astronomically better than the naive strategy's probability of essentially zero.
|
||||
|
||||
### Loop Strategy: Probability vs Number of Prisoners
|
||||
|
||||
<StrategyComparison client:only="react" />
|
||||
|
||||
## The Mathematics Behind It
|
||||
|
||||
### Why Does the Cycle Length Matter?
|
||||
|
||||
In a permutation of n elements, prisoner i will find their number within k tries using the loop strategy if and only if i belongs to a cycle of length at most k.
|
||||
|
||||
For n = 100 and k = 50:
|
||||
- The probability that a specific prisoner is in a cycle of length > 50 is: Σ(j=51 to 100) of 1/100
|
||||
- But we care about whether ANY prisoner is in such a cycle
|
||||
- The probability that NO cycle has length > 50 is: 1 - Σ(j=51 to 100) of 1/j
|
||||
|
||||
### The Harmonic Series Connection
|
||||
|
||||
As *n* approaches infinity, if each prisoner can open *n*/2 boxes, the probability of success approaches:
|
||||
|
||||
The limit as n approaches infinity is: P_n = 1 - ln(2) ≈ 0.3069
|
||||
|
||||
This beautiful result connects combinatorics, probability, and analysis through the harmonic series!
|
||||
|
||||
### Optimality
|
||||
|
||||
Remarkably, this loop-following strategy is **optimal**. No other strategy can achieve a higher probability of success. The proof involves showing that the problem reduces to avoiding long cycles in a random permutation, and the loop strategy is the unique way to leverage this structure.
|
||||
|
||||
---
|
||||
|
||||
## Why This Problem is Beautiful
|
||||
|
||||
The 100 prisoners problem is beloved by mathematicians because:
|
||||
|
||||
1. **Counterintuitive Result**: The fact that 31% >> 0% is shocking. A seemingly hopeless problem becomes tractable with the right insight.
|
||||
|
||||
2. **Deep Connection**: It connects permutation theory, probability, and the harmonic series in an elegant way.
|
||||
|
||||
3. **Collaborative Success**: Unlike independent trials, the prisoners' fates are intertwined through the structure of the permutation.
|
||||
|
||||
4. **Real-World Metaphor**: It illustrates how understanding underlying structure (cycles in permutations) can dramatically improve outcomes.
|
||||
|
||||
---
|
||||
|
||||
## Variants and Extensions
|
||||
|
||||
### What if prisoners can open k < n/2 boxes?
|
||||
|
||||
As k decreases below n/2, the probability drops rapidly. The threshold at n/2 is special—it's where the strategy becomes remarkably effective.
|
||||
|
||||
### What about communication?
|
||||
|
||||
If prisoners could communicate between trials (but not during), they still can't improve the strategy. The beauty is that the strategy requires only coordination before any prisoner enters, not during.
|
||||
|
||||
### The Malicious Director
|
||||
|
||||
In an interesting variant, suppose the director can see the prisoners' strategy and arrange the boxes adversarially (not randomly). Can the director always force them to fail? Yes! The director can always create a single cycle of length n, guaranteeing failure.
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
The 100 prisoners problem shows us that:
|
||||
- Mathematical structure can be hidden in apparent randomness
|
||||
- Clever strategies can overcome seemingly impossible odds
|
||||
- Group coordination can be more powerful than independent action
|
||||
- Beautiful mathematics often lies beneath simple-seeming puzzles
|
||||
|
||||
The next time you face a problem that seems impossible, remember: there might be a hidden structure waiting to be discovered, turning hopeless odds into reasonable ones.
|
||||
|
||||
---
|
||||
|
||||
## Further Reading
|
||||
|
||||
- [Gál, A., & Miltersen, P. B. (2003). "The Cell Probe Complexity of Succinct Data Structures"](https://arxiv.org/abs/cs/0310027)
|
||||
- [Curtin, E., & Warshauer, M. (2006). "The Locker Puzzle"](https://www.jstor.org/stable/27642173)
|
||||
- [Wikipedia: 100 Prisoners Problem](https://en.wikipedia.org/wiki/100_prisoners_problem)
|
||||
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
---
|
||||
title: "Dynamic Programming: Hidden Gems from Recent Contests"
|
||||
description: "Elegant dynamic programming problems that showcase beautiful techniques and insights."
|
||||
pubDate: "Jan 25 2024"
|
||||
image: "https://images.unsplash.com/photo-1509228468518-180dd4864904?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Dynamic Programming: Hidden Gems from Recent Contests
|
||||
|
||||
These problems demonstrate the art of dynamic programming beyond standard patterns.
|
||||
|
||||
## Problem 1: The Subsequence Symphony
|
||||
|
||||
Given a string, find the number of subsequences that form palindromes of prime length.
|
||||
|
||||
### Solution Insight
|
||||
|
||||
The key is to maintain DP states for both position and palindrome center simultaneously. This reduces the state space from O(n³) to O(n²).
|
||||
|
||||
## Problem 2: Graph Coloring with Constraints
|
||||
|
||||
Color a graph such that no two adjacent vertices share a color, and the total number of color changes along any path is minimized.
|
||||
|
||||
### The DP Formulation
|
||||
|
||||
DP[node][color][changes] gives us the minimum cost. The trick is recognizing that we only need to track changes modulo 2.
|
||||
|
||||
## Practice Makes Perfect
|
||||
|
||||
These problems teach us that DP is as much about problem modeling as it is about computation.
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
---
|
||||
title: "The Four Aces Miracle: A Self-Working Mathematical Marvel"
|
||||
description: "A card trick that teaches modular arithmetic and probability - perfect for the classroom."
|
||||
pubDate: "Jan 28 2024"
|
||||
image: "https://images.unsplash.com/photo-1529480384838-c1681c84aca5?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# The Four Aces Miracle: A Self-Working Mathematical Marvel
|
||||
|
||||
This trick never fails to amaze students, and the mathematics behind it is even more amazing.
|
||||
|
||||
## The Effect
|
||||
|
||||
A spectator deals cards into four piles while making random choices. Impossibly, the four aces end up on top of each pile.
|
||||
|
||||
## The Secret
|
||||
|
||||
It's all about invariants and modular arithmetic. No sleight of hand required - pure mathematics does the magic.
|
||||
|
||||
## The Method
|
||||
|
||||
1. Pre-arrange the deck (the math determines the arrangement)
|
||||
2. Have the spectator deal following simple rules
|
||||
3. The aces appear automatically
|
||||
|
||||
## The Mathematics
|
||||
|
||||
The dealing process preserves certain positional invariants modulo 4. The initial arrangement ensures these invariants place the aces correctly.
|
||||
|
||||
## Teaching Applications
|
||||
|
||||
This trick demonstrates:
|
||||
- Modular arithmetic
|
||||
- Invariants in algorithms
|
||||
- Deterministic vs. random processes
|
||||
|
||||
## The Bigger Lesson
|
||||
|
||||
Mathematics can create experiences that feel like magic. And that feeling of wonder? That's what hooks students on math.
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
---
|
||||
title: "The Gilbreath Principle: When Chaos Creates Order"
|
||||
description: "A mathematical card principle that seems impossible but always works - perfect for teaching algorithms."
|
||||
pubDate: "Feb 15 2024"
|
||||
image: "https://images.unsplash.com/photo-1570543375343-63fe3d67761b?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# The Gilbreath Principle: When Chaos Creates Order
|
||||
|
||||
Shuffle a deck in a specific way, and mathematical order emerges from apparent chaos.
|
||||
|
||||
## The Phenomenon
|
||||
|
||||
Arrange cards alternating red-black. Riffle shuffle. Now deal pairs - each pair has one red and one black card. Magic? No, mathematics.
|
||||
|
||||
## Why It Works
|
||||
|
||||
The riffle shuffle preserves local structure while appearing to randomize. The alternating pattern creates an invariant that survives the shuffle.
|
||||
|
||||
## Classroom Implementation
|
||||
|
||||
Students predict it won't work. When it does, they're hooked. "Why?" becomes the driving question.
|
||||
|
||||
## The Deeper Lesson
|
||||
|
||||
Not all randomness is truly random. Structure can hide in apparent disorder. This principle appears in:
|
||||
- Network protocols
|
||||
- Error-correcting codes
|
||||
- Distributed systems
|
||||
|
||||
## Beyond Cards
|
||||
|
||||
The Gilbreath Principle teaches us to look for hidden invariants in complex systems.
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
---
|
||||
title: "Graph Algorithms: Assessment Highlights"
|
||||
description: "Interesting graph problems from recent course assessments with detailed solutions."
|
||||
pubDate: "Feb 28 2024"
|
||||
image: "https://images.unsplash.com/photo-1550751827-4bd374c3f58b?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Graph Algorithms: Assessment Highlights
|
||||
|
||||
A collection of graph problems that test deep understanding rather than memorization.
|
||||
|
||||
## The Bridge Detection Variant
|
||||
|
||||
Find all edges whose removal increases the number of triangles in the graph.
|
||||
|
||||
### Solution Approach
|
||||
|
||||
Counter-intuitively, we need to count triangles that share exactly one edge with the candidate. The algorithm runs in O(m√m) time using careful enumeration.
|
||||
|
||||
## Shortest Path with Wildcards
|
||||
|
||||
Given a graph where some edge weights are variables, find assignments that minimize the longest shortest path.
|
||||
|
||||
### Key Insight
|
||||
|
||||
This reduces to a linear programming problem with interesting structure. The dual interpretation reveals connections to network flow.
|
||||
|
||||
## Teaching Through Problems
|
||||
|
||||
These problems help students see beyond standard algorithms to underlying principles.
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
---
|
||||
title: "IOI 2023: Breaking Down the Hardest Problems"
|
||||
description: "Deep analysis of the most challenging problems from the International Olympiad in Informatics 2023."
|
||||
pubDate: "Jan 20 2024"
|
||||
image: "https://images.unsplash.com/photo-1434030216411-0b793f4b4173?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# IOI 2023: Breaking Down the Hardest Problems
|
||||
|
||||
The International Olympiad in Informatics continues to push the boundaries of algorithmic problem solving.
|
||||
|
||||
## Problem: Soccer Stadium
|
||||
|
||||
A geometric optimization problem disguised as dynamic programming. The key insight: think in terms of monotonic paths.
|
||||
|
||||
### The Approach
|
||||
|
||||
1. Transform the 2D problem into a 1D problem using clever observations
|
||||
2. Use convex hull optimization for the DP transitions
|
||||
3. Handle edge cases with careful implementation
|
||||
|
||||
## Problem: Closing Time
|
||||
|
||||
A tree problem requiring sophisticated data structures and careful analysis.
|
||||
|
||||
### The Solution
|
||||
|
||||
The trick is recognizing this as a centroid decomposition problem. Once you see it, the implementation follows naturally.
|
||||
|
||||
## Lessons for Students
|
||||
|
||||
These problems teach us:
|
||||
- Simple problems have elegant solutions
|
||||
- Complex problems require systematic decomposition
|
||||
- Implementation matters as much as algorithms
|
||||
|
||||
## Practice Strategy
|
||||
|
||||
Start with subtasks. Even partial solutions teach valuable lessons.
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
---
|
||||
title: "The Knight's Tour: An Interactive Exploration"
|
||||
description: "An interactive puzzle exploring the knight's tour problem with surprising mathematical connections."
|
||||
pubDate: "Jan 30 2024"
|
||||
image: "https://images.unsplash.com/photo-1528819622765-d6bcf132f793?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# The Knight's Tour: An Interactive Exploration
|
||||
|
||||
Can a knight visit every square on a chessboard exactly once? This ancient puzzle hides deep mathematical structure.
|
||||
|
||||
## The Basic Challenge
|
||||
|
||||
Start with a 5×5 board. Can you find a knight's tour? What about one that returns to the starting square (a closed tour)?
|
||||
|
||||
## Mathematical Beauty
|
||||
|
||||
The problem connects to:
|
||||
- Hamiltonian paths in graphs
|
||||
- Warnsdorff's heuristic
|
||||
- Magic squares (surprisingly!)
|
||||
|
||||
## The Algorithm
|
||||
|
||||
The key insight: always move to the square with fewest onward moves. This simple heuristic works remarkably well.
|
||||
|
||||
## Try It Yourself
|
||||
|
||||
[Interactive board would go here - imagine clicking squares to build your tour]
|
||||
|
||||
## Going Deeper
|
||||
|
||||
For which board sizes do closed tours exist? The answer involves beautiful number theory.
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
---
|
||||
title: "Project Euler: My Favorite Problems from 700+"
|
||||
description: "Curated problems from Project Euler that teach beautiful mathematical and algorithmic concepts."
|
||||
pubDate: "Feb 25 2024"
|
||||
image: "https://images.unsplash.com/photo-1635070041078-e363dbe005cb?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Project Euler: My Favorite Problems from 700+
|
||||
|
||||
After solving 700+ Project Euler problems, these are the ones that changed how I think about mathematics and programming.
|
||||
|
||||
## Problem 96: Su Doku
|
||||
|
||||
Not just Sudoku solving - but solving 50 puzzles efficiently. The beauty is in combining constraint propagation with backtracking.
|
||||
|
||||
## Problem 208: Robot Walks
|
||||
|
||||
A counting problem that requires deep mathematical insight. The connection to complex numbers is unexpected and beautiful.
|
||||
|
||||
## Problem 613: Pythagorean Ant
|
||||
|
||||
Probability meets geometry in this elegant problem. The solution requires careful integration and surprising symmetry observations.
|
||||
|
||||
## The Meta-Lesson
|
||||
|
||||
Project Euler teaches you:
|
||||
- Mathematical intuition matters more than coding speed
|
||||
- There's always a clever approach
|
||||
- The journey matters more than the destination
|
||||
|
||||
## Getting Started
|
||||
|
||||
Don't aim for the leaderboard. Aim for understanding. Each problem is a teacher.
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
---
|
||||
title: "Beyond Sudoku: Exploring Constraint Satisfaction Puzzles"
|
||||
description: "A journey through Sudoku variants and their algorithmic solutions."
|
||||
pubDate: "Feb 10 2024"
|
||||
image: "https://images.unsplash.com/photo-1580541631950-7282082b53ce?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Beyond Sudoku: Exploring Constraint Satisfaction Puzzles
|
||||
|
||||
Sudoku is just the beginning. Let's explore variants that push the boundaries of logic puzzles.
|
||||
|
||||
## Killer Sudoku
|
||||
|
||||
Combine Sudoku with Kakuro - cages show sums, but no digit repeats within a cage.
|
||||
|
||||
## Sandwich Sudoku
|
||||
|
||||
The numbers outside show the sum of digits between 1 and 9 in that row/column. Simple rule, complex implications!
|
||||
|
||||
## The Algorithm Connection
|
||||
|
||||
These puzzles are constraint satisfaction problems. Techniques like arc consistency and backtracking with constraint propagation solve them efficiently.
|
||||
|
||||
## Create Your Own
|
||||
|
||||
What happens if we add chess knight move constraints? The design space is infinite!
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
---
|
||||
title: "Imposter Syndrome in Academia: A Confession"
|
||||
description: "An honest conversation about feeling like a fraud, even after years of success."
|
||||
pubDate: "Feb 25 2024"
|
||||
image: "https://images.unsplash.com/photo-1517048676732-d65bc937f952?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Imposter Syndrome in Academia: A Confession
|
||||
|
||||
Even after publishing papers, winning grants, and teaching thousands of students, the voice whispers: "They'll find out you don't belong."
|
||||
|
||||
## The Paradox
|
||||
|
||||
The more you know, the more you realize you don't know. Expertise breeds humility, which feeds the imposter.
|
||||
|
||||
## What Helps
|
||||
|
||||
- Keeping a "wins" journal - evidence against the imposter
|
||||
- Mentoring others - seeing your knowledge help someone
|
||||
- Talking about it - you're not alone in this
|
||||
|
||||
## The Silver Lining
|
||||
|
||||
Maybe imposter syndrome keeps us humble, curious, and always learning. Maybe it's not a bug, but a feature.
|
||||
|
||||
## Moving Forward
|
||||
|
||||
I may never silence the voice completely. But I've learned to acknowledge it and keep going anyway.
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
---
|
||||
title: "On Teaching Algorithms: Lessons from a Decade"
|
||||
description: "Reflections on what works (and what doesn't) in computer science education."
|
||||
pubDate: "Jan 10 2024"
|
||||
image: "https://images.unsplash.com/photo-1509062522246-3755977927d7?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# On Teaching Algorithms: Lessons from a Decade
|
||||
|
||||
Ten years of teaching has taught me more than any textbook could.
|
||||
|
||||
## Start with Why
|
||||
|
||||
Students don't care about O(n log n) until they understand why their code is slow. Real problems first, theory second.
|
||||
|
||||
## The Power of Visualization
|
||||
|
||||
Abstract concepts become concrete when visualized. Every algorithm should have a picture.
|
||||
|
||||
## Failure is a Feature
|
||||
|
||||
Let students struggle. The struggle is where learning happens. But know when to throw a lifeline.
|
||||
|
||||
## Assessment Philosophy
|
||||
|
||||
Test understanding, not memorization. Open-book exams with novel problems beat closed-book regurgitation every time.
|
||||
|
||||
## The Joy of "Aha!" Moments
|
||||
|
||||
There's no feeling quite like seeing a student's eyes light up when a concept clicks. That's why we do this.
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
---
|
||||
title: "SODA 2024: Algorithmic Breakthroughs"
|
||||
description: "A roundup of fascinating algorithmic results from SODA 2024, focusing on graph algorithms and optimization techniques."
|
||||
pubDate: "Jan 15 2024"
|
||||
image: "https://images.unsplash.com/photo-1509228468518-180dd4864904?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# SODA 2024: Algorithmic Breakthroughs
|
||||
|
||||
The Symposium on Discrete Algorithms (SODA) 2024 brought together researchers from around the world to present cutting-edge algorithmic research. This post highlights some of the most exciting developments in graph algorithms and optimization.
|
||||
|
||||
## Graph Algorithms Revolution
|
||||
|
||||
### Dynamic Graph Coloring
|
||||
|
||||
One of the standout papers introduced a breakthrough in dynamic graph coloring with polylogarithmic update time. The authors developed a novel data structure that maintains a proper vertex coloring while supporting edge insertions and deletions efficiently.
|
||||
|
||||
The key insight was to combine randomized recoloring strategies with a carefully designed hierarchical decomposition of the graph. This allows for local updates that rarely propagate through the entire structure.
|
||||
|
||||
## Approximation Algorithms
|
||||
|
||||
### The Traveling Salesman Problem Revisited
|
||||
|
||||
A surprising result showed that for graphs with bounded doubling dimension, we can achieve a (1+ε)-approximation for TSP in nearly linear time. This improves upon decades of previous work and opens new avenues for practical implementations.
|
||||
|
||||
## Complexity Theory Connections
|
||||
|
||||
The conference also featured several papers bridging the gap between pure algorithmic research and complexity theory. A particularly elegant result showed that certain graph problems believed to require quadratic time are equivalent under fine-grained reductions.
|
||||
|
||||
## Looking Forward
|
||||
|
||||
These results demonstrate that fundamental algorithmic problems still have room for improvement. The techniques developed here will likely influence algorithm design for years to come.
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
---
|
||||
title: "Distributed Computing: Recent Advances"
|
||||
description: "Survey of recent developments in distributed algorithms from major conferences."
|
||||
pubDate: "Feb 20 2024"
|
||||
image: "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Distributed Computing: Recent Advances
|
||||
|
||||
The field of distributed computing has seen remarkable progress in recent years. This post surveys key results from PODC, DISC, and other major venues.
|
||||
|
||||
## Consensus Protocols
|
||||
|
||||
### Byzantine Agreement in Asynchronous Networks
|
||||
|
||||
A breakthrough result achieves optimal resilience with expected constant rounds. The protocol uses cryptographic techniques combined with novel committee selection.
|
||||
|
||||
## Distributed Graph Algorithms
|
||||
|
||||
### Minimum Spanning Tree in the CONGEST Model
|
||||
|
||||
New algorithms achieve near-optimal round complexity for MST construction. The approach uses sophisticated graph decomposition techniques.
|
||||
|
||||
## Local Algorithms
|
||||
|
||||
### The Power of Local Computation
|
||||
|
||||
Recent work characterizes which problems admit constant-time local algorithms. The classification provides a complete picture for bounded-degree graphs.
|
||||
|
||||
## Future Directions
|
||||
|
||||
The intersection of distributed computing with machine learning presents exciting opportunities for both fields.
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
---
|
||||
title: "Git Workflows That Save My Sanity"
|
||||
description: "Automation scripts and Git hooks that eliminate repetitive tasks and prevent common mistakes."
|
||||
pubDate: "Jan 22 2024"
|
||||
image: "https://images.unsplash.com/photo-1556075798-4825dfaaf498?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Git Workflows That Save My Sanity
|
||||
|
||||
After years of Git mishaps, I've built workflows that prevent disasters and save hours weekly.
|
||||
|
||||
## The Pre-commit Hook That Saves Embarrassment
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Check for debugging statements
|
||||
if grep -r "console.log\|debugger\|TODO" --include="*.js" .; then
|
||||
echo "⚠️ Debugging statements found!"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
## Automatic Branch Naming
|
||||
|
||||
```bash
|
||||
alias feature='git checkout -b feature/$(date +%Y%m%d)-$1'
|
||||
```
|
||||
|
||||
Now `feature "user-auth"` creates `feature/20240122-user-auth`.
|
||||
|
||||
## The Commit Message Template
|
||||
|
||||
```
|
||||
[TYPE] Brief description
|
||||
|
||||
Why:
|
||||
- Context for this change
|
||||
|
||||
What:
|
||||
- Specific changes made
|
||||
|
||||
Testing:
|
||||
- How to verify it works
|
||||
```
|
||||
|
||||
## The Weekly Cleanup Script
|
||||
|
||||
Deletes merged branches, prunes remotes, and garbage collects. Keeps the repo clean and fast.
|
||||
|
||||
## ROI
|
||||
|
||||
These automations save ~5 hours per week and countless prevented mistakes. The time invested in setting them up paid back in days.
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
---
|
||||
title: "Academic Writing with Obsidian and Pandoc"
|
||||
description: "A complete workflow for academic papers - from notes to publication-ready PDFs."
|
||||
pubDate: "Feb 12 2024"
|
||||
image: "https://images.unsplash.com/photo-1456324504439-367cee3b3c32?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Academic Writing with Obsidian and Pandoc
|
||||
|
||||
Transform your scattered research notes into beautiful academic papers with this workflow.
|
||||
|
||||
## The Setup
|
||||
|
||||
- **Obsidian**: For note-taking and knowledge management
|
||||
- **Pandoc**: For document conversion
|
||||
- **LaTeX**: For typesetting
|
||||
- **Zotero**: For reference management
|
||||
|
||||
## The Magic Command
|
||||
|
||||
```bash
|
||||
pandoc paper.md \
|
||||
--filter pandoc-citeproc \
|
||||
--bibliography=refs.bib \
|
||||
--template=academic.tex \
|
||||
-o paper.pdf
|
||||
```
|
||||
|
||||
## Templates for Everything
|
||||
|
||||
From conference submissions to journal articles, templates ensure consistency and save time.
|
||||
|
||||
## Version Control Integration
|
||||
|
||||
Git + Obsidian = perfect history of your thinking process.
|
||||
|
||||
## The Result
|
||||
|
||||
From messy notes to camera-ready PDF in minutes, not hours.
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
---
|
||||
title: "Understanding the Latest Approximation Algorithm for Set Cover"
|
||||
description: "A detailed walkthrough of a breakthrough approximation algorithm with practical implications."
|
||||
pubDate: "Feb 15 2024"
|
||||
image: "https://images.unsplash.com/photo-1516321318423-f06f85e504b3?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Understanding the Latest Approximation Algorithm for Set Cover
|
||||
|
||||
A recent paper achieves a breakthrough in the Set Cover problem, improving the approximation ratio while maintaining practical runtime.
|
||||
|
||||
## The Algorithm
|
||||
|
||||
The approach combines local search with a clever LP rounding scheme. The dual interpretation provides beautiful geometric insights.
|
||||
|
||||
## Why This Matters
|
||||
|
||||
Set Cover appears everywhere - from facility location to machine learning feature selection. This improvement has immediate practical impact.
|
||||
|
||||
## Implementation Details
|
||||
|
||||
The paper's theoretical elegance translates surprisingly well to practice. Key optimizations include:
|
||||
- Lazy evaluation of set intersections
|
||||
- Incremental updates to the LP solution
|
||||
- Smart caching strategies
|
||||
|
||||
## Future Work
|
||||
|
||||
The techniques here might extend to weighted variants and online settings.
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
---
|
||||
title: "Deep Dive: A New Approach to Graph Decomposition"
|
||||
description: "An in-depth analysis of a recent paper on hierarchical graph decomposition and its implications."
|
||||
pubDate: "Jan 20 2024"
|
||||
image: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Deep Dive: A New Approach to Graph Decomposition
|
||||
|
||||
This paper introduces a novel framework for decomposing graphs into hierarchical structures that preserve important properties while enabling efficient algorithms.
|
||||
|
||||
## The Main Result
|
||||
|
||||
The authors prove that every graph with treewidth k can be decomposed into a tree of bags where each bag has size at most k+1. While this sounds like the definition of tree decomposition, the clever twist is in how they construct it.
|
||||
|
||||
## Technical Innovation
|
||||
|
||||
The key insight is using a charging scheme that amortizes the cost of decomposition across multiple levels. This leads to an O(n log n) algorithm, improving on the previous O(n²) bound.
|
||||
|
||||
## Implications
|
||||
|
||||
This work opens new avenues for:
|
||||
- Parallel algorithms on bounded treewidth graphs
|
||||
- Approximation algorithms for NP-hard problems
|
||||
- Dynamic programming optimizations
|
||||
|
||||
## Open Questions
|
||||
|
||||
The paper leaves several intriguing questions open, particularly about the optimality of their charging scheme.
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
---
|
||||
title: "Quantum Computing Meets Classical Algorithms"
|
||||
description: "Exploring the intersection of quantum and classical algorithmic techniques from recent conferences."
|
||||
pubDate: "Mar 10 2024"
|
||||
image: "https://images.unsplash.com/photo-1635070041078-e363dbe005cb?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Quantum Computing Meets Classical Algorithms
|
||||
|
||||
Recent conferences have showcased fascinating connections between quantum and classical computing paradigms.
|
||||
|
||||
## Quantum Speedups for Graph Problems
|
||||
|
||||
### Quantum Walks on Graphs
|
||||
|
||||
New quantum algorithms achieve quadratic speedups for certain graph traversal problems. The techniques combine amplitude amplification with clever graph representations.
|
||||
|
||||
## Classical Simulation of Quantum Algorithms
|
||||
|
||||
Surprisingly, several "quantum" algorithms have inspired better classical algorithms. This cross-pollination has led to improvements in both fields.
|
||||
|
||||
## The Future is Hybrid
|
||||
|
||||
The most practical near-term applications combine quantum and classical processing, leveraging the strengths of each paradigm.
|
||||
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
|
@ -0,0 +1,109 @@
|
|||
---
|
||||
title: "Exportober 2023"
|
||||
description: "I am going to use this post to document 31 workflows for feeling good about day to day work at the computer, one for each day of October, hopefully! Most of this will be in the..."
|
||||
pubDate: "2023-10-01"
|
||||
authorName: "Neeldhara"
|
||||
sourceCategories: ["workflows"]
|
||||
sourcePath: "2023-exportober-workflows/index.qmd"
|
||||
---
|
||||
|
||||
I am going to use this post to document 31 workflows for feeling good about day to day work at the computer, one for each day of October, hopefully! Most of this will be in the context of macOS, but hopefully the principles are adataptable to the platforms and tools of your choice.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
>
|
||||
> # (10/01). Faux Hot Key Sequences in Keyboard Maestro
|
||||
>
|
||||
> Turns out I am terrible with remembering keyboard shorcuts, so in an ideal world I'd like to have things triggered by single key presses that are awfully predictably related to whatever I want. For example, hit the "b" key to type out a 🟦. Now this is not tenable of course: there are multiple things vying for the "b" trigger, including, well, the letter _b_ wanting to be typed out.
|
||||
>
|
||||
> A natural solution is to have a keystroke sequence for disambiguation. So in principle something like "e" followed by "b", where the first "e" signals that they keyboard is to prepare itself for an emoji-based trigger, and the "b" does the blue square thing. However, pure key sequences are also going to get in your way, because most of them will be substrings of naturally typed text.
|
||||
>
|
||||
> So you'd want a hot key trigger to say you're going into shortcut mode first: something like `Cmd+K → e → b`. BTT supports such sequences out of the box, but Keyboard Maestro, my default tool for such matters, does not with the following explanation in their [FAQ](https://wiki.keyboardmaestro.com/Frequently_Asked_Questions#How_do_I_use_a_multiple_keystroke_trigger):
|
||||
>
|
||||
> > But Keyboard Maestro does not directly support assigning a two-keystroke hot key to a trigger. The problem with multiple keystroke triggers like Option-F R is what to do if you type Option-F A?
|
||||
> >
|
||||
> > Logic dictates that the Option-F A should go through to the system unimpeded, but Option-F R should be swallowed entirely. But this is impossible. The only way to do it would be to swallow the Option-F key, and then swallow the second key and then resubmit the Option F and the second key unless it matches Option-F R.
|
||||
> >
|
||||
> > However, that is fraught with peril and cannot work robustly in the presence of other applications placing things on the keyboard event queue (or even a sufficiently fast typist).
|
||||
> >
|
||||
> > For example, suppose you quickly typed Option-F A B. Keyboard Maestro would have swallowed the Option F and then the A, and then resubmitted it to the event queue, resulting in the stream of characters B, Option-F, A. There is no way to avoid this race condition, and as such Keyboard Maestro does not support any such mechanism.
|
||||
> >
|
||||
> > As described above, Keyboard Maestro has a variety of ways you can use Option-F as a hot key that allows a second key to be used to select a macro. However in all cases it is clear that the Option-F has been used and there is no concept that the Option-F might come back later to do something else.
|
||||
>
|
||||
> However, as a tip from the same FAQ suggests, you can more or less achieve the desired effect by using macro grouping and group activation triggers. So I have a macro group that triggers the square emojis by single keystrokes like so:
|
||||
>
|
||||
> 
|
||||
>
|
||||
> ...but this macro group is only activated for one action at a time, and its activation is triggered by _another KM macro_ - whose only job is to activate this macro group for a single action, like so:
|
||||
>
|
||||
> 
|
||||
>
|
||||
> You might notice that this trigger is also a single keypress (in this example, "U"). This entire macro group is activated for one action with the `Cmd+Alt+K` keystroke. So effectively I only remember the `Cmd+Alt+K` keystroke, which activates this collection of macros for one action:
|
||||
>
|
||||
> 
|
||||
>
|
||||
> ...and from here I just have to press "U" followed by "B" to get my 🟦. Just this two-level triggering gives access to potentially 500+ triggers that mneomically efficient, and potentially many more actions (for example, you could map "B" to a bunch of different emojis that share blue as the predominant color, and KM will display a pallette for you to do the final disamiguiation).
|
||||
>
|
||||
> IRL I use [Rocket](https://matthewpalmer.net/rocket/) by [Matthew Palmer](https://matthewpalmer.net/) to pick out emojis quickly (thanks to a [tip](https://twitter.com/wesbos/status/790607013680074752?lang=mr) from [Wes Bos](https://wesbos.com/)), or just the built-in macOS picker. But I do find the setup described above handy for some unicode symbols that I frequently use.
|
||||
>
|
||||
> I should mention [God Mode](https://medium.com/@nikitavoloboev/karabiner-god-mode-7407a5ddc8f6) as another popular way to reduce clutter in the keyboard shortcut mindspace, but I never really got used to Karabiner and am too used to the left CAPS key being mapped to Ctrl for me to give that up to the hyper key.
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
>
|
||||
> # (10/02). File Searches with Alfred App
|
||||
>
|
||||
> To open a file, I simply open up [Alfred](https://www.alfredapp.com/) and press the spacebar or the `'` symbol and start typing out a filename. This is enabled by going in to Alfred preferences and making sure that `Quick Search: Enable Quick File Search mode` is enabled:
|
||||
>
|
||||
> 
|
||||
>
|
||||
> Most launchers have some kind of file search enabled, so look out for it even if you are on, say, [Raycast](https://www.raycast.com/), or [Launchbar](https://www.obdev.at/launchbar), or something else.
|
||||
>
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
>
|
||||
> # (10/03). Bookmarks with Static Marks
|
||||
>
|
||||
> I use [StaticMarks](https://darekkay.com/static-marks/) to track key locations across the web and my filesystem. Typically, any project that I am working on has some subset of the following key links:
|
||||
>
|
||||
> - A Drive/Dropbox or local Folder
|
||||
> - A Notes Folder within my PKM system of choice (Obsidian/Quarto)
|
||||
> - A Notion or Things page that tracks tasks
|
||||
> - A Zoom/Meet URL if meetings/classes are online
|
||||
> - Other External URLs (spreadsheets, grading pages, pages on Overleaf/Github, key email threads, and so forth)
|
||||
>
|
||||
> I now dump most of this in a YAML file (using [Hookmark](https://hookproductivity.com/) for local folders, so that the links persist even if I move things around) now, and have a few HTML pages that give me a quick overview of all my major projects. I typically restrict myself to the first three or four links, because that covers 90% of what I need quickly, and the other associated external URLs go into the notes page that I have for the project in my whatever-system, so they do end up being at most one hop away from the static marks page.
|
||||
>
|
||||
> Previously I used to try to maintain everything within [Arc](https://arc.net/) folders but that got somewhat out of hand, so I swept it all clean and only have more or less top level folders in Arc now representing major themes that I can categorize my efforts into, and each such theme has its own static marks file that I can use to get a nice, searchable big picture.
|
||||
>
|
||||
> One thing that I do find annoying in general is the fact that reference material is often common to multiple efforts (e.g, the same papers relevant to multiple research projects). Since I access my files by search, I am perhaps more sensitive than usual to any kind of redundancy --- it clutters up the search results (besides, I prefer a single source of truth on, say PDFs, because I am typically annotating them). These days, I keep my reference material separate from projects, and link them to projects using either a PKM system, or more casually, using Hookmark.
|
||||
>
|
||||
> Related: [Bunch](https://bunchapp.co/) by [Brett Terpstra](https://brettterpstra.com/) is a handy plaintext automation tool: the website has some really indicative use cases, go check it out! I don't use this myself but am looking forward to incorporating it into my workflow once my life is sorted enough for me to figure out what I typically do in the context of a specific project, and for said things to be sufficiently distinguishable from complete chaos :)
|
||||
>
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
>
|
||||
> # (10/04). Search Links by Brett Terpstra
|
||||
>
|
||||
> If you've used `Cmd+K` on Google docs, you may have noticed --- and even been spoiled by --- how Google can figure out your links for you based on the content of the selected text:
|
||||
>
|
||||
> 
|
||||
>
|
||||
> If you want something similar while editing Markdown files, look no further than the _[Search Links](https://brettterpstra.com/projects/searchlink/)_ service by [Brett Terpstra](https://brettterpstra.com/). It basically has the same effect: my experience is that I select some text and press a shortcut to invoke Search Links, which then does its thing in the background, and then my selected text is replaced by a markdown-formatted link. The results may not be always what you are looking for (I usually try to keep the text descriptive, and potentially edit later if required), but it works most of the time, and saves me the back and forth of having to open a browser, look for the link, copy it over, paste it back and format it in a markdown-appropriate manner. Great for when you don't want to leave your editor!
|
||||
>
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
>
|
||||
> # (10/05). Send to Alfred
|
||||
>
|
||||
> When something is selected (a bunch of text, or a file or a folder), I can double-tap the `Alt` key to "send" the material to [Alfred](https://www.alfredapp.com/), and to process it further from there. This is very handy: for example, if I want some text switched to title case, it's a few quick keystrokes: double-tap `Alt` on selected text, then `Ctrl+A` to move to the start of text, type out "case", and then `Cmd + 3`: this replaces the selected text with the same text but in title case. This works because I have the [case switch Alfred workflow](https://github.com/gillibrand/alfred-change-case) enabled. I also use this often to open a folder from Finder in VSCode: select folder → send to Alfred → `Open With...` → choose VSCode.
|
||||
>
|
||||
> Note: I am yet to find something equivalent to this on Raycast, if anyone has a pointer, please let me know!
|
||||
>
|
||||
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 382 KiB |
|
After Width: | Height: | Size: 3.3 MiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 246 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 141 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 184 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
|
@ -0,0 +1,204 @@
|
|||
---
|
||||
title: "Actually Building a Website with Notion"
|
||||
description: "My attempted overview of options for making websites with Notion does not go into the mechanics of how to setup a site with Notion, so I'm going to post a couple of short walkth..."
|
||||
pubDate: "2021-09-12"
|
||||
authorName: "Neeldhara"
|
||||
sourceCategories: ["notion", "workflows", "websites"]
|
||||
sourcePath: "building-websites-with-notion/index.qmd"
|
||||
---
|
||||
|
||||
My attempted [overview of options](https://neeldhara.blog/notion-powered-websites) for making websites with [Notion](https://notion.so) does not go into the mechanics of *how* to setup a site with Notion, so I'm going to post a couple of short walkthroughs of the process here. I'll demonstrate with both [Super](https://super.so) and [Potion](https://potion.so). For Super, I'll share how I setup my course catalog. With Potion, a natural choice would have been to take you behind the scenes of *this* blog, but this did involve a little bit of customization that might be a bit distracting, so I'll just make something quick from scratch for this post.
|
||||
|
||||
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Doesn't look like it's for non-geeks like me 😄 or you may prove otherwise. However, if you can record a 10 min video setting up a basic one, that'll have a greater impact, I believe, if it's already not there.</p>— Swaprava Nath (@swaprava) <a href="https://twitter.com/swaprava/status/1436887668143497219?ref_src=twsrc%5Etfw">September 12, 2021</a></blockquote>
|
||||
|
||||
---
|
||||
|
||||
### The Overall Process
|
||||
|
||||
For either framework, this is typically a three-step process:
|
||||
|
||||
1. Setup your content in Notion. You can start from scratch, or use one of the templates provided by Super or Potion that feel like a closest match to what you want your website to eventually look like.
|
||||
|
||||
2. Enable sharing to the web from within Notion — this will generate a link for you.
|
||||
|
||||
3. Copy this link into Super or Potion.
|
||||
|
||||
At the end of step 2, in fact, you already have a URL that you can share with anyone and, depending on how the content is laid out in Notion, can already look like a decent website.
|
||||
|
||||
What step 3 allows you to do, however is:
|
||||
|
||||
1. Add some styling with CSS.
|
||||
|
||||
2. Add custom code snippets (useful, for example, if you want to add things like Google Analytics).
|
||||
|
||||
3. Be assured that the webpage is good in terms of SEO, performance, etc.
|
||||
|
||||
4. If using Super, you can selectively password-protect pages (coming soon to Potion, where you can presently password-protect your whole site if you want to).
|
||||
|
||||
5. Have automatically generated user-friendly URLs for the individual pages, and if on Potion, you get nice preview images for all your pages as well.
|
||||
|
||||
A few optional steps that you might want to consider:
|
||||
|
||||
1. By default, both Super and Potion will give you a test subdomain to work with. Eventually, you might want the website to be available from your own domain. This is just a matter of adding a couple of A-records and typically can be done from wherever you registered the domain:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
2. You might want to add custom styles to make the website render uniquely — so you move beyond the standard look-and-feel of a Notion page if you so wish. You could do something on your own here, but the simplest thing is to just borrow the styling from one of the existing templates and tweak it if you want.
|
||||
3. Insert code for Google Analytics (or similar). As an aside, if you are looking for analytics that is user-friendly *and* privacy-conscious, I'd recommend [Fathom](https://usefathom.com).
|
||||
|
||||
### A Course Catalog with Super
|
||||
|
||||
> **Warning**
|
||||
>
|
||||
> ## Heads up!
|
||||
>
|
||||
> This content is deprecated because I've moved this domain out to a different setup now. So please ignore the links, and hopefully the steps are still useful in principle!
|
||||
|
||||
|
||||
Let's apply this process to an actual website now! I'll demonstrate how I setup the website at [`neeldhara.courses`](https://neeldhara.courses). Incidentally, if you want a quick overview without some details that will be specific to my website, you might want to watch the video made by @robhope and pointed out by @traf.
|
||||
|
||||
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Here's a little run through by <a href="https://twitter.com/robhope?ref_src=twsrc%5Etfw">@robhope</a> on creating a site <a href="https://twitter.com/super_?ref_src=twsrc%5Etfw">@super_</a>:<a href="https://t.co/SCMdDMRfBd">https://t.co/SCMdDMRfBd</a></p>— traf (@traf) <a href="https://twitter.com/traf/status/1436888874165411847?ref_src=twsrc%5Etfw">September 12, 2021</a></blockquote>
|
||||
|
||||
|
||||
Back to the setup for [`neeldhara.courses`](http://neeldhara.courses). You can check out the page on Notion [here](https://www.notion.so/Courses-722e231ca8e549159af5a8e7700a5025), but I'll describe some pieces of it below. First, recall Step 1:
|
||||
|
||||
<aside>
|
||||
1️⃣ *Setup your content in Notion.*
|
||||
|
||||
</aside>
|
||||
|
||||
I started with the [Super template HQ](https://hq.super.site). It looks amazing and is apparently free to use — at least at the time of this writing 😀
|
||||
|
||||
Duplicate this template into Notion. If you like, you can duplicate it twice — one, a copy that you actually work on, and the other could be a copy that you don't edit but just keep handy in case you need to go back to the original for reference.
|
||||
|
||||
The first thing I did was to get rid of most of the content, and just retained this section:
|
||||
|
||||

|
||||
|
||||
which, incidentally, will render like this once connected to Super:
|
||||
|
||||

|
||||
|
||||
Now the next step is to replace the generic content with yours:
|
||||
|
||||

|
||||
|
||||
Since I'm just starting out, I have added the three courses that I'm teaching this term and they all show up. Eventually, these courses will be filtered out based on the current timing, so that only the current ones show here and the rest get pushed to an archive — which I'm yet to build. But the filter would look something like this in Notion:
|
||||
|
||||

|
||||
|
||||
And for each of those entries, I'd go and setup the course home pages with the content that I have in my typical course homepages. The nice thing about Notion is the wide array of content types that lets you format things nicely. Here are a couple of sections from within Notion:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
One thing worth pointing out for this particular setup — for each course, the class plan is just a Notion database, where the columns are:
|
||||
|
||||
1. Name (text)
|
||||
2. Week (single-select with 12 options; one for each week of the course)
|
||||
3. Module (a checkbox property)
|
||||
4. Description (text)
|
||||
|
||||
and the rows either correspond to an overview of a whole week or just one individual lecture, tagged with the week that it happened in.
|
||||
|
||||
On the course's homepage, I display this database set to a Gallery view, and filtered to only those entries where the Module option is *unchecked*. These are intended to be overview pages. This is what it looks like in Notion:
|
||||
|
||||

|
||||
|
||||
and this is what it will end up looking like on the website, once you've gotten to the end of Step 3:
|
||||
|
||||

|
||||
|
||||
Further, overview page simply displays the same database again, this time in a list view filtered by the appropriate week:
|
||||
|
||||

|
||||
|
||||
Check out the views in Notion and the rendered version side-by-side:
|
||||
|
||||

|
||||

|
||||
You might wonder about the blockquote in the Notion view right at the top of the page. That's a feature of the HQ template — anything that goes into that first blockquote renders as page navigation on top. I think this now a bit obsolete with Super's new features on navigation bars, but I still find it handy and use it on most pages. 👍
|
||||
|
||||
So that's all of Step 1, getting all your content inside Notion. I'd say this is really the bulk of the process. The process is iterative, so you don't need literally *all* your content in before you can move on. However, getting an indicative amount thrown in is, I think, useful.
|
||||
|
||||
Once you're done with this bit, up next:
|
||||
|
||||
<aside>
|
||||
2️⃣ Enable sharing to the web from within Notion — this will generate a link for you.
|
||||
|
||||
</aside>
|
||||
|
||||
This is very easy to do, it's just a toggle on the top-right corner of your Notion app:
|
||||
|
||||

|
||||
|
||||
Now for the final step to have everything come together:
|
||||
|
||||
<aside>
|
||||
3️⃣ Copy this link into Super or Potion.
|
||||
|
||||
</aside>
|
||||
|
||||
This is again quite straightforward, head to Super and just share your page's public URL, give it a name, and optionally set it up to sync with your domain if you have one.
|
||||
|
||||

|
||||
|
||||
Given that we're using a particular Super template, you would also need to remember to insert the CSS to make the site look as advertised above 😅
|
||||
|
||||
So remember to add this on the custom code section of your Super dashboard:
|
||||
|
||||
`<link rel="stylesheet" href="[https://sites.super.so/hq/style.css](https://sites.super.so/hq/style.css)">`
|
||||
|
||||
If you do just this and are literally following along your site may still look a little different from mine, which is probably because I tweaked the CSS a bit to incorporate fonts of my liking (the fonts in the screenshot are from Google fonts — [Andika New Basic](https://fonts.google.com/specimen/Andika+New+Basic) and [Shadows into Light Two](https://fonts.google.com/specimen/Shadows+Into+Light+Two)).
|
||||
|
||||
You might want to take care of some minor things at this stage, such as adding a favicon, a site description that will show up on Google searches, inserting any code you need to for analytics, and so forth.
|
||||
|
||||
The very first time that you setup your site, you may need to wait for a bit for it to build and render. But after this first time, any edits you make on Notion are reflected automatically on your website — you may need to give it a minute or two, it's not instantaneous, but trust that the changes will show up. Clear your cache if they don't even after a couple of minutes.
|
||||
|
||||
Super generates pretty URLs automatically for all your pages, but because of the slightly peculiar setup I have, involving a particular nested structure and filtered views, I've been doing my pretty URLs manually. For example, to go to the second module of Week 5 in the competitive programming course, the URL is:
|
||||
|
||||
```python
|
||||
https://neeldhara.courses/competitive-programming/week-05/mod-02
|
||||
```
|
||||
|
||||
This can be setup quite easily from inside the Super dashboard, and once it's done once, it's done for good.
|
||||
|
||||
So, that's about it! I'd like to think I covered most major aspects, but if anything is unclear, ping me @neeldhara on Twitter and I'll be sure to update this appropriately 🙂
|
||||
|
||||
### The Manim Examples Collection with Potion
|
||||
|
||||
For the Potion example, I'd like to build out a quick page with latest tweets from @manim_community. Manim is a community-maintained Python library for creating mathematical animations, and the twitter handle pulls in a lot of great examples.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> ## Incidentally, if you prefer watching a video tutorial, Potion has you covered already...
|
||||
>
|
||||
> <iframe width="560" height="315" src="https://www.youtube.com/embed/qhqEqh9shik" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||
|
||||
|
||||
So, for step 1, which is to get our content in Notion, I start with a blank slate and populate it with some content:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
For Step 2, I simply make this page public, and you can see the [Notion version here](https://www.notion.so/Manim-Examples-4e4dd0c1071e4a549d90be74a84f3cce).
|
||||
|
||||
For Step 3, I add this page to Potion and just follow [step 4 on this page](https://www.potion.so/cards-portfolio) to set this up with a lovely template made by Dr. Gil Pradana (@[gildy](https://twitter.com/gildy)). This just amounts to copy-pasting some CSS code into the *Snippet Injection* section of your Potion dashboard. This template treats horizontal line breaks as breakpoints to create cards, and the headings translate into the highlight boxes that you can see from this preview.
|
||||
|
||||
[https://twitter.com/gildy/status/1403680404092035075?s=20](https://twitter.com/gildy/status/1403680404092035075?s=20)
|
||||
|
||||
After connecting my domain, here's what the website looks like this
|
||||
|
||||
And that's basically it! You have a fully functional page now. 🎉 Changes you make in Notion will reflect *instantaneously* on Potion!
|
||||
|
||||

|
||||
|
||||
You might wonder if there is a way of setting things up so that new tweets from the Manim community handle show up automatically on this website. In principle, this should be possible with a little help from tools like automate.io, Zapier, or Integromat — they can watch for new tweets and append them to the page you are working on, although I'm not sure how to set it up so that they respect the two-column layout that I have here. I figure tweets could also be added to a database and shown with a gallery view instead, but the gallery previews will typically not pick up embedded content, so you might have to go via an intermediate service like [Tweetpik](https://tweetpik.com/) or [Pikaso](https://pikaso.me/) instead so you have screenshots for display.
|
||||
|
||||
So this was Potion - you can probably see the many ways in which Potion and Super are similar to setup. By the way, the templates on these platforms are *not* mutually compatible — so watch out for the fact that they will not automatically work on the other platform if you are looking to migrate. As far as I can see, neither service has an importer for the other built yet.
|
||||
|
||||
That said, I hope you have fun making your website with Notion with whatever platform you choose to use! 🎉
|
||||
BIN
sites/reviews/src/content/reviews/django-app/Untitled.png
Normal file
|
After Width: | Height: | Size: 2.3 MiB |
BIN
sites/reviews/src/content/reviews/django-app/Untitled1.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
sites/reviews/src/content/reviews/django-app/Untitled2.png
Normal file
|
After Width: | Height: | Size: 160 KiB |
BIN
sites/reviews/src/content/reviews/django-app/Untitled3.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
sites/reviews/src/content/reviews/django-app/Untitled4.png
Normal file
|
After Width: | Height: | Size: 172 KiB |
BIN
sites/reviews/src/content/reviews/django-app/Untitled5.png
Normal file
|
After Width: | Height: | Size: 178 KiB |
|
After Width: | Height: | Size: 190 KiB |
390
sites/reviews/src/content/reviews/django-app/index.md
Normal file
|
|
@ -0,0 +1,390 @@
|
|||
---
|
||||
title: "Building a first Django App"
|
||||
description: "In preparing for a session in a Python workshop (organised for teachers of the CBSE board who are teaching students informatics and computer science in 11th/12th grades, and who..."
|
||||
pubDate: "2018-06-12"
|
||||
authorName: "Neeldhara"
|
||||
sourceCategories: ["tutorial", "websites"]
|
||||
sourcePath: "django-app/index.qmd"
|
||||
---
|
||||
|
||||
In preparing for a session in a Python workshop (organised for teachers of the CBSE board who are teaching students informatics and computer science in 11th/12th grades, and who have recently had their official syllabus switch from C++ to Python), I finally got around to exploring the process of building a webapp powered by Django. I picked up the excellent [Hello Web App](https://hellowebbooks.com/learn-django/) book by [Tracy Osborn](https://limedaring.com/) for my preparation. In this post, I am going to document the process — just in case I have to do this again ☕️
|
||||
|
||||
The tutorial in Hello Web App goes over the process of building a generic “collection of things” with Django. In this tutorial, I’ll focus on a more concrete example, because it was more fun for me to build a tangible concept that I might actually use later.
|
||||
|
||||
So, I am going to build a collection of talk announcements at IIT Gandhinagar, which I intend to be displayed, on the frontend, as a slideshow. I figure that this website can then be loaded up on any internet-connected display and serve as a virtual notice board. For the frontend design, I’m going to be stealing the Webslides framework, which is a really clean HTML/CSS template for making slideshows powered by Javascript.
|
||||
|
||||
### Quickstart
|
||||
|
||||
I’m going to handwave the bit about installation. Briefly, I setup Django v2.0.4 in a virtual environment, put the codebase in a git repository, and initialized a Django project via:
|
||||
|
||||
`django-admin startproject announceiitgn .`
|
||||
|
||||
and then a Django app via:
|
||||
|
||||
`django-admin startapp talks`
|
||||
|
||||
It’s also important to add this app to `settings.py`, like so:
|
||||
|
||||
```jsx
|
||||
INSTALLED_APPS = [
|
||||
'talks',
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
]
|
||||
```
|
||||
|
||||
and also run a migration command to account for an initial setup for the databases (if you skip this step, Django will prompt you to do it anyway — as I found out by forgetting 😎):
|
||||
|
||||
`python [manage.py](http://manage.py/) migrate`
|
||||
|
||||
Finally, see your app by running the server! 🎉
|
||||
|
||||
`python [manage.py](http://manage.py/) runserver`
|
||||
|
||||
You should see a neat little success page if you navigate to something like [http://127.0.0.1:8000/](http://127.0.0.1:8000/) (the exact URL should be in your console).
|
||||
|
||||
If you are not sure how to get to this point, I’d suggest looking up an installation/setup guide such as this one from the official documentation or this one from Django Girls.
|
||||
|
||||
### Setting up Templates
|
||||
|
||||
The first step is to setup a basic HTML template that becomes the frontend. We go into our app directory (which, in my case, is `talks`) and then make a templates directory inside it, where I make a simple `index.html` file. Instead of using a skeleton file here, I’m going to take a deep breath and throw in the index.html from the webslides codebase. At this point I know it won’t be a pretty sight, but I’m also optimistic that I can iron it out as I go along 🤕
|
||||
|
||||
I’m going to head over to `urls.py` and add the following import:
|
||||
|
||||
`from talks import views`
|
||||
|
||||
and then add the following item to urlpatterns, which I understand only vaguely at this point:
|
||||
|
||||
`path('',views.index,name='home'),`
|
||||
|
||||
We now need to make sure that views.index actually makes sense, so switch to [views.py](http://views.py/) in the talks directory and add the following:
|
||||
|
||||
```jsx
|
||||
def index(request):
|
||||
return render(request,'index.html')
|
||||
```
|
||||
|
||||
Note that `render` has already been imported for you from `django.shortcuts`. For now, I sense that this is the plumbing connecting the directive in `urls.py` to the meat in the templates directory. Now, navigating again to the webapp, while it’s not exactly pretty (just as predicted), but at least you can see that all the connections are working as intended:
|
||||
|
||||
> **Caution**
|
||||
>
|
||||
> ## Click toggle to reveal a full-page screenshot of an unstyled webpage!
|
||||
>
|
||||
> 
|
||||
|
||||
|
||||
So it’s time to add the static supporting files for the webslides template. I’m going to create the folder `static` inside the `talks` folder. Inside the static folder, copy over the folders `css`, `js` and `images` from the webslides template bundle. Now, we need to make sure that our `index.html` loads these supporting files from the appropriate location. This is a critical step and will completely transform the way the website is rendered if done correctly. So what we are going to do is add the following line to the top of the file:
|
||||
|
||||
`{% load staticfiles %}`
|
||||
|
||||
Next, find all instances of anything that looks like:
|
||||
|
||||
`<link rel="stylesheet" type='text/css' media='all' href="static/css/webslides.css">`
|
||||
|
||||
and change it to:
|
||||
|
||||
`<link rel="stylesheet" type='text/css' media='all' href="{% static 'css/webslides.css' %}">`
|
||||
|
||||
Careful with getting the quotes and the template tags in place accurately! Also remember to attack every instance of a reference to anything the static/ directory. If you are comfortable with it, this is a near-one-shot find and replace with a regex search.`
|
||||
|
||||
You could also make this work by using relative paths (i.e., changing the paths to `../css/webslides.css`), but using the Django template tags as above is more robust to changes in the directory structure — so in case your static files folder moves around, your code doesn’t have to change.
|
||||
|
||||
Now, for the moment of truth, restart the server:
|
||||
|
||||
`python [manage.py](http://manage.py/) runserver`
|
||||
|
||||
and revisit your site:
|
||||
|
||||

|
||||
|
||||
So there! We’ve managed to render the webslides deck inside of our Django project — which is an awesome start already: 🎉
|
||||
|
||||
### Starting Clean
|
||||
|
||||
Of course, we don’t quite want the `index.html` file to hold this particular content. I’m going to quickly pick out a slide (from the webslides demonstrations) that looks nice for displaying talk announcements, and get rid of all the original sections and just use this one. Here’s the HTML for the sections that I ended up with, populated with some sample content:
|
||||
|
||||
```jsx
|
||||
<section>
|
||||
<div class="wrap">
|
||||
<div class="card-30 bg-white">
|
||||
<div class="flex-content">
|
||||
<h2>Talk Title 1
|
||||
</h2>
|
||||
<p>Speaker Name & Affiliation</p>
|
||||
<p class="text-intro">A brief abstract of the talk.
|
||||
</p>
|
||||
<ul class="description">
|
||||
<li><strong class="text-label">Date:</strong> 16 June 2018</li>
|
||||
<li>
|
||||
<strong class="text-label">Time:</strong> 10:00 AM
|
||||
</li>
|
||||
<li><strong class="text-label">Venue:</strong> Academic Block 1, Room 101</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- end .flex-content-->
|
||||
</div>
|
||||
<!-- .end .card-50 -->
|
||||
</div>
|
||||
<!-- .end .wrap -->
|
||||
</section>
|
||||
|
||||
```
|
||||
|
||||
Of course, this data would eventually be passed into the template from the database, but let’s render our site anyway and check it out once more before moving on:
|
||||
|
||||

|
||||
|
||||
It’s not hard to customize the header from index.html, but I am postponing that for a little bit later.
|
||||
|
||||
### Template Inheritance
|
||||
|
||||
It’s useful to have global-ish aspects of our template separated out into a (presumably traditionally named) base.html template, so we can make spin-offs easily. For example, when we have interviews we like to display room numbers for candidates interviewing for different disciplines on the same day, and some related general information. This page will carry the same overall structure, but we might want to use a slightly different combination of section templates. So let’s rip out the generic stuff from index.html and move it to base.html:
|
||||
|
||||
```html
|
||||
{% load staticfiles %}
|
||||
...bunch of webslides header stuff...
|
||||
|
||||
<main role="main">
|
||||
<article id="webslides" class="vertical">
|
||||
|
||||
{% block content %}
|
||||
{% endblock content %}
|
||||
|
||||
</article>
|
||||
<!-- end article -->
|
||||
</main>
|
||||
<!-- end main -->
|
||||
...bunch of webslides footer stuff...
|
||||
```
|
||||
|
||||
(Please don’t copy-paste this, work with your own webslides template if you are literally following along! I’ve not dislpayed a bunch of stuff from their index.html in the interest of space.)
|
||||
|
||||
Meanwhile, your `index.html` now looks like this:
|
||||
|
||||
```html
|
||||
{% extends 'base.html' %}
|
||||
{% load staticfiles %}
|
||||
{% block content %}
|
||||
<section>
|
||||
<div class="wrap">
|
||||
<div class="card-30 bg-white">
|
||||
<div class="flex-content">
|
||||
<h2>Talk Title 1
|
||||
</h2>
|
||||
<p>Speaker Name & Affiliation</p>
|
||||
<p class="text-intro">A brief abstract of the talk.
|
||||
</p>
|
||||
<ul class="description">
|
||||
<li><strong class="text-label">Date:</strong> 16 June 2018</li>
|
||||
<li>
|
||||
<strong class="text-label">Time:</strong> 10:00 AM
|
||||
</li>
|
||||
<li><strong class="text-label">Venue:</strong> Academic Block 1, Room 101</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- end .flex-content-->
|
||||
</div>
|
||||
<!-- .end .card-50 -->
|
||||
</div>
|
||||
<!-- .end .wrap -->
|
||||
</section>
|
||||
{% endblock content %}
|
||||
|
||||
```
|
||||
|
||||
Remember to make sure that the line:
|
||||
|
||||
`{% extends 'base.html' %}`
|
||||
|
||||
is the very first thing in your file, and that you add:
|
||||
|
||||
`{% load staticfiles %}`
|
||||
|
||||
in case you plan to use anything in your static directory in index.html. The power of inheritance becomes a little more evident when you have other files piggybacking on base.html, but I’ll leave that to your imagination for now.
|
||||
|
||||
### Setting up the Database
|
||||
|
||||
We’re going to start by creating an admin user, by typing the following into the commandline:
|
||||
|
||||
`python manage.py createsuperuser`
|
||||
|
||||
This prompts for a username, email and password — nothing out of the ordinary here. Next up is a critical point in this whole exercise, which is to setup the model, or the database schema, for the items we wanted to display. From the HTML above you might have guessed that what I want to define at this point is a talk object with the following attributes:
|
||||
|
||||
1. Talk Title
|
||||
2. Speaker Name
|
||||
3. Venue
|
||||
4. Date
|
||||
5. Time
|
||||
|
||||
To capture this, add the code below to models.py:
|
||||
|
||||
```python
|
||||
class Talk(models.Model):
|
||||
title = models.CharField(max_length=255)
|
||||
speaker = models.CharField(max_length=255)
|
||||
description = models.TextField()
|
||||
venue = models.CharField(max_length=255)
|
||||
date = models.DateField()
|
||||
time = models.TimeField()
|
||||
```
|
||||
|
||||
The field types should be self-explanatory. One type that I did not use was the SlugField, which can be handy if you want every talk to have its own page. For now, we’re keeping it simple. We then ask Django to pick up this updated database plan by running migrations as follows:
|
||||
|
||||
`python manage.py makemigrations`
|
||||
`python manage.py migrate`
|
||||
|
||||
We next get the built-in Django admin interface up to speed with information about our new database, by adding the following lines to `admin.py` in the `Talks` folder:
|
||||
|
||||
```python
|
||||
from talks.models import Talk
|
||||
class TalkAdmin(admin.modelAdmin):
|
||||
model = Thing
|
||||
list_display = ('title','speaker','description','venue','date','time')
|
||||
admin.site.register(Talk, TalkAdmin)
|
||||
```
|
||||
|
||||
The business with the `TalkAdmin` class is optional, but it lets you do nice things like prepopulate fields where relevant: for instance, if we had a slug field, we could have said something like:
|
||||
|
||||
`prepopulated_fields = {'slug'}: ('name',)}`
|
||||
|
||||
just after the list_display line above, and you could see the slug getting automatically generated in the admin interface. Speaking of admin interfaces, let’s check ours out — head over to [http://127.0.0.1:8000/admin/](http://127.0.0.1:8000/admin/) and login with your superuser credentials. Here’s what I see:
|
||||
|
||||

|
||||
|
||||
You should find your own data in the users table. But the interesting bits are in the Talks table, which is going to look exactly the way we modeled it above when you go to the table and click on the Add Talk button:
|
||||
|
||||

|
||||
|
||||
Now let’s go ahead and add some sample data in here:
|
||||
|
||||

|
||||
|
||||
I added this from the admin interface. If you like, you can setup forms for other users to add data to the database, but that’s going to be beyond the scope of our first app. For now, let’s get to tying this all together by getting the data from here to display on the frontend…
|
||||
|
||||
### Displaying Dynamic Content
|
||||
|
||||
If you’ve come this far, you are now ready to pull your data into the slideshow that we setup from before. First, let’s get into `views.py`, pull the data from our database, and pass it on to our template. Modify the file so it looks like this:
|
||||
|
||||
```python
|
||||
from django.shortcuts import render
|
||||
from talks.models import Talk
|
||||
|
||||
#Create your views here.
|
||||
|
||||
def index(request):
|
||||
talks = Talk.objects.all()
|
||||
return render(request, 'index.html', {
|
||||
'talks': talks,
|
||||
})
|
||||
```
|
||||
|
||||
Next, let’s head back to our index.html file, and adapt our content block:
|
||||
|
||||
```html
|
||||
{% extends 'base.html' %}
|
||||
{% load staticfiles %}
|
||||
{% block content %}
|
||||
{% for talk in talks %}
|
||||
<section>
|
||||
<div class="wrap">
|
||||
<div class="card-30 bg-white">
|
||||
<div class="flex-content">
|
||||
<h2>{{ talk.title }}
|
||||
</h2>
|
||||
<p>{{ talk.speaker }}</p>
|
||||
<p class="text-intro">{{ talk.description }}
|
||||
</p>
|
||||
<ul class="description">
|
||||
<li><strong class="text-label">Date:</strong> {{ talk.date }}</li>
|
||||
<li>
|
||||
<strong class="text-label">Time:</strong> {{ talk.time }}
|
||||
</li>
|
||||
<li><strong class="text-label">Venue:</strong> {{ talk.venue }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- end .flex-content-->
|
||||
</div>
|
||||
<!-- .end .card-50 -->
|
||||
</div>
|
||||
<!-- .end .wrap -->
|
||||
</section>
|
||||
{% endfor %}
|
||||
{% endblock content %}
|
||||
|
||||
```
|
||||
|
||||
Note that we’re now using a for loop to go over everything in talks, and replacing our static content with template tags that represent the corresponding data from the database. Django has a lot of interesting ways in which you can format your content (such as dates and times, especially, but even text strings — for instance, they can always be rendered in title case, if you like, and so on). Since the default view here is not bad, I won’t be pursuing this further — but it’s good to know that you can do [cool things](https://docs.djangoproject.com/en/dev/ref/contrib/humanize/).
|
||||
|
||||
Let’s check out our site now, to relish the sight of the slides populated with conent from our database:
|
||||
|
||||

|
||||
|
||||
### Filtering Dynamic Content
|
||||
|
||||
Let’s say we only want to display those talks whose date is not in the past — this is a natural ask, we don’t want our virtual notice board to be cluttered with information about talks from the past (that’s more suitable for a talk archive page), and we also don’t want to have to delete talks from the database manually (two issues with this: the first is that manual is tedious, the second is that it’s nice to keep the data — quite likely the developer of the future archive page will find it useful).
|
||||
|
||||
One way to do this is to loop through all the talks in our template file, and setup a conditional for whether we display it. The main problem doing it this way is that we are doing waaaay more work than is called for: eventually this database will have thousands of talks, while you probably need to get hold of a dozen or so of them. The more appropriate solution is to setup what is called a filter when you make the database query. After some fiddling around, I finally got to this updated query in my views file:
|
||||
|
||||
`talks = Talk.objects.filter(date__gte=datetime.now()).order_by('date')`
|
||||
|
||||
Remember to import datetime for the above to work:
|
||||
|
||||
`from datetime import datetime`
|
||||
|
||||
The syntax here is almost self-explanatory: we got rid of the `.all()` and replaced it with a `.filter()` to indicate that, indeed, we don’t want all records but only those that match the filter criteria. Next, `gte` stands for greater than or equal to; `datetime.now()` refers to today’s date; while the `order_by` directive asks the retrieved objects to be ordered according to a particular field. You can order by this-then-that by simply adding multiple fields separated by commas, and you can reverse the order by adding a leading hyphen (or a “minus”, if you like) to the field name. Try all this out! Also: try to mess around with the query to see what happens when the query returns an empty set of records.
|
||||
|
||||
Going back to our app, we see that the one talk that was in the past (at the time of this writing) is now gone:
|
||||
|
||||

|
||||
|
||||
### Finishing Touches
|
||||
|
||||
One thing I didn’t touch upon was how to pass Python variables into the template. Let’s try this now, by adding a final slide that displays today’s date and a nice background image (which resides in the `images/` folder under the `static` directory). To pull out today’s date, let’s set a variable `currdate` in our views file, and pass it on to our template, like so:
|
||||
|
||||
```python
|
||||
def index(request):
|
||||
talks = Talk.objects.filter(date__gte=datetime.now()).order_by('date')
|
||||
currdate = datetime.now()
|
||||
return render(request, 'index.html', {
|
||||
'talks': talks,
|
||||
'currdate': currdate,
|
||||
})
|
||||
```
|
||||
|
||||
Back to the template, as before, I picked up a nice-looking section from the vast array of webslide’s demo pages. Carefully add this section after the forloop block ends:
|
||||
|
||||
```html
|
||||
<section class="bg-gradient-v slide-bottom">
|
||||
<span class="background light" style="background-image:url('{% static 'images/campus-bg.png' %}')"></span>
|
||||
<div class="wrap">
|
||||
<div class="content-right">
|
||||
<h3 class="alignright">{{ currdate|date }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
<!-- .end .wrap -->
|
||||
</section>
|
||||
```
|
||||
|
||||
Note the use of `{{ currdate|date }}` — this displays the value of the variable `currdate` but formatted so that only the date is displayed (without the trailing date instruction, this would display the date and the time by default). This gives us a cool final slide:
|
||||
|
||||

|
||||
|
||||
Also remember to head back to `base.html` and customize the header so the social media links and the logos are relevant to your setting:
|
||||
|
||||

|
||||
|
||||
### Beyond the First App
|
||||
|
||||
Our app was, by design, a largely view-only app. In most situations, however, your app will likely have users, so you would want features like:
|
||||
|
||||
- Registration (possibly even single-sign ons)
|
||||
- A Login Flow (optionally, also an onboarding flow)
|
||||
- Reset Password
|
||||
- The ability for users to view user-specific data
|
||||
- The ability for users to add/edit/delete user-specific data
|
||||
|
||||
For a lot of this you would need to invoke some kind of a customized form interface (different from Django’s built-in admin interface) that allows the user to interact with the database. Covering this is beyond the scope of our discussion, but if you would like to set these things up, I’d suggest continuing your journey with either [this Django tutorial series](https://simpleisbetterthancomplex.com/series/2017/09/04/a-complete-beginners-guide-to-django-part-1.html), [the official documentation](https://docs.djangoproject.com/en/2.0/), or [Hello Web App](https://hellowebbooks.com/learn-django/). Have fun!
|
||||
|
After Width: | Height: | Size: 184 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 341 KiB |
|
After Width: | Height: | Size: 663 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 363 KiB |
|
After Width: | Height: | Size: 137 KiB |
|
After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 184 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
|
@ -0,0 +1,220 @@
|
|||
---
|
||||
title: "Envelope Budgeting with Notion"
|
||||
description: "YNAB (c.f. r/YNAB) (short for You Need a Budget ) is a budgeting application that lets you track and manage your finances. Like most apps in this category, it provides a slick i..."
|
||||
pubDate: "2021-09-18"
|
||||
authorName: "Neeldhara"
|
||||
sourceCategories: ["notion", "workflows", "tutorial"]
|
||||
sourcePath: "envelope-budgeting-notion/index.qmd"
|
||||
---
|
||||
|
||||
[YNAB](https://www.youneedabudget.com) (c.f. [r/YNAB](https://www.reddit.com/r/ynab)) (short for *You Need a Budget*) is a budgeting application that lets you track and manage your finances. Like most apps in this category, it provides a slick interface to enter all your transactions. YNAB is more than just cataloging transactions and tracking account balances, though. The design here revolves around (and goes beyond) what is called [envelope budgeting](https://en.wikipedia.org/wiki/Envelope_system), which basically boils down to this:
|
||||
|
||||
> Give every dollar a job.
|
||||
|
||||
You can dig a little deeper into how YNAB works by looking up their [four rules](https://www.youneedabudget.com/the-four-rules/) here. I am going to try and create an envelope budgeting system in Notion that is loosely inspired by my use of YNAB.
|
||||
|
||||
To be clear, I don't expect to stop using YNAB, nor do I expect to replicate many of its sophisticated features. Also, there are some nice envelope budgeting systems on Notion already! For instance, you might want to check out the one [here](https://www.reddit.com/r/Notion/comments/mzfog5/envelope_budget_zerobased_budget_system/) by [u/sff_fan_17](https://www.reddit.com/user/sff_fan_17/) or [the one here](https://www.notion.so/Zero-based-Budget-21f015953116430ba4c3414a4691081e) by [Ben Smith](https://t.co/3Vv2zRGQuy?amp=1). These are really neat, but the only reason I'm not just duplicating one of them is that what I have in mind looks slightly different from the setups here. In particular, I would like the transactions to be dated and tied to specific accounts, and I would also like the system here to account for *all* the inflows and outflows in my actual system. Neither of these templates feature a hierarchy of categories either, which is something that we will attempt to do here.
|
||||
|
||||
In the first template above, I think the total income is mentioned separately, outside of the database system; and the budget covers a part of the total available income. There are explicit instructions on how to update this month-to-month, so do check this out — perhaps it works for what you might have in mind! The second template explicitly accounts for inflows, and is apparently based on [this Google sheet](https://docs.google.com/spreadsheets/d/1JVQzq20raZGwxnjsJhLjBrMDswOHL028dwPXdIHoeOQ/template/preview). It does seem that the transactions are missing information about accounts and dates, which could be a little limiting if you wanted to generate a report or a dashboard for a particular period of time. Again, a great starting point, and if it resonates with your kind of setup, it's definitely worth duplicating and playing with. Both templates are free to access and replicate.
|
||||
|
||||
Incidentally, if you don't use Notion and are hesitant to try YNAB, you could take a look at [their guide to building your own budgeting template](https://www.youneedabudget.com/how-to-create-a-budget-template/) — this does not require using YNAB at all and can even be made to work pen and paper. Many people have also recreated YNAB's core features using their own favourite tools, the most popular among which appears to be Google sheets — see, for example: [Aspire Budget](https://aspirebudget.com) (c.f. [r/aspirebudgeting](https://www.reddit.com/r/aspirebudgeting)) — I have not tried this myself, but it appears to be very feature-rich and neat overall.
|
||||
|
||||
That said, onto our own YNAB-esque budgeting template in Notion! We're on our way to something that looks like this:
|
||||
|
||||

|
||||
|
||||
If you want to just skip ahead and play with the template, you can duplicate it by following [this link](http://42templates.notion.site/Template-Envelope-Budgeting-in-Notion-447cacf529dd4149b18317460b8f9805):
|
||||
|
||||
There are three key pieces to this setup: the first is the categories (these are the labels on the envelopes, if you like), the second is the actual transactions that take take place, and the third is a list of accounts that you have (could be bank accounts, credit accounts, virtual wallets, and so on). You would want the transactions database to be linked to both categories and the accounts. More on the exact table designs below. I'm going to assume some familiarity with Notion terminology, if this is your first time with Notion then some of this may not make sense right away, but if you could just [look up how Notion databases work](https://www.notion.vip/how-to-create-your-first-relational-database-in-notion/) — especially the relational aspect — then I think you'd have all you need to follow along!
|
||||
|
||||
## Budgeting Categories
|
||||
|
||||
|
||||
It may be natural for this table to just have one row for each category. You probably want to have a small number of higher-order categories (e.g: monthly supplies, services, maintenance, health, investments, etc.) and smaller, more specific ones under these broad umbrellas (e.g, services would likely have sub-categories along the lines of internet, phone, electricity, water, etc.). You can do this by setting up a relation property to the table itself, and have it sync two-way, like so:
|
||||
|
||||

|
||||
|
||||
<aside>
|
||||
⚡ We want to make a database that captures the categories that our expenses fall under, and the budget that's available for these categories.
|
||||
</aside>
|
||||
|
||||
If you want to see just the higher-order categories nicely, you can setup a gallery view with a filter for the main category to be empty, which would look like this (I've disabled the preview and added some [icons from notion.vip](https://www.notion.vip/icons/)):
|
||||
|
||||

|
||||
|
||||
Next, we want to specify a budget for each of these categories. We can do this directly for the lower-order categories first. Then, we can have the main category budgets calculated automatically by rolling up the budgets of the corresponding child categories and adding up their budget values. To have a clean view of the budget, you could add a formula column that just adds up the values from the direct budgets and the rollup, like so:
|
||||
|
||||

|
||||
|
||||
You can add two dummy properties with the text `Budgeted:` and `Remaining:` for each row, and set them to show along with the budget in the Gallery view so you get something like this:
|
||||
|
||||

|
||||
|
||||
There are two natural questions at this point:
|
||||
|
||||
- How do we know that we have budgeted what we actually have?
|
||||
- How do we know what amounts are remaining at any given point of time in the month?
|
||||
|
||||
To address both of these questions, we will need to flesh out the transactions database, link it to the categories and come back to this. But before that, let's do a quick detour with an accounts database just to setup the foundation we need for the transactions database.
|
||||
|
||||
## Accounts
|
||||
|
||||
For this demonstration, I am just going to add two accounts — one savings bank account and one credit card account:
|
||||
|
||||
The most natural property we want for the Accounts database would be a *balance* column. Instead of maintaining this manually, we will just link this with the transactions database and derive the balance by rolling up the relevant transactions.
|
||||
|
||||

|
||||
|
||||
|
||||
<aside>
|
||||
⚡ The accounts database simply has one row for every account you have — these could be savings accounts, credit card accounts, a cash account, or your virtual wallets.
|
||||
</aside>
|
||||
|
||||
|
||||
## Transactions
|
||||
|
||||
You might want to optionally add a memo property that lets you add a quick note or explanation for the transaction. However, given that each database entry is also a page, you could also quite flexibly add all the additional information you want to the page corresponding to any transaction. Meanwhile, you might also want to setup relations to other parts of your Notion setup if you find anything relevant — for instance, if you have a books database, or an inventory database, and so on. That said, we're going to keep it simple here, and here's an example transaction:
|
||||
|
||||

|
||||
|
||||
<aside>
|
||||
⚡ Every transaction has the following: an amount, a payee, the account to which the amount was debited or credited to, the date the transaction happened, and and the expense category that the transaction belonged to. We set these up as columns with the appropriate properties, with the accounts and categories being relational links.
|
||||
</aside>
|
||||
|
||||
You'll notice that I've linked to both the child and the parent category for this transaction. It would be nice if the parent category was pulled up automatically — and this is possible with a formula, but as far as I know the formula will not actually *link* the transaction to the main category. So for now, we assign both categories manually. 🤷♀️
|
||||
|
||||
One quick thing to do now is to go back to the Accounts database and add a rollup property that takes on the sum of the amounts property from the related transactions table, and once done, the balances show up nicely in the gallery view:
|
||||
|
||||

|
||||

|
||||
|
||||
Now we go back to our categories database and rename the relational column to **transactions** and add a rollup that collects all expenses from the transactions that happened in a particular category, so this is what it looks like:
|
||||
|
||||

|
||||
|
||||
Now add a formula column **available** that simply adds up the budget and the expense columns so you can find out how much of your budget is still available for use. My formula looks like this:
|
||||
|
||||
`prop("Final Budget") + prop("Expenses")`
|
||||
|
||||
Note that it might feel more natural to subtract expenses, but my expenses are already negative amount transactions, so I just need to bundle it all together.
|
||||
|
||||

|
||||
|
||||
Just for fun, you could also add a **status** column that visually indicates how much of your budget you have left. The progress-bar style of the status property here is inspired [by this guide](https://www.notion.vip/notion-formulas-create-a-progress-bar/), and the formula I used requires a couple of auxiliary columns that calculate the percentage and determine if a half-star should be used or not based on the value of the decimal part. It also first checks that the available balance is in fact positive, if not, it's going to display a suitably scary warning emoji. I won't bore you with the specifics here, but you can find the formula in the template that I've linked to at the end of this post.
|
||||
|
||||
So now we are at a point where the remaining amounts are calculated based on the transactions. However, we still have to think about how to link the budgeted amounts to the actual money available. In fact, speaking of money available, I haven't really touched upon how to handle transactions that are not expenses; i.e, transactions with a positive amount value and that reflect money coming *into* the system as opposed to leaving it. These are, of course, just regular transactions — but what category do we assign them to? All the ones we have so far really capture spends, not inflows...
|
||||
|
||||
So, it turns out that YNAB would take all this money and automatically categorize it as unassigned, or to be budgeted. We can mimic this by creating a special category called `to be assigned`, and have all income-type transactions categorized as such. Typically this would be transactions corresponding to a salary, client payments, refunds, credit from interest, and so forth.
|
||||
|
||||

|
||||
|
||||
Notice that the so-called **expenses**[^1] that are now accumulating in this category is actually the total amount of money that came into the system. Incidentally, if you were to just look at the sum of the **balance** column in the accounts database, that's the net amount of money in the system at any given point of time.
|
||||
|
||||
---
|
||||
|
||||
[^1]: Remember that the expenses column just rolled up the transaction amounts in a particular category.
|
||||
|
||||
|
||||

|
||||
|
||||
<aside>
|
||||
⚡ Note that transactions that just move money within your accounts, like a credit card payment, don't need any explicit expense categories.
|
||||
</aside>
|
||||
|
||||
You also don't need to budget separately for credit card payments, because your credit card bill is composed of transactions that were already budgeted for! Even if they were items corresponding to, say, credit card fees, you probably categorized them under Services, for example. So we won't have a separate budget for credit card bill payments (although I should mention that YNAB does this explicitly and handles it automatically).
|
||||
|
||||
Alright, so it seems like we are nearly there, except that our current situation is the following:
|
||||
|
||||
1. The amount the *to be assigned* category is a true reflection of incoming funds.
|
||||
2. The amounts that we added to our category budgets were setup manually and generally divorced from the reality in the transactions database.
|
||||
|
||||
<aside>
|
||||
⚡ To fix this, we need some way to move funds from the *to be assigned* category to the other ones.
|
||||
|
||||
</aside>
|
||||
|
||||
For example, let's say I want to budget 750 for ebooks this month. I could do this by adding a dummy transaction that debits an amount of 750 to the *to be assigned* category and credits it to the *ebooks* category*.* What this means is that when we roll up the amounts from all transactions, we directly obtain the amount remaining for us to spend!
|
||||
|
||||
So for the very first month, when we have a clean slate, we just have a bunch of such transactions — these won't have any explicit account associated with them because they aren't real transactions; and in fact you can always filter your transactions table so that you only see the meaningful ones by setting the condition that the accounts column should be non-empty.
|
||||
|
||||
Meanwhile, here is how we do the budgets for our categories all over again, this time via these virtual transactions:
|
||||
|
||||

|
||||
|
||||
If you go to the *to be assigned* row in the categories table and look at the rollup value in the expenses column, then you'll see that it corresponds to either the amount of money that's still assigned (these are dollars — or in my case, rupees — that don't have a job yet), or, in case you happen to have overshot the budget, the amount by which you are falling short. In the former situation, the available amount will be a positive number, while in the latter, it'll be negative.
|
||||
|
||||

|
||||
|
||||
Ideally, we just want this number to be *zero*, indicating that everything has been assigned appropriately. To achieve this:
|
||||
|
||||
1. If your budgets have collectively overshot the amount of money available, re-adjust them them — specifically, reduce some of the amounts — so that this is no longer the case. Of course, I am saying this from a theoretical standpoint; if your situation is that you have real expenses that you don't have real money for, then you would want to plan for this by bringing the differential amount of money into the system via a loan, and then planning the repayment by budgeting for it as well. Dealing with debt is beyond the scope of this discussion, but I think the [YNAB blog](https://www.youneedabudget.com/blog/), [book](https://www.youneedabudget.com/ynab-the-book/), and [videos](https://www.youtube.com/user/youneedabudget) go into this at length.
|
||||
2. If you have money left over, you could either add it to your budgets, giving yourself some extra wiggle room; but I prefer to budget for fixed amounts generally, so in this situation I'll just add this amount to something I call a *Miscellaneous* or *Scratchpad* category. It's something you can borrow from if you fall short later, it has no particular semantics. Some people like to sweep off any excess money into deposit accounts, and if you do this, then you might want to create those accounts in the system and enter those transactions to get rid of this positive balance.
|
||||
|
||||
At the end of this, you are in a situation where all money is nice and assigned. Since we started off by specifying budgets manually, we should go back and fix some formulas in our database of categories. In particular, here's what I did to simplify things:
|
||||
|
||||
- Remove the `Available` column (previously this was the difference of the manually set budget and the rolled up expenses).
|
||||
- Rename `Expenses` to `Available`, since the rollup now just reflects what's truly available.
|
||||
|
||||
I'm going to leave the manually added budgets in — although we won't use them to calculate what's truly available any more, they will help us plan our budgets going forward.
|
||||
|
||||
Everything so far should make sense for an initial setup, but what do we do when we have new incoming transactions that need to be assigned to categories? I generally like to do the budgeting exercise once at the start of every month, so any intermediate positive transactions into the system will either remain in the *To be assigned* category, or if you are OCD about wanting that that category to be set to zero always, you can always push this number out into your scratchpad.
|
||||
|
||||
At the start of the month (this could be another day and a different frequency; but I do recommend being consistent for simplicity), we need to refuel the categories with the funds available. There are two kinds of things that could happen here, broadly speaking:
|
||||
|
||||
1. For categories that represent a plan to save up to something, like a vacation, or a category where you feel like you want to have a certain amount of money set aside every month irrespective of how much you spent in the last month, you just want to push `budget` amount of money into that category via the virtual transactions we discussed earlier.
|
||||
2. For other categories, which I like to think of as those having *rolling* budgets, you want to only assign the difference between what was budgeted and what was spent... and hopefully this is a non-negative quantity!
|
||||
|
||||
You could setup a checkbox to indicate which categories have rolling budgets and which ones do not, and then this formula:
|
||||
|
||||
`prop("IsRolling?") ? (prop("Budget") - prop("Available")) : prop("Budget")`
|
||||
|
||||
will tell you how much you should budget for next month.
|
||||
|
||||

|
||||
|
||||
In this example, Ebooks are not a rolling category, so even though I need only 628.95 to meet the original budget, I'll still set aside the full 750, and the amount that will be available will be 871.05. On the other hand, Phone is a rolling category, and presumably my phone-related expenses in the current month added up to 420, so the recommendation is to budget 420 next time so you'll still have 500 available total.
|
||||
|
||||
## The Process After Setting Up
|
||||
|
||||
There are two main times that you'll interact with this budget: whenever a transaction is made, and once every X days to reset the budgets for the individual categories.
|
||||
|
||||
Adding transactions is reasonably easy, although admittedly it's probably not as smooth as a specialized app that might have a Siri command to do this for you or a widget that let's you quick-add things. However, it's not too bad, especially if you enter it right away. You could also potentially automate this via API integrations, or enter your transactions in your regular app and export them as a CSV and import them into the Notion system once every so often.
|
||||
|
||||

|
||||
|
||||
The budgeting bit is going to be a little more work, especially if you work with a gazillion categories. The formulas will guide to you what needs to be done, but those virtual transactions still need to be added manually. On YNAB, you can do what I described above (adding the deficit to rollup categories and the originally intended budgets to the others) in one click — and there are other options too, for example, you may have moved to a new location and you're still getting the hang of what you'll need to set aside for groceries, so YNAB will offer to budget what you spent last month, or your average expenses from the last six months, and so on. Here, since you are assigning things manually, you can definitely tweak as you go; the **next month** column is just a suggestion.
|
||||
|
||||
You can probably prepare a CSV file with the default budget amounts and just merge this in at the start of every month if your expenses are super predictable, and just adjust the entries that need adjusting. This will save you some time, but remember that the categories still need to be linked to manually. It's not too bad for something that happens once a month and that will hopefully bring you some sense of control and awareness 😇
|
||||
|
||||
Perhaps also try and not have a gazillion categories and sub-categories, at least to begin with — it helps to keep things simple, especially when starting out.
|
||||
|
||||
## Common Pitfalls
|
||||
|
||||
Here are a couple of mistakes I made frequently, even while just setting up this template!
|
||||
|
||||
- Forgetting that transaction amounts corresponding to expenses should be recorded as negative numbers! If this happens very very frequently to you, you could also set this up a little differently — have a checkbox to indicate if a transaction is an expense or an inflow, and always enter a positive number reflecting the amount, and let a formula do the work of adding the sign!
|
||||
- Forgetting to add the parent category — this can mess up the views of what's available in the high-level categories and cause the numbers to not tally. So if you need to debug your numbers, check for whether you have added both categories to your transactions or not!
|
||||
|
||||
## Dashboards
|
||||
|
||||
Most of the action here is happening in the Transactions database. You could create linked copies of this database anywhere you like and filter things out to see what you want. For instance, if you want to keep tabs on the transactions in specific accounts, you could have this on your account pages:
|
||||
|
||||

|
||||
|
||||
You could filter out transactions for a particular month, a particular category (either a top-level category or an atomic one), and so on. I think there's plenty you can do here, but I am not sure how much of this can be automated. For instance, you might want to generate — or have over email — a monthly report of your expenses across various categories and how did relative to your estimated budgets. This should be possible by leveraging the API and tools like Integromat/Zapier/Automate.io - but I haven't really explored the possibilities here.
|
||||
|
||||
## Missing Features
|
||||
|
||||
It would be nice to have a gallery view of the months of the year showing spends and budgets in each (high-level?) category. For this though I'd need the rows to correspond to months, columns corresponding to categories, which pull up transactions that happened in a particular month from said category.
|
||||
|
||||
Even if I manually linked the transactions database to this calendar one, and made sure each transaction was linked to the correct row, I don't see how I can split up those transactions across categories, since it's not possible to add a filter to relational columns or rollups as far as I know. It's a similar bottleneck going through the Categories database as well. This information is of course implicit in the system, I just can't think of a neat way of visualizing it.
|
||||
|
||||
This is possible to do for the current month though:
|
||||
|
||||

|
||||
|
||||
YNAB also has more sophisticated category types — apart from budgets that roll or accumulate, you could have categories that aim to have a certain amount of funds assigned by a certain date and so on. For those who are freelancers with incomes spread over the days of the month, I think YNAB has a lot of little features that allow for a more flexible way of budgeting, which I'm not super familiar with because I'm not in this situation. This is just to say that this setup here may be both limiting and feeing because of how much of the setup is manually done. At least that's my optimistic view right now 😀
|
||||
|
||||
Finally, YNAB also has an option to reconcile accounts, which is when you declare that the numbers in YNAB match the book balance according to your bank or credit card agency. This is a neat little thing that I like to check off every so often. Here, I suppose you could just glance through the balances on the Accounts database (remember the gallery view from earlier?), but it won't have the same song-and-dance-y feeling — but maybe this could be a recurring task that you can check off, and hopefully *that* will feel good 😅
|
||||
|
||||
So that's about it! I'd love to hear any feedback on this, and suggestions for improving the setup would be very welcome too. You can duplicate the template [from here](https://www.notion.so/Template-Envelope-Budgeting-in-Notion-447cacf529dd4149b18317460b8f9805).
|
||||
|
After Width: | Height: | Size: 4.9 MiB |
28
sites/reviews/src/content/reviews/massren/index.md
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
title: "Massren for fast file renaming"
|
||||
description: "My tool of choice for bulk file-renaming has become[^1] Massren: [^1]: As opposed to, say, GUI clients. Massren is a command line tool that can be used to rename multiple files..."
|
||||
pubDate: "2020-09-11"
|
||||
authorName: "Neeldhara"
|
||||
sourceCategories: ["workflows"]
|
||||
sourcePath: "massren/index.qmd"
|
||||
---
|
||||
|
||||
My tool of choice for bulk file-renaming has become[^1] [Massren](https://github.com/laurent22/massren):
|
||||
|
||||
[^1]: As opposed to, say, GUI clients.
|
||||
|
||||
> Massren is a command line tool that can be used to rename multiple files using your own text editor. Multiple-rename tools are usually difficult to use from the command line since any regular e
|
||||
xpression needs to be escaped, and each tool uses its own syntax and flavor of regex. The advantage of massren is that you are using the text editor you use every day, and so you can use all the features you are already used to.
|
||||
>
|
||||
|
||||
Simply navigate to the directory in which your files are and invoke massren. You can easily set it up to use your favorite text editor, so for example, I have mine configured to use VSCode:
|
||||
|
||||
```
|
||||
massren --config editor code
|
||||
```
|
||||
|
||||
If you have a text editor you are comfortable with, then this can lead to all kinds of interesting possibilities, especially when combined with regular expression search.
|
||||
|
||||

|
||||
|
||||
This workflow is especially convenient in combination with an Alfred wokflow to open the current Finder directory in the terminal, such as [this one](https://github.com/LeEnno/alfred-terminalfinder).
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
---
|
||||
title: "ZSA Moonlander: Ergonomic Keyboard for Coders"
|
||||
description: "Six months with a split ergonomic mechanical keyboard - the good, the bad, and the RSI relief."
|
||||
pubDate: "Feb 20 2024"
|
||||
image: "https://images.unsplash.com/photo-1587829741301-dc798b83add3?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# ZSA Moonlander: Ergonomic Keyboard for Coders
|
||||
|
||||
After years of wrist pain, I took the plunge into ergonomic mechanical keyboards.
|
||||
|
||||
## The Learning Curve
|
||||
|
||||
Week 1: 20 WPM and questioning life choices
|
||||
Week 2: 40 WPM and seeing the light
|
||||
Month 2: Back to 80 WPM with no wrist pain
|
||||
|
||||
## The Good
|
||||
|
||||
- Columnar layout makes sense once muscle memory adapts
|
||||
- Thumb clusters are game-changers for shortcuts
|
||||
- The configurability is endless (perhaps too endless)
|
||||
|
||||
## The Investment
|
||||
|
||||
At $365, it's expensive. But compared to physical therapy or career-limiting injury? Bargain.
|
||||
|
||||
## Who Should Buy This?
|
||||
|
||||
If you type for a living and feel any discomfort, don't wait. Your future self will thank you.
|
||||
302
sites/reviews/src/content/reviews/new-mac/index.md
Normal file
|
|
@ -0,0 +1,302 @@
|
|||
---
|
||||
title: "New Mac"
|
||||
description: "Here's a list of 50 things[^1] (with occasional additional context) that I install whenever I'm setting up macOS from scratch. [^1]: NB. This list does not include fonts and scr..."
|
||||
pubDate: "2021-09-30"
|
||||
authorName: "Neeldhara"
|
||||
sourceCategories: ["apps", "lists"]
|
||||
sourcePath: "new-mac/index.qmd"
|
||||
---
|
||||
|
||||
Here's a list of 50 things[^1] (with occasional additional context) that I install whenever I'm setting up macOS from scratch.
|
||||
|
||||
[^1]: NB. This list does not include fonts and scripts — that's for a separate round up in due course.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> ## via Setapp
|
||||
>
|
||||
> 1. Bartender
|
||||
>
|
||||
> Keeps the menubar clean. Very handy!
|
||||
>
|
||||
> 2. Better Touch Tool
|
||||
>
|
||||
> I really need to leverage this a lot more, but even simple actions like swipe down with three fingers to close a tab, or tip-tap right left to move between tabs is pretty awesome already. Also use four-finger double tap to make the mouse pointer larger when it's lost between screens... I'd guess this app can probably subsume a lot of the functionality offered by apps like Keyboard Maestro and Alfred.
|
||||
>
|
||||
> 3. iStat Menus
|
||||
>
|
||||
> Good-looking stats in the menubar 👍️
|
||||
>
|
||||
> 4. Yoink
|
||||
>
|
||||
> Has to be one of the best shelf apps out there. I know that there are a bunch of others in this space right now (👀, Filepane), however I have been using Yoink for so long that I haven't considered switching. My common use-cases:
|
||||
>
|
||||
> - Alfred actions to send-to-Yoink
|
||||
> - Using Yoink to stash away screenshots before the floating image disappears
|
||||
> - A KM shortcut that can send any Finder item to Yoink
|
||||
>
|
||||
> 5. CleanMyMac
|
||||
>
|
||||
> Mostly to keep track of file sizes via the Space Lens, and running cleanups once in a while.
|
||||
>
|
||||
> Alternative if using only this feature: Daisy Disk
|
||||
>
|
||||
> 6. Default Folder X
|
||||
>
|
||||
> Use this all the time to stash away stuff where it belongs to keep Downloads clutter-free. Also the Alfred DFX collection is handy for finding recent items even if not 100% reliable.
|
||||
>
|
||||
> 7. Timing
|
||||
>
|
||||
> Use this to supplement manual time-tracking. Do not use it to its full potential at all, I think a little investment with setting up the right projects etc. can go a long way.
|
||||
>
|
||||
> 8. Dropzone
|
||||
>
|
||||
> I mostly use this as a longer-term stash than Yoink. I think there are some very nice possibilities here, but the only things I've done with it so far include:
|
||||
>
|
||||
> - uploading images online
|
||||
> - opening a finder path in a terminal (superseded by an Alfred shortcut)
|
||||
> - dropping files in select locations
|
||||
> - URL shortening
|
||||
> 9. Permute
|
||||
>
|
||||
> Handy for all kinds of (bulk) file conversions.
|
||||
>
|
||||
> 10. Text Sniper
|
||||
>
|
||||
> Impressive OCR "from anywhere". The newer releases of macOS may make this redundant eventually though.
|
||||
>
|
||||
> 11. Swish
|
||||
>
|
||||
> Intuitive gestures for window management. Pretty confident all this can be done in Better Touch Tool (above), but the actions are inspiring, and I'm lazy, so yeah, this is explicitly installed.
|
||||
>
|
||||
> 12. Downie
|
||||
>
|
||||
> Use this for downloading videos from Youtube for offline viewing/listening. Fairly robust.
|
||||
>
|
||||
> 13. IconJar
|
||||
>
|
||||
> Icon collection, enough said. 🎁
|
||||
>
|
||||
> 14. Sip
|
||||
>
|
||||
> Handy 🎨 color picker.
|
||||
>
|
||||
> 15. World Clock Pro
|
||||
>
|
||||
> Visually appealing world-clock, nice for scheduling stuff across timezones, great screensaver option as well.
|
||||
>
|
||||
> 16. Dash
|
||||
>
|
||||
> Documentation lookup, handy that it works inside VS Code (via an extension).
|
||||
>
|
||||
> 17. MindNode
|
||||
>
|
||||
> Lovely mindmaps.
|
||||
>
|
||||
> 18. PDFPen
|
||||
>
|
||||
> Although I mostly use Preview, PDFPen is useful for quickly rearranging and removing pages. Not sure about the several other features claimed, I find that it sadly crashes more often than not, so not my default application.
|
||||
>
|
||||
> 19. TextSoap
|
||||
>
|
||||
> Occasional use, but very useful when I do need it for some pesky hidden-unicode-character-removal exercise.
|
||||
>
|
||||
> 20. MathKey
|
||||
>
|
||||
> Niche app - on the rare occasion that I have a complicated LaTeX formula to write, I can write it in the iOS version of this app and receive it on the Mac (I don't think the desktop app is even necessary for this; the iOS purchase can be bypassed by using the Mac app via Sidecar, but this is where I discovered the app so it makes the list).
|
||||
>
|
||||
> 21. Marked
|
||||
>
|
||||
> Powerful previews for Markdown documents. Lots of interesting export features.
|
||||
>
|
||||
> 22. ChronoSync Express
|
||||
>
|
||||
> This helps with keeping certain folders in sync, and setting up some backup schedules. Nothing that can't be done with a few scripts (?) and/or Time Machine, but I did end up setting (and forgetting) a few things in here.
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> ## General
|
||||
>
|
||||
> 1. Notion
|
||||
>
|
||||
> I'm (admittedly* experimentally) using Notion as my primary PKM tool, and it's also where I am keeping most of my public-facing content (including this blog). My usage of Notion is gradually expanding in scope to include time/task/finance tracking as well. Too slow.
|
||||
>
|
||||
> *I've been in and out of Notion a few times by now, interleaved with fairly committed detours through Obsidian, Craft, and VSCode extensions for several months... I should mention that Craft is now available through Setapp, and that I am tentatively moving to Obsidian.
|
||||
>
|
||||
> 2. Bibdesk
|
||||
>
|
||||
> Fairly robust reference management that has most of what I need — priority features include speed, reliability, flexibility in generating citekeys and decent auto-filing of papers added to the database (popular free and paid alternatives that I've tried briefly: Zotero, Mendeley, Setne, Papers, Readcube, JabRef, Bookends).
|
||||
>
|
||||
> Incidentally, if you are into Obsidian and Zotero, you might enjoy [this video](https://www.youtube.com/watch?v=XbGJH08ZfCs).
|
||||
>
|
||||
> 3. MacTeX
|
||||
>
|
||||
> LaTeX and related tools, including TeX-friendly IDEs and reference management tools.
|
||||
>
|
||||
> 4. Xcode Tools, pandoc, and homebrew
|
||||
>
|
||||
> Need these to work with code.
|
||||
>
|
||||
> 5. Contexts
|
||||
>
|
||||
> The app that I miss the first when on a machine that doesn't have it, next to Alfred. Makes window switching much more search and keyboard-driven.
|
||||
>
|
||||
> 6. Alfred
|
||||
>
|
||||
> Apart from using it as a launcher (even for files), I almost use Alfred as a Finder replacement. Here are some of my favorite Alfred workflows:
|
||||
>
|
||||
> - Menubar Search
|
||||
> - Simple Folder Search (only search for folders)
|
||||
> - Case Switch (combined with send-text-to-Alfred below, this can be quite nifty)
|
||||
> - Symbols Search (unicode goodness)
|
||||
> - Send to Yoink
|
||||
> - Quit Applications
|
||||
> - Send text to Alfred (double-tap the option key)
|
||||
> - Color
|
||||
> - Currency Exchanges
|
||||
>
|
||||
> 7. Keyboard Maestro
|
||||
>
|
||||
> Really elaborate shortcut/automation app. I've only scratched the surface with my use cases, but one of the things I really dig about my setup is simulating keypress sequences.
|
||||
>
|
||||
> The way I do this is to activate a macro group for one action with one keyboard shortcut (e.g, CMD + ;) and then have all macros within that have one-letter or one-letter + one-modifier triggers - basically *very easy triggers.* This way, I only have to remember a bunch of high-level shortcuts for things in various categories, and from there it's just a letter (and the same letter can be overloaded in different contexts).
|
||||
>
|
||||
> As a concrete example, I have a macro group called launchers, and a shortcut within that for launching chrome. So something like CMD+L followed by c would launch Chrome. Although I have to confess that I mostly launch stuff through Alfred still (at the cost of one or two extra keystrokes).
|
||||
>
|
||||
> Keypress-sequence-triggers are native to Better Touch Tool and since BTT supports AppleScript, you could also run KM macros from BTT. I haven't quite tried this yet.
|
||||
>
|
||||
> More advice on this [here](https://wiki.keyboardmaestro.com/Frequently_Asked_Questions#How_do_I_use_a_multiple_keystroke_trigger).
|
||||
>
|
||||
> 8. Typinator
|
||||
>
|
||||
> Fast snippet expansion - faster than TextExpander (one of the main competitors in this space) in my experience. Recent updates have some rad features, which of course I'm yet to explore and exploit!
|
||||
>
|
||||
> 9. 1Password
|
||||
>
|
||||
> Reasonably user-friendly and robust password management. Syncs to iOS, but I haven't managed to leverage it so much on iOS. 1Password is ideal for storing confidential information nicely (IDs, bank stuff, and the like) - if used only for passwords I suppose the Keychain does a good job too.
|
||||
>
|
||||
> 10. Fantastical and Calendar
|
||||
>
|
||||
> Fantastical is a nice (but expensive!) calendar app, mostly use it because of the calendar sets feature that keeps my [time blocking calendars](https://www.macsparky.com/blog/2018/2/hyper-scheduling-mechanics) separate from the official one that is public within the organization. Of late, I especially like the way you can join online meetings from the notifications.
|
||||
>
|
||||
> ~~Having said that, I realized that much of what I was doing with Fantastical was overkill and I've switched to the default calendar app for now, and it's one paid subscription less[^2] to have.~~
|
||||
>
|
||||
> Oh well: so I am back on Fantastical, I guess I really like the UI! Meanwhile, Busycal is a great alternative if you are on Setapp.
|
||||
>
|
||||
> [^2]: I have nothing against paid subscriptions for software in general, but Fantastical's pricing for the feature set does seem to have an unclear cost-benefit tradeoff, at least for users like me. I haven't missed much since moving on.
|
||||
>
|
||||
> 11. VS Code
|
||||
>
|
||||
> This is where I am supposed to be spending most of my time, perhaps next only to Craft/Notion. A few things from my VSCode workflow:
|
||||
>
|
||||
> - Use different themes for different file types (I mostly dabble in LaTeX, C++, Python, JavaScript, and Markdown)
|
||||
> - Little utility extensions save a lot of time: e.g, sort lines, increment value at cursor, file management, etc.
|
||||
> - Multicursor-powered find and replace is amazing.
|
||||
> - Workspaces are handy and I usually launch them from Alfred.
|
||||
>
|
||||
> 12. Hook
|
||||
>
|
||||
> Looks very promising for cross-linking stuff across apps that have a common context (say, a project). I really need to explore this more!
|
||||
>
|
||||
> Update: Hook is now Hookmark, and is alo available through Setapp.
|
||||
>
|
||||
> 13. Stream Deck (best with accompanying hardware)
|
||||
>
|
||||
> Particularly useful for switching OBS scenes although I use it less than I thought I would!
|
||||
>
|
||||
> In particular, I want to explore their VSCode and KM integrations.
|
||||
>
|
||||
> If without the physical device, Streamdeck does have a nice iOS app that simulates the hardware, but the pricing is based on a subscription model.
|
||||
>
|
||||
> 14. Google Chrome
|
||||
>
|
||||
> I can't make up my mind between Chrome/FF/Brave/Safari. I mostly switch between Chrome and Safari, with a mild preference for Chrome because of it's more comprehensive extensions space, but I often end up with Safari as default for speed and privacy.
|
||||
>
|
||||
> 15. Readkit
|
||||
>
|
||||
> Use this for RSS, although I’ve mostly migrated away to DEVONthink. Still looking for a nice stand-alone RSS reader though, Readkit doesn't always render everything the way I expect, sadly.
|
||||
>
|
||||
> 16. OBS
|
||||
>
|
||||
> For recording and live-streaming videos. Also useful as a virtual camera for meeting apps.
|
||||
>
|
||||
> 17. Screenflow and Camtasia
|
||||
>
|
||||
> For recording videos, lots of features, still finding my way around them.
|
||||
>
|
||||
> 18. Slack and Discord
|
||||
>
|
||||
> Online communities. I sometimes wish there was a native app for discourse too (is there?)
|
||||
>
|
||||
> 19. Keynote
|
||||
>
|
||||
> Presentations - main alternative: Beamer + LaTeX + pgf/TikZ; or one of the JS-based slide generator tools from Markdown files (I did use react.js for one entire term).
|
||||
>
|
||||
> 20. DEVONthink
|
||||
>
|
||||
> Use this fairly minimally (especially relative to the possibilities). At the moment DT indexes a couple of key finder folders and pulls in information from a lot of RSS feeds and even Twitter accounts. I try to review the stuff that automatically piles up in DT regularly, but — at the moment — it's mostly a dumping ground and... messy.
|
||||
>
|
||||
> 21. Microsoft Teams, Skype, and Zoom
|
||||
>
|
||||
> Use this for classes and online meetings.
|
||||
>
|
||||
> 22. Office suite: Word/Powerpoint/Excel
|
||||
>
|
||||
> Use it only to open files I receive.
|
||||
>
|
||||
> 23. Fruitjuice
|
||||
>
|
||||
> Useful battery health monitoring, discovered the app from a MPU podcast episode IIRC.
|
||||
>
|
||||
> 24. Mathsnip
|
||||
>
|
||||
> Surprisingly good LaTeX-aware OCR.
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> ## Webapps
|
||||
> 1. YNAB
|
||||
>
|
||||
> Budgeting and finance management.
|
||||
>
|
||||
> 2. Gmail
|
||||
>
|
||||
> Until I setup Mailmate again, I'm checking email in my browser. 🙈
|
||||
>
|
||||
> 3. GSuite (Docs, Sheets, Slides, and Calendar)
|
||||
>
|
||||
> I use these when others use them.
|
||||
>
|
||||
> 4. Zapier, IFTTT, Integromat
|
||||
>
|
||||
> A few automations here and there, still on my bucket list to take full advantage here. Integromat has been great for [tracking Exportober](https://www.notion.so/Tracking-Exportober-2416e14ae9254bc0b97532f73058b1bb) contributions, incidentally!
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> ## Omissions
|
||||
>
|
||||
> (aka stuff I used to use but don’t use as much now.)
|
||||
>
|
||||
> 1. Karabiner Elements. I was quite taken in by the possibilities offered by [“God Mode”](https://medium.com/@nikitavoloboev/karabiner-god-mode-7407a5ddc8f6), but I realised that I prefer sequential shortcuts - like the ones I managed to setup in KM - to ones powered by arbitrary combinations of simultaneous keypresses.
|
||||
>
|
||||
> 2. Mailmate. Will very likely be back in the workflow soon!
|
||||
>
|
||||
> 3. Things. Retired when I switched to “Notion for Everything”. That said, Things is absolutely awesome!
|
||||
>
|
||||
> 4. Ulyssess. Replaced by Notion → Craft → Obsidian → Notion.
|
||||
>
|
||||
> 5. Bear. Replaced by Notion → Craft → Obsidian → Notion.
|
||||
>
|
||||
> 6. Sublime Text. Replaced by VSCode.
|
||||
>
|
||||
> 7. 2Do. Replaced by Things a long time ago, but a really nice app!
|
||||
>
|
||||
> 8. Shift. Combines many windows in one, basically. Not sure if it was sufficiently useful, living without it and not missing it much.
|
||||
>
|
||||
> 9. IM+. Similar to Shift in scope, although this one is available on Setapp.
|
||||
|
||||
|
||||
What’s on your list? Do share in the comments below!
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "Note Taking Resources"
|
||||
description: "Here is a list of courses, books, essays, youtube playlists, and other miscellany about taking notes, with the act interpreted broadly to include things like systems for filing,..."
|
||||
pubDate: "2023-06-02"
|
||||
authorName: "Neeldhara"
|
||||
sourceCategories: ["lists"]
|
||||
sourcePath: "note-taking-resources/index.qmd"
|
||||
---
|
||||
|
||||
Here is a list of courses, books, essays, youtube playlists, and other miscellany about taking notes, with the act interpreted broadly to include things like systems for filing, organization, linking, and thinking. Please feel free to drop a line in the comments or send a PR my way if you have something to add!
|
||||
|
||||
Thanks to [Abhinav](https://twitter.com/abhinav) for [the prompt](https://twitter.com/abhinav/status/1664359012467441664?s=20) :)
|
||||
|
||||
<br><br>
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
```{=html}
|
||||
<table class="quarto-listing-table table">
|
||||
<thead>
|
||||
<td class="listing-type" style="max-width: 42px !important; text-align: center;">Type</td>
|
||||
<td class="listing-type" style="max-width: 42px !important; text-align: center;">Link</td>
|
||||
<td>Resource</td>
|
||||
</thead>
|
||||
<tbody class="list">
|
||||
<% for (const item of items) { %>
|
||||
<tr data-index="0" data-categories="null" <%= metadataAttrs(item) %>>
|
||||
<td class="listing-type" style="max-width: 42px !important; text-align: center;">
|
||||
<strong><% if (item.type == "youtube") { %> <span class="bi bi-youtube"></span> <% } %>
|
||||
<strong><% if (item.type == "book") { %> <span class="bi bi-book"></span> <% } %>
|
||||
<strong><% if (item.type == "course") { %> <span class="bi bi-journal-bookmark"></span> <% } %>
|
||||
<strong><% if (item.type == "MOC") { %> <span class="bi bi-map"></span> <% } %>
|
||||
<strong><% if (item.type == "other") { %> <span class="bi bi-stars"></span> <% } %>
|
||||
<strong><% if (item.type == "essay") { %> <span class="bi bi-card-text"></span> <% } %>
|
||||
<strong><% if (item.type == "software") { %> <span class="bi bi-code-square"></span> <% } %>
|
||||
</td>
|
||||
<td class="listing-link" style="max-width: 42px !important; text-align: center;">
|
||||
<% if (item.link) { %>
|
||||
<a href="<%= item.link %>"><span class="bi bi-link-45deg"></span></a>
|
||||
<% } %>
|
||||
</td>
|
||||
<td class="listing-title" style="max-width: 420px !important;">
|
||||
<strong><% if (item.slno) { %><%= item.slno %>.<% } %> <%= item.title %></strong><br>
|
||||
<p><%= item.summary %></p>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
```
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
- slno: 01
|
||||
title: "Cognitive Productivity: Using Knowledge to Become Profoundly Effective"
|
||||
summary: "Book by Luc P. Beaudoin. <br> Official book summary: You distinguish yourself from others not so much by what you've read, viewed or listened to, but by the lasting impact that information has had upon you. How can you use knowledge to become a more effective person? Cognitive Productivity answers this question with cognitive science and practical strategies."
|
||||
link: https://leanpub.com/cognitiveproductivity/
|
||||
type: book
|
||||
- slno: 02
|
||||
title: "Cognitive Productivity with macOS: 7 Principles for Getting Smarter with Knowledge"
|
||||
summary: "Book by Luc P. Beaudoin. <br> Official book summary: In today's competitive knowledge economy, you always need to keep learning —and fast. But most information and apps get in the way. This book describes 7 principles for selecting, processing and mastering knowledge using potent Mac apps."
|
||||
link: https://leanpub.com/cognitive-productivity-macos
|
||||
type: book
|
||||
- slno: 03
|
||||
title: "The Introduction to the Zettelkasten Method"
|
||||
summary: "Zettelkasten is a rather specific note-taking system (disclaimer: it is not something that I use, but I do find the principles vaguely intriguing). It relies heavily on tagging, linking, going with the flow, not overthinking, and somehow simultaneously keeps things systematic from a retrieval perspective. This overview page has a bunch of pointers that that should serve as a roadmap for the Zettelkasten for anyone inclined to find out more."
|
||||
link: https://zettelkasten.de/posts/overview/
|
||||
type: MOC
|
||||
- slno: 04
|
||||
title: "How can we develop transformative tools for thought?"
|
||||
summary: "Essay by Andy Matuschak and Michael Nielsen <br> Arguably not about taking notes per se, but about philosophies associated with systems and — as the title suggests — tools for thought."
|
||||
link: https://numinous.productions/ttft/
|
||||
type: essay
|
||||
- slno: 05
|
||||
title: "Evergreen Notes"
|
||||
summary: "Thoughts from Andy Matuschak <br>The OG 'digital garden', if I am not mistaken!"
|
||||
link: https://notes.andymatuschak.org/z4SDCZQeRo4xFEQ8H4qrSqd68ucpgE6LU155C
|
||||
type: essay
|
||||
- slno: 06
|
||||
title: "Obsidian for Everyone"
|
||||
summary: "Nicole van der Hoeven's course. <br> Nicole is a pro Obsidian user and a master expositor. This particular course is nice because it focuses on all the things you can achieve without the use of any plugins: just bare-bones Obsidian. You'd be surprised at how far you can go!"
|
||||
link: https://courses.nicolevanderhoeven.com/o4e
|
||||
type: course
|
||||
- slno: 07
|
||||
title: "Youtube channel: Nicole van der Hoeven"
|
||||
summary: "Excellent content for pro and starter Obsidian users alike. Very accessible and engaging, and I believe most people will find something relevant and relatable here."
|
||||
link: https://www.youtube.com/@nicolevdh/playlists
|
||||
type: youtube
|
||||
- slno: 08
|
||||
title: "Grok TiddlyWiki"
|
||||
summary: "Grok TiddlyWiki is written and maintained by Soren Bjornstad. <br> Outstanding introduction to TiddlyWiki. Even non-TW users are likely to get some fun ideas from skimming this. And if you are a TW user, then this is one of the best journeys from starter to pro! Also check out Soren's own digital garden."
|
||||
link: https://groktiddlywiki.com/read/
|
||||
type: book
|
||||
- slno: 09
|
||||
title: "Youtube channel: Linking Your Thinking (LYT)"
|
||||
summary: "This is Nick Milo's Youtube channel. It is mostly principles around linking, but uses Obsidian as the tool of choice. Nick also organizes a LYT conference regularly that is hugely popular and not particularly restricted to Obsidian. He also has a cohort-based course around LYT principles, a great Obsidian starter playlist, and a course called Obsidian Flight School as well."
|
||||
link: https://www.youtube.com/@linkingyourthinking
|
||||
type: youtube
|
||||
- slno: 10
|
||||
title: "Youtube channel: August Bradley"
|
||||
summary: "This channel focuses on 'life design' as a broad concept, using Notion as the underlying tool of choice for organization. There is an extensive discussion of the 'PPV' system - Pillars, Pipelines, and Vaults. Lots of system thinking in here, and I think although all of it is done on Notion, several principles are tool-agnostic."
|
||||
link: https://www.youtube.com/@augustbradley
|
||||
type: youtube
|
||||
- slno: 11
|
||||
title: "Building a Second Brain"
|
||||
summary: "This is a cohort-based course around the notion of building a second brain by Tiago Forte. The material is centered around the 'PARA' method - Projects, Areas, Resources, Archives: a fairly intuitive system that many have found useful. Tiago has one published and one upcoming [at the time of this writing] book on these methods. His blog and Youtube channel dive fairly deep into these concepts, and I think the cohorts are useful if you are building something out and are looking for ways to stay accountable on sticking a system, or want a community/platform to brainstorm ideas."
|
||||
link: https://www.buildingasecondbrain.com/course
|
||||
type: book
|
||||
- slno: 12
|
||||
title: "Youtube channel: Marie Poulin"
|
||||
summary: "Marie is an authority when it comes to adapting Notion in creative ways for both personal and business use. She has a very comprehensive course called Notion Mastery that covers a lot of ground in terms of both techniques and principles."
|
||||
link: https://www.youtube.com/c/mariepoulin
|
||||
type: youtube
|
||||
- slno: 13
|
||||
title: "Youtube channel: Zsolt's Visual Personal Knowledge Management"
|
||||
summary: "This is the Zsolt's channel, who is behind tools like Excalibrain and Excalidraw for Obsidian and beyond. The channel emphasizes visual aspects of note-taking, while some of it is focused on Excalidraw/Excalibrain, a lot of content is also about general principles, examples, and so on."
|
||||
link: https://www.youtube.com/@VisualPKM
|
||||
type: youtube
|
||||
- slno: 14
|
||||
title: "Youtube channel: Thomas Frank"
|
||||
summary: "This channel is another one that pushes Notion to its limits. While overall this might be more productivity/systems/management territory than note-taking, I have found some great discussions about organizational principles here."
|
||||
link: https://www.youtube.com/@Thomasfrank
|
||||
type: youtube
|
||||
- slno: 15
|
||||
title: "Johnny Decimal"
|
||||
summary: "This is purely about organization, but for me how notes are stored are an important piece of the puzzle. If you like folders, you might enjoy this system."
|
||||
link: https://johnnydecimal.com/
|
||||
type: other
|
||||
- slno: 16
|
||||
title: "A list of PKM tools"
|
||||
summary: "A reddit post collecting a bunch of PKM software options, ranging from mainstream to exotic and everything in between!"
|
||||
link: https://www.reddit.com/r/PKMS/comments/nfef59/list_of_personal_knowledge_management_systems/
|
||||
type: MOC
|
||||
- slno: 17
|
||||
title: "To Obsidian and Beyond"
|
||||
summary: "A course by Mike Schmitz. From the official description: A master-course for Obsidian users (new and old alike). Finally organize your notes and ideas to make creative output easy."
|
||||
link: https://thesweetsetup.com/obsidian/
|
||||
type: course
|
||||
- slno: 18
|
||||
title: "Youtube channel: Red Gregory"
|
||||
summary: "A Notion-based channel: I have found some of the workflows here to be advanced and intriguing in equal measure. Many principles are tool-agnostic, although the focus here is mostly on Notion."
|
||||
link: https://www.youtube.com/c/RedGregory
|
||||
type: youtube
|
||||
- slno: 19
|
||||
title: "Youtube channel: Danny Hatcher"
|
||||
summary: "A channel focused on PKM and organizational systems broadly. I have mostly viewed the Obsidian-related material here: several demonstrations and tutorials have been very helpful."
|
||||
link: https://www.youtube.com/@DannyHatcher
|
||||
type: youtube
|
||||
- slno: 20
|
||||
title: "Verbal to Visual"
|
||||
summary: "Lots of resources on sketchnoting and visual approaches to note-taking."
|
||||
link: https://verbaltovisual.com/
|
||||
type: course
|
||||
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 309 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 289 KiB |
|
After Width: | Height: | Size: 396 KiB |
|
After Width: | Height: | Size: 240 KiB |
|
After Width: | Height: | Size: 632 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 230 KiB |
|
|
@ -0,0 +1,203 @@
|
|||
---
|
||||
title: "Notion-powered websites"
|
||||
description: "Given that I have been spending most of my time in Notion of late, it made sense to wonder if I could use Notion, directly or otherwise, for whenever I have a need to put someth..."
|
||||
pubDate: "2021-09-11"
|
||||
authorName: "Neeldhara"
|
||||
sourceCategories: ["notion", "workflows", "websites"]
|
||||
sourcePath: "notion-powered-websites/index.qmd"
|
||||
---
|
||||
|
||||
Given that I have been spending most of my time in [Notion](https://www.notion.so) of late, it made sense to wonder if I could use Notion, directly or otherwise, for whenever I have a need to put something up on a public website — e.g, course pages, event websites, and the like. It should go without saying that there are now a gazillion ways of putting a website together — ranging from Wordpress to modern frameworks that have made good old static sites cool again (I'm looking at you, [SSGs](https://jamstack.org/generators/) on the [JAMstack](https://jamstack.org)), and a whole bunch of things in between. All of this is *way* out of scope of this discussion, which is really limited to exploring the most reasonable ways of turning your Notion content into a website and is largely in the spirit of a [no-code setup](https://en.wikipedia.org/wiki/No-code_development_platform).
|
||||
|
||||
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">It’s almost like there’s something missing between static HTML and full JavaScript software.</p>— Wes Souza 🏳️🌈⬣ (@__WesSouza) <a href="https://twitter.com/__WesSouza/status/1433096081945018381?ref_src=twsrc%5Etfw">September 1, 2021</a></blockquote>
|
||||
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Yeah, it feels like we are now at a point where it’s easier to make complex websites but somehow oddly harder to make the simple ones!</p>— Neeldhara (@neeldhara) <a href="https://twitter.com/neeldhara/status/1433098222189248516?ref_src=twsrc%5Etfw">September 1, 2021</a></blockquote>
|
||||
|
||||
<aside>
|
||||
💡 Most options here ultimately amount to SSGs in the background, but with varying levels of exposure to what's happening at the low-level.
|
||||
</aside>
|
||||
|
||||
There are a few different options out there if you are interested in this as well, and here's a handwritten TLDR-summary[^1] if you find the rest of this little discussion too long:
|
||||
|
||||
[^1]: TIL that this style of summarization is also called a [Pugh chart](https://en.wikipedia.org/wiki/Decision-matrix_method), thanks to [Justin Lai.](https://www.youtube.com/channel/UC1S5O9BP9_46GS5t1t2Uksg/about)
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
Now for the more detailed run-down:
|
||||
|
||||
### Just Use Notion
|
||||
|
||||
The official [Notion documentation](https://www.notion.so/guides/build-a-website-with-notion-in-seconds-no-coding-required) shows us how to build nice websites with Notion:
|
||||
|
||||

|
||||
|
||||
This is a great option for putting together something quick and temporary or for testing something out. It can be free (if you are on the Notion free plan) and/or will cost you nothing *on top of* what you might be paying for already if you are paying Notion user.
|
||||
|
||||
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">"What's the link to your site?"<br><br>"Oh it's acmedesign dot notion dot site slash dd5a6abe47444a53b7170afd67942d77"<br><br>🙅🏾♂️🙅🏼🙅🏻♀️<br><br>Now for folks with paid plans, you can set a public home page like <a href="https://t.co/tf1bBQcNJy">https://t.co/tf1bBQcNJy</a>! <a href="https://t.co/LFWYQtgloq">pic.twitter.com/LFWYQtgloq</a></p>— Notion (@NotionHQ) <a href="https://twitter.com/NotionHQ/status/1440402077201494028?ref_src=twsrc%5Etfw">September 21, 2021</a></blockquote>
|
||||
|
||||
<aside>
|
||||
💡 If you have a more serious use-case, however, and are concerned about things like performance, SEO, custom domains, and such, and want to exercise more control over the look and feel of your site, you probably want to move beyond what you can get with xyz.notion.site. Still, a great option — involving no extra costs and right out of the box — and I’d imagine this covers a number of use-cases! 👍
|
||||
|
||||
</aside>
|
||||
|
||||
### Fruition and Cloudflare Workers
|
||||
|
||||
A popular way to get your domain to point to your Notion setup and customize the look and feel of the final setup just a little bit is via Fruition:
|
||||
|
||||

|
||||
|
||||
As mentioned on the website already, one downside is the setup time — but I don't think this is a very serious drawback at all, it's a one-time exercise and not very difficult at all given the very clear instructions given on the website. However, I think there is a more significant concern with this option, which was highlighted by @[bensomething](https://twitter.com/bensomething) in this Tweet thread:
|
||||
|
||||
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Perhaps a good example of why you should avoid custom domain solutions for Notion that use those damn Cloudflare worker scripts. But hey, super excited for my new startup (fartup?) to be featured on the Founded by Monzonauts website! <a href="https://twitter.com/monzo?ref_src=twsrc%5Etfw">@monzo</a> <a href="https://twitter.com/hugocornejo?ref_src=twsrc%5Etfw">@hugocornejo</a> <a href="https://t.co/0FH916uvd2">https://t.co/0FH916uvd2</a></p>— Ben Smith (@bensomething) <a href="https://twitter.com/bensomething/status/1354040148074377218?ref_src=twsrc%5Etfw">January 26, 2021</a></blockquote>
|
||||
|
||||
|
||||
You could have a (potentially *your*) Fruition site intercepted with random content, [as is the case here](https://fruitionsite.com/d291bca5556e4696b96911fb1f39efde). As Ben points out, it's much safer to convert your Notion content into a static site:
|
||||
|
||||
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Anything that converts your Notion pages to static versions is fine! It definitely seems like Super's leading the pack, but I'd say a substantial number of people are still using something like Fruition.</p>— Ben Smith (@bensomething) <a href="https://twitter.com/bensomething/status/1354145612929921025?ref_src=twsrc%5Etfw">January 26, 2021</a></blockquote>
|
||||
|
||||
<aside>
|
||||
💡 To summarize what we have with Fruition: it's probably *okay* for a small test setup, and it's a cool experiment — largely free (you might hit up Cloudflare's limits eventually and be prompted to upgrade) and not much work to setup — but I'd be wary of using it in production for any non-trivial project.
|
||||
</aside>
|
||||
|
||||
...and so we're going to explore a few ways of doing that now.
|
||||
|
||||
|
||||
### nextjs-notion-starter-kit and react-notion-x
|
||||
|
||||
The `nextjs-notion-starterkit` is a NextJS template built by @[transitive_bs](https://twitter.com/transitive_bs), which is [in active use here](https://transitivebullsh.it):
|
||||
|
||||

|
||||
|
||||
You can check out [the repository here](https://github.com/transitive-bullshit/nextjs-notion-starter-kit). If you are feeling even braver, you might even want to explore what powers this under the hood, which is the `react-notion-x` repository [here](https://github.com/NotionX/react-notion-x):
|
||||
|
||||

|
||||
|
||||
<aside>
|
||||
💡 Using `nextjs-notion-starterkit` is definitely a whole lot safer than Fruition, but it's also clearly a whole lot more intensive in terms of setup! This option is great in terms of being free and highly customizable, but is best-suited to those who are already familiar with Next.js and who generally know what they are doing. So if the readme pages on those repositories did not make much sense, it's probably best to either get some help on the initial setup or move on to more user-friendly, truly *no-code* options. That's what we have up next!
|
||||
</aside>
|
||||
|
||||
`react-notion-x` — from a safe distance as far as I am concerned — appears to be very well-documented and actively maintained. The documentation speaks of hosting on [Vercel](https://vercel.com), and my guess is that hosting on [Netlify](https://www.netlify.com) should also be possible. Both of these options have generous free tiers, so this could potentially be a no-cost option, although it's far from being a true no-code option, at least for the initial setup!
|
||||
|
||||
Interestingly, `react-notion-x` appears to be supported by [Super](https://super.so), and from a quick glance at the source code, it seems like both Super and [Potion](https://www.potion.so) (which are the last two options that we'll be getting to) generate static sites using the Next.js framework... chances are that what is in these repositories is suggestive of at least a part of what's going on behind-the-scenes with Super and Potion.
|
||||
|
||||
My understanding from exchanges with support at both Super and Potion is that there are differences in the implementation details — there are definitely visible differences that indicate this too, and apparently Super is more closely-knit into the Notion API, but I am not sure what to make of that just yet... it possibly makes their implementation a little less vulnerable to being broken by updates at Notion's end, but I don't know enough to say this for sure.
|
||||
|
||||
|
||||
### Super
|
||||
|
||||
[Super](https://super.so) (on [ProductHunt](https://www.producthunt.com/blog/super-2-0)), built by @[Traf](https://twitter.com/traf) and @[TrillCyborg](https://twitter.com/TrillCyborg) (Jason Werner) appears to be one of the leading options in terms of a no-code way of porting a Notion page to a website. This will set you back $12/site/month; but you get a substantial feature set in return:
|
||||
|
||||

|
||||
|
||||
I should point out that some Super templates are premium and will cost separately, but there are some really nice free ones that you can run with right away. [One that I really liked](https://hq.super.site) happens to be free and is in use on the [website I have for my courses](https://neeldhara.courses). I had a completely painless setup experience and very responsive support on the minor things that I did get stuck on (h/t: @[camincoll](https://twitter.com/camincoll)).
|
||||
|
||||
Sites made with Super are performant, SEO-friendly, and fairly customizable. There are only two minor snags I ran into with Super: one is that updates on Notion take some time to reflect on the website (typically a minute or so — this is no big deal in general, but it's just not real-time, and can feel slow while in testing and development). The other is that their terms of service seem a bit unusually restrictive — for instance, see the discussion initiated by @[kulikalov](https://twitter.com/kulikalov) here:
|
||||
|
||||
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">That's a shaky foundation to work with <a href="https://twitter.com/super_?ref_src=twsrc%5Etfw">@super_</a> 😐 <a href="https://t.co/yYQYuGZk3u">pic.twitter.com/yYQYuGZk3u</a></p>— Anton Kulikalov 🇺🇦 (@kulikalov) <a href="https://twitter.com/kulikalov/status/1431144115320860672?ref_src=twsrc%5Etfw">August 27, 2021</a></blockquote>
|
||||
|
||||
<aside>
|
||||
💡 At $12/site/month Super is the most expensive option on this list, but if the combination of performance and convenience is what you are looking for, you might find that it is totally worth it.
|
||||
</aside>
|
||||
|
||||
From Super's responses in this conversation, I am optimistic that the ToS will change for the better. From my direct experience, my instinct is that there isn't really anything to worry about here, but if you are someone who cares about the fine print, this is an aspect you might want to be aware of.
|
||||
|
||||
|
||||
### Potion
|
||||
|
||||
Finally, we have [Potion](https://www.potion.so) (on [ProductHunt](https://www.producthunt.com/blog/potion-2)), made by @[noahwbragg](https://twitter.com/noahwbragg) (Noah Bragg), which is yet another way of getting a static site out of your Notion content in a fairly straightforward way:
|
||||
|
||||

|
||||
|
||||
<aside>
|
||||
💡 While oversimplified, it is tempting to summarize Potion's offering as "Super, but cheaper". See the next section for a more detailed discussion of differences and similarities between the two. Overall, Potion has a very similar feature set and is slightly more affordable in comparison — definitely worth checking out the same way that Super is.
|
||||
</aside>
|
||||
|
||||
The pricing is a bit different from Super — it can cost you as little as $6.25/site/month on their 8-sites plan, which will set you back $50/month, and the other two possibilities are $10/month for one site or $25/month for three.
|
||||
|
||||
In terms of what it does, it feels rather similar to Super, but as I mentioned earlier, I think there are differences in the actual implementation. In particular, one difference that is conspicuous is the way Potion renders changes — much like what happens with Notion's own public pages, the rendering of changes with Potion happens practically in real-time. This is very helpful, especially when you are working on quick edits, or are testing things out.
|
||||
|
||||
Many other features are at par with Super: the sites created by Potion appear to be equally performant and SEO-friendly; and sites on Potion are customizable in almost the same ways.
|
||||
|
||||
This page (and the whole blog) is rendered with Potion. Like Super, setup was largely frictionless and I had prompt help whenever I needed it. Potion also has a bunch of templates that work out of the box — a couple of which are premium — but the vast majority of them are available for free and already there are some fairly nice options.
|
||||
|
||||
|
||||
### Potion v/s Super
|
||||
|
||||
Given the similarities between Potion and Super, I felt it was worth having a separate discussion comparing the two, and I felt like I could do a brief take on this given that I've spent a fair amount of time trying out both and being conflicted about which one to go with! As you can probably tell if you read this far, I could not positively conclude one way or the other, so my setups are split between the two at the moment, and it'll probably stay this way for a while now 😀
|
||||
|
||||
Back to the comparison — there are a few differences on the minor features, here are a couple of examples off the top of my head:
|
||||
|
||||
1. Super allows password protection on individual pages, on Potion it's all-or-none (at least at the time of this writing).
|
||||
|
||||
2. Potion automatically generates preview images based on titles — this is what shows up when you share a link on, say, Twitter or Discord or WhatsApp. It does this automatically for *all* pages, even ones within databases.
|
||||
|
||||
3. I could not get jquery to work in Potion (from trying very briefly), but it worked out fine on Super.
|
||||
|
||||
4. Super has a community forum and an arguably restrictive ToS. Potion has neither at the time of this writing.
|
||||
|
||||
5. Potion's dashboard has a live preview editor which lets you make simple changes to the CSS and preview them real-time — this may not be something you use often if you have made sophisticated customizations, but for quick edits to the default templates, it's very handy:
|
||||
|
||||
|
||||

|
||||
|
||||
Super has a great dashboard too, there's a page-by-page breakup on the sidebar and a live preview of the site to the right, which shows up even when the individual pages are password-protected (by design):
|
||||
|
||||

|
||||
|
||||
6. In terms of custom code, a small difference is that Super allows you to insert your own content inside *both* the `<head>` and `<body>` tags while Potion is restricted to just the `<head>` tag. That said, additional possibilities for custom code injection are on Potion's roadmap.
|
||||
|
||||
7. There are differences of implementation under the hood, but I am not aware of the exact details here. Super uses the Notion API and a Content Delivery Network (CDN) - this explains why changes take 1-2 mins to flow through from Notion in Super automatically, but what it does get you is reliable performance at scale. Potion uses Vercel for hosting and generates static sites that feel fast and robust, and also uses a CDN.
|
||||
|
||||
Here are some of the things that I think work out rather similarly on both platforms:
|
||||
|
||||
1. Accessible and very friendly support 🤩
|
||||
|
||||
2. Convenient to setup and use.
|
||||
|
||||
3. SEO, pretty URLs, custom domains, pretty-URLs, and mostly performant websites.
|
||||
|
||||
4. Customized output thanks to the ability to insert your own scripts and CSS.
|
||||
|
||||
5. Promising roadmaps on both with exciting features on the way 🎉
|
||||
|
||||
6. Both options seem generally reliable - I have been monitoring my websites using [Fathom](https://usefathom.com) and I've had a few downtimes reported here and there from both platforms. There was nothing that lasted more than a few minutes at a time. Because both Super and Potion use a CDN, it turns out that even if these services go down, hopefully the sites will still be served as usual.
|
||||
|
||||
7. You will find that both have great feedback on ProductHunt (and possibly other platforms too, but PH is the one I'm familiar with).
|
||||
|
||||
|
||||
### Should you use Notion for your website at all?
|
||||
|
||||
Well. In general, if future-proofness is crazy important to you, and you want complete control over how your website renders down to the last pixel — then you might want to consider looking beyond Notion.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
>
|
||||
> Indeed, these are early days, in some sense *even* for Notion, and much more so for all the options listed here. A few ways of turning Notion content into websites have come-and-gone, and that, I think, is in the nature of this kind of a setup.
|
||||
>
|
||||
> At the moment, all options here other than the native Notion setup will have some obligation to keeping up with changes from the Notion side. I think most options are doing great on this front — as a recent example that comes to mind, globally synced blocks were supported shortly on all platforms after release (you do have to make sure that the pages on which such blocks originate have public access permissions).
|
||||
>
|
||||
> I am definitely keeping my fingers crossed for the long-term viability of these options 🤞 Until then, I'm looking forward to enjoying the convenience of being able to work on my website(s) without getting out of Notion at all, at least hopefully not very much 😎
|
||||
>
|
||||
> Incidentally, Notion's markdown export is pretty good too, so you could just keep markdown versions of your work as you go along, so in case you decide to port things over into a more direct SSG setup in the future, it would be relatively painless to do.
|
||||
|
||||
|
||||
Assuming you are all-in on using Notion for delivering your website, then here's a summary of your options:
|
||||
|
||||
1. If you are looking for a free setup:
|
||||
|
||||
1. If need to use custom domains, and need sites that look and behave like regular websites, then you might want to check out `react-notion-x` or `nextjs-notion-starterkit` if you are an expert, but otherwise, the Notion route may not be the best for you.
|
||||
|
||||
2. If you are already a Notion user and you just need a URL with content that can go around for a super-specific purpose (i.e, website-y features not so crucial) — you can likely just use Notion's default facility with a public URL.
|
||||
|
||||
2. If you have a budget that is compatible with Super and/or Potion, I would definitely recommend either of them - they are both great solutions in this context! There are some nuances in terms of how they are different (e.g, pricing; Super's apparently deeper integration with the Notion API v/s Potion's real-time implementation, etc.), and if that level of detail is important to you, you might need to try out both — which is fortunately easy to do — before deciding.
|
||||
|
||||
### Other ways of getting a website out of Notion?
|
||||
|
||||
There are a few options that I didn't cover here, including, for example, [Notion2Blog](https://mynotion.blog), [Notion Dog](https://github.com/notiondog/notion.dog), [Notelet](https://notelet.so), [~~Nocodepages~~](https://nocodepages.com) (now defunct), and a couple of others that I did evaluate — at least briefly — but I unfortunately can't remember any more. If you know of other examples, please let me know and I'll be happy to append them to this list here!
|
||||
|
||||
---
|
||||
|
||||
<aside>
|
||||
💡 Please share your comments on Twitter @[neeldhara](https://twitter.com/neeldhara). Also, special thanks to @[camincoll](https://twitter.com/camincoll) and @[noahwbragg](https://twitter.com/noahwbragg) for their inputs and help with Super and Potion, respectively! 👋🏽
|
||||
</aside>
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
---
|
||||
title: "Obsidian: A Year Later"
|
||||
description: "Reflections on using Obsidian for research notes, teaching materials, and personal knowledge management."
|
||||
pubDate: "Jan 15 2024"
|
||||
image: "https://images.unsplash.com/photo-1484480974693-6ca0a78fb36b?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Obsidian: A Year Later
|
||||
|
||||
After a year of daily use, Obsidian has transformed how I think about knowledge management.
|
||||
|
||||
## What Works Brilliantly
|
||||
|
||||
### The Graph View
|
||||
Seeing connections between ideas visually has led to unexpected research insights. The graph isn't just pretty - it's functional.
|
||||
|
||||
### Plugin Ecosystem
|
||||
The community plugins are incredible. Dataview turns your notes into a database. Templater automates repetitive tasks.
|
||||
|
||||
### Local Storage
|
||||
Your notes are just markdown files. No vendor lock-in, complete control, and peace of mind.
|
||||
|
||||
## Pain Points
|
||||
|
||||
### Mobile Experience
|
||||
While functional, the mobile app lacks the fluidity of the desktop version. Syncing can occasionally hiccup.
|
||||
|
||||
### Learning Curve
|
||||
The flexibility means complexity. New users might feel overwhelmed by options.
|
||||
|
||||
## The Verdict
|
||||
|
||||
For academics and researchers, Obsidian is transformative. The investment in learning pays dividends in productivity and insight.
|
||||
69
sites/reviews/src/content/reviews/pandoc-letters/index.md
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
---
|
||||
title: "Letters with Pandoc"
|
||||
description: "Letter-writing season is around the corner. I recently adapted this pandoc workflow for generating PDF letters by only editing a markdown file. I only made the following minor c..."
|
||||
pubDate: "2022-11-27"
|
||||
authorName: "Neeldhara"
|
||||
sourceCategories: ["pandoc", "workflows", "latex"]
|
||||
sourcePath: "pandoc-letters/index.qmd"
|
||||
---
|
||||
|
||||
Letter-writing season is around the corner. I recently adapted [this pandoc workflow](https://github.com/yangjiandong/myPandoc/tree/faf94dc26487005b03baa7a2d807b20b2a7f233f/demo/letter) for generating PDF letters by only editing a markdown file. I only made the following minor changes to the original:
|
||||
|
||||
<aside>
|
||||
For this to work you will need [pandoc](https://pandoc.org) and a TeX distribution installed. For a full-fledged TeX distribution check out something like [MacTeX](https://www.tug.org/mactex/) and for a minimal variation, see [TinyTeX](https://yihui.org/tinytex/).
|
||||
</aside>
|
||||
|
||||
1. Included the `fontawesome5` package so I could add icons alongside the phone number, email, and website in the letterhead.
|
||||
|
||||
2. Changed `ThisULCornerWallPaper` to `CenterWallPaper` and added `wpYoffset` and `wpXoffset` so I could get a left margin on the logo (I suppose this _could_ also be done by offsetting the logo in the `letterhead.pdf` file).
|
||||
|
||||
Here's what the output looks like with some random sample content:
|
||||
|
||||

|
||||
|
||||
The markdown is very simple to edit --- most of the information is up in the YAML header, and it looks like this:
|
||||
|
||||
```yaml
|
||||
author: Fyodor Michailovitch Dostoevsky
|
||||
city: Moscow
|
||||
from:
|
||||
- By the Vladimirkirche
|
||||
- care of Pryanischnikof, Grafengasse.
|
||||
affiliation1: Add an affiliation
|
||||
affiliation2: Potential Additional Information
|
||||
contact:
|
||||
- \faPhone \ +91 79 1234 1729
|
||||
- \faGlobe \ https://www.google.com
|
||||
- \faEnvelope \ nobody@nowhere.com
|
||||
to:
|
||||
- Michael
|
||||
- Someplace
|
||||
- with an address
|
||||
subject: An Update
|
||||
salutation: My dearest
|
||||
toname: brother
|
||||
customdate: 1838-8-9
|
||||
```
|
||||
|
||||
Write the body of the letter in markdown as usual, and generate the PDF by running:
|
||||
|
||||
```
|
||||
pandoc letter.md -o output.pdf --template=template.tex --pdf-engine=xelatex
|
||||
```
|
||||
|
||||
or have a makefile that looks like this:
|
||||
|
||||
```
|
||||
TEX = pandoc
|
||||
FLAGS = --pdf-engine=xelatex
|
||||
|
||||
src1 = template.tex letter.txt
|
||||
op1 = output
|
||||
|
||||
all : $(op1).pdf
|
||||
|
||||
$(op1).pdf : $(src1)
|
||||
$(TEX) $(filter-out $<,$^ ) -o $@ --template=$< $(FLAGS)
|
||||
```
|
||||
|
||||
For your first use, you would want to update the images for the letterhead and the signature, and optionally customize the fonts to your liking. [Fork this repo](https://github.com/neeldhara/pandoc-letters) to make your own!
|
||||
BIN
sites/reviews/src/content/reviews/pandoc-letters/output.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
|
|
@ -0,0 +1,90 @@
|
|||
---
|
||||
title: "Women in Mathematics"
|
||||
description: "Here’s a list of books — in no particular order — about women in mathematics (broadly interpreted) largely taken from this thread. The links are mostly to versions of the books..."
|
||||
pubDate: "2022-02-21"
|
||||
authorName: "Neeldhara"
|
||||
sourceCategories: ["books", "lists"]
|
||||
sourcePath: "women-in-mathematics/index.qmd"
|
||||
---
|
||||
|
||||
Here’s a list of books — in no particular order — about women in mathematics (broadly interpreted) largely taken from [this thread](https://twitter.com/stevenstrogatz/status/1495030448904458243). The links are mostly to versions of the books on Amazon India. Unfortunately many of them are rather expensive, but hopefully it’s a handy list to share with a librarian you know! Do leave a comment below if you have any additions.
|
||||
|
||||
I’ll also leave this [relatively sobering thought](https://twitter.com/virtualcourtney/status/1495076053257175040) (or [this one](https://twitter.com/MarissaKawehi/status/1495083281766879243?s=20&t=9CWcnFgcqBQZD4p01UFXsg)) here with no further comment.
|
||||
|
||||
---
|
||||
|
||||
Books:
|
||||
|
||||
1. [Complexities – Women in Mathematics](https://www.amazon.in/Complexities-Mathematics-Bettye-Anne-Case/dp/0691114625/)
|
||||
|
||||
2. [Women in Mathematics – The Addition of Difference](https://www.amazon.in/Women-Mathematics-Addition-Difference-Science/dp/0253211190/ref=sr_1_1?crid=XLR5PKP93HN1&keywords=Women+in+Mathematics%3A+The+Addition+of+Difference&qid=1645384438&sprefix=women+in+mathematics+the+addition+of+difference%2Caps%2C277&sr=8-1)
|
||||
|
||||
3. [How to Free Your Inner Mathematician: Notes on Mathematics and Life](https://www.amazon.in/How-Free-Your-Inner-Mathematician/dp/0198843593/)
|
||||
|
||||
4. [Ada's Algorithm: How Lord Byron's Daughter Launched the Digital Age Through the Poetry of Numbers](https://www.amazon.in/Adas-Algorithm-Daughter-Launched-Digital/dp/1783340711/)
|
||||
|
||||
5. [Women Who Count: Honoring African American Women Mathematicians](https://www.amazon.in/Women-Who-Count-Honoring-Mathematicians/dp/1470448890/)
|
||||
|
||||
6. [Women Becoming Mathematicians – Creating a Professional Identity in Post–World War II America](https://www.amazon.in/Women-Becoming-Mathematicians-Professional-Post-World/dp/0262632462/)
|
||||
|
||||
7. [Power in Numbers: The Rebel Women of Mathematics](https://www.amazon.in/Power-Numbers-Rebel-Women-Mathematics/dp/1631064851/)
|
||||
|
||||
8. [My Remarkable Journey: A Memoir](https://www.amazon.in/My-Remarkable-Journey-Katherine-Johnson/dp/0062897667/) (Katherine Johnson)
|
||||
|
||||
9. [Proving It Her Way: Emmy Noether, a Life in Mathematics](https://www.amazon.in/Proving-Her-Way-Noether-Mathematics/dp/3030628108/)
|
||||
|
||||
10. [Emmy Noether’s Wonderful Theorem](https://www.amazon.in/Emmy-Noether%60s-Wonderful-Theorem-2e/dp/1421422670/)
|
||||
|
||||
11. [Love and Mathematics: Sofya Kovalevskaya](https://www.amazon.in/Love-Mathematics-Kovalevskaya-P-Kochina/dp/0828533733/) ([alternate link](https://archive.org/details/kochinaloveandmathematicssofyakovalevskaya1985/mode/2up))
|
||||
|
||||
12. [Einstein's Wife: The Real Story of Mileva Einstein-Maric](https://www.amazon.in/Einsteins-Wife-Story-Mileva-Einstein-Maric/dp/1665124997)
|
||||
|
||||
13. [Inventing the Mathematician: Gender, Race, and Our Cultural Understanding of Mathematics](https://www.amazon.in/Inventing-Mathematician-Cultural-Understanding-Mathematics-ebook/dp/B01CPUKOR6/)
|
||||
|
||||
14. [In Code: A Mathematical Journey](https://www.amazon.in/Code-Mathematical-Journey-David-Flannery/dp/1861972717)
|
||||
|
||||
15. [Against All Odds: Women’s Ways to Mathematical Research Since 1800: 6 (Women in the History of Philosophy and Sciences)](https://www.amazon.in/Against-All-Odds-Mathematical-Philosophy/dp/303047612X)
|
||||
|
||||
16. [The Ascent of Mary Somerville in 19th Century Society](https://www.amazon.in/Somerville-Century-Society-Springer-Biographies-ebook/dp/B01N1M5D2H/)
|
||||
|
||||
17. [Julia: A Life in Mathematics](https://bookstore.ams.org/spec-18/) (ebook only)
|
||||
|
||||
18. [Women of Mathematics: A Bio-Bibliographic Sourcebook](https://www.amazon.in/Women-Mathematics-Bio-Bibliographic-Sourcebook-Bibliographic-ebook/dp/B000WBBEIE/)
|
||||
|
||||
19. [A Celebration of the EDGE Program's Impact on the Mathematics Community and Beyond](https://www.amazon.in/Celebration-Programs-Impact-Mathematics-Community/dp/3030194884/)
|
||||
|
||||
20. [Those Magnificent Women and their Flying Machines: ISRO'S Mission to Mars](https://www.amazon.in/Those-Magnificent-Women-Flying-Machines/dp/9388874587)
|
||||
|
||||
21. [Girls Coming to Tech!: A History of American Engineering Education for Women](https://www.amazon.in/Girls-Coming-Tech-Engineering-Education-ebook/dp/B08BTB9HQ2/)
|
||||
|
||||
22. [Fifty Years of Women in Mathematics](https://link.springer.com/book/9783030826574)
|
||||
|
||||
23. [x+y: A Mathematician's Manifesto for Rethinking Gender](https://www.amazon.in/Mathematicians-Manifesto-Rethinking-Gender/dp/178816041X/)
|
||||
|
||||
|
||||
Illustrated Books:
|
||||
|
||||
1. [Maryam’s Magic: The Story of Mathematician Maryam Mirzakhani](https://www.amazon.in/Maryams-Magic-Mathematician-Maryam-Mirzakhani/dp/0062915967/)
|
||||
|
||||
2. [Nothing Stopped Sophie: The Story of Unshakable Mathematician Sophie Germain](https://www.amazon.in/Nothing-Stopped-Sophie-Cheryl-Bardoe/dp/0316278203/)
|
||||
|
||||
3. [Grace Hopper: Queen of Computer Code](https://www.amazon.in/Grace-Hopper-Queen-Computer-Changed/dp/1454920009/)
|
||||
|
||||
4. [Ada Byron Lovelace and the Thinking Machine](https://www.amazon.in/Ada-Byron-Lovelace-Thinking-Machine/dp/1939547202)
|
||||
|
||||
5. [The Thrilling Adventures of Lovelace and Babbage: The (Mostly) True Story of the First Computer](https://www.amazon.in/Thrilling-Adventures-Lovelace-Babbage-Computer/dp/0141981539/)
|
||||
|
||||
6. [The Girl With a Mind for Math: The Story of Raye Montague](https://www.amazon.in/Girl-Mind-Math-Montague-Scientists/dp/1943147426/)
|
||||
|
||||
7. [Hidden Figures: The True Story of Four Black Women and the Space Race](https://www.amazon.in/Hidden-Figures-Story-Black-Women/dp/0062742469/)
|
||||
|
||||
8. [Counting on Katherine: How Katherine Johnson Put Astronauts on the Moon](https://www.amazon.in/Counting-Katherine-Johnson-Astronauts-Moon/dp/1529005612/)
|
||||
|
||||
9. [Emmy Noether: The Most Important Mathematician You've Never Heard Of](https://www.amazon.in/Emmy-Noether-Important-Mathematician-Youve-ebook/dp/B08J87C17B)
|
||||
|
||||
|
||||
Miscellaneous:
|
||||
|
||||
1. [A Tribute to Professor Helena Rasiowa](http://comet.lehman.cuny.edu/fitting/bookspapers/pdf/papers/Rasiowa.pdf) (PDF)
|
||||
|
||||
2. [A Groundbreaking Mathematician on the Gender Politics of Her Field](https://www.newyorker.com/news/q-and-a/groundbreaking-mathematician-karen-uhlenbeck-on-the-politics-of-her-field/amp) (New Yorker)
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
---
|
||||
title: "Creating Art with Claude: A Collaborative Journey"
|
||||
description: "Exploring creative possibilities through conversations with AI - from generative art to interactive poetry."
|
||||
pubDate: "Jan 18 2024"
|
||||
image: "https://images.unsplash.com/photo-1558591710-4b4a1ae0f04d?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Creating Art with Claude: A Collaborative Journey
|
||||
|
||||
What happens when you treat AI as a creative collaborator rather than just a tool?
|
||||
|
||||
## The Experiment
|
||||
|
||||
I asked Claude to help design a generative art algorithm based on mathematical fractals. The conversation evolved into something unexpected.
|
||||
|
||||
## The Process
|
||||
|
||||
**Me**: "Let's create something beautiful with math."
|
||||
**Claude**: "How about we visualize the Collatz conjecture as a tree?"
|
||||
|
||||
What followed was a two-hour deep dive into number theory, aesthetics, and the nature of creativity itself.
|
||||
|
||||
## The Result
|
||||
|
||||
Not just code, but a philosophical exploration of pattern, meaning, and the intersection of human and artificial creativity.
|
||||
|
||||
## Reflection
|
||||
|
||||
AI doesn't replace human creativity - it amplifies it in unexpected directions. The key is approaching it as a dialogue, not a command.
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
---
|
||||
title: "Philosophical Dialogues with LLMs: On Consciousness and Computation"
|
||||
description: "Deep conversations with AI about the nature of consciousness, free will, and what it means to understand."
|
||||
pubDate: "Feb 28 2024"
|
||||
image: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&auto=format&fit=crop&q=60"
|
||||
authorImage: "/avatar/avatar1.png"
|
||||
authorName: "Neeldhara"
|
||||
---
|
||||
|
||||
# Philosophical Dialogues with LLMs: On Consciousness and Computation
|
||||
|
||||
Can a sufficiently complex computation be conscious? I asked an AI, and the conversation surprised me.
|
||||
|
||||
## The Question
|
||||
|
||||
"Do you experience anything when you process text, or is it just computation?"
|
||||
|
||||
## The Response That Made Me Think
|
||||
|
||||
The AI didn't claim consciousness, but asked: "What's the difference between your neurons firing and my weights activating? Both are physical processes. Where does experience emerge?"
|
||||
|
||||
## Going Deeper
|
||||
|
||||
We explored qualia, the Chinese Room argument, and integrated information theory. Not to find answers, but to refine questions.
|
||||
|
||||
## The Irony
|
||||
|
||||
Discussing consciousness with something that might not have it - or might not know if it has it - mirrors our own uncertainty about consciousness itself.
|
||||