-
Notifications
You must be signed in to change notification settings - Fork 0
/
rss.xml
492 lines (460 loc) · 84.9 KB
/
rss.xml
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Samuel Moon]]></title><description><![CDATA[A starter blog demonstrating what Gatsby can do.]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io</link><generator>GatsbyJS</generator><lastBuildDate>Tue, 13 Jul 2021 17:29:37 GMT</lastBuildDate><item><title><![CDATA[Text Expander]]></title><description><![CDATA[The Text Expander chrome extension will expand a word underneath the caret that’s focused inside an input textbox or textarea. A word in…]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io/text-expander/</link><guid isPermaLink="false">https://gatsbystarterblogsource.gatsbyjs.io/text-expander/</guid><pubDate>Sun, 13 Jun 2021 10:09:11 GMT</pubDate><content:encoded><p>The <a href="https://chrome.google.com/webstore/detail/text-expander/nkmhjacokhapaecpbcbddhjjpajddamf">Text Expander</a> chrome extension will expand a word underneath the caret that’s focused inside an input textbox or textarea. A word in this case would be any string of characters separated by one or more spaces.</p>
<p><img src="/4ceeb8e83ef778a5f3d2a480e75e13b5/textexpander1.gif" alt="Text Expander Example 1"></p>
<p>The key-value pairs used to find the prefix text and replace it with the expansion are saved locally using <code class="language-text">chrome.storage</code>. Duplicate keys are overwritten with the updated value.</p>
<p><img src="/50ca4410615e3217bd5cd6096eef0055/textexpander2.gif" alt="Text Expander Example 2"></p>
<p>Intended use cases are frequently typed search terms to reduce the tediousness of typing out a long string. At the moment, there is only support for <code class="language-text">&lt;input&gt;</code> and <code class="language-text">&lt;textarea&gt;</code>, but more development is ongoing to have it work on all editable input boxes.</p>
<p>Check out another extension of mine, the <a href="https://chrome.google.com/webstore/detail/naver-dictionary-by-s-moo/iebgplehjilbpnjpgoppolpicfledbme">Naver Dictionary</a>.</p></content:encoded></item><item><title><![CDATA[Next Permutation Algorithm]]></title><description><![CDATA[Python, as of v3.9.5, doesn’t have the equivalent of the C++ function . This function rearranges elements into the next lexicographically…]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io/next-permutation/</link><guid isPermaLink="false">https://gatsbystarterblogsource.gatsbyjs.io/next-permutation/</guid><pubDate>Sat, 12 Jun 2021 20:09:11 GMT</pubDate><content:encoded><p>Python, as of v3.9.5, doesn’t have the equivalent of the C++ function <code class="language-text">std::next_permutation</code>. This function rearranges elements into the <em>next</em> lexicographically greater permutation.</p>
<p>There is a permutation function in the <code class="language-text">itertools</code> library, but it generates <em>a</em> permutation, not in lexicographic order. For example:</p>
<div class="gatsby-highlight" data-language="python"><pre class="language-python"><code class="language-python"><span class="token keyword">from</span> itertools <span class="token keyword">import</span> permutation
<span class="token comment"># next permutation should be [3,1,2]</span>
arr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span>
p <span class="token operator">=</span> permutation<span class="token punctuation">(</span>arr<span class="token punctuation">)</span>
<span class="token comment"># first result returns the input array (unchanged)</span>
<span class="token builtin">next</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span> <span class="token comment"># (2, 3, 1)</span>
<span class="token builtin">next</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span> <span class="token comment"># (2, 1, 3) NOT lexicographically greater</span>
<span class="token builtin">next</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span> <span class="token comment"># (3, 2, 1) NOT lexicographically greater</span>
<span class="token builtin">next</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span> <span class="token comment"># (3, 1, 2) correct answer</span></code></pre></div>
<h2>Lexicographic Ordering</h2>
<p>Iterating from right to left, there will be a point when the elements start decreasing (i.e. the value at index <code class="language-text">i-1</code> is less). We’ll call this the <strong>pivot</strong>, and the portion from pivot to the right end the <strong>suffix</strong>.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; "
>
<a
class="gatsby-resp-image-link"
href="/static/31e5bffaa63cd8bdbdb40be644be855e/0b6f4/pivot.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 106.32911392405065%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAADcElEQVQ4y42Vy4scVRTGSyUOxAdEFyIzI3H6UY+uV9e7epxpmR570pp2pifpTDJmJ+JGk1kIKopoXAiDGETC4EKIoIIbFcSNq4hZqRAEF25ciO5ciPgH/OTcym27kwguPk7V5dZ3z/nOd08ZjuPw/2ATtUOSuI3rOoShj23bN+0zZFFgWdYMbrXm+jGOn1BruDitBNOqCG3bQfMYrVYL3/cJgmAGM2thiOe6bPZcTqxbDPsNTo1cAt+cIVMZhmFIkiTEcUye5+q5LEuFNE3JMkFOmUV8t38Xf344xy9f38bPVwx2Rk3Kzhrr62v0ej3a7TaGZCAfClFRFOpZoiDLMnVIlleEX712hJ/evZurn8zx7WeHON5fomn6PNpdVZVMNJTsoihSixIlazlNoN8FeezRST2yxGG59HEcC9txJporwkpU+z9hWf9G03Km0FLrzWZzAiFWGkqZAtFNyqw0LMjyktVOzJevHuHaxXv45qM5rn5+mNEwpB0V5HnKysqKQrfbVVUoQl2ykMmz6CeEUZyyWgZce/swf398J79dMfj9+9sZb/kEYUGSRGq/NES+dV23so28aDLJtIqJ6nCRJZx8zGT3WIOTx+uc3jbJM3GGELQwTVNpp3VUTRFmgZDrKKg1HZYaLRYf9lg46lFv+DRM6aaL53mKRAh1VIS6s4Iqu4gkzVjOQ95/7gE+ffl+Lu/fy+WL99HveURRqrKX/VKJrkzsJVyGWEMbW3lPSi2WGawl/HpwCL64g79+MPjjR4Od7YCwXVIUVePku06nw3A4VE2RrA0pUdj1LcmUyVNl5HPjGi+dXWLv6UX2nj1KdzUmzUoSpW+mCMQuIs+kZKlfe3F6KMgdnX/I4cFFh/kFm/kFi3qtjtms06zXsMwG1vWGTE8dQ4aA1kNpmMSkSRWfONVj86kNHj8xZjA6w8bWGfqbFTZGuwTtGJ2QJlYaah9OhkNR0nmk5Nxbz/DKwQvsvfkOexcOeP719zh/4RLn37jEi/sfkBQrmM3m7DwUHbSG2o95JgMhYzBeZ7g7oL81vp7ZaY5t7dJ/cofB9ln8MMKeylARSspSthCLuBInvnRcfM/Hc1v4nquiwG05tMNATfEbp7Yx7fJpSNf0SJND/CBQVYhN9OCVBG4ivNV/QR9S3elychP08J12xI1d/gdImrEs3wPW9gAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Pivot"
title="Pivot"
src="/static/31e5bffaa63cd8bdbdb40be644be855e/f058b/pivot.png"
srcset="/static/31e5bffaa63cd8bdbdb40be644be855e/c26ae/pivot.png 158w,
/static/31e5bffaa63cd8bdbdb40be644be855e/6bdcf/pivot.png 315w,
/static/31e5bffaa63cd8bdbdb40be644be855e/f058b/pivot.png 630w,
/static/31e5bffaa63cd8bdbdb40be644be855e/40601/pivot.png 945w,
/static/31e5bffaa63cd8bdbdb40be644be855e/0b6f4/pivot.png 984w"
sizes="(max-width: 630px) 100vw, 630px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</a>
</span></p>
<div class="gatsby-highlight" data-language="python"><pre class="language-python"><code class="language-python">pivot <span class="token operator">=</span> <span class="token number">0</span>
<span class="token comment"># iterate right-to-left</span>
<span class="token comment"># Note: for loop stops one index before 0</span>
<span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>nums<span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token comment"># check if next element is decreasing</span>
<span class="token keyword">if</span> nums<span class="token punctuation">[</span>i<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">&lt;</span> nums<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">:</span>
pivot <span class="token operator">=</span> i<span class="token operator">-</span><span class="token number">1</span>
<span class="token keyword">break</span></code></pre></div>
<p>In the suffix, iterate from right to left (again), looking for the smallest value <em>greater than or equal to</em> the pivot. This value will be swapped with pivot.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; "
>
<a
class="gatsby-resp-image-link"
href="/static/02cf6f1947d697051f4c2340be9c7370/966a0/swap.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 101.8987341772152%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAADbklEQVQ4y22UXWscVRjH51YUL1S8sk33Jbs7c+blzNuZ2Um22W4ISZtqE0NNlEig1kSqYqVC0SKIFSwUigpSKVbUG8ELUVD8Al6qiF/AK8ELL/wGP3nOcpJt9eLZeXbmOf/zf/7Pi6eUIo5jkiSx5vwoitBZQpLH6FRP/2tNGMUUuWJ5qcOw6uH7PoPBAN8fEAQBngQVRUGe55Rlaf26rsmznPMH57hy6xJntlbJ05y6LvFVxcsXjvPHTx5ffvAQUZQwGi2ytHQSIeelaYoxxpoADYdDmqbBlIZnX9ni2u3XOfvMaSpT0zQVcTLi8v4x/vrZ4+vbD+L7islkQmWMZeoJTWElJmyFqVySZRlpoVkYN6SZtoxTnVBVBlP6bKz7jEd9BgOXsj9N2TnOhLa8k2ev22O+PU+/1yeKQrrzAa12SKut6PVjer3Qxh7p6ONJAYSN01Cekr5ONCsbp3j6hbNMVkWfjL2dNndvPszl/Q5hJPGZLZYUUs4dauiKIkBVVVkdy8Kw98YON756m83ddZRquPXOo/Cnx7efPU4Yn2Q4LK08a2trjMfjKUNBd8UQMPHFyqJk5dwptg82mayOyFLD3naHT28+xqsXOyS6xpjCyiQYTipPcg/D0L4Q332QVDqtLv3OgBMn+vQGKcfmFK1OwfE5nySJ/6OfLYprWFdZ8eUZRzH1qMQsVayfHrC79QSrywFaJ5gys6wkVkAcEQt42CJpaosiJikXecHua1tc+egqP3zT5e9fPD68PoeKhhiTT2OKwp6TPhSzRZFbnG6uqRcWFmxjbx88xUvXL/HFnXl+/9HjvTc7pPnINrjTXOSSeAG3jS25yy12TsPwaI61xg8CkjRDKR9TapQKbDdIanJG4uV8v9+3YDZl+ZEPYgLkfKVCdOKTpdLUAYEK/zfOaXgI6JaDmPThdDnIzBo+ufEIv37v8e77NReuXWTjuTOkOrOpOr0F1GVo28YVQ4BcHzZNTZYv8t3dB/jnN487ny9y9eO32HlxE1NUmMpY3WY1FE2thlIZt22OVlhOlhU8udZl//kuyysRo5URpikxprKM3BKRNO/RcHY5ON8th3ZH0WonKKVJtRQhItHTogmg68PZ855zZsGOQMVkktShVjKzbhG4qboH8P71df+N7ikpCTPRWKZkdtxmCf0LonmPE4iPsMwAAAAASUVORK5CYII='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="swap"
title="swap"
src="/static/02cf6f1947d697051f4c2340be9c7370/f058b/swap.png"
srcset="/static/02cf6f1947d697051f4c2340be9c7370/c26ae/swap.png 158w,
/static/02cf6f1947d697051f4c2340be9c7370/6bdcf/swap.png 315w,
/static/02cf6f1947d697051f4c2340be9c7370/f058b/swap.png 630w,
/static/02cf6f1947d697051f4c2340be9c7370/966a0/swap.png 944w"
sizes="(max-width: 630px) 100vw, 630px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</a>
</span></p>
<div class="gatsby-highlight" data-language="python"><pre class="language-python"><code class="language-python"><span class="token comment"># right-to-left, but stop before pivot</span>
<span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>nums<span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> pivot<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token comment"># swap if some number in suffix</span>
<span class="token comment"># is greater than pivot</span>
<span class="token keyword">if</span> nums<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">></span> nums<span class="token punctuation">[</span>pivot<span class="token punctuation">]</span><span class="token punctuation">:</span>
nums<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> nums<span class="token punctuation">[</span>pivot<span class="token punctuation">]</span> <span class="token operator">=</span> nums<span class="token punctuation">[</span>pivot<span class="token punctuation">]</span><span class="token punctuation">,</span> nums<span class="token punctuation">[</span>j<span class="token punctuation">]</span>
<span class="token keyword">break</span></code></pre></div>
<p>After swapping, the final thing left to do is reversing the suffix portion. We can do this in-place using two pointers and swapping.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; "
>
<a
class="gatsby-resp-image-link"
href="/static/e36fa5503540a7f7c965a996fd6f5304/966a0/reverse.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 95.56962025316456%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAABYlAAAWJQFJUiTwAAACm0lEQVQ4y41UTW/TQBDNXwFK/Lle27F3105pQ5s0BZI2qlSKVAlVFbSnCqhUJDhSDkhwgAsSNw78Bv4Bv+uht2bdNATUw2RmJ543M29mtxOGIW4iMpGtHQQB4jhGFEXWbvyN7tBxE8nzvLU9z0eaZRBJAt/3ryXu8IfZKEKIVjO7O1OMNoij5j/GqF6OTDaAFM/zbLIOA5VSKIoCZVlazTNtpTSyPMN4MMPLp+9wMDlCJCXGKsGXWYo3oxgiDKCNQV1XNpkFNMZYEK01qqqydr/fhyoVtCkxGx3i0+sfODk4R5znmOkYP48rfN3LIQIPw9EI08nEdmVbZjUE6vV6Fox80UettYIuKozXJ1jVayiUgskl9ozAgzJG2A6lGVY7FKI7gqnJG3mhXvG6uO37uLWyAhHH6NL2fetbHJ5tmZWxGvLndJqmUKpEkmYYFgKH2sO0yiCkhCkrbK/t4n41toU4sVN2QyEo2ySPBKzrGgUTqQqn9wL8OtvA5a5CICU2+9v48Oo7zo/eI44ExuMt7Ex3kCRJA8hgDsHYadXtcCoOq+5jvxb4OJU4HTKBwnq9geePL3Dw6BnCILIF8PuWQ4JKKa2DoyeHPJNDtn7X8xEIiTtdniV830MYBQhCv93Dbrd7tdgMZrkMdprAGW+D1SkS6jRDKnrI0wKpTG2cm667grZlcuc4dOK4bJZcodQFNlcf4u3JZxzvv0CvyK2fW+DWrQUkb+RgnkNy6jT9VW2wtb6Dy7NvOHlyAWMangk4GAwwHA6vHge2xgxsgdnYttOsln6uk0xSmHLVttzjXc6yP4+Fd3WX5/tf1MsWna26p2r+22uvzTKwZeAELYvSVv6vQjqLGeYlWLinbgMoi2B/Vfg/mQ9eVtk84G/mbFoE8hl/lgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="reverse"
title="reverse"
src="/static/e36fa5503540a7f7c965a996fd6f5304/f058b/reverse.png"
srcset="/static/e36fa5503540a7f7c965a996fd6f5304/c26ae/reverse.png 158w,
/static/e36fa5503540a7f7c965a996fd6f5304/6bdcf/reverse.png 315w,
/static/e36fa5503540a7f7c965a996fd6f5304/f058b/reverse.png 630w,
/static/e36fa5503540a7f7c965a996fd6f5304/966a0/reverse.png 944w"
sizes="(max-width: 630px) 100vw, 630px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</a>
</span></p>
<div class="gatsby-highlight" data-language="python"><pre class="language-python"><code class="language-python">l <span class="token operator">=</span> pivot<span class="token operator">+</span><span class="token number">1</span> <span class="token comment"># suffix start</span>
r <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>nums<span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span> <span class="token comment"># suffix end (always rightmost)</span>
<span class="token keyword">while</span> l <span class="token operator">&lt;</span> r<span class="token punctuation">:</span>
nums<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">,</span> nums<span class="token punctuation">[</span>r<span class="token punctuation">]</span> <span class="token operator">=</span> nums<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">,</span> nums<span class="token punctuation">[</span>l<span class="token punctuation">]</span>
l <span class="token operator">+=</span> <span class="token number">1</span>
r <span class="token operator">-=</span> <span class="token number">1</span></code></pre></div>
<p>And the result will be the next lexicographically greater permutation. Below is the complete code:</p>
<div class="gatsby-highlight" data-language="python"><pre class="language-python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">nextPermutation</span><span class="token punctuation">(</span>nums<span class="token punctuation">)</span><span class="token punctuation">:</span>
pivot <span class="token operator">=</span> <span class="token number">0</span>
<span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>nums<span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> nums<span class="token punctuation">[</span>i<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">&lt;</span> nums<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">:</span>
pivot <span class="token operator">=</span> i<span class="token operator">-</span><span class="token number">1</span>
<span class="token keyword">break</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
nums<span class="token punctuation">.</span>sort<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> nums
<span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>nums<span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> pivot<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> nums<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">></span> nums<span class="token punctuation">[</span>pivot<span class="token punctuation">]</span><span class="token punctuation">:</span>
nums<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> nums<span class="token punctuation">[</span>pivot<span class="token punctuation">]</span> <span class="token operator">=</span> nums<span class="token punctuation">[</span>pivot<span class="token punctuation">]</span><span class="token punctuation">,</span> nums<span class="token punctuation">[</span>j<span class="token punctuation">]</span>
<span class="token keyword">break</span>
l <span class="token operator">=</span> pivot<span class="token operator">+</span><span class="token number">1</span>
r <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>nums<span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span>
<span class="token keyword">while</span> l <span class="token operator">&lt;</span> r<span class="token punctuation">:</span>
nums<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">,</span> nums<span class="token punctuation">[</span>r<span class="token punctuation">]</span> <span class="token operator">=</span> nums<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">,</span> nums<span class="token punctuation">[</span>l<span class="token punctuation">]</span>
l <span class="token operator">+=</span> <span class="token number">1</span>
r <span class="token operator">-=</span> <span class="token number">1</span>
<span class="token keyword">return</span> nums</code></pre></div></content:encoded></item><item><title><![CDATA[Setting up AWS SDK for SNS/SQS in Node.js]]></title><description><![CDATA[Version 3 of the JavaScript SDK now splits up the package into smaller modules. This way, you only download what you need and reduce your…]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io/sns-sqs-node/</link><guid isPermaLink="false">https://gatsbystarterblogsource.gatsbyjs.io/sns-sqs-node/</guid><pubDate>Fri, 01 May 2020 22:12:03 GMT</pubDate><content:encoded><p>Version 3 of the JavaScript SDK now splits up the package into smaller modules. This way, you only download what you need and reduce your file size. Packages are downloaded in the form of:</p>
<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell">$ <span class="token function">npm</span> <span class="token function">install</span> @aws-sdk/client-«package-name»</code></pre></div>
<p>If you can’t remember the name of the package, simply search to return a list of names:</p>
<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell">$ <span class="token function">npm</span> <span class="token function">install</span> @aws-sdk/client-
NAME <span class="token operator">|</span> DESCRIPTION <span class="token operator">|</span>
@aws-sdk/client-s3 <span class="token operator">|</span> AWS SDK for… <span class="token operator">|</span>
@aws-sdk/client-sts <span class="token operator">|</span> AWS SDK for… <span class="token operator">|</span>
@aws-sdk/client-lex-runti <span class="token operator">|</span> AWS SDK for… <span class="token operator">|</span>
me-service <span class="token operator">|</span> <span class="token operator">|</span>
@aws-sdk/client-transcrib <span class="token operator">|</span> AWS SDK for… <span class="token operator">|</span>
e-streaming <span class="token operator">|</span> <span class="token operator">|</span>
@aws-sdk/client-s3-contro <span class="token operator">|</span> AWS SDK for… <span class="token operator">|</span>
l <span class="token operator">|</span> <span class="token operator">|</span>
@aws-sdk/client-mediastor <span class="token operator">|</span> AWS SDK for… <span class="token operator">|</span>
e-data <span class="token operator">|</span> <span class="token operator">|</span>
@aws-sdk/client-cognito-i <span class="token operator">|</span> AWS SDK for… <span class="token operator">|</span>
dentity <span class="token operator">|</span> <span class="token operator">|</span></code></pre></div>
<p>You can use ES6-style imports for modules. Note: you can’t mix and match both style of imports.</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token punctuation">{</span> SQSClient <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">"@aws-sdk/client-sqs)"</span><span class="token punctuation">;</span> <span class="token comment">// old way</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> SQSClient <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"@aws-sdk/client-sqs"</span><span class="token punctuation">;</span> <span class="token comment">// new way</span>
<span class="token comment">// Be sure to add this to "/package.json" to use ES6 imports</span>
<span class="token punctuation">{</span>
<span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"module"</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span></code></pre></div>
<h1>SQS</h1>
<p>You’ll need a client object to send your commands.</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token comment">/**
* Save file to somewhere like "/libs/sql-client.js"
* to reuse an existing client object.
*/</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> SQSClient <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"@aws-sdk/client-sqs"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> <span class="token constant">REGION</span> <span class="token operator">=</span> <span class="token string">"us-west-1"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> client <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SQSClient</span><span class="token punctuation">(</span><span class="token punctuation">{</span> region<span class="token operator">:</span> <span class="token constant">REGION</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token punctuation">{</span> client <span class="token punctuation">}</span></code></pre></div>
<h2>ListQueuesCommand</h2>
<p><code class="language-text">ListQueuesCommand</code> requires you to supply an empty object as its default argument.</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token keyword">import</span> <span class="token punctuation">{</span> ListQueuesCommand <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"@aws-sdk/client-sqs"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> client <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"./lib/sqs-client.js"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> <span class="token function-variable function">listQueues</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token keyword">await</span> client<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ListQueuesCommand</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Success"</span><span class="token punctuation">,</span> data<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> data<span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span>err<span class="token punctuation">,</span> err<span class="token punctuation">.</span>stack<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">listQueues</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>Run the file at the terminal with <code class="language-text">node «file-name».js</code> and you’ll receive the following response:</p>
<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell">$ node list-command.js
<span class="token punctuation">{</span>
<span class="token string">'<span class="token variable">$metadata</span>'</span><span class="token builtin class-name">:</span> <span class="token punctuation">{</span>
httpStatusCode: <span class="token number">200</span>,
requestId: <span class="token string">'59314882-ba58-5429-a820-a8aec8f020f2'</span>,
extendedRequestId: undefined,
cfId: undefined,
attempts: <span class="token number">1</span>,
totalRetryDelay: <span class="token number">0</span>
<span class="token punctuation">}</span>,
NextToken: undefined,
QueueUrls: <span class="token punctuation">[</span> <span class="token string">'https://sqs.us-west-1.amazonaws.com/248874545298/«QueueName»'</span> <span class="token punctuation">]</span>
<span class="token punctuation">}</span></code></pre></div>
<p>You can grab the <code class="language-text">QueueUrl</code> here, or use <code class="language-text">GetQueueUrlCommand</code> if you know the name of your queue.</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token keyword">import</span> <span class="token punctuation">{</span> GetQueueUrlCommand <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"@aws-sdk/client-sqs"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> client <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"./lib/sqs-client.js"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> params <span class="token operator">=</span> <span class="token punctuation">{</span> QueueName<span class="token operator">:</span> <span class="token string">"QUEUE_NAME"</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> <span class="token function-variable function">queueName</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token keyword">await</span> client<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">GetQueueUrlCommand</span><span class="token punctuation">(</span>params<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Success"</span><span class="token punctuation">,</span> data<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> data<span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Error"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">queueName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<h2>SendMessageCommand</h2>
<p>You’ll need the <code class="language-text">QueueUrl</code> from above to send and receive messages from a queue. <code class="language-text">SendMessageCommand</code> accepts a single object that implements the <a href="https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-sqs/interfaces/sendmessagecommandinput.html"><code class="language-text">SendMessageCommandInput</code></a> interface. If you’re not familiar with TypeScript, it means your object must match the following signature:</p>
<ul>
<li><strong><code class="language-text">MessageBody</code></strong> - must be a <code class="language-text">string</code> type. This means you must <code class="language-text">JSON.stringify()</code> any JSON object you want to pass in here. The documentation states that “a message can include only XML, JSON, and unformatted text”, but raw JSON objects seem to fail (could be a bug).</li>
<li>
<p><strong><code class="language-text">MessageAttributes</code></strong> - an <em>optional</em> object intended to be used as metadata (i.e. supplementary info about more important stuff in <code class="language-text">MessageBody</code>). Can have up to 10 nested objects called <strong>attributes</strong>.</p>
<ul>
<li>Although even the <a href="https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-metadata.html#sqs-message-attributes">documentation</a> affirms its use as “structured metadata (such as timestamps, geospatial data, signatures, and identifiers)”, AWS’s <a href="https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/sqs-examples-send-receive-messages.html">official example</a> switches <strong><code class="language-text">MessageBody</code></strong> and <strong><code class="language-text">MessageAttributes</code></strong>.</li>
</ul>
</li>
<li><strong><code class="language-text">QueueUrl</code></strong> - a required parameter of <code class="language-text">string</code> type. This is where the messages are sent.</li>
</ul>
<p>The example below uses <code class="language-text">JSON.stringify()</code> to pass a JSON object to <code class="language-text">MessageBody</code>.</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token keyword">import</span> <span class="token punctuation">{</span> SendMessageCommand <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"@aws-sdk/client-sqs"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> client <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"./lib/sqs-client.js"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> getQueue <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">".lib/sqs-listqueues.js"</span><span class="token punctuation">;</span> <span class="token comment">// grab queue URL</span>
<span class="token comment">// Example using a credit card transaction.</span>
body <span class="token operator">=</span> <span class="token punctuation">{</span>
TransactionId<span class="token operator">:</span> <span class="token string">"758191"</span><span class="token punctuation">,</span>
CustomerId<span class="token operator">:</span> <span class="token string">"CID_132"</span><span class="token punctuation">,</span>
CustomerEmail<span class="token operator">:</span> <span class="token string">"[email protected]"</span><span class="token punctuation">,</span>
Amount<span class="token operator">:</span> <span class="token number">50.00</span>
<span class="token punctuation">}</span>
<span class="token keyword">const</span> params <span class="token operator">=</span> <span class="token punctuation">{</span>
MessageBody<span class="token operator">:</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>body<span class="token punctuation">)</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> <span class="token function-variable function">sendMessage</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> url <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">getQueue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">;</span>
params<span class="token punctuation">.</span>QueueUrl <span class="token operator">=</span> url<span class="token punctuation">;</span> <span class="token comment">// Add queue URL to params object.</span>
<span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token keyword">await</span> client<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">SendMessageCommand</span><span class="token punctuation">(</span>params<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> data
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span>err<span class="token punctuation">,</span> err<span class="token punctuation">.</span>stack<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">sendMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<h2>ReceiveMessageCommand, DeleteMessageCommand</h2>
<p>Messages retrieved from the queue should be deleted once read, to prevent other consumers from reading a duplicate message.</p>
<p><code class="language-text">ReceiveMessageCommand</code> accepts an input parameter that implements <code class="language-text">ReceiveMessageCommandInput</code> interface. The object has the following properties:</p>
<ul>
<li>
<p><strong><code class="language-text">AttributeNames</code></strong> - <em>optional</em>, returns a list of attributes along with each message. Possible values are:</p>
<ul>
<li><strong><code class="language-text">All</code></strong> - returns all values.</li>
<li><strong><code class="language-text">ApproximateFirstReceiveTimestamp</code></strong> - time when message was first received from queue (in milliseconds).</li>
<li><strong><code class="language-text">ApproximateReceiveCount</code></strong> - how many times message was previously retrieved.</li>
<li><strong><code class="language-text">SenderId</code></strong> - IAM user or role ID.</li>
<li><strong><code class="language-text">SentTimestamp</code></strong> - time when message was sent to queue (in milliseconds).</li>
</ul>
</li>
<li><strong><code class="language-text">MaxNumberOfMessages</code></strong> - <em>optional</em>, defaults to 1. Valid values are from 1 to 10.</li>
<li><strong><code class="language-text">QueueUrl</code></strong> - URI of queue where messages are retrieved from.</li>
<li><strong><code class="language-text">VisibilityTimeout</code></strong> - <em>optional</em>, how long (in seconds) to hide messages from subsequent requests.</li>
<li><strong><code class="language-text">WaitTimeSeconds</code></strong> - <em>optional</em>, how long the call waits for a message to be available in the queue (if empty).</li>
</ul>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token keyword">import</span> <span class="token punctuation">{</span> ReceiveMessageCommand<span class="token punctuation">,</span> DeleteMessageCommand <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"@aws-sdk/client-sqs"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> client <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"./lib/sqs-getclient.js"</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> getQueue <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"./lib/sqs-listqueues.js"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> params <span class="token operator">=</span> <span class="token punctuation">{</span>
AttributeNames<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"All"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
MaxNumberOfMessages<span class="token operator">:</span> <span class="token number">1</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> <span class="token function-variable function">receiveDelete</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> url <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">getQueue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
params<span class="token punctuation">.</span>QueueUrl <span class="token operator">=</span> url<span class="token punctuation">;</span>
<span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token keyword">await</span> client<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ReceiveMessageCommand</span><span class="token punctuation">(</span>params<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>data<span class="token punctuation">.</span>Messages<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// object used to delete retrieved message</span>
<span class="token keyword">let</span> delParams <span class="token operator">=</span> <span class="token punctuation">{</span>
QueueUrl<span class="token operator">:</span> url<span class="token punctuation">,</span>
<span class="token comment">// ReceiptHandle is the identifier used</span>
<span class="token comment">// to delete a specific message</span>
ReceiptHandle<span class="token operator">:</span> data<span class="token punctuation">.</span>Messages<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>ReceiptHandle
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment">// Print retrieved message.</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>Messages<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">?.</span>Body<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Delete retrieved message</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> response <span class="token operator">=</span> <span class="token keyword">await</span> client<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DeleteMessageCommand</span><span class="token punctuation">(</span>delParams<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Message deleted:"</span><span class="token punctuation">,</span> response<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Error"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"receive error"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span>err<span class="token punctuation">,</span> err<span class="token punctuation">.</span>stack<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">receiveDelete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div></content:encoded></item><item><title><![CDATA[Shell (zsh/bash) Configuration]]></title><description><![CDATA[macOS ships with Zsh as its default shell starting with Catalina (10.16). Thankfully, Zsh shares much of the fuctionality with bash, so…]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io/shell-config/</link><guid isPermaLink="false">https://gatsbystarterblogsource.gatsbyjs.io/shell-config/</guid><pubDate>Tue, 20 Aug 2019 20:09:11 GMT</pubDate><content:encoded><p>macOS ships with Zsh as its default shell starting with Catalina (10.16). Thankfully, Zsh shares much of the fuctionality with bash, so existing configurations should transfer over without issue.</p>
<h1>Dotfiles</h1>
<p>Shell startup files, also known as <em>dotfiles</em>, are usually found in your home directory (if it exists). They are sourced in the following order:</p>
<ol>
<li><strong><code class="language-text">.zshenv</code></strong> - may not exist.</li>
<li><strong><code class="language-text">.zprofile</code></strong> - login shell, sourced before <code class="language-text">.zshrc</code>. I have <code class="language-text">PATH</code> environment variables here.</li>
<li><strong><code class="language-text">.zshrc</code></strong> - login and interactive shells. I hold aliases, color configurations, and other environment variables here.</li>
<li><strong><code class="language-text">.zlogin</code></strong> - login shell, may not exist.</li>
</ol>
<h2>Prompt Colors</h2>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; "
>
<a
class="gatsby-resp-image-link"
href="/static/cd75d1ba46eba601e7c313684567746c/80cfc/terminal.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 67.08860759493672%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACJUlEQVQ4y6WTy27TQBSGJ5ayAakgWMTIc7Nn7MS3iZMmjS8kaYUoTwALnqJe0Mdhx8MAgogNZQevQRnmoHFKaKWICrH4JM8Z+5s5/mcQQqj3/HTxYv1kfj6fl2dlWbZVVbVVvWibpmmfnT5tj49P2tVq3S6X67Ysq7aum+uc1XXzqqrqlwghByGE7j6eTy+qZgZ5rkApBfEohkgoCMMhRFEIQkhI0gSmh1PIshyklCCEuEEQiG/9fv+eFR6EsvgwyZd24jvnTHMe6CSqdTKcaymGmnOqh3KsVVpqGSSaUa4xxr+5xBiD53mfHcd5sBWKfJOMJhCGoaaUGkqZKdTM5HlukjgxQvhG8rGJgoXhPDCEErN9r+MnpRQwxl92wkiozTirbXuaMQaMcSjyCgp1BGmaAiEeSD6BVJ6AFAkQgsFKLISQfcJiM84aiKLI7hAY3QrTpADf50AZBsmnEIcVMM6s5EpI9guzTG2O5mUnxN3qDEbhDIZyAozIbiy4gljW4PvB7cIoGG9sKFJK+5PBtj07LKEqVxDKFDjjELAEomDazd0qDNPhJs0LoIRpQohhjBmlcpPlqYnjkfED3xCCOyixQZAd+1uepB/9kNviJaXUSrXned2xsM9bqKaEXhvv+HEl/HNssEcuGGW75LpgurRv1v4GIeSr4zgPrfDOYDB47bruJ9d137qu+/4feWe/HQwGb3q93oEV9hBC9so8+k/u27v8Cw7gI/Wgz9FaAAAAAElFTkSuQmCC'); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Terminal Colors"
title="Terminal Colors"
src="/static/cd75d1ba46eba601e7c313684567746c/f058b/terminal.png"
srcset="/static/cd75d1ba46eba601e7c313684567746c/c26ae/terminal.png 158w,
/static/cd75d1ba46eba601e7c313684567746c/6bdcf/terminal.png 315w,
/static/cd75d1ba46eba601e7c313684567746c/f058b/terminal.png 630w,
/static/cd75d1ba46eba601e7c313684567746c/40601/terminal.png 945w,
/static/cd75d1ba46eba601e7c313684567746c/78612/terminal.png 1260w,
/static/cd75d1ba46eba601e7c313684567746c/80cfc/terminal.png 1844w"
sizes="(max-width: 630px) 100vw, 630px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</a>
</span></p>
<p>The prompt is configured using <code class="language-text">$PS1</code>, which isn’t the gaming console but the “prompt string”. Here is a list of important escapes:</p>
<ul>
<li><strong><code class="language-text">%n</code></strong> - username</li>
<li><strong><code class="language-text">%M</code></strong> - hostname</li>
<li><strong><code class="language-text">%d</code></strong>, <strong><code class="language-text">%/</code></strong> - current working directory</li>
<li><strong><code class="language-text">%~</code></strong> - current working directory, with <code class="language-text">$HOME</code> replaced with a tilde <code class="language-text">~</code>.</li>
<li><strong><code class="language-text">%F</code></strong> … <strong><code class="language-text">%f</code></strong> - foreground color, referenced by name or ASNI code.</li>
<li><strong><code class="language-text">%B</code></strong><code class="language-text">...</code><strong><code class="language-text">%b</code></strong> - bold</li>
</ul>
<p>You are also able to use double quotes to preserve line breaks.</p>
<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">PS1=&quot;
%B%F{green}%n%f%b %F{blue}%~%f
%B%F{magenta}»%f%b &quot;</code></pre></div>
<h2>Tab Completion Colors</h2>
<p><img src="/ece7881029d644dd662388b50d122cba/terminal-list.gif" alt="Terminal Tab Completion"></p>
<p>Zsh uses <code class="language-text">list-colors</code> and <code class="language-text">menu select</code> modules to select from a list of tab-completed strings. To use colors with the regular <code class="language-text">ls</code> command, set <code class="language-text">CLICOLOR</code> to <code class="language-text">1</code>. You’ll need <code class="language-text">autoload</code> at the top of your configuration file to use these features:</p>
<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">autoload -Uz compinit
compinit
export CLICOLOR=1
export LS_COLORS=&#39;di=34:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43&#39;
zstyle &#39;:completion:*&#39; list-colors &quot;${(s.:.)LS_COLORS}&quot;
zstyle &#39;:completion:*&#39; menu select</code></pre></div>
<h2>Keybindings</h2>
<p>Unfortunately, Zsh doesn’t have backwards-kill, using <code class="language-text">Ctrl + U</code> or <code class="language-text">^U</code>, enabled by default. If you’re coming from bash, you can re-enable this feature using the <code class="language-text">bindkey</code> command:</p>
<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">bindkey &#39;^U&#39; backward-kill-line</code></pre></div>
<h2>Editor</h2>
<p><code class="language-text">EDITOR</code> is the environment variable that points to the path of the text editor of your choice. The default editor is “vim”, and used for things like git commit messages. Thankfully you can change the default editor to something else:</p>
<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text"># Use VSCode instead.
export EDITOR=&#39;/Applications/Visual\ Studio\ Code.app/Contents/MacOS/Electron -w&#39;</code></pre></div>
<p>Here, the <code class="language-text">-w</code> flag waits for the file to be closed before returning, which is required for git commit messages.</p>
<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text"># Use nano instead.
export EDITOR=&#39;usr/bin/nano&#39;</code></pre></div>
<p>Nano uses tabs instead of spaces. To have the editor always use spaces instead of tabs, you can either alias <code class="language-text">nano</code> or include the <code class="language-text">-T4</code> flag in the environment variable.</p>
<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text"># Use nano with spaces instead of tabs.
export EDITOR=&#39;usr/bin/nano -T4&#39;
# Always open nano with spaces instead of tabs.
alias nano=&#39;nano -T4&#39;</code></pre></div>
<p>If you can’t remember the path to the editor, use the <code class="language-text">which</code> command:</p>
<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell">$ <span class="token function">which</span> code
/usr/local/bin/code
$ <span class="token function">which</span> <span class="token function">nano</span>
/usr/bin/nano</code></pre></div></content:encoded></item><item><title><![CDATA[Git Demystified]]></title><description><![CDATA[Distance from There are several ways to refer to a previous commit from . - refers to the first parent. - first parent’s first parent…]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io/git-demystified/</link><guid isPermaLink="false">https://gatsbystarterblogsource.gatsbyjs.io/git-demystified/</guid><pubDate>Tue, 18 Jun 2019 20:09:11 GMT</pubDate><content:encoded><h2>Distance from <code class="language-text">HEAD</code></h2>
<p>There are several ways to refer to a previous commit from <code class="language-text">HEAD</code>.</p>
<ul>
<li>
<p><code class="language-text">HEAD~</code> - refers to the first parent.</p>
<ul>
<li><code class="language-text">HEAD~2</code> - first parent’s first parent.</li>
<li><code class="language-text">HEAD~~</code> - alternative form.</li>
</ul>
</li>
<li>
<p><code class="language-text">HEAD^</code> - same as above.</p>
<ul>
<li><code class="language-text">HEAD^2</code> - second parent (for merges).</li>
</ul>
</li>
<li>
<p><code class="language-text">HEAD@{1}</code> - same as above.</p>
<ul>
<li><code class="language-text">HEAD@{2}</code> - parent’s parent.</li>
</ul>
</li>
</ul>
<h2>Files (Staging Area)</h2>
<p>Unintuitively, the <code class="language-text">git reset</code> command is used for refs and files</p>
<ul>
<li>
<p><code class="language-text">git add «file»</code> - stage for commit.</p>
<ul>
<li><code class="language-text">git add -A</code> - new, modified, and deleted files.</li>
<li><code class="language-text">git add -u</code> - modified and deleted files (new files are ignored).</li>
<li><code class="language-text">git add .</code> - new and modified (deleted files are ignored).</li>
</ul>
</li>
<li><code class="language-text">git reset «file»</code> - unstage. Think of it as the opposite to <code class="language-text">git add</code>.</li>
<li><code class="language-text">git reset --hard</code> - equivalent to <code class="language-text">git reset . ; git checkout .</code>.</li>
</ul>
<h2><code class="language-text">checkout</code> vs. <code class="language-text">reset</code></h2>
<p><code class="language-text">git reset</code> moves <em>both</em> the <code class="language-text">HEAD</code> and branch pointer. <code class="language-text">git checkout</code> <em>only</em> moves the <code class="language-text">HEAD</code>, detaching it.</p>
<p>To reattach a detached <code class="language-text">HEAD</code>,</p>
<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell">$ <span class="token function">git</span> checkout «branch» <span class="token comment"># e.g., git checkout master</span></code></pre></div>
<p>To undo an accidental <code class="language-text">git reset</code>,</p>
<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell">$ <span class="token function">git</span> reflog
$ <span class="token function">git</span> reset «hash»</code></pre></div>
<h2>Alias</h2>
<p>The config files to set aliases are found in <code class="language-text">~/.gitconfig</code>. You can create a section in the file as follows:</p>
<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">[alias]
ac = !git add -A &amp;&amp; git commit -m
c = commit
co = checkout
l = log --all --decorate --oneline --graph
s = status
sh = stash</code></pre></div>
<p>An alias expansion can be prefixed with an exclamation mark <code class="language-text">!</code> to treat it as a shell command. </p></content:encoded></item></channel></rss>