<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Programming on ISciNumPy.dev</title>
    <link>https://iscinumpy.dev/tags/programming/</link>
    <description>Recent content in Programming on ISciNumPy.dev</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <managingEditor>henryfs@princeton.edu (Henry Schreiner)</managingEditor>
    <webMaster>henryfs@princeton.edu (Henry Schreiner)</webMaster>
    <lastBuildDate>Sun, 05 Apr 2026 20:00:00 -0500</lastBuildDate>
    <atom:link href="https://iscinumpy.dev/tags/programming/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Repo Review 1.0</title>
      <link>https://iscinumpy.dev/post/repo-review-1/</link>
      <pubDate>Sat, 04 Apr 2026 10:52:51 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/repo-review-1/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve just released &lt;a href=&#34;https://github.com/scientific-python/repo-review&#34;&gt;repo-review&lt;/a&gt; 1.0 with a huge update to the WebApp, along&#xA;with some other solid improvements in speed, simplicity, and stability.&#xA;Repo-review&amp;rsquo;s two most popular plugins, &lt;a href=&#34;https://github.com/scientific-python/cookie&#34;&gt;sp-repo-review&lt;/a&gt; and&#xA;&lt;a href=&#34;https://validate-pyproject.readthedocs.io&#34;&gt;validate-pyproject&lt;/a&gt;, can take full advantage of the new asynchronous fetching&#xA;mechanism. And if you use the upcoming Python 3.15, the CLI is more responsive&#xA;than ever thanks to lazy loading!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Working to make Python lazy</title>
      <link>https://iscinumpy.dev/post/flake8-lazy/</link>
      <pubDate>Tue, 24 Mar 2026 09:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/flake8-lazy/</guid>
      <description>&lt;p&gt;Python 3.15a7, which is now just a &lt;code&gt;uv python install 3.15&lt;/code&gt; away on all major&#xA;platforms, has lazy imports! This exciting feature, proposed in &lt;a href=&#34;https://peps.python.org/pep-0810&#34;&gt;PEP 810&lt;/a&gt;,&#xA;promises to make CLI applications faster (especially when using flags like&#xA;&lt;code&gt;--help&lt;/code&gt;), and could make a lot of large code with lots of imports that don&amp;rsquo;t&#xA;always get used faster too. Unlike the earlier, failed attempt, this requires&#xA;libraries to put in some work. I&amp;rsquo;ve developed a helper tool to make it easy; I&amp;rsquo;d&#xA;like to cover what lazy imports are and how to use my tool. Since this is the&#xA;first library that I used AI heavily in developing, the second half of the post&#xA;will cover how my experience with AI for a task like this went.&lt;/p&gt;&#xA;&lt;p&gt;TL;DR: run &lt;code&gt;uvx flake8-lazy --apply&lt;/code&gt; to make your code magically faster on&#xA;Python 3.15!&lt;/p&gt;</description>
    </item>
    <item>
      <title>New in boost-histogram 1.7 / Hist 2.10</title>
      <link>https://iscinumpy.dev/post/hist-2-10/</link>
      <pubDate>Fri, 06 Feb 2026 17:16:40 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/hist-2-10/</guid>
      <description>&lt;figure class=&#34;dark&#34;&gt;&lt;img src=&#34;https://iscinumpy.dev/post/boost-histogram-06/images/BoostHistogramPythonLogo.png&#34;&#xA;    alt=&#34;boost-histogram logo&#34; width=&#34;405&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;I&amp;rsquo;ve just released &lt;a href=&#34;https://github.com/scikit-hep/boost-histogram/releases/tag/v1.7.0&#34;&gt;boost-histogram 1.7&lt;/a&gt; and &lt;a href=&#34;https://github.com/scikit-hep/hist/releases/tag/v2.10.0&#34;&gt;hist 2.10&lt;/a&gt;, with a major new&#xA;feature and a big typing improvement! I&amp;rsquo;d like to quickly outline what&amp;rsquo;s new&#xA;here. Python 3.10+ is now required.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How we made Python&#39;s packaging library 3x faster</title>
      <link>https://iscinumpy.dev/post/packaging-faster/</link>
      <pubDate>Fri, 09 Jan 2026 13:30:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/packaging-faster/</guid>
      <description>&lt;p&gt;Along with a &lt;a href=&#34;https://github.com/pypa/pip&#34;&gt;pip&lt;/a&gt; (and now &lt;a href=&#34;https://github.com/pypa/packaging&#34;&gt;packaging&lt;/a&gt;) maintainer, Damian Shaw, I have&#xA;been working on making &lt;a href=&#34;https://github.com/pypa/packaging&#34;&gt;packaging&lt;/a&gt;, the library behind almost all packaging&#xA;related tools, faster at reading versions and specifiers, something tools like&#xA;pip have to do thousands of times during resolution. Using Python 3.15&amp;rsquo;s new&#xA;statistical profiler and metadata from every package ever uploaded to PyPI, I&#xA;measured and improved core Packaging constructs while keeping the code readable&#xA;and simple. Reading in &lt;code&gt;Version&lt;/code&gt;s can be up to 2x faster and &lt;code&gt;SpecifierSet&lt;/code&gt;s can&#xA;be up to 3x faster in &lt;a href=&#34;https://github.com/pypa/packaging/releases/tag/26.0&#34;&gt;packaging &lt;code&gt;26.0&lt;/code&gt;&lt;/a&gt;, now released! Other&#xA;operations have been optimized, as well, up to 5x in some cases. See the&#xA;&lt;a href=&#34;https://discuss.python.org/t/announcement-packaging-26-0rc1-released/105631&#34;&gt;announcement&lt;/a&gt; and &lt;a href=&#34;https://packaging.pypa.io/en/stable/changelog.html&#34;&gt;release notes&lt;/a&gt; too; this post will focus on the&#xA;performance work only.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Advent of Code 2025 in Typescript</title>
      <link>https://iscinumpy.dev/post/aoc-2025/</link>
      <pubDate>Wed, 24 Dec 2025 00:09:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/aoc-2025/</guid>
      <description>&lt;p&gt;After two years of &lt;a href=&#34;https://adventofcode.com&#34;&gt;Advent of Code&lt;/a&gt; in &lt;a href=&#34;https://rust-lang.org&#34;&gt;Rust&lt;/a&gt;, I thought I&amp;rsquo;d try&#xA;&lt;a href=&#34;https://www.typescriptlang.org&#34;&gt;TypeScript&lt;/a&gt;. I&amp;rsquo;ve always wanted to improve &lt;a href=&#34;https://repo-review.readthedocs.io/en/latest&#34;&gt;repo-review&lt;/a&gt;&amp;rsquo;s&#xA;&lt;a href=&#34;https://learn.scientific-python.org/development/guides/repo-review&#34;&gt;webapp&lt;/a&gt;, and that requires knowledge of the packaging&#xA;systems for JavaScript, so I thought I&amp;rsquo;d try TypeScript this year. I also used&#xA;this as an opportunity to learn more AI tooling too, mostly CoPilot in&#xA;&lt;a href=&#34;https://code.visualstudio.com&#34;&gt;VSCode&lt;/a&gt; &amp;amp; &lt;a href=&#34;https://chatgpt.com&#34;&gt;ChatGPT&lt;/a&gt;. I&amp;rsquo;d like to share my experience and thoughts! My code&#xA;is at &lt;a href=&#34;https://github.com/henryiii/aoc2025&#34;&gt;aoc2025&lt;/a&gt; (and &lt;a href=&#34;https://github.com/henryiii/aoc2024&#34;&gt;aoc2024&lt;/a&gt;, &lt;a href=&#34;https://github.com/henryiii/aoc2023&#34;&gt;aoc2023&lt;/a&gt;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>UHI 1.0: histogram serialization</title>
      <link>https://iscinumpy.dev/post/uhi-1-0/</link>
      <pubDate>Wed, 20 Aug 2025 16:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/uhi-1-0/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/scikit-hep/uhi/releases/tag/v1.0.0&#34;&gt;UHI 1.0&lt;/a&gt; is out, with a major new feature: a new histogram serialization&#xA;spec! This spec supports multiple formats (HDF5, zip, and JSON initially), and&#xA;can be supported by multiple libraries (Boost-histogram/hist initially). There&amp;rsquo;s&#xA;also a new test suite helper for libraries targeting the UHI indexing spec.&lt;/p&gt;</description>
    </item>
    <item>
      <title>pybind11 3.0.0</title>
      <link>https://iscinumpy.dev/post/pybind11-3-0-0/</link>
      <pubDate>Thu, 10 Jul 2025 00:13:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/pybind11-3-0-0/</guid>
      <description>&lt;figure class=&#34;dark&#34;&gt;&lt;img src=&#34;https://iscinumpy.dev/post/pybind11-2-6-0/images/pybind11-logo.png&#34;&#xA;    alt=&#34;pybind11 logo&#34; width=&#34;405&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Pybind11 3.0 has been released! I would like to highlight some of the key&#xA;changes below; be sure to check out the &lt;a href=&#34;https://pybind11.readthedocs.io/en/latest/changelog.html&#34;&gt;changelog&lt;/a&gt; and &lt;a href=&#34;https://pybind11.readthedocs.io/en/latest/upgrade.html&#34;&gt;upgrade guide&lt;/a&gt; for&#xA;more information! This release includes an ABI bump, the first required bump in&#xA;many years on Unix (Windows has had required bumps more often). This release&#xA;contains the multi-year smart-holder branch, multi-phase init and subinterpreter&#xA;support, &lt;code&gt;py::native_enum&lt;/code&gt;, an interface to warnings, typing improvements, and&#xA;more. CMake now defaults to &lt;a href=&#34;https://cmake.org/cmake/help/latest/module/FindPython.html&#34;&gt;FindPython&lt;/a&gt; mode.&lt;/p&gt;&#xA;&lt;p&gt;Support for Python 3.14, 3.14t, GraalPy, PyPy 3.11, and iOS have been added,&#xA;while legacy support for Python 3.7, PyPy 3.8/3.9, and CMake &amp;lt;3.15 has been&#xA;removed. Most deprecated features have been kept for this release, but anything&#xA;producing a warning in 3.0 may be removed in a future 3.x version.&lt;/p&gt;</description>
    </item>
    <item>
      <title>🎡 cibuildwheel 3.0</title>
      <link>https://iscinumpy.dev/post/cibuildwheel-3-0-0/</link>
      <pubDate>Thu, 05 Jun 2025 01:54:45 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cibuildwheel-3-0-0/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://cibuildwheel.pypa.io&#34;&gt;cibuildwheel&lt;/a&gt; 3.0.0 is out, with some very big additions. We&amp;rsquo;ve added&#xA;GraalPy, Python 3.14 (and 3.14t) betas, and iOS support! We&amp;rsquo;ve got several new&#xA;options: &lt;code&gt;test-sources&lt;/code&gt;, &lt;code&gt;test-environment&lt;/code&gt;, and (experimental)&#xA;&lt;code&gt;pyodide-version&lt;/code&gt;. We now fully use &lt;code&gt;enable&lt;/code&gt; (and PyPy requires using it), and&#xA;we no longer inject setuptools and wheel in build environments. Defaults have&#xA;changed, too: &lt;code&gt;build&lt;/code&gt; is now the default frontend, &lt;code&gt;manylinux_2_28&lt;/code&gt; is the&#xA;default manylinux image, with 32-bit linux now being opt-in. We&amp;rsquo;ve removed&#xA;support for Python 3.6 and 3.7, we now require 3.11+ to run cibuildwheel itself,&#xA;and EoL manylinux/musllinux images now need to be fully specified.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;ve had some fantastic releases of cibuildwheel since my last post over 2.19,&#xA;so I&amp;rsquo;ll include a few of the new features from those releases, too. I&amp;rsquo;ll also&#xA;note a few of the features being worked on for future releases.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python π</title>
      <link>https://iscinumpy.dev/post/python-314/</link>
      <pubDate>Thu, 08 May 2025 09:05:54 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/python-314/</guid>
      <description>&lt;p&gt;Python π (3.14) is out! The big feature this time around is template strings.&#xA;Free-threading is no longer experimental. There&amp;rsquo;s also lots more color&#xA;(including syntax highlighting in the REPL!), remote debugging, deferred&#xA;evaluation of annotations, and the usual error message and performance&#xA;improvements. Subintepreters are now accessible without the C-API (finally!),&#xA;and free-threaded Python is no longer experimental.&lt;/p&gt;</description>
    </item>
    <item>
      <title>scikit-build-core 0.10</title>
      <link>https://iscinumpy.dev/post/scikit-build-core-0-10/</link>
      <pubDate>Mon, 05 Aug 2024 23:09:13 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/scikit-build-core-0-10/</guid>
      <description>&lt;p&gt;Scikit-build-core 0.10 is out, and it is one of the largest releases we&amp;rsquo;ve&#xA;produced in terms of new configuration options. It automatically reads your&#xA;minimum CMake version, you can tell it to read your scikit-build-core&#xA;minimum-version, and there are settings for many of the advanced things users&#xA;used to do with scikit-build (classic), like rebuilds or pure Python fallbacks&#xA;on build failures.&lt;/p&gt;</description>
    </item>
    <item>
      <title>🎡 cibuildwheel 2.19</title>
      <link>https://iscinumpy.dev/post/cibuildwheel-2-19-0/</link>
      <pubDate>Mon, 10 Jun 2024 12:05:51 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cibuildwheel-2-19-0/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://cibuildwheel.pypa.io&#34;&gt;cibuildwheel&lt;/a&gt; 2.19 is out, with some very big additions. A new platform,&#xA;&lt;a href=&#34;https://pyodide.org&#34;&gt;Pyodide&lt;/a&gt;, has been added for building WebAssembly wheels. We&amp;rsquo;ve added CPython&#xA;3.13 free-threaded builds, now on all OS&amp;rsquo;s. And we have an opt-in speed&#xA;improvement with the &lt;code&gt;build[uv]&lt;/code&gt; build-frontend option.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;ve had some fantastic releases of cibuildwheel since my last post over 2.10,&#xA;so I&amp;rsquo;ll include a few of the new features from those releases, too, with a&#xA;highlight on a larger feature that can use more explaining: &lt;code&gt;inherit&lt;/code&gt; for&#xA;overrides.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python 3.13</title>
      <link>https://iscinumpy.dev/post/python-313/</link>
      <pubDate>Thu, 09 May 2024 15:33:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/python-313/</guid>
      <description>&lt;p&gt;Python 3.13 betas are out (Edit: 3.13.0 is out!), which means the features are&#xA;locked in. For the first time in thirty years, Python has a new, more colorful&#xA;REPL! There&amp;rsquo;s also a no-GIL compile-time option (free-threaded), an optional&#xA;JIT, some new typing features, and better error messages (again).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Inline run dependencies in pipx 1.4.2</title>
      <link>https://iscinumpy.dev/post/pep723/</link>
      <pubDate>Mon, 04 Dec 2023 15:00:06 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/pep723/</guid>
      <description>&lt;p&gt;While it can also do much more, Python is a fantastic language for writing small&#xA;scripts and utilities with it&amp;rsquo;s expressive syntax and batteries-included&#xA;standard library. But what if you need just a bit more? PyPI is one of the best&#xA;package repositories for any language, and being able to access it &lt;em&gt;without&lt;/em&gt;&#xA;having to write a multi-file library and setting up virtual environments would&#xA;be a dream - one that is becoming reality. Pipx 1.4.2 has an experimental&#xA;implementation of the &lt;del&gt;provisionally&lt;/del&gt; accepted &lt;a href=&#34;https://peps.python.org/pep-0723&#34;&gt;PEP 723&lt;/a&gt;, and I&amp;rsquo;d like to&#xA;show it off here, as it&amp;rsquo;s tremendously useful for simple scripts &amp;amp; utilities.&#xA;Support is also available in Nox 2024.04.15 and Hatch 1.10.&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43;23</title>
      <link>https://iscinumpy.dev/post/cpp-23/</link>
      <pubDate>Mon, 23 Oct 2023 11:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cpp-23/</guid>
      <description>&lt;p&gt;C++23 is complete and pretty much finalized, so let&amp;rsquo;s explore the new features&#xA;in C++, from a data science point of view. This is not as large of a release as&#xA;C++20 or C++11, but it&amp;rsquo;s still a hefty release with lots of nice new features -&#xA;larger than C++17.&lt;/p&gt;&#xA;&lt;p&gt;Some of the major new features are building on themes from C++20, such as vastly&#xA;expanded ranges and views, more &lt;code&gt;constexpr&lt;/code&gt;/&lt;code&gt;consteval&lt;/code&gt;, module support for the&#xA;standard library, &lt;code&gt;std::print&lt;/code&gt; to supplement &lt;code&gt;std::format&lt;/code&gt;, and a&#xA;&lt;code&gt;std::generator&lt;/code&gt; to support coroutines. There are also several general features,&#xA;lambdas and classes get along much better now, there are new preprocessor&#xA;additions (!), a stacktrace library, flat maps/sets, and new &lt;code&gt;std::optional&lt;/code&gt;&#xA;monadics, deducing &lt;code&gt;this&lt;/code&gt;, and many various additions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Scientific Python Development Guide</title>
      <link>https://iscinumpy.dev/post/cookie/</link>
      <pubDate>Fri, 14 Jul 2023 00:45:32 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cookie/</guid>
      <description>&lt;p&gt;One outcome of the&#xA;&lt;a href=&#34;https://scientific-python.org/summits/developer/2023/&#34;&gt;2023 Scientific Python Developer Summit&lt;/a&gt;&#xA;was the &lt;a href=&#34;https://learn.scientific-python.org/development&#34;&gt;Scientific Python Development Guide&lt;/a&gt;, a comprehensive guide to modern&#xA;Python package development, complete with a &lt;a href=&#34;https://github.com/scientific-python/cookie&#34;&gt;new project template&lt;/a&gt;&#xA;supporting 12 build backends and a &lt;a href=&#34;https://learn.scientific-python.org/development/guides/repo-review&#34;&gt;WebAssembly-powered checker&lt;/a&gt;&#xA;with checks linked to the guide. The guide covers topics like &lt;a href=&#34;https://learn.scientific-python.org/development/guides/packaging-simple/&#34;&gt;modern&lt;/a&gt;,&#xA;&lt;a href=&#34;https://learn.scientific-python.org/development/guides/packaging-compiled/&#34;&gt;compiled&lt;/a&gt;, and &lt;a href=&#34;https://learn.scientific-python.org/development/guides/packaging-classic/&#34;&gt;classic&lt;/a&gt; packaging, &lt;a href=&#34;https://learn.scientific-python.org/development/guides/style/&#34;&gt;style&lt;/a&gt; checks, &lt;a href=&#34;https://learn.scientific-python.org/development/guides/mypy/&#34;&gt;type&#xA;checking&lt;/a&gt;, &lt;a href=&#34;https://learn.scientific-python.org/development/guides/docs/&#34;&gt;docs&lt;/a&gt;, &lt;a href=&#34;https://learn.scientific-python.org/development/guides/tasks/&#34;&gt;task runners&lt;/a&gt;, &lt;a href=&#34;https://learn.scientific-python.org/development/guides/gha-basic/&#34;&gt;CI&lt;/a&gt;, &lt;a href=&#34;https://learn.scientific-python.org/development/guides/pytest/&#34;&gt;tests&lt;/a&gt;,&#xA;and much more! There also are sections of &lt;a href=&#34;https://learn.scientific-python.org/development/tutorials/&#34;&gt;tutorials&lt;/a&gt;, &lt;a href=&#34;https://learn.scientific-python.org/development/principles/&#34;&gt;principles&lt;/a&gt;, and&#xA;some common &lt;a href=&#34;https://learn.scientific-python.org/development/patterns/&#34;&gt;patterns&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This guide (along with cookie &amp;amp; repo-review) started in &lt;a href=&#34;https://scikit-hep.org&#34;&gt;Scikit-HEP&lt;/a&gt; in 2020.&#xA;During the summit, it was merged with the &lt;a href=&#34;https://nsls-ii.github.io/&#34;&gt;NSLS-II&lt;/a&gt; guidelines, which provided&#xA;the basis for the &lt;a href=&#34;https://learn.scientific-python.org/development/principles/&#34;&gt;principles&lt;/a&gt; section. I&amp;rsquo;d like to thank and acknowledge Dan&#xA;Allan and Gregory Lee for working tirelessly during the summit to rework,&#xA;rewrite, merge, and fix the guide, including writing most of the &lt;a href=&#34;https://learn.scientific-python.org/development/tutorials/&#34;&gt;tutorials&lt;/a&gt;&#xA;pages and first &lt;a href=&#34;https://learn.scientific-python.org/development/patterns/&#34;&gt;patterns&lt;/a&gt; page, and rewriting the &lt;a href=&#34;https://learn.scientific-python.org/development/tutorials/dev-environment/&#34;&gt;environment&lt;/a&gt; page as a&#xA;tutorial.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing repo-review</title>
      <link>https://iscinumpy.dev/post/repo-review/</link>
      <pubDate>Thu, 13 Jul 2023 22:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/repo-review/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve released a new&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; toolkit for running checks, similar to Ruff and Flake8&#xA;but designed to check configuration, called &lt;a href=&#34;https://repo-review.readthedocs.io&#34;&gt;repo-review&lt;/a&gt;. It requires Python&#xA;3.10+&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; to run and has no built-in checks, but is easy to write plugins for. A&#xA;set of checks based on the &lt;a href=&#34;https://learn.scientific-python.org/development&#34;&gt;Scientific Python Development Guide&lt;/a&gt; (which I also&#xA;&lt;a href=&#34;https://iscinumpy.dev/post/cookie&#34;&gt;have a post about&lt;/a&gt;!) are available as a plugin, &lt;code&gt;sp-repo-review&lt;/code&gt;.&#xA;You can run &lt;code&gt;repo-review&lt;/code&gt; in WebAssembly (via Pyodide), or in pre-commit, or as&#xA;a GitHub Action. It supports multiple output formats, including Rich, HTML, and&#xA;JSON. The system is based on fixtures (like pytest) and topologically sorts&#xA;requirements. You don&amp;rsquo;t need to depend on repo-review to add a repo-review&#xA;plugin. You can see a live version using sp-repo-review&#xA;&lt;a href=&#34;https://learn.scientific-python.org/development/guides/repo-review/&#34;&gt;in-place here&lt;/a&gt;&#xA;or &lt;a href=&#34;https://scientific-python.github.io/repo-review/&#34;&gt;standalone here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python 3.12</title>
      <link>https://iscinumpy.dev/post/python-312/</link>
      <pubDate>Mon, 19 Jun 2023 17:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/python-312/</guid>
      <description>&lt;p&gt;Python 3.12&amp;rsquo;s beta&amp;rsquo;s are out, which means the features are locked in. The theme&#xA;this year has been cleanup and typing. &lt;code&gt;distutils&lt;/code&gt; has been removed, and&#xA;setuptools is no longer present in default environments.&lt;/p&gt;</description>
    </item>
    <item>
      <title>🎡 cibuildwheel 2.10</title>
      <link>https://iscinumpy.dev/post/cibuildwheel-2-10-0/</link>
      <pubDate>Tue, 13 Sep 2022 08:42:26 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cibuildwheel-2-10-0/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/pypa/cibuildwheel&#34;&gt;cibuildwheel&lt;/a&gt; 2.10 is out, with some important additions. PEP 517 config&#xA;settings added, &lt;code&gt;--only&lt;/code&gt; (which has an interesting use in GHA), and Cirrus CI&#xA;support (including our first Apple Silicon native runner!) are highlights. We&#xA;also support Python 3.11 now (as of 2.11.2, RC&amp;rsquo;s in older releases).&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;ve had some fantastic releases of cibuildwheel this year, including some very&#xA;powerful features you might be interested in using, and I haven&amp;rsquo;t covered&#xA;releases since 2.2, so let&amp;rsquo;s take an in-depth look at what&amp;rsquo;s new for this and&#xA;the last few releases!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python 3.10</title>
      <link>https://iscinumpy.dev/post/python-310/</link>
      <pubDate>Sat, 23 Jul 2022 10:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/python-310/</guid>
      <description>&lt;p&gt;Python 3.10 is out (and has been for a while, I&amp;rsquo;m late posting this), with new&#xA;features and changes. The big new language feature this update is pattern&#xA;matching. We get much better errors, the always-present typing improvements, and&#xA;finally some real usage of the new PEG parser from 3.9.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python 3.11</title>
      <link>https://iscinumpy.dev/post/python-311/</link>
      <pubDate>Wed, 11 May 2022 16:11:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/python-311/</guid>
      <description>&lt;p&gt;Python 3.11 has hit the beta (now released!) stage, which means no more new&#xA;features. It&amp;rsquo;s a perfect time to play with it! The themes in this update are the&#xA;standard ones: The faster CPython project is now fully going (3.11 is 25% faster&#xA;on average), along with improved error messages, typing, and asyncio. Beyond&#xA;this, the only major new feature is a library for reading TOML files; this&#xA;probably only exciting if you are involved in Python packaging (but I am, so I&amp;rsquo;m&#xA;excited!).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python 3.7</title>
      <link>https://iscinumpy.dev/post/python-37/</link>
      <pubDate>Sat, 15 Jan 2022 22:41:05 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/python-37/</guid>
      <description>&lt;p&gt;Python 3.7 has been out for a while. In fact, it&amp;rsquo;s the oldest version of Python&#xA;still receiving support when this was written. I&amp;rsquo;d still like to write a &amp;ldquo;what&amp;rsquo;s&#xA;new&amp;rdquo;, targeting users who are upgrading to a Python 3.7+ only codebase, and want&#xA;to know what to take advantage of!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Poetry Versions</title>
      <link>https://iscinumpy.dev/post/poetry-versions/</link>
      <pubDate>Thu, 09 Dec 2021 11:00:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/poetry-versions/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://python-poetry.org&#34;&gt;Poetry&lt;/a&gt; provides a all in one solution to Python packaging. I want to focus&#xA;on why I was quite hard on Poetry in my last post, specifically on its default&#xA;version capping and solver quirks, and also a few other negative things. This is&#xA;a followup to&#xA;&lt;a href=&#34;https://iscinumpy.dev/post/bound-version-constraints&#34;&gt;Should you have upper version bounds&lt;/a&gt;, which&#xA;you should read before this post.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Should You Use Upper Bound Version Constraints?</title>
      <link>https://iscinumpy.dev/post/bound-version-constraints/</link>
      <pubDate>Thu, 09 Dec 2021 10:00:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/bound-version-constraints/</guid>
      <description>&lt;p&gt;Bound version constraints (upper caps) are starting to show up in the Python&#xA;ecosystem. This is causing &lt;a href=&#34;https://github.com/scikit-hep/pyhf/discussions/1595&#34;&gt;real world problems&lt;/a&gt; with&#xA;libraries following this recommendation, and is likely to &lt;a href=&#34;https://github.com/pypa/packaging/pull/482#issuecomment-963030131&#34;&gt;continue to get&#xA;worse&lt;/a&gt;; this practice does not scale to large numbers&#xA;of libraries or large numbers of users. In this discussion I would like to&#xA;explain why &lt;em&gt;always&lt;/em&gt; providing an upper limit causes far more harm than good&#xA;&lt;em&gt;even for true SemVer libraries&lt;/em&gt;, why libraries that pin upper limits require&#xA;&lt;em&gt;more frequent&lt;/em&gt; updates rather than less, and why it is not scalable. After&#xA;reading this, hopefully you will always consider every cap you add, you will&#xA;know the (few) places where pinning an upper limit is reasonable, and will&#xA;possibly even avoid using libraries that pin upper limits needlessly until the&#xA;author updates them to remove these pins.&lt;/p&gt;&#xA;&lt;p&gt;If this 10,000 word behemoth is a bit long for you, then skip around using the&#xA;table of contents, or see the &lt;a href=&#34;#tldr&#34;&gt;TL;DR&lt;/a&gt; section at the end, or read&#xA;&lt;a href=&#34;https://bernat.tech/posts/version-numbers&#34;&gt;version numbers by Bernát Gábor&lt;/a&gt;, which is shorter but is a&#xA;fantastic read with good examples and cute dog pictures. Or&#xA;&lt;a href=&#34;https://hynek.me/articles/semver-will-not-save-you/&#34;&gt;Hynek&amp;rsquo;s Semantic Versioning Will Not Save You&lt;/a&gt;&#xA;Be sure to check at least&#xA;&lt;a href=&#34;#analysis-of-a-javascript-project&#34;&gt;the JavaScript project analysis&lt;/a&gt; before you&#xA;leave!&lt;/p&gt;&#xA;&lt;p&gt;Also be warned, I pick on &lt;a href=&#34;https://python-poetry.org&#34;&gt;Poetry&lt;/a&gt; quite a bit. The rising popularity of&#xA;&lt;a href=&#34;https://python-poetry.org&#34;&gt;Poetry&lt;/a&gt; is likely due to the simplicity of having one tool vs. many for&#xA;packaging, but it happens to also have a special dependency solver, a new upper&#xA;bound syntax, and a &lt;a href=&#34;https://python-poetry.org/docs/faq/#why-are-unbound-version-constraints-a-bad-idea&#34;&gt;strong recommendation to always limit upper&#xA;versions&lt;/a&gt; - in direct opposition to &lt;a href=&#34;https://snarky.ca/why-i-dont-like-semver/&#34;&gt;members of the&#xA;Python core developer team&lt;/a&gt; and PyPA developers. Not&#xA;all libraries with excessive version capping are Poetry projects (like&#xA;TensorFlow), but many, many of them are. To be clear, Poetry doesn&amp;rsquo;t force&#xA;version pinning on you, but it does push you really, really hard to always&#xA;version cap, and it&amp;rsquo;s targeting new Python users that don&amp;rsquo;t know any better yet&#xA;than to accept bad recommendations. And these affect the whole ecosystem,&#xA;including users who do not use poetry, but want to depend on libraries that do!&#xA;I do really like other aspects of Poetry, and would like to&#xA;&lt;a href=&#34;https://iscinumpy.dev/post/scikit-build-proposal&#34;&gt;eventually&lt;/a&gt; help it build binary packages with Scikit-build&#xA;(CMake) via a plugin, and it has some great developers. If I don&amp;rsquo;t pick on&#xA;Poetry enough for you, don&amp;rsquo;t worry, I have a&#xA;&lt;a href=&#34;https://iscinumpy.dev/post/poetry-versions&#34;&gt;follow-up post&lt;/a&gt; that picks on it in much more detail.&#xA;Also, check out &lt;a href=&#34;https://pdm.fming.dev&#34;&gt;pdm&lt;/a&gt;, which gives many of the benefits of Poetry while&#xA;following PEP standards. Also &lt;a href=&#34;https://pixi.sh&#34;&gt;pixi&lt;/a&gt;, which works with the Conda ecosystem.&lt;/p&gt;&#xA;&lt;p&gt;If you come across something that can&amp;rsquo;t be solved, try using&#xA;&lt;code&gt;--exclude-newer &amp;lt;DATE&amp;gt;&lt;/code&gt; in &lt;a href=&#34;https://github.com/astral-sh/uv&#34;&gt;uv&lt;/a&gt; and &lt;a href=&#34;https://pdm.fming.dev&#34;&gt;pdm&lt;/a&gt;. This limits the solve by&#xA;ignoring packages newer than some date.&lt;/p&gt;</description>
    </item>
    <item>
      <title>App vs Library</title>
      <link>https://iscinumpy.dev/post/app-vs-library/</link>
      <pubDate>Thu, 09 Dec 2021 09:00:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/app-vs-library/</guid>
      <description>&lt;p&gt;What is the difference between an app and a library? This seemingly simple&#xA;question confuses some, and it turns out to be a harder question to answer than&#xA;you might expect. While the actual distinction between these common terms will&#xA;always be muddled in practice, I propose a specific definition to be used when&#xA;considering dependencies. This distinction is important when&#xA;&lt;a href=&#34;https://iscinumpy.dev/posts/bound-version-constraints&#34;&gt;discussing bound version constraints&lt;/a&gt; in the&#xA;next post.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scikit Build Proposal</title>
      <link>https://iscinumpy.dev/post/scikit-build-proposal/</link>
      <pubDate>Wed, 27 Oct 2021 08:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/scikit-build-proposal/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve spent the last few years trying to make it easy for anyone to extend Python&#xA;with compiled languages. I&amp;rsquo;ve worked on &lt;a href=&#34;https://github.com/pybind/pybind11&#34;&gt;pybind11&lt;/a&gt;, a powerful C++ library&#xA;that allows users to write advanced Python extensions using just C++11, used by&#xA;some of the largest projects, SciPy, PyTorch, Google, LLVM, and tens of&#xA;thousands of other libraries, down to very small extensions. I also work on&#xA;&lt;a href=&#34;https://github.com/pypa/cibuildwheel&#34;&gt;cibuildwheel&lt;/a&gt;, which makes building binaries (called wheels) on continuous&#xA;integration (CI) simple. It is again powerful enough to used by huge projects,&#xA;like Scikit-learn, matplotlib, mypy; and is simple enough to be used by hundreds&#xA;of other packages. Recently it was accepted into the Python Packaging Authority&#xA;(PyPA). There is one missing piece, though, to complete this picture of compiled&#xA;extensions that easy to use for small projects, and powerful enough for large&#xA;projects: the build system. I believe the solution to that is &lt;a href=&#34;https://github.com/scikit-build/scikit-build&#34;&gt;scikit-build&lt;/a&gt;,&#xA;and I&amp;rsquo;d like to work on it over the next three years.&lt;/p&gt;&#xA;&lt;p&gt;Scikit-build is a tool for integrating a package with a CMake build system into&#xA;Python. You can utilize the vast collection of packages and projects using CMake&#xA;already, and you have access to modern building features, like multithreaded&#xA;builds, library discovery, superb compiler and IDE support, and all sorts of&#xA;extended tooling. Modern CMake is quite pleasant to write compared to times&#xA;past; I have written &lt;a href=&#34;https://cliutils.gitlab.io/modern-cmake/&#34;&gt;a book&lt;/a&gt; and &lt;a href=&#34;https://hsf-training.github.io/hsf-training-cmake-webpage&#34;&gt;training course&lt;/a&gt; on it. We&#xA;ship up-to-date &lt;code&gt;cmake&lt;/code&gt; and &lt;code&gt;ninja&lt;/code&gt; wheels for all binary platforms.&lt;/p&gt;&#xA;&lt;p&gt;Update: Funded! I&amp;rsquo;ll be working on this starting August 1, 2022!&lt;/p&gt;&#xA;&lt;p&gt;I wrote a proposal for an NSF CSSI Elements project containing three parts. The&#xA;first part will cover core development on Scikit-build to address the current&#xA;shortcomings and to prepare it for a post-distutils (Python 3.12+) world. The&#xA;second part would cover assisting libraries with a science use case in either&#xA;transitioning to scikit-build (ideally from an existing CMake build system with&#xA;Python bindings, but I can help mentor developers in writing bindings (ideally&#xA;pybind11), setting up CI, and writing CMake code as well (see my book or&#xA;workshop on Modern CMake, and I&amp;rsquo;m happy to help old scikit-build projects&#xA;transition to better practices). As part of this, I would be building up the&#xA;examples and documentation, leading into the third part of the proposal: A&#xA;series of training events and training material, including plans for something&#xA;alongside SciPy.&lt;/p&gt;&#xA;&lt;p&gt;You can also see an outline at&#xA;&lt;a href=&#34;https://github.com/scikit-build/scikit-build/wiki&#34;&gt;scikit-build/scikit-build/wiki&lt;/a&gt;&#xA;or at the end of this post.&lt;/p&gt;&#xA;&lt;p&gt;Thank you for all the projects! The proposal was submitted Dec 8, 2021; mid year&#xA;we should find out if it was accepted!&lt;/p&gt;</description>
    </item>
    <item>
      <title>🎡 cibuildwheel 2.2</title>
      <link>https://iscinumpy.dev/post/cibuildwheel-2-2-0/</link>
      <pubDate>Wed, 20 Oct 2021 11:27:29 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cibuildwheel-2-2-0/</guid>
      <description>&lt;p&gt;Another great release from &lt;a href=&#34;https://cibuildwheel.readthedocs.io&#34;&gt;cibuildwheel&lt;/a&gt;, &lt;a href=&#34;https://github.com/pypa/cibuildwheel/releases/tag/v2.2.0&#34;&gt;2.2.0&lt;/a&gt;, is out! There are a few&#xA;important additions in this release that you should be aware of, so I will&#xA;outline the major changes here. We will cover the new musllinux wheels, overload&#xA;configuration, and incoming changes to pip and PyPy expected in the next&#xA;release. As always, it is recommended that you pin your cibuildwheel version and&#xA;then provide some automated way to keep the pin up-to-date, such as GitHub&amp;rsquo;s&#xA;dependabot. You should be updating just before you make a release, as well, but&#xA;you probably don&amp;rsquo;t want to be surprised by new wheels during your release&#xA;process!&lt;/p&gt;</description>
    </item>
    <item>
      <title>🎡 cibuildwheel 2.0</title>
      <link>https://iscinumpy.dev/post/cibuildwheel-2-0/</link>
      <pubDate>Fri, 16 Jul 2021 12:23:20 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cibuildwheel-2-0/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://cibuildwheel.readthedocs.io&#34;&gt;cibuildwheel&lt;/a&gt; package has just had a major release with some fantastic&#xA;features. Python 2.7 and 3.5 support has been removed (and PyPy3.6), allowing us&#xA;to update to the latest manylinux and auditwheel versions, and support the newly&#xA;unified manylinux PyPy3.7 images. We now allow users to select &lt;code&gt;pypa/build&lt;/code&gt; as a&#xA;build frontend. We now have a custom option to enable pre-release Pythons (3.10&#xA;currently) for testing before they are ABI stable (please don&amp;rsquo;t release wheels&#xA;until that happens). Maybe most exciting, cibuildwheel now supports&#xA;configuration in &lt;code&gt;pyproject.toml&lt;/code&gt;, allowing you to be even further isolated from&#xA;dependence on your CI system; you can easily produce Linux and Windows wheels&#xA;locally (macOS still installs to system locations). And, since my&#xA;&lt;a href=&#34;https://iscinumpy.dev/posts/cibuildwheel-1-9-0&#34;&gt;last post&lt;/a&gt; and&#xA;&lt;a href=&#34;https://iscinumpy.dev/posts/overview-of-cibuildwheel&#34;&gt;introduction post&lt;/a&gt;, cibuildwheel is now part&#xA;of the PyPA!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing CLI11 2.0</title>
      <link>https://iscinumpy.dev/post/announcing-cli11-20/</link>
      <pubDate>Wed, 14 Jul 2021 14:34:02 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/announcing-cli11-20/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/CLIUtils/CLI11&#34;&gt;CLI11&lt;/a&gt;, a powerful library for writing beautiful command line interfaces in&#xA;C++11, has &lt;a href=&#34;https://github.com/CLIUtils/CLI11/releases/tag/v2.0.0&#34;&gt;been updated to 2.0&lt;/a&gt;. A lot of deprecated things have been&#xA;removed, and there was a lot of cleanup under-the-hood; making CLI11 simpler. A&#xA;few defaults have changed slightly, like better TOML support by default.&lt;/p&gt;&#xA;&lt;p&gt;CLI11 does a better job than ever understanding any sort of container you&#xA;provide - complex numbers are natively supported, along with atomic types. A&#xA;long requested feature, simple version flags, has been added. Subcommands are&#xA;more customizable. And there have been quite a few bugfixes for rare issues.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python 3.9</title>
      <link>https://iscinumpy.dev/post/python-39/</link>
      <pubDate>Fri, 12 Feb 2021 12:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/python-39/</guid>
      <description>&lt;p&gt;Python 3.9 is out (and has been for a while, I&amp;rsquo;m late posting this), with new&#xA;features and changes. The themes for this release have been heavily internal&#xA;improvements, such as a new more powerful parser, and the usual static typing&#xA;improvements, along with a several bits new-user facing new syntax. This makes&#xA;3.9 a smaller release, but still it has some nice features of note.&lt;/p&gt;</description>
    </item>
    <item>
      <title>🎡 cibuildwheel 1.8.0 and 1.9.0</title>
      <link>https://iscinumpy.dev/post/cibuildwheel-1-9-0/</link>
      <pubDate>Sun, 07 Feb 2021 20:13:41 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cibuildwheel-1-9-0/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://cibuildwheel.readthedocs.io&#34;&gt;&lt;code&gt;cibuildwheel&lt;/code&gt;&lt;/a&gt; has just had two back-to-back releases, two weeks apart,&#xA;representing several months of hard work and some exciting few features! I will&#xA;be covering both releases at once, so we will discuss Apple Silicon support,&#xA;architecture emulation on Linux, integrated PEP 621 Requires-Python support, the&#xA;native GitHub Action, extended build and test controls, and more!&lt;/p&gt;&#xA;&lt;p&gt;If you are following the releases, 1.7.0 came out last November (2020), and&#xA;included the fantastic output folding feature, which makes logs much easier to&#xA;read on CI systems that support folding, and makes it much easier to see how&#xA;long each step takes. The 1.7.x series also included the addition of the&#xA;&lt;a href=&#34;https://cibuildwheel.readthedocs.io/en/stable/working-examples/&#34;&gt;working examples section&lt;/a&gt; of the documentation, which tracks&#xA;some known projects using &lt;code&gt;cibuildwheel&lt;/code&gt;, such as scikit-learn, Matlotlib, and&#xA;MyPy; it is a great place to go to look into how other projects have integrated&#xA;&lt;a href=&#34;https://cibuildwheel.readthedocs.io&#34;&gt;&lt;code&gt;cibuildwheel&lt;/code&gt;&lt;/a&gt; into their workflow.&lt;/p&gt;&#xA;&lt;p&gt;I have an &lt;a href=&#34;https://iscinumpy.dev/posts/overview-of-cibuildwheel&#34;&gt;general overview post&lt;/a&gt; as well. Now&#xA;let&amp;rsquo;s look at what&amp;rsquo;s new! Update: cibuildwheel is now an official package of the&#xA;PyPA!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Overview of cibuildwheel 🎡</title>
      <link>https://iscinumpy.dev/post/overview-of-cibuildwheel/</link>
      <pubDate>Sat, 06 Feb 2021 20:58:16 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/overview-of-cibuildwheel/</guid>
      <description>&lt;p&gt;This is the first of two posts on &lt;a href=&#34;https://cibuildwheel.readthedocs.io&#34;&gt;&lt;code&gt;cibuildwheel&lt;/code&gt;&lt;/a&gt;, a fantastic project I&#xA;joined after switching to it from my own &lt;a href=&#34;https://github.com/scikit-hep/azure-wheel-helpers&#34;&gt;azure-wheel-helpers&lt;/a&gt;, which I&amp;rsquo;ve&#xA;blogged about &lt;a href=&#34;https://iscinumpy.dev/post/azure-devops-python-wheels/&#34;&gt;here before&lt;/a&gt;. It is the best wheelbuilding&#xA;system available for Python today, and can make something that is normally a&#xA;pain to setup and a headache to maintain a breeze (by forcing all the headaches&#xA;on us, of course, as maintainers, but it&amp;rsquo;s better to solve issues centrally!&#xA;Obviously we rather like solving these problems. Or we are just crazy, which is&#xA;also possible ;) ).&lt;/p&gt;&#xA;&lt;p&gt;Be sure to checkout&#xA;&lt;a href=&#34;https://iscinumpy.dev/posts/cibuildwheel-1-9-0&#34;&gt;the followup post over new features in 1.8.0 and 1.9.0&lt;/a&gt;,&#xA;too! Also, &lt;code&gt;cibuildwheel&lt;/code&gt; was recently accepted into the PyPA!&lt;/p&gt;</description>
    </item>
    <item>
      <title>pybind11 2.6.0</title>
      <link>https://iscinumpy.dev/post/pybind11-2-6-0/</link>
      <pubDate>Wed, 21 Oct 2020 15:00:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/pybind11-2-6-0/</guid>
      <description>&lt;figure class=&#34;dark&#34;&gt;&lt;img src=&#34;https://iscinumpy.dev/post/pybind11-2-6-0/images/pybind11-logo.png&#34;&#xA;    alt=&#34;pybind11 logo&#34; width=&#34;405&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;I am pleased to announce the release of &lt;a href=&#34;https://github.com/pybind/pybind11/releases/tag/v2.6.0&#34;&gt;pybind11 2.6.0&lt;/a&gt;! This is the largest&#xA;release since 2.2 (released over three years ago). I would like to highlight&#xA;some of the key changes below; be sure to check out the &lt;a href=&#34;https://pybind11.readthedocs.io/en/latest/changelog.html&#34;&gt;changelog&lt;/a&gt; and&#xA;&lt;a href=&#34;https://pybind11.readthedocs.io/en/latest/upgrade.html&#34;&gt;upgrade guide&lt;/a&gt; for more information! The focus of this release was stability,&#xA;packaging, and supporting more platforms, though there are a lot of small&#xA;features and useful additions, covered by &lt;a href=&#34;https://pybind11.readthedocs.io&#34;&gt;newly expanded docs&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Johns Hopkins COVID-19 Dataset in Pandas</title>
      <link>https://iscinumpy.dev/post/johns-hopkins-covid/</link>
      <pubDate>Mon, 30 Mar 2020 15:30:00 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/johns-hopkins-covid/</guid>
      <description>&lt;p&gt;COVID-19 is ravaging the globe. Let&amp;rsquo;s look at the excellent Johns Hopkins&#xA;dataset using Pandas. This will serve both as a guideline for getting the data&#xA;and exploring on your own, as well as an example of Pandas multi-indexing in an easy&#xA;to understand situation. I am currently involved in &lt;a href=&#34;https://science-responds.org&#34;&gt;science-responds&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The boost-histogram beta release</title>
      <link>https://iscinumpy.dev/post/boost-histogram-06/</link>
      <pubDate>Fri, 13 Dec 2019 11:00:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/boost-histogram-06/</guid>
      <description>&lt;figure class=&#34;dark&#34;&gt;&lt;img src=&#34;https://iscinumpy.dev/post/boost-histogram-06/images/BoostHistogramPythonLogo.png&#34;&#xA;    alt=&#34;boost-histogram logo&#34; width=&#34;405&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;The foundational histogramming package for Python, &lt;a href=&#34;https://github.com/scikit-hep/boost-histogram&#34;&gt;boost-histogram&lt;/a&gt;, hit beta&#xA;status with version 0.6! This is a major update to the new &lt;a href=&#34;https://github.com/boostorg/histogram&#34;&gt;Boost.Histogram&lt;/a&gt;&#xA;bindings. Since I have not written about boost-histogram yet here, I will&#xA;introduce the library in its current state. Version 0.6.2 was based on the&#xA;recently released &lt;a href=&#34;https://www.boost.org&#34;&gt;Boost C++ Libraries&lt;/a&gt; &lt;a href=&#34;https://www.boost.org/users/history/version_1_72_0.html&#34;&gt;1.72&lt;/a&gt; Histogram&#xA;package. Feel free to &lt;a href=&#34;https://boost-histogram.readthedocs.io/en/latest/&#34;&gt;visit the docs&lt;/a&gt;, or keep reading&#xA;this post.&lt;/p&gt;&#xA;&lt;p&gt;This Python library is part of a larger picture in the &lt;a href=&#34;https://scikit-hep.org&#34;&gt;Scikit-HEP&lt;/a&gt; ecosystem&#xA;of tools for Particle Physics and is funded by &lt;a href=&#34;https://diana-hep.org&#34;&gt;DIANA/HEP&lt;/a&gt; and &lt;a href=&#34;https://iris-hep.org&#34;&gt;IRIS-HEP&lt;/a&gt;.&#xA;It is the core library for making and manipulating histograms. Other packages&#xA;are under development to provide a complete set of tools to work with and&#xA;visualize histograms. The &lt;a href=&#34;https://github.com/scikit-hep/aghast&#34;&gt;Aghast&lt;/a&gt; package is designed to convert between&#xA;popular histogram formats, and the Hist package will be designed to make common&#xA;analysis tasks simple, like plotting via tools such as the &lt;a href=&#34;https://github.com/scikit-hep/mplhep&#34;&gt;mplhep&lt;/a&gt; package.&#xA;Hist and Aghast will be initially driven by HEP (High Energy Physics and&#xA;Particle Physics) needs, but outside issues and contributions are welcome and&#xA;encouraged.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python 3.8</title>
      <link>https://iscinumpy.dev/post/python-38/</link>
      <pubDate>Fri, 25 Oct 2019 14:11:20 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/python-38/</guid>
      <description>&lt;p&gt;Python 3.8 is out, with new features and changes. The themes for this release&#xA;have been performance, ABI/internals, and static typing, along with a smattering&#xA;of new syntax. Given the recent&#xA;&lt;a href=&#34;https://numpy.org/neps/nep-0029-deprecation_policy.html&#34;&gt;community statement on Python support&lt;/a&gt;,&#xA;we should be staying up to date with the current changes in Python. As Python 2&#xA;sunsets, we are finally in an era where we can hope to someday use the features&#xA;we see coming out of Python release again!&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43;20</title>
      <link>https://iscinumpy.dev/post/cpp-20/</link>
      <pubDate>Sat, 20 Jul 2019 22:42:21 -0400</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cpp-20/</guid>
      <description>&lt;p&gt;The final meeting for new features in C++ is over, so let&amp;rsquo;s explore the new&#xA;features in C++, from a data science point of view. This is the largest release&#xA;of C++ since C++11, and when you consider C++14 and C++17 to be interim&#xA;releases, the entire 9 year cycle is possibly the largest yet! It may not feel&#xA;quite as massive as C++11, since we didn&amp;rsquo;t have interim releases for C++11 and&#xA;because C++11 is a much more complete, useful language than C++03, but this is&#xA;still a really impactful release! This is also the first version to include&#xA;every major feature from Bjarne Stroustrup&amp;rsquo;s &amp;ldquo;The design and Evolution of C++&amp;rdquo;,&#xA;also known as D&amp;amp;E, from 1994!&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s look at the major new features, as well as collections of smaller ones.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Azure DevOps: Python Wheels</title>
      <link>https://iscinumpy.dev/post/azure-devops-python-wheels/</link>
      <pubDate>Tue, 07 May 2019 22:00:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/azure-devops-python-wheels/</guid>
      <description>&lt;p&gt;Note: I now &lt;em&gt;highly&lt;/em&gt; recommend &lt;a href=&#34;https://cibuildwheel.readthedocs.io&#34;&gt;cibuildwheel&lt;/a&gt; instead of custom binary wheels.&#xA;See &lt;a href=&#34;https://scikit-hep.org/developer/gha_pure&#34;&gt;GHA Pure Python Wheels&lt;/a&gt; and &lt;a href=&#34;https://scikit-hep.org/developer/gha_wheels&#34;&gt;GHA Binary Wheels&lt;/a&gt; for modern methods to&#xA;produce wheels on GitHub Actions (directly applicable to Azure, as well, with&#xA;minor changes; cibuildwheel works on all most major CI providers).&#xA;&lt;a href=&#34;https://iscinumpy.dev/tags/cibuildwheel/&#34;&gt;See my new posts on cibuildwheel!&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the third post in &lt;a href=&#34;https://iscinumpy.dev/categories/azure-devops&#34;&gt;a series&lt;/a&gt; about Azure&#xA;DevOps. This one is about making Python wheels. If you &lt;a href=&#34;https://pythonwheels.com&#34;&gt;want to play&#xA;nice&lt;/a&gt; with Python users, or you have a complex build, this will&#xA;make your package far more accessible to users. They are faster to install and&#xA;to use and more secure. We will quickly cover making universal wheels, then we&#xA;will move on to fully compiled binaries, including C++14, manylinux2010, and&#xA;other hot topics. This series was developed to update the testing and releasing&#xA;of Python packages for &lt;a href=&#34;http://scikit-hep.org&#34;&gt;Scikit-HEP&lt;/a&gt;. The results of this tutorial can be seen&#xA;in the &lt;a href=&#34;https://github.com/scikit-hep/boost-histogram&#34;&gt;boost-histogram&lt;/a&gt; repository, under the &lt;code&gt;.ci&lt;/code&gt; folder.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Azure DevOps: Releases</title>
      <link>https://iscinumpy.dev/post/azure-devops-releases/</link>
      <pubDate>Tue, 07 May 2019 21:00:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/azure-devops-releases/</guid>
      <description>&lt;p&gt;This is the second post in &lt;a href=&#34;https://iscinumpy.dev/categories/azure-devops&#34;&gt;a series&lt;/a&gt; about Azure&#xA;DevOps. This one is about release pipelines; if you use Azure to build packages&#xA;(like binaries, etc.), how do you push them to a final endpoint? In this&#xA;example, we will be building a simple pure Python package, and pushing the&#xA;result to Test-PyPI. You can adapt it to your situation, however. The&#xA;&lt;a href=&#34;https://iscinumpy.dev/post/azure-devops-python-wheels&#34;&gt;third post&lt;/a&gt; will cover building Python&#xA;binaries. This series was developed to update the testing and releasing of&#xA;Python packages for &lt;a href=&#34;http://scikit-hep.org&#34;&gt;Scikit-HEP&lt;/a&gt;. Several of the projects in SciKit-HEP are&#xA;using release pipelines, include &lt;a href=&#34;https://github.com/scikit-hep/boost-histogram&#34;&gt;boost-histogram&lt;/a&gt; and &lt;a href=&#34;https://github.com/scikit-hep/particle&#34;&gt;Particle&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Note: I now highly recommend GitHub Actions, which is almost &amp;ldquo;Azure 2.0&amp;rdquo;. You&#xA;can read my tutorials on GitHub Actions on the &lt;a href=&#34;https://scikit-hep.org/developer/gha_basic&#34;&gt;Scikit-HEP developer pages&lt;/a&gt;.&#xA;The release process, in particular, is simpler, and you still get the benefit of&#xA;artifacts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Azure DevOps: Introduction</title>
      <link>https://iscinumpy.dev/post/azure-devops-intro/</link>
      <pubDate>Tue, 07 May 2019 20:00:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/azure-devops-intro/</guid>
      <description>&lt;p&gt;Continuous Integration (CI) is fantastic for software development and&#xA;deployment. One of the newest entries into the CI market&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; is Microsoft&amp;rsquo;s&#xA;&lt;a href=&#34;https://azure.microsoft.com/en-us/services/devops/&#34;&gt;Azure DevOps&lt;/a&gt;. Their Open Source support is impressive; it is likely part of&#xA;the recent push&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; by Microsoft to be more Open Source friendly. Open Source&#xA;projects get 10 parallel builds, unlimited build minutes, 6 hour job timeouts,&#xA;and incredibly fast jobs on macOS, Linux, and Windows, all via a single&#xA;platform. Quite a few major projects&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; have been moving to Azure since the&#xA;initial release in December 2018. The configuration of DevOps is second only to&#xA;GitLab CI in ease of use and possibly the most expressive system available. The&#xA;multiple pipeline support also scales well to complicated procedures.&lt;/p&gt;&#xA;&lt;p&gt;This is the first in &lt;a href=&#34;https://iscinumpy.dev/categories/azure-devops&#34;&gt;a series&lt;/a&gt; of posts covering an&#xA;introduction to setting up projects in Azure DevOps, developed to update the&#xA;testing and releasing of Python packages for &lt;a href=&#34;http://scikit-hep.org&#34;&gt;Scikit-HEP&lt;/a&gt;, a project for a&#xA;coherent High Energy Physics Python analysis toolset. The&#xA;&lt;a href=&#34;https://iscinumpy.dev/post/azure-devops-releases&#34;&gt;second post&lt;/a&gt; covers release pipelines, and the&#xA;&lt;a href=&#34;https://iscinumpy.dev/post/azure-devops-python-wheels&#34;&gt;third&lt;/a&gt; covers building binary Python packages&#xA;using DevOps.&lt;/p&gt;&#xA;&lt;p&gt;Note: I now highly recommend GitHub Actions, which is almost &amp;ldquo;Azure 2.0&amp;rdquo;, if you&#xA;are interested in setting up CI. The language is very similar, although&#xA;simplified, with some non-backward compatible bugfixes (such as multiline&#xA;expressions will error if any line files, instead of just on the last line in&#xA;Azure). You can read my tutorials on GitHub Actions on the &lt;a href=&#34;https://scikit-hep.org/developer/gha_basic&#34;&gt;Scikit-HEP developer&#xA;pages&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ROOT on Conda Forge</title>
      <link>https://iscinumpy.dev/post/root-conda/</link>
      <pubDate>Wed, 13 Feb 2019 10:18:37 +0100</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/root-conda/</guid>
      <description>&lt;p&gt;For High Energy Physics, the go-to framework for big data analysis has been&#xA;CERN&amp;rsquo;s &lt;a href=&#34;https://root.cern&#34;&gt;ROOT&lt;/a&gt; framework. ROOT is a massive C++ library that even predates the&#xA;STL in some areas. It is&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;em&gt;also&lt;/em&gt; a JIT C++ interpreter called Cling, probably&#xA;the best in the business. If you have&#xA;&lt;a href=&#34;https://andersy005.github.io/blog/2018/01/20/play-interactively-with-cpp-getting-started-with-xeus-cling/&#34;&gt;heard of&lt;/a&gt;&#xA;the &lt;a href=&#34;https://github.com/QuantStack/xeus-cling&#34;&gt;Xeus&lt;/a&gt; C++ Kernel for Jupyter, that is built on top of Cling. ROOT has&#xA;everything a HEP physicist could want: math, plotting, histograms, tuple and&#xA;tree structures, a very powerful file format for IO, machine learning, Python&#xA;bindings, and more. It also does things like dictionary generation and arbitrary&#xA;class serialization (other large frameworks like &lt;a href=&#34;https://qt.io&#34;&gt;Qt&lt;/a&gt; have similar generation&#xA;tools).&lt;/p&gt;&#xA;&lt;p&gt;You may already be guessing one of the most common problems for ROOT. It is huge&#xA;and difficult to install &amp;ndash; if you build from source, that&amp;rsquo;s a several hour task&#xA;on a single core. It has gotten &lt;a href=&#34;https://root.cern/install/&#34;&gt;much better&lt;/a&gt; in the&#xA;last 6 years, and there are several places you can find ROOT, but there are&#xA;still areas where it is challenging. This is especially true for Python; ROOT is&#xA;linked to your distro&amp;rsquo;s Python (both python2 and python3 if your distro supports&#xA;it, as of ROOT 6.22); but the common rule for using Python is &amp;ldquo;don&amp;rsquo;t touch your&#xA;system Python&amp;rdquo; - so modern Python users should be in a virtual environment, and&#xA;for that ROOT requires the system site-packages option be enabled, which is not&#xA;always ideal. And, if you use the &lt;a href=&#34;https://www.anaconda.com/distribution/&#34;&gt;Anaconda Python distribution&lt;/a&gt;,&#xA;which is the most popular scientific distribution of Python and massively&#xA;successful for ML frameworks, the general rule even for people who build ROOT&#xA;themselves has been: don&amp;rsquo;t. But now, you can get a fully featured ROOT binary&#xA;package for macOS or Linux, Python 2.7, 3.6, 3.7, or 3.8 from &lt;a href=&#34;https://conda-forge.org&#34;&gt;Conda-Forge&lt;/a&gt;,&#xA;the most popular Anaconda community channel! Many more HEP recipes have now been&#xA;added to Conda-Forge, as well! ROOT now also provides a &lt;a href=&#34;https://root.cern/new-docker-images/&#34;&gt;conda docker image&lt;/a&gt;,&#xA;too!&lt;/p&gt;</description>
    </item>
    <item>
      <title>ROOT Install Options</title>
      <link>https://iscinumpy.dev/post/root-install/</link>
      <pubDate>Mon, 04 Feb 2019 10:44:37 +0100</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/root-install/</guid>
      <description>&lt;p&gt;For particle physicists, ROOT is one of the most important toolkits around. It&#xA;is a huge suite of tools that predates the C++ standard library, and has almost&#xA;anything a particle physicist could want. It has driven developments in other&#xA;areas too. ROOT&amp;rsquo;s current C++ interpreter, CLING, is the most powerful C++&#xA;interpreter available and is used by the Xeus project for Jupyter. The Python&#xA;work has helped PyPy, with CPPYY also coming from ROOT. However, due to the&#xA;size, complexity, and age of some parts of ROOT, it can be a bit challenging to&#xA;install; and it is even more challenging when you want it to talk to Python. I&#xA;would like to point to the brand-new Conda-Forge ROOT package for Linux and&#xA;macOS, and point out a few other options for macOS installs. Note for Windows&#xA;users: Due to the fact that ROOT expects the type &lt;code&gt;long&lt;/code&gt; to match the system&#xA;pointer size, 64-bit Windows cannot be supported for quite some time. While you&#xA;can use it in 32 bit form, this is generally impossible to connect to Python,&#xA;which usually will be a 64-bit build.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Illustrations and videos</title>
      <link>https://iscinumpy.dev/page/illustrations/</link>
      <pubDate>Mon, 10 Dec 2018 11:32:00 +0100</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/page/illustrations/</guid>
      <description>&lt;p&gt;These are some illustrations and videos that I have made over the years.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Histogram Speeds in Python</title>
      <link>https://iscinumpy.dev/post/histogram-speeds-in-python/</link>
      <pubDate>Thu, 01 Nov 2018 14:58:09 +0100</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/histogram-speeds-in-python/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s compare several ways of making Histograms. I&amp;rsquo;m going to assume you would&#xA;like to end up with a nice OO histogram interface, so all the 2D methods will&#xA;fill a Physt histogram. We will be using a 2 x 1,000,000 element array and&#xA;filling a 2D histogram, or 10,000,000 elemends in a 1D histogram. Binnings are&#xA;regular.&lt;/p&gt;&#xA;&lt;h4 id=&#34;1d-10000000-item-histogram&#34;&gt;1D 10,000,000 item histogram&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Example&lt;/th&gt;&#xA;          &lt;th&gt;KNL&lt;/th&gt;&#xA;          &lt;th&gt;MBP&lt;/th&gt;&#xA;          &lt;th&gt;X24&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;NumPy: histogram&lt;/td&gt;&#xA;          &lt;td&gt;704 ms&lt;/td&gt;&#xA;          &lt;td&gt;147 ms&lt;/td&gt;&#xA;          &lt;td&gt;114 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;NumPy: bincount&lt;/td&gt;&#xA;          &lt;td&gt;432 ms&lt;/td&gt;&#xA;          &lt;td&gt;110 ms&lt;/td&gt;&#xA;          &lt;td&gt;117 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;fast-histogram&lt;/td&gt;&#xA;          &lt;td&gt;337 ms&lt;/td&gt;&#xA;          &lt;td&gt;45.9 ms&lt;/td&gt;&#xA;          &lt;td&gt;45.7 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Numba&lt;/td&gt;&#xA;          &lt;td&gt;312 ms&lt;/td&gt;&#xA;          &lt;td&gt;58.8 ms&lt;/td&gt;&#xA;          &lt;td&gt;60.7 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;2d-1000000-item-histogram&#34;&gt;2D 1,000,000 item histogram&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Example&lt;/th&gt;&#xA;          &lt;th&gt;KNL&lt;/th&gt;&#xA;          &lt;th&gt;MBP&lt;/th&gt;&#xA;          &lt;th&gt;X24&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Physt&lt;/td&gt;&#xA;          &lt;td&gt;1.21 s&lt;/td&gt;&#xA;          &lt;td&gt;293 ms&lt;/td&gt;&#xA;          &lt;td&gt;246 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;NumPy: histogram2d&lt;/td&gt;&#xA;          &lt;td&gt;456 ms&lt;/td&gt;&#xA;          &lt;td&gt;114 ms&lt;/td&gt;&#xA;          &lt;td&gt;88.3 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;NumPy: add.at&lt;/td&gt;&#xA;          &lt;td&gt;247 ms&lt;/td&gt;&#xA;          &lt;td&gt;62.7 ms&lt;/td&gt;&#xA;          &lt;td&gt;49.7 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;NumPy: bincount&lt;/td&gt;&#xA;          &lt;td&gt;81.7 ms&lt;/td&gt;&#xA;          &lt;td&gt;23.3 ms&lt;/td&gt;&#xA;          &lt;td&gt;20.3 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;fast-histogram&lt;/td&gt;&#xA;          &lt;td&gt;53.7 ms&lt;/td&gt;&#xA;          &lt;td&gt;10.4 ms&lt;/td&gt;&#xA;          &lt;td&gt;7.31 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;fast-hist threaded 0.5&lt;/td&gt;&#xA;          &lt;td&gt;(6) 62.5 ms&lt;/td&gt;&#xA;          &lt;td&gt;9.78 ms&lt;/td&gt;&#xA;          &lt;td&gt;(6) 15.4 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;fast-hist threaded (m)&lt;/td&gt;&#xA;          &lt;td&gt;62.3 ms&lt;/td&gt;&#xA;          &lt;td&gt;4.89 ms&lt;/td&gt;&#xA;          &lt;td&gt;3.71 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Numba&lt;/td&gt;&#xA;          &lt;td&gt;41.8 ms&lt;/td&gt;&#xA;          &lt;td&gt;10.2 ms&lt;/td&gt;&#xA;          &lt;td&gt;9.73 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Numba threaded&lt;/td&gt;&#xA;          &lt;td&gt;(6) 49.2 ms&lt;/td&gt;&#xA;          &lt;td&gt;4.23 ms&lt;/td&gt;&#xA;          &lt;td&gt;(6) 4.12 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Cython&lt;/td&gt;&#xA;          &lt;td&gt;112 ms&lt;/td&gt;&#xA;          &lt;td&gt;12.2 ms&lt;/td&gt;&#xA;          &lt;td&gt;11.2 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Cython threaded&lt;/td&gt;&#xA;          &lt;td&gt;(6) 128 ms&lt;/td&gt;&#xA;          &lt;td&gt;5.68 ms&lt;/td&gt;&#xA;          &lt;td&gt;(8) 4.89 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;pybind11 sequential&lt;/td&gt;&#xA;          &lt;td&gt;93.9 ms&lt;/td&gt;&#xA;          &lt;td&gt;9.20 ms&lt;/td&gt;&#xA;          &lt;td&gt;17.8 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;pybind11 OpenMP atomic&lt;/td&gt;&#xA;          &lt;td&gt;4.06 ms&lt;/td&gt;&#xA;          &lt;td&gt;6.87 ms&lt;/td&gt;&#xA;          &lt;td&gt;1.91 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;pybind11 C++11 atomic&lt;/td&gt;&#xA;          &lt;td&gt;(32) 10.7 ms&lt;/td&gt;&#xA;          &lt;td&gt;7.08 ms&lt;/td&gt;&#xA;          &lt;td&gt;(48) 2.65 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;pybind11 C++11 merge&lt;/td&gt;&#xA;          &lt;td&gt;(32) 23.0 ms&lt;/td&gt;&#xA;          &lt;td&gt;6.03 ms&lt;/td&gt;&#xA;          &lt;td&gt;(48) 4.79 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;pybind11 OpenMP merge&lt;/td&gt;&#xA;          &lt;td&gt;8.74 ms&lt;/td&gt;&#xA;          &lt;td&gt;5.04 ms&lt;/td&gt;&#xA;          &lt;td&gt;1.79 ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;</description>
    </item>
    <item>
      <title>Binding Minuit2</title>
      <link>https://iscinumpy.dev/post/binding-minuit2/</link>
      <pubDate>Sat, 07 Jul 2018 21:00:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/binding-minuit2/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s try a non-trivial example of a binding: Minuit2 (6.14.0 standalone&#xA;edition).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tools to Bind to Python</title>
      <link>https://iscinumpy.dev/post/tools-to-bind-to-python/</link>
      <pubDate>Sat, 07 Jul 2018 21:00:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/tools-to-bind-to-python/</guid>
      <description>&lt;p&gt;This was originally given as a PyHEP 2018 talk, It is designed to be&#xA;interactive, and can be run in SWAN if you have a CERN account. If you want to&#xA;run it manually, just download the repository:&#xA;&lt;a href=&#34;https://github.com/henryiii/pybindings_cc&#34;&gt;github.com/henryiii/pybindings_cc&lt;/a&gt;.&#xA;It is easy to run in Anaconda.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing CLI11 1.6</title>
      <link>https://iscinumpy.dev/post/announcing-cli11-16/</link>
      <pubDate>Wed, 27 Jun 2018 14:44:40 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/announcing-cli11-16/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/CLIUtils/CLI11&#34;&gt;CLI11&lt;/a&gt;, a powerful library for writing beautiful command line interfaces in&#xA;C++11, has &lt;a href=&#34;https://github.com/CLIUtils/CLI11/releases&#34;&gt;been updated to 1.6&lt;/a&gt;, the largest update ever. CLI11&#xA;output is more customizable than ever, and has a better functionality separation&#xA;under the hood.&lt;/p&gt;&#xA;&lt;p&gt;CLI11 has had the formatting system completely redesigned, with minor or&#xA;complete customization of the output possible. Configuration files reading and&#xA;writing also can be configured; a new example with json instead of ini&#xA;formatting is included. Validators (finally) have custom help output, as well.&#xA;Many odd corner cases have been made possible, such as interleaving options.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CMake 3.11</title>
      <link>https://iscinumpy.dev/post/cmake-311/</link>
      <pubDate>Mon, 02 Apr 2018 11:16:57 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cmake-311/</guid>
      <description>&lt;p&gt;CMake 3.11 was just released; this is particularly exciting release for CMake.&#xA;I&amp;rsquo;d like to give a quick and friendly introduction to the new features that&#xA;might make the largest difference for CMake users.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing GooFit 2.1</title>
      <link>https://iscinumpy.dev/post/announcing-goofit-21/</link>
      <pubDate>Thu, 07 Dec 2017 03:20:00 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/announcing-goofit-21/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://iscinumpy.dev/images/post/2017/GooFitLogo21small.png&#34; alt=&#34;GooFit logo&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;GooFit 2.1 introduces the full-featured Python bindings to GooFit. These&#xA;bindings mimic the C++ usage of GooFit, including bindings for all PDFs, and&#xA;also provide NumPy-centric conversions, live Jupyter notebook printing, pip&#xA;install, and more. Most of the examples in C++ are provided in Python form, as&#xA;well.&lt;/p&gt;&#xA;&lt;p&gt;Several other API changes were made. Observables are now distinguished from&#xA;Variables and provided as a separate class. Both these classes are now passed&#xA;around by copy everywhere.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; The three and four body amplitude classes have&#xA;been refactored and simplified. OpenMP is now supported via homebrew on macOS;&#xA;GooFit is one of the only packages that currently can build with OpenMP on the&#xA;default macOS compiler. Eigen is now available, and &lt;a href=&#34;https://github.com/CLIUtils/CLI11&#34;&gt;CLI11&lt;/a&gt; has been updated to&#xA;version 1.3.&lt;/p&gt;&#xA;&lt;p&gt;GooFit 2.1 will receive continuing support while development on GooFit 2.2&#xA;presses on with a new indexing scheme for PDFs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Include What You Use</title>
      <link>https://iscinumpy.dev/post/include-what-you-use/</link>
      <pubDate>Tue, 05 Dec 2017 14:06:35 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/include-what-you-use/</guid>
      <description>&lt;p&gt;Include-what-you-use is a promising little tool for cleaning up a codebase. It&#xA;didn&amp;rsquo;t end up working for the use I had for it, but it still could be useful.&#xA;Here is a quick guideline on installing it on macOS.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comparing CLI11 and Boost PO</title>
      <link>https://iscinumpy.dev/post/comparing-cli11-and-boostpo/</link>
      <pubDate>Sun, 03 Dec 2017 16:31:50 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/comparing-cli11-and-boostpo/</guid>
      <description>&lt;p&gt;CLI11 started years ago as a set of tools built on Boost Program Options (PO),&#xA;and has since matured into the powerful, easy-to-use stand-alone library it is&#xA;available today. If you would like to see the original inspiration for CLI11,&#xA;look at&#xA;&lt;a href=&#34;https://github.com/CLIUtils/CLI11/blob/v0.1/include/Program.hpp&#34;&gt;Program.hpp in CLI11 0.1&lt;/a&gt;.&#xA;The rest of the post will focus on a comparison between making a CLI app in the&#xA;two libraries. I am going to assume that you are preparing fairly basic but&#xA;non-trivial programs in the following comparison.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; CLI11 is more concise, and provides more control with better defaults&#xA;in many cases, but was inspired by Boost PO.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing CLI11 1.3</title>
      <link>https://iscinumpy.dev/post/announcing-cli11-13/</link>
      <pubDate>Fri, 01 Dec 2017 09:03:50 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/announcing-cli11-13/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/CLIUtils/CLI11&#34;&gt;CLI11&lt;/a&gt;, a powerful library for writing beautiful command line interfaces in&#xA;C++11, has &lt;a href=&#34;https://github.com/CLIUtils/CLI11/releases&#34;&gt;been updated to 1.3&lt;/a&gt;, the largest update ever. CLI11 is&#xA;more powerful than ever, and has simpler and more consistent parsing under the&#xA;hood.&lt;/p&gt;&#xA;&lt;p&gt;This version focused on refactoring several key systems to ensure correct&#xA;behavior in the interaction of different settings. Most caveats about features&#xA;only working on the main App have been addressed, and extra arguments have been&#xA;reworked. Inheritance of defaults makes configuring CLI11 much easier without&#xA;having to subclass. Policies add new ways to handle multiple arguments to match&#xA;your favorite CLI programs. Error messages and help messages are better and more&#xA;flexible. Several bugs and odd behaviors in the parser have been fixed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Watching GitHub Releases</title>
      <link>https://iscinumpy.dev/post/watching-github-releases/</link>
      <pubDate>Tue, 28 Nov 2017 16:54:14 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/watching-github-releases/</guid>
      <description>&lt;p&gt;If you use an RSS feed reader, you can watch all your favorite GitHub&#xA;repositories for new releases! Just follow:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://github.com/USER/REPO/releases.atom&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can see a long discussion with other options&#xA;&lt;a href=&#34;https://github.com/isaacs/github/issues/410#issuecomment-163761492&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenMP on High Sierra</title>
      <link>https://iscinumpy.dev/post/omp-on-high-sierra/</link>
      <pubDate>Mon, 13 Nov 2017 15:41:35 -0500</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/omp-on-high-sierra/</guid>
      <description>&lt;p&gt;Building OpenMP code is actually possible using Apple Clang that comes default&#xA;with macOS&amp;rsquo;s Xcode! Although Apple does not build the OpenMP library, the&#xA;compiler still supports it. In this post, I demonstrate the procedure necessary&#xA;to include OpenMP in your build, both with the new support in CMake 3.12, as&#xA;well as how it would be done without it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing GooFit 2.0</title>
      <link>https://iscinumpy.dev/post/announcing-goofit-20/</link>
      <pubDate>Thu, 08 Jun 2017 17:54:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/announcing-goofit-20/</guid>
      <description>&lt;p&gt;The next version of the premier CUDA/OpenMP fitting program for HEP analysis,&#xA;GooFit 2.0, &lt;a href=&#34;GooFit&#34;&gt;has been released&lt;/a&gt;. GooFit is now easy to build on a wide&#xA;variety of Unix systems, and supports debuggers and IDEs. GooFit is faster, has&#xA;unit tests, and working examples. More PDFs and examples have been added, as&#xA;well as newly released example datasets that are downloaded automatically.&#xA;GooFit now has built in support for MPI, and can use that to deploy to multiple&#xA;graphics cards on the same machine. A new command line parser (&lt;a href=&#34;https://github.com/CLIUtils/CLI11&#34;&gt;CLI11&lt;/a&gt;) and&#xA;drastically improved logging and errors have made code easier to write and&#xA;debug. Usage of GooFit specific terminology is now reduced, using standard&#xA;Thrust or CUDA terms when possible, lowering the barrier for new developers. A&#xA;new Python script has been added to assist users converting from pre 2.0 code.&lt;/p&gt;&#xA;&lt;p&gt;The file structure of GooFit and the build system have been completely revamped.&#xA;The fake &lt;code&gt;nvcc&lt;/code&gt; features have been removed, as have the &lt;code&gt;rootstuff&lt;/code&gt; copies of&#xA;ROOT classes. PDFs are now organized by type and compile and link separately.&#xA;Multiple PDF caching support has improved. The build system now uses CMake and&#xA;manages external libraries.&lt;/p&gt;&#xA;&lt;p&gt;A new feature of the CMake build system is GooFit Packages, which are complete&#xA;packages that can be added to GooFit and built, allowing analysis code to live&#xA;in a separate location from GooFit, rather than the old method of simply forking&#xA;GooFit and adding your analysis manually. A GooFit Package can be made into an&#xA;example trivially. See &lt;a href=&#34;https://github.com/maddocbf/goofit_KKPiPi&#34;&gt;this package&lt;/a&gt;&#xA;for an example.&lt;/p&gt;&#xA;&lt;p&gt;GooFit 2.0 will receive continuing support while development on GooFit 2.1&#xA;presses on.&lt;/p&gt;&#xA;&lt;h4 id=&#34;links&#34;&gt;Links:&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/GooFit/GooFit&#34;&gt;GooFit on GitHub&lt;/a&gt; • &lt;a href=&#34;https://GooFit.github.io&#34;&gt;GooFit webpage&lt;/a&gt; • &lt;a href=&#34;https://GooFit.github.io/GooFit&#34;&gt;API documentation&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing CLI11 Version 1.0</title>
      <link>https://iscinumpy.dev/post/announcing-cli11-10/</link>
      <pubDate>Thu, 01 Jun 2017 14:05:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/announcing-cli11-10/</guid>
      <description>&lt;p&gt;CLI11, a powerful library for writing command line interfaces in C++11, has just&#xA;been released. There are no requirements beyond C++11 support (and even&#xA;&lt;code&gt;&amp;lt;regex&amp;gt;&lt;/code&gt; support not required). It works on Mac, Linux, and Windows, and has&#xA;100% test coverage on all three systems. You can simply drop in a single header&#xA;file (&lt;code&gt;CLI11.hpp&lt;/code&gt; available in &lt;a href=&#34;https://github.com/CLIUtils/CLI11/releases&#34;&gt;releases&lt;/a&gt;) to use CLI11 in your own application.&#xA;Other ways to integrate it into a build system are listed in the &lt;a href=&#34;https://github.com/CLIUtils/CLI11/blob/master/README.md&#34;&gt;README&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The library was inspired the Python libraries &lt;a href=&#34;http://plumbum.readthedocs.io/en/latest/&#34;&gt;Plumbum&lt;/a&gt; and &lt;a href=&#34;http://click.pocoo.org/5/&#34;&gt;Click&lt;/a&gt;, and&#xA;incorporates many of their user friendly features. The library is extensively&#xA;documented, with a &lt;a href=&#34;https://github.com/CLIUtils/CLI11/blob/master/README.md&#34;&gt;friendly introduction&lt;/a&gt;, a tutorial filled (in&#xA;progress) &lt;a href=&#34;https://cliutils.gitlab.io/CLI11&#34;&gt;GitBook&lt;/a&gt;, and more technical &lt;a href=&#34;https://cliutils.github.io/CLI11&#34;&gt;API docs&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Perfect forwarding for methods</title>
      <link>https://iscinumpy.dev/post/perfect-forwarding-for-methods/</link>
      <pubDate>Fri, 17 Mar 2017 10:43:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/perfect-forwarding-for-methods/</guid>
      <description>&lt;p&gt;I often see perfect forwarding listed for constructor arguments, but not usually&#xA;for functions with a return or methods. Here is my solution for an method method&#xA;of class &lt;code&gt;Cls&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;typename&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;auto&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cls&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;typename&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result_of&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;decltype&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cls&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;...)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cls&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;forward&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)...);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is useful if you want to call protected classes from a “helper” friend&#xA;class, for example, to expose them to tests without having to require&#xA;GoogleTest/GoogleMock to be available for regular users.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lua Environment Modules</title>
      <link>https://iscinumpy.dev/post/lua-environment-modules/</link>
      <pubDate>Wed, 11 Jan 2017 06:08:00 -0800</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/lua-environment-modules/</guid>
      <description>&lt;p&gt;This is a guide to setting up Lmod (lua environment modules) on a CentOS system.&#xA;I&amp;rsquo;ve used a similar procedure to set them up on a Mac, as well, so this is still&#xA;a useful guide to the workings of Lmod if you use a different system; mostly&#xA;paths will change. On a Mac, you&amp;rsquo;ll want to install &lt;code&gt;Lmod&lt;/code&gt; from the &lt;code&gt;science&lt;/code&gt;&#xA;tap in &lt;code&gt;brew&lt;/code&gt;. There are several good pages covering environment modules (TCL&#xA;version), but not many that use the newer Lua syntax. This document aims to fill&#xA;that roll.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python 3 upgrade</title>
      <link>https://iscinumpy.dev/post/python-3-upgrade/</link>
      <pubDate>Wed, 12 Oct 2016 08:30:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/python-3-upgrade/</guid>
      <description>&lt;p&gt;About ten years ago, Guido Van Rossum, the Python author and Benevolent Dictator&#xA;for Life (BDFL), along with the Python community, decided to make several&#xA;concurrent backward incompatible changes to Python 2.5 and release a new&#xA;version, Python 3.0.&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43;17</title>
      <link>https://iscinumpy.dev/post/cpp-17/</link>
      <pubDate>Sat, 10 Sep 2016 08:30:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cpp-17/</guid>
      <description>&lt;p&gt;The every-three-year cycle has changed the development of C++; we are now&#xA;getting consistent releases somewhere in-between the major and minor releases of&#xA;old. The 2017 release may be called minor by some, with a huge portion of the&#xA;planned improvements being pushed back another 3-6 years, but there were several&#xA;substantial changes in useful areas; it is much more impactful than C++14, for&#xA;example. This almost feels like a lead-in release to C++20.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;std::variant&lt;/code&gt;, &lt;code&gt;std::optional&lt;/code&gt;, and &lt;code&gt;std::any&lt;/code&gt; additions to the standard&#xA;library are huge, and can restructure the way you program (and are available for&#xA;older C++ releases through Boost and other libraries).&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43;14</title>
      <link>https://iscinumpy.dev/post/cpp-14/</link>
      <pubDate>Fri, 09 Sep 2016 08:30:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cpp-14/</guid>
      <description>&lt;p&gt;Unlike C++11, this is a minor release, focused mostly on improvements on top of&#xA;C++11 changes, with very little that one could call &amp;ldquo;new&amp;rdquo;. C++14 feels a little&#xA;more natural than C++11 by expanding the usage of features and implementing&#xA;common sense additions that were missed in the original C++11 release. There&#xA;were also quite a few bug fixes; several of these were backported into C++11&#xA;mode in compilers.&lt;/p&gt;&#xA;&lt;p&gt;Also, while C++11 is always available in ROOT 6, C++14 requires a flag and&#xA;compatible compiler, so C++14 features are often unavailable. The Conda-Forge&#xA;ROOT package has C++17 enabled.&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43;11</title>
      <link>https://iscinumpy.dev/post/cpp-11/</link>
      <pubDate>Thu, 08 Sep 2016 08:30:00 +0200</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cpp-11/</guid>
      <description>&lt;p&gt;C++11 was the largest change ever made to C++; and due to the changed release&#xA;schedule, probably will remain the largest single change. It is a well thought&#xA;out, mostly backward-compatible change that can cause you to completely rethink&#xA;the way you write code in C++. It is best thought of as almost a new language, a&#xA;sort of (C++)++ language. There are too many changes to list here, and there are&#xA;excellent resources available, so this is meant to just give you a taste of some&#xA;of the most useful changes.&lt;/p&gt;&#xA;&lt;p&gt;Many of the features work best together, or are related. There already are great&#xA;resources for learning about C++11 (listed at the bottom of this lesson), and&#xA;C++11 is already in use in most software. Therefore, the remainder of this&#xA;lesson will cover a few of the common idioms in C++11 that a programmer&#xA;experienced with the older C++ might not immediately think of.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GoogleTest and CMake</title>
      <link>https://iscinumpy.dev/post/googletest-and-cmake/</link>
      <pubDate>Fri, 25 Mar 2016 16:12:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/googletest-and-cmake/</guid>
      <description>&lt;p&gt;This is a quick recipe for setting up CMake to use googletest in your projects.&#xA;First, make a &lt;code&gt;tests&lt;/code&gt; folder in the root of your project. Then, add&#xA;&lt;code&gt;add_subdirectory(tests)&lt;/code&gt; to your &lt;code&gt;CMakeLists.txt&lt;/code&gt;, after you&amp;rsquo;ve finished adding&#xA;the libraries in your project. Note that the way I&amp;rsquo;ve written this probably&#xA;requires CMake 3.4+.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A simple introduction to asyncio</title>
      <link>https://iscinumpy.dev/post/a-simple-introduction-to-asyncio/</link>
      <pubDate>Thu, 19 Nov 2015 09:46:00 -0800</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/a-simple-introduction-to-asyncio/</guid>
      <description>&lt;p&gt;This is a simple explanation of the &lt;code&gt;asyncio&lt;/code&gt; module and new supporting language&#xA;features in Python 3.5. Even though the new keywords &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt; are new&#xA;language constructs, they are mostly&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; useless without an event loop, and that&#xA;is supplied in the standard library as &lt;code&gt;asyncio&lt;/code&gt;. Also, you need awaitable&#xA;functions, which are only supplied by &lt;code&gt;asyncio&lt;/code&gt; (or in the growing set of async&#xA;libraries, like &lt;code&gt;asyncssh&lt;/code&gt;, &lt;code&gt;quamash&lt;/code&gt; etc.).&lt;/p&gt;</description>
    </item>
    <item>
      <title>A little example of how asyncio works</title>
      <link>https://iscinumpy.dev/post/a-little-example-of-how-asyncio-works/</link>
      <pubDate>Thu, 19 Nov 2015 09:43:00 -0800</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/a-little-example-of-how-asyncio-works/</guid>
      <description>&lt;p&gt;This is a simple example to show how Asyncio works without using Asyncio itself,&#xA;instead using a basic and poorly written event loop. This is only meant to give&#xA;a flavor of what Asyncio does behind the curtains. I&amp;rsquo;m avoiding most details of&#xA;the library design, like callbacks, just to keep this simple. Since this is&#xA;written as an illustration, rather than real code, I&amp;rsquo;m going to dispense with&#xA;trying to keep it 2.7 compatible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Including CRY cosmic ray generator in CMake</title>
      <link>https://iscinumpy.dev/post/cry-cosmic-ray-generator-in-cmake/</link>
      <pubDate>Mon, 19 Oct 2015 09:07:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/cry-cosmic-ray-generator-in-cmake/</guid>
      <description>&lt;p&gt;I realized that CRY did not have a CMake based install option, so including it&#xA;in a GEANT4 cmake project might not be obvious. This is how you would do it in&#xA;your CMakeLists.txt:&lt;/p&gt;</description>
    </item>
    <item>
      <title>GTest Submodule</title>
      <link>https://iscinumpy.dev/post/gtest-submodule/</link>
      <pubDate>Wed, 07 Oct 2015 06:43:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/gtest-submodule/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Note: There is a better way to do this described&#xA;&lt;a href=&#34;https://iscinumpy.dev/post/googletest-and-cmake&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;If you&amp;rsquo;ve ever tried &lt;code&gt;apt-get&lt;/code&gt; or &lt;code&gt;brew&lt;/code&gt; to try to install gtest, you are&#xA;probably familiar with the fact that gtest is not &amp;ldquo;recommend&amp;rdquo; for global install&#xA;on your system. As an alternative, the recommendation is that you make it part&#xA;of your project. The process for making gtest part of your project, however, is&#xA;not well documented, at least for modern git projects. What follows is the&#xA;procedure I used to do so.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slots in Python</title>
      <link>https://iscinumpy.dev/post/slots-in-python/</link>
      <pubDate>Thu, 06 Aug 2015 16:01:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/slots-in-python/</guid>
      <description>&lt;p&gt;Slots seem to be poorly documented. What they do is simple, but whether they are&#xA;used is tricky. This is a little mini-post on slots.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Basics of metaclasses</title>
      <link>https://iscinumpy.dev/post/basics-of-metaclasses/</link>
      <pubDate>Thu, 06 Aug 2015 15:59:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/basics-of-metaclasses/</guid>
      <description>&lt;p&gt;This is a quick tutorial over the basics of what metaclasses do.&lt;/p&gt;&#xA;&lt;h1 id=&#34;the-metaclass&#34;&gt;The Metaclass&lt;/h1&gt;&#xA;&lt;p&gt;Metaclasses, while seemingly a complex topic, really just do something very&#xA;simple. They control what happens when you have code that turns into a class&#xA;object. The normal place they are executed is right after the class statement.&#xA;Let&amp;rsquo;s see that in action by using print as our metaclass.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Factory classmethods in Python</title>
      <link>https://iscinumpy.dev/post/factory-classmethods-in-python/</link>
      <pubDate>Wed, 29 Jul 2015 09:13:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/factory-classmethods-in-python/</guid>
      <description>&lt;p&gt;I haven&amp;rsquo;t seen a great deal of practical documentation about using classmethods&#xA;as factories in Python (which is arguably the most important use of a&#xA;classmethod, IMO). This post hopes to fill in that gap.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making an autoload extension for IPython</title>
      <link>https://iscinumpy.dev/post/making-an-autoload-extension-for-ipython/</link>
      <pubDate>Fri, 24 Jul 2015 07:06:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/making-an-autoload-extension-for-ipython/</guid>
      <description>&lt;p&gt;I recently decided to try my hand at making an auto-load extension for Python&#xA;and Plumbum. I was planning to suggest it as a new feature, then I thought it&#xA;might be an experimental feature, and now it&amp;rsquo;s just a blog post. But it was an&#xA;interesting idea and didn&amp;rsquo;t seem to be well documented process on the web. So,&#xA;here it is.&lt;/p&gt;&#xA;&lt;p&gt;The plan was to make commands like this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Uncertainty extension for IPython</title>
      <link>https://iscinumpy.dev/post/uncertainty-extension-for-ipython/</link>
      <pubDate>Fri, 24 Jul 2015 06:45:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/uncertainty-extension-for-ipython/</guid>
      <description>&lt;p&gt;Wouldn&amp;rsquo;t it be nice if we had uncertainty with a nice notation in IPython? The&#xA;current method would be to use raw Python,&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;uncertainties&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ufloat&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ufloat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;12.34&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.01&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre style=&#34;output&#34;&gt;&#xA;12.340+/-0.010&#xA;&lt;/pre&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s use the infix library to make the notation easier. We&amp;rsquo;ll define &lt;code&gt;|pm|&lt;/code&gt; to&#xA;mean &lt;code&gt;+/-&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Plumbum color</title>
      <link>https://iscinumpy.dev/post/plumbum-color-post/</link>
      <pubDate>Wed, 22 Jul 2015 12:25:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/plumbum-color-post/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working on a color addition to Plumbum for a little while, and I&amp;rsquo;d&#xA;like to share the basics of using it with you now. This library was originally&#xA;built around a special &lt;code&gt;str&lt;/code&gt; subclass, but now is built on the new &lt;code&gt;Styles&lt;/code&gt;&#xA;representation and is far more powerful than the first implementation. It safely&#xA;does nothing if you do not have a color-compatible systems (posix + tty&#xA;currently), but can be forced if need be. It is included with Plumbum, so you&#xA;don&amp;rsquo;t have to add a requirement for your scripts that is non-essential (as color&#xA;often is). It is integrated with &lt;code&gt;plumbum.cli&lt;/code&gt;, too. Also, I&amp;rsquo;ve managed to&#xA;accelerate the color selection algorithms about 8x, allowing near game-like&#xA;speeds. (see the &lt;code&gt;fullcolor.py&lt;/code&gt; example).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Plumbum scripting</title>
      <link>https://iscinumpy.dev/post/plumbum-scripting/</link>
      <pubDate>Sun, 12 Jul 2015 14:07:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/plumbum-scripting/</guid>
      <description>&lt;p&gt;Scripting in Bash is a pain. Bash can do almost anything, and is unbeatable for&#xA;small scripts, but it struggles when scaling up to doing anything close to a&#xA;real world scripting problem. Python is a natural choice, especially for the&#xA;scientist who already is using it for analysis. But, it&amp;rsquo;s much harder to do&#xA;basic tasks in Python. So you are left with scripts starting out as Bash&#xA;scripts, and then becoming a mess, then being (usually poorly) ported to Python,&#xA;or even worse, being run by a Python script. I&amp;rsquo;ve seen countless Python scripts&#xA;that run Bash scripts that run real programs. I&amp;rsquo;ve even written one or two. It&amp;rsquo;s&#xA;not pretty.&lt;/p&gt;&#xA;&lt;p&gt;I recently came (back) across a really powerful library for doing efficient&#xA;command line scripts in Python. It contains a set of tools that makes the four&#xA;(five with color) main tasks of command line scripts simple and powerful. I will&#xA;also go over the one main drawback of the library (and the possible&#xA;enhancement!).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simple Overloading in Python</title>
      <link>https://iscinumpy.dev/post/simple-operator-overloading-in-python/</link>
      <pubDate>Tue, 07 Jul 2015 09:45:00 -0700</pubDate><author>henryfs@princeton.edu (Henry Schreiner)</author>
      <guid>https://iscinumpy.dev/post/simple-operator-overloading-in-python/</guid>
      <description>&lt;p&gt;This is intended as an example to demonstrate the use of overloading in object&#xA;oriented programming. This was written as a Jupyter notebook (aka IPython) in&#xA;Python 3. To run in Python 2, simply rename the variables that have unicode&#xA;names, and replace &lt;code&gt;truediv&lt;/code&gt; with &lt;code&gt;div&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;While there are several nice Python libraries that support uncertainty (for&#xA;example, the powerful&#xA;&lt;a href=&#34;https://pypi.python.org/pypi/uncertainties/&#34;&gt;uncertainties&lt;/a&gt; package and the&#xA;related units and uncertainties package&#xA;&lt;a href=&#34;http://pint.readthedocs.org/en/0.6/&#34;&gt;pint&lt;/a&gt;), they usually use standard error&#xA;combination rules. For a beginning physics class, often &amp;lsquo;maximum error&amp;rsquo;&#xA;combination is used. Here, instead of using a standard deviation based error and&#xA;using combination rules based on uncorrelated statistical distributions, we&#xA;assume a simple maximum error and simply add errors.&lt;/p&gt;&#xA;&lt;p&gt;To implement this, let&amp;rsquo;s build a Python class and use overloading to implement&#xA;algebraic operations.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
