CINXE.COM

Software Development | InfoWorld

<!doctype html> <html lang="en-US" data-brand="iw"> <head> <meta charset="UTF-8"><script type="text/javascript">(window.NREUM||(NREUM={})).init={privacy:{cookies_enabled:true},ajax:{deny_list:["bam.nr-data.net"]}};(window.NREUM||(NREUM={})).loader_config={licenseKey:"NRJS-51503b5fb963bca6c59",applicationID:"1486670290"};;/*! For license information please see nr-loader-rum-1.274.0.min.js.LICENSE.txt */ (()=>{var e,t,r={8122:(e,t,r)=>{"use strict";r.d(t,{a:()=>i});var n=r(944);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.R)(3);if(!t||"object"!=typeof t)return(0,n.R)(4);const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),o=0===Object.keys(r).length?e:r;for(let a in o)if(void 0!==e[a])try{if(null===e[a]){r[a]=null;continue}Array.isArray(e[a])&&Array.isArray(t[a])?r[a]=Array.from(new Set([...e[a],...t[a]])):"object"==typeof e[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},2555:(e,t,r)=>{"use strict";r.d(t,{Vp:()=>c,fn:()=>s,x1:()=>u});var n=r(384),i=r(8122);const o={beacon:n.NT.beacon,errorBeacon:n.NT.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},a={};function s(e){try{const t=c(e);return!!t.licenseKey&&!!t.errorBeacon&&!!t.applicationID}catch(e){return!1}}function c(e){if(!e)throw new Error("All info objects require an agent identifier!");if(!a[e])throw new Error("Info for ".concat(e," was never set"));return a[e]}function u(e,t){if(!e)throw new Error("All info objects require an agent identifier!");a[e]=(0,i.a)(t,o);const r=(0,n.nY)(e);r&&(r.info=a[e])}},9417:(e,t,r)=>{"use strict";r.d(t,{D0:()=>g,gD:()=>h,xN:()=>p});var n=r(993);const i=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var o=r(2614),a=r(944),s=r(384),c=r(8122);const u="[data-nr-mask]",d=()=>{const e={mask_selector:"*",block_selector:"[data-nr-block]",mask_input_options:{color:!1,date:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:!1,search:!1,tel:!1,text:!1,time:!1,url:!1,week:!1,textarea:!1,select:!1,password:!0}};return{ajax:{deny_list:void 0,block_internal:!0,enabled:!0,harvestTimeSeconds:10,autoStart:!0},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},feature_flags:[],generic_events:{enabled:!0,harvestTimeSeconds:30,autoStart:!0},harvest:{tooManyRequestsDelay:60},jserrors:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},logging:{enabled:!0,harvestTimeSeconds:10,autoStart:!0,level:n.p_.INFO},metrics:{enabled:!0,autoStart:!0},obfuscate:void 0,page_action:{enabled:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,harvestTimeSeconds:30,autoStart:!0},performance:{capture_marks:!1,capture_measures:!1},privacy:{cookies_enabled:!0},proxy:{assets:void 0,beacon:void 0},session:{expiresMs:o.wk,inactiveMs:o.BB},session_replay:{autoStart:!0,enabled:!1,harvestTimeSeconds:60,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inline_images:!1,fix_stylesheets:!0,mask_all_inputs:!0,get mask_text_selector(){return e.mask_selector},set mask_text_selector(t){i(t)?e.mask_selector="".concat(t,",").concat(u):""===t||null===t?e.mask_selector=u:(0,a.R)(5,t)},get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){i(t)?e.block_selector+=",".concat(t):""!==t&&(0,a.R)(6,t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){t&&"object"==typeof t?e.mask_input_options={...t,password:!0}:(0,a.R)(7,t)}},session_trace:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},soft_navigations:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},spa:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},ssl:void 0,user_actions:{enabled:!0}}},l={},f="All configuration objects require an agent identifier!";function g(e){if(!e)throw new Error(f);if(!l[e])throw new Error("Configuration for ".concat(e," was never set"));return l[e]}function p(e,t){if(!e)throw new Error(f);l[e]=(0,c.a)(t,d());const r=(0,s.nY)(e);r&&(r.init=l[e])}function h(e,t){if(!e)throw new Error(f);var r=g(e);if(r){for(var n=t.split("."),i=0;i<n.length-1;i++)if("object"!=typeof(r=r[n[i]]))return;r=r[n[n.length-1]]}return r}},3371:(e,t,r)=>{"use strict";r.d(t,{V:()=>f,f:()=>l});var n=r(8122),i=r(384),o=r(6154),a=r(9324);let s=0;const c={buildEnv:a.F3,distMethod:a.Xs,version:a.xv,originTime:o.WN},u={customTransaction:void 0,disabled:!1,isolatedBacklog:!1,loaderType:void 0,maxBytes:3e4,onerror:void 0,ptid:void 0,releaseIds:{},appMetadata:{},session:void 0,denyList:void 0,timeKeeper:void 0,obfuscator:void 0},d={};function l(e){if(!e)throw new Error("All runtime objects require an agent identifier!");if(!d[e])throw new Error("Runtime for ".concat(e," was never set"));return d[e]}function f(e,t){if(!e)throw new Error("All runtime objects require an agent identifier!");d[e]={...(0,n.a)(t,u),...c},Object.hasOwnProperty.call(d[e],"harvestCount")||Object.defineProperty(d[e],"harvestCount",{get:()=>++s});const r=(0,i.nY)(e);r&&(r.runtime=d[e])}},9324:(e,t,r)=>{"use strict";r.d(t,{F3:()=>i,Xs:()=>o,xv:()=>n});const n="1.274.0",i="PROD",o="CDN"},6154:(e,t,r)=>{"use strict";r.d(t,{OF:()=>c,RI:()=>i,WN:()=>d,bv:()=>o,gm:()=>a,mw:()=>s,sb:()=>u});var n=r(1863);const i="undefined"!=typeof window&&!!window.document,o="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),a=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),s=Boolean("hidden"===a?.document?.visibilityState),c=/iPad|iPhone|iPod/.test(a.navigator?.userAgent),u=c&&"undefined"==typeof SharedWorker,d=((()=>{const e=a.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);Array.isArray(e)&&e.length>=2&&e[1]})(),Date.now()-(0,n.t)())},1687:(e,t,r)=>{"use strict";r.d(t,{Ak:()=>c,Ze:()=>l,x3:()=>u});var n=r(7836),i=r(3606),o=r(860),a=r(2646);const s={};function c(e,t){const r={staged:!1,priority:o.P3[t]||0};d(e),s[e].get(t)||s[e].set(t,r)}function u(e,t){e&&s[e]&&(s[e].get(t)&&s[e].delete(t),g(e,t,!1),s[e].size&&f(e))}function d(e){if(!e)throw new Error("agentIdentifier required");s[e]||(s[e]=new Map)}function l(e="",t="feature",r=!1){if(d(e),!e||!s[e].get(t)||r)return g(e,t);s[e].get(t).staged=!0,f(e)}function f(e){const t=Array.from(s[e]);t.every((([e,t])=>t.staged))&&(t.sort(((e,t)=>e[1].priority-t[1].priority)),t.forEach((([t])=>{s[e].delete(t),g(e,t)})))}function g(e,t,r=!0){const o=e?n.ee.get(e):n.ee,s=i.i.handlers;if(!o.aborted&&o.backlog&&s){if(r){const e=o.backlog[t],r=s[t];if(r){for(let t=0;e&&t<e.length;++t)p(e[t],r);Object.entries(r).forEach((([e,t])=>{Object.values(t||{}).forEach((t=>{t[0]?.on&&t[0]?.context()instanceof a.y&&t[0].on(e,t[1])}))}))}}o.isolatedBacklog||delete s[t],o.backlog[t]=null,o.emit("drain-"+t,[])}}function p(e,t){var r=e[1];Object.values(t[r]||{}).forEach((t=>{var r=e[0];if(t[0]===r){var n=t[1],i=e[3],o=e[2];n.apply(i,o)}}))}},7836:(e,t,r)=>{"use strict";r.d(t,{P:()=>c,ee:()=>u});var n=r(384),i=r(8990),o=r(3371),a=r(2646),s=r(5607);const c="nr@context:".concat(s.W),u=function e(t,r){var n={},s={},d={},l=!1;try{l=16===r.length&&(0,o.f)(r).isolatedBacklog}catch(e){}var f={on:p,addEventListener:p,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,o){!1!==o&&(o=!0);if(u.aborted&&!i)return;t&&o&&t.emit(e,r,n);for(var a=g(n),c=h(e),d=c.length,l=0;l<d;l++)c[l].apply(a,r);var p=m()[s[e]];p&&p.push([f,e,r,a]);return a},get:v,listeners:h,context:g,buffer:function(e,t){const r=m();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach((([e,n])=>{s[n]=t,t in r||(r[t]=[])}))},abort:function(){f._aborted=!0,Object.keys(f.backlog).forEach((e=>{delete f.backlog[e]}))},isBuffering:function(e){return!!m()[s[e]]},debugId:r,backlog:l?{}:t&&"object"==typeof t.backlog?t.backlog:{},isolatedBacklog:l};return Object.defineProperty(f,"aborted",{get:()=>{let e=f._aborted||!1;return e||(t&&(e=t.aborted),e)}}),f;function g(e){return e&&e instanceof a.y?e:e?(0,i.I)(e,c,(()=>new a.y(c))):new a.y(c)}function p(e,t){n[e]=h(e).concat(t)}function h(e){return n[e]||[]}function v(t){return d[t]=d[t]||e(f,t)}function m(){return f.backlog}}(void 0,"globalEE"),d=(0,n.Zm)();d.ee||(d.ee=u)},2646:(e,t,r)=>{"use strict";r.d(t,{y:()=>n});class n{constructor(e){this.contextId=e}}},9908:(e,t,r)=>{"use strict";r.d(t,{d:()=>n,p:()=>i});var n=r(7836).ee.get("handle");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},3606:(e,t,r)=>{"use strict";r.d(t,{i:()=>o});var n=r(9908);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.d,i,e,t,r)}function a(e,t,r,i,o){o||(o="feature"),e||(e=n.d);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},3878:(e,t,r)=>{"use strict";function n(e,t){return{capture:e,passive:!1,signal:t}}function i(e,t,r=!1,i){window.addEventListener(e,t,n(r,i))}function o(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>o,jT:()=>n,sp:()=>i})},5607:(e,t,r)=>{"use strict";r.d(t,{W:()=>n});const n=(0,r(9566).bz)()},9566:(e,t,r)=>{"use strict";r.d(t,{LA:()=>s,bz:()=>a});var n=r(6154);const i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";function o(e,t){return e?15&e[t]:16*Math.random()|0}function a(){const e=n.gm?.crypto||n.gm?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(30))),i.split("").map((e=>"x"===e?o(t,r++).toString(16):"y"===e?(3&o()|8).toString(16):e)).join("")}function s(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,i=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const a=[];for(var s=0;s<e;s++)a.push(o(r,i++).toString(16));return a.join("")}},2614:(e,t,r)=>{"use strict";r.d(t,{BB:()=>a,H3:()=>n,g:()=>u,iL:()=>c,tS:()=>s,uh:()=>i,wk:()=>o});const n="NRBA",i="SESSION",o=144e5,a=18e5,s={STARTED:"session-started",PAUSE:"session-pause",RESET:"session-reset",RESUME:"session-resume",UPDATE:"session-update"},c={SAME_TAB:"same-tab",CROSS_TAB:"cross-tab"},u={OFF:0,FULL:1,ERROR:2}},1863:(e,t,r)=>{"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},944:(e,t,r)=>{"use strict";function n(e,t){"function"==typeof console.debug&&console.debug("New Relic Warning: https://github.com/newrelic/newrelic-browser-agent/blob/main/docs/warning-codes.md#".concat(e),t)}r.d(t,{R:()=>n})},5284:(e,t,r)=>{"use strict";r.d(t,{t:()=>c,B:()=>s});var n=r(7836),i=r(6154);const o="newrelic";const a=new Set,s={};function c(e,t){const r=n.ee.get(t);s[t]??={},e&&"object"==typeof e&&(a.has(t)||(r.emit("rumresp",[e]),s[t]=e,a.add(t),function(e={}){try{i.gm.dispatchEvent(new CustomEvent(o,{detail:e}))}catch(e){}}({loaded:!0})))}},8990:(e,t,r)=>{"use strict";r.d(t,{I:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},6389:(e,t,r)=>{"use strict";function n(e,t=500,r={}){const n=r?.leading||!1;let i;return(...r)=>{n&&void 0===i&&(e.apply(this,r),i=setTimeout((()=>{i=clearTimeout(i)}),t)),n||(clearTimeout(i),i=setTimeout((()=>{e.apply(this,r)}),t))}}function i(e){let t=!1;return(...r)=>{t||(t=!0,e.apply(this,r))}}r.d(t,{J:()=>i,s:()=>n})},5289:(e,t,r)=>{"use strict";r.d(t,{GG:()=>o,sB:()=>a});var n=r(3878);function i(){return"undefined"==typeof document||"complete"===document.readyState}function o(e,t){if(i())return e();(0,n.sp)("load",e,t)}function a(e){if(i())return e();(0,n.DD)("DOMContentLoaded",e)}},384:(e,t,r)=>{"use strict";r.d(t,{NT:()=>o,US:()=>d,Zm:()=>a,bQ:()=>c,dV:()=>s,nY:()=>u,pV:()=>l});var n=r(6154),i=r(1863);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function a(){return n.gm.NREUM||(n.gm.NREUM={}),void 0===n.gm.newrelic&&(n.gm.newrelic=n.gm.NREUM),n.gm.NREUM}function s(){let e=a();return e.o||(e.o={ST:n.gm.setTimeout,SI:n.gm.setImmediate,CT:n.gm.clearTimeout,XHR:n.gm.XMLHttpRequest,REQ:n.gm.Request,EV:n.gm.Event,PR:n.gm.Promise,MO:n.gm.MutationObserver,FETCH:n.gm.fetch,WS:n.gm.WebSocket}),e}function c(e,t){let r=a();r.initializedAgents??={},t.initializedAt={ms:(0,i.t)(),date:new Date},r.initializedAgents[e]=t}function u(e){let t=a();return t.initializedAgents?.[e]}function d(e,t){a()[e]=t}function l(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},2843:(e,t,r)=>{"use strict";r.d(t,{u:()=>i});var n=r(3878);function i(e,t=!1,r,i){(0,n.DD)("visibilitychange",(function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)}),r,i)}},3434:(e,t,r)=>{"use strict";r.d(t,{YM:()=>c});var n=r(7836),i=r(5607);const o="nr@original:".concat(i.W);var a=Object.prototype.hasOwnProperty,s=!1;function c(e,t){return e||(e=n.ee),r.inPlace=function(e,t,n,i,o){n||(n="");const a="-"===n.charAt(0);for(let s=0;s<t.length;s++){const c=t[s],u=e[c];d(u)||(e[c]=r(u,a?c+n:n,i,c,o))}},r.flag=o,r;function r(t,r,n,s,c){return d(t)?t:(r||(r=""),nrWrapper[o]=t,function(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach((function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})})),t}catch(e){u([e],r)}for(var n in e)a.call(e,n)&&(t[n]=e[n])}(t,nrWrapper,e),nrWrapper);function nrWrapper(){var o,a,d,l;try{a=this,o=[...arguments],d="function"==typeof n?n(o,a):n||{}}catch(t){u([t,"",[o,a,s],d],e)}i(r+"start",[o,a,s],d,c);try{return l=t.apply(a,o)}catch(e){throw i(r+"err",[o,a,e],d,c),e}finally{i(r+"end",[o,a,l],d,c)}}}function i(r,n,i,o){if(!s||t){var a=s;s=!0;try{e.emit(r,n,i,t,o)}catch(t){u([t,r,n,i],e)}s=a}}}function u(e,t){t||(t=n.ee);try{t.emit("internal-error",e)}catch(e){}}function d(e){return!(e&&"function"==typeof e&&e.apply&&!e[o])}},993:(e,t,r)=>{"use strict";r.d(t,{ET:()=>o,p_:()=>i});var n=r(860);const i={ERROR:"ERROR",WARN:"WARN",INFO:"INFO",DEBUG:"DEBUG",TRACE:"TRACE"},o="log";n.K7.logging},3969:(e,t,r)=>{"use strict";r.d(t,{TZ:()=>n,XG:()=>s,rs:()=>i,xV:()=>a,z_:()=>o});const n=r(860).K7.metrics,i="sm",o="cm",a="storeSupportabilityMetrics",s="storeEventMetrics"},6630:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewEvent},782:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewTiming},6344:(e,t,r)=>{"use strict";r.d(t,{G4:()=>i});var n=r(2614);r(860).K7.sessionReplay;const i={RECORD:"recordReplay",PAUSE:"pauseReplay",REPLAY_RUNNING:"replayRunning",ERROR_DURING_REPLAY:"errorDuringReplay"};n.g.ERROR,n.g.FULL,n.g.OFF},4234:(e,t,r)=>{"use strict";r.d(t,{W:()=>o});var n=r(7836),i=r(1687);class o{constructor(e,t){this.agentIdentifier=e,this.ee=n.ee.get(e),this.featureName=t,this.blocked=!1}deregisterDrain(){(0,i.x3)(this.agentIdentifier,this.featureName)}}},7603:(e,t,r)=>{"use strict";r.d(t,{j:()=>P});var n=r(860),i=r(2555),o=r(3371),a=r(9908),s=r(7836),c=r(1687),u=r(5289),d=r(6154),l=r(944),f=r(3969),g=r(384),p=r(6344);const h=["setErrorHandler","finished","addToTrace","addRelease","addPageAction","setCurrentRouteName","setPageViewName","setCustomAttribute","interaction","noticeError","setUserId","setApplicationVersion","start",p.G4.RECORD,p.G4.PAUSE,"log","wrapLogger"],v=["setErrorHandler","finished","addToTrace","addRelease"];var m=r(1863),b=r(2614),y=r(993);var w=r(2646),A=r(3434);function R(e,t,r,n){if("object"!=typeof t||!t||"string"!=typeof r||!r||"function"!=typeof t[r])return(0,l.R)(29);const i=function(e){return(e||s.ee).get("logger")}(e),o=(0,A.YM)(i),a=new w.y(s.P);return a.level=n.level,a.customAttributes=n.customAttributes,o.inPlace(t,[r],"wrap-logger-",a),i}function E(){const e=(0,g.pV)();h.forEach((t=>{e[t]=(...r)=>function(t,...r){let n=[];return Object.values(e.initializedAgents).forEach((e=>{e&&e.api?e.exposed&&e.api[t]&&n.push(e.api[t](...r)):(0,l.R)(38,t)})),n.length>1?n:n[0]}(t,...r)}))}const x={};function _(e,t,g=!1){t||(0,c.Ak)(e,"api");const h={};var w=s.ee.get(e),A=w.get("tracer");x[e]=b.g.OFF,w.on(p.G4.REPLAY_RUNNING,(t=>{x[e]=t}));var E="api-",_=E+"ixn-";function N(t,r,n,o){const a=(0,i.Vp)(e);return null===r?delete a.jsAttributes[t]:(0,i.x1)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),j(E,n,!0,o||null===r?"session":void 0)(t,r)}function T(){}h.log=function(e,{customAttributes:t={},level:r=y.p_.INFO}={}){(0,a.p)(f.xV,["API/log/called"],void 0,n.K7.metrics,w),function(e,t,r={},i=y.p_.INFO){(0,a.p)(f.xV,["API/logging/".concat(i.toLowerCase(),"/called")],void 0,n.K7.metrics,e),(0,a.p)(y.ET,[(0,m.t)(),t,r,i],void 0,n.K7.logging,e)}(w,e,t,r)},h.wrapLogger=(e,t,{customAttributes:r={},level:i=y.p_.INFO}={})=>{(0,a.p)(f.xV,["API/wrapLogger/called"],void 0,n.K7.metrics,w),R(w,e,t,{customAttributes:r,level:i})},v.forEach((e=>{h[e]=j(E,e,!0,"api")})),h.addPageAction=j(E,"addPageAction",!0,n.K7.genericEvents),h.setPageViewName=function(t,r){if("string"==typeof t)return"/"!==t.charAt(0)&&(t="/"+t),(0,o.f)(e).customTransaction=(r||"http://custom.transaction")+t,j(E,"setPageViewName",!0)()},h.setCustomAttribute=function(e,t,r=!1){if("string"==typeof e){if(["string","number","boolean"].includes(typeof t)||null===t)return N(e,t,"setCustomAttribute",r);(0,l.R)(40,typeof t)}else(0,l.R)(39,typeof e)},h.setUserId=function(e){if("string"==typeof e||null===e)return N("enduser.id",e,"setUserId",!0);(0,l.R)(41,typeof e)},h.setApplicationVersion=function(e){if("string"==typeof e||null===e)return N("application.version",e,"setApplicationVersion",!1);(0,l.R)(42,typeof e)},h.start=()=>{try{(0,a.p)(f.xV,["API/start/called"],void 0,n.K7.metrics,w),w.emit("manual-start-all")}catch(e){(0,l.R)(23,e)}},h[p.G4.RECORD]=function(){(0,a.p)(f.xV,["API/recordReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.RECORD,[],void 0,n.K7.sessionReplay,w)},h[p.G4.PAUSE]=function(){(0,a.p)(f.xV,["API/pauseReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.PAUSE,[],void 0,n.K7.sessionReplay,w)},h.interaction=function(e){return(new T).get("object"==typeof e?e:{})};const S=T.prototype={createTracer:function(e,t){var r={},i=this,o="function"==typeof t;return(0,a.p)(f.xV,["API/createTracer/called"],void 0,n.K7.metrics,w),g||(0,a.p)(_+"tracer",[(0,m.t)(),e,r],i,n.K7.spa,w),function(){if(A.emit((o?"":"no-")+"fn-start",[(0,m.t)(),i,o],r),o)try{return t.apply(this,arguments)}catch(e){const t="string"==typeof e?new Error(e):e;throw A.emit("fn-err",[arguments,this,t],r),t}finally{A.emit("fn-end",[(0,m.t)()],r)}}}};function j(e,t,r,i){return function(){return(0,a.p)(f.xV,["API/"+t+"/called"],void 0,n.K7.metrics,w),i&&(0,a.p)(e+t,[(0,m.t)(),...arguments],r?null:this,i,w),r?void 0:this}}function k(){r.e(296).then(r.bind(r,8778)).then((({setAPI:t})=>{t(e),(0,c.Ze)(e,"api")})).catch((e=>{(0,l.R)(27,e),w.abort()}))}return["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach((e=>{S[e]=j(_,e,void 0,g?n.K7.softNav:n.K7.spa)})),h.setCurrentRouteName=g?j(_,"routeName",void 0,n.K7.softNav):j(E,"routeName",!0,n.K7.spa),h.noticeError=function(t,r){"string"==typeof t&&(t=new Error(t)),(0,a.p)(f.xV,["API/noticeError/called"],void 0,n.K7.metrics,w),(0,a.p)("err",[t,(0,m.t)(),!1,r,!!x[e]],void 0,n.K7.jserrors,w)},d.RI?(0,u.GG)((()=>k()),!0):k(),h}var N=r(9417),T=r(8122);const S={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0},j={};var k=r(5284);const I=e=>{const t=e.startsWith("http");e+="/",r.p=t?e:"https://"+e};let O=!1;function P(e,t={},r,n){let{init:a,info:c,loader_config:u,runtime:l={},exposed:f=!0}=t;l.loaderType=r;const p=(0,g.pV)();c||(a=p.init,c=p.info,u=p.loader_config),(0,N.xN)(e.agentIdentifier,a||{}),function(e,t){if(!e)throw new Error("All loader-config objects require an agent identifier!");j[e]=(0,T.a)(t,S);const r=(0,g.nY)(e);r&&(r.loader_config=j[e])}(e.agentIdentifier,u||{}),c.jsAttributes??={},d.bv&&(c.jsAttributes.isWorker=!0),(0,i.x1)(e.agentIdentifier,c);const h=(0,N.D0)(e.agentIdentifier),v=[c.beacon,c.errorBeacon];O||(h.proxy.assets&&(I(h.proxy.assets),v.push(h.proxy.assets)),h.proxy.beacon&&v.push(h.proxy.beacon),E(),(0,g.US)("activatedFeatures",k.B),e.runSoftNavOverSpa&&=!0===h.soft_navigations.enabled&&h.feature_flags.includes("soft_nav")),l.denyList=[...h.ajax.deny_list||[],...h.ajax.block_internal?v:[]],l.ptid=e.agentIdentifier,(0,o.V)(e.agentIdentifier,l),e.ee=s.ee.get(e.agentIdentifier),void 0===e.api&&(e.api=_(e.agentIdentifier,n,e.runSoftNavOverSpa)),void 0===e.exposed&&(e.exposed=f),O=!0}},8374:(e,t,r)=>{r.nc=(()=>{try{return document?.currentScript?.nonce}catch(e){}return""})()},860:(e,t,r)=>{"use strict";r.d(t,{$J:()=>o,K7:()=>n,P3:()=>i});const n={ajax:"ajax",genericEvents:"generic_events",jserrors:"jserrors",logging:"logging",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",softNav:"soft_navigations",spa:"spa"},i={[n.pageViewEvent]:1,[n.pageViewTiming]:2,[n.metrics]:3,[n.jserrors]:4,[n.spa]:5,[n.ajax]:6,[n.sessionTrace]:7,[n.softNav]:8,[n.sessionReplay]:9,[n.logging]:10,[n.genericEvents]:11},o={[n.pageViewTiming]:"events",[n.ajax]:"events",[n.spa]:"events",[n.softNav]:"events",[n.metrics]:"jserrors",[n.jserrors]:"jserrors",[n.sessionTrace]:"browser/blobs",[n.sessionReplay]:"browser/blobs",[n.logging]:"browser/logs",[n.genericEvents]:"ins"}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>"nr-rum-1.274.0.min.js",i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="NRBA-1.274.0.PROD:",i.l=(r,n,o,a)=>{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var u=document.getElementsByTagName("script"),d=0;d<u.length;d++){var l=u[d];if(l.getAttribute("src")==r||l.getAttribute("data-webpack")==t+o){s=l;break}}if(!s){c=!0;var f={296:"sha512-gkYkZDAwQ9PwaDXs2YM+rNIdRej1Ac1mupWobRJ8eahQcXz6/sunGZCKklrzi5kWxhOGRZr2tn0rEKuLTXzfAA=="};(s=document.createElement("script")).charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.setAttribute("data-webpack",t+o),s.src=r,0!==s.src.indexOf(window.location.origin+"/")&&(s.crossOrigin="anonymous"),f[a]&&(s.integrity=f[a])}e[r]=[n];var g=(t,n)=>{s.onerror=s.onload=null,clearTimeout(p);var i=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach((e=>e(n))),t)return t(n)},p=setTimeout(g.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=g.bind(null,s.onerror),s.onload=g.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="https://js-agent.newrelic.com/",(()=>{var e={840:0,374:0};i.f.j=(t,r)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=>n=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+a+")",s.name="ChunkLoadError",s.type=o,s.request=a,n[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,o,[a,s,c]=r,u=0;if(a.some((t=>0!==e[t]))){for(n in s)i.o(s,n)&&(i.m[n]=s[n]);if(c)c(i)}for(t&&t(r);u<a.length;u++)o=a[u],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=self["webpackChunk:NRBA-1.274.0.PROD"]=self["webpackChunk:NRBA-1.274.0.PROD"]||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{"use strict";i(8374);var e=i(944),t=i(6344),r=i(9566);class n{agentIdentifier;constructor(e=(0,r.LA)(16)){this.agentIdentifier=e}#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}addPageAction(e,t){return this.#e("addPageAction",e,t)}setPageViewName(e,t){return this.#e("setPageViewName",e,t)}setCustomAttribute(e,t,r){return this.#e("setCustomAttribute",e,t,r)}noticeError(e,t){return this.#e("noticeError",e,t)}setUserId(e){return this.#e("setUserId",e)}setApplicationVersion(e){return this.#e("setApplicationVersion",e)}setErrorHandler(e){return this.#e("setErrorHandler",e)}addRelease(e,t){return this.#e("addRelease",e,t)}log(e,t){return this.#e("log",e,t)}}class o extends n{#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}start(){return this.#e("start")}finished(e){return this.#e("finished",e)}recordReplay(){return this.#e(t.G4.RECORD)}pauseReplay(){return this.#e(t.G4.PAUSE)}addToTrace(e){return this.#e("addToTrace",e)}setCurrentRouteName(e){return this.#e("setCurrentRouteName",e)}interaction(){return this.#e("interaction")}wrapLogger(e,t,r){return this.#e("wrapLogger",e,t,r)}}var a=i(860),s=i(9417);const c=Object.values(a.K7);function u(e){const t={};return c.forEach((r=>{t[r]=function(e,t){return!0===(0,s.gD)(t,"".concat(e,".enabled"))}(r,e)})),t}var d=i(7603);var l=i(1687),f=i(4234),g=i(5289),p=i(6154),h=i(384);const v=e=>p.RI&&!0===(0,s.gD)(e,"privacy.cookies_enabled");function m(e){return!!(0,h.dV)().o.MO&&v(e)&&!0===(0,s.gD)(e,"session_trace.enabled")}var b=i(6389);class y extends f.W{constructor(e,t,r=!0){super(e.agentIdentifier,t),this.auto=r,this.abortHandler=void 0,this.featAggregate=void 0,this.onAggregateImported=void 0,!1===e.init[this.featureName].autoStart&&(this.auto=!1),this.auto?(0,l.Ak)(e.agentIdentifier,t):this.ee.on("manual-start-all",(0,b.J)((()=>{(0,l.Ak)(e.agentIdentifier,this.featureName),this.auto=!0,this.importAggregator(e)})))}importAggregator(t,r={}){if(this.featAggregate||!this.auto)return;let n;this.onAggregateImported=new Promise((e=>{n=e}));const o=async()=>{let o;try{if(v(this.agentIdentifier)){const{setupAgentSession:e}=await i.e(296).then(i.bind(i,3861));o=e(t)}}catch(t){(0,e.R)(20,t),this.ee.emit("internal-error",[t]),this.featureName===a.K7.sessionReplay&&this.abortHandler?.()}try{if(t.sharedAggregator)await t.sharedAggregator;else{t.sharedAggregator=i.e(296).then(i.bind(i,9337));const{EventAggregator:e}=await t.sharedAggregator;t.sharedAggregator=new e}if(!this.#t(this.featureName,o))return(0,l.Ze)(this.agentIdentifier,this.featureName),void n(!1);const{lazyFeatureLoader:e}=await i.e(296).then(i.bind(i,6103)),{Aggregate:a}=await e(this.featureName,"aggregate");this.featAggregate=new a(t,r),n(!0)}catch(t){(0,e.R)(34,t),this.abortHandler?.(),(0,l.Ze)(this.agentIdentifier,this.featureName,!0),n(!1),this.ee&&this.ee.abort()}};p.RI?(0,g.GG)((()=>o()),!0):o()}#t(e,t){switch(e){case a.K7.sessionReplay:return m(this.agentIdentifier)&&!!t;case a.K7.sessionTrace:return!!t;default:return!0}}}var w=i(6630);class A extends y{static featureName=w.T;constructor(e,t=!0){super(e,w.T,t),this.importAggregator(e)}}var R=i(9908),E=i(2843),x=i(3878),_=i(782),N=i(1863);class T extends y{static featureName=_.T;constructor(e,t=!0){super(e,_.T,t),p.RI&&((0,E.u)((()=>(0,R.p)("docHidden",[(0,N.t)()],void 0,_.T,this.ee)),!0),(0,x.sp)("pagehide",(()=>(0,R.p)("winPagehide",[(0,N.t)()],void 0,_.T,this.ee))),this.importAggregator(e))}}var S=i(3969);class j extends y{static featureName=S.TZ;constructor(e,t=!0){super(e,S.TZ,t),this.importAggregator(e)}}new class extends o{constructor(t,r){super(r),p.gm?(this.features={},(0,h.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(t.features||[]),this.desiredFeatures.add(A),this.runSoftNavOverSpa=[...this.desiredFeatures].some((e=>e.featureName===a.K7.softNav)),(0,d.j)(this,t,t.loaderType||"agent"),this.run()):(0,e.R)(21)}get config(){return{info:this.info,init:this.init,loader_config:this.loader_config,runtime:this.runtime}}run(){try{const t=u(this.agentIdentifier),r=[...this.desiredFeatures];r.sort(((e,t)=>a.P3[e.featureName]-a.P3[t.featureName])),r.forEach((r=>{if(!t[r.featureName]&&r.featureName!==a.K7.pageViewEvent)return;if(this.runSoftNavOverSpa&&r.featureName===a.K7.spa)return;if(!this.runSoftNavOverSpa&&r.featureName===a.K7.softNav)return;const n=function(e){switch(e){case a.K7.ajax:return[a.K7.jserrors];case a.K7.sessionTrace:return[a.K7.ajax,a.K7.pageViewEvent];case a.K7.sessionReplay:return[a.K7.sessionTrace];case a.K7.pageViewTiming:return[a.K7.pageViewEvent];default:return[]}}(r.featureName).filter((e=>!(e in this.features)));n.length>0&&(0,e.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)}))}catch(t){(0,e.R)(22,t);for(const e in this.features)this.features[e].abortHandler?.();const r=(0,h.Zm)();delete r.initializedAgents[this.agentIdentifier]?.api,delete r.initializedAgents[this.agentIdentifier]?.features,delete this.sharedAggregator;return r.ee.get(this.agentIdentifier).abort(),!1}}}({features:[A,T,j],loaderType:"lite"})})()})();</script> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="profile" href="https://gmpg.org/xfn/11"> <meta name='robots' content='max-image-preview:large, index,follow' /> <style> :root { --advertisement-label-text: "advertisement"; } </style> <script> window._sp_analytics = { config: { accountId: 146, events: { onDetectionComplete: function() { console.log('onMessageReady'); } }, } }; </script> <!-- This site is optimized with the Yoast SEO Premium plugin v22.8 (Yoast SEO v23.3) - https://yoast.com/wordpress/plugins/seo/ --> <title>Software Development | InfoWorld</title> <meta name="twitter:label1" content="Written by" /> <meta name="twitter:data1" content="Amy Bennett" /> <!-- / Yoast SEO Premium plugin. --> <link rel='dns-prefetch' href='//cdn.onthe.io' /> <link rel="alternate" type="application/rss+xml" title="InfoWorld &raquo; Feed" href="https://www.infoworld.com/feed/" /> <link rel="alternate" type="application/rss+xml" title="InfoWorld &raquo; Comments Feed" href="https://www.infoworld.com/comments/feed/" /> <link rel='stylesheet' id='wp-block-library-css' href='https://www.infoworld.com/wp-includes/css/dist/block-library/style.min.css?ver=6.6.2' media='all' /> <style id='co-authors-plus-coauthors-style-inline-css'> .wp-block-co-authors-plus-coauthors.is-layout-flow [class*=wp-block-co-authors-plus]{display:inline} </style> <style id='co-authors-plus-avatar-style-inline-css'> .wp-block-co-authors-plus-avatar :where(img){height:auto;max-width:100%;vertical-align:bottom}.wp-block-co-authors-plus-coauthors.is-layout-flow .wp-block-co-authors-plus-avatar :where(img){vertical-align:middle}.wp-block-co-authors-plus-avatar:is(.alignleft,.alignright){display:table}.wp-block-co-authors-plus-avatar.aligncenter{display:table;margin-inline:auto} </style> <style id='co-authors-plus-image-style-inline-css'> .wp-block-co-authors-plus-image{margin-bottom:0}.wp-block-co-authors-plus-image :where(img){height:auto;max-width:100%;vertical-align:bottom}.wp-block-co-authors-plus-coauthors.is-layout-flow .wp-block-co-authors-plus-image :where(img){vertical-align:middle}.wp-block-co-authors-plus-image:is(.alignfull,.alignwide) :where(img){width:100%}.wp-block-co-authors-plus-image:is(.alignleft,.alignright){display:table}.wp-block-co-authors-plus-image.aligncenter{display:table;margin-inline:auto} </style> <style id='elasticpress-facet-style-inline-css'> .widget_ep-facet input[type=search],.wp-block-elasticpress-facet input[type=search]{margin-bottom:1rem}.widget_ep-facet .searchable .inner,.wp-block-elasticpress-facet .searchable .inner{max-height:20em;overflow:scroll}.widget_ep-facet .term.hide,.wp-block-elasticpress-facet .term.hide{display:none}.widget_ep-facet .empty-term,.wp-block-elasticpress-facet .empty-term{opacity:.5;position:relative}.widget_ep-facet .empty-term:after,.wp-block-elasticpress-facet .empty-term:after{bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0;width:100%;z-index:2}.widget_ep-facet .level-1,.wp-block-elasticpress-facet .level-1{padding-left:20px}.widget_ep-facet .level-2,.wp-block-elasticpress-facet .level-2{padding-left:40px}.widget_ep-facet .level-3,.wp-block-elasticpress-facet .level-3{padding-left:60px}.widget_ep-facet .level-4,.wp-block-elasticpress-facet .level-4{padding-left:5pc}.widget_ep-facet .level-5,.wp-block-elasticpress-facet .level-5{padding-left:75pt}.widget_ep-facet input[disabled],.wp-block-elasticpress-facet input[disabled]{cursor:pointer;opacity:1}.widget_ep-facet .term a,.wp-block-elasticpress-facet .term a{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.widget_ep-facet .term a:hover .ep-checkbox,.wp-block-elasticpress-facet .term a:hover .ep-checkbox{background-color:#ccc}.ep-checkbox{-webkit-box-align:center;-ms-flex-align:center;-ms-flex-negative:0;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background-color:#eee;display:-webkit-box;display:-ms-flexbox;display:flex;flex-shrink:0;height:1em;justify-content:center;margin-right:.25em;width:1em}.ep-checkbox:after{border:solid #fff;border-width:0 .125em .125em 0;content:"";display:none;height:.5em;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:.25em}.ep-checkbox.checked{background-color:#5e5e5e}.ep-checkbox.checked:after{display:block} </style> <link rel='stylesheet' id='elasticpress-related-posts-block-css' href='https://www.infoworld.com/wp-content/mu-plugins/search/elasticpress/dist/css/related-posts-block-styles.min.css?ver=4.2.2' media='all' /> <style id='classic-theme-styles-inline-css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <style id='global-styles-inline-css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} </style> <link rel='stylesheet' id='editions-desktop-css' href='https://www.infoworld.com/wp-content/client-mu-plugins/idg-editions/dist/styles/main.css?ver=0.1.0' media='all' /> <link rel='stylesheet' id='third-party-integrations-style-css' href='https://www.infoworld.com/wp-content/client-mu-plugins/idg-third-party/dist/styles/index.css?ver=1731995985' media='all' /> <link rel='stylesheet' id='frontend-jwplayer-styles-css' href='https://www.infoworld.com/wp-content/themes/idg-b2b-base-theme/dist/styles/jwplayer.css?ver=1731995985' media='all' /> <link rel='stylesheet' id='frontend-shared-styles-css' href='https://www.infoworld.com/wp-content/themes/idg-b2b-base-theme/dist/styles/shared.css?ver=1731995985' media='all' /> <link rel='stylesheet' id='frontend-styles-css' href='https://www.infoworld.com/wp-content/themes/idg-b2b-base-theme/dist/styles/bundle.css?ver=1731995985' media='all' /> <link rel='stylesheet' id='iw-amp-styles-css' href='https://www.infoworld.com/wp-content/themes/iw-b2b-child-theme/dist/styles/amp.css?ver=1731995986' media='all' /> <script type="text/javascript" src="https://www.infoworld.com/wp-includes/js/dist/hooks.min.js?m=1732206009g" ></script><script src="https://www.infoworld.com/wp-includes/js/dist/i18n.min.js?ver=5e580eb46a90c2b997e6" id="wp-i18n-js"></script> <script id="wp-i18n-js-after"> wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); </script> <script type="text/javascript" src="https://www.infoworld.com/wp-content/client-mu-plugins/idg-editions/dist/scripts/editions-front.js?m=1731995985g" ></script><script id="third-party-integrations-script-js-extra"> var IDG = {"settings":{"cmp":{"account":{"id":"146","base_endpoint":"https:\/\/cmpv2.infoworld.com","href":"https:\/\/www.infoworld.com","is_cp_multi_campaign_enabled":true},"gdpr":{"script":"https:\/\/cmpv2.infoworld.com\/unified\/wrapperMessagingWithoutDetection.js","privacy_manager_id":"165662","property_id":"9220","privacy_manager_id_amp":"172450","href_amp":"https:\/\/amp.infoworld.com"},"ccpa":{"script":"https:\/\/ccpa.sp-prod.net\/ccpa.js","origin":"https:\/\/ccpa-service.sp-prod.net","privacy_manager_id":"1098540","privacy_manager_uuid":"5dfa75f712068b42714ed7b8","property_id":"16077","href_amp":"https:\/\/ccpa.amp.infoworld.com"}},"gtm":{"account":{"id":"GTM-5JGZ3LH","amp_id":"","ua_number":"UA-6647659-1"}},"gpt":{"consent":{"vendor_id":"5e74df5ff443bb795772df9c"},"config":{"prefix":"\/8456\/IDG.G_B2B_InfoWorld.com\/","threshold":"0.7","slots":[{"name":"gpt-leaderboard","template":"banner","disabled":false,"sticky_duration":"12","pos":"ATF1","size":"728x90","size_definitions":[{"breakpoint":"970","sizes":"728x90"},{"breakpoint":"728","sizes":"728x90"},{"breakpoint":"320","sizes":"300x50,320x50"}],"insert_after_p":"1"},{"name":"gpt-leaderboardmainbod","template":"article","disabled":false,"refresh_interval":"15","refresh_amount":"6","size":"300x50","pos":"BTF{{count}}","size_definitions":[{"breakpoint":"970","sizes":"970x250,728x90,300x250"},{"breakpoint":"728","sizes":"728x90,300x250"},{"breakpoint":"320","sizes":"300x50,320x50,300x250"}],"page_template":[{"custom_template":"Homepage","desktop":"3,10","mobile":"3,10","feed_v2_articlelisting":[{"feed_v2":"Feed-V2","desktop":"3,5,9","mobile":"3,5,9","block_name":"feed_v2"}]},{"custom_template":"Article","desktop":"3,6,9,12,15,18,21,24,27,30,33,36,40","mobile":"3,6,9,12,15,18,21,24,27,30,33,36,40","feed_v2_articlelisting":[{"feed_v2":"Feed-V2","desktop":"3,5,9","mobile":"3,5,9","block_name":"feed_v2"}]},{"custom_template":"Archive","desktop":"0","mobile":"0","feed_v2_articlelisting":[{"feed_v2":"Feed-V2","desktop":"3,5,9","mobile":"3,5,9","block_name":"feed_v2"}]},{"custom_template":"Topic landing page","desktop":"3,9","mobile":"3,9","feed_v2_articlelisting":[{"feed_v2":"Feed-V2","desktop":"3,5,9","mobile":"3,5,9","block_name":"feed_v2"}]}],"insert_after_p":"1"},{"name":"gpt-rightrail","template":"right_rail","disabled":false,"size":"120x600","section":"Sidebardfpatf{{count}}","pos":"BTF{{count}}","size_definitions":[{"breakpoint":"970","sizes":"300x250,300x600,160x600,120x600"},{"breakpoint":"728","sizes":""},{"breakpoint":"320","sizes":""}],"insert_after_p":"1"},{"name":"gpt-oc_ad_1","template":"oc_ad_1","disabled":false,"size":"7x7","pos":"ATF1","size_definitions":[{"breakpoint":"970","sizes":"7x7"},{"breakpoint":"728","sizes":"7x7"},{"breakpoint":"320","sizes":"7x7"}],"insert_after_p":"1"},{"name":"gpt-topimu","template":"topimu","disabled":false,"size":"300x50","pos":"ATF1","size_definitions":[{"breakpoint":"970","sizes":"300x250,300x600,160x600,120x600"},{"breakpoint":"728","sizes":""},{"breakpoint":"320","sizes":""}],"insert_after_p":"1"},{"name":"gpt-overlay","template":"overlay","disabled":false,"size":"640x480","pos":"gpt-overlay","size_definitions":[{"breakpoint":"970","sizes":"640x480"},{"breakpoint":"728","sizes":"640x480"},{"breakpoint":"320","sizes":""}],"insert_after_p":"1"},{"name":"gpt-skin","template":"skin","disabled":false,"size":"1x1","pos":"gpt-skin","size_definitions":[{"breakpoint":"970","sizes":"1x1"},{"breakpoint":"728","sizes":""},{"breakpoint":"320","sizes":""}],"insert_after_p":"1"}],"aps_pub_id":"0"}},"ias":{"account":{"pub_id":""}},"index_exchange":{"config":{"id":""}},"permutive":{"account":{"workspace_id":"f5b3be27-f789-4ef1-8867-37c67da5b361","api_key":"84c7e805-5ce9-41f4-b988-3529488bab1c"}},"outbrain":[],"nativo":{"config":{"script":"https:\/\/s.ntv.io\/serve\/load.js","page_template":[{"custom_template":"Homepage","desktop":"5,8,13","mobile":"5,8,13"},{"custom_template":"Article","desktop":"22,32,37","mobile":"22,32,37"},{"custom_template":"Archive","desktop":"3","mobile":"3"}],"relatedcontent":[{"related_content_block":"Related Content","desktop":"3","block_name":"related_content"}],"populartopic":[{"nativopopulartopic":"Popular Topics","desktop":"2","mobile":"2","block_name":"popular_topics"}],"herov2":[{"nativoherov2":"Hero V2","desktop":"2","mobile":"2","block_name":"hero_v2","variant":[{"variant_name":"Default","desktop":"3,5","mobile":"3,5","Variant_value":"default"},{"variant_name":"Card 4 By 4","desktop":"4","mobile":"4","Variant_value":"fourByFour"},{"variant_name":"Card Small 4 By 4","desktop":"4","mobile":"4","Variant_value":"oneByThree"}]}],"variouscontentlisting":[{"various_content_listing":"Various content listings","desktop":"3,5,9","mobile":"3,5,9","block_name":"various_content_listing"}]}},"newsletter_register_para_details":{"nrp_info":{"paracount":"0"}},"newsletter_subscribe_btn_redirect_url":[],"subscribers":{"config":{"id":"d73925e9-37f6-478a-9804-7901f9e3a2ae","script":"https:\/\/cdn.subscribers.com\/assets\/subscribers.js"}},"jw_player":{"config":{"insert_after_p":"4","insert_after_article":"","player_library_id":"8yHZorDV","amp_player_library_id":"Q4xdwtHS","floating_player_playlist_id":"wj1ht0vS","adscheduleid":"LxK3nuOJ","floating_player_adscheduleid":"LxK3nuOJ","description_url":"http:\/\/www.infoworld.com","sz":"640x480|640x360","ciu_szs":"300x250,728x90"}},"io_script":{"config":{"id":"OmWzZwn3Mi5H","io_amp_id":"45650"}}},"GPT":{"ad_slot_name":"page_door","prefix":"\/8456\/IDG.G_B2B_InfoWorld.com\/","targeting":{"articleId":"100007624","author":"Amy Bennett","browser":"feedparser\/6.0.2+https:\/\/github.com\/kurtmckee\/feedparser\/","templateType":"other","categorySlugs":"","tags":"","categoryIds":"","env":null,"productId":"","goldenIds":"","channel":"","fireplace":"false","type":"","typeId":"","sponsored":"false","video-autoplay":"true","manufactuer":"microsoft","url":"https:\/\/www.infoworld.com\/software-development\/","zone":"software-development-index-other","wpsponsorshipId":""}},"geolocation":"SG","suppress_monetization":{},"supressBb2bRightrail":"","products":[],"vendor_pricing":{"amazon":[]},"APS":[],"isB2B":"1","isSingle":"","isEuVisitor":""}; </script> <script id="third-party-integrations-script-js-before"> window.dataLayer = window.dataLayer || []; window.dataLayer.push({"adBlockerEnabled":true,"arenaId":"","audience":"enterprise","ccpaOptedOut":"false","environment":"wp_production","sessionNumber":"@TODO","firstSessionDate":"@TODO","lastSessionDate":"@TODO","timestamp":1732431799,"url":"https:\/\/www.infoworld.com\/software-development\/","triblioPixelCode":"","prodIds":"","prodCategories":"","prodManufacturers":"","prodNames":"","prodVendors":"","categories":"","categoryIds":"","categoriesSlugs":"","channel":"","primaryCategory":"","primaryAncestorCategoryList":"","primaryAncestorCategoryListSlugs":"","ancestorGoldenCategories":"","goldenTaxonomyIdPrimary":"","gtaxPrimaryIdsList":"","gtaxPrimarySlugsList":"","gtaxIdList":"","gtaxList":"","bcGtaxIdList":[],"bcGtaxList":[],"language":"English","articleId":"100007624","articleTitle":"Software Development","articleType":"","author":"Amy Bennett","isBlog":"false","blogname":"","blogId":"","brandpost":"false","content_type":"software-development index","datePublished":"2024-06-26","dateUpdate":"2024-07-09","dateTimePublished":"2024-06-26T19:11:53-04:00","dateTimeUpdate":"2024-07-09T11:23:01-04:00","dateFirstPublished":false,"dateFirstTimePublished":false,"daysSincePublished":"","daysSinceUpdated":"137","description":"Software Development | News, how-tos, features, reviews, and videos\n","displayType":"software-development index","fireplace":"false","pageNumber":"1","page_type":"other","platform":"web","podcastSponsored":"false","property":"infoworld","source":"","sponsorName":"","sponsorshipId":"","tags":[],"legacyCmsId":"","edition":"","articleLocale":"","isInsiderContent":"false","insiderSignedIn":"true","adSuppression":"false","BCUID":"","legacyCmsName":"","idgAppID":{"SITE_TYPE":[{"type":"delivery","site":"infoworld.com","sourcecms":"onecms","connectedhub":"b2b","staff":"Infoworld Staff","brand":"IW"}],"IDG_APP_ID":9049}}); // GDPR Stub function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(){for(var t,e,o=[],n=window,r=n;r;){try{if(r.frames.__tcfapiLocator){t=r;break}}catch(t){}if(r===n.top)break;r=n.parent}t||(function t(){var e=n.document,o=!!n.frames.__tcfapiLocator;if(!o)if(e.body){var r=e.createElement("iframe");r.style.cssText="display:none",r.name="__tcfapiLocator",e.body.appendChild(r)}else setTimeout(t,5);return!o}(),n.__tcfapi=function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];if(!n.length)return o;"setGdprApplies"===n[0]?n.length>3&&2===parseInt(n[1],10)&&"boolean"==typeof n[3]&&(e=n[3],"function"==typeof n[2]&&n[2]("set",!0)):"ping"===n[0]?"function"==typeof n[2]&&n[2]({gdprApplies:e,cmpLoaded:!1,cmpStatus:"stub"}):o.push(n)},n.addEventListener("message",(function(t){var e="string"==typeof t.data,o={};if(e)try{o=JSON.parse(t.data)}catch(t){}else o=t.data;var n="object"===_typeof(o)?o.__tcfapiCall:null;n&&window.__tcfapi(n.command,n.version,(function(o,r){var a={__tcfapiReturn:{returnValue:o,success:r,callId:n.callId}};t&&t.source&&t.source.postMessage&&t.source.postMessage(e?JSON.stringify(a):a,"*")}),n.parameter)}),!1))}(); window.__gpp_addFrame=function(e){if(!window.frames[e])if(document.body){var t=document.createElement("iframe");t.style.cssText="display:none",t.name=e,document.body.appendChild(t)}else window.setTimeout(window.__gpp_addFrame,10,e)},window.__gpp_stub=function(){var e=arguments;if(__gpp.queue=__gpp.queue||[],__gpp.events=__gpp.events||[],!e.length||1==e.length&&"queue"==e[0])return __gpp.queue;if(1==e.length&&"events"==e[0])return __gpp.events;var t=e[0],p=e.length>1?e[1]:null,s=e.length>2?e[2]:null;if("ping"===t)p({gppVersion:"1.1",cmpStatus:"stub",cmpDisplayStatus:"hidden",signalStatus:"not ready",supportedAPIs:["2:tcfeuv2","5:tcfcav1","6:uspv1","7:usnatv1","8:uscav1","9:usvav1","10:uscov1","11:usutv1","12:usctv1"],cmpId:0,sectionList:[],applicableSections:[],gppString:"",parsedSections:{}},!0);else if("addEventListener"===t){"lastId"in __gpp||(__gpp.lastId=0),__gpp.lastId++;var n=__gpp.lastId;__gpp.events.push({id:n,callback:p,parameter:s}),p({eventName:"listenerRegistered",listenerId:n,data:!0,pingData:{gppVersion:"1.1",cmpStatus:"stub",cmpDisplayStatus:"hidden",signalStatus:"not ready",supportedAPIs:["2:tcfeuv2","5:tcfcav1","6:uspv1","7:usnatv1","8:uscav1","9:usvav1","10:uscov1","11:usutv1","12:usctv1"],cmpId:0,sectionList:[],applicableSections:[],gppString:"",parsedSections:{}}},!0)}else if("removeEventListener"===t){for(var a=!1,i=0;i<__gpp.events.length;i++)if(__gpp.events[i].id==s){__gpp.events.splice(i,1),a=!0;break}p({eventName:"listenerRemoved",listenerId:s,data:a,pingData:{gppVersion:"1.1",cmpStatus:"stub",cmpDisplayStatus:"hidden",signalStatus:"not ready",supportedAPIs:["2:tcfeuv2","5:tcfcav1","6:uspv1","7:usnatv1","8:uscav1","9:usvav1","10:uscov1","11:usutv1","12:usctv1"],cmpId:0,sectionList:[],applicableSections:[],gppString:"",parsedSections:{}}},!0)}else"hasSection"===t?p(!1,!0):"getSection"===t||"getField"===t?p(null,!0):__gpp.queue.push([].slice.apply(e))},window.__gpp_msghandler=function(e){var t="string"==typeof e.data;try{var p=t?JSON.parse(e.data):e.data}catch(e){p=null}if("object"==typeof p&&null!==p&&"__gppCall"in p){var s=p.__gppCall;window.__gpp(s.command,(function(p,n){var a={__gppReturn:{returnValue:p,success:n,callId:s.callId}};e.source.postMessage(t?JSON.stringify(a):a,"*")}),"parameter"in s?s.parameter:null,"version"in s?s.version:"1.1")}},"__gpp"in window&&"function"==typeof window.__gpp||(window.__gpp=window.__gpp_stub,window.addEventListener("message",window.__gpp_msghandler,!1),window.__gpp_addFrame("__gppLocator")); // CCPA Stub (function () { var e = false; var c = window; var t = document; function r() { if (!c.frames["__uspapiLocator"]) { if (t.body) { var a = t.body; var e = t.createElement("iframe"); e.style.cssText = "display:none"; e.name = "__uspapiLocator"; a.appendChild(e) } else { setTimeout(r, 5) } } } r(); function p() { var a = arguments; __uspapi.a = __uspapi.a || []; if (!a.length) { return __uspapi.a } else if (a[0] === "ping") { a[2]({ gdprAppliesGlobally: e, cmpLoaded: false }, true) } else { __uspapi.a.push([].slice.apply(a)) } } function l(t) { var r = typeof t.data === "string"; try { var a = r ? JSON.parse(t.data) : t.data; if (a.__cmpCall) { var n = a.__cmpCall; c.__uspapi(n.command, n.parameter, function (a, e) { var c = { __cmpReturn: { returnValue: a, success: e, callId: n.callId } }; t.source.postMessage(r ? JSON.stringify(c) : c, "*") }) } } catch (a) { } } if (typeof __uspapi !== "function") { c.__uspapi = p; __uspapi.msgHandler = l; c.addEventListener("message", l, false) } })(); // Google Tag Manager (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5JGZ3LH'); // Permutive Stub !function(n,e,i){if(!n){n=n||{},window.permutive=n,n.q=[],n.config={}||{},n.config.apiKey=e,n.config.environment=n.config.environment||"production";for(var o=["addon","identify","track","trigger","query","segment","segments","ready","on","once","user","consent"],r=0;r<o.length;r++){var t=o[r];n[t]=function(e){return function(){var i=Array.prototype.slice.call(arguments,0);n.q.push({functionName:e,arguments:i})}}(t)}}}( window.permutive, '84c7e805-5ce9-41f4-b988-3529488bab1c' ); window.googletag=window.googletag||{},window.googletag.cmd=window.googletag.cmd||[],window.googletag.cmd.push(function(){if(0===window.googletag.pubads().getTargeting("permutive").length){var g=window.localStorage.getItem("_pdfps");window.googletag.pubads().setTargeting("permutive",g?JSON.parse(g):[])}}); let categorySlug = ''; const stripOutIllegal = s => s.replace(/[~'"=!+#;^()<>&[]]/g,''); window.ntvConfig = window.ntvConfig || {} ; window.ntvConfig.keyValues = window.ntvConfig.keyValues || {}; const segs = localStorage.getItem('_pnativo'); if (segs) { window.ntvConfig.keyValues.permutive = JSON.parse(segs).join(","); } const metaKeywordsTag = document.querySelector("meta[name='keywords']"); if ( metaKeywordsTag && (metaKeywordsTag.hasAttribute('content')) ) { const kwds = metaKeywordsTag.content.split(',').filter(kw => kw.length <= 40); window.ntvConfig.keyValues.contextual = stripOutIllegal(kwds.join(',')); } [categorySlug].forEach(function(val) { if (val.length !== 0) { window.ntvConfig.keyValues.channel = stripOutIllegal(val); } }); if (typeof(window.ntvConfig.keyValues.channel) === "undefined") { window.ntvConfig.keyValues.channel = ""; } const DoSomething = () => { const boxes = document.querySelectorAll('.nativo-loading'); boxes.forEach(box => { box.classList.remove('nativo-loading'); }); } var ntv=ntv||{};ntv.cmd=ntv.cmd||[]; // setup command queue ntv.cmd.push(function(){ setTimeout(DoSomething, 1000) }); </script> <script> window._io_config = window?._io_config || {}; window._io_config["0.2.0"] = window?._io_config["0.2.0"] || []; window._io_config["0.2.0"].push({"page_url":"https:\/\/www.infoworld.com\/software-development","page_url_canonical":"https:\/\/www.infoworld.com\/software-development\/","page_title":"Software Development | InfoWorld","page_type":"default","page_language":"en"}); </script> <script src="https://www.infoworld.com/wp-content/client-mu-plugins/idg-third-party/dist/scripts/index.js?ver=1731995985" id="third-party-integrations-script-js"></script> <script type="text/javascript" src="https://www.infoworld.com/_static/??-eJydzEEKhDAMAMAPGYMsoj2Ib+k2RVNqDUlE/P36hj3NbfAWSGfz3BxT5Rc4LpB6bdwMmTbwnZVAovqDxOZoSVncsNxS45O1L9bh/41o/jJBJHuj9ViG6TOEMIZ5LD9ohTnu" ></script><script async src="https://cdn.onthe.io/io.js/OmWzZwn3Mi5H?ver=1" id="io_script_code-js"></script> <script type="text/javascript" src="https://www.infoworld.com/_static/??-eJx9jMEKAjEMRH/IbGoFxYP4Lds2rClNd21SFv/eIh48CQMPhjeD+wZcY+mJFPPIs1N7fTEJ1ynrAf9JILy02ehXjms1qob2IBkTTgsEHyDMSvDpMLEaamy8mWLsaquA9GKsVCjaOLrL7Xg5ee/Ozl3zG9IlPYo=" ></script><script type="application/ld+json">[{"@context":"https:\/\/schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.infoworld.com\/"},{"@type":"ListItem","position":2,"name":"Software Development","item":""}]},{"@context":"https:\/\/schema.org\/","@type":"CollectionPage","mainEntity":{"@type":"ItemList","itemListElement":[]}}]</script> <style> :root { /* Nativo Loader */ --nativo-loader-color: #424a45; --sponsored-links--border-bottom-color: #9d9490; --sponsored-container--background-color: #fff; /* Advertisement */ --advertisement-label-text: "advertisement"; } </style> <link rel="shortcut icon" href="https://www.infoworld.com/wp-content/themes/iw-b2b-child-theme/src/static/img/favicon.ico" type="image/x-icon"/> <link rel="apple-touch-icon" sizes="180x180" href="https://www.infoworld.com/wp-content/themes/iw-b2b-child-theme/src/static/img/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="https://www.infoworld.com/wp-content/themes/iw-b2b-child-theme/src/static/img/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="https://www.infoworld.com/wp-content/themes/iw-b2b-child-theme/src/static/img/favicon-16x16.png"> <link rel="manifest" href="https://www.infoworld.com/wp-content/themes/iw-b2b-child-theme/src/static/img/site.webmanifest"> <link rel="mask-icon" href="https://www.infoworld.com/wp-content/themes/iw-b2b-child-theme/src/static/img/safari-pinned-tab.svg" color="#0000cc"> <meta name="msapplication-TileColor" content="#0000cc"> <meta name="theme-color" content="#ffffff"> <style> :root { /*Host Speaker Profile*/ --host-speaker-profile-heading-color: #141414; --host-speaker-profile-heading-font-family: "fira-sans", sans-serif; --host-speaker-profile-title-description-font-family: "myriad-pro",sans-serif; --host-speaker-title-color: #808080; --host-speaker-description-color: #141414; --host-speaker-label-color: #AAA; --host-speaker-remove-link-color: #c30e0e; --host-speaker-horizontal-line-color: #DEDEDE; --host-speaker-company-name-font-color: #75757A; /* Agenda Block */ --agenda-heading-event-name-color: #141414; --agenda-heading-font-family: "fira-sans", sans-serif; --agenda-event-name-font-family: "myriad-pro",sans-serif; --agenda-horizontal-block-divider-color: #dedede; --agenda-event-month-day-date-color: #322a2a; --agenda-event-month-date-color: #969696; --agenda-start-end-time-color: #75757a; --agenda-error-msg-color: #FF0000; --agenda-day-time-text-shadow-color: #808080; --agenda-note-text-color: #808080; --agenda-label-text-color: #111; --agenda-multi-day-button-background-color: #000; --agenda-multi-day-button-text-color: #fff; --agenda-heading-label-color: #AAA; --agenda-details-link-color: #327F7C; --agenda-block-mobile-background-color: #f5f5f5; /*event content block */ --event-register-btn-bg-color: #ed1b24; --event-register-btn-color: #fff; --event-share-icons-color: white; --event-share-icons-color-fb: #3b5998; --event-share-icons-color-twitter: #00acee; --event-share-icons-color-linkedin: #2867b2; --event-description-top-border: #d8dad8; --event-details-label-color: #B30000; --event-details-text-color: #141414; --event-logo-label: "myriad-pro", sans-serif; --event-description-text-color: #322a2a; --who-should-attend-heading: "fira-sans", sans-serif; --who-should-attend-text: "myriad-pro", sans-serif; /* Event Hero Block */ --fira-sans-fonts: "fira-sans", sans-serif; --fira-sans-regular: 400; --fira-sans-extrabold: 800; --fira-sans-semibold: 600; /* Event Index Page */ --border-color: #75757a; --filter-background-color: #F6F6F6; --base--font-color: #322a2a; --index-more-events-title-color: #141414; --myraid-font-family: "myriad-pro",sans-serif; --myriad-regular: 400; --myriad-bold: 700; --base--global-white-color: #fff; --base--global-black-color: #000; --index-events-title-font-hover-color: #B30000; /* Image Credit */ --image-credit-font-color: #555; --image-credit-text: "Credit: "; --event-hero-block-heading-color: #fff;--event-hero-dynamic-background-image: url(""); } </style> <style> :root { /* FAQ*/ --faq-heading-seprator-color: #d8d8d8; --faq-input-box-border-color: #757575; --faq-remove-link-color: #c30e0e; --faq-heading-color: #141414; --faq-heading-font-family: "fira-sans", sans-serif; --faq-title-description-font-family: "myriad-pro",sans-serif; --faq-label-color: #AAA; --faq-company-name-font-color: #75757A; --faq-horizontal-line-color: #DEDEDE; --faq-head-title--font-family: "graphik", sans-serif; } </style> <style> :root { /* Nav menu */ --nav-menu-error: #b32d2e; /* Promo Unit Block HR color */ --promo-unit-hr: #d55d5d; /* Promo Unit Block Title After Color */ --promo-unit-title-after: #d04949; /* Promo Unit Block Title After Color */ --promo-unit-title: #322a2a; /* Promo Unit Block Title before Color */ --promo-unit-before-one: #e42e22; /* Promo Unit Block Title before Color */ --promo-unit-before-two: #f3f5f6; /* Promo Unit Block Title before Color */ --promo-unit-item-bg: #000; /* Deals Collection Block */ --deal-collection-productIndex-border-color: #12C7F1; --deal-collection-deal-header-color: #000; --deal-collection-deal--view-button--background-color: #21873A; --deal-collection-deal-price-color: #CD0912; --site-primary: #3399cc; --view-button--green: #3e873a; /* Jobs Collection Block */ --job-collection-productIndex-border-color: #12C7F1; --job-collection-job-header-color: #000; --job-collection-job--view-button--background-color: #21873A; --job-collection-job-price-color: #CD0912; /* Publication list pop-up pn edit edition page */ --publication-list-container-bg: rgba(255, 255, 255, 1); --publication-list-container-border: #111; --publication-list-container-bs: #222; --publication-list-bg:rgba(100, 100, 100, .6); --publication-list-popup-header-border: #ddd; --publication-list-popup-header-bg: #e9e9e9; /*Lineup Element*/ --lineup-element-error-font-color: #cd423b; --lineup-element-disabled-button-background-color: #ddd; --lineup-element-disabled-button-font-color: #eee; --lineup-element-button-tooltip-background-color: #757575; --lineup-element-button-tooltip-font-color: #fff; --lineup-element-note-font-color: #757575; --lineup-element-button-disabled: hsla(0,0%,100%,.4); /* LineUp Popover.*/ --lineup-popover-a-color: white; --lineup-popover-err-color: red; --lineup-popover-th-color: #d4d4d4; --lineup-popover-tr-color: #f2f2f2; --lineup-popover-paginate-a-active-color: #ddd; --lineup-popover-paginate-a-non-active-color: #006ba1; /* Slotting settings */ --slotting-settings-taxonomy-help-text-color: #808080; /* Author section top */ --sponsorship-brandpost-divider-line-color: #D8D8D8; /** Block - Product chart */ --product-chart--information-value--font-color: #2A7DA7; --product-chart--review-link--font-color: #2A7DA7; --product-chart--description--font-color: #4D4D4D; --product-chart--separator--background-color: #404040; /** Block - Product chart Pros and Cons */ --product-chart--pros-cons-title--font-color: #111111; --product-chart--pros-cons-border: 1px solid #ccc; /* Author Archive Page */ --author-archive-title: rgba(0, 0, 0, .87); --author-job-title: #000; --author-share-icons-divider-color: #D8D8D8; --author-share-icon-fill-color: #111; /* Sponsors index Page */ --sponsored-index-page-slug-background-color: #eee; --sponsorship-brandpost--title: 28px; --sponsorship-title--line-height: 32px; --uppercase-text: uppercase; --sponsor-eyebrow--font-color: #75757A; --sponsor-tooltip-learn-more--font-color: #111111; --sponsorship-brandpost--title-color: #111111; /* How to - at a glance block */ --how-to-at-glance-text-font-family: "canada-type-gibson", sans-serif; --how-to--step-heading--font-family: "regis", serif; --how-to--step-border--divider-color: #B6AEAA; --how-to--at-a-glance--background-color: #E6DCD5; /* Sponsorship Header. */ --sponsorship-header--font-color: #4d4d4d; /* fonts */ --fira-sans-semibold: 700; /* responsive table gradient */ --core-table--gradient--border-color: #C5C5C5; --core-table--gradient--alpha--border-color: #faf6f445; /* headings */ --heading-three: 24px; --heading-four: 20px; --heading-three-line-height: 30px; /* Insider Popover.*/ --insider-popover-background-color: white; --insider-popover-box-shadow-color: rgba(0, 0, 0, .31); --insider-popover-help-text-color: #4a4a4a; --insiderPopover-link-color: #322a2a; --insider-popover-signing-button-text-color: white; --insider-popover-signin-button-background: #4a3d3d; --insider-popover-signout-button-background: #b43017; --insiderPopover-welcome-font-color: #141414; /* Listing Button */ --insider-listing-primary-button-background : #4e4242; --insiderPopover-link-hover-color:#3c807c; --mercury-form--insider-color: #6eae00; } </style> <meta name="displaytype" content="article" /> <meta name="source" content="https://www.infoworld.com/software-development/" /> <link rel="canonical" href="https://www.infoworld.com/software-development/" /> <meta name="description" content="Software Development | News, how-tos, features, reviews, and videos " /> <meta property="og:type" content="website" /> <meta property="og:url" content="https://www.infoworld.com/software-development/" /> <meta property="og:site_name" content="InfoWorld" /> <meta property="og:title" content="Software Development" /> <meta property="og:description" content="Software Development | News, how-tos, features, reviews, and videos " /> <meta property="twitter:card" content="summary_large_image" /> <meta property="twitter:url" content="https://www.infoworld.com/software-development/" /> <meta property="twitter:site" content="InfoWorld" /> <meta property="twitter:title" content="Software Development" /> <meta property="twitter:description" content="Software Development | News, how-tos, features, reviews, and videos " /> </head> <body class="page-template page-template-templates page-template-template-topic-landing page-template-templatestemplate-topic-landing-php page page-id-100007624 idg-b2b-topic-landing-page sticky-header theme-iw"> <svg id="icon-sprite" style="position: absolute; width: 0; height: 0; overflow: hidden;" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"> <defs> <g id="icon-apple-podcasts"> <path d="M11.432 20.546c-.681-.244-.827-.575-1.107-2.515-.324-2.255-.395-3.65-.207-4.093.25-.586.927-.919 1.873-.922.94-.004 1.624.332 1.874.922.189.441.118 1.838-.207 4.093-.221 1.575-.342 1.974-.647 2.241-.418.37-1.012.473-1.575.274h-.004Zm-2.91-2.314c-2.351-1.157-3.858-3.114-4.406-5.718-.137-.673-.16-2.275-.03-2.893.342-1.655.997-2.95 2.085-4.094C7.739 3.874 9.756 3 12 3c2.222 0 4.231.858 5.761 2.461 1.164 1.21 1.819 2.491 2.154 4.179.114.561.114 2.092.007 2.724a8.091 8.091 0 0 1-3.082 5.04c-.58.437-1.994 1.2-2.222 1.2-.084 0-.092-.087-.053-.438.068-.563.136-.68.456-.814.51-.213 1.378-.831 1.91-1.366a7.27 7.27 0 0 0 1.91-3.363c.198-.784.176-2.527-.044-3.334-.695-2.567-2.787-4.56-5.351-5.093-.746-.153-2.101-.153-2.855 0-2.595.532-4.741 2.625-5.397 5.258-.175.714-.175 2.459 0 3.174.434 1.743 1.561 3.341 3.037 4.293.25.167.512.317.784.449.32.137.388.25.448.814.038.342.03.441-.053.441-.053 0-.441-.167-.852-.365l-.036-.028Zm.031-3.095c-.792-.632-1.491-1.752-1.78-2.851-.176-.664-.176-1.926.007-2.587.48-1.787 1.796-3.172 3.622-3.823.625-.22 2.008-.268 2.778-.1 2.648.588 4.529 3.24 4.165 5.871-.145 1.06-.51 1.931-1.157 2.74-.32.409-1.096 1.095-1.233 1.095-.022 0-.044-.26-.044-.575v-.573l.396-.472c1.492-1.787 1.385-4.282-.244-5.921-.631-.637-1.362-1.012-2.306-1.185-.609-.113-.738-.113-1.377-.007-.97.158-1.722.535-2.39 1.194-1.64 1.618-1.746 4.129-.254 5.917l.393.474v.58c0 .32-.026.58-.057.58-.031 0-.251-.152-.487-.343l-.032-.014Zm2.64-3.107c-.676-.316-1.042-.91-1.05-1.685 0-.696.389-1.304 1.058-1.66.427-.222 1.18-.222 1.606 0 .473.256.828.686.99 1.199.441 1.5-1.15 2.816-2.588 2.144l-.015.002Z" fill="currentColor"/> <path d="M12.114 12.325a1.898 1.898 0 1 0 0-3.795 1.898 1.898 0 0 0 0 3.796ZM12.298 13.06c.215.025.428.068.635.13a2.3 2.3 0 0 1 .636.318c.168.121.29.248.366.401.076.153.114.336.137.636.015.3.015.713-.053 1.491a53.146 53.146 0 0 1-.313 2.636c-.106.726-.182 1.05-.281 1.286a1.152 1.152 0 0 1-.845.738 1.83 1.83 0 0 1-.441.038 1.893 1.893 0 0 1-.442-.038c-.174-.038-.401-.106-.57-.243-.176-.137-.29-.335-.381-.594-.091-.259-.16-.57-.251-1.195a66.213 66.213 0 0 1-.29-2.26 18.148 18.148 0 0 1-.112-1.522c-.006-.328.008-.491.044-.647.036-.15.098-.291.183-.419a1.389 1.389 0 0 1 .661-.504c.157-.06.32-.106.485-.137.197-.038.426-.075.543-.091a.596.596 0 0 1 .248 0l.04-.024Z" fill="currentColor"/> </g> <g id="icon-arrow-up-right-from-square"> <path fill-rule="evenodd" clip-rule="evenodd" d="m19.19 3.75-9.72 9.72-.53.53L10 15.06l.53-.53 9.72-9.72v4.94h1.5V3a.747.747 0 0 0-.75-.75h-6.75v1.5h4.94ZM4 5.75a.25.25 0 0 0-.25.25v14c0 .138.112.25.25.25h14a.25.25 0 0 0 .25-.25V11.717h1.5V20A1.75 1.75 0 0 1 18 21.75H4A1.75 1.75 0 0 1 2.25 20V6c0-.966.784-1.75 1.75-1.75H12.283v1.5H4Z" fill="currentColor"/> </g> <g id="icon-calendar"> <path fill-rule="evenodd" clip-rule="evenodd" d="M20 5.5H4a.5.5 0 0 0-.5.5v2.25h17V6a.5.5 0 0 0-.5-.5ZM3.5 18V9.75h17V18a.5.5 0 0 1-.5.5H4a.5.5 0 0 1-.5-.5ZM4 4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H4Zm5.42 10.292c0 .75.198 1.092.696 1.092.48 0 .666-.354.666-1.098v-.156c0-.75-.198-1.098-.678-1.098-.486 0-.684.348-.684 1.092v.168Zm2.712-.03c0 1.38-.804 2.172-2.058 2.172-1.236 0-2.004-.768-2.004-2.136v-.168c0-1.374.882-2.13 2.028-2.13 1.14 0 2.034.678 2.034 2.1v.162Zm3.254 2.094h-1.362v-2.952l-.792.474V12.75l.984-.684h1.17v4.29Z" fill="currentColor"/> </g> <g id="icon-caret-down"> <path d="m6 8 4.3 7.1c.8 1.3 2.7 1.3 3.4 0L18 8H6Z" fill="currentColor"/> </g> <g id="icon-circle-bars"> <path fill-rule="evenodd" clip-rule="evenodd" d="M18.287 5.833C16.902 4.408 14.815 3.5 12 3.5c-2.87 0-4.952.91-6.32 2.329C4.303 7.256 3.5 9.353 3.5 12c0 2.58.819 4.684 2.217 6.134C7.107 19.574 9.196 20.5 12 20.5c2.804 0 4.893-.926 6.283-2.366C19.681 16.684 20.5 14.58 20.5 12c0-2.636-.822-4.735-2.213-6.167ZM22 12c0-5.9-3.7-10-10-10C5.6 2 2 6.1 2 12c0 5.8 3.7 10 10 10s10-4.2 10-10ZM7 10.75v-1.5h10v1.5H7Zm0 2.5v1.5h10v-1.5H7Z" fill="currentColor"/> </g> <g id="icon-circle-chevron-down"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12 3.5c2.815 0 4.902.908 6.287 2.333C19.678 7.265 20.5 9.364 20.5 12c0 2.58-.819 4.684-2.217 6.134-1.39 1.44-3.479 2.366-6.283 2.366-2.804 0-4.893-.926-6.283-2.366C4.319 16.684 3.5 14.58 3.5 12c0-2.647.803-4.744 2.18-6.171C7.048 4.41 9.13 3.5 12 3.5ZM12 2c6.3 0 10 4.1 10 10 0 5.8-3.7 10-10 10S2 17.8 2 12C2 6.1 5.6 2 12 2ZM8.326 9.97l3.536 3.536a.25.25 0 0 0 .353 0l3.536-3.535 1.06 1.06-3.535 3.536a1.75 1.75 0 0 1-2.475 0L7.266 11.03l1.06-1.06Z" fill="currentColor"/> </g> <g id="icon-circle-chevron-left"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12 3.5c2.815 0 4.902.908 6.287 2.333C19.678 7.265 20.5 9.364 20.5 12c0 2.58-.819 4.684-2.217 6.134-1.39 1.44-3.479 2.366-6.283 2.366-2.804 0-4.893-.926-6.283-2.366C4.319 16.684 3.5 14.58 3.5 12c0-2.647.803-4.744 2.18-6.171C7.048 4.41 9.13 3.5 12 3.5ZM12 2c6.3 0 10 4.1 10 10 0 5.8-3.7 10-10 10S2 17.8 2 12C2 6.1 5.6 2 12 2Zm1.773 6.53-3.536 3.536a.25.25 0 0 0 0 .353l3.536 3.536-1.061 1.06-3.536-3.535a1.75 1.75 0 0 1 0-2.475l3.536-3.535 1.06 1.06Z" fill="currentColor"/> </g> <g id="icon-circle-chevron-right"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12 3.5c2.815 0 4.902.908 6.287 2.333C19.678 7.265 20.5 9.364 20.5 12c0 2.58-.819 4.684-2.217 6.134-1.39 1.44-3.479 2.366-6.283 2.366-2.804 0-4.893-.926-6.283-2.366C4.319 16.684 3.5 14.58 3.5 12c0-2.647.803-4.744 2.18-6.171C7.048 4.41 9.13 3.5 12 3.5ZM12 2c6.3 0 10 4.1 10 10 0 5.8-3.7 10-10 10S2 17.8 2 12C2 6.1 5.6 2 12 2ZM9.712 8.53l3.535 3.536a.25.25 0 0 1 0 .353l-3.535 3.536 1.06 1.06 3.536-3.535a1.75 1.75 0 0 0 0-2.475L10.773 7.47 9.712 8.53Z" fill="currentColor"/> </g> <g id="icon-circle-chevron-up"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12 3.5c2.815 0 4.902.908 6.287 2.333C19.678 7.265 20.5 9.364 20.5 12c0 2.58-.819 4.684-2.217 6.134-1.39 1.44-3.479 2.366-6.283 2.366-2.804 0-4.893-.926-6.283-2.366C4.319 16.684 3.5 14.58 3.5 12c0-2.647.803-4.744 2.18-6.171C7.048 4.41 9.13 3.5 12 3.5ZM12 2c6.3 0 10 4.1 10 10 0 5.8-3.7 10-10 10S2 17.8 2 12C2 6.1 5.6 2 12 2Zm3.752 12.53-3.536-3.536a.25.25 0 0 0-.353 0l-3.536 3.535-1.06-1.06 3.535-3.536a1.75 1.75 0 0 1 2.475 0l3.536 3.536-1.061 1.06Z" fill="currentColor"/> </g> <g id="icon-circle-xmark"> <path fill-rule="evenodd" clip-rule="evenodd" d="M18.287 5.833C16.902 4.408 14.815 3.5 12 3.5c-2.87 0-4.952.91-6.32 2.329C4.303 7.256 3.5 9.353 3.5 12c0 2.58.819 4.684 2.217 6.134C7.107 19.574 9.196 20.5 12 20.5c2.804 0 4.893-.926 6.283-2.366C19.681 16.684 20.5 14.58 20.5 12c0-2.636-.822-4.735-2.213-6.167ZM22 12c0-5.9-3.7-10-10-10C5.6 2 2 6.1 2 12c0 5.8 3.7 10 10 10s10-4.2 10-10Zm-9.998-1.069 3-3 1.06 1.061-3 3 3.01 3.009-1.062 1.06-3.008-3.008-3.01 3.01-1.061-1.06 3.01-3.01L7.94 8.99 9 7.93l3.002 3.002Z" fill="currentColor"/> </g> <g id="icon-chevron-down"> <path fill-rule="evenodd" clip-rule="evenodd" d="m11.776 14.42-4.95-4.95-1.06 1.061 4.95 4.95a1.75 1.75 0 0 0 2.474 0l4.95-4.95-1.06-1.06-4.95 4.95a.25.25 0 0 1-.354 0Z" fill="currentColor"/> </g> <g id="icon-chevron-left"> <path fill-rule="evenodd" clip-rule="evenodd" d="m10.08 11.87 4.95-4.95-1.061-1.06-4.95 4.95a1.75 1.75 0 0 0 0 2.474l4.95 4.95 1.06-1.06-4.95-4.95a.25.25 0 0 1 0-.354Z" fill="currentColor"/> </g> <g id="icon-chevron-right"> <path fill-rule="evenodd" clip-rule="evenodd" d="m14.42 12.224-4.95 4.95 1.061 1.06 4.95-4.95a1.75 1.75 0 0 0 0-2.474l-4.95-4.95-1.06 1.06 4.95 4.95a.25.25 0 0 1 0 .354Z" fill="currentColor"/> </g> <g id="icon-chevron-up"> <path fill-rule="evenodd" clip-rule="evenodd" d="m12.13 10.08 4.95 4.95 1.06-1.061-4.95-4.95a1.75 1.75 0 0 0-2.474 0l-4.95 4.95 1.06 1.06 4.95-4.95a.25.25 0 0 1 .354 0Z" fill="currentColor"/> </g> <g id="icon-envelope"> <path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5h16a.5.5 0 0 1 .5.5v10a.5.5 0 0 1-.5.5H4a.5.5 0 0 1-.5-.5V7a.5.5 0 0 1 .5-.5ZM2 7a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V7Zm4.416 1.376-.624-.416-.832 1.248.624.416 4.89 3.26a2.75 2.75 0 0 0 3.051 0l4.891-3.26.624-.416-.832-1.248-.624.416-4.89 3.26c-.42.28-.968.28-1.387 0l-4.891-3.26Z" fill="currentColor"/> </g> <g id="icon-facebook"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12 3.5c2.815 0 4.902.908 6.287 2.333C19.678 7.265 20.5 9.364 20.5 12c0 2.58-.819 4.684-2.217 6.134-1.226 1.27-2.995 2.14-5.318 2.328v-5.35h2.04l.39-2.61h-2.43v-1.695c0-.714.343-1.41 1.43-1.41H15.5v-2.22S14.495 7 13.537 7c-2.001 0-3.31 1.25-3.31 3.514v1.992H8v2.61h2.227v5.25c-1.93-.305-3.43-1.114-4.51-2.232C4.319 16.684 3.5 14.58 3.5 12c0-2.647.803-4.744 2.18-6.171C7.048 4.41 9.13 3.5 12 3.5Zm-.472 18.492C5.516 21.787 2 17.654 2 12 2 6.1 5.6 2 12 2c6.3 0 10 4.1 10 10 0 5.8-3.7 10-10 10-.147 0-.293-.002-.437-.007l-.016.007-.019-.008Z" fill="currentColor"/> </g> <g id="icon-globe"> <path d="M19.4 4.8C17.6 3 15 2 12 2 8.9 2 6.4 3 4.6 4.8 2.9 6.6 2 9 2 12c0 2.9.9 5.4 2.6 7.2C6.4 21 9 22 12 22s5.6-1 7.4-2.8c1.7-1.8 2.6-4.3 2.6-7.2 0-2.9-.9-5.4-2.6-7.2Zm1.1 6.4H17c-.1-2.6-.5-4.8-1.3-6.5-.1-.3-.3-.6-.5-.8 1.2.4 2.2 1 3.1 1.8 1.3 1.5 2 3.3 2.2 5.5ZM12 20.5c-.9 0-1.7-.7-2.3-2-.7-1.4-1.1-3.4-1.2-5.8h7c-.1 2.3-.5 4.4-1.2 5.8-.6 1.3-1.4 2-2.3 2Zm-3.5-9.3c.1-2.3.5-4.3 1.2-5.8.6-1.3 1.4-1.9 2.3-1.9.9 0 1.7.7 2.3 1.9.7 1.4 1.1 3.4 1.2 5.8h-7ZM5.7 5.8C6.5 5 7.5 4.4 8.8 4c-.2.2-.4.5-.5.8-.8 1.6-1.2 3.8-1.3 6.4H3.5c.2-2.2.9-4 2.2-5.4Zm-2.2 6.9H7c.1 2.6.5 4.8 1.3 6.4.2.3.3.6.5.8-1.2-.4-2.2-1-3.1-1.9-1.3-1.2-2-3.1-2.2-5.3Zm14.8 5.4c-.8.9-1.9 1.5-3.1 1.9.2-.2.3-.5.5-.8.8-1.6 1.2-3.8 1.3-6.4h3.5c-.2 2.1-.9 4-2.2 5.3Z" fill="currentColor"/> </g> <g id="icon-google-podcasts"> <path d="M12 6.9c-.606 0-1.098-.476-1.098-1.063V4.562c0-.587.492-1.062 1.098-1.062.606 0 1.098.475 1.098 1.062v1.275c0 .587-.492 1.062-1.098 1.062ZM12 15.826c-.606 0-1.098-.476-1.098-1.063V9.24c0-.587.492-1.062 1.098-1.062.606 0 1.098.475 1.098 1.062v5.524c0 .587-.492 1.063-1.098 1.063ZM10.902 19.438c0 .587.492 1.062 1.098 1.062.606 0 1.098-.476 1.098-1.062v-1.275c0-.587-.492-1.063-1.098-1.063-.606 0-1.098.476-1.098 1.063v1.275ZM8.049 17.098c-.607 0-1.098-.476-1.098-1.063v-1.274c0-.587.491-1.063 1.098-1.063.606 0 1.097.476 1.097 1.063v1.274c0 .587-.49 1.063-1.097 1.063ZM14.854 9.24c0 .586.49 1.062 1.097 1.062s1.098-.476 1.098-1.063V7.964c0-.586-.491-1.062-1.098-1.062-.606 0-1.097.476-1.097 1.062V9.24ZM8.049 12.429c-.607 0-1.098-.476-1.098-1.062V7.542c0-.587.491-1.062 1.098-1.062.606 0 1.097.475 1.097 1.062v3.825c0 .586-.49 1.062-1.097 1.062ZM14.854 16.466c0 .587.49 1.062 1.097 1.062s1.098-.475 1.098-1.062V12.64c0-.586-.491-1.062-1.098-1.062-.606 0-1.097.476-1.097 1.062v3.825ZM4.098 13.704C3.49 13.704 3 13.228 3 12.64v-1.274c0-.587.491-1.063 1.098-1.063.606 0 1.097.476 1.097 1.063v1.274c0 .587-.491 1.063-1.097 1.063ZM18.805 12.641c0 .587.491 1.063 1.097 1.063.607 0 1.098-.476 1.098-1.063v-1.274c0-.587-.491-1.063-1.098-1.063-.606 0-1.097.476-1.097 1.063v1.274Z" fill="currentColor"/> </g> <g id="icon-instagram"> <path fill-rule="evenodd" clip-rule="evenodd" d="M16 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h8a3.5 3.5 0 0 0 3.5-3.5V8A3.5 3.5 0 0 0 16 4.5ZM8 3a5 5 0 0 0-5 5v8a5 5 0 0 0 5 5h8a5 5 0 0 0 5-5V8a5 5 0 0 0-5-5H8Zm6.237 6.8C13.794 9.344 13.082 9 12 9c-1.11 0-1.818.347-2.25.796C9.308 10.253 9 10.976 9 12c0 .986.31 1.714.766 2.187.448.465 1.162.813 2.234.813s1.786-.348 2.234-.813C14.69 13.714 15 12.986 15 12c0-1.014-.313-1.738-.763-2.2ZM16.5 12c0-2.655-1.665-4.5-4.5-4.5-2.88 0-4.5 1.845-4.5 4.5 0 2.61 1.665 4.5 4.5 4.5s4.5-1.89 4.5-4.5ZM18 7c0-.59-.37-1-1-1-.64 0-1 .41-1 1 0 .58.37 1 1 1s1-.42 1-1Z" fill="currentColor"/> </g> <g id="icon-layer-group"> <path fill-rule="evenodd" clip-rule="evenodd" d="m6.09 7.984 5.672 3.166a.5.5 0 0 0 .486 0l5.665-3.132-5.672-3.166a.5.5 0 0 0-.485 0L6.09 7.983Zm-1.546.855 6.487 3.62a2 2 0 0 0 1.943.005l6.482-3.585.055-.03.703-.389a.5.5 0 0 0 .002-.874l-.702-.392-.054-.03-6.488-3.621a2 2 0 0 0-1.942-.004L4.548 7.123l-.055.03-.704.39a.5.5 0 0 0-.001.873l.701.392.055.03Zm2.254 6.758-1.543-.861-.706.39-.055.03-.703.39a.5.5 0 0 0-.002.873l.702.392.054.03h.001l6.487 3.621a2 2 0 0 0 1.942.004l6.482-3.584.055-.03.704-.39a.5.5 0 0 0 .002-.873l-.702-.392-.055-.03-.711-.398-1.546.855.71.397-5.665 3.133a.5.5 0 0 1-.485-.001l-5.672-3.166.706-.39Zm-1.543-4.861 1.543.86-.706.391 5.672 3.166a.5.5 0 0 0 .485 0l5.666-3.132-.712-.397 1.547-.855.71.397h.001l.055.031.702.392a.5.5 0 0 1-.002.874l-.704.389-.054.03-6.483 3.585a2 2 0 0 1-1.942-.004l-6.487-3.621-.055-.03-.702-.393a.5.5 0 0 1 .002-.874l.703-.389.055-.03.706-.39Z" fill="currentColor"/> </g> <g id="icon-linked-in"> <path fill-rule="evenodd" clip-rule="evenodd" d="M6.093 4a2.125 2.125 0 0 0-2.124 2.122c0 1.17.953 2.122 2.124 2.122 1.17 0 2.122-.952 2.122-2.122S7.263 4 6.093 4Zm1.61 5.14H4.486a.259.259 0 0 0-.258.26v10.34c0 .143.115.258.258.258h3.219a.259.259 0 0 0 .259-.258V9.4a.259.259 0 0 0-.26-.26Zm5.358.93c.58-.631 1.535-1.187 2.828-1.187 3.625 0 4.114 2.62 4.114 5.184v5.672a.259.259 0 0 1-.259.259h-3.213a.259.259 0 0 1-.258-.259v-5.028c0-1.407-.104-2.484-1.413-2.484-1.202 0-1.67.672-1.67 2.396v5.116a.259.259 0 0 1-.259.258H9.72a.259.259 0 0 1-.26-.258V9.399c0-.143.117-.26.26-.26h3.082c.143 0 .259.117.259.26v.671Z" fill="currentColor"/> </g> <g id="icon-magnifying-glass"> <path fill-rule="evenodd" clip-rule="evenodd" d="M9.5 4.5c1.726 0 2.943.538 3.726 1.319.785.783 1.274 1.952 1.274 3.484 0 1.495-.486 2.669-1.278 3.464-.787.792-2.006 1.34-3.722 1.34-1.716 0-2.935-.548-3.722-1.34-.792-.795-1.278-1.969-1.278-3.464 0-1.543.48-2.71 1.253-3.488C6.523 5.04 7.736 4.5 9.5 4.5Zm0-1.5C13.595 3 16 5.584 16 9.303c0 3.656-2.405 6.303-6.5 6.303-4.095 0-6.5-2.647-6.5-6.303C3 5.584 5.34 3 9.5 3Zm6.405 11.845a.75.75 0 1 0-1.06 1.06l5.5 5.5 1.06-1.06-5.5-5.5Z" fill="currentColor"/> </g> <g id="icon-play"> <path d="m7 20 10.002-6.155c1.374-.846 1.374-2.844 0-3.69L7 4v16Z" fill="currentColor"/> </g> <g id="icon-podcast"> <path fill-rule="evenodd" clip-rule="evenodd" d="M9.75 2.25v19.5h-1.5V2.25h1.5Zm3 17.5V4.25h-1.5v15.5h1.5Zm-6-12.5v9.5h-1.5v-9.5h1.5Zm12 3v3.5h-1.5v-3.5h1.5Zm-3 5.5v-7.5h-1.5v7.5h1.5Zm-13-4.25c.473 0 .75.307.75.75 0 .435-.277.75-.75.75S2 12.685 2 12.25c0-.443.27-.75.75-.75Zm19.25.75c0-.443-.277-.75-.75-.75-.48 0-.75.307-.75.75 0 .435.277.75.75.75s.75-.315.75-.75Z" fill="currentColor"/> </g> <g id="icon-print"> <path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 3.5v4H6V2h12v5.5h-1.5v-4h-9ZM18 18h2a2 2 0 0 0 2-2v-5a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h2v4h12v-4Zm0-1.5h2a.5.5 0 0 0 .5-.5v-5a.5.5 0 0 0-.5-.5H4a.5.5 0 0 0-.5.5v5a.5.5 0 0 0 .5.5h2V14h12v2.5Zm-1.5 0v-1h-9v5h9v-4Z" fill="currentColor"/> </g> <g id="icon-quote"> <path d="M0 15.224v.147C0 18.375 2.32 20.5 5.366 20.5c3.045 0 5.22-2.125 5.22-5.13v-.146c0-2.345-1.305-4.103-3.408-4.836L9.208 3.5H3.77l-2.755 7.62C.29 12.88 0 14.126 0 15.225Zm13.414 0v.147c0 3.004 2.32 5.129 5.365 5.129 3.046 0 5.221-2.125 5.221-5.13v-.146c0-2.345-1.305-4.103-3.408-4.836l2.03-6.888h-5.438l-2.755 7.62c-.725 1.76-1.015 3.005-1.015 4.104Z" fill="currentColor"/> </g> <g id="icon-reddit"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12 3.5c2.815 0 4.902.908 6.287 2.333C19.678 7.265 20.5 9.364 20.5 12c0 2.58-.819 4.684-2.217 6.134-1.39 1.44-3.479 2.366-6.283 2.366-2.804 0-4.893-.926-6.283-2.366C4.319 16.684 3.5 14.58 3.5 12c0-2.647.803-4.744 2.18-6.171C7.048 4.41 9.13 3.5 12 3.5ZM12 2c6.3 0 10 4.1 10 10 0 5.8-3.7 10-10 10S2 17.8 2 12C2 6.1 5.6 2 12 2Zm4.693 5.963a.954.954 0 0 0-.94-.963.895.895 0 0 0-.493.145.93.93 0 0 0-.339.396l-2.183-.476a.257.257 0 0 0-.179.032.264.264 0 0 0-.105.152l-.665 3.226c-1.402.044-2.658.466-3.564 1.147a1.315 1.315 0 0 0-.907-.378c-.727 0-1.318.607-1.318 1.353 0 .261.073.517.212.736.138.22.336.393.569.498-.021.13-.033.271-.033.412C6.748 16.322 9.1 18 12.011 18c2.91 0 5.262-1.678 5.262-3.757 0-.134-.01-.268-.032-.4.432-.217.759-.694.759-1.246 0-.746-.59-1.353-1.318-1.353-.358 0-.675.14-.907.379-.897-.66-2.14-1.094-3.511-1.148l.6-2.89 1.952.422c.013.25.121.484.3.654a.925.925 0 0 0 1.306-.03.977.977 0 0 0 .27-.668Zm-7.709 5.598c0-.53.422-.964.94-.964.516 0 .937.433.937.964 0 .53-.421.963-.938.963a.953.953 0 0 1-.939-.963Zm4.134 0c0-.531.421-.964.938-.964.517 0 .939.434.939.964s-.422.963-.939.963a.953.953 0 0 1-.938-.963Zm-3.343 2.187a.243.243 0 0 1 .268-.055c.03.013.057.031.08.055.4.412 1.265.563 1.888.563.622 0 1.476-.152 1.887-.563a.245.245 0 0 1 .348 0 .283.283 0 0 1-.021.357c-.643.66-1.867.704-2.225.704-.358 0-1.592-.055-2.225-.704a.258.258 0 0 1 0-.357Z" fill="currentColor"/> </g> <g id="icon-rss"> <path d="M5.5 17c.945 0 1.5.615 1.5 1.5 0 .87-.555 1.5-1.5 1.5S4 19.37 4 18.5c0-.885.54-1.5 1.5-1.5Z" fill="currentColor"/> <path d="M18.405 20v.05H19.159V20A15.159 15.159 0 0 0 4 4.84h-.05V5.596H4a14.405 14.405 0 0 1 14.405 14.404Z" fill="currentColor" stroke="currentColor" stroke-width=".5"/> <path d="M12.06 19.997v.1h.568v-.1A8.628 8.628 0 0 0 4 11.37h-.1v.569H4a8.06 8.06 0 0 1 8.06 8.06Z" fill="currentColor" stroke="currentColor" stroke-width=".5"/> </g> <g id="icon-soundcloud"> <path d="M7 17h1.25V9.128a3.214 3.214 0 0 0-1.25.69V17Zm-2.5-5.325v5.316l.08.009h1.17v-5.334H4.58l-.08.009ZM2 14.332c0 .968.504 1.808 1.25 2.276V12.06A2.675 2.675 0 0 0 2 14.332ZM9.5 17h1.25V9.475A3.12 3.12 0 0 0 9.5 9.03V17Zm9.92-5.333h-.704c.036-.218.058-.439.058-.667 0-2.21-1.733-4-3.87-4-1.16 0-2.195.534-2.904 1.37V17h7.42c1.424 0 2.58-1.194 2.58-2.668 0-1.472-1.156-2.665-2.58-2.665Z" fill="currentColor"/> </g> <g id="icon-spotify"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12 3.5c2.815 0 4.902.908 6.287 2.333C19.678 7.265 20.5 9.364 20.5 12c0 2.58-.819 4.684-2.217 6.134-1.39 1.44-3.479 2.366-6.283 2.366-2.804 0-4.893-.926-6.283-2.366C4.319 16.684 3.5 14.58 3.5 12c0-2.647.803-4.744 2.18-6.171C7.048 4.41 9.13 3.5 12 3.5ZM12 2c6.3 0 10 4.1 10 10 0 5.8-3.7 10-10 10S2 17.8 2 12C2 6.1 5.6 2 12 2Zm3.355 14.164a.56.56 0 1 0 .586-.958c-2.372-1.45-5.313-1.787-8.741-1.003a.56.56 0 1 0 .25 1.094c3.132-.716 5.792-.424 7.905.867Zm.908-2.405a.702.702 0 0 0 .735-1.196c-2.779-1.707-6.842-2.188-10.11-1.196a.703.703 0 0 0 .407 1.343c2.862-.87 6.55-.438 8.968 1.049ZM6.867 9.935c2.77-.84 7.555-.682 10.456 1.04a.842.842 0 1 0 .86-1.447c-3.34-1.983-8.625-2.17-11.804-1.204a.842.842 0 0 0 .488 1.61Z" fill="currentColor"/> </g> <g id="icon-twitter"> <path d="M7.43644 0H0.0554206L9.23954 13.3075L0 24H2.56169L10.3768 14.9554L16.6191 24H24.0001L14.4803 10.2064L23.2993 0H20.7378L13.3428 8.55825L7.43644 0ZM11.6249 13.3737L3.58747 1.92749H6.256L20.4505 22.1423H17.7819L11.6249 13.3742V13.3737Z" fill="currentColor"/> </g> <g id="icon-user"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12 4.5c.925 0 1.512.293 1.87.66.363.375.63.974.63 1.84 0 .84-.264 1.444-.634 1.829-.363.375-.952.671-1.866.671-.914 0-1.503-.296-1.866-.671C9.764 8.444 9.5 7.84 9.5 7c0-.877.263-1.474.62-1.844.348-.36.93-.656 1.88-.656ZM12 3c2.52 0 4 1.64 4 4 0 2.32-1.48 4-4 4S8 9.32 8 7c0-2.36 1.44-4 4-4Zm4.814 13.275C15.772 15.203 14.184 14.5 12 14.5c-2.23 0-3.812.706-4.84 1.771C6.123 17.346 5.5 18.943 5.5 21H4c0-4.72 2.88-8 8-8 5.04 0 8 3.28 8 8h-1.5c0-2.046-.637-3.645-1.686-4.725Z" fill="currentColor"/> </g> <g id="icon-video"> <path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5h16a.5.5 0 0 1 .5.5v10a.5.5 0 0 1-.5.5H4a.5.5 0 0 1-.5-.5V7a.5.5 0 0 1 .5-.5ZM2 7a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V7Zm11.57 5.857L10 15V9l3.57 2.143a1 1 0 0 1 0 1.714Z" fill="currentColor"/> </g> <g id="icon-youtube"> <path d="M12 4.856c-.603 0-5.922.012-7.417.407A3.06 3.06 0 0 0 2.41 7.41C2.005 8.91 2 11.874 2 11.998c0 .125.005 3.088.412 4.59a3.06 3.06 0 0 0 2.172 2.147c1.494.394 6.814.406 7.415.406s5.922-.012 7.417-.408a3.06 3.06 0 0 0 2.172-2.146c.407-1.503.412-4.464.412-4.589 0-.124-.005-3.087-.412-4.588a3.06 3.06 0 0 0-2.172-2.147c-1.494-.395-6.814-.407-7.415-.407h-.002Zm0 12.782c-1.58 0-5.92-.065-7.023-.357A1.54 1.54 0 0 1 3.882 16.2c-.356-1.312-.361-4.172-.361-4.2 0-.03.005-2.89.36-4.202a1.54 1.54 0 0 1 1.096-1.082c1.102-.291 5.443-.356 7.022-.356 1.58 0 5.92.065 7.023.356.534.142.954.556 1.095 1.082.356 1.313.36 4.173.36 4.201 0 .029-.004 2.89-.36 4.201a1.541 1.541 0 0 1-1.095 1.082c-1.103.292-5.444.357-7.023.357Z" fill="currentColor"/> <path d="m14.41 11.997-3.598 2.399V9.598l3.599 2.4Z" fill="currentColor" stroke="currentColor"/> </g> <g id="icon-xing" > <path d="M6.08293 6.85766C5.93537 6.85766 5.81119 6.90951 5.74854 7.01091C5.68394 7.11555 5.69372 7.25044 5.76265 7.38695L7.42041 10.2566C7.42321 10.2621 7.42321 10.2656 7.42041 10.2706L4.81533 14.8677C4.74741 15.003 4.75073 15.139 4.81533 15.2438C4.87789 15.3447 4.98813 15.411 5.13586 15.411H7.5876C7.95412 15.411 8.13101 15.1636 8.2563 14.9375C8.2563 14.9375 10.804 10.4317 10.9032 10.2567C10.8932 10.2406 9.21765 7.31742 9.21765 7.31742C9.09533 7.10008 8.91114 6.85757 8.5351 6.85757L6.08293 6.85766Z" fill="currentColor"/> <path d="M16.3825 3.50025C16.0162 3.50025 15.8575 3.73095 15.726 3.96725C15.726 3.96725 10.4441 13.3342 10.27 13.6418C10.279 13.6584 13.7537 20.033 13.7537 20.033C13.8754 20.2504 14.0632 20.5 14.4388 20.5H16.8876C17.0354 20.5 17.1508 20.4444 17.213 20.3433C17.2784 20.2388 17.2766 20.1005 17.208 19.9644L13.7515 13.6493C13.7499 13.647 13.7491 13.6442 13.7491 13.6413C13.7491 13.6384 13.7499 13.6356 13.7515 13.6333L19.1799 4.03507C19.2482 3.89958 19.2496 3.76138 19.1851 3.65666C19.1225 3.55568 19.0068 3.5 18.859 3.5L16.3825 3.50025Z" fill="currentColor"/> </g> </defs> </svg> <div id="page" class="site"> <header class="header header--bg-iw-blue"> <div id="primaryNav" class="container header__container"> <!-- header logo --> <div class="header__logo-container"> <a href="https://www.infoworld.com" aria-label="Home page"> <svg width="149" height="30" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 74"><defs><style>.cls-1{fill:none;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="InfoWorld"><polygon points="0.53 3.28 0.53 11.67 8.67 11.67 8.67 63.88 0.53 63.88 0.53 72.3 29.17 72.3 29.17 63.88 20.89 63.88 20.89 11.67 29.17 11.67 29.17 3.28 0.53 3.28"/><path d="M46.72,24.8,44.22,27V20.15H25.91V28.2h6.18v44H44.24c0-1.42,0-36.91,0-36.91l.54-.44C48,32.28,51.17,31,54.31,31A5.28,5.28,0,0,1,59,33.28c.87,1.35,1.3,3.53,1.3,6.84V72.19H72.47c0-1.41,0-33.41,0-33.41,0-13.12-4.2-19.51-12.84-19.51-4.31,0-8.66,1.87-12.93,5.53"/><path d="M83.11,5.38h0a18.25,18.25,0,0,0-4,12v2.35H73.66v8.48h5.48V72.3H90.35V28.21H101.9V19.73H90.44V16.54c0-5.16,1.79-6.94,4.5-8,2.47-1,6.52-.79,10,1.24V2.82A25.63,25.63,0,0,0,94.84.7c-5,0-9.26,1.71-11.73,4.68"/><path d="M112.33,46.5c0-12.37,4.17-18.65,12.38-18.65a10.69,10.69,0,0,1,9.29,5c2.12,3.11,3.2,7.43,3.2,12.83,0,6.13-1.11,10.74-3.31,13.72a10.93,10.93,0,0,1-9.18,4.74,10.32,10.32,0,0,1-9.49-5.34,24,24,0,0,1-2.89-12.31M106.71,26h0c-4.93,4.82-7.41,11.57-7.41,20s2.48,15.21,7.41,20a25,25,0,0,0,18.05,7.19A24.73,24.73,0,0,0,142.91,66c4.86-4.87,7.32-11.57,7.32-20s-2.49-15.22-7.39-20a26.29,26.29,0,0,0-36.13,0"/><path d="M224.75,46.5c0-12.37,4.16-18.65,12.36-18.65a10.73,10.73,0,0,1,9.31,5c2.11,3.11,3.17,7.43,3.17,12.83,0,6.13-1.1,10.74-3.3,13.72a10.92,10.92,0,0,1-9.18,4.74,10.31,10.31,0,0,1-9.48-5.34,24.06,24.06,0,0,1-2.88-12.31M219.13,26h0c-4.93,4.82-7.43,11.57-7.43,20s2.5,15.21,7.43,20A26.26,26.26,0,0,0,255.32,66c4.86-4.87,7.32-11.57,7.32-20s-2.49-15.22-7.4-20a26.26,26.26,0,0,0-36.11,0"/><path d="M279.68,33.37V20.15H262.8V28.2h4.9s0,42.56,0,44h12.21V53.75c0-4.85.27-8.88,1.8-12.33,1.61-3.62,3.74-6,6.33-7.16a26.8,26.8,0,0,1,8.57-1.51V19.3c-5.48,0-13.95,5.73-16.89,14.07"/><polygon points="295.59 1.12 295.59 9.85 300.01 9.85 300.01 72.3 312.36 72.3 312.36 1.12 295.59 1.12"/><path d="M337.76,64.15c-3.71,0-6.52-1.79-8.35-5.34a26.62,26.62,0,0,1-2.55-12.31c0-12.37,3.67-18.65,10.9-18.65,3.45,0,6.21,1.68,8.19,5,1.86,3.11,2.81,7.43,2.81,12.83,0,6.13-1,10.74-2.92,13.72-2,3.15-4.76,4.74-8.08,4.74m4.54-63V9.85h4.77v14a15.41,15.41,0,0,0-11.25-5c-5.72,0-10.62,2.43-14.57,7.19s-6,11.56-6,20,2,15.21,6,20,8.85,7.19,14.57,7.19a15.78,15.78,0,0,0,11.25-5v3.86h12.4V1.12Z"/><path d="M200,3v9.25h5.56l-9,40.57L187,3.07h0V3H170.84v9.25h6.35l0,.24L168.6,52.91l-9.75-40.66h6V3H141.63v9.25h4.87S161.8,71,162.09,72h10l9.27-40.83,9,40.83h10.77c.3-1,13.6-59.7,13.6-59.7h5.13V3Z"/></g><rect class="cls-1" width="360" height="74"/></g></g></svg> </a> </div> <nav class="header__nav"> <!-- primary menu nevigation --> <div class="header__nav-left"> <ul class="header__nav-items"> <li class="header__nav-item"> <button class="header__nav-link" type="button" aria-label="Open topics menu" data-menu-trigger="topics"> <span> <svg class="icon icon--lg" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-layer-group"></use> </svg> Topics </span> </button> </li> <li class='header__nav-item'><a class='header__nav-link' href='https://www.infoworld.com/spotlight-ai-in-enterprise/'>Spotlight: AI in Enterprise</a></li><li class='header__nav-item'><a class='header__nav-link' href='https://www.infoworld.com/videos/'>Videos</a></li><li class='header__nav-item'><a class='header__nav-link' href='/newsletters/signup/'>Newsletters</a></li><li class='header__nav-item'><a class='header__nav-link' href='https://us.resources.infoworld.com/'>Resources</a></li> </ul> </div> <!-- right side header navigation --> <div class="header__nav-right"> <button class="header__icon-button" type="button" aria-label="Open search" data-menu-trigger="search" > <svg class="icon icon--lg" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" > <use xlink:href="#icon-magnifying-glass"></use> </svg> </button> <button class="header__main-menu-button header__main-menu-button--mobile" type="button" aria-label="Open main menu" data-menu-trigger="main-mobile"> <svg class="icon icon--lg" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-circle-bars"></use> </svg> </button> <button class="header__main-menu-button" type="button" aria-label="Open main menu" data-menu-trigger="main"> <svg class="icon icon--lg" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-circle-bars"></use> </svg> </button> </div> <!-- right section menu container --> <div class="header__menu" data-menu="main"> <div class="container container--no-padding header__menu-container"> <button class="header__menu-close-main-button" type="button" aria-label="Close main menu" data-menu-close="main"> <svg class="icon icon--lg" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-circle-xmark"></use> </svg> </button> <div class="container grid header__menu-content"><div class="col-12 col-3@lg"><h2 class="header__menu-title header__menu-title--large">About</h2><ul class="header__menu-items"><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/about-us/">About us</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://foundryco.com/our-brands/infoworld/">Advertise</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/contact-us/">Contact Us</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://foundryco.com/work-here/">Foundry Careers</a></li><li class="header__menu-item"><a class="header__menu-link" href="/newsletters/signup/">Newsletters</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/contact-us/#republication-permissions">Reprints</a></li></ul></div><div class="col-12 col-3@lg"><h2 class="header__menu-title header__menu-title--large">Policies</h2><ul class="header__menu-items"><li class="header__menu-item"><a class="header__menu-link" href="https://foundryco.com/terms-of-service-agreement/">Terms of Service</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/privacy-policy/">Privacy Policy</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/cookie-policy/">Cookie Policy</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://foundryco.com/copyright-notice/">Copyright Notice</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/member-preferences/">Member Preferences</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/about-adchoices/">About AdChoices</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/e-commerce-affiliate-relationships/">E-commerce Affiliate Relationships</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/your-california-privacy-rights/">Your California Privacy Rights</a></li></ul></div><div class="col-12 col-3@lg"><h2 class="header__menu-title header__menu-title--large">Our Network</h2><ul class="header__menu-items"><li class="header__menu-item"><a class="header__menu-link" href="https://www.cio.com/">CIO</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.computerworld.com/">Computerworld</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.csoonline.com/">CSO</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.networkworld.com/">Network World</a></li></ul></div><div class="col-12 col-3@lg"><h2 class="header__menu-title header__menu-title--large">More</h2><ul class="header__menu-items"><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/blogs/">Blogs</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/brandposts/">BrandPosts</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/events/">Events</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/videos/">Videos</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/enterprise-buyers-guide/">Enterprise Buyer鈥檚 Guides</a></li></div> </div> </div> </nav> </div> <!-- Topic menu --> <div class="header__menu" data-menu="topics"> <div class="container container--no-padding header__menu-container"> <div class="container grid header__menu-content"> <div class="header__menu-close-button"> <button class="button button--quaternary" type="button" data-menu-close="topics" aria-label="Close topics menu"> <span>Close</span> <span> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-circle-xmark"></use> </svg> </span> </button> </div> <div class='col-12 col-6@lg'> <ul class='header__menu-items header__menu-items--large'><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/analytics/'>Analytics</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/artificial-intelligence/'>Artificial Intelligence</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/generative-ai/'>Generative AI</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/careers/'>Careers</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/cloud-computing/'>Cloud Computing</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/data-management/'>Data Management</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/database/'>Databases</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/emerging-technology/'>Emerging Technology</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/technology-business/'>Technology Industry</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/security/'>Security</a></li></ul></div><div class='col-12 col-6@lg'> <ul class='header__menu-items header__menu-items--large'><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/software-development/'>Software Development</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/microsoft-net/'>Microsoft .NET</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/development-tools/'>Development Tools</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/devops/'>Devops</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/open-source/'>Open Source</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/programming-languages/'>Programming Languages</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/java/'>Java</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/javascript/'>JavaScript</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/python/'>Python</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/enterprise-buyers-guide/'>Enterprise Buyer鈥檚 Guides</a></li></ul></div> </div> </div> </div> <!-- edition menu --> <div class="header__menu" data-menu="location"> <div class="container container--no-padding header__menu-container"> <div class="header__menu-back-button"> <button class="button button--quaternary" type="button" data-menu-trigger="main-mobile" aria-label="Back to main menu"> <span> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-circle-chevron-left"></use> </svg> </span> <span>Back</span> </button> </div> <div class="container grid header__menu-content"> <div class="header__menu-close-button"> <button class="button button--quaternary" type="button" data-menu-close="location" aria-label="Close location menu"> <span>Close</span> <span> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-circle-xmark"></use> </svg> </span> </button> </div> </div> </div> </div> <div class="header__menu header__menu--inverted" data-menu="search"> <div class="header__menu-container"> <div class="header__menu-back-button"> <button class="button button--quaternary" type="button" data-menu-trigger="main-mobile" aria-label="Back to main menu"> <span> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-circle-chevron-left"></use> </svg> </span> <span>Back</span> </button> </div> <div class="container header__menu-content"> <div class="header__menu-close-button"> <button class="button button--quaternary" type="button" data-menu-close="search" aria-label="Close search"> <span>Close</span> <span> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-circle-xmark"></use> </svg> </span> </button> </div> <div class="google-programmable-search"> <div class="google-programmable-search__searchbox"> <div class="gcse-searchbox-only" data-resultsUrl="https://www.infoworld.com/search"></div> </div> <div class="grid google-programmable-search__popular-topics-container"> <div class="col-12 google-programmable-search__popular-topics-title"> Popular Topics </div> <div class="col-12 col-6@lg"> <div class='grid grid--cols-6@lg'> <ul class='col-12 col-6@md col-3@lg google-programmable-search__menu-items'><li><a class='google-programmable-search__menu-link' href='https://www.infoworld.com/artificial-intelligence/'>Artificial Intelligence</a></li><li><a class='google-programmable-search__menu-link' href='https://www.infoworld.com/cloud-computing/'>Cloud Computing</a></li></ul><ul class='col-12 col-6@md col-3@lg google-programmable-search__menu-items'><li><a class='google-programmable-search__menu-link' href='https://www.infoworld.com/data-management/'>Data Management</a></li><li><a class='google-programmable-search__menu-link' href='https://www.infoworld.com/software-development/'>Software Development</a></li></ul></div> </div> </div> </div> </div> </div> </div> <div id="primaryNav" class="header__menu" data-menu="main-mobile"> <div class="container container--no-padding header__menu-container"> <button class="header__menu-close-main-button" type="button" aria-label="Close main menu" data-menu-close="main-mobile"> <svg class="icon icon--lg" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-circle-xmark"></use> </svg> </button> <div class="container grid header__menu-content"> <div class="col-12"> <ul class="header__menu-items header__menu-items--small"> <li class="header__menu-item"> <button class="header__menu-link" type="button" aria-label="Open search" data-menu-trigger="search"> <span> <svg class="icon icon--sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-magnifying-glass"></use> </svg> </span> <span>Search</span> </button> </li> </ul> </div> <div class="col-12"> <ul class="header__menu-items"> <li class="header__menu-item"> <button class="header__menu-link" type="button" aria-label="Open topics menu" data-menu-trigger="topics-mobile"> <span>Topics</span> <span> <svg class="icon icon--sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-layer-group"></use> </svg> </span> </button> </li> <li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/spotlight-ai-in-enterprise/'>Spotlight: AI in Enterprise</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/videos/'>Videos</a></li><li class='header__menu-item'><a class='header__menu-link' href='/newsletters/signup/'>Newsletters</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://us.resources.infoworld.com/'>Resources</a></li><li class='header__menu-item'><button class='header__menu-link' type='button' data-menu-trigger='hamburger-100007742'>About</button><li class='header__menu-item'><button class='header__menu-link' type='button' data-menu-trigger='hamburger-100007749'>Policies</button><li class='header__menu-item'><button class='header__menu-link' type='button' data-menu-trigger='hamburger-100007758'>Our Network</button><li class='header__menu-item'><button class='header__menu-link' type='button' data-menu-trigger='hamburger-100007763'>More</button> </ul> </div> </div> </div> </div> <div class="header__menu" data-menu="topics-mobile"> <div class="container container--no-padding header__menu-container"> <div class="header__menu-back-button"> <button class="button button--quaternary" type="button" data-menu-trigger="main-mobile" aria-label="Back to main menu"> <span> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-circle-chevron-left"></use> </svg> </span> <span>Back</span> </button> </div> <div class="container grid header__menu-content"> <div class="col-12"> <h2 class="header__menu-title"> <span>Topics</span> <svg class="icon icon--sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-layer-group"></use> </svg> </h2> <ul class="header__menu-items header__menu-items--small header__menu-items--divider"> <li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/analytics/'>Analytics</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/artificial-intelligence/'>Artificial Intelligence</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/generative-ai/'>Generative AI</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/careers/'>Careers</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/cloud-computing/'>Cloud Computing</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/data-management/'>Data Management</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/database/'>Databases</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/emerging-technology/'>Emerging Technology</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/technology-business/'>Technology Industry</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/security/'>Security</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/software-development/'>Software Development</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/microsoft-net/'>Microsoft .NET</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/development-tools/'>Development Tools</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/devops/'>Devops</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/open-source/'>Open Source</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/programming-languages/'>Programming Languages</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/java/'>Java</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/javascript/'>JavaScript</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/python/'>Python</a></li><li class='header__menu-item'><a class='header__menu-link' href='https://www.infoworld.com/enterprise-buyers-guide/'>Enterprise Buyer鈥檚 Guides</a></li> </ul> </div> </div> </div> </div> <!-- hamburger menu --> <div class="header__menu" data-menu="hamburger-100007742"> <div class="container header__menu-container"> <button class="button button--quaternary header__menu-back-button" type="button" data-menu-trigger="main-mobile" aria-label="Back to main menu"> <svg class="icon icon--sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <circle cx="12" cy="12" r="9" stroke="currentColor" /> <path d="m9.976 11.22.312.39-.312-.39Zm4.336 4.39-4.024-3.22-.624.781 4.024 3.22.624-.781Zm-4.024-4 4.024-3.22-.624-.78-4.024 3.219.624.78Zm0 .78a.5.5 0 0 1 0-.78l-.624-.781a1.5 1.5 0 0 0 0 2.342l.624-.78Z" fill="currentColor" /> </svg> Back </button> <div class="grid header__menu-content"> <button class="header__menu-close-button" type="button" aria-label="Close hamburger menu" data-menu-close="hamburger"> <svg class="icon icon--sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <path stroke="currentColor" stroke-width="2" d="M1.293 22.506 22.506 1.293M1.707 1.293 22.92 22.506" /> </svg> </button> <div class="col-12 col-2@lg"><h2 class="header__menu-title">About</h2><ul class="header__menu-items header__menu-items--small header__menu-items--divider"><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/about-us/">About us</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://foundryco.com/our-brands/infoworld/">Advertise</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/contact-us/">Contact Us</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://foundryco.com/work-here/">Foundry Careers</a></li><li class="header__menu-item"><a class="header__menu-link" href="/newsletters/signup/">Newsletters</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/contact-us/#republication-permissions">Reprints</a></li></ul></div> </div> </div> </div> <div class="header__menu" data-menu="hamburger-100007749"> <div class="container header__menu-container"> <button class="button button--quaternary header__menu-back-button" type="button" data-menu-trigger="main-mobile" aria-label="Back to main menu"> <svg class="icon icon--sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <circle cx="12" cy="12" r="9" stroke="currentColor" /> <path d="m9.976 11.22.312.39-.312-.39Zm4.336 4.39-4.024-3.22-.624.781 4.024 3.22.624-.781Zm-4.024-4 4.024-3.22-.624-.78-4.024 3.219.624.78Zm0 .78a.5.5 0 0 1 0-.78l-.624-.781a1.5 1.5 0 0 0 0 2.342l.624-.78Z" fill="currentColor" /> </svg> Back </button> <div class="grid header__menu-content"> <button class="header__menu-close-button" type="button" aria-label="Close hamburger menu" data-menu-close="hamburger"> <svg class="icon icon--sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <path stroke="currentColor" stroke-width="2" d="M1.293 22.506 22.506 1.293M1.707 1.293 22.92 22.506" /> </svg> </button> <div class="col-12 col-2@lg"><h2 class="header__menu-title">Policies</h2><ul class="header__menu-items header__menu-items--small header__menu-items--divider"><li class="header__menu-item"><a class="header__menu-link" href="https://foundryco.com/terms-of-service-agreement/">Terms of Service</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/privacy-policy/">Privacy Policy</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/cookie-policy/">Cookie Policy</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://foundryco.com/copyright-notice/">Copyright Notice</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/member-preferences/">Member Preferences</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/about-adchoices/">About AdChoices</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/e-commerce-affiliate-relationships/">E-commerce Affiliate Relationships</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/your-california-privacy-rights/">Your California Privacy Rights</a></li></ul></div> </div> </div> </div> <div class="header__menu" data-menu="hamburger-100007758"> <div class="container header__menu-container"> <button class="button button--quaternary header__menu-back-button" type="button" data-menu-trigger="main-mobile" aria-label="Back to main menu"> <svg class="icon icon--sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <circle cx="12" cy="12" r="9" stroke="currentColor" /> <path d="m9.976 11.22.312.39-.312-.39Zm4.336 4.39-4.024-3.22-.624.781 4.024 3.22.624-.781Zm-4.024-4 4.024-3.22-.624-.78-4.024 3.219.624.78Zm0 .78a.5.5 0 0 1 0-.78l-.624-.781a1.5 1.5 0 0 0 0 2.342l.624-.78Z" fill="currentColor" /> </svg> Back </button> <div class="grid header__menu-content"> <button class="header__menu-close-button" type="button" aria-label="Close hamburger menu" data-menu-close="hamburger"> <svg class="icon icon--sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <path stroke="currentColor" stroke-width="2" d="M1.293 22.506 22.506 1.293M1.707 1.293 22.92 22.506" /> </svg> </button> <div class="col-12 col-2@lg"><h2 class="header__menu-title">Our Network</h2><ul class="header__menu-items header__menu-items--small header__menu-items--divider"><li class="header__menu-item"><a class="header__menu-link" href="https://www.cio.com/">CIO</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.computerworld.com/">Computerworld</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.csoonline.com/">CSO</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.networkworld.com/">Network World</a></li></ul></div> </div> </div> </div> <div class="header__menu" data-menu="hamburger-100007763"> <div class="container header__menu-container"> <button class="button button--quaternary header__menu-back-button" type="button" data-menu-trigger="main-mobile" aria-label="Back to main menu"> <svg class="icon icon--sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <circle cx="12" cy="12" r="9" stroke="currentColor" /> <path d="m9.976 11.22.312.39-.312-.39Zm4.336 4.39-4.024-3.22-.624.781 4.024 3.22.624-.781Zm-4.024-4 4.024-3.22-.624-.78-4.024 3.219.624.78Zm0 .78a.5.5 0 0 1 0-.78l-.624-.781a1.5 1.5 0 0 0 0 2.342l.624-.78Z" fill="currentColor" /> </svg> Back </button> <div class="grid header__menu-content"> <button class="header__menu-close-button" type="button" aria-label="Close hamburger menu" data-menu-close="hamburger"> <svg class="icon icon--sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <path stroke="currentColor" stroke-width="2" d="M1.293 22.506 22.506 1.293M1.707 1.293 22.92 22.506" /> </svg> </button> <div class="col-12 col-2@lg"><h2 class="header__menu-title">More</h2><ul class="header__menu-items header__menu-items--small header__menu-items--divider"><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/blogs/">Blogs</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/brandposts/">BrandPosts</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/events/">Events</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/videos/">Videos</a></li><li class="header__menu-item"><a class="header__menu-link" href="https://www.infoworld.com/enterprise-buyers-guide/">Enterprise Buyer鈥檚 Guides</a></li> </header> <div class="advert-sticky ad ad-banner has-ad-prefix is-sticky page-ad advert--bg-iw-blue" data-ad-template="banner" data-ofp="false"></div><div class="advert"> <div class="container advert__container"> <div class="advert__content"><div class="ad ad-overlay" data-ad-template="overlay" data-ofp="true"></div></div></div></div><div class="advert"> <div class="container advert__container"> <div class="advert__content"><div class="ad ad-skin" data-ad-template="skin" data-ofp="true"></div></div></div></div> <main id="primary" class="site-main static-page-wrapper"> <section class="topic-hero topic-hero--bg-iw-blue"> <div class="container"> <div class="topic-hero__breadcrumbs"> <div class="breadcrumbs"> <a class="breadcrumbs__item" href="https://www.infoworld.com/">Home</a><a class="breadcrumbs__item" href="">Software Development</a> </div> </div> <div class="topic-hero__container"> <div class="topic-hero__content"> <h1 class="topic-hero__title">Software Development</h1> <p class="topic-hero__description">Software Development | News, how-tos, features, reviews, and videos </p> </div> <div class="topic-hero__links"> <div class="jump-links"> <div class="jump-links__text">Jump to</div> <div class="jump-links__links"> <a class="chip chip--anchor" href="#latest">Latest</a> <a class="chip chip--anchor" href="#article">Articles</a> <a class="chip chip--anchor" href="#upcoming_events">Events</a> <a class="chip chip--anchor" href="#resources">Resources</a> <a class="chip chip--anchor" href="#podcast">Podcasts</a> </div> </div> </div> </div> </div> </section> <article id="post-100007624" class="post-100007624 page type-page status-publish"> <div class="entry-content"> <div id="remove_no_follow"> <section class="wp-block-bigbite-multi-title"><div class="container"></div></section> <section class="latest-content " id="latest"> <div class="container"><div class="latest-content__head"></div><div class="grid latest-content__content"><div class="col-12 col-7@md col-8@lg"><div class="latest-content__content-featured"><a class="card card--xxl " href="https://www.infoworld.com/article/3557641/typescript-5-7-arrives-with-improved-error-reporting.html" aria-label="Go to content"><div class="card__header"><span class="card__content-type">news</span></div><div class="card__image"><div class="insider-image"><div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?quality=50&amp;strip=all&amp;w=1046" srcset="https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?quality=50&amp;strip=all 8256w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=300%2C200&amp;quality=50&amp;strip=all 300w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=768%2C512&amp;quality=50&amp;strip=all 768w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=1024%2C683&amp;quality=50&amp;strip=all 1024w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=1536%2C1024&amp;quality=50&amp;strip=all 1536w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=2048%2C1365&amp;quality=50&amp;strip=all 2048w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=1240%2C826&amp;quality=50&amp;strip=all 1240w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=150%2C100&amp;quality=50&amp;strip=all 150w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=1046%2C697&amp;quality=50&amp;strip=all 1046w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=252%2C168&amp;quality=50&amp;strip=all 252w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=126%2C84&amp;quality=50&amp;strip=all 126w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=720%2C480&amp;quality=50&amp;strip=all 720w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=540%2C360&amp;quality=50&amp;strip=all 540w, https://www.infoworld.com/wp-content/uploads/2024/11/3557641-0-23318300-1732305514-shutterstock_1702515205.jpg?resize=375%2C250&amp;quality=50&amp;strip=all 375w" data-id="idg_render_hero_index_one_card_image" sizes=" (min-resolution: 3dppx) and (max-width: 600px) 900px, (min-resolution: 3dppx) and (max-width: 1200px) 1200px, (min-resolution: 2dppx) and (max-width: 600px) 900px, (min-resolution: 2dppx) and (max-width: 1200px) 1200px, (min-resolution: 1dppx) and (max-width: 600px) 900px, (min-resolution: 1dppx) and (max-width: 2000px) 1300px" alt="Image" loading="eager" width="400px"></div></div></div><h4 class="card__title" id="typescript-5-7-arrives-with-improved-error-reporting">TypeScript 5.7 arrives with improved error reporting</h4><p class="card__description">Microsoft&rsquo;s strongly typed JavaScript is now available in a production release, featuring new checks for variables that were never initialized.</p><div class="card__info"><span>By Paul Krill</span></div><div class="card__info card__info--light"><span>Nov 22, 2024</span><span>3 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">JavaScript</span></span><span class="card__tag"><span class="tag">Typescript</span></span><span class="card__tag"><span class="tag">Programming Languages</span></span></div></a> </div><div class="grid grid--cols-7@md grid--cols-8@lg latest-content__content-main"><div class="col-12 col-7@md col-4@lg latest-content__card-main"><a class="card " href="https://www.infoworld.com/article/3491404/jdk-24-the-new-features-in-java-24.html" aria-label="Go to content"><div class="card__header"><span class="card__content-type">news</span></div><div class="card__image"> <div class="insider-image"><div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?quality=50&amp;strip=all&amp;w=1046" srcset="https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?quality=50&amp;strip=all 5760w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=300%2C200&amp;quality=50&amp;strip=all 300w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=768%2C512&amp;quality=50&amp;strip=all 768w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=1024%2C683&amp;quality=50&amp;strip=all 1024w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=1536%2C1024&amp;quality=50&amp;strip=all 1536w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=2048%2C1365&amp;quality=50&amp;strip=all 2048w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=1240%2C826&amp;quality=50&amp;strip=all 1240w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=150%2C100&amp;quality=50&amp;strip=all 150w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=1046%2C697&amp;quality=50&amp;strip=all 1046w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=252%2C168&amp;quality=50&amp;strip=all 252w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=126%2C84&amp;quality=50&amp;strip=all 126w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=720%2C480&amp;quality=50&amp;strip=all 720w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=540%2C360&amp;quality=50&amp;strip=all 540w, https://www.infoworld.com/wp-content/uploads/2024/11/3491404-0-73630200-1732302745-shutterstock_560673883-100938137-orig.jpg?resize=375%2C250&amp;quality=50&amp;strip=all 375w" data-id="idg_render_hero_index_two_three_break" sizes="(min-resolution: 3dppx) and (max-width: 600px) 600px, (min-resolution: 3dppx) and (max-width: 1200px) 900px, (min-resolution: 2dppx) and (max-width: 600px) 600px, (min-resolution: 2dppx) and (max-width: 1200px) 900px, (min-resolution: 1dppx) and (max-width: 600px) 600px, (min-resolution: 1dppx) and (max-width: 2000px) 1024px" alt="Image" loading="lazy" width="400px"></div></div></div><h4 class="card__title" id="jdk-24-the-new-features-in-java-24">JDK 24: The new features in Java 24</h4><div class="card__info"><span>By Paul Krill</span></div><div class="card__info card__info--light"><span>Nov 22, 2024</span><span>13 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Java</span></span><span class="card__tag"><span class="tag">Programming Languages</span></span><span class="card__tag"><span class="tag">Software Development</span></span></div></a></div><div class="col-12 col-7@md col-4@lg latest-content__card-main"><span class="nativo-loading"></span><a id="nativofeatuedmed-1" class="card nativo" href="https://www.infoworld.com/article/3610696/aws-prepares-to-command-an-army-of-ai-agents.html" backfill="true" aria-label="Go to content"><div class="card__header"><span class="card__content-type">analysis</span></div><div class="card__image"> <div class="insider-image"><div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?quality=50&amp;strip=all&amp;w=1046" srcset="https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?quality=50&amp;strip=all 2400w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=300%2C200&amp;quality=50&amp;strip=all 300w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=768%2C512&amp;quality=50&amp;strip=all 768w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=1024%2C683&amp;quality=50&amp;strip=all 1024w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=1536%2C1024&amp;quality=50&amp;strip=all 1536w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=2048%2C1365&amp;quality=50&amp;strip=all 2048w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=1240%2C826&amp;quality=50&amp;strip=all 1240w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=150%2C100&amp;quality=50&amp;strip=all 150w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=1046%2C697&amp;quality=50&amp;strip=all 1046w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=252%2C168&amp;quality=50&amp;strip=all 252w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=126%2C84&amp;quality=50&amp;strip=all 126w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=720%2C480&amp;quality=50&amp;strip=all 720w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=540%2C360&amp;quality=50&amp;strip=all 540w, https://www.infoworld.com/wp-content/uploads/2024/11/3610696-0-57503100-1732294387-robot-wearing-suit-by-phonlamai-photo-via-shutterstock.jpg?resize=375%2C250&amp;quality=50&amp;strip=all 375w" data-id="idg_render_hero_index_two_three_break" sizes="(min-resolution: 3dppx) and (max-width: 600px) 600px, (min-resolution: 3dppx) and (max-width: 1200px) 900px, (min-resolution: 2dppx) and (max-width: 600px) 600px, (min-resolution: 2dppx) and (max-width: 1200px) 900px, (min-resolution: 1dppx) and (max-width: 600px) 600px, (min-resolution: 1dppx) and (max-width: 2000px) 1024px" alt="Image" loading="lazy" width="400px"></div></div></div><h4 class="card__title" id="aws-prepares-to-command-an-army-of-ai-agents">AWS prepares to command an army of AI agents</h4><div class="card__info"><span>By David Linthicum</span></div><div class="card__info card__info--light"><span>Nov 22, 2024</span><span>5 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Generative AI</span></span><span class="card__tag"><span class="tag">Cloud Native</span></span><span class="card__tag"><span class="tag">Artificial Intelligence</span></span></div></a></div></div></div><div class="col-12 col-5@md col-4@lg latest-content__content-secondary"><div class="latest-content__card-secondary"><a class="card " href="https://www.infoworld.com/article/3610712/angular-19-bolsters-server-side-rendering-with-incremental-hydration.html" aria-label="Go to content"><div class="card__header"> <span class="card__content-type">news</span></div><h4 class="card__title" id="angular-19-bolsters-server-side-rendering-with-incremental-hydration">Angular 19 bolsters server-side rendering with incremental hydration</h4><div class="card__info"><span>By Paul Krill</span></div> <div class="card__info card__info--light"><span>Nov 21, 2024</span><span>3 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Angular</span></span><span class="card__tag"><span class="tag">JavaScript</span></span><span class="card__tag"><span class="tag">Web Development</span></span></div></a> </div><div class="latest-content__card-secondary"><span class="nativo-loading"></span><a id="nativocardgrid-1" class="card nativo" href="https://www.infoworld.com/article/3610508/red-hat-linux-to-be-official-wsl-distro.html" backfill="true" aria-label="Go to content"><div class="card__header"> <span class="card__content-type">news</span></div><h4 class="card__title" id="red-hat-linux-to-be-official-wsl-distro">Red Hat Linux to be official WSL distro</h4><div class="card__info"><span>By Paul Krill</span></div> <div class="card__info card__info--light"><span>Nov 21, 2024</span><span>2 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Development Tools</span></span><span class="card__tag"><span class="tag">Software Development</span></span></div></a> </div><div class="latest-content__card-secondary"><a class="card " href="https://www.infoworld.com/article/3595651/advanced-programming-with-java-generics.html" aria-label="Go to content"><div class="card__header"> <span class="card__content-type">how-to</span></div><h4 class="card__title" id="advanced-programming-with-java-generics">Advanced programming with Java generics</h4><div class="card__info"><span>By Rafael del Nero</span></div> <div class="card__info card__info--light"><span>Nov 21, 2024</span><span>18 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Java</span></span><span class="card__tag"><span class="tag">Programming Languages</span></span><span class="card__tag"><span class="tag">Software Development</span></span></div></a> </div><div class="latest-content__card-secondary"><a class="card " href="https://www.infoworld.com/article/3609931/rhel-ai-jboss-eap-8-coming-to-azure-cloud.html" aria-label="Go to content"><div class="card__header"> <span class="card__content-type">news</span></div><h4 class="card__title" id="rhel-ai-jboss-eap-8-coming-to-azure-cloud">RHEL AI, JBoss EAP 8 coming to Azure cloud</h4><div class="card__info"><span>By Paul Krill</span></div> <div class="card__info card__info--light"><span>Nov 20, 2024</span><span>2 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Generative AI</span></span><span class="card__tag"><span class="tag">Java</span></span><span class="card__tag"><span class="tag">Microsoft Azure</span></span></div></a> </div><div class="latest-content__card-secondary"><a class="card " href="https://www.infoworld.com/article/2255250/what-is-rust-safe-fast-and-easy-software-development.html" aria-label="Go to content"><div class="card__header"> <span class="card__content-type">feature</span></div><h4 class="card__title" id="what-is-rust-safe-fast-and-easy-software-development">What is Rust? Safe, fast, and easy software development</h4><div class="card__info"><span>By Serdar Yegulalp</span></div> <div class="card__info card__info--light"><span>Nov 20, 2024</span><span>11 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Rust</span></span><span class="card__tag"><span class="tag">Programming Languages</span></span><span class="card__tag"><span class="tag">Software Development</span></span></div></a> </div><div class="latest-content__card-secondary"><a class="card " href="https://www.infoworld.com/article/3608206/kotlin-for-java-developers-classes-and-coroutines.html" aria-label="Go to content"><div class="card__header"> <span class="card__content-type">how-to</span></div><h4 class="card__title" id="kotlin-for-java-developers-classes-and-coroutines">Kotlin for Java developers: Classes and coroutines</h4><div class="card__info"><span>By Matthew Tyson</span></div> <div class="card__info card__info--light"><span>Nov 20, 2024</span><span>9 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Java</span></span><span class="card__tag"><span class="tag">Kotlin</span></span><span class="card__tag"><span class="tag">Programming Languages</span></span></div></a> </div></div></div></div></section><div class="advert"> <div class="container advert__container"> <div class="advert__content"><div class="ad page-ad has-ad-prefix ad-article" data-ad-template="article" data-ofp="false"></div></div></div></div> <div class="content-listing-articles" id="article"><div class="container"><h2 class="content-listing-articles__title" id="articles">Articles</h2><div class="content-listing-articles__container content-listing-articles__container--collapsed" data-collapse-articles="6" data-content-listing-articles><div class="content-listing-articles__row "><a class="grid content-row-article" href="https://www.infoworld.com/article/3609020/azure-ai-foundry-tools-up-for-changes-in-ai-applications.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">analysis</span></div><h4 class="card__title" id="azure-ai-foundry-tools-up-for-changes-in-ai-applications">Azure AI Foundry tools up for changes in AI applications</h4><p class="card__description">Microsoft&rsquo;s launch of Azure AI Foundry at Ignite 2024 signals a welcome shift from chatbots to agents and to using AI for business process automation.</p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Simon Bisson</span></div> <div class="card__info card__info--light"><span>Nov 20, 2024 </span><span>7 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Microsoft Azure</span></span><span class="card__tag"><span class="tag">Generative AI</span></span><span class="card__tag"><span class="tag">Development Tools</span></span></div></div></div></a></div><div class="content-listing-articles__row "><a class="grid content-row-article" href="https://www.infoworld.com/article/3609153/microsoft-unveils-imaging-apis-for-windows-copilot-runtime.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">news</span></div><h4 class="card__title" id="microsoft-unveils-imaging-apis-for-windows-copilot-runtime">Microsoft unveils imaging APIs for Windows Copilot Runtime</h4><p class="card__description">Generative AI-backed APIs will allow developers to build image super resolution, image segmentation, object erase, and OCR capabilities into Windows applications. </p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Paul Krill</span></div> <div class="card__info card__info--light"><span>Nov 19, 2024 </span><span>2 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Generative AI</span></span><span class="card__tag"><span class="tag">APIs</span></span><span class="card__tag"><span class="tag">Development Libraries and Frameworks</span></span></div></div></div></a></div><div class="content-listing-articles__row "><a class="grid content-row-article" href="https://www.infoworld.com/article/3607426/how-to-transform-your-architecture-review-board.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">analysis</span></div><h4 class="card__title" id="how-to-transform-your-architecture-review-board">How to transform your architecture review board</h4><p class="card__description">Architecture review boards have gone out of favor in the age of agile and devops, but what's really needed is a more collaborative approach.</p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Isaac Sacolick</span></div> <div class="card__info card__info--light"><span>Nov 19, 2024 </span><span>7 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Agile Development</span></span><span class="card__tag"><span class="tag">Devops</span></span><span class="card__tag"><span class="tag">Software Development</span></span></div></div></div></a></div><div class="content-listing-articles__row "><a class="grid content-row-article" href="https://www.infoworld.com/article/3608397/f-sharp-9-adds-nullable-reference-types.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">news</span></div><h4 class="card__title" id="f-9-adds-nullable-reference-types">F# 9 adds nullable reference types</h4><p class="card__description">Latest version of Microsoft&rsquo;s functional .NEt programming language provides a type-safe way to handle reference types that can have null as a valid value. </p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Paul Krill</span></div> <div class="card__info card__info--light"><span>Nov 18, 2024 </span><span>3 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Microsoft .NET</span></span><span class="card__tag"><span class="tag">Programming Languages</span></span><span class="card__tag"><span class="tag">Software Development</span></span></div></div></div></a></div><div class="content-listing-articles__row "><a class="grid content-row-article" href="https://www.infoworld.com/article/3608256/akka-distributed-computing-platform-adds-java-sdk.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">news</span></div><h4 class="card__title" id="akka-distributed-computing-platform-adds-java-sdk">Akka distributed computing platform adds Java SDK</h4><p class="card__description">Akka enables development of applications that are primarily event-driven, deployable on Akka&rsquo;s serverless platform or on AWS, Azure, or GCP cloud instances.</p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Paul Krill</span></div> <div class="card__info card__info--light"><span>Nov 18, 2024 </span><span>2 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Java</span></span><span class="card__tag"><span class="tag">Scala</span></span><span class="card__tag"><span class="tag">Serverless Computing</span></span></div></div></div></a></div><div class="content-listing-articles__row "><a class="grid content-row-article" href="https://www.infoworld.com/article/3583482/14-preprocessors-for-programmers-who-love-to-code.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">feature</span></div><h4 class="card__title" id="14-great-preprocessors-for-developers-who-love-to-code">14 great preprocessors for developers who love to code</h4><p class="card__description">Sometimes it seems like the rules of programming are designed to make coding a chore. Here are 14 ways preprocessors can help make software development fun again.</p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Peter Wayner</span></div> <div class="card__info card__info--light"><span>Nov 18, 2024 </span><span>10 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Development Tools</span></span><span class="card__tag"><span class="tag">Software Development</span></span></div></div></div></a></div><div class="content-listing-articles__row content-listing-articles__row--hide"><a class="grid content-row-article" href="https://www.infoworld.com/article/3604648/designing-the-apis-that-accidentally-power-businesses.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">feature</span></div><h4 class="card__title" id="designing-the-apis-that-accidentally-power-businesses">Designing the APIs that accidentally power businesses</h4><p class="card__description">Well-designed APIs, even those often-neglected internal APIs, make developers more productive and businesses more agile. </p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Jean Yang</span></div> <div class="card__info card__info--light"><span>Nov 18, 2024 </span><span>6 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">APIs</span></span><span class="card__tag"><span class="tag">Software Development</span></span></div></div></div></a></div><div class="content-listing-articles__row content-listing-articles__row--hide"><a class="grid content-row-article" href="https://www.infoworld.com/article/3607483/spin-3-0-supports-polyglot-development-using-wasm-components.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">news</span></div><h4 class="card__title" id="spin-3-0-supports-polyglot-development-using-wasm-components">Spin 3.0 supports polyglot development using Wasm components</h4><p class="card__description">Fermyon&rsquo;s open source framework for building server-side WebAssembly apps allows developers to compose apps from components created with different languages.</p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Paul Krill</span></div> <div class="card__info card__info--light"><span>Nov 18, 2024 </span><span>2 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Microservices</span></span><span class="card__tag"><span class="tag">Serverless Computing</span></span><span class="card__tag"><span class="tag">Development Libraries and Frameworks</span></span></div></div></div></a></div><div class="content-listing-articles__row content-listing-articles__row--hide"><a class="grid content-row-article" href="https://www.infoworld.com/article/3607388/go-language-evolving-for-future-hardware-ai-workloads.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">news</span></div><h4 class="card__title" id="go-language-evolving-for-future-hardware-ai-workloads">Go language evolving for future hardware, AI workloads</h4><p class="card__description">The Go team is working to adapt Go to large multicore systems, the latest hardware instructions, and the needs of developers of large-scale AI systems. </p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Paul Krill</span></div> <div class="card__info card__info--light"><span>Nov 15, 2024 </span><span>3 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Google Go</span></span><span class="card__tag"><span class="tag">Generative AI</span></span><span class="card__tag"><span class="tag">Programming Languages</span></span></div></div></div></a></div><div class="content-listing-articles__row content-listing-articles__row--hide"><a class="grid content-row-article" href="https://www.infoworld.com/article/3606874/the-1-python-ide-is.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">analysis</span></div><h4 class="card__title" id="and-the-1-python-ide-is">And the #1 Python IDE is . . .</h4><p class="card__description">PyCharm, VS Code, and five other popular Python IDEs duke it out. Which one do you think takes home the prize?</p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Serdar Yegulalp</span></div> <div class="card__info card__info--light"><span>Nov 15, 2024 </span><span>2 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Python</span></span><span class="card__tag"><span class="tag">Programming Languages</span></span><span class="card__tag"><span class="tag">Software Development</span></span></div></div></div></a></div><div class="content-listing-articles__row content-listing-articles__row--hide"><a class="grid content-row-article" href="https://www.infoworld.com/article/3606753/rust-foundation-moves-forward-on-c-and-rust-interoperability.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">news</span></div><h4 class="card__title" id="rust-foundation-moves-forward-on-c-and-rust-interoperability">Rust Foundation moves forward on C++ and Rust interoperability</h4><p class="card__description">Problem statement released to address the challenges to making cross-language development with C++ and Rust more accessible and approachable. </p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Paul Krill</span></div> <div class="card__info card__info--light"><span>Nov 14, 2024 </span><span>2 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">C++</span></span><span class="card__tag"><span class="tag">Rust</span></span><span class="card__tag"><span class="tag">Programming Languages</span></span></div></div></div></a></div><div class="content-listing-articles__row content-listing-articles__row--hide"><a class="grid content-row-article" href="https://www.infoworld.com/article/3606613/jetbrains-ides-ease-debugging-for-kubernetes-apps.html" aria-label="Go to content"><div class="col-12 col-7@md content-row-article__main"><div class="card card--lg"><div class="card__header"><span class="card__content-type">news</span></div><h4 class="card__title" id="jetbrains-ides-ease-debugging-for-kubernetes-apps">JetBrains IDEs ease debugging for Kubernetes apps</h4><p class="card__description">Version 2024.3 updates to IntelliJ, PyCharm, WebStorm, and other JetBrains IDEs streamline remote debugging of Kubernetes microservices and much more. </p></div></div><div class="col-12 col-4@md col-start-9@md content-row-article__secondary"><div class="card card--lg"><div class="card__info"><span>By Paul Krill</span></div> <div class="card__info card__info--light"><span>Nov 14, 2024 </span><span>3 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Integrated Development Environments</span></span><span class="card__tag"><span class="tag">Java</span></span><span class="card__tag"><span class="tag">Python</span></span></div></div></div></a></div></div><div class="grid content-listing-articles__button-wrapper"> <div class="col-6 col-4@md col-start-5@md"><div class="content-listing-articles__button-show"> <button class="button button--tertiary" type="button" data-toggle="expand"> <span>Show more</span> <span> <svg class="icon icon--sm" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-chevron-down"></use> </svg> </span> </button> </div> <div class="content-listing-articles__button-show content-listing-articles__button-show--hide"> <button class="button button--tertiary" type="button" data-toggle="collapse"> <span>Show less</span> <span> <svg class="icon icon--sm" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-chevron-up"></use> </svg> </span> </button> </div></div><div class="col-6 col-4@md content-listing-articles__button-view-all"> <a class="button" href="https://www.infoworld.com/software-development/page/2/" target="_blank"> View all </a></div></div></div></div> <section class="suggested-content-upcoming-events" id="upcoming_events"><div class="container"> <h2 class="suggested-content-upcoming-events__title" id="upcoming-events">Upcoming Events</h2><a class="grid suggested-content-upcoming-events__item" href="https://www.idgevents.com/P7zbE?rt=D6xu4cPNx0-y6xS43PXNPA&amp;RefId=evp" aria-label="Go to content"><div class="col-12 col-3@md suggested-content-upcoming-events__date-label dd"><span class="date-label">28/Nov</span></div><div class="col-12 col-4@md col-5@xl suggested-content-upcoming-events__image"><div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/06/CSO_Summit-2024-4.png?w=1240" srcset="https://www.infoworld.com/wp-content/uploads/2024/06/CSO_Summit-2024-4.png?quality=50&amp;strip=all%201920w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_Summit-2024-4.png?resize=300%2C168&amp;quality=50&amp;strip=all%20300w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_Summit-2024-4.png?resize=768%2C432&amp;quality=50&amp;strip=all%20768w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_Summit-2024-4.png?resize=1024%2C576&amp;quality=50&amp;strip=all%201024w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_Summit-2024-4.png?resize=1536%2C864&amp;quality=50&amp;strip=all%201536w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_Summit-2024-4.png?resize=1240%2C697&amp;quality=50&amp;strip=all%201240w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_Summit-2024-4.png?resize=150%2C84&amp;quality=50&amp;strip=all%20150w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_Summit-2024-4.png?resize=854%2C480&amp;quality=50&amp;strip=all%20854w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_Summit-2024-4.png?resize=640%2C360&amp;quality=50&amp;strip=all%20640w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_Summit-2024-4.png?resize=444%2C250&amp;quality=50&amp;strip=all%20444w" alt="Image" loading="lazy" width="400px"></div></div> <div class="col-12 col-5@md col-4@xl suggested-content-upcoming-events__card"> <div class="card card--xl"> <div class="card__header"><span class="card__content-type">conference</span><span class="card__external-link-icon" data-url="https://www.idgevents.com/P7zbE?rt=D6xu4cPNx0-y6xS43PXNPA&amp;RefId=evp"><svg class="icon icon--sm" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-arrow-up-right-from-square"></use></svg></span></div><h4 class="card__title" id="the-official-cso-security-summit-uk">The Official CSO Security Summit UK</h4><div class="card__info card__info--light"><span>Nov 28, 2024</span><span>9:30 am &ndash; 17:30 GMT</span><span>Andaz London Liverpool Street</span></div> <div class="card__tags"><span class="card__tag"><span class="tag">CSO and CISO</span></span></div></div> </div> </a><a class="grid suggested-content-upcoming-events__item" href="https://www.idgevents.com/cso-30-awards-uk" aria-label="Go to content"><div class="col-12 col-3@md suggested-content-upcoming-events__date-label dd"><span class="date-label">28/Nov</span></div><div class="col-12 col-4@md col-5@xl suggested-content-upcoming-events__image"><div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/06/CSO_30-Awards-2024-2.png?w=1240" srcset="https://www.infoworld.com/wp-content/uploads/2024/06/CSO_30-Awards-2024-2.png?quality=50&amp;strip=all%201920w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_30-Awards-2024-2.png?resize=300%2C168&amp;quality=50&amp;strip=all%20300w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_30-Awards-2024-2.png?resize=768%2C432&amp;quality=50&amp;strip=all%20768w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_30-Awards-2024-2.png?resize=1024%2C576&amp;quality=50&amp;strip=all%201024w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_30-Awards-2024-2.png?resize=1536%2C864&amp;quality=50&amp;strip=all%201536w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_30-Awards-2024-2.png?resize=1240%2C697&amp;quality=50&amp;strip=all%201240w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_30-Awards-2024-2.png?resize=150%2C84&amp;quality=50&amp;strip=all%20150w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_30-Awards-2024-2.png?resize=854%2C480&amp;quality=50&amp;strip=all%20854w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_30-Awards-2024-2.png?resize=640%2C360&amp;quality=50&amp;strip=all%20640w,%20https://www.infoworld.com/wp-content/uploads/2024/06/CSO_30-Awards-2024-2.png?resize=444%2C250&amp;quality=50&amp;strip=all%20444w" alt="Image" loading="lazy" width="400px"></div></div> <div class="col-12 col-5@md col-4@xl suggested-content-upcoming-events__card"> <div class="card card--xl"> <div class="card__header"><span class="card__content-type">awards</span><span class="card__external-link-icon" data-url="https://www.idgevents.com/cso-30-awards-uk"><svg class="icon icon--sm" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-arrow-up-right-from-square"></use></svg></span></div><h4 class="card__title" id="cso-30-awards-uk">CSO 30 Awards UK</h4><div class="card__info card__info--light"><span>Nov 28, 2024</span><span>18:30-21:30 GMT</span><span>Andaz London Liverpool Street</span></div> <div class="card__tags"><span class="card__tag"><span class="tag">CSO and CISO</span></span></div></div> </div> </a><a class="grid suggested-content-upcoming-events__item" href="https://www.idgevents.com/event/next-cso-2024/summary" aria-label="Go to content"><div class="col-12 col-3@md suggested-content-upcoming-events__date-label dd"><span class="date-label">28/Nov</span></div><div class="col-12 col-4@md col-5@xl suggested-content-upcoming-events__image"><div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/06/Next-CSO-Awards-2024-1.png?w=1240" srcset="https://www.infoworld.com/wp-content/uploads/2024/06/Next-CSO-Awards-2024-1.png?quality=50&amp;strip=all%201920w,%20https://www.infoworld.com/wp-content/uploads/2024/06/Next-CSO-Awards-2024-1.png?resize=300%2C168&amp;quality=50&amp;strip=all%20300w,%20https://www.infoworld.com/wp-content/uploads/2024/06/Next-CSO-Awards-2024-1.png?resize=768%2C432&amp;quality=50&amp;strip=all%20768w,%20https://www.infoworld.com/wp-content/uploads/2024/06/Next-CSO-Awards-2024-1.png?resize=1024%2C576&amp;quality=50&amp;strip=all%201024w,%20https://www.infoworld.com/wp-content/uploads/2024/06/Next-CSO-Awards-2024-1.png?resize=1536%2C864&amp;quality=50&amp;strip=all%201536w,%20https://www.infoworld.com/wp-content/uploads/2024/06/Next-CSO-Awards-2024-1.png?resize=1240%2C697&amp;quality=50&amp;strip=all%201240w,%20https://www.infoworld.com/wp-content/uploads/2024/06/Next-CSO-Awards-2024-1.png?resize=150%2C84&amp;quality=50&amp;strip=all%20150w,%20https://www.infoworld.com/wp-content/uploads/2024/06/Next-CSO-Awards-2024-1.png?resize=854%2C480&amp;quality=50&amp;strip=all%20854w,%20https://www.infoworld.com/wp-content/uploads/2024/06/Next-CSO-Awards-2024-1.png?resize=640%2C360&amp;quality=50&amp;strip=all%20640w,%20https://www.infoworld.com/wp-content/uploads/2024/06/Next-CSO-Awards-2024-1.png?resize=444%2C250&amp;quality=50&amp;strip=all%20444w" alt="Image" loading="lazy" width="400px"></div></div> <div class="col-12 col-5@md col-4@xl suggested-content-upcoming-events__card"> <div class="card card--xl"> <div class="card__header"><span class="card__content-type">awards</span><span class="card__external-link-icon" data-url="https://www.idgevents.com/event/next-cso-2024/summary"><svg class="icon icon--sm" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-arrow-up-right-from-square"></use></svg></span></div><h4 class="card__title" id="next-cso-awards-uk">Next CSO Awards UK</h4><div class="card__info card__info--light"><span>Nov 28, 2024</span><span>18:30-21:30 GMT</span><span>Andaz London Liverpool Street</span></div> <div class="card__tags"><span class="card__tag"><span class="tag">CSO and CISO</span></span></div></div> </div> </a></div><div class="suggested-content-upcoming-events__button-container container"> <a class="button" href="https://www.infoworld.com/events/"> View all events</a> </div> </section><div class="advert"> <div class="container advert__container"> <div class="advert__content"><div class="ad page-ad has-ad-prefix ad-article" data-ad-template="article" data-ofp="false"></div></div></div></div><section class="related-content-video" id="video"><div class="container"><h2 class="related-content-video__title" id="video-on-demand">Video on demand</h2><div class="grid related-content-video__main"><div class="col-12 col-4@lg related-content-video__main-card"><a class="card card--xl" href="https://www.infoworld.com/video/3610349/use-__main__-in-python-to-make-packages-runnable.html" aria-label="Go to content"><div class="card__header"> <span class="card__content-type">video</span></div><h4 class="card__title" id="use-__main__-in-python-to-make-packages-runnable">Use \&rdquo;__main__\&rdquo; in Python to make packages runnable</h4><p class="card__description">Python packages are typically things you pip install and run by importing into your code. But you can make packages runnable from the Python command line using the \&rdquo;-m\&rdquo; option &mdash; and by configuring your package with a \&rdquo;__main__\&rdquo; module. This video steps you through the basics of using \&rdquo;__main__\&rdquo; in a package, and how it differs from \&rdquo;__init__\&rdquo; in a package (and elsewhere, too).</p> <div class="card__info card__info--light"><span>Nov 22, 2024 </span><span>3 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Python</span></span></div></a> <div class="related-content-video__social"> <div class="social-share-menu"><ul class="social-share-menu__buttons"> <li class="social-share-menu__button"><button class="social-share-button" type="button" data-platform="linked-in" aria-label="Share on LinkedIn"> <svg class="icon" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-linked-in"></use></svg> </button></li> <li class="social-share-menu__button"><button class="social-share-button" type="button" data-platform="twitter" aria-label="Share on Twitter"> <svg class="icon" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-twitter"></use></svg> </button></li> <li class="social-share-menu__button"><button class="social-share-button" type="button" data-platform="facebook" aria-label="Share on Facebook"> <svg class="icon" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-facebook"></use></svg> </button></li> <li class="social-share-menu__button"><button class="social-share-button" type="button" data-platform="reddit" aria-label="Share on Reddit"> <svg class="icon" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-reddit"></use></svg> </button></li> <li class="social-share-menu__button"><button class="social-share-button" type="button" data-platform="email" aria-label="Share via Email"> <svg class="icon" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-envelope"></use></svg> </button></li> <li class="social-share-menu__button"><button class="social-share-button" type="button" data-platform="print" aria-label="Print"> <svg class="icon" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-print"></use></svg> </button></li></ul> </div></div></div><div class="col-12 col-8@lg related-content-video__video"><div class="youtube-video"><iframe width="560" height="315" src="https://www.youtube.com/embed/0Qf1ZB1RBTk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></div></div></div><div class="related-content-video__cards-container"> <div class="related-content-video__cards-wrap"> <ul class="grid related-content-video__cards"><li class="col-4@md related-content-video__card"> <a class="related-content-video__card-link" href="https://www.infoworld.com/video/3606691/building-python-wheels-to-distribute-your-programs.html" aria-label="Go to content"> <div class="related-content-video__card-image"> <div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/11/3606691-0-19281700-1731680677-IFW24_039_build_wheel_THUMB.png?w=300" alt="Image" srcset="https://www.infoworld.com/wp-content/uploads/2024/11/3606691-0-19281700-1731680677-IFW24_039_build_wheel_THUMB.png?quality=50&amp;strip=all 1280w, https://www.infoworld.com/wp-content/uploads/2024/11/3606691-0-19281700-1731680677-IFW24_039_build_wheel_THUMB.png?resize=300%2C168&amp;quality=50&amp;strip=all 300w, https://www.infoworld.com/wp-content/uploads/2024/11/3606691-0-19281700-1731680677-IFW24_039_build_wheel_THUMB.png?resize=768%2C432&amp;quality=50&amp;strip=all 768w, https://www.infoworld.com/wp-content/uploads/2024/11/3606691-0-19281700-1731680677-IFW24_039_build_wheel_THUMB.png?resize=1024%2C576&amp;quality=50&amp;strip=all 1024w, https://www.infoworld.com/wp-content/uploads/2024/11/3606691-0-19281700-1731680677-IFW24_039_build_wheel_THUMB.png?resize=1240%2C697&amp;quality=50&amp;strip=all 1240w, https://www.infoworld.com/wp-content/uploads/2024/11/3606691-0-19281700-1731680677-IFW24_039_build_wheel_THUMB.png?resize=150%2C84&amp;quality=50&amp;strip=all 150w, https://www.infoworld.com/wp-content/uploads/2024/11/3606691-0-19281700-1731680677-IFW24_039_build_wheel_THUMB.png?resize=854%2C480&amp;quality=50&amp;strip=all 854w, https://www.infoworld.com/wp-content/uploads/2024/11/3606691-0-19281700-1731680677-IFW24_039_build_wheel_THUMB.png?resize=640%2C360&amp;quality=50&amp;strip=all 640w, https://www.infoworld.com/wp-content/uploads/2024/11/3606691-0-19281700-1731680677-IFW24_039_build_wheel_THUMB.png?resize=444%2C250&amp;quality=50&amp;strip=all 444w" sizes="300px" loading="lazy" width="400px"></div></div><div class="card card--xs"><h4 class="card__title" id="building-python-wheels-to-distribute-your-programs">Building Python wheels to distribute your programs</h4> <div class="card__info card__info--light"><span>Nov 15, 2024 </span><span>6 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Python</span></span><span class="card__tag"><span class="tag">Software Development</span></span></div></div></a></li><li class="col-4@md related-content-video__card"> <a class="related-content-video__card-link" href="https://www.infoworld.com/video/3606689/creating-a-pip-install-able-python-package.html" aria-label="Go to content"> <div class="related-content-video__card-image"> <div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/11/3606689-0-04766500-1731610339-IFW24_038_pip_installable_THUMB.png?w=300" alt="Image" srcset="https://www.infoworld.com/wp-content/uploads/2024/11/3606689-0-04766500-1731610339-IFW24_038_pip_installable_THUMB.png?quality=50&amp;strip=all 1280w, https://www.infoworld.com/wp-content/uploads/2024/11/3606689-0-04766500-1731610339-IFW24_038_pip_installable_THUMB.png?resize=300%2C168&amp;quality=50&amp;strip=all 300w, https://www.infoworld.com/wp-content/uploads/2024/11/3606689-0-04766500-1731610339-IFW24_038_pip_installable_THUMB.png?resize=768%2C432&amp;quality=50&amp;strip=all 768w, https://www.infoworld.com/wp-content/uploads/2024/11/3606689-0-04766500-1731610339-IFW24_038_pip_installable_THUMB.png?resize=1024%2C576&amp;quality=50&amp;strip=all 1024w, https://www.infoworld.com/wp-content/uploads/2024/11/3606689-0-04766500-1731610339-IFW24_038_pip_installable_THUMB.png?resize=1240%2C697&amp;quality=50&amp;strip=all 1240w, https://www.infoworld.com/wp-content/uploads/2024/11/3606689-0-04766500-1731610339-IFW24_038_pip_installable_THUMB.png?resize=150%2C84&amp;quality=50&amp;strip=all 150w, https://www.infoworld.com/wp-content/uploads/2024/11/3606689-0-04766500-1731610339-IFW24_038_pip_installable_THUMB.png?resize=854%2C480&amp;quality=50&amp;strip=all 854w, https://www.infoworld.com/wp-content/uploads/2024/11/3606689-0-04766500-1731610339-IFW24_038_pip_installable_THUMB.png?resize=640%2C360&amp;quality=50&amp;strip=all 640w, https://www.infoworld.com/wp-content/uploads/2024/11/3606689-0-04766500-1731610339-IFW24_038_pip_installable_THUMB.png?resize=444%2C250&amp;quality=50&amp;strip=all 444w" sizes="300px" loading="lazy" width="400px"></div></div><div class="card card--xs"><h4 class="card__title" id="creating-a-pip-install-able-python-package">Creating a pip install-able Python package</h4> <div class="card__info card__info--light"><span>Nov 14, 2024 </span><span>3 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Python</span></span><span class="card__tag"><span class="tag">Software Development</span></span></div></div></a></li><li class="col-4@md related-content-video__card"> <a class="related-content-video__card-link" href="https://www.infoworld.com/video/3550024/how-to-get-better-web-requests-in-python-with-httpx.html" aria-label="Go to content"> <div class="related-content-video__card-image"> <div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/10/3550024-0-42985400-1728304252-Youtube-Thumbnails_Template-OLD-2.png?w=300" alt="Image" srcset="https://www.infoworld.com/wp-content/uploads/2024/10/3550024-0-42985400-1728304252-Youtube-Thumbnails_Template-OLD-2.png?quality=50&amp;strip=all 1280w, https://www.infoworld.com/wp-content/uploads/2024/10/3550024-0-42985400-1728304252-Youtube-Thumbnails_Template-OLD-2.png?resize=300%2C168&amp;quality=50&amp;strip=all 300w, https://www.infoworld.com/wp-content/uploads/2024/10/3550024-0-42985400-1728304252-Youtube-Thumbnails_Template-OLD-2.png?resize=768%2C432&amp;quality=50&amp;strip=all 768w, https://www.infoworld.com/wp-content/uploads/2024/10/3550024-0-42985400-1728304252-Youtube-Thumbnails_Template-OLD-2.png?resize=1024%2C576&amp;quality=50&amp;strip=all 1024w, https://www.infoworld.com/wp-content/uploads/2024/10/3550024-0-42985400-1728304252-Youtube-Thumbnails_Template-OLD-2.png?resize=1240%2C697&amp;quality=50&amp;strip=all 1240w, https://www.infoworld.com/wp-content/uploads/2024/10/3550024-0-42985400-1728304252-Youtube-Thumbnails_Template-OLD-2.png?resize=150%2C84&amp;quality=50&amp;strip=all 150w, https://www.infoworld.com/wp-content/uploads/2024/10/3550024-0-42985400-1728304252-Youtube-Thumbnails_Template-OLD-2.png?resize=854%2C480&amp;quality=50&amp;strip=all 854w, https://www.infoworld.com/wp-content/uploads/2024/10/3550024-0-42985400-1728304252-Youtube-Thumbnails_Template-OLD-2.png?resize=640%2C360&amp;quality=50&amp;strip=all 640w, https://www.infoworld.com/wp-content/uploads/2024/10/3550024-0-42985400-1728304252-Youtube-Thumbnails_Template-OLD-2.png?resize=444%2C250&amp;quality=50&amp;strip=all 444w" sizes="300px" loading="lazy" width="400px"></div></div><div class="card card--xs"><h4 class="card__title" id="how-to-get-better-web-requests-in-python-with-httpx">How to get better web requests in Python with httpx</h4> <div class="card__info card__info--light"><span>Oct 07, 2024 </span><span>4 mins</span></div><div class="card__tags"><span class="card__tag"><span class="tag">Python</span></span></div></div></a></li></ul></div></div> <div class="related-content-video__button-container"><a class="button" target="" href="https://www.infoworld.com/videos/">See all videos</a></div></div></section><section class="popular-topics-selector"> <div class="container"><h2 class="popular-topics-selector__title" id="explore-a-topic">Explore a topic </h2><p class="popular-topics-selector__text"></p><ul class="popular-topics-selector__topics-container"><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/analytics/">Analytics </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/artificial-intelligence/">Artificial Intelligence </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/careers/">Careers </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/cloud-computing/">Cloud Computing </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/data-management/">Data Management </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/database/">Databases </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/development-tools/">Development Tools </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/devops/">Devops </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/emerging-technology/">Emerging Technology </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/generative-ai/">Generative AI </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/java/">Java </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/javascript/">JavaScript </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/microsoft-net/">Microsoft .NET </a></li><li class="popular-topics-selector__topic"> <a class="chip chip--topic" target="_self" href="https://www.infoworld.com/open-source/">Open Source </a></li><li class="popular-topics-selector__topic"><button class="button" type="button" data-modal-trigger="popular-topics-selector-modal">View all topics</button></li> </ul><div class="modal" data-modal="popular-topics-selector-modal" role="dialog"> <div class="modal__backdrop" data-modal-backdrop></div> <div class="modal__content"><div class="popular-topics-selector__modal-content"> <header class="popular-topics-selector__modal-header"> <h1 class="popular-topics-selector__modal-title" id="all-topics">All topics</h1> <div class="popular-topics-selector__modal-close-button"> <button class="button button--quaternary" type="button" data-modal-close="popular-topics-selector-modal"> <span>Close</span> <span class="icon"></span> </button> </div> </header><ul class="popular-topics-selector__modal-list"><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/analytics/" class="popular-topics-selector__modal-list-item-link"> Analytics </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/artificial-intelligence/" class="popular-topics-selector__modal-list-item-link"> Artificial Intelligence </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/careers/" class="popular-topics-selector__modal-list-item-link"> Careers </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/cloud-computing/" class="popular-topics-selector__modal-list-item-link"> Cloud Computing </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/data-management/" class="popular-topics-selector__modal-list-item-link"> Data Management </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/database/" class="popular-topics-selector__modal-list-item-link"> Databases </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/development-tools/" class="popular-topics-selector__modal-list-item-link"> Development Tools </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/devops/" class="popular-topics-selector__modal-list-item-link"> Devops </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/emerging-technology/" class="popular-topics-selector__modal-list-item-link"> Emerging Technology </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/generative-ai/" class="popular-topics-selector__modal-list-item-link"> Generative AI </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/java/" class="popular-topics-selector__modal-list-item-link"> Java </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/javascript/" class="popular-topics-selector__modal-list-item-link"> JavaScript </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/microsoft-net/" class="popular-topics-selector__modal-list-item-link"> Microsoft .NET </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/open-source/" class="popular-topics-selector__modal-list-item-link"> Open Source </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/programming-languages/" class="popular-topics-selector__modal-list-item-link"> Programming Languages </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/python/" class="popular-topics-selector__modal-list-item-link"> Python </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/security/" class="popular-topics-selector__modal-list-item-link"> Security </a></li><li class="popular-topics-selector__modal-list-item"> <a href="https://www.infoworld.com/technology-business/" class="popular-topics-selector__modal-list-item-link"> Technology Industry </a></li></ul></div></div> </div> </div> </section><section class="suggested-content-various"><div class="container"><div class="grid suggested-content-various__content"><div class="col-12 col-3@lg"> <h4 class="suggested-content-various__title" id="show-me-more">Show me more</h4><div class="suggested-content-various__filters"><span class="suggested-content-various__filter"><button class="chip chip--filter chip--active" type="button" data-filter-key="latest">Latest</button></span><span class="suggested-content-various__filter"><button class="chip chip--filter" type="button" data-filter-key="article">Articles</button></span><span class="suggested-content-various__filter"><button class="chip chip--filter" type="button" data-filter-key="video">Videos</button></span></div> </div><div class="col-12 col-9@lg suggested-content-various__items-wrap"><div class="grid grid--cols-9@lg suggested-content-various__items"><div class="col-4@md col-3@lg suggested-content-various__item suggested-content-various__item--active" data-filter-value=" latest,article"><a class="suggested-content-various__link" href="https://www.infoworld.com/article/3609843/azure-container-apps-launches-python-javascript-interpreters.html" aria-label="Go to content"><div class="card card--xxs"> <div class="card__header"> <span class="card__content-type">news</span> </div> <h4 class="card__title" id="azure-container-apps-launches-python-javascript-interpreters">Azure Container Apps launches Python, JavaScript interpreters </h4> <div class="card__info"><span>By Paul Krill</span></div><div class="card__info card__info--light"> <span>Nov 20, 2024</span><span>2 mins</span></div> <div class="card__tags"><span class="card__tag"><span class="tag">JavaScript</span></span><span class="card__tag"><span class="tag">Python</span></span><span class="card__tag"><span class="tag">Cloud Computing</span></span></div></div> <div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/11/3609843-0-74261000-1732141618-shutterstock_2256482287_16.jpg?quality=50&amp;strip=all&amp;w=444" alt="Image" loading="lazy" width="400px"></div> </a> </div><div class="col-4@md col-3@lg suggested-content-various__item suggested-content-various__item--active" data-filter-value=" article"><a class="suggested-content-various__link" href="https://www.infoworld.com/article/3609015/microsoft-extends-entra-id-to-wsl-winget.html" aria-label="Go to content"><div class="card card--xxs"> <div class="card__header"> <span class="card__content-type">news</span> </div> <h4 class="card__title" id="microsoft-extends-entra-id-to-wsl-winget">Microsoft extends Entra ID to WSL, WinGet </h4> <div class="card__info"><span>By Paul Krill</span></div><div class="card__info card__info--light"> <span>Nov 19, 2024</span><span>2 mins</span></div> <div class="card__tags"><span class="card__tag"><span class="tag">Access Control</span></span><span class="card__tag"><span class="tag">Application Security</span></span><span class="card__tag"><span class="tag">Identity and Access Management</span></span></div></div> <div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/11/3609015-0-23892700-1732118817-digital-access-machine-identity-non-human-management.jpg?quality=50&amp;strip=all&amp;w=375" alt="Image" loading="lazy" width="400px"></div> </a> </div><div class="col-4@md col-3@lg suggested-content-various__item suggested-content-various__item--active" data-filter-value=" article"><a class="suggested-content-various__link" href="https://www.infoworld.com/article/3608598/microsoft-rebrands-azure-ai-studio-to-azure-ai-foundry.html" aria-label="Go to content"><div class="card card--xxs"> <div class="card__header"> <span class="card__content-type">news</span> </div> <h4 class="card__title" id="microsoft-rebrands-azure-ai-studio-to-azure-ai-foundry">Microsoft rebrands Azure AI Studio to Azure AI Foundry</h4> <div class="card__info"><span>By Anirban Ghoshal</span></div><div class="card__info card__info--light"> <span>Nov 19, 2024</span><span>4 mins</span></div> <div class="card__tags"><span class="card__tag"><span class="tag">Microsoft Azure</span></span><span class="card__tag"><span class="tag">Generative AI</span></span><span class="card__tag"><span class="tag">Development Tools</span></span></div></div> <div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/11/3608598-0-80808600-1732033940-shutterstock_1850894143.jpg?quality=50&amp;strip=all&amp;w=333" alt="Image" loading="lazy" width="400px"></div> </a> </div><div class="col-4@md col-3@lg suggested-content-various__item suggested-content-various__item--active" data-filter-value=" latest,video"><a class="suggested-content-various__link" href="https://www.infoworld.com/video/3545184/how-to-better-integrate-python-c-with-cffi.html" aria-label="Go to content"><div class="card card--xxs"> <div class="card__header"> <span class="card__content-type">video</span> </div> <h4 class="card__title" id="how-to-better-integrate-python-c-with-cffi">How to better integrate Python/C with CFFI</h4> <div class="card__info"><span></span></div><div class="card__info card__info--light"> <span>Oct 03, 2024</span><span>5 mins</span></div> <div class="card__tags"><span class="card__tag"><span class="tag">Python</span></span></div></div> <div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/10/3545184-0-41210000-1727984576-Youtube-Thumbnails_Template-OLD-1.png?w=444" alt="Image" loading="lazy" width="400px"></div> </a> </div><div class="col-4@md col-3@lg suggested-content-various__item suggested-content-various__item--active" data-filter-value=" latest,video"><a class="suggested-content-various__link" href="https://www.infoworld.com/video/3543373/how-to-create-and-work-with-zip-archives-using-python.html" aria-label="Go to content"><div class="card card--xxs"> <div class="card__header"> <span class="card__content-type">video</span> </div> <h4 class="card__title" id="how-to-create-and-work-with-zip-archives-using-python">How to create and work with zip archives using Python</h4> <div class="card__info"><span></span></div><div class="card__info card__info--light"> <span>Oct 01, 2024</span><span>5 mins</span></div> <div class="card__tags"><span class="card__tag"><span class="tag">Python</span></span></div></div> <div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/10/3543373-0-24502000-1727791824-Youtube-Thumbnails_Template-OLD.png?w=444" alt="Image" loading="lazy" width="400px"></div> </a> </div><div class="col-4@md col-3@lg suggested-content-various__item suggested-content-various__item--active" data-filter-value=" video"><a class="suggested-content-various__link" href="https://www.infoworld.com/video/3518570/how-to-implement-modes-in-software-with-a-game-as-an-example.html" aria-label="Go to content"><div class="card card--xxs"> <div class="card__header"> <span class="card__content-type">video</span> </div> <h4 class="card__title" id="how-to-implement-modes-in-software-with-a-game-as-an-example">How to implement "modes" in software, with a game as an example</h4> <div class="card__info"><span></span></div><div class="card__info card__info--light"> <span>Sep 12, 2024</span><span>4 mins</span></div> <div class="card__tags"><span class="card__tag"><span class="tag">Python</span></span></div></div> <div class="image"><img decoding="async" src="https://www.infoworld.com/wp-content/uploads/2024/09/3518570-0-51110700-1726158878-Youtube-Thumbnails_Template-OLD-1.png?w=444" alt="Image" loading="lazy" width="400px"></div> </a> </div></div></div></div></div></section></div> </div><!-- .entry-content --> </article><!-- #post-100007624 --> </main><!-- #main --> <footer class="footer"> <div class="container footer__container"> <div class="grid footer__content"> <div class="col-12 col-9@lg grid grid--cols-9@lg footer__main"> <div class="col-12 col-6@md col-3@lg footer__menu"> <details class="accordion" data-accordion-enabled="mobile" data-accordion-expanded="desktop"> <summary data-accordion-summary class="accordion__summary"> <div class="accordion__title"> <div class="footer__menu-title">About</div> </div> <div class="accordion__icon"> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" > <use xlink:href="#icon-circle-chevron-down"></use> </svg> </div> </summary> <div class="accordion__content" data-accordion-content> <nav data-content aria-label="About navigation menu"> <ul class="footer__menu-items"> <li class="footer__menu-item"> <a href="https://www.infoworld.com/about-us/" class="footer__menu-link">About us</a> </li> <li class="footer__menu-item"> <a href="https://foundryco.com/our-brands/infoworld/" class="footer__menu-link">Advertise</a> </li> <li class="footer__menu-item"> <a href="https://www.infoworld.com/contact-us/" class="footer__menu-link">Contact Us</a> </li> <li class="footer__menu-item"> <a href="https://foundryco.com/work-here/" class="footer__menu-link">Foundry Careers</a> </li> <li class="footer__menu-item"> <a href="https://www.infoworld.com/contact-us/#republication-permissions" class="footer__menu-link">Reprints</a> </li> <li class="footer__menu-item"> <a href="/newsletters/signup/" class="footer__menu-link">Newsletters</a> </li> <li class="footer__menu-item"> <a href="https://www.infoworld.com/brandposts/" class="footer__menu-link">BrandPosts</a> </li> </ul> </nav> </div> </details> </div> <div class="col-12 col-6@md col-3@lg footer__menu"> <details class="accordion" data-accordion-enabled="mobile" data-accordion-expanded="desktop"> <summary data-accordion-summary class="accordion__summary"> <div class="accordion__title"> <div class="footer__menu-title">Policies</div> </div> <div class="accordion__icon"> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" > <use xlink:href="#icon-circle-chevron-down"></use> </svg> </div> </summary> <div class="accordion__content" data-accordion-content> <nav data-content aria-label="Policies navigation menu"> <ul class="footer__menu-items"> <li class="footer__menu-item"> <a href="https://foundryco.com/terms-of-service-agreement/" class="footer__menu-link">Terms of Service</a> </li> <li class="footer__menu-item"> <a href="https://www.infoworld.com/privacy-policy/" class="footer__menu-link">Privacy Policy</a> </li> <li class="footer__menu-item"> <a href="https://www.infoworld.com/cookie-policy/" class="footer__menu-link">Cookie Policy</a> </li> <li class="footer__menu-item"> <a href="https://foundryco.com/copyright-notice/" class="footer__menu-link">Copyright Notice</a> </li> <li class="footer__menu-item"> <a href="https://www.infoworld.com/member-preferences/" class="footer__menu-link">Member Preferences</a> </li> <li class="footer__menu-item"> <a href="https://www.infoworld.com/about-adchoices/" class="footer__menu-link">About AdChoices</a> </li> <li class="footer__menu-item"> <a href="https://www.infoworld.com/e-commerce-affiliate-relationships/" class="footer__menu-link">E-commerce Affiliate Relationships</a> </li> <li class="footer__menu-item"> <a href="https://www.infoworld.com/your-california-privacy-rights/" class="footer__menu-link">Your California Privacy Rights</a> </li> <li class="footer__menu-item"> <a class="ccpa-btn eea-consent-ui footer__menu-link">Privacy Settings</a> </li> </ul> </nav> </div> </details> </div> <div class="col-12 col-6@md col-3@lg footer__menu"> <details class="accordion" data-accordion-enabled="mobile" data-accordion-expanded="desktop"> <summary data-accordion-summary class="accordion__summary"> <div class="accordion__title"> <div class="footer__menu-title">Our Network</div> </div> <div class="accordion__icon"> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" > <use xlink:href="#icon-circle-chevron-down"></use> </svg> </div> </summary> <div class="accordion__content" data-accordion-content> <nav data-content aria-label="Our Network navigation menu"> <ul class="footer__menu-items"> <li class="footer__menu-item"> <a href="https://www.cio.com/" target="_blank" class="footer__menu-link">CIO</a> </li> <li class="footer__menu-item"> <a href="https://www.computerworld.com/" target="_blank" class="footer__menu-link">Computerworld</a> </li> <li class="footer__menu-item"> <a href="https://www.csoonline.com/" target="_blank" class="footer__menu-link">CSO</a> </li> <li class="footer__menu-item"> <a href="https://www.networkworld.com/" target="_blank" class="footer__menu-link">Network World</a> </li> </ul> </nav> </div> </details> </div> <div class="col-12 col-9@lg footer__logo-container"> <a href="https://foundryco.com/" target="_blank" rel="noreferrer" aria-label="Go to Foundry website"> <svg id="a" width="156" height="57" version="1.1" viewBox="0 0 156 57" xmlns="http://www.w3.org/2000/svg"><defs><style>.b{fill:#fff;}</style></defs><g transform="matrix(.67576 0 0 .67576 .37936 .26588)"><path class="b" d="m35.79 77.23c0-1.83 1.94-2.45 3.97-2.45h1.14v-0.57c0-1.26-0.48-1.79-1.7-1.79-1.09 0-1.7 0.46-1.82 1.42h-1.26c0.17-1.8 1.6-2.47 3.13-2.47s2.89 0.62 2.89 2.83v5.22h-1.26v-1c-0.59 0.74-1.3 1.13-2.47 1.13-1.47 0-2.63-0.71-2.63-2.33zm5.1-0.58v-0.98h-1.09c-1.59 0-2.75 0.39-2.75 1.56 0 0.82 0.39 1.33 1.5 1.33 1.33 0 2.35-0.68 2.35-1.91z"/><path class="b" d="m44.65 71.5h1.26v1.26c0.36-0.74 1.24-1.39 2.54-1.39 1.63 0 2.79 0.89 2.79 3.19v4.86h-1.26v-4.95c0-1.39-0.59-2.01-1.86-2.01-1.17 0-2.21 0.74-2.21 2.17v4.8h-1.26v-7.92z"/><path class="b" d="m58.32 68.6h1.32v10.82h-1.32z"/><path class="b" d="m62.47 68.6h2.86c3.72 0 5.48 2.3 5.48 5.31v0.14c0 3-1.73 5.37-5.51 5.37h-2.83zm2.8 9.75c2.79 0 4.18-1.66 4.18-4.31v-0.12c0-2.5-1.21-4.25-4.19-4.25h-1.47v8.69h1.48z"/><path class="b" d="m72.5 74.08v-0.12c0-3.16 2.13-5.53 5.24-5.53 2.15 0 4.07 1 4.4 3.44h-1.32c-0.3-1.72-1.48-2.39-3.06-2.39-2.48 0-3.91 1.82-3.91 4.46v0.12c0 2.68 1.33 4.44 3.88 4.44 2.35 0 3.36-1.53 3.41-3.45h-3.16v-1.09h4.45v0.8c0 3.13-1.92 4.8-4.69 4.8-3.33 0-5.24-2.32-5.24-5.48z"/><path class="b" d="m83.75 80.19c0.65-0.09 0.94-0.35 0.94-0.82-0.58 0-0.97-0.32-0.97-0.91 0-0.51 0.44-0.91 0.94-0.91 0.58 0 1 0.41 1 1.11v0.29c0 1.33-0.85 1.91-1.91 1.97z"/><path class="b" d="m91.33 68.6h1.32v10.82h-1.32z"/><path class="b" d="m95.39 71.5h1.26v1.26c0.36-0.74 1.24-1.39 2.54-1.39 1.63 0 2.79 0.89 2.79 3.19v4.86h-1.26v-4.95c0-1.39-0.59-2.01-1.86-2.01-1.17 0-2.21 0.74-2.21 2.17v4.8h-1.26v-7.92z"/><path class="b" d="m103.88 75.55v-0.12c0-2.42 1.73-4.06 3.84-4.06 1.65 0 3.19 0.76 3.44 2.77h-1.24c-0.2-1.26-1.1-1.73-2.19-1.73-1.44 0-2.54 1.15-2.54 3.01v0.12c0 1.94 1.06 2.97 2.59 2.97 1.12 0 2.13-0.65 2.27-1.94h1.17c-0.17 1.71-1.54 2.98-3.45 2.98-2.21 0-3.88-1.56-3.88-4.01z"/><path class="b" d="m112.87 78.53c0-0.54 0.44-0.97 0.97-0.97s0.97 0.42 0.97 0.97-0.44 0.97-0.97 0.97-0.97-0.42-0.97-0.97z"/><path class="b" d="m119.75 75.55v-0.12c0-2.42 1.73-4.06 3.84-4.06 1.65 0 3.19 0.76 3.44 2.77h-1.24c-0.2-1.26-1.1-1.73-2.19-1.73-1.44 0-2.54 1.15-2.54 3.01v0.12c0 1.94 1.06 2.97 2.59 2.97 1.12 0 2.13-0.65 2.27-1.94h1.17c-0.17 1.71-1.54 2.98-3.45 2.98-2.21 0-3.88-1.56-3.88-4.01z"/><path class="b" d="m128.41 75.53v-0.12c0-2.38 1.65-4.04 3.89-4.04s3.89 1.65 3.89 4.03v0.12c0 2.39-1.65 4.04-3.91 4.04s-3.88-1.71-3.88-4.03zm6.48 0v-0.11c0-1.83-1.01-3.01-2.59-3.01s-2.59 1.18-2.59 3v0.12c0 1.8 0.98 2.98 2.59 2.98s2.59-1.2 2.59-2.98z"/><path class="b" d="m138.17 71.5h1.26v1.21c0.36-0.74 1.23-1.35 2.36-1.35 1.01 0 1.91 0.42 2.32 1.48 0.54-1.03 1.73-1.48 2.71-1.48 1.42 0 2.66 0.85 2.66 3.15v4.9h-1.26v-5c0-1.39-0.59-1.97-1.68-1.97-1.03 0-2.09 0.7-2.09 2.12v4.84h-1.26v-5c0-1.39-0.59-1.97-1.68-1.97-1.03 0-2.09 0.7-2.09 2.12v4.84h-1.26v-7.92z"/><path class="b" d="m151.98 71.5h1.26v1.33c0.45-0.77 1.53-1.47 2.68-1.47 2.07 0 3.6 1.51 3.6 3.98v0.12c0 2.42-1.42 4.09-3.6 4.09-1.3 0-2.23-0.65-2.68-1.44v4.06h-1.26zm6.24 4.03v-0.12c0-2-1.1-3-2.44-3-1.47 0-2.59 0.97-2.59 3v0.12c0 2.03 1.06 2.98 2.6 2.98s2.42-1.06 2.42-2.98z"/><path class="b" d="m160.85 77.23c0-1.83 1.94-2.45 3.97-2.45h1.14v-0.57c0-1.26-0.48-1.79-1.7-1.79-1.09 0-1.7 0.46-1.82 1.42h-1.26c0.17-1.8 1.6-2.47 3.13-2.47s2.89 0.62 2.89 2.83v5.22h-1.26v-1c-0.59 0.74-1.3 1.13-2.47 1.13-1.47 0-2.63-0.71-2.63-2.33zm5.1-0.58v-0.98h-1.09c-1.59 0-2.75 0.39-2.75 1.56 0 0.82 0.39 1.33 1.5 1.33 1.33 0 2.35-0.68 2.35-1.91z"/><path class="b" d="m169.71 71.5h1.26v1.26c0.36-0.74 1.24-1.39 2.54-1.39 1.63 0 2.79 0.89 2.79 3.19v4.86h-1.26v-4.95c0-1.39-0.59-2.01-1.86-2.01-1.17 0-2.21 0.74-2.21 2.17v4.8h-1.26v-7.92z"/><path class="b" d="m180.77 78.6-3.1-7.1h1.35l2.42 5.68 2.19-5.68h1.29l-4.37 10.67h-1.27l1.5-3.57z"/><path class="b" d="m113.87 0.82c4.27 0 6.75 2.78 6.75 6.75s-2.47 6.75-6.8 6.75-6.75-2.83-6.75-6.75 2.47-6.75 6.8-6.75"/><path class="b" d="m95.74 39.61c0 2.78-0.26 5.2-1.13 7.21-2.32 5.3-7.16 8.09-13.75 8.09s-11.69-2.78-14.01-8.09c-0.88-2.01-1.13-4.43-1.13-7.21v-21.48h9.27v20.96c0 1.65 0.1 2.99 0.57 4.07 0.98 2.27 3.09 3.09 5.31 3.09 1.96 0 4.07-0.82 5.05-3.09 0.46-1.08 0.57-2.42 0.57-4.07v-20.96h9.27v21.48z"/><path class="b" d="m129.16 32.6v21.58h-9.27v-20.91c0-1.65-0.1-2.99-0.57-4.07-0.98-2.27-3.09-3.3-5.46-3.3s-4.48 1.03-5.46 3.3c-0.46 1.08-0.57 2.42-0.57 4.07v20.91h-9.27v-21.58c0-2.78 0.26-5.2 1.13-7.21 2.32-5.3 7.16-8.14 14.16-8.14s11.85 2.83 14.16 8.14c0.88 2.01 1.13 4.43 1.13 7.21"/><polygon class="b" points="193.6 18.13 203.79 18.13 211.37 32.19 218.99 18.13 228.83 18.13 215.9 41.51 215.9 54.18 206.42 54.18 206.42 41.51"/><polygon class="b" points="10.44 33.63 10.44 26.53 26.98 26.53 26.98 18.13 1.17 18.13 1.17 54.18 10.44 54.18 10.44 41.98 25.85 41.98 25.85 33.63"/><path class="b" d="m113.87 0.82c4.27 0 6.75 2.78 6.75 6.75s-2.47 6.75-6.8 6.75-6.75-2.83-6.75-6.75 2.47-6.75 6.8-6.75"/><path class="b" d="m95.74 39.61c0 2.78-0.26 5.2-1.13 7.21-2.32 5.3-7.16 8.09-13.75 8.09s-11.69-2.78-14.01-8.09c-0.88-2.01-1.13-4.43-1.13-7.21v-21.48h9.27v20.96c0 1.65 0.1 2.99 0.57 4.07 0.98 2.27 3.09 3.09 5.31 3.09 1.96 0 4.07-0.82 5.05-3.09 0.46-1.08 0.57-2.42 0.57-4.07v-20.96h9.27v21.48z"/><path class="b" d="m129.16 32.6v21.58h-9.27v-20.91c0-1.65-0.1-2.99-0.57-4.07-0.98-2.27-3.09-3.3-5.46-3.3s-4.48 1.03-5.46 3.3c-0.46 1.08-0.57 2.42-0.57 4.07v20.91h-9.27v-21.58c0-2.78 0.26-5.2 1.13-7.21 2.32-5.3 7.16-8.14 14.16-8.14s11.85 2.83 14.16 8.14c0.88 2.01 1.13 4.43 1.13 7.21"/><path class="b" d="m181.65 42.8h-5.82v11.38h-9.27v-36.05h17.2c6.9 0 12.05 4.58 12.05 12.26 0 4.74-1.96 8.34-5.36 10.51l5.56 13.29h-9.89l-4.48-11.38zm-5.82-16.69v8.6h5.82c3.45 0 4.94-1.65 4.94-4.33 0-2.52-1.49-4.28-4.94-4.28h-5.82zm5.82 16.69h-5.82v11.38h-9.27v-36.05h17.2c6.9 0 12.05 4.58 12.05 12.26 0 4.74-1.96 8.34-5.36 10.51l5.56 13.29h-9.89l-4.48-11.38zm-5.82-16.69v8.6h5.82c3.45 0 4.94-1.65 4.94-4.33 0-2.52-1.49-4.28-4.94-4.28h-5.82z"/><path class="b" d="m132.31 54.18v-36.05h13.34c11.69 0 18.54 7.11 18.54 18.03s-6.13 18.03-17.98 18.03h-13.91zm9.27-8.14h3.86c6.03 0 9.27-3.3 9.27-9.89s-3.25-9.89-9.27-9.89h-3.86zm-9.27 8.14v-36.05h13.34c11.69 0 18.54 7.11 18.54 18.03s-6.13 18.03-17.98 18.03h-13.91zm9.27-8.14h3.86c6.03 0 9.27-3.3 9.27-9.89s-3.25-9.89-9.27-9.89h-3.86z"/><path class="b" d="m45.93 17.41c10.87 0 17.31 7.98 17.31 18.75s-6.7 18.75-17.31 18.75-17.36-7.93-17.36-18.75 6.75-18.75 17.36-18.75m-0.05 29.05c4.89 0 7.98-4.07 7.98-10.04 0-6.59-3.09-10.56-7.73-10.56-5.05 0-8.14 3.97-8.14 10.04 0 6.49 3.09 10.56 7.88 10.56m0.05-29.05c10.87 0 17.31 7.98 17.31 18.75s-6.7 18.75-17.31 18.75-17.36-7.93-17.36-18.75 6.75-18.75 17.36-18.75m-0.05 29.05c4.89 0 7.98-4.07 7.98-10.04 0-6.59-3.09-10.56-7.73-10.56-5.05 0-8.14 3.97-8.14 10.04 0 6.49 3.09 10.56 7.88 10.56"/><polygon class="b" points="10.44 33.63 10.44 26.53 26.98 26.53 26.98 18.13 1.17 18.13 1.17 54.18 10.44 54.18 10.44 41.98 25.85 41.98 25.85 33.63"/></g></svg> </a> </div> </div> <div class="col-12 col-3@lg footer__social"> <ul class="footer__social-items"> <li class="footer__social-item"> <a class="footer__social-link" href="https://www.linkedin.com/company/164364" target="_blank" rel="noreferrer" aria-label="LinkedIn"> <span class="footer__social-link-text">LinkedIn</span> <span class="footer__social-link-icon"> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-linked-in"></use> </svg> </span> </a> </li> <li class="footer__social-item"> <a class="footer__social-link" href="https://twitter.com/infoworld" target="_blank" rel="noreferrer" aria-label="X"> <span class="footer__social-link-text">X</span> <span class="footer__social-link-icon"> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-twitter"></use> </svg> </span> </a> </li> <li class="footer__social-item"> <a class="footer__social-link" href="https://www.facebook.com/InfoWorld" target="_blank" rel="noreferrer" aria-label="Facebook"> <span class="footer__social-link-text">Facebook</span> <span class="footer__social-link-icon"> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-facebook"></use> </svg> </span> </a> </li> <li class="footer__social-item"> <a class="footer__social-link" href="https://www.youtube.com/@InfoWorld" target="_blank" rel="noreferrer" aria-label="Youtube"> <span class="footer__social-link-text">Youtube</span> <span class="footer__social-link-icon"> <svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <use xlink:href="#icon-youtube"></use> </svg> </span> </a> </li> </ul> </div> </div> <div class="footer__copyright"> <div class="entry-copyright"> <a href="https://foundryco.com/terms-of-service-agreement/">Copyright 漏 2024 IDG Communications, Inc.</a></div> </div> </div> </footer> </div><!-- #page--> <!-- Start Subscriber Embed Code --> <script type="text/javascript"> var subscribersSiteId = "d73925e9-37f6-478a-9804-7901f9e3a2ae"; var subscribersServiceWorkerPath = '/?firebase-messaging-sw'; </script> <script type="text/javascript" src="https://cdn.subscribers.com/assets/subscribers.js"></script> <!-- End Subscriber Embed Code --> <!-- Google Tag Manager (noscript) --> <noscript> <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5JGZ3LH" height="0" width="0" style="display:none;visibility:hidden"></iframe> </noscript> <!-- End Google Tag Manager (noscript) --> <link rel='stylesheet' id='typekit-styles-css' href='https://use.typekit.net/uow1hrg.css?ver=1.0.0' media='all' /> <link rel='stylesheet' id='robotofont-css' href='https://www.infoworld.com/wp-content/themes/iw-b2b-child-theme/src/static/fonts/roboto.css?ver=1.0.0' media='1' /> <script id="child_ajaxload_posts-js-extra"> var ajaxload_params = {"ajaxurl":"https:\/\/www.infoworld.com\/wp-admin\/admin-ajax.php","nonce":"000dd4877d"}; </script> <script id="frontend-scripts-js-extra"> var siteData = {"site":"infoworld.com","connectedhub":"b2b"}; var googleSearch = {"search_engine_id":"011881588825642368632:wfa05lybzqg","search_title":"Search","search_slug":"search"}; </script> <script id="ajaxload_posts-js-extra"> var ajaxload_params = {"ajaxurl":"https:\/\/www.infoworld.com\/wp-admin\/admin-ajax.php","nonce":"9af8550e6a"}; </script> <script id="ajaxload_events-js-extra"> var ajaxload_event_params = {"ajaxurl":"https:\/\/www.infoworld.com\/wp-admin\/admin-ajax.php","nonce":"57df80a10b"}; </script> <script type="text/javascript" src="https://www.infoworld.com/_static/??-eJyl0N0KwjAMBeAXMpYp/uxCfJa2qVtm15Ymc/r21l0MBUXQq0DgfDlEjQlsDOKCKOupDOgHSH5oKLAibEBayghJZ7kpJBbFNlMSVqc85RBM1gFTZAHjoz0vO16oJ1Za17tijWBWBmxLHmHavXK601cfNUKjxZWDxeNPVKn1sIxm944yQ0DvfgzPPf5pMCPuUlIflW8vSakkj/2h2q2rut7U+213B6Fjn/w=" ></script> <script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","licenseKey":"NRJS-51503b5fb963bca6c59","applicationID":"1486670290","transactionName":"NAZXbBAAXRZUU00KXA1MdFsWCFwLGkRcDkMPAkFdTxVcFVxTFA9SDQdcVgU=","queueTime":0,"applicationTime":470,"atts":"GEFAGlgaTkkXURtZSB4e","errorBeacon":"bam.nr-data.net","agent":""}</script></body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10