PageSourceSearch

https://victorz.ca/blog/

html victorz.ca collected 2026-09-25 21:53:18 UTC 47,531 bytes, 958 lines download raw bytes

1<!doctype html>
2<html lang="en" class="h-100">
3  <head>
4    <meta charset="utf-8">
5    <meta http-equiv="X-UA-Compatible" content="IE=edge">
6    <meta name="viewport" content="width=device-width, initial-scale=1">
7
8    <!--
9    URL /blog/
10    PATH blog/index.html
11    -->
12    <title>Blog &ndash; Victor&lsquo;s Site</title>
13
14    <link rel="canonical" href="https://victorz.ca/blog/">
15
16    <link rel="shortcut icon" type="image/x-icon" href="../assets/victorz/favicon.ico">
17
18    <!-- Stylesheets -->
19    <link rel="stylesheet" id="theme-switcher" href="../assets/dist/bootstrap_theme.css">
20    <meta name="theme-switcher" id="theme-bootstrap" content="../assets/dist/bootstrap.css">
21    <meta name="theme-switcher" id="theme-bootstrap2" content="../assets/dist/bootstrap_theme.css">
22    <meta name="theme-switcher" id="theme-bootswatch-brite" content="../assets/dist/bootswatch_brite.css">
23    <meta name="theme-switcher" id="theme-bootswatch-cerulean" content="../assets/dist/bootswatch_cerulean.css">
24    <meta name="theme-switcher" id="theme-bootswatch-cosmo" content="../assets/dist/bootswatch_cosmo.css">
25    <meta name="theme-switcher" id="theme-bootswatch-cyborg" content="../assets/dist/bootswatch_cyborg.css">
26    <meta name="theme-switcher" id="theme-bootswatch-darkly" content="../assets/dist/bootswatch_darkly.css">
27    <meta name="theme-switcher" id="theme-bootswatch-flatly" content="../assets/dist/bootswatch_flatly.css">
28    <meta name="theme-switcher" id="theme-bootswatch-journal" content="../assets/dist/bootswatch_journal.css">
29    <meta name="theme-switcher" id="theme-bootswatch-litera" content="../assets/dist/bootswatch_litera.css">
30    <meta name="theme-switcher" id="theme-bootswatch-lumen" content="../assets/dist/bootswatch_lumen.css">
31    <meta name="theme-switcher" id="theme-bootswatch-lux" content="../assets/dist/bootswatch_lux.css">
32    <meta name="theme-switcher" id="theme-bootswatch-materia" content="../assets/dist/bootswatch_materia.css">
33    <meta name="theme-switcher" id="theme-bootswatch-minty" content="../assets/dist/bootswatch_minty.css">
34    <meta name="theme-switcher" id="theme-bootswatch-morph" content="../assets/dist/bootswatch_morph.css">
35    <meta name="theme-switcher" id="theme-bootswatch-pulse" content="../assets/dist/bootswatch_pulse.css">
36    <meta name="theme-switcher" id="theme-bootswatch-quartz" content="../assets/dist/bootswatch_quartz.css">
37    <meta name="theme-switcher" id="theme-bootswatch-sandstone" content="../assets/dist/bootswatch_sandstone.css">
38    <meta name="theme-switcher" id="theme-bootswatch-simplex" content="../assets/dist/bootswatch_simplex.css">
39    <meta name="theme-switcher" id="theme-bootswatch-sketchy" content="../assets/dist/bootswatch_sketchy.css">
40    <meta name="theme-switcher" id="theme-bootswatch-slate" content="../assets/dist/bootswatch_slate.css">
41    <meta name="theme-switcher" id="theme-bootswatch-solar" content="../assets/dist/bootswatch_solar.css">
42    <meta name="theme-switcher" id="theme-bootswatch-spacelab" content="../assets/dist/bootswatch_spacelab.css">
43    <meta name="theme-switcher" id="theme-bootswatch-superhero" content="../assets/dist/bootswatch_superhero.css">
44    <meta name="theme-switcher" id="theme-bootswatch-united" content="../assets/dist/bootswatch_united.css">
45    <meta name="theme-switcher" id="theme-bootswatch-vapor" content="../assets/dist/bootswatch_vapor.css">
46    <meta name="theme-switcher" id="theme-bootswatch-yeti" content="../assets/dist/bootswatch_yeti.css">
47    <meta name="theme-switcher" id="theme-bootswatch-zephyr" content="../assets/dist/bootswatch_zephyr.css">
48    <link rel="stylesheet" href="../assets/dist/global.css">
49
50    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
51    <!--[if lt IE 9]>
52      
52<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
52
53      
53<script src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
53
54    <![endif]-->
55  </head>
56  <body class="d-flex flex-column h-100">
57    <nav class="navbar sticky-top navbar-expand-lg navbar-light bg-light">
58  <div class="container">
59    <a class="navbar-brand" href=".."><img src="../assets/victorz/logo.png" alt="logo"></a>
60    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
61      <span class="navbar-toggler-icon"></span>
62    </button>
63
64    <div class="collapse navbar-collapse" id="navbarSupportedContent">
65      <ul class="navbar-nav me-auto">
66        <li class="nav-item"><a class="nav-link" href="../">Home</a></li>
67        <li class="nav-item dropdown">
68          <a class="nav-link dropdown-toggle" href="#nav/game" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Games</a>
69          <ul class="dropdown-menu" role="menu"><li><a class="dropdown-item" href="../game/">List</a></li>
70            <li class="dropdown-divider"></li>
71            <li class="dropdown-header">Downloadable</li>
72            <li>
73              <a class="dropdown-item"
74                href="https://acr.victorz.ca"
75                target="_blank"
76                title="ACR is a free-and-open-source first-person-shooter."
77              >AssaultCube Reloaded
78              <span class="badge text-bg-info">&#8599;</span>
79              </a>
80            </li>
81            <li>
82              <a class="dropdown-item"
83                href="https://re.victorz.ca"
84                target="_blank"
85                title="Realistic Red Eclipse, set in the present instead of future"
86              >Real Eclipse
87                <span class="badge text-bg-secondary">TODO</span>
88              <span class="badge text-bg-info">&#8599;</span>
89              </a>
90            </li>
91            <li class="dropdown-divider"></li>
92            <li class="dropdown-header">Browser Games</li>
93            <li>
94              <a class="dropdown-item"
95                href="https://games.victorz.ca"
96                target="_blank"
97                title="my arcade, full of hacked flash games!"
98              >Flash Arcade
99              <span class="badge text-bg-info">&#8599;</span>
100              </a>
101            </li>
102            <li>
103              <a class="dropdown-item"
104                href="../game/tetris"
105                title="Tetris, but don't let it tip over to one side"
106              >Balanced Tetris
107              </a>
108            </li>
109            <li>
110              <a class="dropdown-item"
111                href="../game/click"
112                title="Modern version of the first game I created"
113              >Clicking Game Remake
114              </a>
115            </li>
116            <li class="dropdown-divider"></li>
117            <li class="dropdown-header">Analysis</li>
118            <li>
119              <a class="dropdown-item"
120                href="../game/t3"
121                title="Analyze Tic-Tac-Toe in various variants and game states"
122              >Tic-Tac-Toe Analyzer
123              </a>
124            </li>
125            <li>
126              <a class="dropdown-item"
127                href="../game/fill"
128                title="Solve the game Fill efficiently"
129              >Fill Solver
130              </a>
131            </li>
132            <li>
133              <a class="dropdown-item"
134                href="../game/fill_browser"
135                title="Browse the level/stages of Fill v4.7.0"
136              >Fill Browser
137              </a>
138            </li>
139            <li>
140              <a class="dropdown-item"
141                href="../game/logic"
142                title="Logical puzzle grid (future) solver with sample solutions"
143              >Logic Grid Puzzles
144                <span class="badge text-bg-secondary">TODO</span>
145              </a>
146            </li>
147          </ul>
148        </li>
149        <li class="nav-item dropdown">
150          <a class="nav-link dropdown-toggle" href="#nav/game_mp" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Multiplayer</a>
151          <ul class="dropdown-menu" role="menu"><li><a class="dropdown-item" href="../game/">List</a></li>
152            <li class="dropdown-divider"></li>
153            <li class="dropdown-header">Realtime Multiplayer</li>
154            <li>
155              <a class="dropdown-item"
156                href="../game/slime"
157                title="Make the ball hit enemy ground"
158              >Slime Volleyball
159                <span class="badge text-bg-success">Revived</span>
160              </a>
161            </li>
162            <li>
163              <a class="dropdown-item"
164                href="../game/duel"
165                title="20% luck and 80% skill"
166              >Duel
167                <span class="badge text-bg-primary">Beta</span>
168                <span class="badge text-bg-success">Revived</span>
169              </a>
170            </li>
171            <li>
172              <a class="dropdown-item"
173                href="../game/hockey"
174                title="Score the puck on the opponent goal"
175              >Hockey
176                <span class="badge text-bg-secondary">TODO</span>
177              </a>
178            </li>
179            <li class="dropdown-divider"></li>
180            <li class="dropdown-header">Turn-Based Multiplayer</li>
181            <li>
182              <a class="dropdown-item"
183                href="../game/actionless"
184                title="Random winners, do no action"
185              >Actionless
186              </a>
187            </li>
188            <li>
189              <a class="dropdown-item"
190                href="../game/morra"
191                title="Pick a number, sum determines winner"
192              >Morra
193              </a>
194            </li>
195            <li>
196              <a class="dropdown-item"
197                href="../game/rps"
198                title="Pick a group"
199              >Rock Paper Scissors
200              </a>
201            </li>
202            <li>
203              <a class="dropdown-item"
204                href="../game/blackjack"
205                title="Get close to 21, but not over."
206              >Blackjack
207                <span class="badge text-bg-success">NEW</span>
208              </a>
209            </li>
210            <li>
211              <a class="dropdown-item"
212                href="../game/cribbage"
213                title="Matching card game for 2-4 players."
214              >Cribbage
215                <span class="badge text-bg-success">NEW</span>
216              </a>
217            </li>
218            <li>
219              <a class="dropdown-item"
220                href="../game/cheat"
221                title="Shed cards, possibly dishonestly."
222              >Cheat
223              </a>
224            </li>
225            <li>
226              <a class="dropdown-item"
227                href="../game/president"
228                title="Shed your cards first to be the President!"
229              >President
230              </a>
231            </li>
232            <li>
233              <a class="dropdown-item"
234                href="../game/discard"
235                title="Isomorphism of Love Letter"
236              >Discard
237              </a>
238            </li>
239            <li>
240              <a class="dropdown-item"
241                href="../game/t3_multi"
242                title="Get 3 in a line to win!"
243              >Tic-Tac-Toe
244              </a>
245            </li>
246            <li>
247              <a class="dropdown-item"
248                href="../game/ut3"
249                title="Win small boards to win the big board."
250              >Ultimate Tic-Tac-Toe
251              </a>
252            </li>
253          </ul>
254        </li>
255        <li class="nav-item dropdown">
256          <a class="nav-link dropdown-toggle" href="#nav/tools" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Tools</a>
257          <ul class="dropdown-menu" role="menu"><li><a class="dropdown-item" href="../tools/">List</a></li>
258            <li class="dropdown-divider"></li>
259            <li>
260              <a class="dropdown-item"
261                href="../tools/ip"
262                title="See your IP address"
263              >IP Address
264              </a>
265            </li>
266            <li>
267              <a class="dropdown-item"
268                href="../tools/ping"
269                title="Check your ping for HTTP requests"
270              >Ping
271              </a>
272            </li>
273            <li class="dropdown-divider"></li>
274            <li>
275              <a class="dropdown-item"
276                href="../tools/base"
277                title="Convert between bases 2 to 36"
278              >Base Converter
279              </a>
280            </li>
281            <li>
282              <a class="dropdown-item"
283                href="../tools/gcd"
284              >GCD/LCM Calculator
285              </a>
286            </li>
287            <li>
288              <a class="dropdown-item"
289                href="../tools/unit"
290              >Unit Converter
291              </a>
292            </li>
293            <li>
294              <a class="dropdown-item"
295                href="../tools/freq"
296                title="Measure frequency, like heart rate"
297              >Frequency
298              </a>
299            </li>
300            <li>
301              <a class="dropdown-item"
302                href="../tools/letter_count"
303                title="Count letter frequency in text"
304              >Letter Counter
305              </a>
306            </li>
307            <li>
308              <a class="dropdown-item"
309                href="../tools/encrypt"
310                title="Old encryption tools"
311              >Encryption Tools
312              </a>
313            </li>
314            <li>
315              <a class="dropdown-item"
316                href="../tools/time"
317                title="It's later than you think!"
318              >Time Perception
319              </a>
320            </li>
321            <li>
322              <a class="dropdown-item"
323                href="../tools/match_win"
324                title="Calculate the probability of winning first-to-n/best-of-(2n-1)"
325              >Match Win Calculator
326              </a>
327            </li>
328            <li>
329              <a class="dropdown-item"
330                href="../tools/fund_compare"
331                title="Compare outcomes of holding funds"
332              >Fund Comparison
333              </a>
334            </li>
335          </ul>
336        </li>
337        <li class="nav-item dropdown">
338          <a class="nav-link dropdown-toggle" href="#nav/misc" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Misc</a>
339          <ul class="dropdown-menu" role="menu"><li><a class="dropdown-item" href="../misc/">List</a></li>
340            <li class="dropdown-divider"></li>
341            <li>
342              <a class="dropdown-item"
343                href="../misc/dl"
344                title="file browser/directory listing of old binary files"
345              >Downloads
346              </a>
347            </li>
348            <li>
349              <a class="dropdown-item"
350                href="../misc/path"
351                title="Do you wonder how this site is configured?"
352              >Path
353              </a>
354            </li>
355            <li>
356              <a class="dropdown-item active"
357                href="../blog/"
358                title="my old blog"
359              >Old Blog
360              </a>
361            </li>
362            <li class="dropdown-divider"></li>
363            <li>
364              <a class="dropdown-item"
365                href="../xkcd_map/"
366                title="an improved way to view the xkcd-1110 webcomic"
367              >XKCD #1110 Map
368                <span class="badge text-bg-primary">⛶</span>
369              </a>
370            </li>
371            <li>
372              <a class="dropdown-item"
373                href="../misc/ggroups"
374                title="view chat text in ggroups.exe of SUPERHOT"
375              >ggroups.exe
376              </a>
377            </li>
378            <li>
379              <a class="dropdown-item"
380                href="../misc/orbs"
381                title="view orbits in orbs.it"
382              >Orbs Viewer
383              </a>
384            </li>
385            <li>
386              <a class="dropdown-item"
387                href="../misc/starblast_mods"
388                title="view scrollable starblast.io schedule"
389              >Starblast Mods Schedule
390              </a>
391            </li>
392            <li>
393              <a class="dropdown-item"
394                href="../misc/starblast_upgrade"
395                title="view optimal starblast.io ship upgrades"
396              >Starblast Upgrade Optimizer
397              </a>
398            </li>
399            <li class="dropdown-divider"></li>
400            <li>
401              <a class="dropdown-item"
402                href="../misc/3d/"
403                title="Autodesk 3DS Max primitive and sample cloud renderings!"
404              >3D
405              </a>
406            </li>
407            <li>
408              <a class="dropdown-item"
409                href="../misc/ads"
410                title="Some advertisements&hellip;"
411              >Ads
412              </a>
413            </li>
414            <li>
415              <a class="dropdown-item"
416                href="../misc/calc"
417                title="Simulate a basic calculator."
418              >Basic Calculator
419              </a>
420            </li>
421            <li>
422              <a class="dropdown-item"
423                href="../misc/compound"
424                title="Plot a graph of compound interest."
425              >Compound Interest
426              </a>
427            </li>
428            <li>
429              <a class="dropdown-item"
430                href="../misc/music"
431                title="These pieces of &ldquo;music&rdquo; are more like noise."
432              >Music
433              </a>
434            </li>
435            <li>
436              <a class="dropdown-item"
437                href="../misc/rndvid"
438                title="Watch random pixels"
439              >Random Video
440              </a>
441            </li>
442            <li>
443              <a class="dropdown-item"
444                href="../misc/redirect"
445                title="Follow endless redirections! It never ends!"
446              >Redirect Loop (Endless)
447              </a>
448            </li>
449            <li>
450              <a class="dropdown-item"
451                href="../misc/streamdl"
452                title="Download faster than your internet speed!"
453              >Fast Infinite Downloads
454              </a>
455            </li>
456            <li>
457              <a class="dropdown-item"
458                href="../misc/strobe"
459                title="Strobe lights (stroboscopic lamps) flash light between black and white."
460              >Strobe (Seizure Generator)
461              </a>
462            </li>
463            <li>
464              <a class="dropdown-item"
465                href="http://seizure.victorz.ca"
466                target="_blank"
467                title="This subdomain points to the seizure servers hosted by the U.S. Immigration and Customs Enforcement."
468              >Seizure Domain
469              <span class="badge text-bg-info">&#8599;</span>
470              </a>
471            </li>
472            <li class="dropdown-divider"></li>
473            <li class="dropdown-header">Jokes</li>
474            <li>
475              <a class="dropdown-item"
476                href="../misc/jokes/iq"
477                title="2-question IQ test"
478              >IQ Test
479              </a>
480            </li>
481            <li>
482              <a class="dropdown-item"
483                href="../misc/coding"
484                title="Practice on the most popular programming contest practice site!"
485              >Coding Contest
486              </a>
487            </li>
488            <li>
489              <a class="dropdown-item"
490                href="../misc/jokes/"
491                title="Some old jokes from ~2006-2007&hellip;"
492              >Old Jokes
493              </a>
494            </li>
495          </ul>
496        </li>
497        <li class="nav-item dropdown">
498          <a class="nav-link dropdown-toggle" href="#nav/bots" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Bots</a>
499          <ul class="dropdown-menu" role="menu"><li><a class="dropdown-item" href="../bots/">List</a></li>
500            <li class="dropdown-divider"></li>
501            <li>
502              <a class="dropdown-item"
503                href="../bots/poke"
504                title="See the leaderboard of people who poke a bot that returned pokes automatically"
505              >Facebook Poke
506              </a>
507            </li>
508            <li class="dropdown-divider"></li>
509            <li class="dropdown-header">Twitter</li>
510            <li>
511              <a class="dropdown-item"
512                href="../bots/grammar"
513                title="@_grammar_ corrects users' grammar. It was suspended many times."
514              >Grammar
515              </a>
516            </li>
517            <li>
518              <a class="dropdown-item"
519                href="../bots/random"
520                title="This bot spews a stream of random words."
521              >Random Words
522              </a>
523            </li>
524            <li>
525              <a class="dropdown-item"
526                href="../bots/recent"
527                title="@recentideas learns to tweet from recent tweets."
528              >Recent Ideas
529              </a>
530            </li>
531            <li>
532              <a class="dropdown-item"
533                href="../bots/prose"
534                title="@prosegen generates sentences from a grammar."
535              >Prose
536              </a>
537            </li>
538            <li>
539              <a class="dropdown-item"
540                href="../bots/googuns"
541                title="@googuns_lulz is like other @googuns_ accounts, yet very different."
542              >GooGuns Lulz
543              </a>
544            </li>
545            <li>
546              <a class="dropdown-item"
547                href="../bots/bing_tomorrow"
548                title="@BingTomorrow can see the future! It can predict Bing's homepage image for tomorrow."
549              >Bing Tomorrow
550              </a>
551            </li>
552            <li>
553              <a class="dropdown-item"
554                href="../bots/spelling"
555                title="@Bot_Dictionary corrects users' spelling. Its output rate from random searches is quite low."
556              >Spelling
557              </a>
558            </li>
559          </ul>
560        </li>
561      </ul>
562      <ul class="navbar-nav">
563        <li class="nav-item"><a class="nav-link" href="https://github.com/vwww/dev/blob/main/docs/pages/blog/index.html">Edit</a></li>
564        <li class="nav-item dropdown">
565          <a href="#nav/theme" class="nav-link dropdown-toggle" data-bs-toggle="dropdown" role="button" aria-expanded="false">Theme</a>
566          <ul class="dropdown-menu" role="menu">
567            <li><a href="../site/theme" class="dropdown-item">Theme Switcher</a></li>
568            <li class="dropdown-divider"></li>
569            <li id="theme-switcher-msg" class="bg-danger">
570              <button class="dropdown-item disabled" id="theme-switcher-msg-text">Cannot save</button>
571            </li>
572            <li class="dropdown-divider"></li>
573            <li><button class="dropdown-item theme-switcher" data-theme="bootstrap">Bootstrap</button></li>
574            <li><button class="dropdown-item theme-switcher active" data-theme="bootstrap2">Bootstrap Theme</button></li>
575            <li class="dropdown-divider"></li>
576            <li class="dropdown-header">Bootswatch</li>
577            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-brite" title="Neobrutalist form">Brite</button></li>
578            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-cerulean" title="A calm blue sky">Cerulean</button></li>
579            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-cosmo" title="An ode to Metro">Cosmo</button></li>
580            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-cyborg" title="Jet black and electric blue">Cyborg</button></li>
581            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-darkly" title="Flatly in night mode">Darkly</button></li>
582            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-flatly" title="Flat and modern">Flatly</button></li>
583            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-journal" title="Crisp like a new sheet of paper">Journal</button></li>
584            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-litera" title="The medium is the message">Litera</button></li>
585            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-lumen" title="Light and shadow">Lumen</button></li>
586            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-lux" title="A touch of class">Lux</button></li>
587            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-materia" title="Material is the metaphor">Materia</button></li>
588            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-minty" title="A fresh feel">Minty</button></li>
589            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-morph" title="A neumorphic layer">Morph</button></li>
590            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-pulse" title="A trace of purple">Pulse</button></li>
591            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-quartz" title="A glassmorphic layer">Quartz</button></li>
592            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-sandstone" title="A touch of warmth">Sandstone</button></li>
593            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-simplex" title="Mini and minimalist">Simplex</button></li>
594            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-sketchy" title="A hand-drawn look for mockups and mirth">Sketchy</button></li>
595            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-slate" title="Shades of gunmetal gray">Slate</button></li>
596            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-solar" title="A spin on Solarized">Solar</button></li>
597            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-spacelab" title="Silvery and sleek">Spacelab</button></li>
598            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-superhero" title="The brave and the blue">Superhero</button></li>
599            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-united" title="Ubuntu orange and unique font">United</button></li>
600            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-vapor" title="A cyberpunk aesthetic">Vapor</button></li>
601            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-yeti" title="A friendly foundation">Yeti</button></li>
602            <li><button class="dropdown-item theme-switcher" data-theme="bootswatch-zephyr" title="Breez
602y and beautiful">Zephyr</button></li>
603          </ul>
604        </li>
605
606        <li id="april-fools-joke-menu" class="dropdown d-none">
607          <a class="nav-link dropdown-toggle" href="#nav/language" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Language <span class="badge text-bg-warning">NEW</span></a>
608          <ul class="dropdown-menu" role="menu">
609            <li class="dropdown-header">10 languages</li>
610            <li><button class="dropdown-item" onclick="return false">English</button></li>
611            <li><button class="dropdown-item" onclick="return false">English</button></li>
612            <li><button class="dropdown-item" onclick="return false">English</button></li>
613            <li><button class="dropdown-item" onclick="return false">English</button></li>
614            <li><button class="dropdown-item" onclick="return false">English</button></li>
615            <li><button class="dropdown-item" onclick="return false">English</button></li>
616            <li><button class="dropdown-item" onclick="return false">English</button></li>
617            <li><button class="dropdown-item" onclick="return false">English</button></li>
618            <li><button class="dropdown-item" onclick="return false">English</button></li>
619            <li><button class="dropdown-item" onclick="return false">English</button></li>
620            <li class="dropdown-divider"></li>
621            <li class="dropdown-header">April Fools!</li>
622          </ul>
623        </li>
624
625        <li class="dropdown">
626          <a class="nav-link dropdown-toggle" href="#nav/mirror" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Mirror</a>
627          <ul class="dropdown-menu" role="menu" id="mirror-list">
628            <li><a class="dropdown-item" href="https://victorz.ca/blog/" rel="nofollow">victorz.ca</a></li>
629            <li><a class="dropdown-item" href="https://vwww.github.io/blog/" rel="nofollow">vwww.github.io</a></li>
630            <li><a class="dropdown-item" href="https://vwww.pages.dev/blog/" rel="nofollow">vwww.pages.dev</a></li>
631            <li><a class="dropdown-item" href="https://v-z.pages.dev/blog/" rel="nofollow">v-z.pages.dev</a></li>
632          </ul>
633        </li>
634      </ul>
635    </div>
636  </div>
637</nav>
638
639
640    <main class="flex-shrink-0 my-3">
641      <div class="container">
642        <nav aria-label="breadcrumb">
643  <ol class="breadcrumb">
644    <li class="breadcrumb-item"><a href="..">Home</a></li>
645    <li class="breadcrumb-item active" aria-current="page">Blog</li>
646  </ol>
647</nav>
648
649<!-- TODO: find new ad provider -->
650<!-- 
650<script src="//d.victorz.ca/a/main_head"></script>
650 -->
651
652<div class="page-header">
653  <h1>Blog</h1>
654  <hr class="my-3">
655</div>
656
657
658<div class="alert alert-warning" role="alert">
659	These blog posts will eventually be integrated with the rest of the site.
660	With infrequent updates, the <a href="atom.xml">Atom 1.0</a> and <a href="rss.xml">RSS 2.0</a> feeds are less useful.
661	My <a href="software">list of software tools</a> from 2013 is becoming increasingly outdated.
662</div>
663
664<form action="https://encrypted.google.com/search" method="get">
665	<input type="hidden" name="sitesearch" value="victorz.ca/blog">
666	<div class="input-group mb-3">
667		<span class="input-group-text">Search for</span>
668		<input type="text" name="q" class="form-control" placeholder="all of these keywords">
669		<input type="text" name="as_oq" class="form-control" placeholder="any of these keywords">
670		<input type="text" name="as_eq" class="form-control" placeholder="none of these keywords">
671		<button class="btn btn-outline-secondary" type="submit">Go!</button>
672	</div>
673</form>
674
675
676<div class="btn-group mb-3 d-flex">
677	<span class="input-group-text">View</span>
678	<a class="btn btn-outline-primary w-100 active" href="../blog">Excerpts by Pages</a>
679	<a class="btn btn-outline-primary w-100" href="../blog/archives">Titles by Year</a>
680	<a class="btn btn-outline-primary w-100" href="../blog/tags">Titles by Tags</a>
681</div>
682
683
684
685
686
687<nav class="mb-4 text-center">
688	
689	<span>Page 1 of 5</span>
690	<a href="/blog/page/2/" class="btn btn-outline-primary float-end">Next</a>
691</nav>
692
693
694<div class="card mb-3">
695	<div class="card-body">
696		<h5 class="card-title"><a href="/blog/2014/07/zeno-bounce">Zeno's Paradox for a Bouncing Ball</a></h5>
697		<h6 class="card-subtitle mb-2 text-muted">2014 Jul 13 01:42 AM UTC | 
698<a href="../blog/tags#Math" class="badge text-bg-secondary"><strong>Math</strong><sup>7</sup></a>
699<a href="../blog/archives#2014" class="badge text-bg-secondary">[2014]<sup>3</sup></a>
700 | Estimated 1-min read
701		</h6>
702		<p>If a ball is thrown up to a height $h$, falls to the ground, and retains a certain fraction $a$ of its energy when it bounces, it will stop bouncing after a certain amount of time. This is paradoxical as it will have bounced an infinite number of times when it stops.</p>
703
704		<a class="card-link" href="/blog/2014/07/zeno-bounce">Read more&hellip;</a>
705	</div>
706</div>
707<div class="card mb-3">
708	<div class="card-body">
709		<h5 class="card-title"><a href="/blog/2014/03/uniform-tweets">Uniformly Distributed Tweets</a></h5>
710		<h6 class="card-subtitle mb-2 text-muted">2014 Mar 22 01:49 AM UTC | 
711<a href="../blog/tags#Math" class="badge text-bg-secondary">Math<sup>7</sup></a>
712<a href="../blog/tags#Programming" class="badge text-bg-secondary"><strong>Programming</strong><sup>18</sup></a>
713<a href="../blog/archives#2014" class="badge text-bg-secondary">[2014]<sup>3</sup></a>
714 | Estimated 1-min read
715		</h6>
716		<p>For <a href="https://victorz.ca/bots/grammar">my Grammar bot</a>, I added a new feature: <mark>GPS coordinates are added to the tweets</mark>. This is <mark>just for fun</mark> and serves no practical purpose.</p>
717<p>However, I wanted the tweets to be <mark>uniformly distributed over a sphere</mark>. Earth’s shape is not a sphere, but the error is under 1%.</p>
718<p>$a$ and $b$ are random values uniformly distributed in $[-1,1]$
719$$latitude=\theta=\sin^{-1}(u)$$<br>
720$$longitude=\phi=\pi v=(180^{\circ}) v$$</p>
721
722		<a class="card-link" href="/blog/2014/03/uniform-tweets">Read more&hellip;</a>
723	</div>
724</div>
725<div class="card mb-3">
726	<div class="card-body">
727		<h5 class="card-title"><a href="/blog/2014/03/buffalo">Buffalo buffalo ...</a></h5>
728		<h6 class="card-subtitle mb-2 text-muted">2014 Mar 6 11:06 PM UTC | 
729<a href="../blog/tags#English" class="badge text-bg-secondary">English<sup>5</sup></a>
730<a href="../blog/tags#Grammar" class="badge text-bg-secondary"><strong>Grammar</strong><sup>4</sup></a>
731<a href="../blog/tags#Math" class="badge text-bg-secondary">Math<sup>7</sup></a>
732<a href="../blog/archives#2014" class="badge text-bg-secondary">[2014]<sup>3</sup></a>
733 | Estimated 3-min read
734		</h6>
735		<p>Although I have already proven that <mark>a repetition of the word ‘buffalo’ $n$ times is grammatically correct</mark>, if $n \geq 2$, a year ago, I am now publishing this finding.</p>
736<ul>
737<li>
737‘buffalo’ is a <mark>plural noun, allowing the use of zero articles</mark></li>
738<li>‘buffalo’ is <mark>also a verb</mark> that means to bully, confuse, deceive, or intimidate</li>
739</ul>
740<p>Theorem:</p>
741<blockquote>
742<p><mark>Repeating $n$ times, where $n \geq 2$, any word that can be a noun or verb forms a grammatically valid sentence.</mark></p>
743</blockquote>
744<p>Proof:</p>
745
746		<a class="card-link" href="/blog/2014/03/buffalo">Read more&hellip;</a>
747	</div>
748</div>
749<div class="card mb-3">
750	<div class="card-body">
751		<h5 class="card-title"><a href="/blog/2013/09/partially-protect-password-transit">Partially Protecting Password Data in Transit</a></h5>
752		<h6 class="card-subtitle mb-2 text-muted">2013 Sep 28 02:39 AM UTC | 
753<a href="../blog/tags#Security" class="badge text-bg-secondary"><strong>Security</strong><sup>2</sup></a>
754<a href="../blog/tags#Web" class="badge text-bg-secondary">Web<sup>13</sup></a>
755<a href="../blog/archives#2013" class="badge text-bg-secondary">[2013]<sup>10</sup></a>
756 | Estimated 2-min read
757		</h6>
758		<p><mark><strong>HTTP does not encrypt</strong> any traffic</mark>. Any of the <mark><strong>internet routers</strong> can see and log your traffic</mark>, and your passwords might be compromised if the server does nothing to alleviate this.</p>
759<p>On my arcade, my login form requires JavaScript to be more secure, but it is not perfectly secure.</p>
760<div class="img-left">
761<img src="../../../assets/victorz/blog_images/2013/PasswordMessageHash1.png" width="400" alt="" />
762<span class="caption">A diagram of the first transmission, <mark><strong>unprotected</strong> from interception</mark></span>
763</div>
764<p>The <mark><strong>first transmission of the password might be intercepted, which is a vulnerability</strong> of this method</mark>.</p>
765
766		<a class="card-link" href="/blog/2013/09/partially-protect-password-transit">Read more&hellip;</a>
767	</div>
768</div>
769<div class="card mb-3">
770	<div class="card-body">
771		<h5 class="card-title"><a href="/blog/2013/08/python-goto-decorator">Python Goto Decorator Improved</a></h5>
772		<h6 class="card-subtitle mb-2 text-muted">2013 Aug 13 11:15 PM UTC | 
773<a href="../blog/tags#Programming" class="badge text-bg-secondary"><strong>Programming</strong><sup>18</sup></a>
774<a href="../blog/tags#Python" class="badge text-bg-secondary">Python<sup>4</sup></a>
775<a href="../blog/archives#2013" class="badge text-bg-secondary">[2013]<sup>10</sup></a>
776 | Estimated 12-min read
777		</h6>
778		<p>When I found <a href="https://code.activestate.com/recipes/576944-the-goto-decorator/">a <mark>nice hack to get GOTO statements</mark> in Python</a>, I decided to <mark>make my own version</mark> of it. It has been <mark>tested on Python 2.7 but probably also works in Python 3</mark>.</p>
779<p>To use it, <mark>import goto from goto</mark> and <mark>use the <code>@goto</code> decorator</mark>:</p>
780<pre class="language-py" tabindex="0" data-language="py"><code class="language-py"><span class="token keyword">from</span> goto <span class="token keyword">import</span> goto
781<span class="token decorator annotation punctuation">@goto</span>
782<span class="token keyword">def</span> <span class="token function">test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
783  goto <span class="token punctuation">.</span>end
784  <span class="token keyword">return</span> <span class="token boolean">False</span>
785  label <span class="token punctuation">.</span>end
786  <span class="token keyword">return</span> <span class="token boolean">True</span>
787<span class="token keyword">print</span> test<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># should be True</span></code></pre>
788<p>But first, you’ll need this code:</p>
789<p>goto.py</p>
790
791		<a class="card-link" href="/blog/2013/08/python-goto-decorator">Read more&hellip;</a>
792	</div>
793</div>
794<div class="card mb-3">
795	<div class="card-body">
796		<h5 class="card-title"><a href="/blog/2013/08/your_grammar-rewrite">Rewriting the Grammar Bot</a></h5>
797		<h6 class="card-subtitle mb-2 text-muted">2013 Aug 8 06:53 PM UTC | 
798<a href="../blog/tags#English" class="badge text-bg-secondary">English<sup>5</sup></a>
799<a href="../blog/tags#Grammar" class="badge text-bg-secondary">Grammar<sup>4</sup></a>
800<a href="../blog/tags#Programming" class="badge text-bg-secondary"><strong>Programming</strong><sup>18</sup></a>
801<a href="../blog/tags#Python" class="badge text-bg-secondary">Python<sup>4</sup></a>
802<a href="../blog/tags#Web" class="badge text-bg-secondary">Web<sup>13</sup></a>
803<a href="../blog/archives#2013" class="badge text-bg-secondary">[2013]<sup>10</sup></a>
804 | Estimated 3-min read
805		</h6>
806		<p>I have rewritten <a href="https://victorz.ca/bots/grammar">my Grammar bot</a>. Previously, it had used <mark>regular expressions</mark> to find errors, which means that it must check every character against the rules. In addition, <mark>Python 2.7 doesn’t support variable-length lookbehinds</mark>, which <mark>adds extra regular expression checks</mark> for some rules. Also, <mark>it cannot provide good quotes if there is an overlap</mark> between two matches.</p>
807
808		<a class="card-link" href="/blog/2013/08/your_grammar-rewrite">Read more&hellip;</a>
809	</div>
810</div>
811<div class="card mb-3">
812	<div class="card-body">
813		<h5 class="card-title"><a href="/blog/2013/07/hack-flash-as3-crypt">Hacking a Flash Payload Crypter with 1 line of code</a></h5>
814		<h6 class="card-subtitle mb-2 text-muted">2013 Jul 23 05:08 PM UTC | 
815<a href="../blog/tags#ActionScript" class="badge text-bg-secondary">ActionScript<sup>2</sup></a>
816<a href="../blog/tags#ActionScript-3" class="badge text-bg-secondary">ActionScript-3<sup>1</sup></a>
817<a href="../blog/tags#Assembly" class="badge text-bg-secondary">Assembly<sup>2</sup></a>
818<a href="../blog/tags#Flash" class="badge text-bg-secondary">Flash<sup>2</sup></a>
819<a href="../blog/tags#Hacks" class="badge text-bg-secondary"><strong>Hacks</strong><sup>9</sup></a>
820<a href="../blog/tags#Security" class="badge text-bg-secondary">Security<sup>2</sup></a>
821<a href="../blog/tags#Web" class="badge text-bg-secondary">Web<sup>13</sup></a>
822<a href="../blog/archives#2013" class="badge text-bg-secondary">[2013]<sup>10</sup></a>
823 | Estimated 2-min read
824		</h6>
825		<p>If the flash file puts everything into a binary section and encrypts it, is there any way to decrypt it? If <mark>they cut off the header, you won’t be able to memory-dump it</mark>, but would you give up there? Of course not!</p>
826<p>Somewhere, <mark>they have the decrypted data so that they can load it</mark>. Just compile some code to <mark>intercept it</mark>, and inject it:</p>
827<pre class="language-as3" tabindex="0" data-language="as3"><code class="language-as3">(new FileReference()).save(_loc_2, "dumped.swf");</code></pre>
828<p>In RABCDAsm (AS3), it looks like this:</p>
829<pre class="language-nasm" tabindex="0" data-language="nasm"><code class="language-nasm">findpropstrict      QName(PackageNamespace(<span class="token string">"flash.net"</span>), <span class="token string">"FileReference"</span>)
830constructprop       QName(PackageNamespace(<span class="token string">"flash.net"</span>), <span class="token string">"FileReference"</span>), <span class="token number">0</span>
831getlocal2
832pushstring          <span class="token string">"dumped.swf"</span>
833callpropvoid        QName(PackageNamespace(<span class="token string">""</span>), <span class="token string">"save"</span>), <span class="token number">2</span></code></pre>
834<p>So just <mark>put that in the code before it is loaded (call to <code>loadBytes</code>) and replace <code>getlocal2</code></mark> with whatever will put the decrypted data onto the stack. <mark>Once the decrypted data is about to be loaded, you can save it to a file</mark>.</p>
835<p>In <mark>AS2, you’d have to create a server script to echo the file back with FileReference</mark>, since it only accepts URL downloads. It’s <mark>still feasible</mark> though, but <mark>writing to a SharedObject and extracting from that</mark> might be easier.</p>
836<p>In retrospection, I realized that <mark>I can also write a fake header</mark> if I manage to locate the flash data.</p>
837
838	</div>
839</div>
840<div class="card mb-3">
841	<div class="card-body">
842		<h5 class="card-title"><a href="/blog/2013/07/as2-bytecode">Flasm (ActionScript 2) Bytecode Equivalents</a></h5>
843		<h6 class="card-subtitle mb-2 text-muted">2013 Jul 20 12:55 AM UTC | 
844<a href="../blog/tags#ActionScript" class="badge text-bg-secondary">ActionScript<sup>2</sup></a>
845<a href="../blog/tags#ActionScript-2" class="badge text-bg-secondary">ActionScript-2<sup>1</sup></a>
846<a href="../blog/tags#Assembly" class="badge text-bg-secondary">Assembly<sup>2</sup></a>
847<a href="../blog/tags#Flash" class="badge text-bg-secondary">Flash<sup>2</sup></a>
848<a href="../blog/tags#Programming" class="badge text-bg-secondary"><strong>Programming</strong><sup>18</sup></a>
849<a href="../blog/tags#Web" class="badge text-bg-secondary">Web<sup>13</sup></a>
850<a href="../blog/archives#2013" class="badge text-bg-secondary">[2013]<sup>10</sup></a>
851 | Estimated 3-min read
852		</h6>
853		<p><mark><a href="https://nowrap.de/flasm">Flasm</a> allows people to disassemble flash files (.swf) into human-readable bytecode</mark>. I have discovered some of the <mark>Flash compiler techniques and other interesting things</mark>.</p>
854<p>ActionScript // Flasm</p>
855<pre class="language-as3" tabindex="0" data-language="as3"><code class="language-as3">Number.POSITIVE_INFINITY // POSITIVE_INFINITY or POSITIVE_INFINITYF
856Number.NAN // _NAN or _NANF
857return; // push UNDEF / return
858trace(x) // push x / trace
859// operators: push a / push b / [op]
860| // bitwiseOr
861^ // bitwiseXor
862& // bitwiseAnd
863<< // shiftLeft
864>> // shiftRight
865+ // add
866- // subtract
867* // multiply
868/ // divide
869% // modulo</code></pre>
870<p>What I find <mark>the most interesting is how it compiles logical expressions</mark>:</p>
871
872		<a class="card-link" href="/blog/2013/07/as2-bytecode">Read more&hellip;</a>
873	</div>
874</div>
875
876
877
878<nav class="mb-4 text-center">
879	
880	<span>Page 1 of 5</span>
881	<a href="/blog/page/2/" class="btn btn-outline-primary float-end">Next</a>
882</nav>
883
884
885
886
887
888<!-- TODO: find new ad provider -->
889<!-- 
889<script src="//d.victorz.ca/a/main_foot"></script>
889 -->
890
891
892      </div>
893    </main>
894
895    <footer class="footer mt-auto py-3 text-bg-light">
896      <div class="container">
897        <div class="mb-2">
898          &copy; 2005-<span id="copyyear">2026</span> Victor Zheng. All rights reserved.
899            <div class="badge-group me-2" title="This page was created on Sunday, 2009 March 01 at 04:00 PM UTC">
900              <span class="badge text-bg-secondary">Created</span>
901              <span class="timeago badge text-bg-primary" title="2009-03-01 16:00:00 +0000"></span>
902            </div>
903            <div class="badge-group me-2" title="This page was modified on Tuesday, 2019 October 01 at 02:12 AM UTC">
904              <span class="badge text-bg-secondary">Modified</span>
905              <span class="timeago badge text-bg-primary" title="2019-10-01 02:12:00 +0000"></span>
906            </div>
907          The source code is licensed under the <a href="https://github.com/vwww/dev/blob/main/LICENSE.md" rel="nofollow">GPL v3</a>.
908        </div>
909        <div>
910          
910<script src="//d.victorz.ca/online.js?o=s"></script>
910
911
912          <a href=".."><img src="../assets/a/80-15.png" class="rounded" alt="Victor"></a>
913
914          <a href="https://validator.w3.org/check?uri=referer" referrerpolicy="unsafe-url" class="badge text-bg-primary" title="This site uses HTML5.">HTML5</a>
915
916          <a href="https://jigsaw.w3.org/css-validator/check/referer" referrerpolicy="unsafe-url" class="badge text-bg-primary" title="This site uses CSS.">CSS</a>
917
918          <div class="badge-group me-2" title="This site was last regenerated on Thursday, 2026 August 27 at 08:46 PM UTC">
919            <span class="badge text-bg-secondary">Regenerated</span>
920            <span class="timeago badge text-bg-primary" title="2026-08-27 20:46:14 +0000"></span>
921          </div>
922
923          <div class="badge-group me-2" title="This is how long it has been since my site started to exist.">
924            <span class="badge text-bg-dark">Site Age</span>
925            <span class="badge text-bg-light border"><strong id="uptime-years"></strong> (<b id="uptime-years-hex">many</b>) years</span>
926          </div>
927        </div>
928      </div>
929    </footer>
930
931    <!-- Scripts -->
932      
932<script src="../assets/dist/27.55a5593098.js"></script>
932
933      
933<script src="../assets/dist/88.374f5ac24a.js"></script>
933
934      
934<script src="../assets/dist/global.eb03e938f2.js"></script>
934
935    
935<script>
936      window.MathJax = {
937        tex: {
938          inlineMath: [['$', '$'], ['\\(', '\\)']]
939        }
940      }
941    </script>
941
942    
942<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js" integrity="sha384-M5jmNxKC9EVnuqeMwRHvFuYUE8Hhp0TgBruj/GZRkYtiMrCRgH7yvv5KY+Owi7TW" crossorigin="anonymous"></script>
942
943    <!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 943-944
943
944<script async src="https://www.googletagmanager.com/gtag/js?id=
944G-0BP2YLW17T
vendor: 12 bytes, line 944
944"></script>
945<script>
946  
vendor: 134 bytes, lines 946-950
946window.dataLayer = window.dataLayer || [];
947  function gtag(){dataLayer.push(arguments);}
948  gtag('js', new Date());
949
950  gtag('config', '
950G-0BP2YLW17T
vendor: 4 bytes, line 950
950');
951</script>
951
952
953<!-- Cloudflare Web Analytics -->
vendor: 100 bytes, lines 953-954
953
954<script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "
954b9f69fff6f404209a5c854844ad49d0b
vendor: 14 bytes, line 954
954"}'></script>
955<!-- End Cloudflare Web Analytics -->
956
957  </body>
958</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.