CINXE.COM
Command Line Heroes
<!DOCTYPE html> <html> <head> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'> <meta content='width=device-width, initial-scale=1.0' name='viewport'> <meta content='noindex' name='robots'> <title>Command Line Heroes</title> <meta name="description" content="Hear the epic true tales of how developers, programmers, hackers, geeks, and open source rebels are revolutionizing the technology landscape. Command Line Heroes is an award-winning podcast hosted by Saron Yitbarek and produced by Red Hat. Get root access to show notes, transcripts, and other"> <meta property="og:image" content="https://linkable-images.s3.us-east-2.amazonaws.com/uploads/0fe44e9f-ae31-4c2f-bceb-8912ef292306/redhat/redhat"> <meta property="og:title" content="Command Line Heroes"> <meta property="og:description" content="Hear the epic true tales of how developers, programmers, hackers, geeks, and open source rebels are revolutionizing the technology landscape. Command Line Heroes is an award-winning podcast hosted by Saron Yitbarek and produced by Red Hat. Get root access to show notes, transcripts, and other"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:site" content="@ChartableDotCom"> <meta name="twitter:title" content="Command Line Heroes"> <meta name="twitter:description" content="Hear the epic true tales of how developers, programmers, hackers, geeks, and open source rebels are revolutionizing the technology landscape. Command Line Heroes is an award-winning podcast hosted by Saron Yitbarek and produced by Red Hat. Get root access to show notes, transcripts, and other associated content at https://redhat.com/commandlineheroes"> <meta name="twitter:image" content="https://linkable-images.s3.us-east-2.amazonaws.com/uploads/0fe44e9f-ae31-4c2f-bceb-8912ef292306/redhat/redhat"> <link rel="shortcut icon" type="image/x-icon" href="/assets/chartable-favicon-147fa2a780e77ea3bc97719e343e8d733b2e8487f7c8a78b3d496aae5555dd05.png" /> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="6pfNpziVukCbohmk93EXEUr1euPDzEtt05CnzF6BfP13iM9MRWFKtrrRo+dl8AVniIbV5VYw7DJmzHdgGxKvhg==" /> <link rel="stylesheet" media="all" href="/assets/application-e6e1be4b0c45d8370f449baa0ce082ab5ebb54dca77b6f98a462fff73a0e4037.css" /> <link href='https://fonts.gstatic.com' rel='preconnect'> <script src="/assets/application-e14f81bc94951128bb2d2dc4f233fd48cdc83e337ef2a6de694aeb11401a7c70.js"></script> <link href='//cdnjs.cloudflare.com/ajax/libs/tachyons/4.11.1/tachyons.min.css' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Cabin:500|Open+Sans&display=swap' rel='stylesheet'><link href='https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap' rel='stylesheet'><script src='https://unpkg.com/axios@1.0.0/dist/axios.min.js'></script> </head> <body style='background: #FFFFFF'> <div class='w-100 flex justify-center' style='background: #FFFFFF'> <div class='content-container inline-flex w7' style='gap: 2rem;'> <div> <img class="br4 cover-art" src="https://image.simplecastcdn.com/images/e6686c37-f71b-4414-bb54-c1988eb21789/79de3f95-8b9e-49dc-a8d5-d9fe89ef6548/3000x3000/english.jpg?aid=rss_feed" /> <div class='tc h2 mb2 current-episode-title ph2 mt4 f3 b' style='color: #333333; width: 300px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis'> - </div> <div class='webview-audio-player-controls'> <div class='mt3 relative'> <div class='progress-bar pointer'> <div class='w-100 bg-moon-gray br3 o-50' style='height: 6px'></div> <div class='percent-complete pointer absolute top-0 br3 bg-dark-gray' style='height: 6px;'></div> </div> <div class='flex justify-between w-100 mt2'> <div class='f6 current-time' style='color: #333333'> 0:00 </div> <div class='f6 total-duration' style='color: #333333'> -:-- </div> </div> </div> <div class='flex flex-row items-center mt2 justify-around'> <img class="dim pointer skip-back" style="height: 2.75rem; width: 2.75rem;" src="/assets/back15-dark-b158f49dddc83bc68d2c14ab3d7b42385c6daa4b734144f47713fe9448e8d454.svg" /> <img class="dim pointer play-pause-button" style="height: 3rem; width: 3rem" src="/assets/play-dark-56667b8f98046775503abb0472cd646104248c49d9dd4d8ab6389d63b8faadca.svg" /> <img class="dim pointer skip-forward" style="height: 2.75rem; width: 2.75rem;" src="/assets/forward30-dark-8b3e55d318fbad3cdb2985e11b65e725b1613b4fb73bf81bc142d7411968667d.svg" /> </div> </div> <audio id='player' preload='none'></audio> </div> <div class='w-100' style='flex: 1'> <div class='fw-700 lh-title title ph4' style='color: #333333; font-family: Inter, sans-serif;'>Command Line Heroes</div> <div class='content flex'> <div class='pt4 links'> <div class='f6 fw-700 o-80 lh-title mb3 tl-ns ph4 ttu tracked link-header' style='color: #333333; font-family: Inter'>Listen now on</div> <div class='flex flex-wrap player-list'> <a class='no-underline player-list-item flex flex-row items-center' href='https://link.chtbl.com/commandlineheroes_cyoa?id=commandlineheroes_cyoa&platform=itunes'> <div class='relative flex items-center justify-center' style='height: 60px; width: 60px; padding: 4px;'> <div class='br4 absolute bg-white top-0 right-0 left-0 bottom-0' style='opacity: 0.15;'></div> <img class="relative grow-large" src="/assets/itunes-73427b4e2f5057e639ad354810c97669b18463e9fef23d6a96e6b0760d853069.svg" /> </div> <div class='hidden-player-content flex-row items-center justify-between ml3' style='flex: 1; font-family: Inter'> <div class='dark-gray o-80 fw-600'> Apple Podcasts </div> <div class='ph3 pv2 br2 ba fw-700' style='border-color: #282828'> <div class='mid-gray o-80'>Play</div> </div> </div> </a> <a class='no-underline player-list-item flex flex-row items-center' href='https://link.chtbl.com/commandlineheroes_cyoa?id=commandlineheroes_cyoa&platform=spotify'> <div class='relative flex items-center justify-center' style='height: 60px; width: 60px; padding: 4px;'> <div class='br4 absolute bg-white top-0 right-0 left-0 bottom-0' style='opacity: 0.15;'></div> <img class="relative grow-large" src="/assets/spotify-ec5bca5b8fbca78b5b0acb04314c079a40240c9b57370518f83ac1e56302c933.svg" /> </div> <div class='hidden-player-content flex-row items-center justify-between ml3' style='flex: 1; font-family: Inter'> <div class='dark-gray o-80 fw-600'> Spotify </div> <div class='ph3 pv2 br2 ba fw-700' style='border-color: #282828'> <div class='mid-gray o-80'>Play</div> </div> </div> </a> <a class='no-underline player-list-item flex flex-row items-center' href='https://link.chtbl.com/commandlineheroes_cyoa?id=commandlineheroes_cyoa&platform=google_podcasts'> <div class='relative flex items-center justify-center' style='height: 60px; width: 60px; padding: 4px;'> <div class='br4 absolute bg-white top-0 right-0 left-0 bottom-0' style='opacity: 0.15;'></div> <img class="relative grow-large" src="/assets/google_podcasts-73950d24121a87af14f1dafd8e89dd61ba0ded991e0b9d4807a9a135b70b0548.svg" /> </div> <div class='hidden-player-content flex-row items-center justify-between ml3' style='flex: 1; font-family: Inter'> <div class='dark-gray o-80 fw-600'> Google Podcasts </div> <div class='ph3 pv2 br2 ba fw-700' style='border-color: #282828'> <div class='mid-gray o-80'>Play</div> </div> </div> </a> <a class='no-underline player-list-item flex flex-row items-center' href='https://link.chtbl.com/commandlineheroes_cyoa?id=commandlineheroes_cyoa&platform=overcast'> <div class='relative flex items-center justify-center' style='height: 60px; width: 60px; padding: 4px;'> <div class='br4 absolute bg-white top-0 right-0 left-0 bottom-0' style='opacity: 0.15;'></div> <img class="relative grow-large" src="/assets/overcast-a72bc55e75006c4efbd9bc3562f3891a896c93373c671e8f2f72f0a76215837e.svg" /> </div> <div class='hidden-player-content flex-row items-center justify-between ml3' style='flex: 1; font-family: Inter'> <div class='dark-gray o-80 fw-600'> Overcast </div> <div class='ph3 pv2 br2 ba fw-700' style='border-color: #282828'> <div class='mid-gray o-80'>Play</div> </div> </div> </a> <a class='no-underline player-list-item flex flex-row items-center' href='https://link.chtbl.com/commandlineheroes_cyoa?id=commandlineheroes_cyoa&platform=castbox'> <div class='relative flex items-center justify-center' style='height: 60px; width: 60px; padding: 4px;'> <div class='br4 absolute bg-white top-0 right-0 left-0 bottom-0' style='opacity: 0.15;'></div> <img class="relative grow-large" src="/assets/castbox-92db9a5111905ddce5a40cc77185ec56f2acb50b623cb0e8dd91131c725c908f.svg" /> </div> <div class='hidden-player-content flex-row items-center justify-between ml3' style='flex: 1; font-family: Inter'> <div class='dark-gray o-80 fw-600'> Castbox </div> <div class='ph3 pv2 br2 ba fw-700' style='border-color: #282828'> <div class='mid-gray o-80'>Play</div> </div> </div> </a> <a class='no-underline player-list-item flex flex-row items-center' href='https://link.chtbl.com/commandlineheroes_cyoa?id=commandlineheroes_cyoa&platform=pocket_casts'> <div class='relative flex items-center justify-center' style='height: 60px; width: 60px; padding: 4px;'> <div class='br4 absolute bg-white top-0 right-0 left-0 bottom-0' style='opacity: 0.15;'></div> <img class="relative grow-large" src="/assets/pocket_casts-a6bbed9f96f0781fec812463802e5a727d13a73dd216d3452dfeb97f0709ca0b.svg" /> </div> <div class='hidden-player-content flex-row items-center justify-between ml3' style='flex: 1; font-family: Inter'> <div class='dark-gray o-80 fw-600'> Pocket Casts </div> <div class='ph3 pv2 br2 ba fw-700' style='border-color: #282828'> <div class='mid-gray o-80'>Play</div> </div> </div> </a> <a class='no-underline player-list-item flex flex-row items-center' href='https://link.chtbl.com/commandlineheroes_cyoa?id=commandlineheroes_cyoa&platform=radio_public'> <div class='relative flex items-center justify-center' style='height: 60px; width: 60px; padding: 4px;'> <div class='br4 absolute bg-white top-0 right-0 left-0 bottom-0' style='opacity: 0.15;'></div> <img class="relative grow-large" src="/assets/radio_public-d9fd5d9abdea96007143dece5fd1153c9a445d2995a06025e238d4a1558c520b.svg" /> </div> <div class='hidden-player-content flex-row items-center justify-between ml3' style='flex: 1; font-family: Inter'> <div class='dark-gray o-80 fw-600'> RadioPublic </div> <div class='ph3 pv2 br2 ba fw-700' style='border-color: #282828'> <div class='mid-gray o-80'>Play</div> </div> </div> </a> <a class='no-underline player-list-item flex flex-row items-center' href='https://link.chtbl.com/commandlineheroes_cyoa?id=commandlineheroes_cyoa&platform=breaker'> <div class='relative flex items-center justify-center' style='height: 60px; width: 60px; padding: 4px;'> <div class='br4 absolute bg-white top-0 right-0 left-0 bottom-0' style='opacity: 0.15;'></div> <img class="relative grow-large" src="/assets/breaker-79c73c4e126f43f554361a74ebf12fd6889f6ef98681fea3cba9164f354e66a2.svg" /> </div> <div class='hidden-player-content flex-row items-center justify-between ml3' style='flex: 1; font-family: Inter'> <div class='dark-gray o-80 fw-600'> Breaker </div> <div class='ph3 pv2 br2 ba fw-700' style='border-color: #282828'> <div class='mid-gray o-80'>Play</div> </div> </div> </a> <a class='no-underline player-list-item flex flex-row items-center' href='https://link.chtbl.com/commandlineheroes_cyoa?id=commandlineheroes_cyoa&platform=rss'> <div class='relative flex items-center justify-center' style='height: 60px; width: 60px; padding: 4px;'> <div class='br4 absolute bg-white top-0 right-0 left-0 bottom-0' style='opacity: 0.15;'></div> <img class="relative grow-large" src="/assets/rss-5d61fa90548266c6296cb95aa758ef418ccf45deb59d2610a7d52cb4b4835c4f.svg" /> </div> <div class='hidden-player-content flex-row items-center justify-between ml3' style='flex: 1; font-family: Inter'> <div class='dark-gray o-80 fw-600'> RSS feed </div> <div class='ph3 pv2 br2 ba fw-700' style='border-color: #282828'> <div class='mid-gray o-80'>Play</div> </div> </div> </a> </div> </div> <div class='mt4 ph4'> <div class='lh-copy mb4 w-100' style='color: #333333; font-weight: 400; font-family: Inter, sans-serif;'> <span class='description'> Hear the epic true tales of how developers, programmers, hackers, geeks, and open source rebels are revolutionizing the technology landscape. Command Line Heroes is an award-winning podcast hosted by Saron Yitbarek and produced by Red Hat. Get root access to show notes, transcripts, and other associated content at https://redhat.com/commandlineheroes </span> <span class='link pointer dn no-underline text-button o-70' style='color: #333333'>Show more</span> <div class='mt5 f6 fw-700 o-80 lh-title tl-ns ttu tracked link-header web' style='color: #333333; font-family: Inter'>Episodes</div> <div class='episode-feed-container web' style='color: #333333'></div> </div> </div> </div> </div> </div> </div> <div class='f7 tc w-100 o-70 mt5 out-links pb5' style='color: #333333'> <div class='pb4'> Powered by <a class="link underline" style="color: inherit" href="https://chartable.com/smartlinks?utm_source=smartlink">Chartable SmartLinks</a> · <a class="link" style="color: inherit" href="https://chartable.com/privacy?utm_source=smartlink">Privacy & Terms</a> </div> </div> <div class='w-100 fixed bottom-0 mobile-player'> <div class='maximized-content' style='display: none;'> <div class='w-100 flex justify-center pt2 pointer minimize-button' style='height: 60px'> <div class='bg-moon-gray w2 br3' style='width: 40px; height: 5px'></div> </div> <div class='h-100 w-100 center tc' style='max-width: 550px'> <img class="w-70 br4" style="max-width: 270px; box-shadow: rgba(100, 100, 111, 0.2) 0px 7px 29px 0px;" src="https://image.simplecastcdn.com/images/e6686c37-f71b-4414-bb54-c1988eb21789/79de3f95-8b9e-49dc-a8d5-d9fe89ef6548/3000x3000/english.jpg?aid=rss_feed" /> <p class='ph4 mt4 f3 b dark-gray current-episode-title-2' style='width: 100%; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; font-family: Inter;'> </p> <div class='mobile-audio-player-controls ph4'> <div class='mt3 relative'> <div class='progress-bar-2 pointer'> <div class='w-100 bg-moon-gray br3 o-50' style='height: 6px'></div> <div class='percent-complete-2 bg-dark-gray pointer absolute top-0 br3' style='height: 6px;'></div> </div> <div class='flex justify-between w-100 mt2'> <div class='f6 current-time-2 dark-gray'> 0:00 </div> <div class='f6 total-duration-2 dark-gray'> </div> </div> </div> <div class='flex flex-row items-center justify-around w-60 center mt2'> <img class="dim pointer skip-back-2" style="height: 2.75rem; width: 2.75rem;" src="/assets/back15-dark-b158f49dddc83bc68d2c14ab3d7b42385c6daa4b734144f47713fe9448e8d454.svg" /> <img class="dim pointer play-pause-button-3" style="height: 2.85rem; width: 2.75rem" src="/assets/play-dark-56667b8f98046775503abb0472cd646104248c49d9dd4d8ab6389d63b8faadca.svg" /> <img class="dim pointer skip-forward-2" style="height: 2.75rem; width: 2.75rem;" src="/assets/forward30-dark-8b3e55d318fbad3cdb2985e11b65e725b1613b4fb73bf81bc142d7411968667d.svg" /> </div> <div class='description-container mt5'> <div class='f5 fw-700 o-80 lh-title mb2 tl-ns ttu tracked link-header dark-gray' style='font-family: Inter'> Description </div> <div class='f6 mid-gray tl lh-copy current-episode-description' style='font-family: Inter'> - </div> </div> <div class='mt5 f6 fw-700 o-80 lh-title tl-ns ttu tracked link-header mobile dark-gray' style='font-family: Inter'>Episodes</div> <div class='episode-feed-container mobile' style='color: #333; font-family: Inter;'></div> </div> </div> </div> <div class='pointer minimized-content relative' style='height: 55px;'> <div class='flex flex-row justify-between w-100 fade-display items-center blurred-content'> <div class='w3 pa2'> <img class="" style="width: 100%;" src="https://image.simplecastcdn.com/images/e6686c37-f71b-4414-bb54-c1988eb21789/79de3f95-8b9e-49dc-a8d5-d9fe89ef6548/3000x3000/english.jpg?aid=rss_feed" /> </div> <div class='w-100 f5 dark-gray current-episode-title-3' style='flex: 1; text-overflow: ellipsis; font-family: Inter; overflow: hidden; white-space: nowrap;'> </div> <img class="dim ph2 pv2 pointer play-pause-button-2" style="height: 1.5rem; width: 1.5rem;" src="/assets/play-dark-56667b8f98046775503abb0472cd646104248c49d9dd4d8ab6389d63b8faadca.svg" /> <img class="dim ph2 pv2 pointer skip-forward-3" style="height: 1.8rem; width: 1.8rem;" src="/assets/forward30-dark-8b3e55d318fbad3cdb2985e11b65e725b1613b4fb73bf81bc142d7411968667d.svg" /> </div> <div class='absolute top-0 bottom-0 left-0 right-0 o-40 bg-white' style='z-index: -1;'></div> <div class='maximize-button absolute left-0 bottom-0 top-0' style='width: calc(100% - 5.5rem);'></div> </div> </div> <noscript> <a href="">Click here if you are not automatically redirected</a> </noscript> </body> <script> var mobilePlayerIsShowing = false; let loadingIndicator = document.createElement("div"); loadingIndicator.classList = "lds-ellipsis"; for (let i = 0; i < 4; i++) { loadingIndicator.appendChild(document.createElement("div")); } let playDarkImagePath = "/assets/play-dark-56667b8f98046775503abb0472cd646104248c49d9dd4d8ab6389d63b8faadca.svg"; let playLightImagePath = "/assets/play-light-44e957ca417b16db805a9b7a569bf6a9baf0864fda92660c48999eadb06a21b7.svg"; let pauseDarkImagePath = "/assets/pause-dark-2b02da7a704af33108488e4b734d012a19b77f0bf542639284667225e353e59c.svg"; let pauseLightImagePath = "/assets/pause-light-5f6c22366e0556614d5ba30a0531b92b569fd9b8bd83146c384ff77c81c55855.svg"; let lightMode = true; if (!lightMode) { loadingIndicator.classList += " dark-mode"; } // MARKER - Description Text toggle let descriptionTextLimit = 150; let description = document.querySelector('.description'); let descriptionText = description.innerText; let button = document.querySelector('.text-button'); var textIsHidden = true; function hideDescription() { let truncatedText = descriptionText.substr(0, descriptionTextLimit) + '...'; description.innerText = truncatedText; } function toggleText() { if (textIsHidden) { button.innerHTML = 'Show Less'; description.innerText = descriptionText; } else { button.innerHTML = 'Show More'; hideDescription(); } textIsHidden = !textIsHidden; } if (descriptionText.length > descriptionTextLimit) { button.style.display = "inline"; button.addEventListener('click', toggleText); hideDescription(); } let player = document.getElementById('player'); let聽source = document.getElementById('source'); // MARKER - Audio controls var playPauseButton = document.querySelector('.play-pause-button'); var playPauseButton2 = document.querySelector('.play-pause-button-2'); var playPauseButton3 = document.querySelector('.play-pause-button-3'); var isPlaying = false; function togglePlayPause() { if (!currentEpisode) { return; } if (isPlaying) { player.pause(); playPauseButton.src = lightMode ? playDarkImagePath : playLightImagePath; playPauseButton2.src = playDarkImagePath; playPauseButton3.src = playDarkImagePath; } else { player.play(); playPauseButton.src = lightMode ? pauseDarkImagePath : pauseLightImagePath; playPauseButton2.src = pauseDarkImagePath; playPauseButton3.src = pauseDarkImagePath; } isPlaying = !isPlaying; renderEpisodeFeed(); } // MARKER - Audio time management let totalDuration = document.querySelector('.total-duration'); let currentTime = document.querySelector('.current-time'); let totalDuration2 = document.querySelector('.total-duration-2'); let currentTime2 = document.querySelector('.current-time-2'); let percentComplete = document.querySelector('.percent-complete'); let percentComplete2 = document.querySelector('.percent-complete-2'); let progressBar = document.querySelector('.progress-bar'); let progressBar2 = document.querySelector('.progress-bar-2'); let skipBack = document.querySelector('.skip-back'); let skipBack2 = document.querySelector('.skip-back-2'); let skipForward = document.querySelector('.skip-forward'); let skipForward2 = document.querySelector('.skip-forward-2'); let skipForward3 = document.querySelector('.skip-forward-3'); function secondsToHHMMSS(s) { var h = Math.floor(s / 3600); var m = Math.floor(s % 3600 / 60); var s = Math.floor(s % 3600 % 60); var hours = h > 0 ? `${h}:` : ""; var minutes = h > 0 && m > 9 ? `0${m}` : `${m}`; var seconds = s > 9 ? `${s}` : `0${s}`; return `${hours}${minutes}:${seconds}`; } function percentAudioComplete(curr) { return (curr / player.duration) * 100; } function onTimeUpdate(e) { curr = player.currentTime; currentTime.innerHTML = secondsToHHMMSS(curr); currentTime2.innerHTML = secondsToHHMMSS(curr); percentComplete.style.width = `${percentAudioComplete(curr)}%`; percentComplete2.style.width = `${percentAudioComplete(curr)}%`; } function seek(e) { var percent = e.offsetX / this.offsetWidth; var time = percent * player.duration; currentTime.innerHTML = secondsToHHMMSS(time); currentTime2.innerHTML = secondsToHHMMSS(time); percentComplete.style.width = `${percent * 100}%`; percentComplete2.style.width = `${percent * 100}%`; player.currentTime = time; } function handleSkipBack() { player.currentTime -= 15; } function handleSkipForward() { player.currentTime += 30; } // MARKER - Bottom player let mobilePlayer = document.querySelector('.mobile-player'); let minimizedContent = document.querySelector('.minimized-content'); let maximizedContent = document.querySelector('.maximized-content'); let maximizeButton = document.querySelector('.maximize-button'); let minimizeButton = document.querySelector('.minimize-button'); function showMobilePlayer() { mobilePlayerIsShowing = true; mobilePlayer.classList.add("maximized"); minimizedContent.classList.add("maximized"); maximizedContent.style.display = "block"; document.querySelector('body').style.overflow = "hidden"; renderEpisodeFeed(); loadingIndicator.classList.remove("dark-mode"); } function hideMobilePlayer() { mobilePlayerIsShowing = false; mobilePlayer.classList.remove("maximized"); minimizedContent.classList.remove("maximized"); maximizedContent.style.display = "none"; document.querySelector('body').style.overflow = "auto"; if (!lightMode) { loadingIndicator.classList += " dark-mode"; } } // Setting Episode var currentEpisode = null; if (JSON.stringify({"cid":"df8696d8-4265-4426-b0fa-5e8c6fa61983","id":131215258,"title":"All Together Now","description":"Our show is all about heroes making great strides in technology. But in InfoSec, not every hero expects to ride off into the sunset. In our series finale, we tackle vulnerability scans, how sharing information can be a powerful tool against cyber crime, and why it鈥檚 more important than ever for cybersecurity to have more people, more eyes, and more voices, in the fight.\n\nWietse Venema gives us the story of SATAN, and how it didn鈥檛 destroy the world as expected. Maitreyi Sistla tells us how representation helps coders build things that work for everyone. And Mary Chaney shines a light on how hiring for a new generation can prepare us for a bold and brighter future.","url":"https://www.claritaspod.com/measure/locator.simplecastcdn.com/a88fbe81-5614-4834-8a78-24c287debbe6/873a0904-f5ee-4a36-b366-b6e7d548ff37.mp3?aid=rss_feed\u0026feed=vUHP7wpf","published_at":"2022-05-31T07:05:00.000Z"}) !== JSON.stringify({})) { currentEpisode = {"cid":"df8696d8-4265-4426-b0fa-5e8c6fa61983","id":131215258,"title":"All Together Now","description":"Our show is all about heroes making great strides in technology. But in InfoSec, not every hero expects to ride off into the sunset. In our series finale, we tackle vulnerability scans, how sharing information can be a powerful tool against cyber crime, and why it鈥檚 more important than ever for cybersecurity to have more people, more eyes, and more voices, in the fight.\n\nWietse Venema gives us the story of SATAN, and how it didn鈥檛 destroy the world as expected. Maitreyi Sistla tells us how representation helps coders build things that work for everyone. And Mary Chaney shines a light on how hiring for a new generation can prepare us for a bold and brighter future.","url":"https://www.claritaspod.com/measure/locator.simplecastcdn.com/a88fbe81-5614-4834-8a78-24c287debbe6/873a0904-f5ee-4a36-b366-b6e7d548ff37.mp3?aid=rss_feed\u0026feed=vUHP7wpf","published_at":"2022-05-31T07:05:00.000Z"}; } let currentEpisodeTitleLabel = document.querySelector('.current-episode-title'); let currentEpisodeTitleLabel2 = document.querySelector('.current-episode-title-2'); let currentEpisodeTitleLabel3 = document.querySelector('.current-episode-title-3'); let currentEpisodeDescriptionLabel = document.querySelector('.current-episode-description'); let descriptionContainer = document.querySelector('.description-container'); function setEpisode(newEpisode) { if (newEpisode) { currentEpisodeTitleLabel.innerText = newEpisode.title; currentEpisodeTitleLabel2.innerText = newEpisode.title; currentEpisodeTitleLabel3.innerText = newEpisode.title; if (newEpisode.description) { descriptionContainer.style.display = "block"; currentEpisodeDescriptionLabel.innerText = newEpisode.description; } else { descriptionContainer.style.display = "none"; } player.src = encodeURI(newEpisode.url); currentEpisode = newEpisode; } } // MARK - Episode feed var loadMoreButton = document.createElement("div"); loadMoreButton.classList = `br2 pa2 f5 ba tc pointer dim mw4 mt4 center ${lightMode ? 'b--dark-gray' : 'bg--white'}`; loadMoreButton.addEventListener('click', getEpisodes); var mobileLoadMoreButton = document.createElement("div"); mobileLoadMoreButton.classList = "br2 pa2 f5 ba tc pointer dim mw4 mt4 center b--dark-gray" mobileLoadMoreButton.addEventListener('click', getEpisodes); var episodeFeedContainer = document.querySelector('.episode-feed-container.web'); var mobileEpisodeFeedContainer = document.querySelector('.episode-feed-container.mobile'); var page = 1; var episodes = []; var requestInProgress = false; function handleEpisodeFeedShowMoreClick(i) { episodes[i].expanded = !episodes[i].expanded; renderEpisodeFeed(); } function handleEpisodeFeedPlayClick(i) { if (!!currentEpisode && currentEpisode.url === episodes[i].url) { togglePlayPause(); } else { currentTime.innerHTML = secondsToHHMMSS(0); currentTime2.innerHTML = secondsToHHMMSS(0); percentComplete.style.width = `${percentAudioComplete(0)}%`; percentComplete2.style.width = `${percentAudioComplete(0)}%`; setEpisode(episodes[i]); if (!isPlaying) { togglePlayPause(); } else { player.play(); renderEpisodeFeed(); } } } function generateEpisodeDiv(episode, index, isMobile) { if (!episode.url || !episode.title) { return null; } var episodeDiv = document.createElement("div"); episodeDiv.classList = "flex flex-row pv4 bb b--light-gray items-start"; let pauseImage = isMobile || lightMode ? pauseDarkImagePath : pauseLightImagePath; let playImage = isMobile || lightMode ? playDarkImagePath : playLightImagePath; var imageTag = document.createElement("img"); imageTag.src = !!currentEpisode && episode.url === currentEpisode.url && isPlaying ? pauseImage : playImage; imageTag.style.width = "1.5rem"; imageTag.classList = "mr3 pointer dim"; imageTag.addEventListener('click', function() { handleEpisodeFeedPlayClick(index); }); var titleDiv = document.createElement("div"); titleDiv.classList = "f5 b mb1 tl"; titleDiv.innerText = episode.title; var textContainerDiv = document.createElement("div"); var descriptionDiv = document.createElement("div"); var showMoreSpan = document.createElement("div"); if (episode.description) { descriptionDiv.classList = "f5 lh-copy tl"; descriptionDiv.innerText = !episode.expanded && episode.description.length > descriptionTextLimit ? episode.description.substr(0, descriptionTextLimit) + '...' : episode.description; showMoreSpan.classList = `${episode.description.length > descriptionTextLimit ? '' : 'dn'} tl no-underline text-button o-70 pointer mt1`; showMoreSpan.innerHTML = `Show ${episode.expanded ? 'less' : 'more'}`; showMoreSpan.addEventListener("click", function() { handleEpisodeFeedShowMoreClick(index); }); } textContainerDiv.appendChild(titleDiv); textContainerDiv.appendChild(descriptionDiv); textContainerDiv.appendChild(showMoreSpan); episodeDiv.appendChild(imageTag); episodeDiv.appendChild(textContainerDiv); return episodeDiv; } function getEpisodes() { if (requestInProgress) { return; } requestInProgress = true; loadMoreButton.innerHTML = ""; loadMoreButton.appendChild(loadingIndicator); mobileLoadMoreButton.innerHTML = loadMoreButton.innerHTML; let host = "https://chartable.com"; axios(`${host}/api/episodes/feed?podcast_id=command-line-heroes&page=${page}&token=ab5d92470d76c4d03776`) .then(res => { res.data.forEach(episode => { episode.expanded = false; episodes.push(episode); }); loadMoreButton.innerHTML = "Load more"; mobileLoadMoreButton.innerHTML = loadMoreButton.innerHTML page += 1; renderEpisodeFeed(); }) .catch(err => { loadMoreButton.innerHTML = "Retry" mobileLoadMoreButton.innerHTML = loadMoreButton.innerHTML }) .finally(() => requestInProgress = false); } function renderEpisodeFeed() { episodeFeedContainer.innerHTML = ''; mobileEpisodeFeedContainer.innerHTML = ''; for (let i = 0; i < episodes.length; i++) { let episodeDiv = generateEpisodeDiv(episodes[i], i, false); if (episodeDiv) { episodeFeedContainer.appendChild(episodeDiv); } if (mobilePlayerIsShowing && episodeDiv) { mobileEpisodeFeedContainer.appendChild(generateEpisodeDiv(episodes[i], i, true)); } } loadMoreButton.innerHTML = "Load more"; mobileLoadMoreButton.innerHTML = loadMoreButton.innerHTML; episodeFeedContainer.appendChild(loadMoreButton); mobileEpisodeFeedContainer.appendChild(mobileLoadMoreButton) } if (true) { minimizeButton.addEventListener("click", hideMobilePlayer); maximizeButton.addEventListener("click", showMobilePlayer); player.addEventListener('timeupdate', onTimeUpdate); progressBar.addEventListener("click", seek); progressBar2.addEventListener("click", seek); skipBack.addEventListener("click", handleSkipBack); skipBack2.addEventListener("click", handleSkipBack); skipForward.addEventListener("click", handleSkipForward); skipForward2.addEventListener("click", handleSkipForward); skipForward3.addEventListener("click", handleSkipForward); playPauseButton.addEventListener('click', togglePlayPause); playPauseButton2.addEventListener('click', togglePlayPause); playPauseButton3.addEventListener('click', togglePlayPause); player.onloadedmetadata = function() { let time = player.duration; totalDuration.innerHTML = secondsToHHMMSS(time); totalDuration2.innerHTML = secondsToHHMMSS(time); } if (currentEpisode) { setEpisode(currentEpisode); } episodeFeedContainer.classList += lightMode ? " dark-gray" : " white"; renderEpisodeFeed(); } getEpisodes(); </script> </html>