;

Software v cloudu pro flexibilní byznys (1. díl)

13. 10. 2012
Doba čtení: 3 minuty

Sdílet

Autor: © Thomas Jansa - Fotolia.com
K softwaru jako službě (SaaS) se i přes širokou osvětu organizace zatím stavějí s odstupem. Bariéry nasazení SaaS se nacházejí na více frontách. Jsou obavy oprávněné, nebo se firmy bojí jen kroku do neznáma?

S rozmachem cloud computingu, respektive jeho výraznější marketingovou komunikací, vystoupil do popředí jako první software jako služba. Myšlenka aplikace běžící na vzdáleném serveru se v dnešním pojetí rozvinula do rozsáhlých aplikací a systémů, které by nákladově i dostupností mohly nahradit řešení nasazená on-premise. Kde má SaaS svá „ale“, jsme se zeptali zástupců výrobců softwarových řešení.

Na otázku, co by mělo být hlavním argumentem při volbě SaaS, má Martin Bok, obchodní ředitel Abra Software, jednoznačnou odpověď: „Je to jako vždy poměr cena/výkon.“ Podobný pohled na software jako službu má i Abi Somorin, director – strategy & business development ve společnosti Perficio, který spatřuje výhody ve flexibilitě a TCO (celkových nákladech na pořízení a držbu).  „Žádné náklady na server, aktualizace, upgrady, nulové náklady na údržbu a nové funkce zdarma,“ udává jasně Somorin.

Ačkoliv je takové tvrzení v podstatě univerzálně správné, měl by podnik při nasazení odlišných technologií zvážit i samotnou přidanou hodnotu.  „Stejně jako in-house řešení SaaS musí dělat to, co organizace potřebuje, a to za dobrou cenu. Pro jeden segment zákazníků může být rozhodující, že dostanou díky SaaS řešení za výrazně lepší cenu, pro jiný segment je klíčová možnost práce odkudkoliv a kdykoliv. Významným argumentem jsou i nízké vstupní náklady na licence a hardware a také rychlost zavedení,“ vypočítává argumenty David Kimr, ředitel Unicorn Universe.

Pokud bychom z celé řady aspektů měli vybrat jeden, Radko Jelínek, obchodní ředitel Sprinx Systems, tvrdí, že by to byla nezávislost na IT: „Interní IT velmi často řeší vlastní problémy na úkor efektivity. Jeho motivací je, aby alespoň občas něco nefungovalo, a tím si zajistilo existenci. Externí poskytovatel si to většinou nedovolí a má obrácenou motivaci,“ porovnává Jelínek.

Český zákazník se však přes všechny argumenty v řadě případů rozhoduje především podle ceny. David Kimr tvrdí, že otázka nákladů hraje ve prospěch SaaS: „V dlouhodobém horizontu jejich cenová výhoda ještě více vynikne. Zejména pokud firma prochází obdobími růstu nebo poklesu, náklady na SaaS jsou výrazně elastičtější než na in-house řešení. Prostě platíte podle toho, jak řešení používáte, podobně jako u mobilu. Troufám si i tvrdit, že náklady na kompletní IT podporu jednoho uživatele jsou srovnatelné s náklady na jeho služební telefon.“

Také Radko Jelínek se v dlouhém období staví z pohledu nákladů na stranu SaaS a upozorňuje navíc,  že je „třeba vzít v úvahu nejen maintenance a upgrady, ale hlavně vydávání zcela nových verzí. V horizontu pěti a více let firmy vydávají zcela nové verze, které je třeba v případě on-premise zakoupit znovu,“ upozorňuje Jelínek. Abi Somorin pak tyto odhady konkretizuje a uvádí, že v horizontu více než čtyř let mohou být TCO o 50?% nižší než u běžných on-premise řešení.

Do kalkulace je však potřeba zahrnout všechny související náklady. Martin Bok podle svých zkušeností s podnikovými systémy udává základní rozdíl: „Pokud zakalkulujeme skutečně všechny náklady na klasický provoz ERP systému, tedy nejen hardware, ale také elektřinu, lidské zdroje, náklady na servisní událost v případě nehody atd., vyjde SaaS v případě ERP výhodněji. Pokud bychom pohled zúžili pouze na základní kalkulaci provozu, cena se příliš lišit nebude.“

Pokračování

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »