My Link Log
A collection of links that are worth sharing
First published: 9/11/19
Last updated: 18/03/24
A while back, I created a
bookmark classification
utility. Bookmarks have always been an integral part of my web-surfing
experience and through this post, I intend to share some of my favorite
bookmarks. This list will be updated in the future. If you find any link
to be dead, try inserting https://web.archive.org/
ahead of
the URL.
-
Speech and Language Processing (3rd ed. draft): An excellent book dealing with computational linguistics written by
Dan Jurafsky and James Martin.
-
Things You Should Never Do, Part I: Joel Spolsky talks about how one should rewrite code in an
organization.
-
Minichess:
Contains a lot of minichess variants. Creating one is a great way to
learn to program.
-
Seat 61: A train enthusiast
sharing his various rail experiences from around the globe.
-
How to speak: In Prof. Patrick Winston's own words -
The talk helps people do a better job in lectures, theses defenses,
and job talks.
If you like the talk, I highly recommend you to check out his
6.034 - Introduction to AI
course along with his
home and
favorites
page.
-
Two-bit history: I love
reading about the history of computers, programming languages, and
software. This is an excellent blog to read about such stuff. The
author discusses topics like Version Control, Semantic Web, Relational
Model, RSS feeds, and much more.
-
List of Turing Lectures: My favorite is Ken Thompson's
Reflections on trusting trust, 83.
-
What overlooked class of tools should a self-taught programmer look
into: An intuitive HN discussion about CS tools one should explore.
-
You (probably) don’t need ReCAPTCHA: If you are running a small enterprise/project, you can refer to
this blog for alternatives to Google's ReCaptcha.
-
HTTP Security Headers - A Complete Guide: A handy reference!
-
On Chomsky and the Two Cultures of Statistical Learning: Written by Peter Norvig, this debate has fascinated me for the past
month. To see things from a different perspective, I highly recommend
reading
The Norvig - Chomsky debate
and
Norvig vs. Chomsky and the Fight for the Future of AI.
-
Talking about Peter Norvig, I thoroughly enjoyed reading the following
three essays of his:
Teach Yourself Programming in Ten Years,
How to Write a Spelling Corrector, and
Solving Every Sudoku Puzzle.
-
Bug in Mars Pathfinder mission's rover: An experience worth sharing in every Operating Systems class.
-
The Chinese Room Argument: A follow-up would be to refer to an
HN discussion
regarding what does it mean for a machine to "understand"?
-
List of Advanced Data Structures: A great resource from Stanford's CS166.
-
When not to use a regex: How powerful can simplicity be? As a beginner, this was an
eye-opener.
-
Two of George Orwell's finest works:
1984
(another link) and
Animal Farm, are in Public Domain in Australia and Canada respectively.
-
Surprisingly popular: A decision-making concept worth exploring.
-
Teach Yourself Computer Science: I particularly like the reference materials recommended in the
link.
-
What are some useful computer-related technical skills I can learn
within a day?: This link contradicts what
Peter Norvig said in his essay. Nevertheless, as a beginner, this Quora post helped me dig deeper
into many different concepts.
-
Case Studies from MIT Sloan: I really enjoyed
Sony's Battle for Video Game Supremacy.
-
History of Undecidability: A series of videos from
Computerphile
with Prof. Brailsford explaining various undecidable problems
throughout mankind's journey, ending with Turing's Undecidable
Problem.
-
Tetris: Tetris game
being analyzed in depth.
-
How Shazam works: The explanation here is in-depth. The article speculates working as
described in
Shazam's original paper.
-
Why explore space? : A beautifully worded letter written by Ernst Stuhlinger explaining
the importance of space exploration. His letter tries to justify why
space-research is critical to any country's growth.
-
The economics of Robinson Crusoe:
A great article dealing with financial independence.
-
Cambridge in Colour:
Fascinating photography-based resources.
-
Software Engineering SE,
Security SE, and
Mathematics SE: All of these StackExchange sites have top questions worth
exploring!
-
Lecture Notes - Computer Networks: While I strongly prefer the textbook
Computer Networks: A Top-Down Approach, the lecture notes compiled here are a handy reference. For a quick
introduction to Computer Networks, the essays:
How Does the Internet Work?
and
A broad intro to networking
is a good starting point.
-
The Website Obesity Crisis
and
Legends of the Ancient Web: Two talks given by Maciej Ceglowski. The former counters the trend
of increasing web-page sizes and bloatware. The latter describes the
history of radio and how it went on to be used as a propaganda tool,
drawing a parallel between the emergence of the Internet and radio.
Dan Luu's
Web bloat complements the
first talk.
-
Designing Windows 95’s User Interface: This article details the methodology behind designing Windows 95's
UI/UX and the birth of Windows' start button, taskbar, help window,
and printer wizard.
-
Modern SAT solvers: fast, neat and underused (part 3 of N)
and
SAT Solving -- The Basics: Two intuitive blog-posts detailing modern SAT solver's working
(DPLL, clause learning, and two watch literals).
-
You and Your Research: A thought-provoking talk given by Richard Hamming. It encourages
you to be an outlier.
-
Epigrams on Programming: Curated by Alan Perlis, an epigram is
a remark expressing an idea in a clever and amusing way. My
favorite is:
Fools ignore complexity. Pragmatists suffer it. Some can avoid it.
Geniuses remove it.
-
Why I Keep a Research Blog: This blog-post resonates with my motive for maintaining a blog.
Technical writing and teaching can help bring clarity to our thoughts
and ideas.
-
Some Useful Probability Facts for Systems Programming: As the author describes it -
a bunch of rough-and-ready probability rules of thumb that are
deeply related and have many practical applications when designing
systems.
-
A brief history of CSS until 2016: I read this while playing Mozart, loved it! It describes the making
of CSS, the impact it had on web-browsers, and the evolution of
web-fonts.
-
The Last Question: A short story by Isaac Asimov. Beautifully crafted, this short
story perfectly complements 2001: A Space Odyssey.
-
Page Weight Matters: Authored by Chris Zacharias, this blog-post explains how reducing
page weight opened a whole new door for Youtube. It complements the
views presented by Maciej Ceglowski and Dan Luu.
-
How much land does a man need?: Mahatma Gandhi once said -
We have sufficient for everybody's needs, not for greed. Gandhi
revered Leo Tolstoy and this short story from Tolstoy perfectly
captures the essence of the quote above. It is simple yet powerful.
-
George Orwell's Reviews and Profiles: A hidden jewel! George Orwell cogently expresses his thoughts on
many luminaries of our time like - Dickens, Gandhi, and Tolstoy.
-
I, Pencil: This
essay by Leonard Read describes the manufacturing process a pencil has
to undertake. The first person narrative is captivating.
-
One Man's View of Computer Science: Richard Hamming's 1968 Turing Lecture emphasizes the engineering
aspect of Computer Science, and discusses the importance of
mathematics and ethics in the field. Furthermore, his book -
The Art of Doing Science and Engineering
- contains fascinating chapters (3-5) on the history of computers. He
taught a
capstone course
regarding the same for graduate students at NPS, Monterey, California.
-
6.005: Software Construction: Taught in spring 2016, this MIT OCW course contains thorough
readings on Software Engineering topics such as testing, code review,
debugging, and specifications.
-
Applying to Ph.D. Programs in Computer Science: A well-detailed guide for undergraduates applying to various
graduate programs. In this paper, Prof. Mor Harchol-Balter expresses
how most professors review the applications and what factors can make
an application stand out. After drafting my Statement of Purpose, the
self-review process
mentioned by the Online Writing Lab at Purdue University was
particularly helpful.
-
How I Learned To Stop Worrying And Debug Other People's Code: While seeking answers for a fundamental question -
How to explore large open-source codebases? - I came across
this thought-provoking blog-post. This post was a major inspiration
for the MLH OSS Guide.
-
Mining of Massive Datasets:
Co-authored by Jure Leskovec, Anand Rajaraman, and Jeff Ullman
(Stanford). I regard this as the most concise textbook on Big Data
Analysis. Moreover, the authors taught an
online course
complementing the topics mentioned in this book.
-
Letter to the Patent Office From Professor Donald Knuth: A fascinating letter written by Donald Knuth to the Patent
Commissioner objecting to the policy of granting software patents.
-
How to Read a Paper: I have found the three-pass approach particularly helpful.
-
The Missing Semester of Your CS Education: Formal undergraduate education is usually devoid of many helpful
topics such as using version control, working with a command-line
environment, shell scripting, debugging, and profilers. This course by
MIT (student-run classes) makes a commendable effort to fill in these
voids.
-
The Math behind Neural Networks - Backpropagation: A step-by-step guide deriving backpropagation equations for a
3-layer feed-forward neural network architecture.
-
How 0-based indexing was born?: Contains explanation from Martin Richards (creator of BCPL) on the
use of 0-based indexing in BCPL, its transition to C, and describes
its necessity in an era of IBM computers.
-
Math For Programmers: This intriguing blog-post motivates a "surveying" based approach to
learning mathematics for programmers. Furthermore, one of the books
the author mentions about - Discrete Mathematics and Applications by
Kenneth Rosen - is one of the finest textbooks I have read during my
CS undergraduate.
-
Cormen’s Rules of Usage: Prof. Thomas Cormen (Co-author of CLRS) used to give a
graduate-level talk at Dartmouth on academic writing. This paper
provides a list of 39 such rules to improve the readability of an
academic text.
-
What's your favorite elegant/beautiful algorithm?: A Hacker News gem which inspires everyone to explore fascinating
topics such as BitTorrent, Anagram matching, magic squares, Stable
Marriage problem, watch literals (which I have mentioned above in an
eariler point) and many many more.
-
If ... then ... else had to be invented!: Takes readers on a fascinating adventure revolving around the
formation of "else if" statements, starting with Eniac, crossing
Whirlwind, Fortran, COBOL, and ending with Algol 60.
-
On holy wars and a plea for peace: In Gulliver's Travels, certain subjects of Lilliput rebelled
against the king and broke their eggs at the big end (Big-Endians).
While the others did so from the little end (Little-Endians). In this
paper, Danny Cohen takes inspiration from Jonathan Swift and
introduces
big and little endianness
to computer science.
-
How tail call optimization works: From this blog-post - "Tail call optimization happens when the
compiler transforms a
call
immediately followed by a
ret
into a single jmp
". This blog-post
details about tail call optimization using call, ret, and jmp
statements.
-
Why C language decided to start counting arrays from zero: Mike Hoye describes how Dr. Martin Richards (creator of BCPL) made
this decision and how it transcended down to its successor - C.
Furthermore, he describes a funny anecdote involving time sharing
systems, processor cycles, MIT, the President of IBM, and yatches.
-
The Untold Story of Silk Road, Part 1
(Part 2): A
breathtaking story involving Ross Ulbricht's silk road and the FBI. My
friend, Kishore, had the following fascinating comments - "The man
leading two lives, espousing purity of thought, complete freedom,
total anonymity, yet his platform demanded the deanonymization of
those who worked under him, and his grip gradually became more and
more totalitarian as he wished to enact sweet justice on those who
opposed him."
-
Deterministic Debugging with rr: Discusses record-and-replay debugging (also known as time-travel
debugging) using Mozilla's rr tool which records all of the
nondeterministic parts such as signals, file system interactions,
context switches, etc. Interestingly, Michael Chastain had
developed a similar tool (mec-replay) in 1995.
-
Gustav Kirchhoff's paper describing current and voltage laws: As mentioned in Donald Knuth's TAOCP (volume 1), Gustav Kirchhoff
was the first to use free trees to find a set of fundamental cycles in
an electrical network and this paper contains the earliest references
of trees. In 1972, W. W. Bartley III published a paper on
Lewis Carroll's lost book on logic, which contained the Method of Trees - the earliest use of
truth trees to prove or refute a logical formula.
-
Bradman and the value of a start: This Reddit post sheds more light into Don Bradman's batting style
by comparing his starts to some of the other legendary batsmen.
-
A Good Part-of-Speech Tagger in about 200 Lines of Python: In 2013, Matthew Honnibal challenged NLTK's then POS tagger by
constructing a leaner and more accurate tagger using an Averaged
Perceptron. Intriguingly, in 2015, NLTK changed their default
implementation to the one detailed in this blog-post.
-
Mikhail Chigorin v James Mortimer (Paris 1900): With an absolutely bonkers opening, this obscure chess game is one
of my favorites.
-
The secret rules of the Internet: Buni and Chemaly discusses how moderation policies have
historically been shaped and regulated by the Internet giants. For
further reading, Prof. Paul Barrett's
Who Moderates the Social Media Giants?
is a compelling read.
-
The Fortran 1 compiler: Driven by a need to produce efficient object code, some fascinating
optimization techniques it discusses are symbolic registers (for
intermediate form of code), operator precedence, dead-code
elimination, loop optimizations, and control-flow graph creation
followed by a Monte Carlo-based register allocation.
-
Seven insights into Queueing Theory: This essay explains how the response time (service time + wait
time) and utilization can be used to infer service center's load using
queueing theory principles.
-
How recursion got into programming: a tale of intrigue, betrayal,
and advanced programming-language semantics: It describes how recursion got into Algol 60 and the contributions
of Peter Naur, F.L. Bauer, Edsger Dijkstra, and A. van Wijngaarden.
-
Contextual Word Representations: A Contextual Introduction: Provides an intuitive understanding of word embeddings.
-
Light Years Ahead - The 1969 Apollo Guidance Computer: A computer which weighed 32 kgs and had 55 watts of power
consumption, 5600 3-input NOR gates, 4 KB RAM, and 72 KB ROM helped
mankind reach the moon. In this video, Robert Wills articulates the
software engineering principles used for the Apollo Guidance Computer
and narrates the breathtaking 1201 and 1202 program alarms encountered
by Neil Armstrong and Buzz Aldrin minutes before the lunar touchdown.
-
What the world will be like in a hundred years (1922): An article from 1922 by W.L. George which paints a suprisingly
accurate picture of 2022. He discusses topics such as ubiquity of air
travel, transition of railroads to rail freight transportation, leap
from coal to renewable energy, realism in movies, women empowerment,
skyscrappers, attempts at birth control, and the continuity of the
war-peace cycle. My favorite quote from the essay is -
mankind never tears anything down completely to build up something
else; it erects the new while retaining the old.
-
How to Generate Random Colors Programmatically: I love aesthetically pleasing color schemes. In this blog-post,
Martin Leitner-Ankerl describes how we can map colors from RGB space
to HSV space and use the golden ratio to create a diverse color scheme
across the whole color spectrum. I've created a
Python library (okcolor)
following his technique..
-
A Face Is Exposed for AOL Searcher No. 4417749: An interesting story I came across in my Privacy class. In 2006,
AOL had released around 20M search queries from 650k users with the
goal of allowing researchers to understand search patterns. For
privacy reasons, they had anonymized the records by removing user
identifiers. However, NYT was successfully able to de-anonymize user
with ID 4417749 using their search queries. The end result was a class
action lawsuit being filed against AOL.
-
The Designer's Notebook: How to Write Sports Commentary: I've always been fascinated by the idea of automatically generating
realistic sports commentaries. In this post, Ernest Adams describes
his experience doing the same at Electronic Arts for the Madden line
of American football games. Its interesting to hear the nuances that
come into play - like when to use action-by-action commentary and when
to introduce color commentary.
-
Richard Hipp speaks out on SQLite: The creator of SQLite discusses the complexity of SQLite's
codebase, how it is more than a key-value store, how SQLite got
inspired by FAA's DO-178B testing guidelines, and how fuzzy testing
has improved their code quality. My favorite part is when he describes
how testing the machine level such that every branch instruction has
been taken at least once has helped his team iterate faster.
-
The Exceptional Beauty of Doom 3's Source Code : This link discusses the quality of doom 3's source code and how
they achieved it. If you scroll down to the bottom, there is a comment
from John Carmack. The fun parts are - “Unified Parsing and Lexical
Analysis” and “Minimal Templates”. In the latter, the author discusses
how the creators re-wrote all necessary STL functions!
-
Game Engine Black Book Wolfenstein 3D: As I understand, Wolf3D was one of the earliest examples of ray
casting in games. This book by Fabien Sanglard dives into the source
code of Wolf3D and explains how ray casting was used (start at section
4.7).
-
Allegory, Realism, and Vermeer's use of the camera obscura: I came across this paper in my Computer Graphics class. Philip
Steadman describes how Johannes Vermeer used a
camera obscura
to bring about his magnificent attention to detail. If this was indeed
the case, it makes one wonder just how difficult it must have been for
Vermeer to trace and paint directly onto the canvases without making
mistakes. My favorite part in the paper is when Steadman describes the
glass orb in “The Allegory of Faith” which allegedly provides a small
glimpse of the camera obscura.
-
Four decades of computer graphics : Another paper I came across in my Computer Graphics class. It
describes the developments in Computer Graphics from the 60s to 90s
and foreshadows key future developments like VR. Its fascinating that
the Whirlwind project in 60s had a
quarter of an acre of electronics and used light pens to
display information. The 80s certainly seemed like a fun decade for CG
- CAD/CAM being used in engineering design, better software for
businesses and graphics art, the emergence of devices such as the
mouse, sensor gloves, and color printers, and improved standards in
the graphics community.
-
Special Effects for Star Trek II (The Genesis Demo): Yet another paper I came across in my Computer Graphics class.
Written by Alvy Ray Smith, this paper describes how the Wrath of Khan
became the first feature film to contain a sequence created entirely
with computer graphics, and how an incredible team at LucasFilms
carried forward this task. It is fascinating to see how they were
pushing the boundaries in 1982 - aiming to have no antialiasing, using
fractal techniques to reduce the need to manually enter the data,
creating innovative camera movements using n-dimensional cubic
splines, and designing a texture mapper for spheres. Fun fact, towards
the end of the paper, Ray Smith mentions the word Pixar, which
he describes as a machine being created by LucasFilms to increase the
speed of computing of the frames by 2x to 3x magnitude!
-
Lightmap: A neat
data-structure which is used to cache surface lighting information
that can be multiplied with a diffuse texture map when needed.
-
Manuel Blum's advice to a beginning graduate student : The closest to my heart is his advice on the power of writing. He
mentions how
the only difference between a FA (finite automaton) and a TM
(Turing machine) is that the TM, unlike the FA, has paper and
pencil.
So without writing, we are all reduced to a finite automaton!
-
How training puzzles are generated: James Clarke discusses how Lichess.org heuristically automates the
process of generating their mate-in-N and material advantage puzzles.
-
Why Philosophers Should Care About Computational Complexity: Parts of this paper by Scott Aaronson (like section 4.3 -
can humans solve NP-complete problems efficiently? ) makes you
wonder what problems in real-life are philosophically NP.
-
Graveyard hashing: Tombstones have been
used in linear-probing hash-tables
as a marker to suggest that an item was on an index but has been
deleted since. However, it is known that
primary clustering
can occur with such a strategy. In their
2021 paper, Michael
Bender, Bradley Kuszmaul, and William Kuszmaul discusses a variant of
linear-probing called graveyard hashing that eliminates primary
clustering (under certain conditions). This in-turn improves data
locality. Their strategy involves
"artificially increasing the number of tombstones placed in an
array until they occupy about half the free spots. These tombstones
then reserve spaces that can be used for future insertions."
-
Jason Rahman's blog: Delayed Branch: During my internship at Facebook, Jason's code reviews were
incredibly informative - they were mostly about optimizations in C++
which can improve performance.
Software Performance: Generic Tricks
discusses how avoiding copies, reformulating common operations like
idiv, restricting the use of shared pointers, and explicitly providing
a branch's likelihood can improve performance.
Software Performance: System Optimizations
goes into some specifics on what FB's storage team is doing for
optimizations - avoiding system calls in hot data path and minimizing
system calls behind abstraction layers (the example of doing async
logging using MPSC queue is interesting!), thread pinning, using
polling instead of interrupts (io_uring) or routing interrupts to a
small set of non-data path cores, and using huge pages to lower TLB
misses.
-
The APL Programming Language Source Code: It amazes me how I never heard about APL till now. The idea of
functions executing everything on the right seems natural. Each
function in APL is either a monadic (one argument) or a dyadic (two
arguments). They don't have any formal loops and rely on the iota
function (⍳) for looping. The link contains a mind-bending APL program
to compute prime numbers upto R - (~T∊T∘.×T)/T←1↓⍳R
-
When Splines Were Physical Objects : Describes how splines were drawn before CAD came into the picture.
-
Cache-oblivious Mesh Layouts: Yet another paper I came across in my Computer Graphics class. It
is about designing algorithms to construct cache-oblivious layouts of
polygonal meshes. Cache-oblivious layouts are different from
cache-aware layouts as they do not consider the cache parameters. It
was interesting to see that the number of cache misses at runtime can
be computed using the edge span distribution (based on the runtime
access pattern) and the cache miss ratio function, and that a local
permutation can help find an optimal edge span distribution. I also
enjoyed the part of the paper where they used Multilevel minimization
to approximate an NP-hard problem of finding all the local
permutations. If the paper appears dense, I recommend
checking out the slides from their SIGGRAPH talk.
-
Borůvka's algorithm : A surprisingly simple and beautiful minimum spanning tree
algorithm, which should be taught in every algorithms class -
alongside Prim's and Krushkal's algorithms. It was designed by Otakar
Borůvka in 1926 to construct an electrical network connecting several
cities using the least amount of wire. This algorithm is described in
great detail by
Jeff Erickson.
-
Twenty questions: A 19th century rule-book that describes the format of a game called
twenty questions. It introduces the concept of umpires (who resolve any dispute) and
captains (an official spokesperson). Interestingly, their version did
not have a constrain on the type of guess word. However, every Sunday
it was mandatory for the participants to pick an object, person, or
thing mentioned in the Bible.
-
Persistent Homology: An Introduction and a New Text Representation
for Natural Language Processing: This short paper from Xiaojin Zhu is a great way to explore Group
Theory, Simplicial Homology, Persistent Homology, and apply their
basic principles to solve a fun NLP problem - classifying an author's
age (into child, adolescent, or adult) based on their writing style.
-
Reconstructing Turing's "Paper Machine": This article from ChessBase describes a chess algorithm written by
Alan Turing and David Champernowne in 1948. To the best of my
knowledge, it is the oldest existing chess algorithm. It introduces
the notion of quiescence search ("Captures had to be followed up at
least to the point where no further capture was immediately possible.
Check and forcing moves had to be followed further.") and game trees -
for chess. Remarkably, their relative values for chess pieces were
quite similar to the ones later discussed by I. A. Horowitz (in 1951)
and Bobby Fisher (in 1972). Their evaluation function also took king
safety, piece mobility, piece safety, castling, pawn advancement, and
mates/checks into consideration. The 2-ply variant seems to have a
Lichess rating of 1600 (for blitz and rapid games).
-
The topologist's world map: A unique way to describe a world map that is topologically
equivalent to a normal map.
-
Regulating Data: Regulating tech monopolies has always been a contentious issue. The
vast amount of personal data that these companies possess about their
users has raised concerns about privacy and security, leading to
discussions around regulation. The traditional anti-trust remedies
involve breaking up their businesses, which is certainly less
desirable from a consumer experience perspective. This blog post from
Raghuram Rajan suggests that users should instead own the data they
generate, and that this data should be stored by a decentralized
entity that is independent of the firms that use the data. Aggregated
user data can then be partitioned into different buckets (such as
advertising and academic research), which can, in turn, be exchanged
with different businesses in exchange for their services. While this
idea is certainly not new, I like the concise nature of his blog post
and how he uses the Unified Payments Interface (UPI) as an example to
strengthen his argument.
-
Guide to making a CHIP-8 emulator: Walk before you can run is an old idiom that applies to many
things in life. Suprisingly enough, it also applies to coding
emulators. CHIP-8 is one of the simplest emulators to program, with
just a handful of instructions. And it is often used as a stepping
stone to building more complex emulators, such as NES. This blog post
from Tobias Langhoff, along with a
technical reference guide
from Thomas Greene, is a great way to get started with CHIP-8.
-
Contextual Word Representations: A Contextual Introduction: This article by Noah Smith provides a nice introduction to word
embeddings.
-
Encounter with the Woz: In
this fun story, the author describes a meeting with Steve Wozniak back
in 2006 at a Barnes & Noble. It turns out that Wozniak once pulled a
prank during the 70s by creating a fake advertisement for Zaltair, a
fictitious computer that was supposedly the successor to the MITS
Altair. This new computer was built around the Zilog Z80 processor
instead of the Intel 8080. Wozniak used some of the worst ads he could
find for wording, and then he distributed the brochures at the West
Coast Computer Faire. The author recreated the brochure and was able
to get Wozniak to sign it. What's more, Wozniak was carrying laser-cut
stainless steel business cards, which he handed out at the event.
-
A.I.:
Apparently, one of the earliest examples of reinforcement learning
came from a project by Marvin Minsky called
SNARC (Stochastic Neural Analog Reinforcement Computer).
Although Minsky's 1952 paper on SNARC appears to be lost, he explained
its architecture in a 1981 interview with Jeremy Bernstein, a
theoretical physicist and a staff writer for The New Yorker.
Relevant part from the interview:
As an undergraduate, Minsky had begun to imagine building an
electronic machine that could learn. He had become fascinated by a
paper that had been written, in 1943, by Warren S. McCulloch, a
neurophysiologist, and Walter Pitts, a mathematical prodigy. In
this paper, McCulloch and Pitts created an abstract model of the
brain cells—the neurons—and showed how they might be connected to
carry out mental processes such as learning.
"The one I then envisioned would have needed a lot of memory
circuits. There would be electronic neurons connected by synapses
that would determine when the neurons fired. The synapses would
have various probabilities for conducting. But to reinforce
'success' one would have to have a way of changing these
probabilities. There would have to be loops and cycles in the
circuits so that the machine could remember traces of its past and
adjust its behavior. I thought that if I could ever build such a
machine I might get it to learn to run mazes through its
electronics— like rats or something. I didn't think that it would
be very intelligent. I thought it would work pretty well with
about forty neurons. Edmonds and I worked out some circuits so
that —in principle, at least—we could realize each of these
neurons with just six vacuum tubes and a motor."
Minsky's machine was certainly one of the first electronic
learning machines, and perhaps the very first one. In addition to
its neurons and synapses and its internal memory loops, many of
the networks were wired at random, so that it was impossible to
predict what it would do. A "rat" would be created at some point
in the network and would then set out to learn a path to some
specified end point. First, it would proceed randomly, and then
correct choices would be reinforced by making it easier for the
machine to make this choice again—to increase the probability of
its doing so. There was an arrangement of lights that allowed
observers to follow the progress of the rat—or rats. "It turned
out that because of an electronic accident in our design we could
put two or three rats in the same maze and follow them all,"
Minsky told me. "The rats actually interacted with one another. If
one of them found a good path, the others would tend to follow it.
We sort of quit science for a while to watch the machine. We were
amazed that it could have several activities going on at once in
its little nervous system. Because of the random wiring, it had a
sort of fail-safe characteristic. If one of the neurons wasn't
working, it wouldn't make much of a difference —and, with nearly
three hundred tubes and the thousands of connections we had
soldered, there would usually be something wrong somewhere. In
those days, even a radio set with twenty tubes tended to fail a
lot. I don't think we ever debugged our machine completely, but
that didn't matter. By having this crazy random design, it was
almost sure to work, no matter how you built it."
-
This is how the cover art of Defender of the Crown (1986) was
made: Mysteries are not just confined to the world of law and murder;
they also transcend to the world of history as well. In this blog
post, Jimmy Wilhelmsson goes on a detective mission to identify the
artist behind the cover art of Defender of the Crown, a 1986 game from
Cinemaware. His journey leads him - and us - to an intriguing
conclusion. Another interesting internet mystery that's worth
exploring is:
Who made these circles in the Sahara?
-
The Alien Voice: Alvin Lucier's North American Time Capsule 1967: In 1961, the earliest demonstration of computer speech synthesis
occurred at Bell Labs using an IBM 704. The computer performed a
rendition of the song
Daisy Bell (Bicycle Built for Two). Interestingly, Arthur C. Clarke, who happened to be present at the
Bell Labs demonstration, later referenced it in
2001: A Space Odyssey, where the HAL 9000 computer sings the
same song to Dave Bowman just before being deactivated. This essay by
Christoph Cox further discusses this by describing the Vocoder
technology, what inspired Homer Dudley to build it in 1928, and how
years later, Alan Turing and his colleagues modified it to create a
secure speech system called
SIGSALY for World
War II. It also discusses the emergence of computer-generated music.
-
Brr: This blog is written by an
anonymous individual who was deployed to Antarctica in 2022-23 to work
on IT projects. Throughout a series of blog posts, they describe their
experiences of living in Antarctica. They cover topics such as
laundry,
voting while stationed in Antarctica,
sending postal mail, and
how ATMs work. Additionally, the blogger highlights
the Beer Can, a unique
infrastructure at Amundsen-Scott South Pole station that connects
their living zone to their critical infrastructure zone, located fifty
feet below the surface.
-
The Cab Ride I'll Never Forget: I don't have much to say about this blog post besides the fact that
it's an absolute must-read. It shows how seemingly small acts of
kindness can lead to life-changing experiences.
-
The Byte magazine archive: This archive, spanning from 1975 to 1994, contains a plethora of
hidden gems. For instance, their February 1992 issue features a
section on Archie, one of the earliest internet search engines.
Relevant part from the February 1992 issue:
For many people, particularly programmers and engineers, the
Internet means "info- booty": shareware and freeware source code,
documents, graphics, and data sets available by file transfer
downloads and from E-mail servers. Sites like UUNET and The World
each have several gigabytes' worth of publicly available archives.
These are but two of the hundreds of sites with archives
accessible via these methods. Even admitting a fair amount of
redundancy among archives, it still adds up to about 100
gigabytes, and new sites and offerings are coming on-line every
day.
With so many different archives, it can be hard to figure out
where (and at what network address) to access the items you want.
If you don't know what you want beyond compilers or CP/M
applications, it's even more overwhelming.
The "archie group" at McGill University (Montreal, Quebec, Canada)
has one solution to the problem: archie (archive without the v),
the Internet Archive Server Listing Service (for access, see
reference 2). Archie is a central database of information about
Internet-accessible archive sites, plus server programs that
provide access by telnet, anonymous file transfer protocol (FTP),
E-mail, and the Prospero distributed computer system.
Mondo 2000 and
High Frontiers
are other technology-focused retro magazines worth exploring.
-
Alphabet Chess: While its merits are debatable, this is certainly a one-of-a-kind
way to play chess.
-
Deletion from hash tables without tombstones: Two of the most common collision resolution strategies are chaining
and open addressing. In open addressing, linear probing is widely
used. Furthermore, when deleting an element in a linear probing
scheme, tombstones are often used to mark the deleted element.
However, this strategy wastes memory and increases the frequency of
expensive rehashing. This blog post by attractivechaos proposes
a clever deletion strategy without tombstones. When deleting an
element, the strategy moves the next element to the deleted location
if it was pushed away by the deleted element due to hash collision.
This process recurses until an empty location is reached. Isn't that
marvelous? attractivechaos has shown that this strategy can
work surprisingly well in practice. I am curious to compare it with
graveyard hashing.
-
3D printing a full-size kayak: In this blog post, Nathan Rooy discusses an interesting project he
worked on during COVID-19 lockdown. One day, I would love to 3D print
an entire chess set.
-
Droste effect: A visual recursion! M. C. Escher's
Prentententoonstelling
(loosely translated to Print Gallery or
Print Exhibition) is a breathtaking work of art that showcases
this fascinating effect.
The Mathematical Structure of Escher's Print Gallery
discusses more about how Escher created this masterpiece.
-
Theorem of the Day: Robin Whitty discusses a variety of well-known and lesser-known
theorems as succinctly as possible.
-
AI's Instagram Problem: Andrew Ng shares great words of wisdom on taking inspiration from
emerging technologies instead of doubting the value of our own work. I
hope to remember and apply this as I advance in my career.
My favorite part is:
Someone else's sculpted physique does not take away from your
beauty. And the emergence of a hot new technology doesn't mean
your current project isn't also valuable, assuming it's
technically sound, has a reasonable expectation of impact, and
isn't made obsolete by newer technology (which doesn't happen
very often). Projects of all shapes and sizes can be wonderful,
and what's buzzy today is only one of the many things that will
prove valuable in the future.
-
This is still a motherfucking website: Shows how websites can be made aesthetically pleasing with minimal
use of CSS.
-
Car Problems: Shows how even insane-looking problems can sometimes be real.
-
Advice to a Beginning Graduate Student: For many years now, this talk from Manuel Blum has held a special
place in my mind and has greatly influenced my reading and writing
habits. This is thanks to a beyond fascinating
philosophically mathematical
argument he makes:
Is writing elevating our powers to that of a Turing machine?
You are all computer scientists. You know what FINITE AUTOMATA
can do. You know what TURING MACHINES can do. For example,
Finite Automata can add but not multiply. Turing Machines can
compute any computable function. Turing machines are incredibly
more powerful than Finite Automata. Yet the only difference
between a FA and a TM is that the TM, unlike the FA, has paper
and pencil. Think about it. It tells you something about the
power of writing. Without writing, you are reduced to a finite
automaton. With writing you have the extraordinary power of a
Turing machine.
Additionally, there are some other gems in there as well.
One involving Bertram Kostant's literacy skills.
I remember a professor of Mathematics at MIT, name of BERTRAM
KOSTANT, who would keep his door open whenever he was in his
office, and he would always be at his desk writing. Writing.
Always writing. Was he writing up his research? Maybe. Writing
up his ideas? Maybe. I personally think he was reading, and
writing what he was reading. At least for me, writing what I
read is one of the most enjoyable and profitable ways to learn
hard material.
And the power of combining random access with books.
Books are not scrolls. Scrolls must be read like the Torah from
one end to the other. Books are random access -- a great
innovation over scrolls. Make use of this innovation! Do NOT
feel obliged to read a book from beginning to end. Permit
yourself to open a book and start reading from anywhere. In the
case of mathematics or physics or anything especially hard, try
to find something anything that you can understand. Read what
you can. Write in the margins. (You know how useful that can
be.) Next time you come back to that book, you'll be able to
read more. You can gradually learn extraordinarily hard things
this way.
-
Create random images in Python: A beautiful algorithm by Renato Budinich to create random images
using a two-step procedure. The first step involves taking a random
gray-valued mask image and applying the path-finding procedure of the
Easy Path Wavelet Transform (EPWT) to it. This path-finding
technique is greedy and aims to obtain a succession of vectorized
pixel values with minimal variation. It does this by always picking
the next point (among the available neighbors) that yields the minimum
absolute value difference in pixel values. This approach helps it
select regions with similar pixel values before making a jump to
pixels with significantly lighter or darker regions. Once a random
path of length N is obtained, a random color map is applied, with each
point k in the path mapped to the k/N point in the color map. Et
voilà! A gorgeous image emerges.
-
Null Island Is One of the Most Visited Places on Earth. Too Bad It
Doesn’t Exist: Null Island is a fantasy island located at the point where the
equator meets the prime meridian. This post explains how it became a
dumping ground for geocoding errors.
-
Unix and Beyond: An Interview with Ken Thompson: A 1999 interview with Ken Thompson, where he discusses the design
of the Plan 9 and Inferno operating systems, the history of Unix, and
his hobby of collecting jukebox music. Years later, at SCaLE 20x,
Thompson gave a talk on his jukebox. Having worked on
radio generation software myself, I can strongly resonate with his hobby. Thompson also intersperses
some great wisdom in his interview, such as the importance of
orthogonal thinking -
it's always good to take an orthogonal view of something. It
develops ideas.
-
Bitboards and Connect Four: Prof. Dominikus Herzberg explains how a Connect Four game can be
represented and operated using a bitboard.
-
Martin Gardner's 1969 column, "Mathematical Games": This was the April edition, in which Gardner had laid out eight
problems based on logic and probability. A central theme amongst many
of them was that the problem involved some sort of game - such as
chess, name cards, and word games. To call these problems intriguing
would be an understatement - there's an uncrossed knight's tour
problem, a variant of chess where the first person to check the
opponent's king wins, a variant of the urn problem, and, a word game.
I have provided an analysis on this word game
in one of my blogs.
-
Play Tic-Tac-Toe with Knuth: This little blog post from Russ Cox has amazed me for a long time.
This year, I finally got the opportunity to go over TAOCP Volume 4A,
hoping to understand Knuth's algorithm. The algorithm discusses how
optimal tic-tac-toe moves can be represented using Boolean logic.
He starts by picturing two 3x3 grids - one for the X’s and another for
the O’s. This setup introduces 18 boolean variables - x1 to x9 for the
X's, and o1 to o9 for the O's.
Now, creating a full-scale truth table for these 18 variables means we
would be looking at 2^18, or 262,144 rows. However, it turns out only
4520 of those are legal inputs. So, the question becomes, how do we
find patterns in this boolean chain to build our tic-tac-toe
strategies.
Knuth simplifies it by considering only the following strategies -
(a.) winning - when putting an X in a cell wins the game - like when
two cells in any line already have X's. (b.) blocking - when putting
an X in a cell stops the other player from winning - like when two
cells in any line have O's. (c.) forking - when putting an X in a cell
opens up multiple winning moves - you store all the winning line
possibilities (horizontal, vertical, and diagonal lines - all 9) in a
set, and for each winning line (say {i, j, k}), you place an X on i,
leave k empty, and see if a move on j creates two win chances. (d.)
defending - similar, when putting an X in a cell stops the other
player from creating multiple win chances. (e.) And just making any
legal move - when a cell does not have an X or an O.
The priority order of moves follows the order above. There's also a
bit of priority within the legal moves - like the middle spot is best
since it's part of more winning lines, while the edges are the last
choice.
-
Knightmare: A DevOps Cautionary Tale: A bone-chilling tale of a financial services firm that faced a $460
million loss in 45 minutes due to a software bug.
-
Ghost Leg: I
believe I am done using rock, paper, scissors after finding out
about this elegant algorithm. Ghost leg essentially boils down to a
sequence of swaps on a set of indices, where each horizontal line
(leg) represents a swap between two adjacent indices at a time
t. The final order of these indices after all swaps have been
applied gives us a permutation of the original set.
Furthermore, the Wikipedia page describes what a "prime" ghost leg is
-
as there are an infinite number of ghost legs representing a
particular permutation, those ghost legs have a kind of equivalence.
Among those equivalent ghost legs, the ones which have smallest
number of legs are called "prime". Fascinatingly, there is a relationship between ghost legs and
bubble sort. Bubble sort is a sorting algorithm that sorts an array by
repeatedly swapping adjacent elements that are in the wrong order.
This effectively "bubbles up" the largest unsorted element to its
correct position in each iteration through the array. If you think of
a ghost leg's end configuration as a shuffled sequence, then the
process of adding legs to revert it back to the initial sorted state
with the minimum number of moves would be analogous to bubble sort. In
other words, each leg would represent a swap that bubble sort would
perform. There is also an algorithm to parallelize a ghost leg;
however, I leave that up to the curious reader to explore. Hint:
red-black balls.
-
John Graham-Cumming's keynote on "The Great Railway Caper": John Graham-Cumming narrates the fascinating story of the 1951
business computer LEO I, one of the world's first, which was handed a
big data problem by the British Rail: to calculate the shortest
distance between each of their 5,500 railway stations. What follows is
an engineering feat that spanned over 9 months - the discovery of
Dijkstra's algorithm years before Dijkstra published it, optimizations
to distribute the data processing tasks, and the fascinating use of
punch cards. Tim Greening-Jackson has also documented this story in
his paper on
LEO I and the BR job.
-
John Calhoun's blog: My
favorites include
his experience interviewing at Apple in 1995, after which he worked there for over two decades, and his
SystemSix
project.
-
Why Do Movies Move?: In this post, Alvy Ray Smith discusses how we perceive motion in
films despite them consisting only of individual, still frames shown
in quick succession. He explores motion blur and how computationally
generated animations recreate it.
-
The TX-2 Computer and Sketchpad: In this article, Ivan Sutherland recollects his experience working
with the TX-2 computer and developing Sketchpad for it.
-
A Parabel: A 1973 Parabel narrated by Dijkstra that involves a train toilet
problem. Dijkstra's EWD manuscript archive is fascinating; I encourage
exploring his trip reports,
such as this one. Furthermore, his
three golden rules for successful scientific research
are very well put.
-
Publishing my first game using Pico-8: A fun blog from Ben Boyter. It brings new life to the conventional
rock, paper, scissors game. One day, I'll make my own Pico-8 game.
-
The Mystery of the Bloomfield Bridge: There is a pedestrian bridge that crosses I-494 just west of the
Minneapolis Airport, connecting Bloomington to Richfield. Hundreds of
thousands of cars drive under it, but why is it there, especially in
an area that is neither particularly walkable nor connected to any
establishments? In this blog post, the author investigates this
seemingly irrelevant yet surprisingly fun internet mystery.
←