-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.html
163 lines (158 loc) · 49 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
<!DOCTYPE html>
<html lang="en" class="light-mode">
<head>
<meta charset="utf-8" />
<link rel="icon" href="./favicon.png" />
<link rel="stylesheet" type="text/css" href="./site.css" />
<meta name="viewport" content="width=device-width" />
<link href="./_app/immutable/assets/2.a24120da.css" rel="stylesheet">
<link href="./_app/immutable/assets/sterling.ba12fde9.css" rel="stylesheet">
<link href="./_app/immutable/assets/Header.9b742ac5.css" rel="stylesheet">
<link href="./_app/immutable/assets/4.c755779d.css" rel="stylesheet">
<link href="./_app/immutable/assets/Link.202292e5.css" rel="stylesheet">
<link href="./_app/immutable/assets/Post.a1c147c5.css" rel="stylesheet">
<link href="./_app/immutable/assets/9.b28aacdf.css" rel="stylesheet">
<link href="./_app/immutable/assets/11.0362a518.css" rel="stylesheet">
<link href="./_app/immutable/assets/Quote.1f3f2a73.css" rel="stylesheet">
<link rel="modulepreload" href="./_app/immutable/entry/start.2c55a661.js">
<link rel="modulepreload" href="./_app/immutable/chunks/scheduler.75f5293f.js">
<link rel="modulepreload" href="./_app/immutable/chunks/singletons.74c6a932.js">
<link rel="modulepreload" href="./_app/immutable/chunks/paths.21152387.js">
<link rel="modulepreload" href="./_app/immutable/entry/app.4df5770f.js">
<link rel="modulepreload" href="./_app/immutable/chunks/index.36074062.js">
<link rel="modulepreload" href="./_app/immutable/nodes/0.1375ff03.js">
<link rel="modulepreload" href="./_app/immutable/nodes/2.20faabe2.js">
<link rel="modulepreload" href="./_app/immutable/chunks/Header.5ff96dfd.js">
<link rel="modulepreload" href="./_app/immutable/chunks/spread.8a54911c.js">
<link rel="modulepreload" href="./_app/immutable/nodes/4.7db8b3a4.js">
<link rel="modulepreload" href="./_app/immutable/chunks/each.e59479a4.js">
<link rel="modulepreload" href="./_app/immutable/nodes/8.1d820e73.js">
<link rel="modulepreload" href="./_app/immutable/chunks/Link.94f51915.js">
<link rel="modulepreload" href="./_app/immutable/chunks/NpmIcon.b54d2cdc.js">
<link rel="modulepreload" href="./_app/immutable/chunks/Post.19bcd7ab.js">
<link rel="modulepreload" href="./_app/immutable/chunks/Button.fb729d6d.js">
<link rel="modulepreload" href="./_app/immutable/nodes/6.56ae6d83.js">
<link rel="modulepreload" href="./_app/immutable/nodes/7.79d3ebc0.js">
<link rel="modulepreload" href="./_app/immutable/nodes/9.a4796c7f.js">
<link rel="modulepreload" href="./_app/immutable/nodes/11.ced93d5c.js">
<link rel="modulepreload" href="./_app/immutable/nodes/12.d6ae91ec.js">
<link rel="modulepreload" href="./_app/immutable/nodes/14.27da6994.js">
<link rel="modulepreload" href="./_app/immutable/nodes/15.e5642628.js">
<link rel="modulepreload" href="./_app/immutable/nodes/5.e9f6993d.js">
<link rel="modulepreload" href="./_app/immutable/nodes/13.eb641c83.js">
<link rel="modulepreload" href="./_app/immutable/nodes/10.8281a622.js">
<link rel="modulepreload" href="./_app/immutable/nodes/16.551def52.js">
<link rel="modulepreload" href="./_app/immutable/chunks/Quote.1a10aae0.js">
<link rel="modulepreload" href="./_app/immutable/nodes/17.a297661d.js">
<link rel="modulepreload" href="./_app/immutable/nodes/19.bb1a06e9.js">
<link rel="modulepreload" href="./_app/immutable/nodes/18.2f85159b.js">
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents"> <div class="root"><div class="header svelte-7d51k5"><a href="/" class="svelte-7d51k5" data-svelte-h="svelte-bk6u5r">geoffcox.github.io</a><span class="logo svelte-7d51k5" role="button" tabindex="-1"><svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" fill="#000000" width="60px" height="60px" class="rooster"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"><path fill="#000000" d="M365.852 31.858c-10.152 2.474-24.915 7.073-37.437 13.602-9.2 4.797-17.277 10.575-21.928 16.19-4.65 5.618-6.05 9.96-4.416 15.587l3.556 12.254-12.736-.76c-3.048-.183-4.944-.117-7.364-.262-2.42-.146-5.405-.706-8.27-1.87-3.86-1.568-9.082-4.65-16.085-8.91-.366 4.63-.58 10.108-.407 16.006.38 12.915 2.02 27.945 4.82 41.17 1.328 6.27 3.007 12.134 4.805 17.13 2.992-4.705 6.264-9.202 9.84-13.368 17.022-19.818 40.47-41.586 69.867-43.697 14.423-1.037 29.333 5.324 42.554 12.41 3.997-7.635 10.257-13.963 16.617-19.67 6.403-5.748 13.146-11.018 18.95-15.97-9.552-6.72-16.81-10.074-23.02-10.855-7.936-.998-16.028 1.45-28.835 8.828l-15.21 8.762 4.7-46.577zm-12.796 80.995a16.57 16.57 0 0 0-1.672.03c-20.817 1.494-41.72 19.098-57.5 37.47-13.842 16.117-23.36 41.13-28.65 61.556 6.866 1.127 14.21 2.21 21.564 2.43 10.95.33 20.46-1.593 25.334-5.83l7.04-6.114 5.862 7.25c4.956 6.128 10.802 14.087 14.32 23.476 1.78 4.75 2.88 10.128 2.698 15.607 12.487-2.64 23.93-7.162 28.884-12.86l5.256-6.043 6.614 4.52c10.006 6.838 19.827 14.582 26.634 25.236 1.033-3.752 1.935-7.666 2.416-11.75 1.503-12.738-.18-25.93-6.636-35.494-10.232-11.257-22.116-22.055-24.93-37.03-1.066-5.675.69-10.02 2.78-14.29 2.092-4.27 4.972-8.467 8.35-12.593 3.803-4.644 8.228-9.1 12.948-13.05-4.015-2.658-8.39-5.55-13.877-8.665-12.77-7.256-28.594-13.592-37.434-13.86zM48.52 128.626c-6.353-.037-9.976.466-9.976 1.576 2.82 12.857 7.998 26.53 15.432 39.48 26.005-3.718 53.01-5.705 80.652-5.488 26.75 8.66 54.68 16.02 80.83 25.338-25.477-4.52-50.737-6.842-75.512-7.3a489.987 489.987 0 0 0-11.82-.073c-28.5.16-56.26 2.772-82.938 7.17 4.785 32.48 20.097 79.06 50.397 120.476 32.95 45.036 82.958 84.022 156.976 94.457 58.185 8.202 107.473-4.926 132.47-31.346 12.5-13.21 19.395-29.548 19.23-49.768-.157-18.958-6.877-41.526-22.327-67.106-1.133-.884-2.3-1.766-3.52-2.654-13.164 10.368-31.666 13.752-47.895 15.322l-18.392 1.78 9.94-15.58c2.974-4.66 2.76-9.265.433-15.474-1.486-3.962-4.016-8.048-6.75-11.992-9.13 4.418-19.634 5.185-29.495 4.887-12.977-.392-25.546-2.913-33.66-4.262l-9.268-1.538 1.936-9.193c2.894-13.746 7.735-30.663 15.19-46.902-46.584-23.24-175.11-41.595-211.933-41.812zm303.762.088c8.852 0 16.186 7.384 16.186 16.213 0 8.83-7.334 16.213-16.186 16.213-8.85 0-16.187-7.384-16.187-16.213 0-8.83 7.336-16.213 16.187-16.213zm73.906 13.47l-1.707.936c-5.958 3.275-13.704 10.08-19.133 16.71-2.715 3.316-4.887 6.612-6.11 9.108-.885 1.807-1.032 3.154-1.13 3.35 1.295 5.8 10.486 16.914 20.966 28.522l.387.427.326.473a54.88 54.88 0 0 1 4.754 8.342c11.47.563 23.966-.753 38.652-3.727l-41.35-30.937s37.437.748 51.126-1.635c4.696-.818-25.494-22.228-46.78-31.57zM160.52 231.076l17.516 4.15c-1.628 6.866-6.334 11.36-11.355 15.008-5.02 3.65-10.874 6.607-17 9.354-5.37 2.408-10.923 4.598-16.195 6.698 17.247 7.16 39.738 12.514 57.944 7.756l8.135-2.127 2.672 7.975c2.102 6.27.8 12.92-1.97 18.097-2.766 5.176-6.815 9.438-11.452 13.343-4.408 3.713-9.428 7.075-14.636 10.11 1.512.4 2.75.78 4.413 1.185 16.154 3.923 39.21 7.99 62.21 9.678 22.997 1.688 46.086.824 61.544-4.053 7.728-2.44 13.347-5.8 16.605-9.553 3.26-3.753 4.8-7.815 4.16-14.64l17.922-1.678c1.02 10.888-2.2 20.873-8.49 28.12-6.29 7.245-15.014 11.835-24.78 14.917-19.536 6.163-44.068 6.615-68.28 4.837-24.213-1.778-47.956-5.964-65.14-10.137-8.59-2.087-15.446-4.112-20.384-6.105-2.47-.997-4.277-1.582-6.817-3.805-1.27-1.112-3.838-3.195-3.59-8.084.122-2.444 1.414-4.847 2.696-6.168 1.28-1.32 2.438-1.895 3.368-2.295 9.76-4.196 20.562-10.17 27.602-16.098a41.493 41.493 0 0 0 3.95-3.828c-28.726 2.026-57.113-10.163-73.773-20.45l-13.646-8.425 14.302-7.258c9.833-4.99 23.145-9.453 34.26-14.44 5.56-2.492 10.508-5.107 13.787-7.49 3.277-2.38 4.37-4.38 4.42-4.597zM132.378 373.31c-9.94 10.178-24.66 20.105-40.18 28.05-6.34-7.936-13.154-15.46-20.445-22.242L59.495 392.3c5.485 5.1 10.75 10.778 15.762 16.814-5.725 2.31-11.364 4.275-16.715 5.793l4.914 17.315c6.655-1.89 13.604-4.25 20.605-7.035-.004 16.89-1.79 35.74-6.532 48.816l16.92 6.14c3.645-10.05 5.755-21.453 6.826-32.9 4.775 8.44 9.016 16.875 12.606 24.934l16.443-7.326c-6.96-15.626-16.04-32.46-26.976-48.42 16.785-8.633 32.574-19.633 43.97-32.488a244.225 244.225 0 0 1-14.94-10.632zm301.435 35.127c-15.158.19-32.163 7.857-49.21 18.494a196.634 196.634 0 0 0-20.456 14.66c-6.71-5.158-13.73-10.692-20.86-16.23a1086.232 1086.232 0 0 0-7.88-6.062c-7.882 1.91-16.138 3.324-24.705 4.232 7.053 4.96 14.317 10.433 21.545 16.047 6.184 4.802 12.332 9.672 18.37 14.354-4.958 5.056-9.45 10.33-13.243 15.735l14.734 10.34c3.507-4.998 7.984-10.123 13.076-15.117 5.09 3.68 10.056 7.083 14.82 9.965l9.317-15.4a143.322 143.322 0 0 1-4.667-2.96c19.407-2.33 39.054-.35 52.653 2.676l3.91-17.57c-10.58-2.356-23.95-4.223-38.416-4.275l-.19.002c13.615-7.218 26.607-11.223 33.21-10.857l1-17.97a44.232 44.232 0 0 0-3.007-.063z"></path></g></svg></span> </div> <div class="content"><div class="page svelte-rpk840"><div class="columns svelte-rpk840 zero-column"><div class="column svelte-rpk840"><div class="post svelte-nmvp7s"> <div class="headline svelte-nmvp7s"><a href="/resume" class="svelte-nmvp7s">A Better Resume</a></div> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s"><div class="content"><p data-svelte-h="svelte-qtuzt2">Last summer, I took on a full rewrite of my resume.</p> <p data-svelte-h="svelte-13x6l42">I had been bothered by the conflict between having signficant experience and that most folks don't
read past the first page. People don't spend more than a minute scanning a resume to
see what might be interesting.</p> <p data-svelte-h="svelte-1f71xe6">How did I get down to a single page?</p> <ul data-svelte-h="svelte-hvdh89"><li>Put a short summary of my current work at the top to let people know what I'm doing right now</li> <li>Separated my biggest accomplishments separate from my list of jobs</li> <li>Reduced my experience to include my last 10 years</li> <li>Added short summaries to my most popular open source projects</li> <li>Borrowed a format from some other resume templates to put supporting information in the left
column.</li></ul> <p data-svelte-h="svelte-1245d7i">I'm very happy with the result. You can check it out the PDF here:</p></div></div> </div> <div class="links svelte-nmvp7s"><div class="link svelte-j5c9xl"><a href="/geoffcoxresume.pdf" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 512 512" fill="#000000"><path d="M64 464l48 0 0 48-48 0c-35.3 0-64-28.7-64-64L0 64C0 28.7 28.7 0 64 0L229.5 0c17 0 33.3 6.7 45.3 18.7l90.5 90.5c12 12 18.7 28.3 18.7 45.3L384 304l-48 0 0-144-80 0c-17.7 0-32-14.3-32-32l0-80L64 48c-8.8 0-16 7.2-16 16l0 384c0 8.8 7.2 16 16 16zM176 352l32 0c30.9 0 56 25.1 56 56s-25.1 56-56 56l-16 0 0 32c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-48 0-80c0-8.8 7.2-16 16-16zm32 80c13.3 0 24-10.7 24-24s-10.7-24-24-24l-16 0 0 48 16 0zm96-80l32 0c26.5 0 48 21.5 48 48l0 64c0 26.5-21.5 48-48 48l-32 0c-8.8 0-16-7.2-16-16l0-128c0-8.8 7.2-16 16-16zm32 128c8.8 0 16-7.2 16-16l0-64c0-8.8-7.2-16-16-16l-16 0 0 96 16 0zm80-112c0-8.8 7.2-16 16-16l48 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-32 0 0 32 32 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-32 0 0 48c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-64 0-64z"></path></svg></a> </div> </div> </div><div class="post svelte-nmvp7s"><div class="category svelte-nmvp7s">Open Source Component Library</div> <div class="headline svelte-nmvp7s"><a href="/sterling-svelte" class="svelte-nmvp7s">sterling-svelte 2.0</a></div> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s limit-height"><div class="content"><p data-svelte-h="svelte-3xt18h"><i>sterling-svelte is a modern, accessible, lightweight component UI library for Svelte.</i></p> <p data-svelte-h="svelte-2s0ca5">Now available: sterling-svelte 2.0!</p> <p data-svelte-h="svelte-1vgnlcw">Version 2 is built on Svelte 5.
It took about a month of calendar time and a week of effort to update.
There are some breaking changes from Svelte 4.</p> <p data-svelte-h="svelte-197d3i">You can check it out here:</p></div></div> </div> <div class="links svelte-nmvp7s"><a href="https://github.com/GeoffCox/sterling-svelte" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="30px" height="30px" viewBox="-3 -3 30 30"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C6.47715 2 2 6.47715 2 12C2 17.5229 6.47715 22 12 22C17.5229 22 22 17.5229 22 12C22 6.47715 17.5229 2 12 2ZM0 12C0 5.3726 5.3726 0 12 0C18.6274 0 24 5.3726 24 12C24 18.6274 18.6274 24 12 24C5.3726 24 0 18.6274 0 12Z" fill="rgba(0,0,0,0.7)" stroke="none"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M9.59162 22.7357C9.49492 22.6109 9.49492 21.4986 9.59162 19.399C8.55572 19.4347 7.90122 19.3628 7.62812 19.1833C7.21852 18.9139 6.80842 18.0833 6.44457 17.4979C6.08072 16.9125 5.27312 16.8199 4.94702 16.6891C4.62091 16.5582 4.53905 16.0247 5.84562 16.4282C7.15222 16.8316 7.21592 17.9303 7.62812 18.1872C8.04032 18.4441 9.02572 18.3317 9.47242 18.1259C9.91907 17.9201 9.88622 17.1538 9.96587 16.8503C10.0666 16.5669 9.71162 16.5041 9.70382 16.5018C9.26777 16.5018 6.97697 16.0036 6.34772 13.7852C5.71852 11.5669 6.52907 10.117 6.96147 9.49369C7.24972 9.07814 7.22422 8.19254 6.88497 6.83679C8.11677 6.67939 9.06732 7.06709 9.73672 7.99999C9.73737 8.00534 10.6143 7.47854 12.0001 7.47854C13.386 7.47854 13.8777 7.90764 14.2571 7.99999C14.6365 8.09234 14.94 6.36699 17.2834 6.83679C16.7942 7.79839 16.3844 8.99999 16.6972 9.49369C17.0099 9.98739 18.2372 11.5573 17.4833 13.7852C16.9807 15.2706 15.9927 16.1761 14.5192 16.5018C14.3502 16.5557 14.2658 16.6427 14.2658 16.7627C14.2658 16.9427 14.4942 16.9624 14.8233 17.8058C15.0426 18.368 15.0585 19.9739 14.8708 22.6234C14.3953 22.7445 14.0254 22.8257 13.7611 22.8673C13.2924 22.9409 12.7835 22.9822 12.2834 22.9982C11.7834 23.0141 11.6098 23.0123 10.9185 22.948C10.4577 22.9051 10.0154 22.8343 9.59162 22.7357Z" fill="rgba(0,0,0,0.7)" stroke="none"></path></svg></a> <a href="https://geoffcox.github.io/docs/sterling-svelte/" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="26px" height="26px" viewBox="0 0 16 16"><path d="M1 2.828c.885-.37 2.154-.769 3.388-.893 1.33-.134 2.458.063 3.112.752v9.746c-.935-.53-2.12-.603-3.213-.493-1.18.12-2.37.461-3.287.811V2.828zm7.5-.141c.654-.689 1.782-.886 3.112-.752 1.234.124 2.503.523 3.388.893v9.923c-.918-.35-2.107-.692-3.287-.81-1.094-.111-2.278-.039-3.213.492V2.687zM8 1.783C7.015.936 5.587.81 4.287.94c-1.514.153-3.042.672-3.994 1.105A.5.5 0 0 0 0 2.5v11a.5.5 0 0 0 .707.455c.882-.4 2.303-.881 3.68-1.02 1.409-.142 2.59.087 3.223.877a.5.5 0 0 0 .78 0c.633-.79 1.814-1.019 3.222-.877 1.378.139 2.8.62 3.681 1.02A.5.5 0 0 0 16 13.5v-11a.5.5 0 0 0-.293-.455c-.952-.433-2.48-.952-3.994-1.105C10.413.809 8.985.936 8 1.783z"></path></svg></a> <a href="https://www.npmjs.com/package/@geoffcox/sterling-svelte" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" fill="#000000" width="30px" height="30px" viewBox="0 0 24 24"><path d="m12 12.534v-2.663h-1.334v2.666zm12-5.334h-24v8h6.666v1.334h5.334v-1.333h12zm-17.334 1.334v5.337h-1.333v-4h-1.334v4h-2.666v-5.334zm6.667 0v5.337h-2.666v1.334h-2.666v-6.666zm9.333 0v5.337h-1.333v-4h-1.334v4h-1.334v-4h-1.333v4h-2.667v-5.334z"></path></svg> </a> </div> </div><div class="post svelte-nmvp7s"><div class="category svelte-nmvp7s">Open Source Library (2023-12-21)</div> <div class="headline svelte-nmvp7s"><a href="/trie-search" class="svelte-nmvp7s">trie-search</a></div> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s limit-height"><div class="content"><p data-svelte-h="svelte-1kn9m07">When working on the Language Understanding Intelligence Service, we needed to efficiently find
all the occurances of multiple strings in a large body of text. <a href="https://www.linkedin.com/in/matthewfhurst/" target="_blank">Matthew Hurst</a> told me about Trie
search and how the tree structure could match multiple search phrases at once. His team
implemented the search on the server in C#.</p> <p data-svelte-h="svelte-rvtg6b">Later, on my pretty-good-nlp project I needed to find multiple phrases in a string and looked for
a good Trie search implementation in Typescript. I found some partial JavaScript implementations
but they had a few bugs and failed to find instances where one search phrase was a sub-phrase of another.</p> <p data-svelte-h="svelte-1xojz33">I wrote up my own implementation and decided that it was good enough to extract into its own package.
Working on examples, I realized I could make the algorithm handle more than just words
(i.e. tokenized text) and could leverage the <code>Iterator<T></code>.</p></div></div> </div> <div class="links svelte-nmvp7s"><div class="link svelte-j5c9xl"><a href="https://github.com/GeoffCox/trie-search/blob/main/lib/README.md" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" width="30px" height="30px" viewBox="-3 -3 30 30"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C6.47715 2 2 6.47715 2 12C2 17.5229 6.47715 22 12 22C17.5229 22 22 17.5229 22 12C22 6.47715 17.5229 2 12 2ZM0 12C0 5.3726 5.3726 0 12 0C18.6274 0 24 5.3726 24 12C24 18.6274 18.6274 24 12 24C5.3726 24 0 18.6274 0 12Z" fill="rgba(0,0,0,0.7)" stroke="none"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M9.59162 22.7357C9.49492 22.6109 9.49492 21.4986 9.59162 19.399C8.55572 19.4347 7.90122 19.3628 7.62812 19.1833C7.21852 18.9139 6.80842 18.0833 6.44457 17.4979C6.08072 16.9125 5.27312 16.8199 4.94702 16.6891C4.62091 16.5582 4.53905 16.0247 5.84562 16.4282C7.15222 16.8316 7.21592 17.9303 7.62812 18.1872C8.04032 18.4441 9.02572 18.3317 9.47242 18.1259C9.91907 17.9201 9.88622 17.1538 9.96587 16.8503C10.0666 16.5669 9.71162 16.5041 9.70382 16.5018C9.26777 16.5018 6.97697 16.0036 6.34772 13.7852C5.71852 11.5669 6.52907 10.117 6.96147 9.49369C7.24972 9.07814 7.22422 8.19254 6.88497 6.83679C8.11677 6.67939 9.06732 7.06709 9.73672 7.99999C9.73737 8.00534 10.6143 7.47854 12.0001 7.47854C13.386 7.47854 13.8777 7.90764 14.2571 7.99999C14.6365 8.09234 14.94 6.36699 17.2834 6.83679C16.7942 7.79839 16.3844 8.99999 16.6972 9.49369C17.0099 9.98739 18.2372 11.5573 17.4833 13.7852C16.9807 15.2706 15.9927 16.1761 14.5192 16.5018C14.3502 16.5557 14.2658 16.6427 14.2658 16.7627C14.2658 16.9427 14.4942 16.9624 14.8233 17.8058C15.0426 18.368 15.0585 19.9739 14.8708 22.6234C14.3953 22.7445 14.0254 22.8257 13.7611 22.8673C13.2924 22.9409 12.7835 22.9822 12.2834 22.9982C11.7834 23.0141 11.6098 23.0123 10.9185 22.948C10.4577 22.9051 10.0154 22.8343 9.59162 22.7357Z" fill="rgba(0,0,0,0.7)" stroke="none"></path></svg></a> </div> <div class="link svelte-j5c9xl"><a href="https://geoffcox.github.io/demos/trie-search/" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="24px" height="24px" viewBox="0 0 16 16"><path d="M8 0a.5.5 0 0 1 .473.337L9.046 2H14a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1h-1.85l1.323 3.837a.5.5 0 1 1-.946.326L11.092 11H8.5v3a.5.5 0 0 1-1 0v-3H4.908l-1.435 4.163a.5.5 0 1 1-.946-.326L3.85 11H2a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h4.954L7.527.337A.5.5 0 0 1 8 0zM2 3v7h12V3H2z"></path></svg></a> </div> </div> </div><div class="post svelte-nmvp7s"><div class="category svelte-nmvp7s">Story</div> <div class="headline svelte-nmvp7s"><a href="speed-estimation" class="svelte-nmvp7s">Speed Estimation</a></div> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s limit-height"><div class="content"><p data-svelte-h="svelte-zi2g9c">One evening, when I was working on a large customer data store, there was an emergency team
meeting to figure out how to handle a bug that had incorrectly hashed the Passport
authentication identifiers in our SQL databases. About 20 of us were called into a 10 person
conference room to discuss options.</p> <p data-svelte-h="svelte-139gv2o">A dev on my team reported he had already patched the code and had a SQL script to repair the
existing data. However, some random guy from another team had been talking to my boss and
followed us into the meeting room. He decided to take over the meeting and loudly declared that
we first had to estimate how long running the script would take. My boss, normally outspoken and
decisive, deferred to him. Everyone assumed he must be important and knew what he was doing.</p> <p data-svelte-h="svelte-1qkpabd">He grabbed a whiteboard pen and starting doing a calculation on the board. He stated that
updating a row in SQL probably takes at best 1 millisecond when within a transaction. He also
wrote out a bunch of hash algorithm statements that he said added up to 2.5 milliseconds per
row. We had 400 million rows that needed updating. He then calculated this would take 400
million x 3.5 = 1.4 billion milliseconds => 1.4 million seconds => 23 thousand minutes
=> 388 hours => 16 days.</p> <p data-svelte-h="svelte-11ih7t0">No one could use the system until all the rows were updated. The room was in a panic. I thought
that we should get the script started ASAP. I pulled the dev and a service engineer into the
hallway to confirm they had confidence in the script and to ask them to get it running.</p> <p data-svelte-h="svelte-o6jwum">In the meantime, random guy started drawing up a shift rotation schedule for each person to be
on site watching the script run over the next 16 days. After 15 minutes, as random guy was
finalizing the shift schedule, the dev and service engineer returned. The dev whispered in my
ear the results.</p> <p data-svelte-h="svelte-9eoe3a">Random guy was literally giving a pep talk to the room about how hard it was going to be working
24 hours a day, but that it would be a worthy and valiant effort. I tried to interrupt him, but
he didn't give me any opportunity.</p> <p data-svelte-h="svelte-1j8jwfq">Finally, he finished. I let the room know that we had run the script and it completed in under
15 minutes. The script updated over 400 rows per millisecond. He muttered that was impossible as
his chest caved and he hung his head.</p> <p data-svelte-h="svelte-bcazty">While this guy was a bit of a blow hard, he followed how developers are taught to estimate
algorithms. We mentally walk through the steps, estimate the cost of each instruction, account
for loops, and multiply by the number of items to get the result.</p> <p data-svelte-h="svelte-a3ynid">The problem was that computation speed had exceeded human imagination. It is hard for humans to
understand how fast 1/400th of a millisecond goes by. We like to think we can understand that
kind of processing power, but we can't be precise enough to avoid exponential errors. This was
back in 2005. Today, that script would likely complete in seconds.</p> <p data-svelte-h="svelte-1prs90w">We shouldn't manually think through estimates. Instead, we have to run the code in a
production/test environment and measure the real performance. Don't be that (random) guy.</p></div></div> </div> </div><div class="post svelte-nmvp7s"> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s"><div class="content"><div class="quote-blurb"><div class="quote svelte-957xct">Now so much I know<br>
that things just don't grow<br>
if you don't bless them with your patience.</div> <div class="source svelte-957xct">Emmylou - First Aid Kit</div> </div></div></div> </div> </div><div class="post svelte-nmvp7s"><div class="category svelte-nmvp7s">Open Source Library</div> <div class="headline svelte-nmvp7s"><a href="/pretty-good-nlp" class="svelte-nmvp7s">pretty-good-nlp</a></div> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s limit-height"><div class="content"><p data-svelte-h="svelte-1xuqh1h">pretty-good-nlp is a deterministic, match-based, recognizer for natural language processing
(NLP) scenarios.</p> <p data-svelte-h="svelte-kag0k4">I built it so that I could have a recogizer for my machine learning applications while waiting
for data scientists to build a predictive model.</p> <p data-svelte-h="svelte-1e31anb">It has a some really nice features including phrase and pattern matching, negations, weighting,
order evaluation, and noise removal.</p></div></div> </div> <div class="links svelte-nmvp7s"><div class="link svelte-j5c9xl"><a href="https://github.com/GeoffCox/pretty-good-nlp" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" width="30px" height="30px" viewBox="-3 -3 30 30"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C6.47715 2 2 6.47715 2 12C2 17.5229 6.47715 22 12 22C17.5229 22 22 17.5229 22 12C22 6.47715 17.5229 2 12 2ZM0 12C0 5.3726 5.3726 0 12 0C18.6274 0 24 5.3726 24 12C24 18.6274 18.6274 24 12 24C5.3726 24 0 18.6274 0 12Z" fill="rgba(0,0,0,0.7)" stroke="none"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M9.59162 22.7357C9.49492 22.6109 9.49492 21.4986 9.59162 19.399C8.55572 19.4347 7.90122 19.3628 7.62812 19.1833C7.21852 18.9139 6.80842 18.0833 6.44457 17.4979C6.08072 16.9125 5.27312 16.8199 4.94702 16.6891C4.62091 16.5582 4.53905 16.0247 5.84562 16.4282C7.15222 16.8316 7.21592 17.9303 7.62812 18.1872C8.04032 18.4441 9.02572 18.3317 9.47242 18.1259C9.91907 17.9201 9.88622 17.1538 9.96587 16.8503C10.0666 16.5669 9.71162 16.5041 9.70382 16.5018C9.26777 16.5018 6.97697 16.0036 6.34772 13.7852C5.71852 11.5669 6.52907 10.117 6.96147 9.49369C7.24972 9.07814 7.22422 8.19254 6.88497 6.83679C8.11677 6.67939 9.06732 7.06709 9.73672 7.99999C9.73737 8.00534 10.6143 7.47854 12.0001 7.47854C13.386 7.47854 13.8777 7.90764 14.2571 7.99999C14.6365 8.09234 14.94 6.36699 17.2834 6.83679C16.7942 7.79839 16.3844 8.99999 16.6972 9.49369C17.0099 9.98739 18.2372 11.5573 17.4833 13.7852C16.9807 15.2706 15.9927 16.1761 14.5192 16.5018C14.3502 16.5557 14.2658 16.6427 14.2658 16.7627C14.2658 16.9427 14.4942 16.9624 14.8233 17.8058C15.0426 18.368 15.0585 19.9739 14.8708 22.6234C14.3953 22.7445 14.0254 22.8257 13.7611 22.8673C13.2924 22.9409 12.7835 22.9822 12.2834 22.9982C11.7834 23.0141 11.6098 23.0123 10.9185 22.948C10.4577 22.9051 10.0154 22.8343 9.59162 22.7357Z" fill="rgba(0,0,0,0.7)" stroke="none"></path></svg></a> </div> <div class="link svelte-j5c9xl"><a href="https://geoffcox.github.io/demos/pretty-good-nlp/" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="24px" height="24px" viewBox="0 0 16 16"><path d="M8 0a.5.5 0 0 1 .473.337L9.046 2H14a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1h-1.85l1.323 3.837a.5.5 0 1 1-.946.326L11.092 11H8.5v3a.5.5 0 0 1-1 0v-3H4.908l-1.435 4.163a.5.5 0 1 1-.946-.326L3.85 11H2a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h4.954L7.527.337A.5.5 0 0 1 8 0zM2 3v7h12V3H2z"></path></svg></a> </div> </div> </div><div class="post svelte-nmvp7s"><div class="category svelte-nmvp7s">Story</div> <div class="headline svelte-nmvp7s"><a href="unpredictable-users" class="svelte-nmvp7s">Users are unpredictable</a></div> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s limit-height"><div class="content"><p data-svelte-h="svelte-1wdsowr">Back in the days of Windows 95, my brother called me in a panic. He reported that his drive
was out of space and he couldn't figure out what to do.</p> <p data-svelte-h="svelte-2t5xhz">I walked him through selecting some files he didn't need anymore. When I told him to drag the
files to the recycle bin in Windows Explorer, he couldn't find it. I asked him to look on his
desktop and he reported it wasn't there either.</p> <p data-svelte-h="svelte-1psaswb">He then told me what he had done the day before while trying to clean up files on his desktop.
He had somehow dragged the recycle bin icon around and ended up creating a shortcut to the
recycle bin. He now had two recycle bins on his desktop. He dragged one on to to the other and
then emptied the recycle bin.</p> <p data-svelte-h="svelte-1u35y1l">Turns out he dragged the real recycle bin to the recycle bin shortcut. This put the recycle
bin control panel app into the recycle bin. When he emptied the recycle bin, the control panel
app deleted itself!</p> <p data-svelte-h="svelte-5tducc">The OS went through the recycle bin app for soft and hard deletes. Ctrl+Del didn't do
anything. We were able to open a command prompt and delete files, but this was too tedious for
him to do regularly without my help. He just kind of lived with a too full drive until he
bought his next computer.</p> <p data-svelte-h="svelte-1el10jq">I doubt any developer or tester could have predicted a user would use a shortcut to the
recycle bin to delete the recycle bin.</p></div></div> </div> </div><div class="post svelte-nmvp7s"><div class="category svelte-nmvp7s">Bookshelf</div> <div class="headline svelte-nmvp7s"><a href="software-architecture-books" class="svelte-nmvp7s">Software Architecture Books</a></div> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s limit-height"><div class="content"><p data-svelte-h="svelte-6r18i5">I've been studying software architecture throughout my career. I highly recommend these books. I
reference them to solve tough problems or when I sense something is not quite right with
existing code.</p> <div class="links svelte-1l7jmjk" data-svelte-h="svelte-fqm3km"><img src="/images/CleanArchitecture.jpg" width="46px" height="60px" alt="Clean Architecture book cover"> <a href="https://isbndb.com/book/9780134494166" target="_blank">Clean Architecture: A Craftsman's Guide to Software Structure and Design</a> <img src="/images/DesignPatterns.jpg" width="46px" height="60px" alt="Design Patterns book cover"> <a href="https://isbndb.com/book/9788178081359" target="_blank">Design Patterns: Elements of Reusable Object-Oriented Software</a> <img src="/images/EnterprisePatterns.jpg" width="46px" height="60px" alt="Entterprise Patterns book cover"> <a href="https://isbndb.com/book/9788131794029" target="_blank">Patterns of Enterprise Application Architecture</a> <img src="/images/Refactoring.jpg" width="46px" height="60px" alt="Refactoring book cover"> <a href="https://isbndb.com/book/9780201485677" target="_blank">Refactoring: Improving the Design of Existing Code</a> <img src="/images/AntiPatterns.jpg" width="46px" height="60px" alt="Anit-patterns book cover"> <a href="https://isbndb.com/book/9780471197133" target="_blank">AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis</a></div></div></div> </div> </div><div class="post svelte-nmvp7s"> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s"><div class="content"><div class="quote-blurb"><div class="quote svelte-957xct">Most of the good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.</div> <div class="source svelte-957xct">Linus Torvalds</div> </div></div></div> </div> </div><div class="post svelte-nmvp7s"><div class="category svelte-nmvp7s">Open Source Examples</div> <div class="headline svelte-nmvp7s"><a href="/recoil-examples" class="svelte-nmvp7s">recoil-examples</a></div> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s limit-height"><div class="content"><p data-svelte-h="svelte-1kiz8o2">Recoil JS is my favorite React state management library. It is a lightning-fast, minimal, and
ideomatic React. It blends MobX's observability and Redux's flat data islands.</p> <p data-svelte-h="svelte-x48sx8">For some unknown reason, the recoil examples on the official site are documentation only. I
created a project for each example so you can build and debug them. Additionally, I provided
an example of a dispatcher pattern using recoil.</p></div></div> </div> <div class="links svelte-nmvp7s"><div class="link svelte-j5c9xl"><a href="https://github.com/GeoffCox/recoil-examples" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" width="30px" height="30px" viewBox="-3 -3 30 30"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C6.47715 2 2 6.47715 2 12C2 17.5229 6.47715 22 12 22C17.5229 22 22 17.5229 22 12C22 6.47715 17.5229 2 12 2ZM0 12C0 5.3726 5.3726 0 12 0C18.6274 0 24 5.3726 24 12C24 18.6274 18.6274 24 12 24C5.3726 24 0 18.6274 0 12Z" fill="rgba(0,0,0,0.7)" stroke="none"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M9.59162 22.7357C9.49492 22.6109 9.49492 21.4986 9.59162 19.399C8.55572 19.4347 7.90122 19.3628 7.62812 19.1833C7.21852 18.9139 6.80842 18.0833 6.44457 17.4979C6.08072 16.9125 5.27312 16.8199 4.94702 16.6891C4.62091 16.5582 4.53905 16.0247 5.84562 16.4282C7.15222 16.8316 7.21592 17.9303 7.62812 18.1872C8.04032 18.4441 9.02572 18.3317 9.47242 18.1259C9.91907 17.9201 9.88622 17.1538 9.96587 16.8503C10.0666 16.5669 9.71162 16.5041 9.70382 16.5018C9.26777 16.5018 6.97697 16.0036 6.34772 13.7852C5.71852 11.5669 6.52907 10.117 6.96147 9.49369C7.24972 9.07814 7.22422 8.19254 6.88497 6.83679C8.11677 6.67939 9.06732 7.06709 9.73672 7.99999C9.73737 8.00534 10.6143 7.47854 12.0001 7.47854C13.386 7.47854 13.8777 7.90764 14.2571 7.99999C14.6365 8.09234 14.94 6.36699 17.2834 6.83679C16.7942 7.79839 16.3844 8.99999 16.6972 9.49369C17.0099 9.98739 18.2372 11.5573 17.4833 13.7852C16.9807 15.2706 15.9927 16.1761 14.5192 16.5018C14.3502 16.5557 14.2658 16.6427 14.2658 16.7627C14.2658 16.9427 14.4942 16.9624 14.8233 17.8058C15.0426 18.368 15.0585 19.9739 14.8708 22.6234C14.3953 22.7445 14.0254 22.8257 13.7611 22.8673C13.2924 22.9409 12.7835 22.9822 12.2834 22.9982C11.7834 23.0141 11.6098 23.0123 10.9185 22.948C10.4577 22.9051 10.0154 22.8343 9.59162 22.7357Z" fill="rgba(0,0,0,0.7)" stroke="none"></path></svg></a> </div> <div class="link svelte-j5c9xl"><a href="https://recoiljs.org/" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" width="28px" height="28px" viewBox="0 0 24 24" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.83824 18.4467C10.0103 18.7692 10.1826 19.0598 10.3473 19.3173C8.59745 18.9238 7.07906 17.9187 6.02838 16.5383C6.72181 16.1478 7.60995 15.743 8.67766 15.4468C8.98112 16.637 9.40924 17.6423 9.83824 18.4467ZM11.1618 17.7408C10.7891 17.0421 10.4156 16.1695 10.1465 15.1356C10.7258 15.0496 11.3442 15 12.0001 15C12.6559 15 13.2743 15.0496 13.8535 15.1355C13.5844 16.1695 13.2109 17.0421 12.8382 17.7408C12.5394 18.3011 12.2417 18.7484 12 19.0757C11.7583 18.7484 11.4606 18.3011 11.1618 17.7408ZM9.75 12C9.75 12.5841 9.7893 13.1385 9.8586 13.6619C10.5269 13.5594 11.2414 13.5 12.0001 13.5C12.7587 13.5 13.4732 13.5593 14.1414 13.6619C14.2107 13.1384 14.25 12.5841 14.25 12C14.25 11.4159 14.2107 10.8616 14.1414 10.3381C13.4732 10.4406 12.7587 10.5 12.0001 10.5C11.2414 10.5 10.5269 10.4406 9.8586 10.3381C9.7893 10.8615 9.75 11.4159 9.75 12ZM8.38688 10.0288C8.29977 10.6478 8.25 11.3054 8.25 12C8.25 12.6946 8.29977 13.3522 8.38688 13.9712C7.11338 14.3131 6.05882 14.7952 5.24324 15.2591C4.76698 14.2736 4.5 13.168 4.5 12C4.5 10.832 4.76698 9.72644 5.24323 8.74088C6.05872 9.20472 7.1133 9.68686 8.38688 10.0288ZM10.1465 8.86445C10.7258 8.95042 11.3442 9 12.0001 9C12.6559 9 13.2743 8.95043 13.8535 8.86447C13.5844 7.83055 13.2109 6.95793 12.8382 6.2592C12.5394 5.69894 12.2417 5.25156 12 4.92432C11.7583 5.25156 11.4606 5.69894 11.1618 6.25918C10.7891 6.95791 10.4156 7.83053 10.1465 8.86445ZM15.6131 10.0289C15.7002 10.6479 15.75 11.3055 15.75 12C15.75 12.6946 15.7002 13.3521 15.6131 13.9711C16.8866 14.3131 17.9412 14.7952 18.7568 15.2591C19.233 14.2735 19.5 13.1679 19.5 12C19.5 10.8321 19.233 9.72647 18.7568 8.74093C17.9413 9.20477 16.8867 9.6869 15.6131 10.0289ZM17.9716 7.46178C17.2781 7.85231 16.39 8.25705 15.3224 8.55328C15.0189 7.36304 14.5908 6.35769 14.1618 5.55332C13.9897 5.23077 13.8174 4.94025 13.6527 4.6827C15.4026 5.07623 16.921 6.08136 17.9716 7.46178ZM8.67765 8.55325C7.61001 8.25701 6.7219 7.85227 6.02839 7.46173C7.07906 6.08134 8.59745 5.07623 10.3472 4.6827C10.1826 4.94025 10.0103 5.23076 9.83823 5.5533C9.40924 6.35767 8.98112 7.36301 8.67765 8.55325ZM15.3224 15.4467C15.0189 16.637 14.5908 17.6423 14.1618 18.4467C13.9897 18.7692 13.8174 19.0598 13.6527 19.3173C15.4026 18.9238 16.921 17.9186 17.9717 16.5382C17.2782 16.1477 16.3901 15.743 15.3224 15.4467ZM12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21Z" fill="currentColor"></path></svg></a> </div> </div> </div><div class="post svelte-nmvp7s"><div class="category svelte-nmvp7s">Open Source Library</div> <div class="headline svelte-nmvp7s"><a href="/binary-search" class="svelte-nmvp7s">binary-search</a></div> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s"><div class="content"><p data-svelte-h="svelte-nxzpuj">I needed a binary search algorithm to find scroll offsets in a virtualized list. There didn't
seem to be a package implementing a binary search in Typescript, so I created this one. It has a
bonus feature. If the value isn't found, it provides the nearest range of indices where the
value would have been.</p></div></div> </div> <div class="links svelte-nmvp7s"><div class="link svelte-j5c9xl"><a href="https://github.com/GeoffCox/binary-search/blob/main/lib/README.md" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" width="30px" height="30px" viewBox="-3 -3 30 30"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C6.47715 2 2 6.47715 2 12C2 17.5229 6.47715 22 12 22C17.5229 22 22 17.5229 22 12C22 6.47715 17.5229 2 12 2ZM0 12C0 5.3726 5.3726 0 12 0C18.6274 0 24 5.3726 24 12C24 18.6274 18.6274 24 12 24C5.3726 24 0 18.6274 0 12Z" fill="rgba(0,0,0,0.7)" stroke="none"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M9.59162 22.7357C9.49492 22.6109 9.49492 21.4986 9.59162 19.399C8.55572 19.4347 7.90122 19.3628 7.62812 19.1833C7.21852 18.9139 6.80842 18.0833 6.44457 17.4979C6.08072 16.9125 5.27312 16.8199 4.94702 16.6891C4.62091 16.5582 4.53905 16.0247 5.84562 16.4282C7.15222 16.8316 7.21592 17.9303 7.62812 18.1872C8.04032 18.4441 9.02572 18.3317 9.47242 18.1259C9.91907 17.9201 9.88622 17.1538 9.96587 16.8503C10.0666 16.5669 9.71162 16.5041 9.70382 16.5018C9.26777 16.5018 6.97697 16.0036 6.34772 13.7852C5.71852 11.5669 6.52907 10.117 6.96147 9.49369C7.24972 9.07814 7.22422 8.19254 6.88497 6.83679C8.11677 6.67939 9.06732 7.06709 9.73672 7.99999C9.73737 8.00534 10.6143 7.47854 12.0001 7.47854C13.386 7.47854 13.8777 7.90764 14.2571 7.99999C14.6365 8.09234 14.94 6.36699 17.2834 6.83679C16.7942 7.79839 16.3844 8.99999 16.6972 9.49369C17.0099 9.98739 18.2372 11.5573 17.4833 13.7852C16.9807 15.2706 15.9927 16.1761 14.5192 16.5018C14.3502 16.5557 14.2658 16.6427 14.2658 16.7627C14.2658 16.9427 14.4942 16.9624 14.8233 17.8058C15.0426 18.368 15.0585 19.9739 14.8708 22.6234C14.3953 22.7445 14.0254 22.8257 13.7611 22.8673C13.2924 22.9409 12.7835 22.9822 12.2834 22.9982C11.7834 23.0141 11.6098 23.0123 10.9185 22.948C10.4577 22.9051 10.0154 22.8343 9.59162 22.7357Z" fill="rgba(0,0,0,0.7)" stroke="none"></path></svg></a> </div> <div class="link svelte-j5c9xl"><a href="https://geoffcox.github.io/demos/binary-search/" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="24px" height="24px" viewBox="0 0 16 16"><path d="M8 0a.5.5 0 0 1 .473.337L9.046 2H14a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1h-1.85l1.323 3.837a.5.5 0 1 1-.946.326L11.092 11H8.5v3a.5.5 0 0 1-1 0v-3H4.908l-1.435 4.163a.5.5 0 1 1-.946-.326L3.85 11H2a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h4.954L7.527.337A.5.5 0 0 1 8 0zM2 3v7h12V3H2z"></path></svg></a> </div> </div> </div><div class="post svelte-nmvp7s"><div class="category svelte-nmvp7s">Opinion</div> <div class="headline svelte-nmvp7s"><a href="/why-i-love-svelte" class="svelte-nmvp7s">Why I love Svelte</a></div> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s limit-height"><div class="content"><p data-svelte-h="svelte-1oy21ic">If you've never heard of them, check out <a href="https://svelte.dev/" target="_blank">svelte.dev</a>
and
<a href="https://kit.svelte.dev/" target="_blank">kit.svelte.dev</a>.</p> <p data-svelte-h="svelte-1jjh5t5">I am more productive. Writing HTML, CSS, and JS is straigtforward. Svelte's hot-module-reloading
makes my inner dev loop very fast. I feel like I can code anything with Svelte.</p> <p data-svelte-h="svelte-1dvxl6n">I can properly architect and design. Svelte provides componentization, encapsulation,
composition, and extensibility.</p> <p data-svelte-h="svelte-ixp1cv">I don't have to make as many low-level decisions. I don't agonize over which state management,
templating, or styling libraries to choose. Svelte meets all my needs for building applications
and libraries.</p> <p data-svelte-h="svelte-1yerbh2">I don't waste time trying to optimize my code by hand. There's no need call optimization memo
functions since the Svelte compiler makes the code as fast and small.</p> <p data-svelte-h="svelte-1c0esty">I quickly became an expert. Svelte's documentation is concise and precise. The tutorial and
examples get you started in a couple of hours. Addtional capabilities like SvelteKit are built
on top of rather than inside Svelte. This helps Svelte avoid collapsing under the weight of
additional complexity.</p> <p data-svelte-h="svelte-d0s6g3">Even if you are a React or Angular fanatic, I hope you'll check out Svelte. I've found that
learning new languages and technologies helps me be better with the ones I know.</p></div></div> </div> </div><div class="post svelte-nmvp7s"> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s"><div class="content"><div class="quote-blurb"><div class="quote svelte-957xct">I was raised up believing <br>I was somehow unique.<br> Like a snowflake<br> distinct
among snowflakes, <br>unique in each way you can see. <br> And now, after some thinking,
<br>I'd say I'd rather be <br> a functioning cog <br>in some great machinery<br> serving
something beyond me.</div> <div class="source svelte-957xct">Helplessness Blues - Fleet Foxes</div> </div></div></div> </div> </div><div class="post svelte-nmvp7s"><div class="category svelte-nmvp7s">Open Source Library</div> <div class="headline svelte-nmvp7s"><a href="splitters" class="svelte-nmvp7s">react-splitter & svelte-splitter</a></div> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s limit-height"><div class="content"><p data-svelte-h="svelte-1yi6931">A splitter control allows the user to resize 2 different panes relative to each other. Splitters
can be nested to create sophisticated application layouts.</p> <p data-svelte-h="svelte-18evio7">The splitter is available for React and Svelte. Each is responsive, robust, and easy to use.</p> <div class="link-grid svelte-if7hsg"><div class="link-header svelte-if7hsg" data-svelte-h="svelte-1bhb7kk">react-splitter</div> <div class="link-header svelte-if7hsg" data-svelte-h="svelte-1imt6ig">svelte-splitter</div> <div class="links svelte-if7hsg"><div class="link svelte-j5c9xl"><a href="https://github.com/GeoffCox/react-splitter" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" width="30px" height="30px" viewBox="-3 -3 30 30"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C6.47715 2 2 6.47715 2 12C2 17.5229 6.47715 22 12 22C17.5229 22 22 17.5229 22 12C22 6.47715 17.5229 2 12 2ZM0 12C0 5.3726 5.3726 0 12 0C18.6274 0 24 5.3726 24 12C24 18.6274 18.6274 24 12 24C5.3726 24 0 18.6274 0 12Z" fill="rgba(0,0,0,0.7)" stroke="none"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M9.59162 22.7357C9.49492 22.6109 9.49492 21.4986 9.59162 19.399C8.55572 19.4347 7.90122 19.3628 7.62812 19.1833C7.21852 18.9139 6.80842 18.0833 6.44457 17.4979C6.08072 16.9125 5.27312 16.8199 4.94702 16.6891C4.62091 16.5582 4.53905 16.0247 5.84562 16.4282C7.15222 16.8316 7.21592 17.9303 7.62812 18.1872C8.04032 18.4441 9.02572 18.3317 9.47242 18.1259C9.91907 17.9201 9.88622 17.1538 9.96587 16.8503C10.0666 16.5669 9.71162 16.5041 9.70382 16.5018C9.26777 16.5018 6.97697 16.0036 6.34772 13.7852C5.71852 11.5669 6.52907 10.117 6.96147 9.49369C7.24972 9.07814 7.22422 8.19254 6.88497 6.83679C8.11677 6.67939 9.06732 7.06709 9.73672 7.99999C9.73737 8.00534 10.6143 7.47854 12.0001 7.47854C13.386 7.47854 13.8777 7.90764 14.2571 7.99999C14.6365 8.09234 14.94 6.36699 17.2834 6.83679C16.7942 7.79839 16.3844 8.99999 16.6972 9.49369C17.0099 9.98739 18.2372 11.5573 17.4833 13.7852C16.9807 15.2706 15.9927 16.1761 14.5192 16.5018C14.3502 16.5557 14.2658 16.6427 14.2658 16.7627C14.2658 16.9427 14.4942 16.9624 14.8233 17.8058C15.0426 18.368 15.0585 19.9739 14.8708 22.6234C14.3953 22.7445 14.0254 22.8257 13.7611 22.8673C13.2924 22.9409 12.7835 22.9822 12.2834 22.9982C11.7834 23.0141 11.6098 23.0123 10.9185 22.948C10.4577 22.9051 10.0154 22.8343 9.59162 22.7357Z" fill="rgba(0,0,0,0.7)" stroke="none"></path></svg></a> </div> <div class="link svelte-j5c9xl"><a href="https://geoffcox.github.io/demos/react-splitter/" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="24px" height="24px" viewBox="0 0 16 16"><path d="M8 0a.5.5 0 0 1 .473.337L9.046 2H14a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1h-1.85l1.323 3.837a.5.5 0 1 1-.946.326L11.092 11H8.5v3a.5.5 0 0 1-1 0v-3H4.908l-1.435 4.163a.5.5 0 1 1-.946-.326L3.85 11H2a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h4.954L7.527.337A.5.5 0 0 1 8 0zM2 3v7h12V3H2z"></path></svg></a> </div> <div class="link svelte-j5c9xl"><a href="https://www.npmjs.com/package/@geoffcox/react-splitter" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" fill="#000000" width="30px" height="30px" viewBox="0 0 24 24"><path d="m12 12.534v-2.663h-1.334v2.666zm12-5.334h-24v8h6.666v1.334h5.334v-1.333h12zm-17.334 1.334v5.337h-1.333v-4h-1.334v4h-2.666v-5.334zm6.667 0v5.337h-2.666v1.334h-2.666v-6.666zm9.333 0v5.337h-1.333v-4h-1.334v4h-1.334v-4h-1.333v4h-2.667v-5.334z"></path></svg> </a> </div></div> <div class="links svelte-if7hsg"><div class="link svelte-j5c9xl"><a href="https://github.com/GeoffCox/sterling-splitter" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" width="30px" height="30px" viewBox="-3 -3 30 30"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C6.47715 2 2 6.47715 2 12C2 17.5229 6.47715 22 12 22C17.5229 22 22 17.5229 22 12C22 6.47715 17.5229 2 12 2ZM0 12C0 5.3726 5.3726 0 12 0C18.6274 0 24 5.3726 24 12C24 18.6274 18.6274 24 12 24C5.3726 24 0 18.6274 0 12Z" fill="rgba(0,0,0,0.7)" stroke="none"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M9.59162 22.7357C9.49492 22.6109 9.49492 21.4986 9.59162 19.399C8.55572 19.4347 7.90122 19.3628 7.62812 19.1833C7.21852 18.9139 6.80842 18.0833 6.44457 17.4979C6.08072 16.9125 5.27312 16.8199 4.94702 16.6891C4.62091 16.5582 4.53905 16.0247 5.84562 16.4282C7.15222 16.8316 7.21592 17.9303 7.62812 18.1872C8.04032 18.4441 9.02572 18.3317 9.47242 18.1259C9.91907 17.9201 9.88622 17.1538 9.96587 16.8503C10.0666 16.5669 9.71162 16.5041 9.70382 16.5018C9.26777 16.5018 6.97697 16.0036 6.34772 13.7852C5.71852 11.5669 6.52907 10.117 6.96147 9.49369C7.24972 9.07814 7.22422 8.19254 6.88497 6.83679C8.11677 6.67939 9.06732 7.06709 9.73672 7.99999C9.73737 8.00534 10.6143 7.47854 12.0001 7.47854C13.386 7.47854 13.8777 7.90764 14.2571 7.99999C14.6365 8.09234 14.94 6.36699 17.2834 6.83679C16.7942 7.79839 16.3844 8.99999 16.6972 9.49369C17.0099 9.98739 18.2372 11.5573 17.4833 13.7852C16.9807 15.2706 15.9927 16.1761 14.5192 16.5018C14.3502 16.5557 14.2658 16.6427 14.2658 16.7627C14.2658 16.9427 14.4942 16.9624 14.8233 17.8058C15.0426 18.368 15.0585 19.9739 14.8708 22.6234C14.3953 22.7445 14.0254 22.8257 13.7611 22.8673C13.2924 22.9409 12.7835 22.9822 12.2834 22.9982C11.7834 23.0141 11.6098 23.0123 10.9185 22.948C10.4577 22.9051 10.0154 22.8343 9.59162 22.7357Z" fill="rgba(0,0,0,0.7)" stroke="none"></path></svg></a> </div> <div class="link svelte-j5c9xl"><a href="https://geoffcox.github.io/demos/sterling-splitter/" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="24px" height="24px" viewBox="0 0 16 16"><path d="M8 0a.5.5 0 0 1 .473.337L9.046 2H14a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1h-1.85l1.323 3.837a.5.5 0 1 1-.946.326L11.092 11H8.5v3a.5.5 0 0 1-1 0v-3H4.908l-1.435 4.163a.5.5 0 1 1-.946-.326L3.85 11H2a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h4.954L7.527.337A.5.5 0 0 1 8 0zM2 3v7h12V3H2z"></path></svg></a> </div> <div class="link svelte-j5c9xl"><a href="https://www.npmjs.com/package/@geoffcox/sterling-splitter" target="_blank" class="svelte-j5c9xl"><svg xmlns="http://www.w3.org/2000/svg" fill="#000000" width="30px" height="30px" viewBox="0 0 24 24"><path d="m12 12.534v-2.663h-1.334v2.666zm12-5.334h-24v8h6.666v1.334h5.334v-1.333h12zm-17.334 1.334v5.337h-1.333v-4h-1.334v4h-2.666v-5.334zm6.667 0v5.337h-2.666v1.334h-2.666v-6.666zm9.333 0v5.337h-1.333v-4h-1.334v4h-1.334v-4h-1.333v4h-2.667v-5.334z"></path></svg> </a> </div></div></div></div></div> </div> </div><div class="post svelte-nmvp7s"> <div class="content-section svelte-nmvp7s"><div class="container svelte-nmvp7s"><div class="content"><div class="quote-blurb"><div class="quote svelte-957xct">Everyone is afraid of losing<br>
Even the ones that always win<br>
Hey sleepwalker, when the mountain comes back to life<br>
It doesn't come from without<br>
It comes from within<br></div> <div class="source svelte-957xct">Sleepwalker - The Killers</div> </div></div></div> </div> </div> </div></div> </div></div> </div>
<script>
{
__sveltekit_1cy0fcu = {
base: new URL(".", location).pathname.slice(0, -1),
env: {}
};
const element = document.currentScript.parentElement;
const data = [null,null,null];
Promise.all([
import("./_app/immutable/entry/start.2c55a661.js"),
import("./_app/immutable/entry/app.4df5770f.js")
]).then(([kit, app]) => {
kit.start(app, element, {
node_ids: [0, 2, 4],
data,
form: null,
error: null
});
});
}
</script>
</div>
</body>
</html>