Jak nedělat a přitom si vydělat

25. 1. 2013
Doba čtení: 7 minut

Sdílet

Autor: (c) theartofphoto - Fotolia.com
Nepracovat a přitom dostávat plat. To je věc, kterou si přeje většina lidí, ale jen málokomu se to opravdu podaří. Pokud nejste uhlobaron nebo jste v restituci nedostali půlku menšího městečka, asi budete muset pro získání nějakého toho přijmu vykazovat činnost. Existují ale výjimky – chytří a šikovní lidé.

Drtivá většina dnešní společnosti chodí do práce. Ráno tam, odpoledne zpět. Kolem poledne na oběd, pohádat se se šéfem, naštvat toho pitomce ve třetím patře a pokecat s blondýnou z účetního. Takhle sice nevypadá sen žádného naivního studenta, ale nakonec to známe všichni.

Existují ale výjimky. Lidé, kteří byli chytřejší nebo šikovnější než okolí. Díky tomu jim odpadá většina pracovních povinností a navíc si vydělají ještě víc, než kdyby opravdu pracovali. Morální otázku necháme na posouzení laskavému čtenáři, který si z obou příběhů udělá názor sám.

Příběh první: Najal jsem na práci lidi z Číny.

Psal se rok 2010, malá americká firma se rozhodla modernizovat a dovolila svým zaměstnancům, aby část pracovní doby trávili v pohodlí domova. Pro ty účely firma nechala zřídit VPN server, aby měli uživatelé pohodlný přístup ke všem službám ve firmě. Kvůli lepší bezpečnosti pořídila také RSA tokeny, které generují jednorázová přístupová hesla. Kdo nemá token, do sítě se nepřihlásí. Dva roky tenhle systém fungoval.


RSA token

Poté si lidé z bezpečnostního oddělení přečetli bezpečnostní analýzu DBIR (PDF), která pojednává o zneužití firemních dat a začali se zajímat o to, jak je to s jejich daty. Došlo jim, že jako většina provozovatelů služeb vůbec nečtou záznamy (logy) o dění ve své síti a začali je analyzovat.

Co zjistili, je polekalo a překvapilo zároveň. Objevili totiž aktivní spojení z čínského města Shenyang. Ze zjištěných údajů vyplynuly tři věci:

  • Firma provozuje kritickou síťovou infrastrukturu a někdo jim do sítě leze z Číny. To je vážné bezpečnostní riziko.
  • VPN používá dvoufaktorovou autorizaci se zmíněným RSA klíčem. Pokud byl tento mechanismus úspěšně napaden, má to dalekosáhlé následky.
  • Použitý uživatelský účet patří firemnímu vývojáři, který v tuhle chvíli sedí u svého stolu.

Jediným představitelným vysvětlením v tu chvíli byl zákeřný malware, který by seděl uvnitř firmy a dokázal by přenášet bezpečně data dovnitř a ven. Jinak si to v tu chvíli ještě vylekaní správci neuměli vysvětlit.

Začalo poměrně rozsáhlé vyšetřování, ke kterému byli přizváni i lidé od velké telekomunikační společnosti Verizon. Byly zkoumány záznamy, topologie sítě, segmentace, proces autorizace, korelace mezi jednotlivými přístupy a podobně. Ukázalo se, že spojení ze Shenyangu vůbec není žádnou novinkou, ale v záznamech se objevuje už půl roku prakticky každý den. Navíc někdy trvalo celou pracovní dobu, takže šlo o skutečně velmi rozsáhlý incident.

Součástí vyšetřování byl samozřejmě i uživatel, kterému patřil zneužitý uživatelský účet. Říkejme mu třeba Bob. Šlo o programátora po čtyřicítce, který měl poměrně velké zkušenosti s mnoha programovacími jazyky, pro firmu pracoval dlouho, měl rodinu a byl celkem nekonfliktní a klidný.

Členové vyšetřovacího týmu si nechali pořídit kopii Bobova disku, aby na něm našli případný malware a objasnili, jak přesně se do počítače dostal. Chtěli prozkoumat Bobovy pracovní návyky a zjistit, kde přesně udělal chybu. Na disku ovšem našli něco úplně nečekaného: stovky faktur od čínské společnosti sídlící v Shenyangu.

Ukázalo se, že Bob na svou vlastní práci najal čínskou firmu a za to jí předával asi pětinu svého vysokého platu. Autentizace nebyla překážkou, protože čínské firmě poslal svůj RSA token po přepravní společnosti FedEx. Vývojář z druhého konce světa se pak mohl připojovat a pohodlně pracovat.


Šipka v logu asi říká: „Čína je tímhle směrem.“

Vyšetřovatelé také podle záznamů z počítače sestavili běžný Bobův den:

  • 9:00 – přišel a čte si Reddit, kouká na videa koček
  • 11:30 – jde na oběd
  • 13:00 – čas navštívit eBay
  • 14:00 – píše na Facebook a LinkedIn
  • 16:30 – posílá zprávu s výkazem činnosti za tento den
  • 17:00 – jde domů

Příběh popsaný na blogu firmy Verizon, která byla přizvána k vyšetřování, má ještě dodatek a dvě zajímavé pikantní tečky: Ukázalo se, že takto Bob „pracoval“ pro několik dalších amerických společností a vydělával dohromady stovky tisíc dolarů ročně.


Zdroj: www.isifa.cz

Spánek na klávesnici je tvrdá řehole

Nejvtipnější na tom celém ale je, že byl několik let pravidelně vyhlašován nejlepším programátorem ve firmě. Odevzdával kód vždy včas a jeho práce byla čistá a dobře napsaná. Záznamy z logů se uchovávaly jen půl roku, ale pravděpodobně to tak provozoval léta. Kdyby čínská firma použila proxy někde v USA, pravděpodobně by se na to nepřišlo nikdy.

Příběh druhý: Jsem šmejd, protože za mě práci dělá počítač?

Druhý příběh pochází ze serveru Reddit, který mimochodem často navštěvoval v „pracovní“ době náš milý programátor z prvního příběhu. Napsal ho tam uživatel CS-NL někdy v květnu loňského roku. Autor je sice anonymní, ale víme, že je z Nizozemí a mluví holandsky. Říkejme mu proto třeba Aaron, což je oblíbené holandské jméno. Nejlepší bude, když si celý text přeložíme tak, jak ho Aaron poslal.

Jsem zaměstnancem na plný úvazek a žiju si dobře. Součástí mojí práce je hodně „zadávání dat“, ověřování, bla bla bla. Srdcem jsem ale programátor, a tak jsem vymyslel skript, který všechnu práci udělá za mě. Mí kolegové dosahují zhruba 90% přesnosti a zadají 60 až 100 transakcí denně. Já mám úspěšnost 99,6 % a zvládnu přes 1000 záznamů denně.

Nikdo to neví, protože počty transakcí i jejich úspěšnost je evidována až na konci každého měsíce. Tímto způsobem se nám také počítají bonusy. Potíž je, že já dostávám 85 až 95 % celé částky, která je na bonusy vyhrazena. To je HODNĚ velká suma.

Většina kolegů je se svými bonusy spokojená, protože vůbec netuší, jak moc by jinak mohli dostávat. Hádám, že teď dostávají bonus asi 100 až 200 eur měsíčně. Kdybych to nedělal, dostávali by mnohem víc.

Takže co myslíte? Jsem podle vás šmejd? Doopravdy pracuji asi osm hodin týdně, zbytek času hraju hry na mobilu a čtu si Reddit.

Co si myslíte vy? Je takový člověk zmetek jen proto, že přišel na nejefektivnější způsob, jak dělat svou práci? Nebo porušuje pravidla, protože byl najat na ruční zadávání transakcí a dělá je za něj automat? Liší se vlastně oba příběhy něčím podstatným?

Pokračování po dvou měsících

Druhý příběh má ale ještě pokračování. Aaron jej na Reddit poslal po dvou měsících od prvního příspěvku.

Aaron se bál, že kdyby byl odhalen, byli by všichni jeho kolegové vyhozeni a jeho software by je mohl nahradit. Proto aplikaci zajistil tak, aby byla spustitelná jen na jeho pracovním počítači a ještě vyžadovala heslo. Pak šel za svým šéfem a všechno mu řekl.

Ten se ho zeptal: Je ten program ještě na tvém počítači a dělal jsi ho v pracovní době? Odpovědi zněly: ano a ano. Poté dostal Aaron okamžitě padáka a byl vykázán z budovy.


Zdroj: www.isifa.cz

„Mám pauzu, pracuje počítač.“

Jakmile odešel, zavolal nadřízenému svého šéfa a nechal mu na záznamníku vzkaz, ve kterém vysvětlil, co přesně se stalo a jak ho za to jeho šéf vyhodil. Ozval se mu ale jeho bývalý šéf s tím, že mu musí říct heslo ke svému programu. Na to Aaron odpověděl, že už ve firmě nepracuje a nemusí tedy nic.

Pak zavolal šéfův šéf a poprosil Aarona o schůzku, na které by společně celou situaci probrali. Jestli je prý pravda, že může firmě ušetřit peníze, bude Aarona poslouchat. Ten byl ale naprosto odhodlaný neprozradit heslo ke svému programu. Ne snad proto, že by byl tvrdohlavý a zlý, ale program nebyl určen pro běžného uživatele a vyžadoval jisté znalosti při svém ovládání a konfiguraci. Aaron nechtěl být zodpovědný za jeho špatné použití.

Asi za týden se tedy se šéfovým šéfem setkal a nad čajem si o programu popovídali. Aaron se zeptal, jestli udělal něco špatného nebo nemorálního. Vrchní šéf odpověděl, že jediným prohřeškem bylo, že aplikaci programoval v pracovním čase, když o to nebyl firmou požádán. Aplikace samotná je nejen v pořádku, ale také ušetřila spoustu peněz, i když to firma nevěděla. Pokud by aplikace neexistovala, musela by firma najmout další lidi, protože současný tým by to nezvládl.

Šéf Aarona pochválil a zeptal se ho, proč vlastně nepracuje ve vývojovém oddělení. Aaron odpověděl, že své staré místo získal dřív a že na něm vydělává hodně peněz. Když prozradil, o jakou částku i s bonusy jde, jeho hostitel se nahlas rozesmál. Aaron prý vydělával víc peněz než jeho šéf (ten, který ho vyhodil).

Pak Aaron dostal nabídku pracovat ve firmě jako vývojář. Souhlasil, ale jen za podmínky, že jeho bývalí kolegové nebudou vyhozeni a dostanou ve firmě jinou práci. Nakonec se dohodli tak, že kromě několika neuvěřitelných pitomců nebude nikdo vyhozen. Ti nejšikovnější zůstali na původních pozicích, jen teď nezadávají údaje ručně, ale obsluhují Aaronův software. Bonusový program byl hodně seškrtán, ale i tak ti lidé vydělávají víc než předtím.

Aaron tedy teď dělá vedoucího vývojáře na svém vlastním oddělení a jeho základní plat je stejně vysoký jako jeho předchozí příjem v součtu s bonusy. Většina kolegů se přesunula také na lépe placená místa, takže se mají dobře.

bitcoin_smenarna

Jedinou výjimkou je Aaronův šéf. Už předtím s ním byla firma nespokojená a celá událost byla poslední kapkou. Proto dostal padáka. Jeho práci teď dělá bývalý kolega ze starého Aaronova týmu.

Příběh s dobrým koncem má tak jedinou drobnou vadu. Moje nová židle je na houby, dodává Aaron.

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.

'; 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'; } }