[{"data":1,"prerenderedAt":2302},["ShallowReactive",2],{"notes-to-self-slugs":3,"posts":364},[4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289,292,295,298,301,304,307,310,313,316,319,322,325,328,331,334,337,340,343,346,349,352,355,358,361],{"title":5,"slug":6},"3D Math/Graphics","3d-mathgraphics",{"title":8,"slug":9},"3d modeling tools and resources","3d-modeling-tools-and-resources",{"title":11,"slug":12},"3D Printing","3d-printing",{"title":14,"slug":15},"A Mathematical Expression Parser in TypeScript","a-mathematical-expression-parser-in-typescript",{"title":17,"slug":18},"Ad Hoc","ad-hoc",{"title":20,"slug":21},"AI: ChatGPT and the Nature of Intelligence","ai-chatgpt-and-the-nature-of-intelligence",{"title":23,"slug":24},"Apple ][ Stuff","apple-stuff",{"title":26,"slug":27},"Art You Like","art-you-like",{"title":29,"slug":30},"Artists","artists",{"title":32,"slug":33},"Big O (AKA Big Oh) notation","big-o-aka-big-oh-notation",{"title":35,"slug":36},"Big O Cheat Sheet","big-o-cheat-sheet",{"title":38,"slug":39},"Blender","blender",{"title":41,"slug":42},"Books about Business, Process","books-about-business-process",{"title":44,"slug":45},"Break a Concave Shape into Multiple Convex Shapes","break-a-concave-shape-into-multiple-convex-shapes",{"title":47,"slug":48},"C++","c",{"title":50,"slug":51},"C Template Library","c-template-library",{"title":53,"slug":54},"CMS","cms",{"title":56,"slug":57},"Color Tools","color-tools",{"title":59,"slug":60},"CSS: Flex, a Great Explanation","css-flex-a-great-explanation",{"title":62,"slug":63},"CSS - Line Height Unit","css-line-height-unit",{"title":65,"slug":66},"Data Editor","data-editor",{"title":68,"slug":69},"Data transformation tool","data-transformation-tool",{"title":71,"slug":72},"Deep Learning","deep-learning",{"title":74,"slug":75},"Do a Circle and a Line Intersect?","do-a-circle-and-a-line-intersect",{"title":77,"slug":78},"Dungeon Deep/Wicked Engine","dungeon-deepwicked-engine",{"title":80,"slug":81},"Electric Car","electric-car",{"title":83,"slug":84},"Fast Pseudo-random number generator","fast-pseudo-random-number-generator",{"title":86,"slug":87},"Fermi’s Paradox, the Drake Equation, and All That","fermis-paradox-the-drake-equation-and-all-that",{"title":89,"slug":90},"Fonts","fonts",{"title":92,"slug":93},"Frameworks and Libraries of Interest","frameworks-and-libraries-of-interest",{"title":95,"slug":96},"Game Dev","game-dev",{"title":98,"slug":99},"Game Idea - Lunar Lander + Motherload","game-idea-lunar-lander-motherload",{"title":101,"slug":102},"Git Cheat Sheet","git-cheat-sheet",{"title":104,"slug":105},"Godot Exploration","godot-exploration",{"title":107,"slug":108},"Google Apps for biggerplanet.com","google-apps-for-biggerplanetcom",{"title":110,"slug":111},"GUIs in Movies","guis-in-movies",{"title":113,"slug":114},"Guy Uses Blender for Classic 2001/Alien Greeble","guy-uses-blender-for-classic-2001alien-greeble",{"title":116,"slug":117},"HDHomerun Connect Duo","hdhomerun-connect-duo",{"title":119,"slug":120},"Heroku shutting down free tiers","heroku-shutting-down-free-tiers",{"title":122,"slug":123},"Home Improvement","home-improvement",{"title":125,"slug":126},"How to Promote Phone Game","how-to-promote-phone-game",{"title":128,"slug":129},"HTML Dialog Element","html-dialog-element",{"title":131,"slug":132},"Ice maker Repair","ice-maker-repair",{"title":134,"slug":135},"Illustrator => Affinity Designer","illustrator-affinity-designer",{"title":137,"slug":138},"Image, Picture, Visual Resources","image-picture-visual-resources",{"title":140,"slug":141},"Interactive Narrative Scripting Language","interactive-narrative-scripting-language",{"title":143,"slug":144},"Interview with Zachary Boerner, Branch Cut, TableRaven","interview-with-zachary-boerner-branch-cut-tableraven",{"title":146,"slug":147},"JavaScript crypto ","javascript-crypto",{"title":149,"slug":150},"Job search","job-search",{"title":152,"slug":153},"Jobs","jobs",{"title":155,"slug":156},"Keep macOS awake","keep-macos-awake",{"title":158,"slug":159},"Keyboards","keyboards",{"title":161,"slug":162},"Linear Interpolation (lerp)","linear-interpolation-lerp",{"title":164,"slug":165},"Lost Music","lost-music",{"title":167,"slug":168},"Making a Vue/Nuxt Module","making-a-vuenuxt-module",{"title":170,"slug":171},"Marketing","marketing",{"title":173,"slug":174},"Meta Tools","meta-tools",{"title":176,"slug":177},"Military Ranks","military-ranks",{"title":179,"slug":180},"Miscellaneous Digitized Manuscripts and Books for Source Material, Art","miscellaneous-digitized-manuscripts-and-books-for-source-material-art",{"title":182,"slug":183},"More ChatGPT","more-chatgpt",{"title":185,"slug":186},"Movies to Watch","movies-to-watch",{"title":188,"slug":189},"Music (for listening) and Movies/Shows to Watch","music-for-listening-and-moviesshows-to-watch",{"title":191,"slug":192},"Music (Learning, Playing)","music-learning-playing",{"title":194,"slug":195},"Music Resource","music-resource",{"title":197,"slug":198},"Mystery Theater","mystery-theater",{"title":200,"slug":201},"Numeric Input on Mobile","numeric-input-on-mobile",{"title":203,"slug":204},"Old Mac Emulation in Browser","old-mac-emulation-in-browser",{"title":206,"slug":207},"On \"Cancel Culture\"","on-cancel-culture",{"title":209,"slug":210},"On Optimism","on-optimism",{"title":212,"slug":213},"On Testing","on-testing",{"title":215,"slug":216},"Password/Passphrase Generator Idea","passwordpassphrase-generator-idea",{"title":218,"slug":219},"Patent Troll","patent-troll",{"title":221,"slug":222},"Plants","plants",{"title":224,"slug":225},"PlayKode Research","playkode-research",{"title":227,"slug":228},"Plots","plots",{"title":230,"slug":231},"Poetry, Inspirational ","poetry-inspirational",{"title":233,"slug":234},"Portable Screen/Monitor","portable-screenmonitor",{"title":236,"slug":237},"Procedural dungeon for rogue like","procedural-dungeon-for-rogue-like",{"title":239,"slug":240},"Products to Buy","products-to-buy",{"title":242,"slug":243},"Quest VR Floor Height Problem","quest-vr-floor-height-problem",{"title":245,"slug":246},"React","react",{"title":248,"slug":249},"Recipes/Techniques","recipestechniques",{"title":251,"slug":252},"Red Sea Navigation","red-sea-navigation",{"title":254,"slug":255},"Regex Tools","regex-tools",{"title":257,"slug":258},"Roche Brothers Wines","roche-brothers-wines",{"title":260,"slug":261},"Science to exploit and mangle for fiction","science-to-exploit-and-mangle-for-fiction",{"title":263,"slug":264},"SCP Tips","scp-tips",{"title":266,"slug":267},"SDL","sdl",{"title":269,"slug":270},"SETI Editorial: Probing for ETI's Probes in the Solar System","seti-editorial-probing-for-etis-probes-in-the-solar-system",{"title":272,"slug":273},"Setting up sublime to be like iA Writer","setting-up-sublime-to-be-like-ia-writer",{"title":275,"slug":276},"Shared Element Transition","shared-element-transition",{"title":278,"slug":279},"Simulation Hypothesis","simulation-hypothesis",{"title":281,"slug":282},"Solar","solar",{"title":284,"slug":285},"Songs to Sample","songs-to-sample",{"title":287,"slug":288},"Sound Effects","sound-effects",{"title":290,"slug":291},"SSH tips","ssh-tips",{"title":293,"slug":294},"Supabase","supabase",{"title":296,"slug":297},"SVG Tools","svg-tools",{"title":299,"slug":300},"SvS/NoS Reboot notes","svsnos-reboot-notes",{"title":302,"slug":303},"Swift Resources & Notes","swift-resources-notes",{"title":305,"slug":306},"The Original Spacewar!","the-original-spacewar",{"title":308,"slug":309},"The Snowflake Method For Designing A Novel","the-snowflake-method-for-designing-a-novel",{"title":311,"slug":312},"The Thirty-Seven Basic Dramatic Situations","the-thirty-seven-basic-dramatic-situations",{"title":314,"slug":315},"Three Magic Words","three-magic-words",{"title":317,"slug":318},"Three.js","threejs",{"title":320,"slug":321},"Tools & Books","tools-books",{"title":323,"slug":324},"Vector Rendering Engine (C++)","vector-rendering-engine-c",{"title":326,"slug":327},"VR","vr",{"title":329,"slug":330},"Vue 3, Nuxt, Nuxt Content, & TypeScript","vue-3-nuxt-nuxt-content-typescript",{"title":332,"slug":333},"Vue and Vue Adjacent","vue-and-vue-adjacent",{"title":335,"slug":336},"Web dev","web-dev",{"title":338,"slug":339},"WebAssembly (WASM)/Web Worker Notes","webassembly-wasmweb-worker-notes",{"title":341,"slug":342},"WebGPU","webgpu",{"title":344,"slug":345},"What God, Quantum Mechanics and Consciousness Have in Common","what-god-quantum-mechanics-and-consciousness-have-in-common",{"title":347,"slug":348},"what’s an entity component system?","whats-an-entity-component-system",{"title":350,"slug":351},"Whisper","whisper",{"title":353,"slug":354},"Whitelist websites for kid use of raspberry pi","whitelist-websites-for-kid-use-of-raspberry-pi",{"title":356,"slug":357},"Why You Will Marry the Wrong Person","why-you-will-marry-the-wrong-person",{"title":359,"slug":360},"Word order","word-order",{"title":362,"slug":363},"You are h…","you-are-h",[365,449,507,531,683,1813,1872,2216,2237,2267],{"_path":366,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":80,"description":370,"slug":81,"date":371,"dateString":372,"encrypted":368,"encryptedBody":373,"body":374,"_type":443,"_id":444,"_source":445,"_file":446,"_stem":447,"_extension":448},"/notes-to-self/electric-car","notes-to-self",false,"","Car and Driver on cost of ownership of EV vs gas",1594742400000,"2020.07.14",null,{"type":375,"children":376,"toc":440},"root",[377,391,396,401,406,411,416,430],{"type":378,"tag":379,"props":380,"children":381},"element","p",{},[382],{"type":378,"tag":383,"props":384,"children":388},"a",{"href":385,"rel":386},"https://www.caranddriver.com/shopping-advice/a32494027/ev-vs-gas-cheaper-to-own/",[387],"nofollow",[389],{"type":390,"value":370},"text",{"type":378,"tag":379,"props":392,"children":393},{},[394],{"type":390,"value":395},"Calculators include depreciation and interest on loan. With those, and the sub-average amount of driving you do, the cost of ownership of electric is unlikely to be lower than gas. But what if you intend to drive the car for 10 years and pay cash?",{"type":378,"tag":379,"props":397,"children":398},{},[399],{"type":390,"value":400},"It appears that Hyundai Kona has 10-year/100K mile electric battery warranty. Statements that the battery warranty is unlimited are false (may have once been true).",{"type":378,"tag":379,"props":402,"children":403},{},[404],{"type":390,"value":405},"Tesla's is 8 years/100K miles (for 3).",{"type":378,"tag":379,"props":407,"children":408},{},[409],{"type":390,"value":410},"Fanboys for both Kona and Tesla make it hard.",{"type":378,"tag":379,"props":412,"children":413},{},[414],{"type":390,"value":415},"Tesla 3 has standard \"autopilot\" (roughly adaptive cruise control) Kona does not - that option comes with \"ultimate\" trim ($45,400). That price is $1.6K below Tesla 3 \"Long Range\" which has 322 mile range and AWD (no Kona has AWD). That lack of cruise control is a dealbreaker for you.",{"type":378,"tag":379,"props":417,"children":418},{},[419,421,428],{"type":390,"value":420},"It appears more or less like a wash at best, with electric costing up to several thousands more at worst. ",{"type":378,"tag":383,"props":422,"children":425},{"href":423,"rel":424},"https://docs.google.com/spreadsheets/d/1fl5c4q-lnqxg9MmDoqMZpqftPuRyF4V1jU_gHAMMsWY/edit#gid=1853012159",[387],[426],{"type":390,"value":427},"This spreadsheet",{"type":390,"value":429}," includes resale value after 5 years; Teslas high resale value skews the cost of ownership in its favor — that is, if you aren't selling it after 5 years, its cost of ownership is $6.6K more than Camry SE; excluding loan interest it's \"only\" $5K more). Assuming no interest, no resale value, after 10 years it's even though. If no interest and no resale, but electricity is free, then after 5 years Tesla is $3K more, but after 10 it's $2k less. Those numbers assume gas returns to $3/gallon. If it stays at say $2.50, then it's about $1K more in Camry's favor.",{"type":378,"tag":379,"props":431,"children":432},{},[433],{"type":378,"tag":383,"props":434,"children":437},{"href":435,"rel":436},"https://www.reddit.com/r/electriccars/comments/hxughu/what_should_i_know_before_buying_my_first_ev/",[387],[438],{"type":390,"value":439},"Some reddit thread on \"what should I know before buying my first EV?\"",{"title":369,"searchDepth":441,"depth":441,"links":442},2,[],"markdown","content:notes-to-self:electric-car.md","content","notes-to-self/electric-car.md","notes-to-self/electric-car","md",{"_path":450,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":266,"description":369,"slug":267,"date":371,"dateString":451,"encrypted":368,"encryptedBody":373,"body":452,"_type":443,"_id":504,"_source":445,"_file":505,"_stem":506,"_extension":448},"/notes-to-self/sdl","2020-07-14",{"type":375,"children":453,"toc":499},[454,461,470,476,481,490],{"type":378,"tag":455,"props":456,"children":458},"h3",{"id":457},"rendering-text",[459],{"type":390,"value":460},"Rendering Text",{"type":378,"tag":379,"props":462,"children":463},{},[464],{"type":378,"tag":383,"props":465,"children":468},{"href":466,"rel":467},"https://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf.html#SEC15",[387],[469],{"type":390,"value":466},{"type":378,"tag":455,"props":471,"children":473},{"id":472},"whats-the-difference-between-a-static-texture-and-a-target-texture",[474],{"type":390,"value":475},"What's the difference between a static texture and a target texture?",{"type":378,"tag":379,"props":477,"children":478},{},[479],{"type":390,"value":480},"I assume the latter is a texture you render into.",{"type":378,"tag":379,"props":482,"children":483},{},[484],{"type":378,"tag":383,"props":485,"children":488},{"href":486,"rel":487},"https://stackoverflow.com/questions/46044034/are-there-any-penalties-when-allocating-sdl-target-textures-that-are-never-used/46077923",[387],[489],{"type":390,"value":486},{"type":378,"tag":379,"props":491,"children":492},{},[493],{"type":378,"tag":383,"props":494,"children":497},{"href":495,"rel":496},"https://wiki.libsdl.org/SDL_RWFromConstMem",[387],[498],{"type":390,"value":495},{"title":369,"searchDepth":441,"depth":441,"links":500},[501,503],{"id":457,"depth":502,"text":460},3,{"id":472,"depth":502,"text":475},"content:notes-to-self:sdl.md","notes-to-self/sdl.md","notes-to-self/sdl",{"_path":508,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":281,"description":509,"slug":282,"date":371,"dateString":451,"encrypted":368,"encryptedBody":373,"body":510,"_type":443,"_id":528,"_source":445,"_file":529,"_stem":530,"_extension":448},"/notes-to-self/solar","Tesla Panels Are More Efficient and More Affordable",{"type":375,"children":511,"toc":526},[512,521],{"type":378,"tag":379,"props":513,"children":514},{},[515],{"type":378,"tag":383,"props":516,"children":519},{"href":517,"rel":518},"https://www.engadget.com/tesla-solar-panel-efficiency-update-144914935.html",[387],[520],{"type":390,"value":509},{"type":378,"tag":379,"props":522,"children":523},{},[524],{"type":390,"value":525},"But in MA there were support/quality issues - systems not working, and Tesla not being responsive/fixing.",{"title":369,"searchDepth":441,"depth":441,"links":527},[],"content:notes-to-self:solar.md","notes-to-self/solar.md","notes-to-self/solar",{"_path":532,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":338,"description":533,"slug":339,"date":534,"dateString":535,"encrypted":368,"encryptedBody":373,"body":536,"_type":443,"_id":680,"_source":445,"_file":681,"_stem":682,"_extension":448},"/notes-to-self/webassembly-wasmweb-worker-notes","Emsdk must be set up by",1591200000000,"2020.06.03",{"type":375,"children":537,"toc":678},[538,542,555,560,569,574,583,588,597,602,611,616,625,638,647,652,661,669],{"type":378,"tag":379,"props":539,"children":540},{},[541],{"type":390,"value":533},{"type":378,"tag":543,"props":544,"children":549},"pre",{"className":545,"code":547,"language":548,"meta":369},[546],"language-shell","$ source ../emsdk/emsdk_env.sh --build=Release\n","shell",[550],{"type":378,"tag":551,"props":552,"children":553},"code",{"__ignoreMap":369},[554],{"type":390,"value":547},{"type":378,"tag":379,"props":556,"children":557},{},[558],{"type":390,"value":559},"When trying to use SDL ala",{"type":378,"tag":543,"props":561,"children":564},{"className":562,"code":563,"language":548,"meta":369},[546],"$ emcc hello_sdl.c --emrun --preload-file font -s USE_SDL=2 -s USE_SDL_TTF=2 -o hello_sdl.html\n",[565],{"type":378,"tag":551,"props":566,"children":567},{"__ignoreMap":369},[568],{"type":390,"value":563},{"type":378,"tag":379,"props":570,"children":571},{},[572],{"type":390,"value":573},"Got python error",{"type":378,"tag":543,"props":575,"children":578},{"className":576,"code":577,"language":548,"meta":369},[546],"system_libs:INFO: retrieving port: sdl2 from https://github.com/emscripten-ports/SDL2/archive/version_21.zip\nTraceback (most recent call last):\n  File \"/Users/nathan/Downloads/emsdk/upstream/emscripten/tools/system_libs.py\", line 1845, in retrieve\n    import requests\nModuleNotFoundError: No module named 'requests'\n",[579],{"type":378,"tag":551,"props":580,"children":581},{"__ignoreMap":369},[582],{"type":390,"value":577},{"type":378,"tag":379,"props":584,"children":585},{},[586],{"type":390,"value":587},"So… need to install requests module for python. How to do that?",{"type":378,"tag":543,"props":589,"children":592},{"className":590,"code":591,"language":548,"meta":369},[546],"$ pip install requests\n",[593],{"type":378,"tag":551,"props":594,"children":595},{"__ignoreMap":369},[596],{"type":390,"value":591},{"type":378,"tag":379,"props":598,"children":599},{},[600],{"type":390,"value":601},"Wrong! emcc is really running Python 3.7 which you already had installed (or was installed on this version of macOS) with its own version of pip available as pip3. So",{"type":378,"tag":543,"props":603,"children":606},{"className":604,"code":605,"language":548,"meta":369},[546],"$ pip3 install requests\n",[607],{"type":378,"tag":551,"props":608,"children":609},{"__ignoreMap":369},[610],{"type":390,"value":605},{"type":378,"tag":379,"props":612,"children":613},{},[614],{"type":390,"value":615},"Worked.",{"type":378,"tag":379,"props":617,"children":618},{},[619],{"type":378,"tag":620,"props":621,"children":622},"strong",{},[623],{"type":390,"value":624},"Ignore the following:",{"type":378,"tag":379,"props":626,"children":627},{},[628,630,636],{"type":390,"value":629},"But need pip, so first (via ",{"type":378,"tag":383,"props":631,"children":634},{"href":632,"rel":633},"https://ahmadawais.com/install-pip-macos-os-x-python/",[387],[635],{"type":390,"value":632},{"type":390,"value":637},")",{"type":378,"tag":543,"props":639,"children":642},{"className":640,"code":641,"language":548,"meta":369},[546],"$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py\n$ python get-pip.py\n",[643],{"type":378,"tag":551,"props":644,"children":645},{"__ignoreMap":369},[646],{"type":390,"value":641},{"type":378,"tag":379,"props":648,"children":649},{},[650],{"type":390,"value":651},"And we need to add our local python bin to $PATH in our zsh profile:",{"type":378,"tag":543,"props":653,"children":656},{"className":654,"code":655,"language":548,"meta":369},[546],"export PATH=$PATH:/Users/nathan/Library/Python/2.7/bin\n",[657],{"type":378,"tag":551,"props":658,"children":659},{"__ignoreMap":369},[660],{"type":390,"value":655},{"type":378,"tag":379,"props":662,"children":663},{},[664],{"type":378,"tag":620,"props":665,"children":666},{},[667],{"type":390,"value":668},"end ignore",{"type":378,"tag":379,"props":670,"children":671},{},[672],{"type":378,"tag":383,"props":673,"children":676},{"href":674,"rel":675},"https://github.com/emscripten-core/emscripten/issues/2427",[387],[677],{"type":390,"value":674},{"title":369,"searchDepth":441,"depth":441,"links":679},[],"content:notes-to-self:webassembly-wasmweb-worker-notes.md","notes-to-self/webassembly-wasmweb-worker-notes.md","notes-to-self/webassembly-wasmweb-worker-notes",{"_path":684,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":224,"description":369,"slug":225,"date":685,"dateString":686,"encrypted":368,"encryptedBody":373,"body":687,"_type":443,"_id":1810,"_source":445,"_file":1811,"_stem":1812,"_extension":448},"/notes-to-self/playkode-research",1590940800000,"2020.05.31",{"type":375,"children":688,"toc":1793},[689,1019,1029,1048,1090,1096,1101,1110,1115,1121,1126,1136,1141,1158,1171,1180,1193,1204,1209,1216,1267,1273,1278,1290,1302,1307,1318,1329,1341,1347,1358,1363,1475,1480,1485,1506,1512,1523,1529,1538,1548,1554,1569,1575,1584,1593,1599,1608,1614,1623,1634,1643,1652,1662,1668,1678,1682,1692,1698,1709,1718,1729,1734,1739,1760,1771,1782],{"type":378,"tag":690,"props":691,"children":692},"ul",{},[693,704,741,751,761,780,893,920,939,949,959,986,996,1006],{"type":378,"tag":694,"props":695,"children":696},"li",{},[697],{"type":378,"tag":383,"props":698,"children":701},{"href":699,"rel":700},"https://medium.com/leaningtech/best-in-class-webassembly-with-cheerp-2-5-rc1-aa44951bc0f0",[387],[702],{"type":390,"value":703},"Cheerp is a commercial WebAssembly Compiler",{"type":378,"tag":694,"props":705,"children":706},{},[707,709],{"type":390,"value":708},"MDN:\n",{"type":378,"tag":690,"props":710,"children":711},{},[712,722],{"type":378,"tag":694,"props":713,"children":714},{},[715],{"type":378,"tag":383,"props":716,"children":719},{"href":717,"rel":718},"https://developer.mozilla.org/en-US/docs/WebAssembly/Using_the_JavaScript_API",[387],[720],{"type":390,"value":721},"MDN \"Using the WebAssembly JavaScript API\"",{"type":378,"tag":694,"props":723,"children":724},{},[725,732,734],{"type":378,"tag":383,"props":726,"children":729},{"href":727,"rel":728},"https://developer.mozilla.org/en-US/docs/WebAssembly/existing_C_to_wasm",[387],[730],{"type":390,"value":731},"\"Compiling an existing module to WebAssembly\"",{"type":390,"value":733}," - strangely unauthoritative ",{"type":378,"tag":383,"props":735,"children":738},{"href":736,"rel":737},"https://developers.google.com/web/updates/2018/03/emscripting-a-c-library",[387],[739],{"type":390,"value":740},"also google",{"type":378,"tag":694,"props":742,"children":743},{},[744],{"type":378,"tag":383,"props":745,"children":748},{"href":746,"rel":747},"https://www.sitepen.com/blog/using-webassembly-with-web-workers/",[387],[749],{"type":390,"value":750},"General 1-year old article on using WebAssembly with Web Workers",{"type":378,"tag":694,"props":752,"children":753},{},[754],{"type":378,"tag":383,"props":755,"children":758},{"href":756,"rel":757},"https://github.com/mbasso/wasm-worker",[387],[759],{"type":390,"value":760},"wasm-worker was super promising but is over two years old and no longer seems to work",{"type":378,"tag":694,"props":762,"children":763},{},[764,771,773],{"type":378,"tag":383,"props":765,"children":768},{"href":766,"rel":767},"https://github.com/vvanders/wasm_lua",[387],[769],{"type":390,"value":770},"existing wasm_lua",{"type":390,"value":772}," with ",{"type":378,"tag":383,"props":774,"children":777},{"href":775,"rel":776},"https://cdn.rawgit.com/vvanders/wasm_lua/d68f46a8/main.html",[387],[778],{"type":390,"value":779},"working example",{"type":378,"tag":694,"props":781,"children":782},{},[783,785],{"type":390,"value":784},"Empscripten links:\n",{"type":378,"tag":690,"props":786,"children":787},{},[788,798,808,818,827,837,847,857,883],{"type":378,"tag":694,"props":789,"children":790},{},[791],{"type":378,"tag":383,"props":792,"children":795},{"href":793,"rel":794},"https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#interacting-with-code-call-javascript-from-native",[387],[796],{"type":390,"value":797},"Interacting with JavaScript",{"type":378,"tag":694,"props":799,"children":800},{},[801],{"type":378,"tag":383,"props":802,"children":805},{"href":803,"rel":804},"https://emscripten.org/docs/api_reference/emscripten.h.html?highlight=worker#c.emscripten_worker_respond",[387],[806],{"type":390,"value":807},"emscripten.h web worker stuff",{"type":378,"tag":694,"props":809,"children":810},{},[811],{"type":378,"tag":383,"props":812,"children":815},{"href":813,"rel":814},"https://github.com/emscripten-core/emscripten/issues/5005",[387],[816],{"type":390,"value":817},"Note of a relevant bug from 2017",{"type":378,"tag":694,"props":819,"children":820},{},[821],{"type":378,"tag":383,"props":822,"children":824},{"href":746,"rel":823},[387],[825],{"type":390,"value":826},"Lightweight post about using WebAssembly with Web Workers",{"type":378,"tag":694,"props":828,"children":829},{},[830],{"type":378,"tag":383,"props":831,"children":834},{"href":832,"rel":833},"https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html",[387],[835],{"type":390,"value":836},"emrun, dev serving, not great",{"type":378,"tag":694,"props":838,"children":839},{},[840],{"type":378,"tag":383,"props":841,"children":844},{"href":842,"rel":843},"https://emscripten.org/docs/api_reference/module.html#Module.instantiateWasm",[387],[845],{"type":390,"value":846},"global JavaScript module object",{"type":378,"tag":694,"props":848,"children":849},{},[850],{"type":378,"tag":383,"props":851,"children":854},{"href":852,"rel":853},"https://emscripten.org/docs/getting_started/FAQ.html#why-doesn-t-my-sdl-app-work",[387],[855],{"type":390,"value":856},"FAQ appears to have unique information/guidance not found elsewhere",{"type":378,"tag":694,"props":858,"children":859},{},[860,867,869,875,877],{"type":378,"tag":383,"props":861,"children":864},{"href":862,"rel":863},"https://dev.to/azure/passing-strings-from-c-to-javascript-in-web-assembly-1p01",[387],[865],{"type":390,"value":866},"1 year-old article on passing strings from C to JavaScript",{"type":390,"value":868}," -- you needed to use ",{"type":378,"tag":551,"props":870,"children":872},{"className":871},[],[873],{"type":390,"value":874},"window.wasmMemory.buffer",{"type":390,"value":876}," not ",{"type":378,"tag":551,"props":878,"children":880},{"className":879},[],[881],{"type":390,"value":882},"memory.buffer",{"type":378,"tag":694,"props":884,"children":885},{},[886],{"type":378,"tag":383,"props":887,"children":890},{"href":888,"rel":889},"https://github.com/emscripten-core/emscripten/blob/1.34.12/src/settings.js#L461",[387],[891],{"type":390,"value":892},"Settings",{"type":378,"tag":694,"props":894,"children":895},{},[896,898],{"type":390,"value":897},"Stack overflow questions about web assembly/worker\n",{"type":378,"tag":690,"props":899,"children":900},{},[901,910],{"type":378,"tag":694,"props":902,"children":903},{},[904],{"type":378,"tag":383,"props":905,"children":907},{"href":803,"rel":906},[387],[908],{"type":390,"value":909},"2.5 year-old question about calling JavaScript from C++",{"type":378,"tag":694,"props":911,"children":912},{},[913],{"type":378,"tag":383,"props":914,"children":917},{"href":915,"rel":916},"https://stackoverflow.com/questions/32291084/minimal-working-example-for-emscripten-webworker",[387],[918],{"type":390,"value":919},"4.75 year-old question about minimal working example for creating using WebAssembly with web workers",{"type":378,"tag":694,"props":921,"children":922},{},[923,930,932],{"type":378,"tag":383,"props":924,"children":927},{"href":925,"rel":926},"https://dzone.com/articles/webassembly-emscripten-side-module",[387],[928],{"type":390,"value":929},"research/experiment on not using Emscripten plumbing",{"type":390,"value":931}," and ",{"type":378,"tag":383,"props":933,"children":936},{"href":934,"rel":935},"https://dzone.com/articles/webassembly-calling-into-javascript-from-bare-bone",[387],[937],{"type":390,"value":938},"calling into JavaScript from C",{"type":378,"tag":694,"props":940,"children":941},{},[942],{"type":378,"tag":383,"props":943,"children":946},{"href":944,"rel":945},"https://github.com/adam-cyclones/tidal-node",[387],[947],{"type":390,"value":948},"Tidal Node is a one-year-old attempt to bring Lua to Node",{"type":378,"tag":694,"props":950,"children":951},{},[952],{"type":378,"tag":383,"props":953,"children":956},{"href":954,"rel":955},"http://lua-users.org/lists/lua-l/2013-05/msg00177.html",[387],[957],{"type":390,"value":958},"Changes to Lua (parts of PlayKode strategy that won't work any more?)",{"type":378,"tag":694,"props":960,"children":961},{},[962,968,970,977,979],{"type":378,"tag":383,"props":963,"children":965},{"href":793,"rel":964},[387],[966],{"type":390,"value":967},"Ace is a code editor for the web",{"type":390,"value":969}," ",{"type":378,"tag":383,"props":971,"children":974},{"href":972,"rel":973},"https://ace.c9.io/build/kitchen-sink.html",[387],[975],{"type":390,"value":976},"Kitchen sink example",{"type":390,"value":978},". ",{"type":378,"tag":383,"props":980,"children":983},{"href":981,"rel":982},"https://www.npmjs.com/package/vue2-ace-editor",[387],[984],{"type":390,"value":985},"Vue Version",{"type":378,"tag":694,"props":987,"children":988},{},[989],{"type":378,"tag":383,"props":990,"children":993},{"href":991,"rel":992},"https://easylang.online/ide/",[387],[994],{"type":390,"value":995},"Easylang is a super simple turtle graphic-like web environment, has panes, allows saving programs in browser",{"type":378,"tag":694,"props":997,"children":998},{},[999],{"type":378,"tag":383,"props":1000,"children":1003},{"href":1001,"rel":1002},"https://zocada.com/compress-resize-images-javascript-browser/",[387],[1004],{"type":390,"value":1005},"Manipulating images with JavaScript in browser",{"type":378,"tag":694,"props":1007,"children":1008},{},[1009,1011,1017],{"type":390,"value":1010},"[WebGL? Typed Arrays in JavaScript](",{"type":378,"tag":383,"props":1012,"children":1015},{"href":1013,"rel":1014},"https://www.html5rocks.com/en/tutorials/webgl/typed_arrays/#:~:text=The",[387],[1016],{"type":390,"value":1013},{"type":390,"value":1018}," other way to create,)%3B %2F%2F 256-byte ArrayBuffer.)",{"type":378,"tag":379,"props":1020,"children":1021},{},[1022],{"type":378,"tag":383,"props":1023,"children":1026},{"href":1024,"rel":1025},"https://swiftwasm.org",[387],[1027],{"type":390,"value":1028},"Swift asm",{"type":378,"tag":379,"props":1030,"children":1031},{},[1032,1034,1040,1042],{"type":390,"value":1033},"macOS Catalina, \"gyp: No Xcode or CLT version\" message? ",{"type":378,"tag":551,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":390,"value":1039},"$ [sudo] xcode-select — reset",{"type":390,"value":1041}," via ",{"type":378,"tag":383,"props":1043,"children":1046},{"href":1044,"rel":1045},"https://medium.com/p/f76739eef9ad/responses/show",[387],[1047],{"type":390,"value":1044},{"type":378,"tag":690,"props":1049,"children":1050},{},[1051,1078],{"type":378,"tag":694,"props":1052,"children":1053},{},[1054,1056,1062,1064,1070,1072],{"type":390,"value":1055},"Solution for prepending to a file in ",{"type":378,"tag":551,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":390,"value":1061},"make",{"type":390,"value":1063}," (for the purposes of prepending lint ignore comment directive): ",{"type":378,"tag":383,"props":1065,"children":1068},{"href":1066,"rel":1067},"https://stackoverflow.com/questions/10587615/unix-command-to-prepend-text-to-a-file",[387],[1069],{"type":390,"value":1066},{"type":390,"value":1071}," or ",{"type":378,"tag":383,"props":1073,"children":1076},{"href":1074,"rel":1075},"https://stackoverflow.com/questions/40477948/prepend-a-text-to-a-file-in-makefile",[387],[1077],{"type":390,"value":1074},{"type":378,"tag":694,"props":1079,"children":1080},{},[1081,1088],{"type":378,"tag":383,"props":1082,"children":1085},{"href":1083,"rel":1084},"https://stackoverflow.com/questions/16931770/makefile4-missing-separator-stop",[387],[1086],{"type":390,"value":1087},"Makefile missing separator error",{"type":390,"value":1089}," (is tab/space error)",{"type":378,"tag":455,"props":1091,"children":1093},{"id":1092},"more-on-emscripten",[1094],{"type":390,"value":1095},"More on Emscripten",{"type":378,"tag":379,"props":1097,"children":1098},{},[1099],{"type":390,"value":1100},"After running it states:",{"type":378,"tag":543,"props":1102,"children":1105},{"className":1103,"code":1104,"language":548,"meta":369},[546],"Next steps:\n- To conveniently access emsdk tools from the command line,\n  consider adding the following directories to your PATH:\n    /Users/nathan/Downloads/emscripten/emsdk\n    /Users/nathan/Downloads/emscripten/emsdk/node/14.18.2_64bit/bin\n    /Users/nathan/Downloads/emscripten/emsdk/upstream/emscripten\n- This can be done for the current shell by running:\n    source \"/Users/nathan/Downloads/emscripten/emsdk/emsdk_env.sh\"\n- Configure emsdk in your shell startup scripts by running:\n    echo 'source \"/Users/nathan/Downloads/emscripten/emsdk/emsdk_env.sh\"' >> $HOME/.zprofile\n",[1106],{"type":378,"tag":551,"props":1107,"children":1108},{"__ignoreMap":369},[1109],{"type":390,"value":1104},{"type":378,"tag":379,"props":1111,"children":1112},{},[1113],{"type":390,"value":1114},"You are hesitant because you think it slowed down the launching of your shell before.",{"type":378,"tag":455,"props":1116,"children":1118},{"id":1117},"on-calling-js-from-c",[1119],{"type":390,"value":1120},"On calling JS from C:",{"type":378,"tag":379,"props":1122,"children":1123},{},[1124],{"type":390,"value":1125},"Seems to be two ways: one is a macro from C:",{"type":378,"tag":543,"props":1127,"children":1131},{"className":1128,"code":1130,"language":48,"meta":369},[1129],"language-c","EM_ASM( ShipPosition($0, $1), ship_x, ship_y );\n",[1132],{"type":378,"tag":551,"props":1133,"children":1134},{"__ignoreMap":369},[1135],{"type":390,"value":1130},{"type":378,"tag":379,"props":1137,"children":1138},{},[1139],{"type":390,"value":1140},"This probably executes in a global context, so the JavaScript function would have to be attached to the window.",{"type":378,"tag":379,"props":1142,"children":1143},{},[1144,1146,1150,1156],{"type":390,"value":1145},"The other method is more work but \"cleaner\" using",{"type":378,"tag":1147,"props":1148,"children":1149},"br",{},[],{"type":378,"tag":383,"props":1151,"children":1153},{"href":842,"rel":1152},[387],[1154],{"type":390,"value":1155},"a callback",{"type":390,"value":1157},".",{"type":378,"tag":379,"props":1159,"children":1160},{},[1161,1163,1169],{"type":390,"value":1162},"Given a JS Function ",{"type":378,"tag":551,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":390,"value":1168},"CallJS",{"type":390,"value":1170},", declare it as extern in C:",{"type":378,"tag":543,"props":1172,"children":1175},{"className":1173,"code":1174,"language":48,"meta":369},[1129],"extern void CallJS(int iVal);\n",[1176],{"type":378,"tag":551,"props":1177,"children":1178},{"__ignoreMap":369},[1179],{"type":390,"value":1174},{"type":378,"tag":379,"props":1181,"children":1182},{},[1183,1185,1191],{"type":390,"value":1184},"You define the ",{"type":378,"tag":551,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":390,"value":1190},"instantianWasm",{"type":390,"value":1192}," thusly:",{"type":378,"tag":543,"props":1194,"children":1199},{"className":1195,"code":1197,"language":1198,"meta":369},[1196],"language-javascript","  Module.instantiateWasm = function(imports, successCallback) {\n    // javascript you want to be able to call from C\n    // for each, in c, you need\n    // extern void \u003Cfunction name>(…);\n    window.asmLibraryArg.CallJS = () => {\n      console.log('hello from CallJs')\n    }\n\n    const info = {\n      env: window.asmLibraryArg,\n      wasi_snapshot_preview1: window.asmLibraryArg\n    }\n    let thisInstance = null\n    function receiveInstance(instance, module) {\n      thisInstance = instance\n      // exports = instance.exports\n      // Module.asm = exports\n      // removeRunDependency('wasm-instantiate')\n    }\n    // addRunDependency('wasm-instantiate')\n    function receiveInstantiatedSource(output) {\n      receiveInstance(output.instance)\n    }\n    function instantiateArrayBuffer(receiver) {\n      return window\n        .getBinaryPromise()\n        .then(function(binary) {\n          return WebAssembly.instantiate(binary, info)\n        })\n        .then(receiver, function(reason) {\n          window.err('failed to asynchronously prepare wasm: ' + reason)\n          window.abort(reason)\n        })\n    }\n    function instantiateAsync() {\n      if (\n        !window.wasmBinary &&\n        typeof WebAssembly.instantiateStreaming === 'function' &&\n        !window.isDataURI(window.wasmBinaryFile) &&\n        !window.isFileURI(window.wasmBinaryFile) &&\n        typeof window.fetch === 'function'\n      ) {\n        window\n          .fetch(window.wasmBinaryFile, { credentials: 'same-origin' })\n          .then(function(response) {\n            const result = WebAssembly.instantiateStreaming(response, info)\n            return result.then(receiveInstantiatedSource, function(reason) {\n              window.err('wasm streaming compile failed: ' + reason)\n              window.err('falling back to ArrayBuffer instantiation')\n              instantiateArrayBuffer(receiveInstantiatedSource)\n            })\n          })\n      } else {\n        return instantiateArrayBuffer(receiveInstantiatedSource)\n      }\n    }\n    instantiateAsync().then(() => {\n      successCallback(thisInstance)\n    })\n\n    // return exports\n    return {}\n  }\n","javascript",[1200],{"type":378,"tag":551,"props":1201,"children":1202},{"__ignoreMap":369},[1203],{"type":390,"value":1197},{"type":378,"tag":379,"props":1205,"children":1206},{},[1207],{"type":390,"value":1208},"Unknown: passing argument to the JS function, receiving results, available to Web Worker?",{"type":378,"tag":1210,"props":1211,"children":1213},"h2",{"id":1212},"on-using-swift",[1214],{"type":390,"value":1215},"On Using Swift",{"type":378,"tag":690,"props":1217,"children":1218},{},[1219,1228,1238,1248,1257],{"type":378,"tag":694,"props":1220,"children":1221},{},[1222],{"type":378,"tag":383,"props":1223,"children":1225},{"href":674,"rel":1224},[387],[1226],{"type":390,"value":1227},"Long thread about whether or not it is possible with emscripten, people working on it",{"type":378,"tag":694,"props":1229,"children":1230},{},[1231],{"type":378,"tag":383,"props":1232,"children":1235},{"href":1233,"rel":1234},"https://forums.swift.org/t/wasm-support/16087/23",[387],[1236],{"type":390,"value":1237},"Long thread on wasm support from swift people",{"type":378,"tag":694,"props":1239,"children":1240},{},[1241],{"type":378,"tag":383,"props":1242,"children":1245},{"href":1243,"rel":1244},"https://codeload.github.com/kateinoigakukun/life-game-with-swiftwasm/zip/master",[387],[1246],{"type":390,"value":1247},"Life game with SwiftAsm",{"type":378,"tag":694,"props":1249,"children":1250},{},[1251],{"type":378,"tag":383,"props":1252,"children":1254},{"href":1024,"rel":1253},[387],[1255],{"type":390,"value":1256},"SwiftAsm",{"type":378,"tag":694,"props":1258,"children":1259},{},[1260],{"type":378,"tag":383,"props":1261,"children":1264},{"href":1262,"rel":1263},"https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/using_imported_c_functions_in_swift",[387],[1265],{"type":390,"value":1266},"Mixing C",{"type":378,"tag":1210,"props":1268,"children":1270},{"id":1269},"storage-options",[1271],{"type":390,"value":1272},"Storage Options",{"type":378,"tag":379,"props":1274,"children":1275},{},[1276],{"type":390,"value":1277},"We want the user to be able to add their own media (sounds and images). Ultimately, we will need to be able to store them in a shared place like s3, but for now we will focus on the local experience. For the local experience, we will use not localStorage (with, evidently, a max of 5mb and only capable of storing strings) but indexedDB. IndexedDB is more complex.",{"type":378,"tag":379,"props":1279,"children":1280},{},[1281,1288],{"type":378,"tag":383,"props":1282,"children":1285},{"href":1283,"rel":1284},"https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Browser_storage_limits_and_eviction_criteria#Storage_limits",[387],[1286],{"type":390,"value":1287},"Some information on storage limits, mostly relating to Firefox",{"type":390,"value":1289}," - 50% of available space.",{"type":378,"tag":379,"props":1291,"children":1292},{},[1293,1300],{"type":378,"tag":383,"props":1294,"children":1297},{"href":1295,"rel":1296},"https://chromium.googlesource.com/chromium/src/+/refs/heads/master/storage/browser/quota/quota_settings.cc#68",[387],[1298],{"type":390,"value":1299},"Chrome storage limits, as linked to above",{"type":390,"value":1301}," Minimum of 1% of available or 1GB. Worth noting that on mobile devices these are pretty small (8gb capacity = as little as 80MB available).",{"type":378,"tag":379,"props":1303,"children":1304},{},[1305],{"type":390,"value":1306},"Both of these browsers will aggressively delete databases if quotas are exceeded, which can happen outside of the browser (suddenly there's less disk space, so the database gets killed).",{"type":378,"tag":379,"props":1308,"children":1309},{},[1310,1312],{"type":390,"value":1311},"Someone's old code for syncing dexie to dropbox:\n",{"type":378,"tag":383,"props":1313,"children":1316},{"href":1314,"rel":1315},"https://gist.github.com/cfilipov/48338f23ce92047807585f750af04bc0",[387],[1317],{"type":390,"value":1314},{"type":378,"tag":379,"props":1319,"children":1320},{},[1321,1323],{"type":390,"value":1322},"Via: ",{"type":378,"tag":383,"props":1324,"children":1327},{"href":1325,"rel":1326},"https://github.com/dfahlander/Dexie.js/issues/545",[387],[1328],{"type":390,"value":1325},{"type":378,"tag":379,"props":1330,"children":1331},{},[1332,1334],{"type":390,"value":1333},"Related item: ",{"type":378,"tag":383,"props":1335,"children":1338},{"href":1336,"rel":1337},"https://remotestoragejs.readthedocs.io/en/latest/",[387],[1339],{"type":390,"value":1340},"a JavaScript library for storing user data locally in the browser, as well as connecting to remoteStorage servers and syncing data across devices and applications. It is also capable of connecting and syncing data with a person’s Dropbox or Google Drive account",{"type":378,"tag":455,"props":1342,"children":1344},{"id":1343},"indexeddb-wrappers",[1345],{"type":390,"value":1346},"IndexedDB wrappers:",{"type":378,"tag":379,"props":1348,"children":1349},{},[1350,1352],{"type":390,"value":1351},"As suggested by ",{"type":378,"tag":383,"props":1353,"children":1356},{"href":1354,"rel":1355},"https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API",[387],[1357],{"type":390,"value":1354},{"type":378,"tag":379,"props":1359,"children":1360},{},[1361],{"type":390,"value":1362},"Note: what about migrating these databases on code changes? Do any of these libraries support that?",{"type":378,"tag":690,"props":1364,"children":1365},{},[1366,1378,1396,1408,1427,1439,1451,1463],{"type":378,"tag":694,"props":1367,"children":1368},{},[1369,1376],{"type":378,"tag":383,"props":1370,"children":1373},{"href":1371,"rel":1372},"https://localforage.github.io/localForage/",[387],[1374],{"type":390,"value":1375},"localForage",{"type":390,"value":1377}," - works like localStorage, but with promises. Maybe not modern? Although recently updated, 339K weekly",{"type":378,"tag":694,"props":1379,"children":1380},{},[1381,1388,1390],{"type":378,"tag":383,"props":1382,"children":1385},{"href":1383,"rel":1384},"https://dexie.org/",[387],[1386],{"type":390,"value":1387},"dexie.js",{"type":390,"value":1389},". 56K weekly but more DB like, fancier site and more complete readme; appears to have built-in migration-like behavior with versioning; see ",{"type":378,"tag":383,"props":1391,"children":1394},{"href":1392,"rel":1393},"https://dexie.org/docs/Tutorial/Design#database-versioning",[387],[1395],{"type":390,"value":1392},{"type":378,"tag":694,"props":1397,"children":1398},{},[1399,1406],{"type":378,"tag":383,"props":1400,"children":1403},{"href":1401,"rel":1402},"https://github.com/erikolson186/zangodb",[387],[1404],{"type":390,"value":1405},"zangodb",{"type":390,"value":1407}," aims to be like mongo and you don't want that",{"type":378,"tag":694,"props":1409,"children":1410},{},[1411,1418,1420,1426],{"type":378,"tag":383,"props":1412,"children":1415},{"href":1413,"rel":1414},"https://pouchdb.com",[387],[1416],{"type":390,"value":1417},"pouchdb",{"type":390,"value":1419}," syncs with certain servers (CouchDB, e.g. ",{"type":378,"tag":383,"props":1421,"children":1424},{"href":1422,"rel":1423},"https://www.ibm.com/cloud/cloudant",[387],[1425],{"type":390,"value":1422},{"type":390,"value":637},{"type":378,"tag":694,"props":1428,"children":1429},{},[1430,1437],{"type":378,"tag":383,"props":1431,"children":1434},{"href":1432,"rel":1433},"https://www.npmjs.com/package/idb",[387],[1435],{"type":390,"value":1436},"idb",{"type":390,"value":1438}," lightweight convenience wrapper around IndexedDB; maybe too low level; cannot find reference to versioning/migration but there does appear to be some support for it built into IndexedDB (\"IDBVersionChangeEvent\")",{"type":378,"tag":694,"props":1440,"children":1441},{},[1442,1449],{"type":378,"tag":383,"props":1443,"children":1446},{"href":1444,"rel":1445},"https://www.npmjs.com/package/idb-keyval",[387],[1447],{"type":390,"value":1448},"idb-keyval",{"type":390,"value":1450}," like localForage but less old browser support",{"type":378,"tag":694,"props":1452,"children":1453},{},[1454,1461],{"type":378,"tag":383,"props":1455,"children":1458},{"href":1456,"rel":1457},"https://jsstore.net",[387],[1459],{"type":390,"value":1460},"jsstore",{"type":390,"value":1462}," \"think in sql\" up to date but little used according to NPM and janky English in docs",{"type":378,"tag":694,"props":1464,"children":1465},{},[1466,1473],{"type":378,"tag":383,"props":1467,"children":1470},{"href":1468,"rel":1469},"https://github.com/google/lovefield",[387],[1471],{"type":390,"value":1472},"lovefield",{"type":390,"value":1474}," by google and \"provides SQL-like syntax and works cross-browser\" but npm says last release was 3 years ago (although repo shows some activity)",{"type":378,"tag":379,"props":1476,"children":1477},{},[1478],{"type":390,"value":1479},"Pretty sure dexie is best choice.",{"type":378,"tag":379,"props":1481,"children":1482},{},[1483],{"type":390,"value":1484},"Font for brand: M PLUS Rounded 1c",{"type":378,"tag":379,"props":1486,"children":1487},{},[1488,1490,1496,1498,1504],{"type":390,"value":1489},"Couldn't get c to work with C++ until: ",{"type":378,"tag":383,"props":1491,"children":1494},{"href":1492,"rel":1493},"https://developers.google.com/web/updates/2018/08/embind",[387],[1495],{"type":390,"value":1492},{"type":390,"value":1497}," at the bottom, using the ",{"type":378,"tag":551,"props":1499,"children":1501},{"className":1500},[],[1502],{"type":390,"value":1503},"--bind",{"type":390,"value":1505}," option/syntax at the bottom of that page.",{"type":378,"tag":1210,"props":1507,"children":1509},{"id":1508},"tons-of-useful-info",[1510],{"type":390,"value":1511},"Tons of Useful Info",{"type":378,"tag":379,"props":1513,"children":1514},{},[1515,1521],{"type":378,"tag":383,"props":1516,"children":1519},{"href":1517,"rel":1518},"https://marcoselvatici.github.io/WASM_tutorial/",[387],[1520],{"type":390,"value":1517},{"type":390,"value":1522}," - not sure how old, but stuff about heap v stack, ptrs, reading files",{"type":378,"tag":1210,"props":1524,"children":1526},{"id":1525},"drawing-component",[1527],{"type":390,"value":1528},"Drawing Component?",{"type":378,"tag":379,"props":1530,"children":1531},{},[1532],{"type":378,"tag":383,"props":1533,"children":1536},{"href":1534,"rel":1535},"https://codepen.io/Lewitje/pen/MVommB",[387],[1537],{"type":390,"value":1534},{"type":378,"tag":379,"props":1539,"children":1540},{},[1541],{"type":378,"tag":383,"props":1542,"children":1545},{"href":1543,"rel":1544},"https://news.ycombinator.com/item?id=23711432",[387],[1546],{"type":390,"value":1547},"free json store",{"type":378,"tag":1210,"props":1549,"children":1551},{"id":1550},"on-resizing-canvas",[1552],{"type":390,"value":1553},"On Resizing Canvas",{"type":378,"tag":379,"props":1555,"children":1556},{},[1557,1563],{"type":378,"tag":383,"props":1558,"children":1561},{"href":1559,"rel":1560},"https://groups.google.com/g/emscripten-discuss/c/NONijDAFuTE?pli=1",[387],[1562],{"type":390,"value":1559},{"type":378,"tag":383,"props":1564,"children":1567},{"href":1565,"rel":1566},"https://stackoverflow.com/questions/60920177/emscripten-sdl2-origin-of-canvas-appears-to-move-when-canvas-is-resized",[387],[1568],{"type":390,"value":1565},{"type":378,"tag":1210,"props":1570,"children":1572},{"id":1571},"on-making-a-bitmap-font-with-sdl",[1573],{"type":390,"value":1574},"On Making a Bitmap Font with SDL",{"type":378,"tag":379,"props":1576,"children":1577},{},[1578],{"type":378,"tag":383,"props":1579,"children":1582},{"href":1580,"rel":1581},"https://github.com/i8degrees/nomlib/blob/dev/src/graphics/fonts/TrueTypeFont.cpp",[387],[1583],{"type":390,"value":1580},{"type":378,"tag":379,"props":1585,"children":1586},{},[1587],{"type":378,"tag":383,"props":1588,"children":1591},{"href":1589,"rel":1590},"http://lazyfoo.net/SDL_tutorials/lesson30/index.php",[387],[1592],{"type":390,"value":1589},{"type":378,"tag":1210,"props":1594,"children":1596},{"id":1595},"educational-resources",[1597],{"type":390,"value":1598},"Educational Resources",{"type":378,"tag":379,"props":1600,"children":1601},{},[1602],{"type":378,"tag":383,"props":1603,"children":1606},{"href":1604,"rel":1605},"https://www.apple.com/education/k12/learning-from-home/",[387],[1607],{"type":390,"value":1604},{"type":378,"tag":1210,"props":1609,"children":1611},{"id":1610},"on-dealing-with-binary-data-and-passing-same-around",[1612],{"type":390,"value":1613},"On dealing with binary data and passing same around",{"type":378,"tag":379,"props":1615,"children":1616},{},[1617],{"type":378,"tag":383,"props":1618,"children":1621},{"href":1619,"rel":1620},"https://stackoverflow.com/questions/59465413/convert-blob-url-to-file-object-with-axios",[387],[1622],{"type":390,"value":1619},{"type":378,"tag":379,"props":1624,"children":1625},{},[1626,1628],{"type":390,"value":1627},"Shared Memory? ",{"type":378,"tag":383,"props":1629,"children":1632},{"href":1630,"rel":1631},"https://lucasfcosta.com/2017/04/30/JavaScript-From-Workers-to-Shared-Memory.html",[387],[1633],{"type":390,"value":1630},{"type":378,"tag":379,"props":1635,"children":1636},{},[1637],{"type":378,"tag":383,"props":1638,"children":1641},{"href":1639,"rel":1640},"https://groups.google.com/g/emscripten-discuss/c/CMfYljLWMvY",[387],[1642],{"type":390,"value":1639},{"type":378,"tag":379,"props":1644,"children":1645},{},[1646],{"type":378,"tag":383,"props":1647,"children":1650},{"href":1648,"rel":1649},"https://stackoverflow.com/questions/17883799/how-to-handle-passing-returning-array-pointers-to-emscripten-compiled-code",[387],[1651],{"type":390,"value":1648},{"type":378,"tag":379,"props":1653,"children":1654},{},[1655],{"type":378,"tag":383,"props":1656,"children":1659},{"href":1657,"rel":1658},"https://stackoverflow.com/questions/41846669/download-an-image-using-axios-and-convert-it-to-base64",[387],[1660],{"type":390,"value":1661},"Get an Image and convert to blob with axios?",{"type":378,"tag":1210,"props":1663,"children":1665},{"id":1664},"similar-products",[1666],{"type":390,"value":1667},"Similar products",{"type":378,"tag":379,"props":1669,"children":1670},{},[1671],{"type":378,"tag":383,"props":1672,"children":1675},{"href":1673,"rel":1674},"https://www.lexaloffle.com/bbs/?sub=2&cat=7#sub=2&page=1&orderby=featured",[387],[1676],{"type":390,"value":1677},"tiny games you can play on phone",{"type":378,"tag":1210,"props":1679,"children":1680},{"id":90},[1681],{"type":390,"value":89},{"type":378,"tag":379,"props":1683,"children":1684},{},[1685],{"type":378,"tag":383,"props":1686,"children":1689},{"href":1687,"rel":1688},"https://news.ycombinator.com/item?id=23869665",[387],[1690],{"type":390,"value":1691},"The Oldschool PC Font Pack v2.0",{"type":378,"tag":1210,"props":1693,"children":1695},{"id":1694},"typed-lua",[1696],{"type":390,"value":1697},"Typed Lua?",{"type":378,"tag":379,"props":1699,"children":1700},{},[1701,1703],{"type":390,"value":1702},"Luau ",{"type":378,"tag":383,"props":1704,"children":1707},{"href":1705,"rel":1706},"https://roblox.github.io/luau/",[387],[1708],{"type":390,"value":1705},{"type":378,"tag":379,"props":1710,"children":1711},{},[1712],{"type":378,"tag":383,"props":1713,"children":1716},{"href":1714,"rel":1715},"https://news.ycombinator.com/item?id=24059432",[387],[1717],{"type":390,"value":1714},{"type":378,"tag":379,"props":1719,"children":1720},{},[1721,1723],{"type":390,"value":1722},"JHelmsAt 6 hours ago ",{"type":378,"tag":1724,"props":1725,"children":1726},"span",{},[1727],{"type":390,"value":1728},"–",{"type":378,"tag":379,"props":1730,"children":1731},{},[1732],{"type":390,"value":1733},"In case anyone is interested: Roblox (who is making Luau) is hiring.\nWe've been growing fast, and are looking for strong C++, systems, and application engineers. As a highly vertically integrate gaming platform, we've got a lot of hard problems to solve - from programming language design (see OP!) to debugger tooling.",{"type":378,"tag":379,"props":1735,"children":1736},{},[1737],{"type":390,"value":1738},"You can email me at my username plus roblox.com.",{"type":378,"tag":379,"props":1740,"children":1741},{},[1742,1748,1754],{"type":378,"tag":383,"props":1743,"children":1746},{"href":1744,"rel":1745},"https://www.planimeter.org/grid-sdk/",[387],[1747],{"type":390,"value":1744},{"type":378,"tag":383,"props":1749,"children":1752},{"href":1750,"rel":1751},"https://github.com/Planimeter/grid-sdk/blob/master/class.lua",[387],[1753],{"type":390,"value":1750},{"type":378,"tag":383,"props":1755,"children":1758},{"href":1756,"rel":1757},"https://github.com/Planimeter/grid-sdk",[387],[1759],{"type":390,"value":1756},{"type":378,"tag":379,"props":1761,"children":1762},{},[1763,1765],{"type":390,"value":1764},"Song Maker: ",{"type":378,"tag":383,"props":1766,"children":1769},{"href":1767,"rel":1768},"https://musiclab.chromeexperiments.com/Song-Maker/song/5787245861666816",[387],[1770],{"type":390,"value":1767},{"type":378,"tag":379,"props":1772,"children":1773},{},[1774,1776],{"type":390,"value":1775},"Game maker on top of pixi.js? ",{"type":378,"tag":383,"props":1777,"children":1780},{"href":1778,"rel":1779},"https://ctjs.rocks",[387],[1781],{"type":390,"value":1778},{"type":378,"tag":379,"props":1783,"children":1784},{},[1785,1787],{"type":390,"value":1786},"Js mod\nPlayer ",{"type":378,"tag":383,"props":1788,"children":1791},{"href":1789,"rel":1790},"https://keithclark.github.io/ZzFXM/",[387],[1792],{"type":390,"value":1789},{"title":369,"searchDepth":441,"depth":441,"links":1794},[1795,1796,1797,1798,1801,1802,1803,1804,1805,1806,1807,1808,1809],{"id":1092,"depth":502,"text":1095},{"id":1117,"depth":502,"text":1120},{"id":1212,"depth":441,"text":1215},{"id":1269,"depth":441,"text":1272,"children":1799},[1800],{"id":1343,"depth":502,"text":1346},{"id":1508,"depth":441,"text":1511},{"id":1525,"depth":441,"text":1528},{"id":1550,"depth":441,"text":1553},{"id":1571,"depth":441,"text":1574},{"id":1595,"depth":441,"text":1598},{"id":1610,"depth":441,"text":1613},{"id":1664,"depth":441,"text":1667},{"id":90,"depth":441,"text":89},{"id":1694,"depth":441,"text":1697},"content:notes-to-self:playkode-research.md","notes-to-self/playkode-research.md","notes-to-self/playkode-research",{"_path":1814,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":92,"description":1815,"slug":93,"date":1816,"dateString":1817,"encrypted":368,"encryptedBody":373,"body":1818,"_type":443,"_id":1869,"_source":445,"_file":1870,"_stem":1871,"_extension":448},"/notes-to-self/frameworks-and-libraries-of-interest","SOD - An Embedded Computer Vision & Machine Learning Library via",1590508800000,"2020.05.26",{"type":375,"children":1819,"toc":1866},[1820,1838,1849,1855],{"type":378,"tag":379,"props":1821,"children":1822},{},[1823,1830,1831],{"type":378,"tag":383,"props":1824,"children":1827},{"href":1825,"rel":1826},"https://sod.pixlab.io",[387],[1828],{"type":390,"value":1829},"SOD - An Embedded Computer Vision & Machine Learning Library",{"type":390,"value":969},{"type":378,"tag":383,"props":1832,"children":1835},{"href":1833,"rel":1834},"https://news.ycombinator.com/item?id=23306480",[387],[1836],{"type":390,"value":1837},"via",{"type":378,"tag":379,"props":1839,"children":1840},{},[1841,1843],{"type":390,"value":1842},"Open 3D Engine ",{"type":378,"tag":383,"props":1844,"children":1847},{"href":1845,"rel":1846},"https://news.ycombinator.com/item?id=27751358",[387],[1848],{"type":390,"value":1845},{"type":378,"tag":455,"props":1850,"children":1852},{"id":1851},"_20221007",[1853],{"type":390,"value":1854},"2022.10.07",{"type":378,"tag":379,"props":1856,"children":1857},{},[1858,1864],{"type":378,"tag":383,"props":1859,"children":1862},{"href":1860,"rel":1861},"https://shoelace.style",[387],[1863],{"type":390,"value":1860},{"type":390,"value":1865}," - web components, framework agnostic",{"title":369,"searchDepth":441,"depth":441,"links":1867},[1868],{"id":1851,"depth":502,"text":1854},"content:notes-to-self:frameworks-and-libraries-of-interest.md","notes-to-self/frameworks-and-libraries-of-interest.md","notes-to-self/frameworks-and-libraries-of-interest",{"_path":1873,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":320,"description":1874,"slug":321,"date":1875,"dateString":1876,"encrypted":368,"encryptedBody":373,"body":1877,"_type":443,"_id":2213,"_source":445,"_file":2214,"_stem":2215,"_extension":448},"/notes-to-self/tools-books","https://gifrun.com/",1589212800000,"2020.05.11",{"type":375,"children":1878,"toc":2211},[1879,1887,1904,1914,1924,1942,1952,1962,1974,1994,2008,2013,2018,2028,2037,2048,2058,2069,2087,2092,2097,2102,2113,2125,2135,2145,2155,2165,2175,2185,2197,2202],{"type":378,"tag":379,"props":1880,"children":1881},{},[1882],{"type":378,"tag":383,"props":1883,"children":1885},{"href":1874,"rel":1884},[387],[1886],{"type":390,"value":1874},{"type":378,"tag":379,"props":1888,"children":1889},{},[1890,1896,1898],{"type":378,"tag":383,"props":1891,"children":1894},{"href":1892,"rel":1893},"https://news.ycombinator.com/item?id=23203699",[387],[1895],{"type":390,"value":1892},{"type":390,"value":1897}," Game Programming Patterns - Study Notes ",{"type":378,"tag":383,"props":1899,"children":1902},{"href":1900,"rel":1901},"https://tylerayoung.com/2017/01/23/notes-on-game-programming-patterns-by-robert-nystrom/",[387],[1903],{"type":390,"value":1900},{"type":378,"tag":379,"props":1905,"children":1906},{},[1907],{"type":378,"tag":383,"props":1908,"children":1911},{"href":1909,"rel":1910},"https://news.ycombinator.com/item?id=23337091",[387],[1912],{"type":390,"value":1913},"AudioMass – free, open source, web-based Audio and Waveform editor",{"type":378,"tag":379,"props":1915,"children":1916},{},[1917],{"type":378,"tag":383,"props":1918,"children":1921},{"href":1919,"rel":1920},"https://news.ycombinator.com/item?id=23339776",[387],[1922],{"type":390,"value":1923},"faster google fonts",{"type":378,"tag":379,"props":1925,"children":1926},{},[1927,1934,1935],{"type":378,"tag":383,"props":1928,"children":1931},{"href":1929,"rel":1930},"https://gwfh.mranftl.com/fonts",[387],[1932],{"type":390,"value":1933},"Google web font helper",{"type":390,"value":969},{"type":378,"tag":383,"props":1936,"children":1939},{"href":1937,"rel":1938},"https://google-webfonts-helper.herokuapp.com",[387],[1940],{"type":390,"value":1941},"formerly on Heroku",{"type":378,"tag":379,"props":1943,"children":1944},{},[1945],{"type":378,"tag":383,"props":1946,"children":1949},{"href":1947,"rel":1948},"https://news.ycombinator.com/item?id=23335759",[387],[1950],{"type":390,"value":1951},"trillium notes",{"type":378,"tag":379,"props":1953,"children":1954},{},[1955],{"type":378,"tag":383,"props":1956,"children":1959},{"href":1957,"rel":1958},"https://news.ycombinator.com/item?id=23334190",[387],[1960],{"type":390,"value":1961},"micro - editor for sublime types",{"type":378,"tag":379,"props":1963,"children":1964},{},[1965,1972],{"type":378,"tag":383,"props":1966,"children":1969},{"href":1967,"rel":1968},"https://news.ycombinator.com/item?id=23698305",[387],[1970],{"type":390,"value":1971},"Entr",{"type":390,"value":1973},": Rerun your build when files change",{"type":378,"tag":379,"props":1975,"children":1976},{},[1977,1984,1985,1992],{"type":378,"tag":383,"props":1978,"children":1981},{"href":1979,"rel":1980},"https://news.ycombinator.com/item?id=23693029",[387],[1982],{"type":390,"value":1983},"linear issue tracker",{"type":390,"value":969},{"type":378,"tag":383,"props":1986,"children":1989},{"href":1987,"rel":1988},"https://linear.app",[387],[1990],{"type":390,"value":1991},"linear.app",{"type":390,"value":1993}," Jira replacement. Free plan allows for 250 issues but unlimited archived issues.",{"type":378,"tag":379,"props":1995,"children":1996},{},[1997,1999,2006],{"type":390,"value":1998},"Also see ",{"type":378,"tag":383,"props":2000,"children":2003},{"href":2001,"rel":2002},"https://plane.so",[387],[2004],{"type":390,"value":2005},"plane.so",{"type":390,"value":2007}," which is open source (and very Jira equivalent). Free plan allows for 1,000 issues.",{"type":378,"tag":379,"props":2009,"children":2010},{},[2011],{"type":390,"value":2012},"Linear seems like the original Jira replacement. Plane seems like a clone of Linear.",{"type":378,"tag":379,"props":2014,"children":2015},{},[2016],{"type":390,"value":2017},"See also taiga.io. Less-slick UI. Maybe slower. But unlimited use.",{"type":378,"tag":379,"props":2019,"children":2020},{},[2021],{"type":378,"tag":383,"props":2022,"children":2025},{"href":2023,"rel":2024},"https://news.ycombinator.com/item?id=23694667",[387],[2026],{"type":390,"value":2027},"learn lua in 15 minutes",{"type":378,"tag":379,"props":2029,"children":2030},{},[2031],{"type":378,"tag":383,"props":2032,"children":2035},{"href":2033,"rel":2034},"https://www.reddit.com/r/gameassets/",[387],[2036],{"type":390,"value":2033},{"type":378,"tag":379,"props":2038,"children":2039},{},[2040,2046],{"type":378,"tag":383,"props":2041,"children":2044},{"href":2042,"rel":2043},"https://news.ycombinator.com/item?id=23926395",[387],[2045],{"type":390,"value":2042},{"type":390,"value":2047}," build your own arcade cabinet - looks easier than ever",{"type":378,"tag":379,"props":2049,"children":2050},{},[2051],{"type":378,"tag":383,"props":2052,"children":2055},{"href":2053,"rel":2054},"https://app.justsketch.me",[387],[2056],{"type":390,"value":2057},"Character Poser - justsketch.me",{"type":378,"tag":379,"props":2059,"children":2060},{},[2061,2063],{"type":390,"value":2062},"Self hosted knowledge base/silo ",{"type":378,"tag":383,"props":2064,"children":2067},{"href":2065,"rel":2066},"https://news.ycombinator.com/item?id=29969757",[387],[2068],{"type":390,"value":2065},{"type":378,"tag":379,"props":2070,"children":2071},{},[2072,2074,2080,2081],{"type":390,"value":2073},"Free Postgres for side projects? ",{"type":378,"tag":383,"props":2075,"children":2078},{"href":2076,"rel":2077},"https://fly.io/blog/free-postgres/",[387],[2079],{"type":390,"value":2076},{"type":390,"value":1041},{"type":378,"tag":383,"props":2082,"children":2085},{"href":2083,"rel":2084},"https://news.ycombinator.com/item?id=30018197",[387],[2086],{"type":390,"value":2083},{"type":378,"tag":379,"props":2088,"children":2089},{},[2090],{"type":390,"value":2091},"Charm.sh",{"type":378,"tag":379,"props":2093,"children":2094},{},[2095],{"type":390,"value":2096},"WebGPT",{"type":378,"tag":379,"props":2098,"children":2099},{},[2100],{"type":390,"value":2101},"Tango.us - for automatic guide making? Also scribehow and flameshot",{"type":378,"tag":379,"props":2103,"children":2104},{},[2105,2107],{"type":390,"value":2106},"Good web font practices 2022 ",{"type":378,"tag":383,"props":2108,"children":2111},{"href":2109,"rel":2110},"https://simonhearne.com/2021/layout-shifts-webfonts/",[387],[2112],{"type":390,"value":2109},{"type":378,"tag":379,"props":2114,"children":2115},{},[2116,2123],{"type":378,"tag":383,"props":2117,"children":2120},{"href":2118,"rel":2119},"https://asciiflow.com/#/",[387],[2121],{"type":390,"value":2122},"ASCII flowchart maker",{"type":390,"value":2124}," for diagrams in comments. Pretty great but you can't move text?",{"type":378,"tag":379,"props":2126,"children":2127},{},[2128],{"type":378,"tag":383,"props":2129,"children":2132},{"href":2130,"rel":2131},"https://tally.so",[387],[2133],{"type":390,"value":2134},"Tally, Web Form Creator",{"type":378,"tag":379,"props":2136,"children":2137},{},[2138],{"type":378,"tag":383,"props":2139,"children":2142},{"href":2140,"rel":2141},"https://css-tricks.com/snippets/css/a-guide-to-flexbox/",[387],[2143],{"type":390,"value":2144},"Complete guide to Flexbox",{"type":378,"tag":379,"props":2146,"children":2147},{},[2148],{"type":378,"tag":383,"props":2149,"children":2152},{"href":2150,"rel":2151},"https://cssgridgarden.com",[387],[2153],{"type":390,"value":2154},"A game to learn CSS Grid",{"type":378,"tag":379,"props":2156,"children":2157},{},[2158],{"type":378,"tag":383,"props":2159,"children":2162},{"href":2160,"rel":2161},"https://flexboxfroggy.com",[387],[2163],{"type":390,"value":2164},"A game to learn CSS Flexbox",{"type":378,"tag":379,"props":2166,"children":2167},{},[2168],{"type":378,"tag":383,"props":2169,"children":2172},{"href":2170,"rel":2171},"https://songshift.com/pro",[387],[2173],{"type":390,"value":2174},"Songshift for transferring Spotify playlists to Apple Music",{"type":378,"tag":379,"props":2176,"children":2177},{},[2178],{"type":378,"tag":383,"props":2179,"children":2182},{"href":2180,"rel":2181},"https://tailwindcomponents.com/component/modal-3",[387],[2183],{"type":390,"value":2184},"Tailwind CSS Modal",{"type":378,"tag":379,"props":2186,"children":2187},{},[2188,2195],{"type":378,"tag":383,"props":2189,"children":2192},{"href":2190,"rel":2191},"https://news.ycombinator.com/item?id=30750788",[387],[2193],{"type":390,"value":2194},"typescript stuff for sublime",{"type":390,"value":2196}," lsp?",{"type":378,"tag":379,"props":2198,"children":2199},{},[2200],{"type":390,"value":2201},"Diagrams.net",{"type":378,"tag":379,"props":2203,"children":2204},{},[2205],{"type":378,"tag":383,"props":2206,"children":2209},{"href":2207,"rel":2208},"https://sw.kovidgoyal.net/kitty/quickstart/",[387],[2210],{"type":390,"value":2207},{"title":369,"searchDepth":441,"depth":441,"links":2212},[],"content:notes-to-self:tools-books.md","notes-to-self/tools-books.md","notes-to-self/tools-books",{"_path":2217,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":347,"description":2218,"slug":348,"date":2219,"dateString":2220,"encrypted":368,"encryptedBody":373,"body":2221,"_type":443,"_id":2234,"_source":445,"_file":2235,"_stem":2236,"_extension":448},"/notes-to-self/whats-an-entity-component-system","EnTT",1589040000000,"May 9, 2020",{"type":375,"children":2222,"toc":2232},[2223],{"type":378,"tag":379,"props":2224,"children":2225},{},[2226],{"type":378,"tag":383,"props":2227,"children":2230},{"href":2228,"rel":2229},"https://news.ycombinator.com/item?id=23128702",[387],[2231],{"type":390,"value":2218},{"title":369,"searchDepth":441,"depth":441,"links":2233},[],"content:notes-to-self:whats-an-entity-component-system.md","notes-to-self/whats-an-entity-component-system.md","notes-to-self/whats-an-entity-component-system",{"_path":2238,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":290,"description":2239,"slug":291,"date":2240,"dateString":2241,"encrypted":2242,"encryptedBody":2243,"body":2244,"_type":443,"_id":2264,"_source":445,"_file":2265,"_stem":2266,"_extension":448},"/notes-to-self/ssh-tips","https://news.ycombinator.com/item?id=23025756",1588262400000,"2020-04-30",true,"0-LsWmNKYM1gAt3Utc7pXPisZdSupJDDA0CInxaTeEMqyypNa17hCmuN4SkPDPnA5s0BGsGIfvTJmP1WSG0wspVcjBhfU9eJksjcEEy-Z3cZI6jp4l9E4IyX-f7_WPqNwDKDXpDW0YffvJXkBfzPFBKbwDj0nuOF-ANfBAa0UDVFKWmghF9qcqUNdFmy4E3llOPu3F0gZP9r-KkPr98UrJxnxZoNVFcpliorL8pDxfBRiE-rMz0tH0ACFSAtwi6u6lwKa7fOdF9dAJb1ydDTULRhgNqhjJOFZQlGvpmW1iCw1uSJNdJ6QREa-WeLNr0RTl_SkM59HOv-9f4gNTOyco_Bg2EbY0J3SmHLnAl_d-4tf9T4lxAFuH9d8UrW6UfuTrBatBT51XRtl5R9Dhjl8I-qcwIo1iLtPwmSZECM9sI1eIlbFMgZr62JUEZLCc1wirKkZng1qjDAFo94bjFHqZMinx2xV3Xb4sQb6wetxLhacvECjXzdC27e6AVEJpRcf34POXt37xOqR4fMpljk2vB5urZizyiwLo-cZdEjSkeJOlQccm3w2j8nIOQy87zuYi-nehvn2-gLVMI",{"type":375,"children":2245,"toc":2262},[2246,2254],{"type":378,"tag":379,"props":2247,"children":2248},{},[2249],{"type":378,"tag":383,"props":2250,"children":2252},{"href":2239,"rel":2251},[387],[2253],{"type":390,"value":2239},{"type":378,"tag":543,"props":2255,"children":2257},{"code":2256},"$ ssh -J user@interemdest user@finaldest\n",[2258],{"type":378,"tag":551,"props":2259,"children":2260},{"__ignoreMap":369},[2261],{"type":390,"value":2256},{"title":369,"searchDepth":441,"depth":441,"links":2263},[],"content:notes-to-self:ssh-tips.md","notes-to-self/ssh-tips.md","notes-to-self/ssh-tips",{"_path":2268,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":83,"description":2269,"slug":84,"date":2270,"dateString":2271,"encrypted":368,"encryptedBody":373,"body":2272,"_type":443,"_id":2299,"_source":445,"_file":2300,"_stem":2301,"_extension":448},"/notes-to-self/fast-pseudo-random-number-generator","https://espadrine.github.io/blog/posts/shishua-the-fastest-prng-in-the-world.html https://github.com/espadrine/shishua via https://news.ycombinator.com/item?id=22907539",1587225600000,"2020-04-18",{"type":375,"children":2273,"toc":2297},[2274],{"type":378,"tag":379,"props":2275,"children":2276},{},[2277,2283,2284,2290,2291],{"type":378,"tag":383,"props":2278,"children":2281},{"href":2279,"rel":2280},"https://espadrine.github.io/blog/posts/shishua-the-fastest-prng-in-the-world.html",[387],[2282],{"type":390,"value":2279},{"type":390,"value":969},{"type":378,"tag":383,"props":2285,"children":2288},{"href":2286,"rel":2287},"https://github.com/espadrine/shishua",[387],[2289],{"type":390,"value":2286},{"type":390,"value":1041},{"type":378,"tag":383,"props":2292,"children":2295},{"href":2293,"rel":2294},"https://news.ycombinator.com/item?id=22907539",[387],[2296],{"type":390,"value":2293},{"title":369,"searchDepth":441,"depth":441,"links":2298},[],"content:notes-to-self:fast-pseudo-random-number-generator.md","notes-to-self/fast-pseudo-random-number-generator.md","notes-to-self/fast-pseudo-random-number-generator",1776608492459]