From 2561ef970c4cfb399e38ab6807a203ea311a480c Mon Sep 17 00:00:00 2001 From: MarsBarLee <46167686+MarsBarLee@users.noreply.github.com> Date: Wed, 1 Feb 2023 14:57:53 -0500 Subject: [PATCH 1/5] Add file and images --- apps/labs/posts/uarray-intro.md | 331 ++++++++++++++++++ .../posts/uarray-intro/blog_hero_var1.svg | 1 + .../posts/uarray-intro/blog_hero_var2.svg | 1 + 3 files changed, 333 insertions(+) create mode 100644 apps/labs/posts/uarray-intro.md create mode 100644 apps/labs/public/posts/uarray-intro/blog_hero_var1.svg create mode 100644 apps/labs/public/posts/uarray-intro/blog_hero_var2.svg diff --git a/apps/labs/posts/uarray-intro.md b/apps/labs/posts/uarray-intro.md new file mode 100644 index 000000000..b26c3bfeb --- /dev/null +++ b/apps/labs/posts/uarray-intro.md @@ -0,0 +1,331 @@ +--- +title: "`uarray`: A Generic Override Framework for Methods" +author: hameer-abbasi +published: April 30, 2019 +description: 'The problem is, stated simply: How do we use all of the PyData libraries in tandem, moving seamlessly from one to the other, without actually changing the API, or even the imports?' +category: [PyData ecosystem] +featuredImage: + src: /posts/hello-world-post/blog_hero_var2.svg + alt: 'An illustration of a brown and a white hand coming towards each other to pass a business card with the logo of Quansight Labs.' +hero: + imageSrc: /posts/hello-world-post/blog_feature_org/svg + imageAlt: 'An illustration of a brown hand holding up a microphone, with some graphical elements highlighting the top of the microphone.' +--- + +`uarray` is an override framework for methods in Python. In the +scientific Python ecosystem, and in other similar places, there has been +one recurring problem: That similar tools to do a job have existed, but +don't conform to a single, well-defined API. `uarray` tries to solve +this problem in general, but also for the scientific Python ecosystem in +particular, by defining APIs independent of their implementations. + +## Array Libraries in the Scientific Python Ecosystem + +When SciPy was created, and Numeric and Numarray unified into NumPy, it +jump-started Python's data science community. The ecosystem grew +quickly: Academics started moving to SciPy, and the Scikits that popped +up made the transition all the more smooth. + +However, the scientific Python community also shifted during that time: +GPUs and distributed computing emerged. Also, there were old ideas that +couldn't really be used with NumPy's API, such as sparse arrays. To +solve these problems, various libraries emerged: + +- Dask, for distributed NumPy +- CuPy, for NumPy on Nvidia-branded GPUs. +- PyData/Sparse, a project started to make sparse arrays conform to + the NumPy API +- Xnd, which extends the type system and the universal function + concept found in NumPy + +There were yet other libraries that emerged: PyTorch, which mimics NumPy +to a certain degree; TensorFlow, which defines its own API; and MXNet, +which is another deep learning framework that mimics NumPy. + +## The Problem + +The problem is, stated simply: How do we use all of these libraries in +tandem, moving seamlessly from one to the other, without actually +changing the API, or even the imports? How do we take functions written +for one library and allow it to be used by another, without, as Travis +Oliphant so eloquently puts it, \"re-writing the world\"? + +In my mind, the goals are (stated abstractly): + +1. Methods that are not tied to a specific implementation. + +- For example `np.arange` + +1. Backends that implement these methods. + +- NumPy, Dask, PyTorch are all examples of this. + +1. Coercion of objects to other forms to move between backends. + +- This means converting a NumPy array to a Dask array, and vice versa. + +In addition, we wanted to be able to do this for arbitrary objects. So +`dtype`s, `ufunc`s etc. should also be dispatchable and coercible. + +## The Solution? + +With that said, let's dive into `uarray`. If you're not interested in +the gory details, you can jump down to +``{=html}this section``{=html}. + +``` python +import uarray as ua + +# Let's ignore this for now +def myfunc_rd(a, kw, d): + return a, kw + +# We define a multimethod +@ua.create_multimethod(myfunc_rd) +def myfunc(): + return () # Let's also ignore this for now + +# Now let's define two backends! +be1 = ua.Backend() +be2 = ua.Backend() + +# And register their implementations for the method! +@ua.register_implementation(myfunc, backend=be1) +def myfunc_be1(): # Note that it has exactly the same signature + return "Potato" + +@ua.register_implementation(myfunc, backend=be2) +def myfunc_be2(): # Note that it has exactly the same signature + return "Strawberry" +``` + +``` python +with ua.set_backend(be1): + print(myfunc()) +``` + + Potato + +``` python +with ua.set_backend(be2): + print(myfunc()) +``` + + Strawberry + +As we can clearly see: We have already provided a way to do (1) and (2) +above. But then we run across the problem: How do we decide between +these backends? How do we move between them? Let's go ahead and +register both of these backends for permanent use. And see what happens +when we want to implement both of their methods! + +``` python +ua.register_backend(be1) +ua.register_backend(be2) +``` + +``` python +print(myfunc()) +``` + + Potato + +As we see, we get only the first backend's answer. In general, it's +indeterminate what backend will be selected. But, this is a special +case: We're not passing arguments in! What if we change one of these to +return `NotImplemented`? + +``` python +# We redefine the multimethod so it's new again +@ua.create_multimethod(myfunc_rd) +def myfunc(): + return () + +# Now let's redefine the two backends! +be1 = ua.Backend() +be2 = ua.Backend() + +# And register their implementations for the method! +@ua.register_implementation(myfunc, backend=be1) +def myfunc_be1(): # Note that it has exactly the same signature + return NotImplemented + +@ua.register_implementation(myfunc, backend=be2) +def myfunc_be2(): # Note that it has exactly the same signature + return "Strawberry" + +ua.register_backend(be1) +ua.register_backend(be2) +``` + +``` python +with ua.set_backend(be1): + print(myfunc()) +``` + + Strawberry + +Wait\... What? Didn't we just set the first `Backend`? Ahh, but, you +see\... It's signalling that it has *no* implementation for `myfunc`. +The same would happen if you simply didn't register one. To force a +`Backend`, we must use `only=True` or `coerce=True`, the difference will +be explained in just a moment. + +``` python +with ua.set_backend(be1, only=True): + print(myfunc()) +``` + + --------------------------------------------------------------------------- + BackendNotImplementedError Traceback (most recent call last) + in + 1 with ua.set_backend(be1, only=True): + ----> 2 print(myfunc()) + + ~/Quansight/uarray/uarray/backend.py in __call__(self, *args, **kwargs) + 108 + 109 if result is NotImplemented: + --> 110 raise BackendNotImplementedError('No selected backends had an implementation for this method.') + 111 + 112 return result + + BackendNotImplementedError: No selected backends had an implementation for this method. + +Now we are told that no backends had an implementation for this function +(which is nice, good error messages are nice!) + +## Coercion and passing between backends + +Let's say we had two `Backend`s. Let's choose the completely useless +example of one storing a number as an `int` and one as a `float`. + +``` python +class Number(ua.DispatchableInstance): + pass + +def myfunc_rd(args, kwargs, dispatchable_args): + # Here, we're "replacing" the dispatchable args with the ones supplied. + # In general, this may be more complex, like inserting them in between + # other args and kwargs. + return dispatchable_args, kwargs + +@ua.create_multimethod(myfunc_rd) +def myfunc(a): + # Here, we're marking a as a Number, and saying that "we want to dispatch/convert over this" + # We return as a tuple as there may be more dispatchable arguments + return (Number(a),) + +Number.register_convertor(be1, lambda x: int(x)) +Number.register_convertor(be2, lambda x: str(x)) +``` + +Let's also define a \"catch-all\" method. This catches all +implementations of methods not already registered. + +``` python +# This can be arbitrarily complex +def gen_impl1(method, args, kwargs, dispatchable_args): + if not all(isinstance(a, Number) and isinstance(a.value, int) for a in dispatchable_args): + return NotImplemented + + return args[0] + +# This can be arbitrarily complex +def gen_impl2(method, args, kwargs, dispatchable_args): + if not all(isinstance(a, Number) and isinstance(a.value, str) for a in dispatchable_args): + return NotImplemented + + return args[0] + +be1.register_implementation(None, gen_impl1) +be2.register_implementation(None, gen_impl2) +``` + +``` python +myfunc('1') # This calls the second implementation +``` + + '1' + +``` python +myfunc(1) # This calls the first implementation +``` + + 1 + +``` python +myfunc(1.0) # This fails +``` + + --------------------------------------------------------------------------- + BackendNotImplementedError Traceback (most recent call last) + in + ----> 1 myfunc(1.0) # This fails + + ~/Quansight/uarray/uarray/backend.py in __call__(self, *args, **kwargs) + 108 + 109 if result is NotImplemented: + --> 110 raise BackendNotImplementedError('No selected backends had an implementation for this method.') + 111 + 112 return result + + BackendNotImplementedError: No selected backends had an implementation for this method. + +``` python +# But works if we do this: + +with ua.set_backend(be1, coerce=True): + print(type(myfunc(1.0))) + +with ua.set_backend(be2, coerce=True): + print(type(myfunc(1.0))) +``` + + + + +This may seem like too much work, but remember that it's broken down +into a lot of small steps: + +1. Extract the dispatchable arguments. +2. Realise the types of the dispatchable arguments. +3. Convert them. +4. Place them back into args/kwargs +5. Call the right function. + +Note that `only=True` does not coerce, just enforces the backend +strictly. + +With this, we have solved problem (3). Now remains the grunt-work of +actually retrofitting the NumPy API into `unumpy` and extracting the +right values from it. + +## How To Use It Today + +`unumpy` is a set of NumPy-related multimethods built on top of +`uarray`. You can use them as follows: + +``` python +import unumpy as np # Note the changed import statement +from unumpy.xnd_backend import XndBackend + +with ua.set_backend(XndBackend): + print(type(np.arange(0, 100, 1))) +``` + + + +And, as you can see, we get back an Xnd array when using a NumPy-like +API. Currently, there are three back-ends: NumPy, Xnd and PyTorch. The +NumPy and Xnd backends have feature parity, while the PyTorch backend is +still being worked on. + +We are also working on supporting more of the NumPy API, and dispatching +over dtypes. + +Feel free to browse the source and open issues at: + or shoot me an email at +``{=html}habbasi@quansight.com``{=html} +if you want to contact me directly. You can also find the full +documentation at . + diff --git a/apps/labs/public/posts/uarray-intro/blog_hero_var1.svg b/apps/labs/public/posts/uarray-intro/blog_hero_var1.svg new file mode 100644 index 000000000..87cda4aa2 --- /dev/null +++ b/apps/labs/public/posts/uarray-intro/blog_hero_var1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/labs/public/posts/uarray-intro/blog_hero_var2.svg b/apps/labs/public/posts/uarray-intro/blog_hero_var2.svg new file mode 100644 index 000000000..ff5d843c1 --- /dev/null +++ b/apps/labs/public/posts/uarray-intro/blog_hero_var2.svg @@ -0,0 +1 @@ + \ No newline at end of file From 5f05b3f43d463a79f6b43195de03d4971a017eea Mon Sep 17 00:00:00 2001 From: MarsBarLee <46167686+MarsBarLee@users.noreply.github.com> Date: Wed, 1 Feb 2023 15:01:46 -0500 Subject: [PATCH 2/5] Update image file path --- apps/labs/posts/uarray-intro.md | 6 +++--- apps/labs/public/posts/uarray-intro/blog_feature_var1.svg | 1 + apps/labs/public/posts/uarray-intro/blog_hero_var2.svg | 1 - 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 apps/labs/public/posts/uarray-intro/blog_feature_var1.svg delete mode 100644 apps/labs/public/posts/uarray-intro/blog_hero_var2.svg diff --git a/apps/labs/posts/uarray-intro.md b/apps/labs/posts/uarray-intro.md index b26c3bfeb..c2de1d141 100644 --- a/apps/labs/posts/uarray-intro.md +++ b/apps/labs/posts/uarray-intro.md @@ -5,10 +5,10 @@ published: April 30, 2019 description: 'The problem is, stated simply: How do we use all of the PyData libraries in tandem, moving seamlessly from one to the other, without actually changing the API, or even the imports?' category: [PyData ecosystem] featuredImage: - src: /posts/hello-world-post/blog_hero_var2.svg - alt: 'An illustration of a brown and a white hand coming towards each other to pass a business card with the logo of Quansight Labs.' + src: /posts/hello-world-post/blog_hero_var1.svg + alt: 'An illustration of a brown and a dark brown hand coming towards each other to pass a business card with the logo of Quansight Labs.' hero: - imageSrc: /posts/hello-world-post/blog_feature_org/svg + imageSrc: /posts/hello-world-post/blog_hero_var1.svg imageAlt: 'An illustration of a brown hand holding up a microphone, with some graphical elements highlighting the top of the microphone.' --- diff --git a/apps/labs/public/posts/uarray-intro/blog_feature_var1.svg b/apps/labs/public/posts/uarray-intro/blog_feature_var1.svg new file mode 100644 index 000000000..15accefbc --- /dev/null +++ b/apps/labs/public/posts/uarray-intro/blog_feature_var1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/labs/public/posts/uarray-intro/blog_hero_var2.svg b/apps/labs/public/posts/uarray-intro/blog_hero_var2.svg deleted file mode 100644 index ff5d843c1..000000000 --- a/apps/labs/public/posts/uarray-intro/blog_hero_var2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From f9ba75e164e5290041c3aa4632f7996aa003638b Mon Sep 17 00:00:00 2001 From: gabalafou Date: Tue, 17 Jun 2025 03:43:05 -0500 Subject: [PATCH 3/5] Use CH.Code component for notebook in-out pairs (#752) --- apps/labs/pages/styles.css | 8 + .../{uarray-intro.md => uarray-intro.mdx} | 201 ++++++++++++------ 2 files changed, 145 insertions(+), 64 deletions(-) rename apps/labs/posts/{uarray-intro.md => uarray-intro.mdx} (76%) diff --git a/apps/labs/pages/styles.css b/apps/labs/pages/styles.css index 78f032919..153aa16a3 100644 --- a/apps/labs/pages/styles.css +++ b/apps/labs/pages/styles.css @@ -11,3 +11,11 @@ .navbar-open { @apply h-screen overflow-y-hidden; } + +/* + Hide the top-left buttons in the Code Hike block. + See: https://codehike.org/docs/ch-code#panels +*/ +.labs-blog-cell-in-out .ch-frame-buttons { + display: none; +} diff --git a/apps/labs/posts/uarray-intro.md b/apps/labs/posts/uarray-intro.mdx similarity index 76% rename from apps/labs/posts/uarray-intro.md rename to apps/labs/posts/uarray-intro.mdx index c2de1d141..f2c59c153 100644 --- a/apps/labs/posts/uarray-intro.md +++ b/apps/labs/posts/uarray-intro.mdx @@ -1,14 +1,14 @@ --- -title: "`uarray`: A Generic Override Framework for Methods" +title: '`uarray`: A Generic Override Framework for Methods' author: hameer-abbasi published: April 30, 2019 description: 'The problem is, stated simply: How do we use all of the PyData libraries in tandem, moving seamlessly from one to the other, without actually changing the API, or even the imports?' category: [PyData ecosystem] featuredImage: - src: /posts/hello-world-post/blog_hero_var1.svg + src: /posts/uarray-intro/blog_feature_var1.svg alt: 'An illustration of a brown and a dark brown hand coming towards each other to pass a business card with the logo of Quansight Labs.' hero: - imageSrc: /posts/hello-world-post/blog_hero_var1.svg + imageSrc: /posts/uarray-intro/blog_hero_var1.svg imageAlt: 'An illustration of a brown hand holding up a microphone, with some graphical elements highlighting the top of the microphone.' --- @@ -31,12 +31,12 @@ GPUs and distributed computing emerged. Also, there were old ideas that couldn't really be used with NumPy's API, such as sparse arrays. To solve these problems, various libraries emerged: -- Dask, for distributed NumPy -- CuPy, for NumPy on Nvidia-branded GPUs. -- PyData/Sparse, a project started to make sparse arrays conform to - the NumPy API -- Xnd, which extends the type system and the universal function - concept found in NumPy +- Dask, for distributed NumPy +- CuPy, for NumPy on Nvidia-branded GPUs. +- PyData/Sparse, a project started to make sparse arrays conform to + the NumPy API +- Xnd, which extends the type system and the universal function + concept found in NumPy There were yet other libraries that emerged: PyTorch, which mimics NumPy to a certain degree; TensorFlow, which defines its own API; and MXNet, @@ -53,16 +53,11 @@ Oliphant so eloquently puts it, \"re-writing the world\"? In my mind, the goals are (stated abstractly): 1. Methods that are not tied to a specific implementation. - -- For example `np.arange` - + - For example `np.arange` 1. Backends that implement these methods. - -- NumPy, Dask, PyTorch are all examples of this. - + - NumPy, Dask, PyTorch are all examples of this. 1. Coercion of objects to other forms to move between backends. - -- This means converting a NumPy array to a Dask array, and vice versa. + - This means converting a NumPy array to a Dask array, and vice versa. In addition, we wanted to be able to do this for arbitrary objects. So `dtype`s, `ufunc`s etc. should also be dispatchable and coercible. @@ -70,10 +65,9 @@ In addition, we wanted to be able to do this for arbitrary objects. So ## The Solution? With that said, let's dive into `uarray`. If you're not interested in -the gory details, you can jump down to -``{=html}this section``{=html}. +the gory details, you can jump down to this section -``` python +```python import uarray as ua # Let's ignore this for now @@ -99,19 +93,35 @@ def myfunc_be2(): # Note that it has exactly the same signature return "Strawberry" ``` -``` python + + +```python in with ua.set_backend(be1): print(myfunc()) ``` - Potato +--- + +```txt out +Potato +``` + + -``` python + + +```python in with ua.set_backend(be2): print(myfunc()) ``` - Strawberry +--- + +```text out +Strawberry +``` + + As we can clearly see: We have already provided a way to do (1) and (2) above. But then we run across the problem: How do we decide between @@ -119,23 +129,31 @@ these backends? How do we move between them? Let's go ahead and register both of these backends for permanent use. And see what happens when we want to implement both of their methods! -``` python +```python ua.register_backend(be1) ua.register_backend(be2) ``` -``` python + + +```python in print(myfunc()) ``` - Potato +--- + +```text out +Potato +``` + + As we see, we get only the first backend's answer. In general, it's indeterminate what backend will be selected. But, this is a special case: We're not passing arguments in! What if we change one of these to return `NotImplemented`? -``` python +```python # We redefine the multimethod so it's new again @ua.create_multimethod(myfunc_rd) def myfunc(): @@ -158,38 +176,54 @@ ua.register_backend(be1) ua.register_backend(be2) ``` -``` python + + +```python in with ua.set_backend(be1): print(myfunc()) ``` - Strawberry +--- + +```txt out +Strawberry +``` + + Wait\... What? Didn't we just set the first `Backend`? Ahh, but, you -see\... It's signalling that it has *no* implementation for `myfunc`. +see\... It's signalling that it has _no_ implementation for `myfunc`. The same would happen if you simply didn't register one. To force a `Backend`, we must use `only=True` or `coerce=True`, the difference will be explained in just a moment. -``` python + + +```python in with ua.set_backend(be1, only=True): print(myfunc()) ``` - --------------------------------------------------------------------------- - BackendNotImplementedError Traceback (most recent call last) - in - 1 with ua.set_backend(be1, only=True): - ----> 2 print(myfunc()) +--- - ~/Quansight/uarray/uarray/backend.py in __call__(self, *args, **kwargs) - 108 - 109 if result is NotImplemented: - --> 110 raise BackendNotImplementedError('No selected backends had an implementation for this method.') - 111 - 112 return result +```txt out +--------------------------------------------------------------------------- +BackendNotImplementedError Traceback (most recent call last) + in + 1 with ua.set_backend(be1, only=True): +----> 2 print(myfunc()) + +~/Quansight/uarray/uarray/backend.py in __call__(self, *args, **kwargs) + 108 + 109 if result is NotImplemented: +--> 110 raise BackendNotImplementedError('No selected backends had an implementation for this method.') + 111 + 112 return result + +BackendNotImplementedError: No selected backends had an implementation for this method. +``` - BackendNotImplementedError: No selected backends had an implementation for this method. + Now we are told that no backends had an implementation for this function (which is nice, good error messages are nice!) @@ -199,7 +233,7 @@ Now we are told that no backends had an implementation for this function Let's say we had two `Backend`s. Let's choose the completely useless example of one storing a number as an `int` and one as a `float`. -``` python +```python class Number(ua.DispatchableInstance): pass @@ -222,56 +256,82 @@ Number.register_convertor(be2, lambda x: str(x)) Let's also define a \"catch-all\" method. This catches all implementations of methods not already registered. -``` python +```python # This can be arbitrarily complex def gen_impl1(method, args, kwargs, dispatchable_args): if not all(isinstance(a, Number) and isinstance(a.value, int) for a in dispatchable_args): return NotImplemented - + return args[0] # This can be arbitrarily complex def gen_impl2(method, args, kwargs, dispatchable_args): if not all(isinstance(a, Number) and isinstance(a.value, str) for a in dispatchable_args): return NotImplemented - + return args[0] be1.register_implementation(None, gen_impl1) be2.register_implementation(None, gen_impl2) ``` -``` python + + +```python in myfunc('1') # This calls the second implementation ``` - '1' +--- + +```txt out +'1' +``` + + + + -``` python +```python in myfunc(1) # This calls the first implementation ``` - 1 +--- + +```txt out +1 +``` + + -``` python + + +```python in myfunc(1.0) # This fails ``` +--- + +```txt out --------------------------------------------------------------------------- BackendNotImplementedError Traceback (most recent call last) in ----> 1 myfunc(1.0) # This fails ~/Quansight/uarray/uarray/backend.py in __call__(self, *args, **kwargs) - 108 + 108 109 if result is NotImplemented: --> 110 raise BackendNotImplementedError('No selected backends had an implementation for this method.') - 111 + 111 112 return result BackendNotImplementedError: No selected backends had an implementation for this method. +``` -``` python + + + + +```python in # But works if we do this: with ua.set_backend(be1, coerce=True): @@ -281,8 +341,14 @@ with ua.set_backend(be2, coerce=True): print(type(myfunc(1.0))) ``` - - +--- + +```txt out + + +``` + + This may seem like too much work, but remember that it's broken down into a lot of small steps: @@ -305,7 +371,9 @@ right values from it. `unumpy` is a set of NumPy-related multimethods built on top of `uarray`. You can use them as follows: -``` python + + +```python in import unumpy as np # Note the changed import statement from unumpy.xnd_backend import XndBackend @@ -313,7 +381,13 @@ with ua.set_backend(XndBackend): print(type(np.arange(0, 100, 1))) ``` - +--- + +```txt out + +``` + + And, as you can see, we get back an Xnd array when using a NumPy-like API. Currently, there are three back-ends: NumPy, Xnd and PyTorch. The @@ -324,8 +398,7 @@ We are also working on supporting more of the NumPy API, and dispatching over dtypes. Feel free to browse the source and open issues at: - or shoot me an email at -``{=html}habbasi@quansight.com``{=html} -if you want to contact me directly. You can also find the full -documentation at . +https://github.com/Quansight-Labs/uarray or shoot me an email at +habbasi@quansight.com +if you want to contact me directly. You can also find the full documentation at https://uarray.readthedocs.io/en/latest/. From 05a05d8833f7484f7e02e0840fdf63a1f6b411ff Mon Sep 17 00:00:00 2001 From: gabalafou Date: Tue, 17 Jun 2025 12:16:55 +0200 Subject: [PATCH 4/5] convert png to svg, create common shared public images folder --- apps/labs/posts/uarray-intro.mdx | 4 ++-- apps/labs/public/images/blog_feature_var1.png | Bin 0 -> 71762 bytes .../uarray-intro => images}/blog_hero_var1.svg | 0 .../posts/uarray-intro/blog_feature_var1.svg | 1 - apps/labs/services/posts/serializePost.ts | 2 +- 5 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 apps/labs/public/images/blog_feature_var1.png rename apps/labs/public/{posts/uarray-intro => images}/blog_hero_var1.svg (100%) delete mode 100644 apps/labs/public/posts/uarray-intro/blog_feature_var1.svg diff --git a/apps/labs/posts/uarray-intro.mdx b/apps/labs/posts/uarray-intro.mdx index f2c59c153..dc46ae62c 100644 --- a/apps/labs/posts/uarray-intro.mdx +++ b/apps/labs/posts/uarray-intro.mdx @@ -5,10 +5,10 @@ published: April 30, 2019 description: 'The problem is, stated simply: How do we use all of the PyData libraries in tandem, moving seamlessly from one to the other, without actually changing the API, or even the imports?' category: [PyData ecosystem] featuredImage: - src: /posts/uarray-intro/blog_feature_var1.svg + src: /images/blog_feature_var1.png alt: 'An illustration of a brown and a dark brown hand coming towards each other to pass a business card with the logo of Quansight Labs.' hero: - imageSrc: /posts/uarray-intro/blog_hero_var1.svg + imageSrc: /images/blog_hero_var1.svg imageAlt: 'An illustration of a brown hand holding up a microphone, with some graphical elements highlighting the top of the microphone.' --- diff --git a/apps/labs/public/images/blog_feature_var1.png b/apps/labs/public/images/blog_feature_var1.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2175f597ed88eb3d4507032436def82e48bf22 GIT binary patch literal 71762 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

m&tM#ho6a|@I>|b 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 \ No newline at end of file diff --git a/apps/labs/services/posts/serializePost.ts b/apps/labs/services/posts/serializePost.ts index 4a16d99fc..7c168ec94 100644 --- a/apps/labs/services/posts/serializePost.ts +++ b/apps/labs/services/posts/serializePost.ts @@ -26,7 +26,7 @@ export const serializePost = async ( if ((data as TPost['meta']).featuredImage.src.endsWith('.svg')) { throw Error( - `SVG not allowed for featured image. Convert to PNG or JPEG: ${data.featuredImage.src}`, + `SVG not allowed for featured image (not widely supported by social media sites). Convert to PNG or JPEG: ${data.featuredImage.src}`, ); } From 8f8bdacbc90bd0bdcc684b6cee7b5b5e7c05e978 Mon Sep 17 00:00:00 2001 From: gabalafou Date: Tue, 17 Jun 2025 12:20:52 +0200 Subject: [PATCH 5/5] fix authors --- apps/labs/posts/uarray-intro.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/labs/posts/uarray-intro.mdx b/apps/labs/posts/uarray-intro.mdx index dc46ae62c..5952b4a52 100644 --- a/apps/labs/posts/uarray-intro.mdx +++ b/apps/labs/posts/uarray-intro.mdx @@ -1,6 +1,6 @@ --- title: '`uarray`: A Generic Override Framework for Methods' -author: hameer-abbasi +authors: [hameer-abbasi] published: April 30, 2019 description: 'The problem is, stated simply: How do we use all of the PyData libraries in tandem, moving seamlessly from one to the other, without actually changing the API, or even the imports?' category: [PyData ecosystem]