Home Blog Page 3806

Including Swift Package deal Supervisor Help – Half 2


Within the earlier publish I checked out among the historical past of how we packaged up our library code to be used by our fellow builders. We checked out among the advantages of static libraries versus dynamic frameworks which additionally include headers wanted by the integrator.

Now let’s dive into the steps that have been essential for me to allow SPM assist on the primary few libraries DTCoreText, DTFoundation and Kvitto. It took me a number of days to iron out all of the kinks and I’d like to share with you what I realized within the course of.

We’re used to utilizing Xcode to explain what goes right into a construct: Which recordsdata to compile, what exterior libraries to hyperlink to, what sources are wanted and likewise common construct settings just like the vary and sorts of supported platforms. Extra exactly, these settings are contained within the venture.pbxproj file inside your xcodeproj bundle.

With SwiftPM there isn’t a such venture file. Somewhat every little thing is outlined in human-readable kind within the Package deal.swift file.

For some primary terminology: we outline sure merchandise (i.e. static library, dynamic framework, app bundle and many others, useful resource bundle, unit take a look at bundle), that relate to plenty of targets (a bucket for a bunch of supply code recordsdata and sources). Here’s a distinction from Xcode the place goal and product is used synonymously.

Package deal Definition

Step one, and most vital one, is so as to add a bundle definition file to the foundation folder of the repository. It must be on this place as a result of Swift Packages are referenced by the repository URL and SwiftPM will solely have a look at the highest folder for Package deal.swift.

Right here’s the definition for Kvitto, for reference. This has all components you may encounter, together with a dependency on one other bundle, a few sources on prime of the definition of 1 product and a number of goal.

// swift-tools-version:5.3

import PackageDescription

let bundle = Package deal(
    identify: "Kvitto",
    platforms: [
        .iOS(.v9),         //.v8 - .v13
        .macOS(.v10_10),    //.v10_10 - .v10_15
        .tvOS(.v9),        //.v9 - .v13
    ],
    merchandise: [
        .library(
            name: "Kvitto",
            targets: ["Kvitto"]),
    ],
    dependencies: [
        .package(url: "https://github.com/Cocoanetics/DTFoundation.git", 
		from: "1.7.15"),
    ],
    targets: [
        .target(
            name: "Kvitto",
            dependencies: [
                .product(name: "DTFoundation", 
				package: "DTFoundation"),
            ],
            path: "Core",
            exclude: ["Info.plist"]),
        .testTarget(
            identify: "KvittoTests",
            dependencies: ["Kvitto"],
            path: "Take a look at",
            exclude: ["Info.plist"],
            sources: [.copy("Resources/receipt"),
                        .copy("Resources/sandboxReceipt")]),
    ]
)

The primary line may solely appear like a remark to you, however it is vital for the swift instruments to find out what syntax components are supported. Model 5.3 is required when you have sources in any goal. In the event you set that to one thing decrease you get syntax errors concerning the useful resource definitions. In the event you set that to five.3 however don’t specify useful resource definitions (for non-standard sources) you’re going to get warnings about unknown recordsdata that you must both exclude or outline as sources.

I discovered myself conflicted about that, as I had talked about within the earlier article. All code would work on Swift 5.0 and up and solely the take a look at goal has sources. I may get extra inexperienced checkmarks on Swift Package deal Index if I eliminated the .testTarget definition.

On the opposite aspect the swift instruments allow you to run thusly outlined unit assessments from the command line and functioning unit assessments additionally ought to rely as an indication of excellent library high quality. Lastly, all people ought to be utilizing Swift 5.3 anyway as that’s the baseline normal because the launch of Xcode 12.

That’s why I selected to go away it at that.

The essential setup of the bundle definition is easy. You might have the bundle identify, then some minimal platform variations. Observe that these minimal OS variations don’t imply that that might prohibit the the bundle to particular platforms.

The merchandise part defines what sort of library comes out of the construct course of. The default setting (invisible) is to provide a static library, by specifying sort: .dynamic you get a dynamic framework as an alternative. The targets array specifies which targets will get merged into the ultimate product.

I assumed for a second that that may be good to have the sources be added to the framework as an alternative of a separate useful resource bundle, like we’re used to. However alas the dealing with of sources stays the identical they usually get bundled right into a Product_Target.bundle. So subsequently I’d moderately have the static library – which can get merged into the app binary – moderately than having one more separate framework bundle contained in the app bundle.

As I defined within the earlier article, dynamic frameworks ought to be averted if the supply code for libraries is public. So we’re pleased with the static library default.

The dependencies part lists the exterior reference to different packages. You specify the repository URL and the minimal variations. The proven manner with from and a model would settle for all 1.x.x variations from and together with 1.7.15. There are additionally different methods to specify an actual quantity or sure ranges.

Final come the targets. We’ve an everyday goal for the bundle and a take a look at goal for all of the unit assessments. In the event you don’t specify a path then SwiftPM expects the supply code within the Sources folder beneath the goal’s folder and sources in a Sources folder. I’ve a unique construction, so I specified a customized path.

I’ve to exclude the Information.plist for each targets as a result of that is utilized by two targets outlined contained in the Xcode venture. And for the take a look at goal I specify two sources to be copied with the trail relative to the goal customized path. These copy directions are essential as a result of the contained sources don’t have a kind that Xcode is aware of methods to deal with. For issues like strings recordsdata or XIBs you don’t must specify something.

Evaluate the dependencies key of each targets. On the one hand you see that I’m referencing the exterior dependency of the primary goal. Then again the take a look at goal requires the primary goal to work. That’s additionally a distinction to Xcode the place the examined code resides inside a number utility, the place’s right here it’s compiled into the unit take a look at bundle.

Goal Concerns

You may be questioning why there’s a distinction between merchandise and targets in SPM. One purpose for that you’ve got already seen: there isn’t a purpose for the take a look at goal to be represented in a product. Easy packages will typically solely have one product which may solely consist of 1 goal.

Though I already discovered two extra causes, to separate code out into extra particular person targets after which additionally merchandise.

You may assume that Swift Package deal Supervisor would solely all you to have code written in Swift. However you’d be mistaken, Any language goes, additionally Goal-C and different C dialects. However SPM doesn’t mean you can combine C-based languages with Swift in a single goal.

In a single venture I had some Goal-C code for a operate with quite a lot of ifs. I rewrote that in Swift solely to search out that compiling this might take greater than a minute, in contrast to a couple seconds in Goal-C. So I selected to go away the operate because it was. The answer was to place it right into a separate Goal-C goal and refer that to an inside dependency from the primary Swift goal.

The opposite good purpose for a separate goal and product was to have some frequent information mannequin code that will be utilized by inside targets and likewise by way of import in an app consuming my library. In locations the place the consumer would solely want the shared definitions he would import the precise module for that. Elsewhere he would import different targets which in flip may additionally make use of these definitions internally.

Every product turns into its personal module.

Resourcefulness

I discussed above which you could let SPM do its personal factor with regards to normal useful resource sorts, like localised strings, XIBs, storyboards and asset catalogs. In the event you use string localisation although, it’s a must to specify the venture’s default language.

Different sorts it’s a must to both particularly exclude or specify what ought to be achieved for it. You possibly can both specify a .copy for every particular person useful resource or additionally for all the Sources folder. Since I’ve solely two take a look at recordsdata and that’s not going to vary, it wasn’t an excessive amount of work so as to add these individually.

SPM expects sources in the identical folder {that a} goal’s supply recordsdata reside in (or a sub-folder thereof). The explanation for that’s once more that there isn’t a Xcode venture file the place you possibly can specify membership of sure recordsdata to particular targets. You specify what belongs the place by how it’s specified by the file system together of the bundle definition.

Say you could have a single place the place you could have localised strings recordsdata downloaded from a translation web site like POEditor however you need them to be included in several targets. A method to attain that’s to create soft-links contained in the goal’s useful resource folders to the recordsdata. I wrote this shell script to create the lproj folders for all languages after which create the hyperlinks.

#!/bin/sh

echo "Eradicating current strings"
rm -rf ../TFMViews/Sources/*.lproj
rm -rf ../TFMExtension/Sources/*.lproj

PWD=`pwd`

for entry in *.lproj
do
  echo "Linking $entry..."

  mkdir ../TFMViews/Sources/$entry
  ln -s ../../../Strings/$entry/TFMViews.stringsdict 
     ../TFMViews/Sources/$entry
  ln -s ../../../Strings/$entry/TFMViews.strings 
     ../TFMViews/Sources/$entry

  mkdir ../TFMExtension/Sources/$entry
  ln -s ../../../Strings/$entry/TFMExtension.stringsdict 
     ../TFMExtension/Sources/$entry
  ln -s ../../../Strings/$entry/TFMExtension.strings 
     ../TFMExtension/Sources/$entry

achieved

The identical strategy of soft-links will also be employed for Goal-C primarily based packages the place you may hyperlink to all related public headers in an embody folder.

Platform-specific Code

Because the bundle has no facility for limiting particular supply code to particular platforms or OS variations, you’ll face the state of affairs that sure code received’t compile for different platforms. A workaround for this limitation is the usage of conditional compilation directives.

For instance, every little thing that references UIKit can’t be compiled for macOS or watchOS, so I’ve a number of locations in DTCoreText or DTFoundation (each written in Goal-C) the place all the implementation is enclosed in:

#import 

#if TARGET_OS_IPHONE && !TARGET_OS_WATCH
...
#endif

I additionally discovered that typically I needed to additionally import the TargetConditionals header for the defines to work. Specifically sure Goal-C class extensions in DTCoreText wouldn’t be seen within the public interface if I didn’t import this header. I’ve no clarification as to why, however including the import for the header mounted it.

Contained in the Xcode Venture

The modifications for conditional compilation apart, there’s nothing you want to change in your Xcode venture – until you wish to. The principal setup for the bundle occurs in Package deal.swift. You possibly can construct the bundle with issuing swift construct.

I discovered it handy so as to add a reference to the bundle contained in the Xcode venture as a result of this lets you debug your code within the context of being compiled for a bundle. In the event you drag any folder (containing a bundle definition) into the venture navigator pane, Xcode will add a neighborhood bundle reference for you, with an emblem of a cute little field.

In Xcode 12 there’s a bug that in case you do this for the venture folder itself, it appears to work, however when you shut the venture and reopen it once more, the reference turns into defunct. The way in which to repair it’s to vary the reference to “Relative to Venture” and open the folder selector by way of the folder button and re-select the venture root folder.

This additionally creates a scheme for constructing the bundle and the bundle’s merchandise turn into obtainable to hyperlink/embed to your app. Package deal merchandise have an icon of a greek temple. If they’re static libraries then they’ll get merged into the app binary, dynamic frameworks can be added to the app’s Frameworks folder.

Xcode additionally creates a scheme for the bundle, inserting it in .swiftpm/xcode/xcshareddata/xcschemes/. I moved it into the shared schemes folder of the xcodeproj and renamed it to Kvitto-Package deal.xcscheme.

I had the watchOS platform builds on Swift Package deal Index fail as a result of xcodebuild insists on constructing all targets, together with the take a look at goal. This fails as a result of unit assessments require XCTest which doesn’t excite for watchOS.

By offering an aptly named shared scheme it is going to solely construct the primary goal and I achieved inexperienced checkmarks for watchOS on SPI.

Library Unit Checks

To run the unit assessments contained within the take a look at goal, all you want to do is to run swift take a look at on the command line, from the repository root folder.

Results of working the Kvitto unit assessments from the command line

Some magic was required to get that to work as a result of take a look at recordsdata required by the unit assessments will not be bundled within the .xctest bundle. For normal packages a useful resource bundle accessor is being robotically generated, which you should use with Bundle.module.

The accessor works by figuring out the trail of the executable and setting up a bundle identify from names of bundle and goal. Within the case of unit assessments the executable is xcrun contained within the Xcode.app bundle the place it has no probability of discovering the Kvitto_KittoTests.bundle.

My ugly, however practical, workaround for that is as follows:

func urlForTestResource(identify: String, ofType ext: String?) -> URL?
{
	let bundle = Bundle(for: sort(of: self))
		
	#if SWIFT_PACKAGE
		
	// there's a bug the place Bundle.module factors to the trail of xcrun contained in the Xcode.app bundle, as an alternative of the take a look at bundle
	// that aborts unit assessments with message:
	//   Deadly error: couldn't load useful resource bundle: /Purposes/Xcode.app/Contents/Developer/usr/bin/Kvitto_KvittoTests.bundle: file KvittoTests/resource_bundle_accessor.swift, line 7
		
	// workaround: attempt to discover the useful resource bundle on the construct path
	let buildPathURL = bundle.bundleURL.deletingLastPathComponent()
		
	guard let resourceBundle = Bundle(url: buildPathURL.appendingPathComponent("Kvitto_KvittoTests.bundle")),
	   let path = resourceBundle.path(forResource: identify, ofType: ext) else
	{
		return nil
	}
		
	return URL(fileURLWithPath: path)
		
	#else
		
	guard let path = bundle.path(forResource: identify, ofType: ext) else
	{
		return nil
	}
		
	return URL(fileURLWithPath: path)
		
	#endif
}

This depends on the truth that the useful resource bundle can be created parallel to the xctest bundle, in the identical construct folder. The #if SWIFT_PACKAGE conditional compilation will solely be added if this code is constructed as a part of a swift bundle. With this workaround, the earlier mechanisms of working the unit take a look at scheme by way of Xcode continues to work.

The wonderful thing about Swift being open supply, is that we are able to additionally examine the code for the useful resource accessor on GitHub. It seems that the talked about bug has already been addressed there. The repair was made too late to make it into Swift 5.3 in Xcode 12 however has been confirmed to be current in Xcode 12.2.

Conclusion

I discover that the evolution of Swift Package deal Supervisor as progressed sufficiently to start out including assist for it to my libraries. It’s potential and advisable to take action along with different methods of integration, like Xcode subproject, Cocoapods or Carthage.

Probably the most annoying limitation remaining is that you just can’t restrict targets to sure platforms or specify a spread of supported OS variations per goal. However these can simply be labored round with conditional compilation directives.

The standard standards partially enforced by the Swift Package deal Index coupled with the discoverability of parts additionally make it enticing for library distributors to contemplate supporting Swift Package deal Supervisor. Having the dependency administration taken care of by Xcode is the best characteristic of all.



Additionally printed on Medium.


Classes: Administrative

Instagram is letting you share songs proper out of your profile

0



What it’s essential to know

  • Instagram is rolling out a MySpace-inspired function the place you may add your favourite track on to your profile.
  • You possibly can add a monitor to your profile bio, and guests can play or pause it as they need—no autoplay like on MySpace.
  • You possibly can select from a variety of artists and even choose a 30-second clip to function.

Instagram is rolling out a nostalgic throwback to the MySpace days, letting customers spotlight their favourite songs proper on their profiles.

Based on Meta’s latest submit on X (previously Twitter), the brand new function allows you to add your favourite songs proper into your profile bio. It stays put till you resolve to alter it.



iOS 18 and macOS Sequoia might launch on the identical day

0


macOS Sequoia features
macOS Sequoia may land on the identical day as iOS 18.
Picture: Apple

Apple might launch macOS Sequoia, the subsequent model of the Mac working system, alongside iOS 18 and iPadOS 18 in September.

The corporate sometimes releases a serious new iOS and iPadOS replace in September. A brand new macOS model often follows in October or November.

macOS Sequoia and iOS 18 are virtually prepared for launch

In contrast to main iOS releases, Apple has no set timeframe for rolling out new macOS variations. Nonetheless, they sometimes launch a couple of weeks after a brand new iOS replace. This delay prevents many cross-platform options from being obtainable at launch.

In 2023, the corporate launched iOS 17, iPadOS 17, and watchOS 10 on September 18. macOS Sonoma dropped every week later, on September 23.

This 12 months, although, MacRumors experiences Apple will launch macOS Sequoia alongside iOS 18 in mid-September. A simultaneous launch will make sure that all cross-platform options can be found from day certainly one of a brand new iOS launch. The notable new addition on this regard on iOS 18 and macOS Sequoia is iPhone Mirroring. Because the title suggests, it can mirror your iPhone’s show and notifications to your Mac with full management.

Since its June announcement at WWDC24, Apple has launched seven developer betas of macOS Sequoia, suggesting that the OS is nearly prepared for public launch.

No Apple Intelligence at launch

Rumors counsel Apple might maintain its yearly iPhone launch occasion on September 10. If that’s the case, iOS 18 and macOS Sequoia ought to roll out simply over every week after that, on September 18.

Regardless of when iOS 18 and macOS Sequoia launch, their preliminary builds received’t ship with Apple Intelligence. As an alternative, Apple’s AI-powered suite of options will arrive with iOS 18.1 and macOS 15.1 in October. It’s going to additionally initially solely be obtainable to iPhone and Mac customers within the US.



World Microsoft Meltdown Tied to Unhealthy Crowdstrike Replace – Krebs on Safety


A defective software program replace from cybersecurity vendor Crowdstrike crippled numerous Microsoft Home windows computer systems throughout the globe right this moment, disrupting every thing from airline journey and monetary establishments to hospitals and companies on-line. Crowdstrike mentioned a repair has been deployed, however specialists say the restoration from this outage may take a while, as Crowdstrike’s resolution must be utilized manually on a per-machine foundation.

World Microsoft Meltdown Tied to Unhealthy Crowdstrike Replace – Krebs on Safety

A photograph taken at San Jose Worldwide Airport right this moment exhibits the dreaded Microsoft “Blue Display of Demise” throughout the board. Credit score: Twitter.com/adamdubya1990

Earlier right this moment, an errant replace shipped by Crowdstrike started inflicting Home windows machines working the software program to show the dreaded “Blue Display of Demise,” rendering these programs quickly unusable. Like most safety software program, Crowdstrike requires deep hooks into the Home windows working system to fend off digital intruders, and in that atmosphere a tiny coding error can shortly result in catastrophic outcomes.

In a put up on Twitter/X, Crowdstrike CEO George Kurtz mentioned an replace to appropriate the coding mistake has been shipped, and that Mac and Linux programs should not affected.

“This isn’t a safety incident or cyberattack,” Kurtz mentioned on Twitter, echoing a written assertion by Crowdstrike. “The problem has been recognized, remoted and a repair has been deployed.”

Posting to Twitter/X, the director of Crowdstrike’s menace searching operations mentioned the repair includes booting Home windows into Secure Mode or the Home windows Restoration Atmosphere (Home windows RE), deleting the file “C-00000291*.sys” after which restarting the machine.

The software program snafu could have been compounded by a current collection of outages involving Microsoft’s Azure cloud companies, The New York Occasions studies, though it stays unclear whether or not these Azure issues are in any respect associated to the dangerous Crowdstrike replace. Replace, 4:03 p.m. ET: Microsoft studies the Azure issues right this moment had been unrelated to the dangerous Crowdstrike replace.

A reader shared this picture taken earlier right this moment at Denver Worldwide Airport. Credit score: Twitter.com/jterryy07

Matt Burgess at Wired writes that inside well being care and emergency companies, varied medical suppliers around the globe have reported points with their Home windows-linked programs, sharing information on social media or their very own web sites.

“The US Emergency Alert System, which points hurricane warnings, mentioned that there had been varied 911 outages in various states,” Burgess wrote. “Germany’s College Hospital Schleswig-Holstein mentioned it was canceling some nonurgent surgical procedures at two places. In Israel, greater than a dozen hospitals have been impacted, in addition to pharmacies, with studies saying ambulances have been rerouted to nonimpacted medical organizations.”

In the UK, NHS England has confirmed that appointment and affected person document programs have been impacted by the outages.

“One hospital has declared a ‘important’ incident after a third-party IT system it used was impacted,” Wired studies. “Additionally within the nation, prepare operators have mentioned there are delays throughout the community, with a number of corporations being impacted.”

Reactions to right this moment’s outage had been swift and brutal on social media, which was flooded with photos of individuals at airports surrounded by laptop screens displaying the Microsoft blue display error. Many Twitter/X customers chided the Crowdstrike CEO for failing to apologize for the massively disruptive occasion, whereas others famous that doing so may expose the corporate to lawsuits.

In the meantime, the worldwide Home windows outage shortly grew to become probably the most talked-about topic on Twitter/X, whose synthetic intelligence bots collated a collection of parody posts from cybersecurity professionals pretending to be on their first week of labor at Crowdstrike. Extremely,Twitter/X’s AI summarized these sarcastic posts right into a sunny, can-do story about Crowdstrike that was promoted as the highest dialogue on Twitter this morning.

“A number of people have just lately began working on the cybersecurity agency Crowdstrike and have expressed their pleasure and pleasure of their new roles,” the AI abstract learn. “They’ve shared their experiences of pushing code to manufacturing on their first day and are trying ahead to optimistic outcomes of their work.”

The highest story right this moment on Twitter/X, as brilliantly summarized by X’s AI bots.

That is an evolving story. Keep tuned for updates.



Deloitte Finds Enthusiasm Tempered by Adoption Hurdles

0


(Jirsak/Shutterstock)

A new report by Deloitte reveals that whereas funding in GenAI is rising, the clock is ticking to scale and create sustained worth. Promising pilots have led to greater investments and rising expectations, nevertheless, it has grow to be essential for GenAI to start out offering tangible returns.

In response to Deloitte, whereas organizations acknowledge the potential of GenAI and proceed investing within the know-how, they’re additionally encountering important challenges, together with integration points, a scarcity of expert expertise, regulatory pressures, and technical difficulties.

Gathering insights from over 2,700 enterprise and know-how leaders throughout the globe, Deloitte’s State of Generative AI within the Enterprise Q3 report exhibits that 67% of organizations are rising investments in GenAI on account of robust early worth, nevertheless, 68% have moved solely round one-third (30%) or fewer GenAI experiments into manufacturing. 

The report additionally reveals that enterprise leaders have gotten much less keen about GenAI, with the preliminary fervent pleasure shifting towards a extra crucial analysis of GenAI’s precise affect on enterprise outcomes.

The curiosity in GenAI stays “excessive” or “very excessive” amongst senior executives (63%) and board members (53%), nevertheless, these numbers are considerably decrease in comparison with the Q1 report, dropping 11 share factors and eight share factors respectively.

Knowledge administration stays a vital issue for profitable GenAI deployments. Seventy-five p.c of organizations are rising their finances towards GenAI, in keeping with the Deloitte report. Nevertheless, unexpected data-related points have been uncovered, inflicting 55% of the organizations to keep away from sure GenAI use circumstances.

One of many key findings of the report is that 41% of organizations struggled to outline and measure the precise impacts of GenAI efforts. Moreover, solely 16% of the organizations reported that they generate stories concerning the worth being created with GenAI. 

The problem in measuring GenAI success usually arises from its big selection of use circumstances, which require a extra granular and tailor-made strategy. Nevertheless, as enterprise leaders grow to be extra crucial of GenAI, there’ll seemingly be a rising emphasis on evaluating the worth generated by the know-how.

Deloitte recommends defining key efficiency indicators (KPIs) for every particular use case, together with metrics resembling effectivity, productiveness, and consumer expertise enhancements. 

The report underscores the principle boundaries to the profitable growth and deployment of GenAI embrace regulatory compliance (36%), problem managing dangers (30%), and lack of a governance mannequin (29%). Every GenAI use case can even current distinctive challenges resembling novel privateness issues and defending new assault surfaces. 

To handle these challenges, organizations are specializing in establishing new guardrails, educating their workforces, conducting assessments, and constructing oversight capabilities.

There’s additionally a human aspect to mitigating a few of these dangers. “The advanced discussions round creating worth and managing danger makes it clear to me that we have to hold people on the heart of all this decision-making,” notes Jim Rowan, Utilized AI SGO Chief and Principal at Deloitte. 

“It’s the human stakeholders who affect how functions are conceived and developed, how they’re adopted and used, and the way they’re managed for belief and safety. On this, worker upskilling and alter administration stay indispensable components of value-driving GenAI applications.” 

(amgun/Shutterstock)

Deloitte’s analysis reveals that firms that rigorously measure efficiency, responsibly democratize GenAI, and use information as an accelerator quite than a barrier might be higher positioned to reap the advantages of GenAI.

Nevertheless, as highlighted by a latest report by McKinsey, “excessive performers” are more likely to see extra challenges with information. These are organizations which might be additional alongside of their GenAI adoption journeys and sometimes allocate a better share of their budgets to GenAI investments. 

Whereas these firms face extra challenges, they successfully handle these points by heightened danger consciousness, well-defined mitigation processes, curated studying applications, and clear KPIs to measure GenAI worth.

Whereas the journey of adopting GenAI presents important challenges, it additionally provides substantial alternatives for individuals who navigate these hurdles successfully. Because the GenAI panorama continues to evolve, strategic foresight and flexibility might be essential for reaching sustained success. 

Associated Objects 

Getting Worth Out of GenAI

BCG: GenAI Funding Anticipated to Surge 30% Regardless of Modest IT Price range Progress

Hitachi Vantara Report: Most Enterprises Unprepared for GenAI Success