sethmlarson.dev_werkzeug.atom.xml - sfeed_tests - sfeed tests and RSS and Atom … | |
git clone git://git.codemadness.org/sfeed_tests | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
sethmlarson.dev_werkzeug.atom.xml (458966B) | |
--- | |
1 <?xml version="1.0" encoding="utf-8"?> | |
2 <feed xmlns="http://www.w3.org/2005/Atom"> | |
3 <title type="text">sethmlarson.dev - Last 5 Blog Posts</title> | |
4 <id>http://sethmlarson.dev/feed</id> | |
5 <updated>2022-02-08T00:00:00Z</updated> | |
6 <link href="http://sethmlarson.dev/" /> | |
7 <link href="http://sethmlarson.dev/feed" rel="self" /> | |
8 <generator>Werkzeug</generator> | |
9 <entry xml:base="http://sethmlarson.dev/feed"> | |
10 <title type="text">How does UTF-8 turn βπβ into βF09F9882οΏ½… | |
11 <id>http://sethmlarson.dev/blog/utf-8?date=2022-02-08</id> | |
12 <updated>2022-02-08T00:00:00Z</updated> | |
13 <published>2022-02-08T00:00:00Z</published> | |
14 <link href="http://sethmlarson.dev/blog/utf-8?date=2022-02-08" /> | |
15 <author> | |
16 <name>Seth Michael Larson</name> | |
17 </author> | |
18 <content type="html"><!DOCTYPE html> | |
19 <html lang="en"> | |
20 <head> | |
21 <meta charset="utf-8"> | |
22 <title>How does UTF-8 turn βπβ into βF09F9882β?<… | |
23 <meta name="description" content="Blogging about P… | |
24 <meta name="keywords" content="blog python open so… | |
25 <meta name="author" content="Seth Michael Larson&q… | |
26 <meta name="viewport" content="width=device-width,… | |
27 <meta name="format-detection" content="telephone=n… | |
28 <link rel="alternate" type="application/rss+xml&qu… | |
29 <link rel="icon" href="/static/favicon.ico"&g… | |
30 <link rel="stylesheet" href="/static/style.css&quo… | |
31 | |
32 <meta property="og:site_name" content="Seth Michae… | |
33 <meta property="og:author" content="Seth Michael L… | |
34 <meta property="og:type" content="article"/&g… | |
35 <meta property="og:title" content="How does UTF-8 … | |
36 <meta property="og:description" content="If you&am… | |
37 | |
38 | |
39 &amp;#xa;&amp;#xa;0x820x820x980..."/> | |
40 <meta property="og:image" content="http://sethmlar… | |
41 <meta name="twitter:card" content="summary"/&… | |
42 <meta name="twitter:site" content="@sethmlarson&qu… | |
43 <meta name="twitter:creator" content="@sethmlarson… | |
44 <meta name="twitter:title" content="How does UTF-8… | |
45 <meta name="twitter:description" content="If you&a… | |
46 | |
47 | |
48 &amp;#xa;&amp;#xa;0x820x820x980..."/> | |
49 <meta property="og:image" content="http://sethmlar… | |
50 | |
51 </head> | |
52 <body> | |
53 <div class="container"> | |
54 <div class="row"> | |
55 <div class="col-6"> | |
56 <center> | |
57 <h1 style="margin-bottom: 0.1em; font-size: 1.8e… | |
58 <span style="font-style: italic;">Bloggi… | |
59 </center> | |
60 </div> | |
61 <div class="col-6"> | |
62 <div class="navbar-outer"> | |
63 <div class="navbar-inner"> | |
64 <a class="icon" href="/about"… | |
65 <svg width="2em" height="2em&q… | |
66 <title>About</title><path d=&… | |
67 </svg> | |
68 </a> | |
69 <a class="icon" href="/blog"&… | |
70 <svg width="2em" height="2em&q… | |
71 <title>Blog</title><path d=&q… | |
72 </svg> | |
73 </a> | |
74 <a class="icon" href="https://twit… | |
75 <svg width="2em" height="2em&q… | |
76 <title>Twitter</title><path d… | |
77 </svg> | |
78 </a> | |
79 <a class="icon" href="https://gith… | |
80 <svg width="2em" height="2em&q… | |
81 <title>GitHub</title><path d=… | |
82 </svg> | |
83 </a> | |
84 <a class="icon" href="https://link… | |
85 <svg width="2em" height="2em&q… | |
86 <title>LinkedIn</title><path … | |
87 </svg> | |
88 </a> | |
89 </div> | |
90 </div> | |
91 </div> | |
92 </div> | |
93 | |
94 <div class="row"> | |
95 <div class="col-12"> | |
96 <h2 class="blog-title" style="text-align: cent… | |
97 <p><center>Published 2022-02-08 β <span class=&… | |
98 </div> | |
99 </div> | |
100 <div class="row"> | |
101 <div class="col-12"> | |
102 <p>If you're anything like me, you love emojis! Emojis app… | |
103 | |
104 <p><center> | |
105 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="h… | |
106 </center></p> | |
107 | |
108 <p><strong><a href="https://w3techs.com/technologies… | |
109 | |
110 <p>I recently learned how UTF-8 works and felt that the definition… | |
111 | |
112 <h2>What is UTF-8?</h2> | |
113 | |
114 <p>UTF-8 is an encoding currently defined in <a href="http… | |
115 | |
116 <div class="row"> | |
117 <div class="col-6"> | |
118 | |
119 <h2>The 5 octets of UTF-8</h2> | |
120 | |
121 <blockquote> | |
122 <p><strong>NOTE:</strong> I use the term "octet… | |
123 </blockquote> | |
124 | |
125 <p> | |
126 Every octet that can be produced using UTF-8 will fall into one of five … | |
127 </p> | |
128 | |
129 <p> | |
130 Each octet also has "empty" spaces for bits (visualized as <… | |
131 </p> | |
132 | |
133 </div> | |
134 | |
135 <div class="col-6"> | |
136 | |
137 <center> | |
138 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="h… | |
139 </center> | |
140 | |
141 </div> | |
142 | |
143 <p></div></p> | |
144 | |
145 <h2>What are bit prefixes?</h2> | |
146 | |
147 <p>Bit prefixes is a common technique that allows for encoding inf… | |
148 | |
149 <p><strong>Bit prefixing is useful to maximize the extra spa… | |
150 | |
151 <p>In the case of UTF-8 the shortest prefixes are <code>0<… | |
152 | |
153 <p>Looking at the prefixes for UTF-8 octets the possibilities are … | |
154 | |
155 <div class="row"> | |
156 <div class="col-6"> | |
157 | |
158 <h2>Following the flow of bits</h2> | |
159 | |
160 <p>Using Python we're able to see that our target output is <co… | |
161 | |
162 <div class="codehilite"><pre><span></span… | |
163 <span class="o">&gt;&gt;&gt;</span> &l… | |
164 <span class="sa">b</span><span class="s1&q… | |
165 </code></pre></div> | |
166 | |
167 <p> | |
168 Encoding a Unicode codepoint into bytes is a multi-step process. The fir… | |
169 </p> | |
170 | |
171 <p> | |
172 Next step is converting the codepoint value <code>0x1F602</code… | |
173 </p> | |
174 | |
175 </div> | |
176 | |
177 <div class="col-6"> | |
178 | |
179 <center> | |
180 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="h… | |
181 | |
182 </div> | |
183 | |
184 <p></div></p> | |
185 | |
186 <p>From there we lay out our four octets, 1 header and 3 tail octe… | |
187 | |
188 <p>After that we turn each 8 bit grouping into a byte which we dis… | |
189 | |
190 <p>Decoding a Unicode codepoint from bytes only requires reversing… | |
191 | |
192 <blockquote> | |
193 <p><strong>NOTE:</strong> You can always find a code… | |
194 </blockquote> | |
195 | |
196 <div class="row"> | |
197 <div class="col-6"> | |
198 | |
199 <h2>Why is UTF-8 everywhere?</h2> | |
200 | |
201 <p> | |
202 Back when UTF-8 was first introduced there were many systems that didn't… | |
203 </p> | |
204 | |
205 <p> | |
206 UTF-8's use of byte prefixing <code>0</code> to be identical… | |
207 </p> | |
208 | |
209 <p> | |
210 This was a big win for compatibility as it <strong>meant many syst… | |
211 </p> | |
212 | |
213 </div> | |
214 | |
215 <div class="col-6"> | |
216 | |
217 <center> | |
218 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="h… | |
219 | |
220 </div> | |
221 | |
222 <p></div></p> | |
223 | |
224 <h2>Giant reference card</h2> | |
225 | |
226 <p>Below is a diagram which shows how all the different possible h… | |
227 | |
228 <p>Grapheme clusters are mentioned in the diagram, simply put they… | |
229 | |
230 <p><center> | |
231 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="h… | |
232 </center></p> | |
233 | |
234 </div> | |
235 </div> | |
236 <div class="row"> | |
237 <div class="col-12"> | |
238 <center> | |
239 <div class="how-to-subscribe"> | |
240 Enjoy this post? <span class="heart">β€&… | |
241 </div> | |
242 </center> | |
243 </div> | |
244 </div> | |
245 | |
246 <div class="row"> | |
247 <div class="col-2"></div> | |
248 <div class="col-8"><center><small&g… | |
249 <div class="col-2"></div> | |
250 </div> | |
251 </div> | |
252 | |
253 <!-- Google Analytics --> | |
254 <script async src="https://www.googletagmanager.com/gtag/js?id=G… | |
255 <script> | |
256 window.dataLayer = window.dataLayer || []; | |
257 function gtag(){dataLayer.push(arguments);} | |
258 gtag('js', new Date()); | |
259 gtag('config', 'G-C3VD7T243W'); | |
260 </script> | |
261 </body> | |
262 </html></content> | |
263 </entry> | |
264 <entry xml:base="http://sethmlarson.dev/feed"> | |
265 <title type="text">Strict Python function parameters</title> | |
266 <id>http://sethmlarson.dev/blog/strict-python-function-parameters?da… | |
267 <updated>2022-01-23T00:00:00Z</updated> | |
268 <published>2022-01-23T00:00:00Z</published> | |
269 <link href="http://sethmlarson.dev/blog/strict-python-function-param… | |
270 <author> | |
271 <name>Seth Michael Larson</name> | |
272 </author> | |
273 <content type="html"><!DOCTYPE html> | |
274 <html lang="en"> | |
275 <head> | |
276 <meta charset="utf-8"> | |
277 <title>Strict Python function parameters</title> | |
278 <meta name="description" content="Blogging about P… | |
279 <meta name="keywords" content="blog python open so… | |
280 <meta name="author" content="Seth Michael Larson&q… | |
281 <meta name="viewport" content="width=device-width,… | |
282 <meta name="format-detection" content="telephone=n… | |
283 <link rel="alternate" type="application/rss+xml&qu… | |
284 <link rel="icon" href="/static/favicon.ico"&g… | |
285 <link rel="stylesheet" href="/static/style.css&quo… | |
286 | |
287 <meta property="og:site_name" content="Seth Michae… | |
288 <meta property="og:author" content="Seth Michael L… | |
289 <meta property="og:type" content="article"/&g… | |
290 <meta property="og:title" content="Strict Python f… | |
291 <meta property="og:description" content="What do y… | |
292 <meta property="og:image" content="http://sethmlar… | |
293 <meta name="twitter:card" content="summary"/&… | |
294 <meta name="twitter:site" content="@sethmlarson&qu… | |
295 <meta name="twitter:creator" content="@sethmlarson… | |
296 <meta name="twitter:title" content="Strict Python … | |
297 <meta name="twitter:description" content="What do … | |
298 <meta property="og:image" content="http://sethmlar… | |
299 | |
300 </head> | |
301 <body> | |
302 <div class="container"> | |
303 <div class="row"> | |
304 <div class="col-6"> | |
305 <center> | |
306 <h1 style="margin-bottom: 0.1em; font-size: 1.8e… | |
307 <span style="font-style: italic;">Bloggi… | |
308 </center> | |
309 </div> | |
310 <div class="col-6"> | |
311 <div class="navbar-outer"> | |
312 <div class="navbar-inner"> | |
313 <a class="icon" href="/about"… | |
314 <svg width="2em" height="2em&q… | |
315 <title>About</title><path d=&… | |
316 </svg> | |
317 </a> | |
318 <a class="icon" href="/blog"&… | |
319 <svg width="2em" height="2em&q… | |
320 <title>Blog</title><path d=&q… | |
321 </svg> | |
322 </a> | |
323 <a class="icon" href="https://twit… | |
324 <svg width="2em" height="2em&q… | |
325 <title>Twitter</title><path d… | |
326 </svg> | |
327 </a> | |
328 <a class="icon" href="https://gith… | |
329 <svg width="2em" height="2em&q… | |
330 <title>GitHub</title><path d=… | |
331 </svg> | |
332 </a> | |
333 <a class="icon" href="https://link… | |
334 <svg width="2em" height="2em&q… | |
335 <title>LinkedIn</title><path … | |
336 </svg> | |
337 </a> | |
338 </div> | |
339 </div> | |
340 </div> | |
341 </div> | |
342 | |
343 <div class="row"> | |
344 <div class="col-12"> | |
345 <h2 class="blog-title" style="text-align: cent… | |
346 <p><center>Published 2022-01-23 β <span class=&… | |
347 </div> | |
348 </div> | |
349 <div class="row"> | |
350 <div class="col-12"> | |
351 <p><strong>What do you think about when writing a ne… | |
352 | |
353 <div class="codehilite"><pre><span></span… | |
354 <span class="c1"># Fancy data processing here!</sp… | |
355 </code></pre></div> | |
356 | |
357 <p>However, there's one aspect many programmers have an opinion ab… | |
358 | |
359 <div class="codehilite"><pre><span></span… | |
360 | |
361 <span class="n">process_data</span><span class=… | |
362 </code></pre></div> | |
363 | |
364 <p>You don't need to specify <code>data=</code> for re… | |
365 | |
366 <p>The above decisions make sense to me having written lots of Pyt… | |
367 | |
368 <div class="codehilite"><pre><span></span… | |
369 <span class="c1"># infer the parameter for &#39;utf-… | |
370 <span class="n">process_data</span><span class=… | |
371 | |
372 <span class="c1"># Using `data` as keyword argument, but… | |
373 <span class="c1"># not as clean as &quot;data&qu… | |
374 <span class="n">process_data</span><span class=… | |
375 <span class="n">process_data</span><span class=… | |
376 | |
377 <span class="c1"># All keyword parameters but encoding&l… | |
378 <span class="c1"># and data are flip-flopped.</span&g… | |
379 <span class="n">process_data</span><span class=… | |
380 </code></pre></div> | |
381 | |
382 <p>If the code is widespread enough you're almost guaranteed that … | |
383 | |
384 <h2>Keyword-only parameters</h2> | |
385 | |
386 <p><a href="https://www.python.org/dev/peps/pep-3102"… | |
387 | |
388 <p>Defining a parameter as being "keyword-only" looks li… | |
389 | |
390 <div class="codehilite"><pre><span></span… | |
391 </code></pre></div> | |
392 | |
393 <p>Notice the <code>*</code> between <code>data&… | |
394 | |
395 <p>Now that the <code>encoding</code> parameter is a k… | |
396 | |
397 <div class="codehilite"><pre><span></span… | |
398 <span class="n">process_data</span><span class=… | |
399 <span class="n">process_data</span><span class=… | |
400 | |
401 <span class="c1"># Raises a TypeError:</span> | |
402 <span class="n">process_data</span><span class=… | |
403 | |
404 <span class="c1"># What way can (and will) use the funct… | |
405 <span class="n">process_data</span><span class=… | |
406 <span class="n">process_data</span><span class=… | |
407 <span class="n">process_data</span><span class=… | |
408 </code></pre></div> | |
409 | |
410 <p>It's a small improvement but there's more we can do!</p> | |
411 | |
412 <h2>Positional-only parameters</h2> | |
413 | |
414 <p><a href="https://www.python.org/dev/peps/pep-0570"… | |
415 | |
416 <p>You can define "positional-only" argument in Python l… | |
417 | |
418 <div class="codehilite"><pre><span></span… | |
419 </code></pre></div> | |
420 | |
421 <p>The <code>/</code> in the function signature means … | |
422 | |
423 <div class="codehilite"><pre><span></span… | |
424 <span class="n">process_data</span><span class=… | |
425 </code></pre></div> | |
426 | |
427 <p>Many functions in the standard library don't follow the typical… | |
428 | |
429 <div class="codehilite"><pre><span></span… | |
430 <span class="c1"># the `/` character even before Python&… | |
431 <span class="c1"># 3.8 implemented PEP 570:</span> | |
432 <span class="o">&gt;&gt;&gt;</span> &l… | |
433 <span class="o">...</span> | |
434 <span class="nb">pow</span><span class="p&… | |
435 <span class="o">...</span> | |
436 | |
437 <span class="o">&gt;&gt;&gt;</span> &l… | |
438 <span class="n">Traceback</span> <span class=&q… | |
439 <span class="n">File</span> <span class="… | |
440 <span class="ne">TypeError</span><span class=&q… | |
441 </code></pre></div> | |
442 | |
443 <h2>Putting it all together</h2> | |
444 | |
445 <p>You can use both positional-only and keyword-only arguments tog… | |
446 | |
447 <div class="codehilite"><pre><span></span… | |
448 </code></pre></div> | |
449 | |
450 <p>And now with <code>data</code> being positional-onl… | |
451 | |
452 <div class="codehilite"><pre><span></span… | |
453 <span class="n">process_data</span><span class=… | |
454 <span class="n">process_data</span><span class=… | |
455 | |
456 <span class="c1"># Raises a TypeError:</span> | |
457 <span class="n">process_data</span><span class=… | |
458 <span class="n">process_data</span><span class=… | |
459 <span class="n">process_data</span><span class=… | |
460 <span class="n">process_data</span><span class=… | |
461 </code></pre></div> | |
462 | |
463 <p><strong>Success!!</strong> π Your function now o… | |
464 | |
465 <h2>Why use strict function signatures?</h2> | |
466 | |
467 <p>So why go through this extra bit of trouble? You could read the… | |
468 | |
469 <h3>Less to consider when your function changes</h3> | |
470 | |
471 <p>Here's a real-life example I had to handle with the <a href=… | |
472 | |
473 <div class="codehilite"><pre><span></span… | |
474 <span class="k">def</span> <span class="nf… | |
475 | |
476 <span class="c1"># Function signature in v8.0.0</span… | |
477 <span class="k">def</span> <span class="nf… | |
478 </code></pre></div> | |
479 | |
480 <p>If the <code>doc_type</code> parameter were removed… | |
481 | |
482 <div class="codehilite"><pre><span></span… | |
483 | |
484 <span class="c1"># In 7.16.0 the above arguments will<… | |
485 <span class="c1"># be assigned like so:</span> | |
486 | |
487 <span class="c1"># {index=1, id=2, doc_type=3}</span&… | |
488 | |
489 <span class="c1"># In 8.0.0 (if not mitigated) the above… | |
490 <span class="c1"># arguments would be assigned like so:&… | |
491 | |
492 <span class="c1"># {index=1, id=2, params=3} (not good!)… | |
493 </code></pre></div> | |
494 | |
495 <p>We started emitting a <code>DeprecationWarning</code&g… | |
496 | |
497 <p>This change also meant the API generator logic could be greatly… | |
498 | |
499 <p><strong>There's additional API freedoms when using positi… | |
500 | |
501 <div class="codehilite"><pre><span></span… | |
502 </code></pre></div> | |
503 | |
504 <p>If you now wanted the <code>data</code> parameter t… | |
505 | |
506 <div class="codehilite"><pre><span></span… | |
507 <span class="c1"># without breaking anyone&#39;s cod… | |
508 <span class="k">def</span> <span class="nf… | |
509 </code></pre></div> | |
510 | |
511 <p>For more information there's an <a href="https://www.py… | |
512 | |
513 <h3>Consistency between documentation and usage</h3> | |
514 | |
515 <p>Ideally documentation will pick a single way of using each func… | |
516 | |
517 <div class="codehilite"><pre><span></span… | |
518 </code></pre></div> | |
519 | |
520 <p>This function is found <em>everywhere</em>, even ac… | |
521 | |
522 <div class="codehilite"><pre><span></span… | |
523 <span class="n">request</span><span class="… | |
524 | |
525 <span class="c1"># These aren&#39;t as immediately r… | |
526 <span class="n">request</span><span class="… | |
527 <span class="n">request</span><span class="… | |
528 </code></pre></div> | |
529 | |
530 <p>By having a strict function signature we can ensure code writte… | |
531 | |
532 </div> | |
533 </div> | |
534 <div class="row"> | |
535 <div class="col-12"> | |
536 <center> | |
537 <div class="how-to-subscribe"> | |
538 Enjoy this post? <span class="heart">β€&… | |
539 </div> | |
540 </center> | |
541 </div> | |
542 </div> | |
543 | |
544 <div class="row"> | |
545 <div class="col-2"></div> | |
546 <div class="col-8"><center><small&g… | |
547 <div class="col-2"></div> | |
548 </div> | |
549 </div> | |
550 | |
551 <!-- Google Analytics --> | |
552 <script async src="https://www.googletagmanager.com/gtag/js?id=G… | |
553 <script> | |
554 window.dataLayer = window.dataLayer || []; | |
555 function gtag(){dataLayer.push(arguments);} | |
556 gtag('js', new Date()); | |
557 gtag('config', 'G-C3VD7T243W'); | |
558 </script> | |
559 </body> | |
560 </html></content> | |
561 </entry> | |
562 <entry xml:base="http://sethmlarson.dev/feed"> | |
563 <title type="text">Problems with testing Python pre-releases and pip… | |
564 <id>http://sethmlarson.dev/blog/python-prereleases-and-pip-cache?dat… | |
565 <updated>2022-01-13T00:00:00Z</updated> | |
566 <published>2022-01-13T00:00:00Z</published> | |
567 <link href="http://sethmlarson.dev/blog/python-prereleases-and-pip-c… | |
568 <author> | |
569 <name>Seth Michael Larson</name> | |
570 </author> | |
571 <content type="html"><!DOCTYPE html> | |
572 <html lang="en"> | |
573 <head> | |
574 <meta charset="utf-8"> | |
575 <title>Problems with testing Python pre-releases and pip cachi… | |
576 <meta name="description" content="Blogging about P… | |
577 <meta name="keywords" content="blog python open so… | |
578 <meta name="author" content="Seth Michael Larson&q… | |
579 <meta name="viewport" content="width=device-width,… | |
580 <meta name="format-detection" content="telephone=n… | |
581 <link rel="alternate" type="application/rss+xml&qu… | |
582 <link rel="icon" href="/static/favicon.ico"&g… | |
583 <link rel="stylesheet" href="/static/style.css&quo… | |
584 | |
585 <meta property="og:site_name" content="Seth Michae… | |
586 <meta property="og:author" content="Seth Michael L… | |
587 <meta property="og:type" content="article"/&g… | |
588 <meta property="og:title" content="Problems with t… | |
589 <meta property="og:description" content="Some time… | |
590 | |
591 nox &amp;gt; Running session test-3.11 | |
592 nox &amp;gt; Cre..."/> | |
593 <meta property="og:image" content="http://sethmlar… | |
594 <meta name="twitter:card" content="summary"/&… | |
595 <meta name="twitter:site" content="@sethmlarson&qu… | |
596 <meta name="twitter:creator" content="@sethmlarson… | |
597 <meta name="twitter:title" content="Problems with … | |
598 <meta name="twitter:description" content="Some tim… | |
599 | |
600 nox &amp;gt; Running session test-3.11 | |
601 nox &amp;gt; Cre..."/> | |
602 <meta property="og:image" content="http://sethmlar… | |
603 | |
604 </head> | |
605 <body> | |
606 <div class="container"> | |
607 <div class="row"> | |
608 <div class="col-6"> | |
609 <center> | |
610 <h1 style="margin-bottom: 0.1em; font-size: 1.8e… | |
611 <span style="font-style: italic;">Bloggi… | |
612 </center> | |
613 </div> | |
614 <div class="col-6"> | |
615 <div class="navbar-outer"> | |
616 <div class="navbar-inner"> | |
617 <a class="icon" href="/about"… | |
618 <svg width="2em" height="2em&q… | |
619 <title>About</title><path d=&… | |
620 </svg> | |
621 </a> | |
622 <a class="icon" href="/blog"&… | |
623 <svg width="2em" height="2em&q… | |
624 <title>Blog</title><path d=&q… | |
625 </svg> | |
626 </a> | |
627 <a class="icon" href="https://twit… | |
628 <svg width="2em" height="2em&q… | |
629 <title>Twitter</title><path d… | |
630 </svg> | |
631 </a> | |
632 <a class="icon" href="https://gith… | |
633 <svg width="2em" height="2em&q… | |
634 <title>GitHub</title><path d=… | |
635 </svg> | |
636 </a> | |
637 <a class="icon" href="https://link… | |
638 <svg width="2em" height="2em&q… | |
639 <title>LinkedIn</title><path … | |
640 </svg> | |
641 </a> | |
642 </div> | |
643 </div> | |
644 </div> | |
645 </div> | |
646 | |
647 <div class="row"> | |
648 <div class="col-12"> | |
649 <h2 class="blog-title" style="text-align: cent… | |
650 <p><center>Published 2022-01-13 β <span class=&… | |
651 </div> | |
652 </div> | |
653 <div class="row"> | |
654 <div class="col-12"> | |
655 <p>Some time ago the urllib3 team noticed that our Python … | |
656 | |
657 <div class="codehilite"><pre><span></span… | |
658 nox &gt; Creating virtual environment <span class="o"&g… | |
659 nox &gt; python --version | |
660 Python <span class="m">3</span>.11.0a3 | |
661 nox &gt; Command coverage run --parallel-mode -m pytest -r a | |
662 --color<span class="o">=</span>yes --tb<span … | |
663 failed with <span class="nb">exit</span> code -11 | |
664 | |
665 nox &gt; Session test-3.11 failed. | |
666 Error: Process completed with <span class="nb">exit</… | |
667 </code></pre></div> | |
668 | |
669 <p>Notice that our test execution was exited with a return code of… | |
670 | |
671 <p><a href="https://github.com/pquentin">Quentin&l… | |
672 | |
673 <div class="codehilite"><pre><span></span… | |
674 | |
675 Thread 0x00007fee9a250640 <span class="o">(</span>… | |
676 File <span class="s2">&quot;/home/install/lib/pyth… | |
677 File <span class="s2">&quot;/home/urllib3/venv/lib… | |
678 File <span class="s2">&quot;/home/urllib3/venv/lib… | |
679 File <span class="s2">&quot;/home/urllib3/venv/lib… | |
680 File <span class="s2">&quot;/home/urllib3/venv/lib… | |
681 File <span class="s2">&quot;/home/install/lib/pyth… | |
682 File <span class="s2">&quot;/home/install/lib/pyth… | |
683 File <span class="s2">&quot;/home/install/lib/pyth… | |
684 File <span class="s2">&quot;/home/urllib3/venv/lib… | |
685 File <span class="s2">&quot;/home/install/lib/pyth… | |
686 File <span class="s2">&quot;/home/install/lib/pyth… | |
687 File <span class="s2">&quot;/home/install/lib/pyth… | |
688 | |
689 Extension modules: tornado.speedups, _brotli, _cffi_backend <span cla… | |
690 zsh: segmentation fault <span class="o">(</span>co… | |
691 </code></pre></div> | |
692 | |
693 <p>This looks like an issue in CPython, but we'll eventually disco… | |
694 | |
695 <h2>Finding and reporting the "bug"</h2> | |
696 | |
697 <p>After we could reproduce the error reliably, Quentin started &l… | |
698 | |
699 <p>Within this issue <a href="https://github.com/ericsnowc… | |
700 | |
701 <blockquote> | |
702 <p>Could it be that the wheel for one or more the dependencies w… | |
703 </blockquote> | |
704 | |
705 <p><strong>The answer to this was yes!</strong> Pip wa… | |
706 | |
707 <h2>When should you be testing Python pre-releases?</h2> | |
708 | |
709 <p>Testing your code against pre-releases of Python is important t… | |
710 | |
711 <p>Eric noted in the issue we filed:</p> | |
712 | |
713 <blockquote> | |
714 <p>Thanks for testing against the alpha releases!!! You're havi… | |
715 </blockquote> | |
716 | |
717 <p>However, doing so super early on in the development cycle of a … | |
718 | |
719 <p>If you maintain a Python library you should try at least to man… | |
720 | |
721 <p>The urllib3 team tries to start testing against in-development … | |
722 | |
723 <h3>When should you be aware of ABI changes?</h3> | |
724 | |
725 <p>Unless you're testing alpha and beta releases you likely won't … | |
726 | |
727 <h2>What are we doing to make this better?</h2> | |
728 | |
729 <p>Our team was using the <a href="https://github.com/acti… | |
730 | |
731 <p>We knew that pip's cache shouldn't be re-used across, at a mini… | |
732 | |
733 <p>A "cache key" is the identifier that the setup-python… | |
734 | |
735 </div> | |
736 </div> | |
737 <div class="row"> | |
738 <div class="col-12"> | |
739 <center> | |
740 <div class="how-to-subscribe"> | |
741 Enjoy this post? <span class="heart">β€&… | |
742 </div> | |
743 </center> | |
744 </div> | |
745 </div> | |
746 | |
747 <div class="row"> | |
748 <div class="col-2"></div> | |
749 <div class="col-8"><center><small&g… | |
750 <div class="col-2"></div> | |
751 </div> | |
752 </div> | |
753 | |
754 <!-- Google Analytics --> | |
755 <script async src="https://www.googletagmanager.com/gtag/js?id=G… | |
756 <script> | |
757 window.dataLayer = window.dataLayer || []; | |
758 function gtag(){dataLayer.push(arguments);} | |
759 gtag('js', new Date()); | |
760 gtag('config', 'G-C3VD7T243W'); | |
761 </script> | |
762 </body> | |
763 </html></content> | |
764 </entry> | |
765 <entry xml:base="http://sethmlarson.dev/feed"> | |
766 <title type="text">urllib3 raised $15,000 in 2021 (Newsletter #6)</t… | |
767 <id>http://sethmlarson.dev/blog/urllib3-raised-15k-in-2021?date=2021… | |
768 <updated>2021-12-29T00:00:00Z</updated> | |
769 <published>2021-12-29T00:00:00Z</published> | |
770 <link href="http://sethmlarson.dev/blog/urllib3-raised-15k-in-2021?d… | |
771 <author> | |
772 <name>Seth Michael Larson</name> | |
773 </author> | |
774 <content type="html"><!DOCTYPE html> | |
775 <html lang="en"> | |
776 <head> | |
777 <meta charset="utf-8"> | |
778 <title>urllib3 raised $15,000 in 2021 (Newsletter #6)</titl… | |
779 <meta name="description" content="Blogging about P… | |
780 <meta name="keywords" content="blog python open so… | |
781 <meta name="author" content="Seth Michael Larson&q… | |
782 <meta name="viewport" content="width=device-width,… | |
783 <meta name="format-detection" content="telephone=n… | |
784 <link rel="alternate" type="application/rss+xml&qu… | |
785 <link rel="icon" href="/static/favicon.ico"&g… | |
786 <link rel="stylesheet" href="/static/style.css&quo… | |
787 | |
788 <meta property="og:site_name" content="Seth Michae… | |
789 <meta property="og:author" content="Seth Michael L… | |
790 <meta property="og:type" content="article"/&g… | |
791 <meta property="og:title" content="urllib3 raised … | |
792 <meta property="og:description" content="Welcome t… | |
793 | |
794 Thanks to our sponsors! | |
795 | |
796 This year we receiv..."/> | |
797 <meta property="og:image" content="http://sethmlar… | |
798 <meta name="twitter:card" content="summary"/&… | |
799 <meta name="twitter:site" content="@sethmlarson&qu… | |
800 <meta name="twitter:creator" content="@sethmlarson… | |
801 <meta name="twitter:title" content="urllib3 raised… | |
802 <meta name="twitter:description" content="Welcome … | |
803 | |
804 Thanks to our sponsors! | |
805 | |
806 This year we receiv..."/> | |
807 <meta property="og:image" content="http://sethmlar… | |
808 | |
809 </head> | |
810 <body> | |
811 <div class="container"> | |
812 <div class="row"> | |
813 <div class="col-6"> | |
814 <center> | |
815 <h1 style="margin-bottom: 0.1em; font-size: 1.8e… | |
816 <span style="font-style: italic;">Bloggi… | |
817 </center> | |
818 </div> | |
819 <div class="col-6"> | |
820 <div class="navbar-outer"> | |
821 <div class="navbar-inner"> | |
822 <a class="icon" href="/about"… | |
823 <svg width="2em" height="2em&q… | |
824 <title>About</title><path d=&… | |
825 </svg> | |
826 </a> | |
827 <a class="icon" href="/blog"&… | |
828 <svg width="2em" height="2em&q… | |
829 <title>Blog</title><path d=&q… | |
830 </svg> | |
831 </a> | |
832 <a class="icon" href="https://twit… | |
833 <svg width="2em" height="2em&q… | |
834 <title>Twitter</title><path d… | |
835 </svg> | |
836 </a> | |
837 <a class="icon" href="https://gith… | |
838 <svg width="2em" height="2em&q… | |
839 <title>GitHub</title><path d=… | |
840 </svg> | |
841 </a> | |
842 <a class="icon" href="https://link… | |
843 <svg width="2em" height="2em&q… | |
844 <title>LinkedIn</title><path … | |
845 </svg> | |
846 </a> | |
847 </div> | |
848 </div> | |
849 </div> | |
850 </div> | |
851 | |
852 <div class="row"> | |
853 <div class="col-12"> | |
854 <h2 class="blog-title" style="text-align: cent… | |
855 <p><center>Published 2021-12-29 β <span class=&… | |
856 </div> | |
857 </div> | |
858 <div class="row"> | |
859 <div class="col-12"> | |
860 <p>Welcome to the 6th urllib3 newsletter, end of 2021 edit… | |
861 | |
862 <h2>Thanks to our sponsors!</h2> | |
863 | |
864 <p>This year we received so much support from many different place… | |
865 | |
866 <p><strong>We're so thankful for everyone who contributed.&l… | |
867 | |
868 <p>This large amount of funding means our team is planning on sett… | |
869 | |
870 <h3>Where we received and spent our funding</h3> | |
871 | |
872 <p>All of these amounts shown below are after fees from payment pr… | |
873 | |
874 <ul> | |
875 <li>$8,087.38 from <a href="https://gitcoin.co/grants/65/u… | |
876 <li>$5,050.00 from <a href="https://tidelift.com/subscript… | |
877 <li>$1,358.97 from <a href="https://github.com/sponsors/ur… | |
878 <li>$504.00 from <a href="https://opencollective.com/urlli… | |
879 <li><strong>$15,000.35</strong> from all sources</l… | |
880 </ul> | |
881 | |
882 <p>Funds were paid out to the following individuals:</p> | |
883 | |
884 <ul> | |
885 <li>$4,075 paid to <a href="https://github.com/sethmlarson… | |
886 <li>$3,325 paid to <a href="https://github.com/pquentin&qu… | |
887 <li>$1,900 paid to <a href="https://github.com/hramezani&q… | |
888 <li>$140 paid to <a href="https://github.com/davidism"… | |
889 <li><strong>$9,440</strong> paid in total</li> | |
890 </ul> | |
891 | |
892 <p>ΒΉ Amount from GitCoin is only ETH, DAI, and USDC that were sol… | |
893 | |
894 <p>Β² Tidelift is paid directly to Seth Larson and Quentin Pradet … | |
895 | |
896 <h2>Releases and Contributors</h2> | |
897 | |
898 <p>There were <a href="https://github.com/urllib3/urllib3/… | |
899 | |
900 <h2>Progress towards v2.0</h2> | |
901 | |
902 <p>The <a href="https://github.com/urllib3/urllib3/milesto… | |
903 | |
904 <p>Even after v2.0 is released our team plans on continuing bug fi… | |
905 | |
906 <h2>Type hints case study</h2> | |
907 | |
908 <p><a href="https://github.com/hramezani">Hasan Ra… | |
909 | |
910 <h2>Unreasonable effectiveness of investing in open source</h2&… | |
911 | |
912 <p>Quentin Pradet was <a href="https://quentin.pradet.me/b… | |
913 | |
914 <h2>PyCascades 2021</h2> | |
915 | |
916 <p>Seth spoke at <a href="https://2021.pycascades.com/&quo… | |
917 | |
918 </div> | |
919 </div> | |
920 <div class="row"> | |
921 <div class="col-12"> | |
922 <center> | |
923 <div class="how-to-subscribe"> | |
924 Enjoy this post? <span class="heart">β€&… | |
925 </div> | |
926 </center> | |
927 </div> | |
928 </div> | |
929 | |
930 <div class="row"> | |
931 <div class="col-2"></div> | |
932 <div class="col-8"><center><small&g… | |
933 <div class="col-2"></div> | |
934 </div> | |
935 </div> | |
936 | |
937 <!-- Google Analytics --> | |
938 <script async src="https://www.googletagmanager.com/gtag/js?id=G… | |
939 <script> | |
940 window.dataLayer = window.dataLayer || []; | |
941 function gtag(){dataLayer.push(arguments);} | |
942 gtag('js', new Date()); | |
943 gtag('config', 'G-C3VD7T243W'); | |
944 </script> | |
945 </body> | |
946 </html></content> | |
947 </entry> | |
948 <entry xml:base="http://sethmlarson.dev/feed"> | |
949 <title type="text">Experimental APIs in Python 3.10 and the future o… | |
950 <id>http://sethmlarson.dev/blog/experimental-python-3.10-apis-and-tr… | |
951 <updated>2021-11-27T00:00:00Z</updated> | |
952 <published>2021-11-27T00:00:00Z</published> | |
953 <link href="http://sethmlarson.dev/blog/experimental-python-3.10-api… | |
954 <author> | |
955 <name>Seth Michael Larson</name> | |
956 </author> | |
957 <content type="html"><!DOCTYPE html> | |
958 <html lang="en"> | |
959 <head> | |
960 <meta charset="utf-8"> | |
961 <title>Experimental APIs in Python 3.10 and the future of trus… | |
962 <meta name="description" content="Blogging about P… | |
963 <meta name="keywords" content="blog python open so… | |
964 <meta name="author" content="Seth Michael Larson&q… | |
965 <meta name="viewport" content="width=device-width,… | |
966 <meta name="format-detection" content="telephone=n… | |
967 <link rel="alternate" type="application/rss+xml&qu… | |
968 <link rel="icon" href="/static/favicon.ico"&g… | |
969 <link rel="stylesheet" href="/static/style.css&quo… | |
970 | |
971 <meta property="og:site_name" content="Seth Michae… | |
972 <meta property="og:author" content="Seth Michael L… | |
973 <meta property="og:type" content="article"/&g… | |
974 <meta property="og:title" content="Experimental AP… | |
975 <meta property="og:description" content="β οΈ Th… | |
976 | |
977 In Python 3.10.0 there were a few new APIs..."/> | |
978 <meta property="og:image" content="http://sethmlar… | |
979 <meta name="twitter:card" content="summary"/&… | |
980 <meta name="twitter:site" content="@sethmlarson&qu… | |
981 <meta name="twitter:creator" content="@sethmlarson… | |
982 <meta name="twitter:title" content="Experimental A… | |
983 <meta name="twitter:description" content="β οΈ T… | |
984 | |
985 In Python 3.10.0 there were a few new APIs..."/> | |
986 <meta property="og:image" content="http://sethmlar… | |
987 | |
988 </head> | |
989 <body> | |
990 <div class="container"> | |
991 <div class="row"> | |
992 <div class="col-6"> | |
993 <center> | |
994 <h1 style="margin-bottom: 0.1em; font-size: 1.8e… | |
995 <span style="font-style: italic;">Bloggi… | |
996 </center> | |
997 </div> | |
998 <div class="col-6"> | |
999 <div class="navbar-outer"> | |
1000 <div class="navbar-inner"> | |
1001 <a class="icon" href="/about"… | |
1002 <svg width="2em" height="2em&q… | |
1003 <title>About</title><path d=&… | |
1004 </svg> | |
1005 </a> | |
1006 <a class="icon" href="/blog"&… | |
1007 <svg width="2em" height="2em&q… | |
1008 <title>Blog</title><path d=&q… | |
1009 </svg> | |
1010 </a> | |
1011 <a class="icon" href="https://twit… | |
1012 <svg width="2em" height="2em&q… | |
1013 <title>Twitter</title><path d… | |
1014 </svg> | |
1015 </a> | |
1016 <a class="icon" href="https://gith… | |
1017 <svg width="2em" height="2em&q… | |
1018 <title>GitHub</title><path d=… | |
1019 </svg> | |
1020 </a> | |
1021 <a class="icon" href="https://link… | |
1022 <svg width="2em" height="2em&q… | |
1023 <title>LinkedIn</title><path … | |
1024 </svg> | |
1025 </a> | |
1026 </div> | |
1027 </div> | |
1028 </div> | |
1029 </div> | |
1030 | |
1031 <div class="row"> | |
1032 <div class="col-12"> | |
1033 <h2 class="blog-title" style="text-align: cent… | |
1034 <p><center>Published 2021-11-27 β <span class=&… | |
1035 </div> | |
1036 </div> | |
1037 <div class="row"> | |
1038 <div class="col-12"> | |
1039 <p><strong>β οΈ The APIs mentioned below aren't do… | |
1040 | |
1041 <p>In Python 3.10.0 there were a few new APIs added to the <cod… | |
1042 | |
1043 <p>Let's see the new APIs in action and how their addition could m… | |
1044 | |
1045 <h2>Using the new APIs</h2> | |
1046 | |
1047 <p>To see these APIs in action let's create a typical TLS connecti… | |
1048 | |
1049 <div class="codehilite"><pre><span></span… | |
1050 <span class="o">&gt;&gt;&gt;</span> &l… | |
1051 <span class="o">&gt;&gt;&gt;</span> | |
1052 <span class="o">&gt;&gt;&gt;</span> &l… | |
1053 <span class="o">&gt;&gt;&gt;</span> &l… | |
1054 <span class="o">&gt;&gt;&gt;</span> &l… | |
1055 <span class="o">&gt;&gt;&gt;</span> | |
1056 <span class="o">&gt;&gt;&gt;</span> &l… | |
1057 <span class="o">&lt;</span><span class=&quo… | |
1058 </code></pre></div> | |
1059 | |
1060 <p>Nothing out of the ordinary here yet. Now having looked at the … | |
1061 | |
1062 <p>But we can access the internal <code>SSLObject</code&g… | |
1063 | |
1064 <div class="codehilite"><pre><span></span… | |
1065 <span class="o">&gt;&gt;&gt;</span> &l… | |
1066 <span class="o">&lt;</span><span class=&quo… | |
1067 </code></pre></div> | |
1068 | |
1069 <p>From here we can start poking around with the new certificate A… | |
1070 | |
1071 <div class="codehilite"><pre><span></span… | |
1072 | |
1073 <span class="n">_ssl</span><span class="o&… | |
1074 <span class="n">_ssl</span><span class="o&… | |
1075 | |
1076 <span class="n">_ssl</span><span class="o&… | |
1077 | |
1078 <span class="c1"># see: SSLSocket.getpeercert(binary_for… | |
1079 <span class="n">_ssl</span><span class="o&… | |
1080 | |
1081 <span class="c1"># see: SSLSocket.getpeercert(binary_fo… | |
1082 <span class="n">_ssl</span><span class="o&… | |
1083 | |
1084 <span class="n">ssl</span><span class="o&q… | |
1085 <span class="n">ssl</span><span class="o&q… | |
1086 </code></pre></div> | |
1087 | |
1088 <p>If we try using these APIs we can get the following information… | |
1089 | |
1090 <div class="codehilite"><pre><span></span… | |
1091 <span class="o">&gt;&gt;&gt;</span> &l… | |
1092 | |
1093 <span class="c1"># In our case, the &#39;unverified_… | |
1094 <span class="c1"># are the same we&#39;ll discuss th… | |
1095 <span class="o">&gt;&gt;&gt;</span> &l… | |
1096 | |
1097 <span class="c1"># The chains go in order from leaf -&am… | |
1098 <span class="c1"># verified_chain[0] is the same as sock… | |
1099 <span class="o">&gt;&gt;&gt;</span> &l… | |
1100 <span class="n">verified_chain</span><s… | |
1101 | |
1102 <span class="c1"># The individual certificates in the ch… | |
1103 <span class="c1"># .get_info() and .public_bytes(encodin… | |
1104 <span class="o">&gt;&gt;&gt;</span> &l… | |
1105 <span class="s1">&#39;-----BEGIN CERTIFICATE-----<… | |
1106 | |
1107 <span class="c1"># Using _ssl.ENCODING_DER is the same a… | |
1108 <span class="o">&gt;&gt;&gt;</span> &l… | |
1109 <span class="sa">b</span><span class="s1&q… | |
1110 | |
1111 <span class="c1"># _ssl.Certificate.get_info() is the sa… | |
1112 <span class="o">&gt;&gt;&gt;</span> &l… | |
1113 <span class="p">{</span> | |
1114 <span class="s2">&quot;OCSP&quot;</span>… | |
1115 <span class="s2">&quot;caIssuers&quot;</spa… | |
1116 <span class="s2">&quot;crlDistributionPoints&q… | |
1117 <span class="s2">&quot;http://crl3.digicert.com/… | |
1118 <span class="s2">&quot;http://crl4.digicert.com/… | |
1119 <span class="p">],</span> | |
1120 <span class="s2">&quot;issuer&quot;</span&g… | |
1121 <span class="p">[[</span><span class="… | |
1122 <span class="p">[[</span><span class="… | |
1123 <span class="p">[[</span><span class="… | |
1124 <span class="p">],</span> | |
1125 <span class="s2">&quot;notAfter&quot;</span… | |
1126 <span class="s2">&quot;notBefore&quot;</spa… | |
1127 <span class="s2">&quot;serialNumber&quot;</… | |
1128 <span class="s2">&quot;subject&quot;</span&… | |
1129 <span class="p">[[</span><span class="… | |
1130 <span class="p">[[</span><span class="… | |
1131 <span class="p">[[</span><span class="… | |
1132 <span class="p">[[</span><span class="… | |
1133 <span class="p">[[</span><span class="… | |
1134 <span class="p">],</span> | |
1135 <span class="s2">&quot;subjectAltName&quot;<… | |
1136 <span class="p">[</span><span class="s… | |
1137 <span class="p">[</span><span class="s… | |
1138 <span class="p">[</span><span class="s… | |
1139 <span class="p">[</span><span class="s… | |
1140 <span class="p">[</span><span class="s… | |
1141 <span class="p">[</span><span class="s… | |
1142 <span class="p">[</span><span class="s… | |
1143 <span class="p">[</span><span class="s… | |
1144 <span class="p">],</span> | |
1145 <span class="s2">&quot;version&quot;</span&… | |
1146 <span class="p">}</span> | |
1147 </code></pre></div> | |
1148 | |
1149 <h3>What is new with these APIs?</h3> | |
1150 | |
1151 <p>Before Python 3.10 the only certificate information we could ga… | |
1152 | |
1153 <p>With these new APIs applications and libraries can make trust d… | |
1154 | |
1155 <p>To use a separate API for verifying cert chains we can configur… | |
1156 | |
1157 <div class="codehilite"><pre><span></span… | |
1158 | |
1159 <span class="c1"># Disable cert verification (enabled by… | |
1160 <span class="n">ctx</span> <span class="o&… | |
1161 <span class="n">ctx</span><span class="o&q… | |
1162 <span class="n">ctx</span><span class="o&q… | |
1163 | |
1164 <span class="c1"># Handshake as normal, still set `serve… | |
1165 <span class="n">sock</span> <span class="o… | |
1166 <span class="n">cert_chain</span> <span class=&… | |
1167 | |
1168 <span class="c1"># Use a different API to verify certifi… | |
1169 <span class="n">verify_cert_chain_api</span><sp… | |
1170 </code></pre></div> | |
1171 | |
1172 <h3>Difference between <code>verified_chain()</code> a… | |
1173 | |
1174 <p>Despite similar names and return types, the <code>verifie… | |
1175 | |
1176 <p>The difference between a verified and unverified chain is wheth… | |
1177 | |
1178 <p>For example if the server provides 4 certificates during the TL… | |
1179 | |
1180 <pre><code> βββββββββ ββοΏ½… | |
1181 β β β β | |
1182 β β β β | |
1183 β A βββββΊ L+ β | |
1184 βββββββββ β β β β | |
1185 β βββββΊ β β β | |
1186 β β βββββββββ βββββββββ | |
1187 β C* β | |
1188 β β βββββββββ | |
1189 β βββββΊ β Legend | |
1190 βββββββββ β β ββββββββοΏ½… | |
1191 β B β ββΊ Signs | |
1192 β β + Entity/leaf | |
1193 β β * Trusted | |
1194 βββββββββ | |
1195 </code></pre> | |
1196 | |
1197 <p>This means that B is not necessary to create a chain of trust f… | |
1198 | |
1199 <h3>Why are OS trust stores better?</h3> | |
1200 | |
1201 <p>Why are OS trust stores superior to OpenSSL on platforms where … | |
1202 | |
1203 <p>Windows automatically downloads missing intermediate certificat… | |
1204 | |
1205 <p>Windows and macOS both check certificate revocation lists (CRL)… | |
1206 | |
1207 <p>For full details on these APIs you can read the documentation o… | |
1208 | |
1209 <h2>Whatβs next for trust stores in Python?</h2> | |
1210 | |
1211 <p>Python's <code>ssl</code> module is married to the … | |
1212 | |
1213 <p>Non-Python native applications are unlikely to use this method,… | |
1214 | |
1215 <h3>Prior art in PEP 543</h3> | |
1216 | |
1217 <p><a href="https://www.python.org/dev/peps/pep-0543"… | |
1218 | |
1219 <p>The <a href="https://www.python.org/dev/peps/pep-0543/#… | |
1220 | |
1221 <h3>The end of certifi</h3> | |
1222 | |
1223 <p><a href="https://github.com/certifi/python-certifi"… | |
1224 | |
1225 <p>This seems like a fine solution at first, but from the perspect… | |
1226 | |
1227 <p>A small experimental package written by Python core developer &… | |
1228 | |
1229 <h3>The future is OS trust stores</h3> | |
1230 | |
1231 <p>The APIs mentioned above will likely stabilize and be available… | |
1232 | |
1233 </div> | |
1234 </div> | |
1235 <div class="row"> | |
1236 <div class="col-12"> | |
1237 <center> | |
1238 <div class="how-to-subscribe"> | |
1239 Enjoy this post? <span class="heart">β€&… | |
1240 </div> | |
1241 </center> | |
1242 </div> | |
1243 </div> | |
1244 | |
1245 <div class="row"> | |
1246 <div class="col-2"></div> | |
1247 <div class="col-8"><center><small&g… | |
1248 <div class="col-2"></div> | |
1249 </div> | |
1250 </div> | |
1251 | |
1252 <!-- Google Analytics --> | |
1253 <script async src="https://www.googletagmanager.com/gtag/js?id=G… | |
1254 <script> | |
1255 window.dataLayer = window.dataLayer || []; | |
1256 function gtag(){dataLayer.push(arguments);} | |
1257 gtag('js', new Date()); | |
1258 gtag('config', 'G-C3VD7T243W'); | |
1259 </script> | |
1260 </body> | |
1261 </html></content> | |
1262 </entry> | |
1263 </feed> |