Mozilla má v plánu následovat Google a přidat do svého prohlížeče Firefox filtr na reklamy. Oznámila to ve své cestovní mapě pro rok 2018 s tím, že tahle výrazná novinka přijde na podzim.
„V průběhu zhruba následujícího roku se Firefox postaví proti sledování, otravným reklamám a dalším temným vzorcům webu zablokováním nejhoršího obsahu a jasnější komunikací [možností] ochrany soukromí i jiných typů ochran, které prohlížeč nabízí,“ napsal Asa Dotzler, produktový manažer Mozilly, který má cestovní mapu Firefoxu na starosti.
Dotzler filtrování ve Firefoxu popsal pouze velice zhruba. Prohlížeč bude „ve výchozím nastavení filtrovat určité typy reklamy“ a Mozilla v současné době „zkoumá typy reklamy, které by měly být blokovány.“
Ať už to byl záměr či nikoliv, připomíná Dotzlerův popis vykreslení systému filtrování reklam společnosti Google, implementovaného v únoru do jejího prohlížeče Chrome. Google stejně jako Mozilla nazval novou funkci filtrem a nikoliv blokátorem, což je běžnější označení pro software, který z webových stránek odstraní veškerou online reklamu.
Dotzler naznačil, že Firefox (stejně jako Chrome) detekuje jisté druhy nebo kategorie reklam a následně zablokuje jen tyto. Chrome se zaměřil na reklamy definované jako „nesnesitelné“ Koalicí za lepší reklamu (CBA), což je organizace, již Google pomáhal zakládat. Zatím není jasné, k jakému procesu nebo třetí straně se obrátí Mozilla; ta totiž členem CBA prozatím není.
Jestliže se Mozille podaří dodržet svoji cestovní mapu, pak by se funkce filtrování reklam mohla objevit ve Firefoxu 62 (naplánovaném na 21. srpna) nebo Firefoxu 63 (15. října).
K dalším milníkům na mapě Mozilly patří plán pokračovat v tlaku na větší výkon a rozšíření API pro vývoj doplňků, upozornění na úniky dat či blokování automaticky přehrávaného video obsahu.
Celou cestovní mapu Mozilly si v grafickém ztvárnění můžete prohlédnout zde (v angličtině).
';
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';
}
}
19. 5.
Pozvánka: Spravujte kontejnery efektivně a bezpečně
Řešení pro správu kontejnerů napříč datovými centry a cloudy spolu s nejnovějšími trendy a technologiemi v oblasti kontejnerizace budou v centru pozornosti konference Kontajnery v praxi, která se uskuteční 27. května 2025 v prezenční formě v bratislavském hotelu Lindner.
Konference nabídne i praktické pohledy na využití, správu, škálování a zabezpečení kontejnerů. Slovenští a čeští odborníci zde představí i konkrétní příklady z praxe a zaměří se na témata jako migrace, automatizace nebo zálohovaní a obnova dat. Více informací a registrace zde.
6. 5.
Miliony pro DecisionRules
Český startup DecisionRules, který vyvíjí cloudovou
platformu pro automatizaci rozhodovacích procesů bez nutnosti programování, uzavřel investiční kolo ve výši 1,6 milionu eur. Kolo vedl fond Lighthouse Ventures za účasti Czech
Founders VC, BD Partners, Chilli Ventures a andělských investorů Oryho Weihse a Michaela
Rostocka-Poplara.
Investice bude použita na rozšíření působnosti v USA a Velké Británii, kde již firma zaznamenala silný
zájem, a dále na rozvoj produktu, včetně nových funkcí postavených na umělé inteligenci. Cílem je
zpřístupnit automatizaci rozhodování širšímu spektru firem, včetně malých a středních podniků a týmů
bez technického zázemí.
22. 4.
Helios v novém
Značka Helios, která zastřešuje firemní softwarové řešení od společnosti
Asseco Solutions spadající do mezinárodní IT skupiny Asseco, mění po letech svou vizuální identitu. Za minimalistickým, moderním a nadčasovým designem stojí kreativní agentura Miuza.
Jedním ze záměrů rebrandingu bylo vytvořit logo, které bude snadno zapamatovatelné a funkční i za
několik let. Šikmá příčka v písmenu „H“ pak nenápadně odkazuje na původní design, propojuje tak
historii značky s její budoucností.
25. 3.
Technologie pro dívky
Technologická společnost Mastercard přináší do České republiky svůj globální vzdělávací program Girls4Tech. Jeho cílem je přiblížit dívkám ve věku 8–12 let svět vědy, technologií, inženýrství a matematiky a podnítit v nich zájem o tyto obory.
První české workshopy se uskutečňují 24. a 28. března 2025 na Základní škole Tusarova v Praze a zapojí se do nich 60 dívek a desítky dobrovolníků z řad zaměstnanců Mastercard a ČSOB. Více informací o programu Girls4Tech naleznete zde.
19. 3.
Poslední miliony
Agentura CzechInvest vyhlašuje poslední výzvu projektu Technologická inkubace, který podporuje inovativní firmy prostřednictvím sedmi specializovaných technologických hubů.
Do v pořadí šesté výzvy s alokací 44,8 mil. korun se mohou firmy hlásit se svým inovativním produktem či službou do 16. dubna.