Menu Zavřít

Twitter projde velkými změnami. Prostřednictvím decentralizace chce uživatelům dát více svobody, ve hře je i spolupráce s Redditem

8. 3. 2022
Autor: Depositphotos
  • Když jeden z vývojářů Twitteru přišel s myšlenkou decentralizace a vytvoření velmi svobodné sítě, nepochodil. Nyní, po skoro patnácti letech, se společnost k této vizi opět vrací

  • V budoucnu by chtěla předat rozhodování nad obsahem spíše do rukou uživatelů než zákonodárců. Kromě toho plánuje přijímat kryptoměny, a zajistit si tak nový druh příjmů

  • Ty by do dvou let chtěl Twitter zdvojnásobit. Pomoci mají i další inovace, včetně možné spolupráce se sociální sítí Reddit. Jednání o jejich propojení už údajně proběhla, oficiální dohoda však zatím neexistuje


V roce 2008 se Twitter ocitnul na rozcestí. Část jeho zaměstnanců si jej totiž představovala jako sociální síť, která má konkurovat dalším na trhu. Někteří však budoucnost platformy viděli jinde, a sice v tom, že z ní ve skutečnosti žádná platforma nebude. Co je tím myšleno? Blaine Cook, jeden z vývojářů společnosti, si Twitter představoval jako systém, který by svým uživatelům umožňoval naprosto volně sdílet zprávy napříč nejrůznějšími aplikacemi.

Aby ostatní zaměstnance o efektivitě a smyslu této cesty přesvědčil, vytvořil pro ně dokonce funkční prototyp nové služby. S nápadem však u kolegů nepochodil, a k tomu ještě dostal vyhazov. Ze startupu s ikonkou malého ptáčka se mezitím stala velká sociální síť s miliony uživatelů po celém světě, uvnitř které ovšem platí přísná pravidla. Nyní, po téměř 15 letech od nápadu udělat z Twitteru s nadsázkou svět bez hranic, se tato myšlenka vrátila jako bumerang a společnost sama usiluje o podobnou míru decentralizace, jakou Cook kdysi navrhoval.

Ambice do dvou let zdvojnásobit příjmy

Kromě financování takzvaného otevřeného protokolu se Twitter dle deníku The New York Times snaží jít s dobou třeba i tím, že chce uživatelům nabídnout aktuální trendy v podobě využívání kryptoměn a NFT. Své dveře také otevírá vývojářům, kteří mají zájem pro něj vytvářet vlastní zajímavé funkce. Se změnami v uvažování přišel už bývalý CEO Jack Dorsey, jenž nedávno předal žezlo v čele společnosti Paragu Agrawalovi.

Decentralizace služby podle nich přesune hlavní kontrolu sociálních médií hlavně do rukou uživatelů. Tento krok má rovněž sloužit jako hozená rukavice Facebooku, respektive Metě. Ta už se však zaměřuje spíše na vývoj metaverza, zcela virtuálního světa. Vizuální podoba decentralizovaného Twitteru by se nijak nelišila od toho současného, uživatelé by každopádně měli mít mnohem volnější ruce ve stanovování pravidel a moderování jejich vlastní komunity. Za současných podmínek je totiž zejména obsah sociální sítě pod velkým tlakem a kontrolou zákonodárců.

Co se děje na Ukrajině, můžeme Rusům sdělit sami. Stačí nám k tomu WhatsApp, nabádá odborník na sociální sítě Dočekal
Přečtěte si také:

Co se děje na Ukrajině, můžeme Rusům sdělit sami. Stačí nám k tomu WhatsApp, nabádá odborník na sociální sítě Dočekal

Přijímání kryptoměn a další změny by s sebou mohly přinést také nové zdroje peněz. „Kdyby Bitcoin existoval před vznikem Twitteru, myslím, že bychom viděli velmi odlišné modely příjmů. Nebyli bychom tolik závislí na příjmech z reklamy,“ řekl v audio chatu Twitteru sám Dorsey.

Jeho nástupce Agrawal si předsevzal ambiciózní cíle. Do dvou let chce zdvojnásobit zisk, a to i přes upuštění od měny, jejíž kurz se měří podle počtu uživatelů a nasbíraných dat. Decentralizace je definicí svobody na internetu, již zmíněné otevřené protokoly jsou základem naprosto běžných technologií, mezi něž patří kupříkladu e-mail.

Propojení Twitteru s dalšími sítěmi

Ačkoliv plány na decentralizaci oznamuje vedení sociální sítě až nyní, s myšlenkou jako takovou přišlo už v prosinci roku 2019, kdy Dorsey představil záměr na financování nového projektu Bluesky. „Twitter byl na začátku tak otevřený, že mnozí viděli jeho potenciál stát se standardem decentralizovaného internetu. Z různých důvodů, které ale byly v té době rozumné, jsme se vydali jinou cestou a Twitter stále více centralizovali,“ napsal tehdejší ředitel na svůj profil.

V devatenácti vytvořil aplikaci pro Facebook, teď řídí IT globální firmy. Lidé často nevěřili, kolik toho ve svém věku zvládnu, říká Dominik Hádl
Přečtěte si také:

V devatenácti vytvořil aplikaci pro Facebook, teď řídí IT globální firmy. Lidé často nevěřili, kolik toho ve svém věku zvládnu, říká Dominik Hádl

Co se skrývá pod projektem Bluesky? Zjednodušeně řečeno snaha o vytvoření nových kurátorských algoritmů, které by na začátku časové osy uživatelům zobrazovaly tweety odlišné od toho, co zobrazoval vlastní algoritmus Twitteru. Dorsey se domnívá, že to dá lidem mnohem větší možnost volby, jaký obsah budou sledovat.

CIF25

Zároveň počítá s možností propojení této platformy s dalšími sociálními sítěmi. Projekt se údajně zalíbil inženýrům společnosti Reddit, kteří podle informací z několika zdrojů blízkých oběma společnostem již předběžně hovořili s kolegy z Twitteru o tom, jak by jejich weby mohly v budoucnu spolupracovat. K oficiální dohodě mezi nimi však prozatím nedošlo.

  • Našli jste v článku chybu?
'; 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'; } }