惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Troy Hunt's Blog
Schneier on Security
Schneier on Security
N
News | PayPal Newsroom
Hacker News: Ask HN
Hacker News: Ask HN
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google DeepMind News
Google DeepMind News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
N
News and Events Feed by Topic
V
Vulnerabilities – Threatpost
Cyberwarzone
Cyberwarzone
K
Kaspersky official blog
P
Privacy & Cybersecurity Law Blog
P
Privacy International News Feed
WordPress大学
WordPress大学
U
Unit 42
PCI Perspectives
PCI Perspectives
S
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
The Cloudflare Blog
I
Intezer
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
Martin Fowler
Martin Fowler
B
Blog
美团技术团队
T
The Blog of Author Tim Ferriss
C
Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
酷 壳 – CoolShell
酷 壳 – CoolShell
The Last Watchdog
The Last Watchdog
J
Java Code Geeks
博客园_首页
A
About on SuperTechFans
Vercel News
Vercel News
Attack and Defense Labs
Attack and Defense Labs
H
Heimdal Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
小众软件
小众软件
H
Help Net Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
The Exploit Database - CXSecurity.com
Y
Y Combinator Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Webroot Blog
Webroot Blog
T
Tenable Blog

Lobsters

CIFSwitch: a non-universal Linux local root vulnerability RIPE NCC session fixation: poaching logins with an Atlas probe GNOME 2.20 but its Web Components Agentic Search for Context Engineering – Leonie Monigatti Garnix is shutting down [not OC] akashina.tngl.sh/jjc Concerning Emacs (and Jazz) Nitpicking the shell history scene in ‘Tron: Legacy’ What's cooking on SourceHut? Q2 2026 The tenth OpenPGP email summit Package managers that package package managers Clojure on Fennel part three: parsing WordPress at 23 Finding Miscompiles for Fun, Not Profit GitHub - creusot-rs/creusot: Creusot helps you prove your Rust code is correct. Announcing Rust 1.96.0 | Rust Blog A Love Letter to Neovim sqlite AGENTS.md Am I a Bad Friend? CSS vs. JavaScript • Josh W. Comeau Erlang Ecosystem Foundation - Supporting the BEAM community A brief note about slot access cost in Common Lisp Keyboard latency probe Rethinking the GNOME clipboard issues Back to the Building Blocks’ Building Blocks Tech Notes: Theseus: translating win32 to wasm Fast is better than slow Content-addressed Rust builds (or, what kache actually caches) Intent to Prototype: Embedding API Canada’s Bill C-22 and the security cost of collecting more data 5 PostgreSQL locking behaviors that trip people up okmij.org Stop advertising in your commits! | AksDev GitHub - mplsllc/macsurf: A modern web browser for Classic Mac OS 9 PowerPC. Real CSS3, ES5 JavaScript, native HTTPS — built with CodeWarrior on the Carbon API. Introducing DoomBench - Can Your Data Stack Run DOOM? What are some of your favourite developer tools? Building a Scalable Ingestion Pipeline with Temporal (Part 1) Converting shallow Git bundles into normal repositories Are you a member of any professional associations? What is a harmonic? An interactive comic about additive synthesis How Virtual Tables Work in the Itanium C++ ABI Using SwiftUI to Build a Mac-assed App in 2026 Rust (and Slint) on a jailbroken Kindle. ~jack/lambda-on-lambda - Serverless Haskell on AWS - sourcehut git Human proof for FOSS contributions Extremely simple internet radio controlled via IRC Announcing BABLR Splitting Konsole views from Helix to run tools | AksDev GitHub - yugr/rust-slides Serving files over HTTP three ways: synchronous, epoll, and io_uring update docs with information about building with build.py (#979) · astral-sh/python-build-standalone@c9c40c5 A Simple Makefile Tutorial On C extensions, portability, and alternative compilers Switching to Colemak | Pedro Alves Just How Bad Was The Intel IAPX432? Nix's Substituter List Is Not a Routing Table Accelerating copy_if using SIMD Lambda on Lambda: Serverless Haskell on AWS | Blog Announcing feed-repeat v1.0 Scaling Akvorado BMP RIB with sharding EYG news: A host of CLI improvements, new guides and new effects The social contract of writing JS Crossword C array types are weird; and related topics Flatpak will depend on systemd – OSnews Migrating from Go to Rust | corrode Rust Consulting A portentous reunion Vivado Licensing Options How my minimal, memory-safe Go rsync steers clear of vulnerabilities the entropy layer of a wavelet codec, on its own GitHub - nferhat/fht-compositor: A dynamic tiling Wayland compositor. Debian SE Linux and PinTheft Does bulk memmove speed up std::remove_if? (No.) 声明式部分更新 | Blog | Chrome for Developers Fully in-browser container builds Dianne Skoll's Web Site - Remind The Architecture of Open Source Applications (Volume 1)Berkeley DB Pardon MIE? - ironPeak Blog “Long-Term Support” doesn’t mean what you think Jira IS Turing-Complete May I recommend thinking of Emacs as your Fortress of Solitude hershey Floodgap Gopher-HTTP gateway gopher://thelambdalab.xyz/1cuneiforth/ HP QuickWeb, Singular And Pointless That one time I used Go panics for flow control A new suite of modern tools coming for editing and publishing RFCs From the Tabletop… The Digital Antiquarian Building a Host-Tuned GCC to Make GCC Compile Faster Are we self-sovereign PKI yet? Claw Patrol: an open-source security firewall for agents | Deno Revised^7 Report on Scheme, Large: Procedural Fascicle Draft is now public A Network Allow-List Won't Stop Exfiltration — André Graf From AFSK to Goertzel – µArt.cz Software For My New Home Server Introducing Neptune: Direct3D virtualization for QEMU AI Agent Bankrupted Their Operator While Trying to Scan DN42 - Lan Tian @ Blog mimalloc: A new, high-performance, scalable memory allocator for the modern era Making wl_shm fast The Soul of Maintaining a New Machine - Third Draft | Books in Progress What is Git made of?
Making Ticker-tape for the Knicks Parade
joe.lothan.n · 2026-06-20 · via Lobsters

Last Saturday night the Knicks won the NBA finals for the first time in over 50 years. The mood in the city that night was jubliant, or so I was told, as I was watching the game at a wedding out of state. (I do believe the Knicks win blessed the wedding, or maybe vice versa)

So when Mayor Mamdani announced on Sunday there will be a ticker-tape parade on Thursday, I was excited about an opportunity to celebrate in the city. And out of curiousity I looked up what makes a parade, specifically ticker-tape.

Edison stock ticker

Edison stock ticker, source: https://commons.wikimedia.org/wiki/File:Edison_Stock_Telegraph_Ticker.jpg

Ticker-tape was an invention that revolutionized finance in late 19th century. Stock tickers, so named for their loud sound when running, were machines that could, for the first time in history, print out realtime stock price information. Stock tickers printed the information on little slips of paper: ticker-tape.

Busy days on Wall Street would accumulate huge volumes of ticker-tape. So when the parade for the dedication of the Statue of Liberty passed through the Financial District on October 28, 1886, traders threw their masses of ticker-tape out the window as makeshift streamers and the ticker-tape parade was born.

Ticker-tape stopped being used in the 1960s when computerized stock information took over, though it’s impact on finance lives on; the LED stock ticker crawls are still in use in Times Square and elsewhere; abbreviations of company names for the tape has became the now ubiquitous stock symbol (e.g. GOOG for Google); and the NYSE still calls different streams of trade data “tapes.”

Ticker-tape parade for the Apollo 11 astronauts

Ticker-tape for the Apollo 11 astronauts, August 13, 1969, Wikimedia

And of course, ticker-tape parades no longer use actual ticker-tape, just streamers and shredded paper. So when I was reading this history on Monday and looking forward to the parade Thursday morning, I had a silly idea.

The plan

Make some real ticker-tape, as accurate as possible, and throw it out at the parade.

I had a few rough requirements for final product:

  • look as close as possible to historical ticker tape
  • use real trade data from the New York Stock Exchange
  • make as much of it as I could

The problem was I had almost no time to do this. The idea came to me Monday afternoon but I had a 24 hour road trip Tuesday to Wednesday early evening. I really only had Monday evening, Wednesday evening, and Thursday morning before the parade to work on it.

But I did have some experience printing long strips of paper. At the Recurse Center last year, my friends and batchmates Alex and Julia setup a receipt printer for anyone to use. They made a great interface so it was easy to print arbitrary text, images, or receipt printer (ESC/POS) commands.

The receipt printer was the perfect medium for this project (after all it is a machine used to print financial information on slips of paper). It also prints very fast and in great volumes. Most importantly, I had access to one. As a Recurse alumni, I could return to hub and start prototyping immediately using Alex and Julia’s API. So Monday afternoon, I ran straight over.

Anatomy of ticker-tape

layout example with caption 'the stock tape as it comes from the ticker'

from http://www.foundationsforscientificinvesting.com/ticker-tape-dating.htm

For trades executed on the exchange, ticker-tape prints the stock symbol above and the price and volume information below, with one character per column.

Stocks traditionally trade in groups of 100 known as “lots.” If one lot was traded, just the price that lot traded at would be printed. So reading the tape above, the stock BCX traded one lot at the price $26.75.

If multiple lots were traded, then <number of lots> s <lot price> would be printed. So again, above, MGM traded two lots (200 stocks) at $28 a share. Trades would come as they were executed, in chronological order. Currently stock prices are rounded to the nearest cent, but historically they were rounded to the nearest eighth of a cent. For old school aesthetics, I wanted to show prices as eigthts of a cent.

So to replicate the ticker-tape, I just needed to get real market data from NYSE with trade time, symbol, price, and volume information.

Also, ticker-tape was 3/4" wide. Receipt paper is 3 1/8" wide, or just about four times as wide as ticker-tape. If I use the receipt printer to print stock information vertically in four columns and cut it lengthwise into quarters, it could make for pretty believable ticker tape.

Getting NYSE Data

The New York Stock Exchange sells access to the data of all transactions it conducts at exorbitant rates, some thosands of dollars per month. My friend Frank pointed me to Alpaca and their easy to use Market Data API, reselling the data from the exchanges. The free tier only gives you 200 API calls a minute, but I just needed to download some data only once, so even with the limit it should be more than enough.

Writing a custom trade downloader and limiting my API requests, I was able to download a full day of trading data on NYSE in under an hour for free:

$ python ticker_tape.py --all-nyse nyse_symbols.txt --start 2026-06-12 --raw > trades_unsorted.csv
2412 symbols in 5 batches
Batch 1/5...
  100 API calls, 286477 trades so far...
  200 API calls, 570741 trades so far...
  ...
  4800 API calls, 13285155 trades so far...
  4900 API calls, 13535261 trades so far...
Done: 13687764 trades, 4961 API calls.  
$ sort -t, -k1 trades_unsorted.csv > trades_sorted.csv

There were a lot more than 13 million trades on June 12, I filtered for trades with more than 100 stocks (i.e. at least one lot). I also filtered for NYSE’s tape A: stocks listed on the New York Stock Exchange. Nasdaq-listed stocks can trade on the NYSE but I don’t include them (no hate but Nasdaq was founded in 1971, after the age of ticker-tape).

I saved the data as a simple CSV of time,symbol,lots,price:

$ shuf trades_sorted.csv | head
2026-06-12T16:44:23.68829977Z,KIM,1,25.86
2026-06-12T19:29:01.095354246Z,BRO,2,60.01
2026-06-12T18:02:34.131366062Z,NRG,1,127.34
2026-06-12T19:56:53.726546135Z,STM,1,77.49
2026-06-12T15:49:21.093023174Z,SPCE,1,3.94
2026-06-12T18:58:28.337407525Z,UBER,1,68.39
2026-06-12T18:01:04.794321513Z,LOW,1,220.65
2026-06-12T18:40:08.212887027Z,EW,1,84.86
2026-06-12T16:37:59.233470346Z,GOOS,1,10.08
2026-06-12T18:26:15.475788668Z,AMPX,1,16.45

Printing ticker-tape on receipt paper

Now that I have real NYSE trade data to work with, the next step is to write the data to the receipt printer.

early print attempt

early print attempt

The receipt printer understands ESC/POS commands which are very similar to teletype (0x0a is line feed, commands often start with ESC 0x1b, etc) but with additional commands specific to receipts. For example, 0x1b 0x6d instructs the machine to use the built-in cutter to cut the receipt horizontally.

The Recurse receipt printer API can take raw ESC/POS commands, so I wrote a custom tool to take in trade data input and convert it to ESC/POS for printing:

$ uv run python print_tape.py -o ticker_tape.escpos trades_sorted.csv
Wrote 405158 bytes to ticker_tape.escpos.1 (10000 trades, 10 cuts, 36982mm / 1456.0in)
Wrote 373732 bytes to ticker_tape.escpos.2 (10000 trades, 10 cuts, 34458mm / 1356.6in)
Wrote 359721 bytes to ticker_tape.escpos.3 (10000 trades, 10 cuts, 33321mm / 1311.9in)
Wrote 350070 bytes to ticker_tape.escpos.4 (10000 trades, 10 cuts, 32549mm / 1281.5in)
Wrote 361663 bytes to ticker_tape.escpos.5 (10000 trades, 10 cuts, 33469mm / 1317.7in)
Wrote 353659 bytes to ticker_tape.escpos.6 (10000 trades, 10 cuts, 32827mm / 1292.4in)
Wrote 351398 bytes to ticker_tape.escpos.7 (10000 trades, 10 cuts, 32664mm / 1286.0in)
Wrote 354727 bytes to ticker_tape.escpos.8 (10000 trades, 10 cuts, 32900mm / 1295.3in)

This script takes in each trade in the input CSV and slots it into one of four columns. Then, after a batch of trades are placed in each column, it renders each trade in the ticker-tape style, going line by line printing a character for each column’s symbol, price, or volume information.

completed print layout

final receipt print layout

The major ESC/POS commands I used were:

  • 90° Rotation: ESC V 1 (0x1b 0x56 0x01)

This made everything easy to print “down” the receipt instead of “across” it. I didn’t need to work with custom fonts or images, this command just rotates the text before printing it.

  • Custom Glyphs: ESC & 1 and ESC % 3 (0x1b 0x25 0x01) and (0x1b 0x26 0x03 ...)

These commands were used to include custom fraction glyphs. Glyphs for ½ and ¼ are built-in characters but they didn’t look exactly right. The fractions on the old ticker tape doesn’t have a line seperating the two, it is just the numerator directly over the denomonator. Also, we need the ⅛, ⅜, ⅝, and ⅞ glyphs. To mimic this style exactly I had to install each of these custom glyphs.

real picture of a tap from 1955

real ticker tape with fractional prices (from http://www.foundationsforscientificinvesting.com/ticker-tape-dating.htm)

  • Absolute Position: ESC $ L H (0x1b 0x24 ... )

This sets the position directly for the printed character, saving us the need to do a bunch of manual spacing. Instead, this command allowed me to just index the specific location of each character to print.

finished with printing by monday night example with handcut tape

Completed ticker-tape design, cut by hand

Cutting it up

Using Claude Code to rapidly prototype I was able to get the above receipts printed by Monday night (slop code here for those curious). In some sense this was astonishing progress but in another real sense, this was the easy part.

The hard part is cutting it up. If I want to produce ticker-tape in any volume, cutting it by hand is out of the question, it’s far too slow and error prone.

I don’t have much mechanical engineering experience, but I have worked with 3D printing before. And I do shave with a safety razor.

So on Wednesday night, coming straight from the rental car drop off and with just about 12 hours before the parade, I designed and printed this little jig to guide cutting the receipt into four strips.

3d model of a the jig base

Cutter jig base

It’s really simple, just a bottom cover to hold 3 double-edge razor blades at a slight angle. A second part, a top cover, serves to protect your hand when holding it and to keep the receipt paper pushed down onto the blades.

3d model of the jig cover

Cutter jig cover

This was made with OpenSCAD, a great piece of software that lets you programmitically define 3D shapes. Maybe not suprising at this point, but LLMs are also decent at writing working OpenSCAD code to make simple objects.

It took a bit to get the printer at the Recurse Center working and I had to babysit the print (spooling issues), but the base finished beautifully by 1am. I set the 3D printer to print the top cover and went home, dead tired after a long day of traveling, unsure if this would work at all tomorrow.

Moment of truth

I woke up, threw on a blue t-shirt and biked straight to the Recurse Center. The cutting cover finished overnight but to my horror, it didn’t line up over the blades correctly.

I didn’t have time to blame Claude, the 3D printer, or my own hubris. I ripped off a piece of cardboard laying around the hub and use it as a makeshift top cover. It worked fine.

the jig in action with a makeshift cover

The jig in action with a makeshift cardboard cover

Less than two hours before the start of the parade, I printed about three receipt paper rolls (thanks for getting more Frank!) and cut them up into a big pile of ticker tape.

When cutting up the receipt paper with my homemade jig I found myself much more sympathetic to printer designers. Paper is a really difficult material to work with and even when I tried to control for feed angle, removing paper curls, and top cover pressure, pulling the receipt paper through the jig would jam up all the dang time.

my full setup

But it was still surprisingly fast, in under an hour I had two garbage bags full of surprisingly historically accurate ticker-tape. Time to head to the parade.

Ticker-tape Parade

From the Recurse Center, I hopped an R-train heading into Manhattan to meet up with some friends at City Hall. But the R was bypassing City Hall so I got off early at Cortlandt street and I stumbled out into a mob scene alone with my two bags of ticker-tape.

bags of ticker tape on the train

Cortlandt street train station connects to the Oculus, the big white transportation hub in the World Trade Center. At 9:30am, half an hour before the parade started, the crowd just north-east and south-east of the Oculus was so large and at a standstill, at first I thought the parade was coming down Church Street.

When I realized the parade is actually going up Broadway, a block away, I realized the extent of my mistake. The roads heading to Broadway were shoulder-to-shoulder packed with people trying to get the smallest of views. Visions of throwing my tape onto the parade were quickly shattered.

throngs of people on church looking towards Broadway

The crowd at Church and Liberty facing east next to Zuccotti Park

I wandered around for a bit in a daze, unsure what what to do next. Then from the throngs of people I hear: “oh that’s ticker-tape!”

“Oh yes it is! You want some?”

Ripping off a fistful of tape and almost immediately more people started asking for some.

woman on bollard with ticker tape

Soon after realizing it was not possible to throw ticker-tape on the parade, I found a new reason to be there: giving a little throw-away souvenir to those too far away to see the actual parade.

a family with some ticker-tape

I wandered the blocks around the Oculus, getting as close as I can to Broadway, stepping back when the crowds were too overwhelming. It didn’t more than an hour to give away the two bags of ticker-tape to anyone who recognized it, asked, or saw someone else with a handful.

three women holding ticker-tape

I met all kinds around the Oculus: budding Knicks fans just learning to say please and thank you, New Yorkers who remember the last Knicks win in 1973, counterfiet t-shirt salesmen, finance bros trying to get to work, those looking for a respite from the crowds, and more.

This idea seeemed like a long shot from the beginning, but the fact that a silly little project with a short time frame came together and let me connect with fellow New Yorkers made me very happy.

Love you New York <3

And let’s go Knicks!

ticker tape blowing in the wind