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 – Victor‘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">↗</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">↗</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">↗</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…" 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 “music” 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">↗</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…" 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…</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…</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…</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…</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…</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…</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…</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 © 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.