Hello, okay, all right. Okay, why don't we get started? How's everybody doing? I already asked, but yeah. All right, thank you, thank you for coming. I'm gonna talk about how to improve CICD process for your cloud-native Python applications using a few different PyPI cloud options. Yeah, so let me introduce myself a little bit. My name's Jaehyun, my friends call me Jae because they cannot pronounce my name correctly. I'm from Boston, so having a hard time getting used to this weather as well. I'm a software engineer at Ikigai. We're building really cool data science platform like on a cloud, and we're helping our users who use their data on their day-to-day life to automate the process. So please come check it out, it's pretty cool. So the motivation of why I'm here is as a startup, we did not spend a lot of time on our CICD process or either cloud infrastructure. When we started off, we just wanted to focus on our POC and our investors are there. We just wanted to make something. So naturally we didn't focus too much and now it's a big problem and then we had to spend a lot of time with a lot of resources to build something that is meaningful, something that's not breaking. Also, I didn't specify here, but also we use a lot of open source tools to make our platform work. For example, Superset is a visualization tool written in Python and also Ray is a computing engine, which I love. So I always wanted to give back to the open source community and then I found this opportunity as a perfect example. So yeah, that's why I'm here. So today I want to talk about where we started, like how we start this journey of setting up cloud infrastructure with PyPI and what kind of CICD challenges we faced on the way and how we resolved it. And in that CICD processes, we utilized this something called PyPI. And then I'm gonna introduce some different types of hosting options for PyPI in your infrastructure. And lastly, I want to talk about some few example clouded architecture that I utilized PyPI with and yeah, so why don't we get started. So I'm gonna start with how we started our building our platform. So in a nutshell, we wanted to build the data science platformer cloud and I'm a big fan of all these tools listed here. We wanted to build our platform on AWS cloud. We wanted to use Python for our language and for our microservice ecosystem, we wanted to use GRPC and to containerize our application, we utilized Docker and we wanted to deploy and orchestrate those containers on Kubernetes. Of course, and following, we wanted to build a CICD pipeline that incorporate all these things. So I'm gonna start by how naive you were. So this is what we thought is gonna happen. So for our CI continuous integration portion, we thought we're gonna write Python code and we're gonna build the service. So naturally Python doesn't really build a service like other languages, but we utilize the GRPC. So we compiled ProtoBuff for services to communicate with each other and we test, we perform some kind of unit test for each services. If the task passes, we merge to the main branch and containerize, pretty simple, right? For deployment also simple, most of the companies have, most of the product has like two environment, two clusters, either dev or staging environment where they push and test. So exactly that. We're gonna push to our development Kubernetes cluster. We run a platform test so that we, to see if services can play good with each other and which is also written in Python. And we then deploy to production environment and then we test one more time, a platform test to see everything's perfect. So as our platform grows, our company grows, we have a lot of feature requests. So we build multiple services on top of it. So I'm gonna quickly explain like what these are because I'm gonna use this example until the end of the talk. So API server is basically what users interact with. It's like, hey, where's my project? Where is the list of the model that I can use? Things like that. ETL services, the data pipeline, they run the data pipeline. They perform basic ETL steps like a filter, sample, all these things and deliver the data so that ML service can utilize and ML service of course build a machine learning model with hyperparameters and persisted in somewhere, all the goodness. So what we thought, what we expected is if we have multiple services, we're gonna just replicate entire pipeline and then just build it. And then it's gonna be nice, it's gonna be clean, all independent, great. So obviously that was not the case. So I'm gonna introduce some obvious CICD challenges. So first one was a share code base. As a startup, we didn't plan it right. So this ML model portion of the code base was embedded in every single services and that's not good. So example-wise, API server wants to get all the list of model that it should return to users so it calls some part of the model portion of the code base. ETL service wanted to pre-process the data that is specific to each model so it had to access that. And then ML service of course has to build a model so it needs access to that model code base. So it was really tangled up like this and this was the problem because every time you want to change something in the library, for example, let's say you added one type of machine learning models to this model portion of the code base. Now you want to expose that to user, hey, there's a new model and now you want to run some pre-processing in ETL pipeline when that model was requested by users and then now you want to build that model in the ML service. Meaning you need to trigger entire pipeline again. So you need to build three images just for this and then when your service scales, like you don't want to even think about it. So easy, simple, natural solution is you just port that out. So code base-wise, you're going to port all the ML model portion of the code base into different repositories so that you're managing them separately, not embedded in each other. So I'm going to use terminology package and library interchangeably in this talk. So I'm going to just make sure that everybody's tracking. So library is just nothing but collection of packages in my understanding. And package, if you have played with Python before, if you see one directory with init file in it and there's a bunch of Python file and then you can import that, what is it, directory as one logical group, that's a package, right? So library, so in my understanding it has more of a purpose.  So in that sense, we separate the model library out from each code bases and diagram-wise this is perfect, this looks independent. So are we good now? So not really because you differentiated, you like ported out the code base itself but CICD process is still very, very tightly coupled. So for services, yes, you can write code, you build it, you compile the protobuf, test it out, the same thing you did from before. But still, when you change something in the library, you still have to go through the service portion of it one more time because yes, you separate out the code base but you still have to embed it into the service itself so that they can utilize it. So this is not good. So why is it bad? We still need to redeliver services when library update is required. So that's what I just said. And hard to keep track of the library versions within each service version. So what this means is that every time you build a library, yes, it's gonna be good. It's gonna be ideal if you just build all the services that utilize this library at the same time. But let's say API server has no problem. It returns all the list of models just fine but then maybe one of the model has bug in its preprocessing function. So you just have to update that. Now you have different versions of this ML model library in three different locations and then if some bugs happen, you just don't know if you just wanna fire everything or like, yeah. So it's really hard to optimize because you just physically cannot keep track of the version there. So what I wanna say is decoupling is still required at CIC level for that purpose. So wanted to quickly introduce what Python package repository is. So if you use Python before, you know this. So PyPI is classic Python package repository. It holds different types of package that user uploaded. You can download the package easily, pip install, that if you just do pip install something, you're downloading from public PyPI. And you can also specify the version. I'm pretty sure you guys know. So if you do pip install ml library equal equal 001, you're just downloading that version. So you don't have to, yeah, I mean, yeah. So with this Python package repository, let's say we have some stable version of hosted solution for this somewhere. So what we're gonna do for the library is a little different. So we write the library code, we test it out with the unit test, we merge it to the main branch, we build the library into some portable format like .will or user snippet, and you deploy the library to the Python package repository. Simple as that. So now it's version and then it's accessible for anybody. And now for services, it looks a little different because it utilizes a Python package repository in its entire CICD pipeline now. So I'm gonna walk through. You write service code, you compile the protobuf, and then when you're testing service, now to fully test how service works like what it can do, you need, sometimes you have dependency on the libraries, right? And that's when you pull in, you download some specific version of the ML model library that you wanna test the compatibility with. So on that spot, you download it and you merge the code, which is not related to ML library now. You containerize the service, and also when you're deploying to the staging environment or some kind of cluster, in your startup code, you're gonna download that specific version of library on the startup. Let me explain why that's useful later. But yeah, that's what you're gonna do. When you're testing it, you don't necessarily have to download it one more time because it's already inside of the package, you're running as a server. So you do the platform testing, and you do the same thing when you're pushing to the production environment and test it out. So why is this useful? So this is one example how we're doing it. So we're setting ML library version as an environment variable for each pod or deployment in our Kubernetes cluster. So let's say, going back to that specific use case where there was a bug in ETL pipeline function. So in ML service, they don't have to update anything. So they're still utilizing ML library version as a 002, but ETL service wanted to update something, so now they're using 005. And this is maintained in the startup level, the launch script level, sorry. So when you want to build a library, and then when you want to just fix the library and push the change, you don't have to rebuild each container, you just have to restart the pod after you specify which version you want to use with the library. So yeah, and in this way, your library version, compatibility between ML service and ML library version is specified inside of the code base. So for you, it's easier to keep up with if you're using GitOps or something. So is that it then? Like it's pretty simple topic, but no. So this is all, so we can decompose the processes between libraries and services if we have a Python package repository that is stable and always running. So which is why I will actually want to focus in this talk is a Python package index, PyPI in short. So I'm going to introduce you a few different ways that you can utilize PyPI in your cloud architecture. So before I start, how I want to measure this is a good PyPI hosted solution for your system is I want to see if it is a cloud native. This is from CNCF website, I'm pretty sure this is, there's a connection for this. So what I want to focus is that to be cloud native technology, it should be able to empower organization to build and run scale of application in modern dynamic environment. So dynamic, it should be, your PyPI solution should be able to run in any environment. Loosely coupled systems that are resilient, it should be available all the time and allow engineers to make high impact changes frequently, so pretty much like it has to be fast as well. So these are few requirements that I set up for a few different options that I'm going to introduce how you manage your PyPI server. So first one is portability, you should be able to put your PyPI host solution anywhere within your system and security, I just added it because well, you don't want everybody to see your code base on time. Resiliency, it should be always available, speed it should be fast, pretty straightforward. So I'm going to talk about public PyPI first, just because, so public PyPI is, well, public PyPI, this is where you download yourself if you just pip install something. Gonna spend really quick time on it. Security, nothing, everybody can see what you upload, everybody can download everything. So if you want to use anything that is specific to your company environment, anything proprietary, then this is not an option. So resiliency, yes, portability, yes, speed, yes, use CDN, so I mean, if your code base is, can be public, if you're working on open source, sure, use pip, but then that's not why I'm here. So we're gonna explore different options, so PyPI server. So PyPI server is, well, as it says, self-hosted PyPI service.  This is open source, go check it out. But this is how PyPI server generally works. It has some kind of a disk space and if you upload a package, it's gonna be stored as a directory. And each directory represents the packages there and inside of there you're gonna find either ag file or either wheel file, which is like compiled version of your Python code. And it's versioned inside of each directory.  So that's one way in Kubernetes. If you want to make it in AWS, then you launch up EC2 machine, you install PyPI server there or run the container that has a PyPI server there. Mount the EBS volume on it so that you can keep your packages in the event of PyPI server just dies. So yeah, pretty simple diagram here. So the problem is it does have a little bit of scaling issue if your company's big and then there's a lot of people working on it. So every time when you do pip install, what it does is it sends the HTTP request to the PyPI server that the pot or EC2 instance and every single time when that happens, it scans entire disk space. So if you have actually thousands of packages, it slows down a lot. Like you might have to wait for a few minutes just to install one package and I don't think you want that. I mean, that's initializing the installment, not just actually installing it. Once it finds the package, installing is pretty fast but like that just searching for the packages itself takes a lot of time. So what you can do is you can actually install the caching of PyPI server cache manually in your PyPI server. It actually remembers every time when you, when some packages updated or requested, it remembers where the location of each PyPI package and then it immediately returns. So that's one way you can actually speed it up a lot. PyPI server cache, it internally used a watchdog, Python library, it just monitors the file changes and that's how they maintain the caching of like where this package is. What you can, and if you want to do more, you can actually enable caching at the reverse proxy level like NGNX has a innate reverse, what is it? Built-in caching logic, so you can utilize that too. If you wanna see how that actually works, you can go to the reference in the bottom. But yeah, so you can resolve the scaling issue by doing this kind of manual. So I'm gonna do a little bit of demo. Let's drink some water, really quick. This is just a public repo that I made for this specific demo, so please check it out. But what I'm gonna do here, I have a PyPI server and I have three directories set up. Setup is how to set up your basic Kubernetes PyPI server in your own Kubernetes cluster.  It always, it doesn't work, so I'm gonna do that and upload is how you can upload your own package and download is how you can, well download the package is pretty simple. Try to be very descriptive on how each thing works, so let me know if you cannot follow. So okay, let me go through this one first. So what happens is to deploy the PyPI server by yourself, you add the helm repo and you need to generate encoded username and password with htpasswordd. This creates the file that has your user information and then you're embedding this when you're building, when you're starting up the PyPI server. So PyPI server remembers your username and password and then only enable you to download something if you authentic yourself, pretty simple. What I did is I have a kind local cluster. I create a namespace PyPI server and I deployed my PyPI server helm chart. So in here, it only has replica count one. I'm gonna explain why I just have one even though it's a Kubernetes setup. And this is what I put as a credential. My credential is test user and password is a test password. So yeah, so this is already running. I deployed it already. We started once because I updated the Docker and what I'm gonna do, what I'm gonna do is I'm gonna do the port forwarding for this so that I can access the PyPI server in the pod with my local host. So that's exactly the pod that is running here. So if I go to local host, you're gonna see this PyPI server. It's very small, PyPI server. Doesn't have too pretty UI, but. So if I go to simple index, this is a default index that if you don't specify any other index and don't create anything by yourself, simple is where you're gonna go. So I deployed this cloud open before this talk and it has two versions, 001 and 002. So as I said, there's a disk space with a bunch of directories in it and each directory, what is it? Each directory represents one package and inside of there, you're gonna find binaries for each pack, each versions of that library. I can download this by doing this. So I'm gonna quickly show. So I made this really nothing package called cloud open. So I'm gonna, actually let me upload it first, sorry. So if I go to upload, this is how you, I'm pretty sure people, if you have published something into a public PyPI, you know this, but just wanted to quickly go over. So that PyPRC, this is the file that keeps track of which PyPI server that your computer remembers. And you can specify different types of servers here. If you put test and then like next up like development, you just have to add another field that looks exactly like this. This is where your PyPI server is located, password and username. So you have to put this in your home directory, just like that AWS file. And you specify the setup.py file, specify the name of your package, and you specify the requirements, like just like requirements.txt and version, I'm gonna specify that with the batches environment variable. And how I build it, build and deploy is I call that function, I invoke the function, invoke the file module, and upload it to repository that I specify. So obviously I'm gonna use test. So if I do PyPI server, go to upload. If I do Python, oh no, sorry, bash. So we had 002 version, I think. So I'm gonna upload 003 and to the test pretty fast because I have nothing there. So if I refresh, you're gonna see your version there. Downloading is also very simple because you're not downloading from your public PyPI where you don't have to specify anything else. You do have to specify something called index URL. That's where your own PyPI server is located. So I'm going to copy and paste this one more time and I'm going to change the test username and password to test user and test password. And let me download 002, although there's absolutely no difference between the version. Oop, let me just download CloudOpen for now. This is why I hate it, localhost. Oh, oh, there you go. So CloudOpen, so obviously this is the latest version. So I download that, let me retry this. So I have this, I'm gonna download the 002 version. Thank you for waiting. Yeah, so you can do the version control like this, obviously. And just to make sure that you download everything correctly, so import CloudOpen and CloudOpen greet, it does its thing. So now your computer has a package from your own PyPI server. So that's good, moving back to the slide. So other option other than PyPI Cloud, which we're using in our company is PyPI server, is PyPI Cloud. So think of this as a yet another way of hosting your private PyPI server, but you're making your caching layer and you're making your storage layer into a hosted service. So small teams like us just loves this because we don't have to put much time into it. So in the storage layer, you can use Amazon S3, GCS, Azure Blob Storage. For caching layer, you can use Dynamo, we're using Dynamo, any kind of a Redis distribution, any kind of a SQL library, SQL database, sorry. I just put Postgres there because I love Postgres. And because these things are a hosted service now, or can be hosted service now, you can literally put PyPI Cloud instance anywhere. Like if it is Kubernetes or if it is like some, if you wanna use it in Heroku, yeah, sure, go ahead. So another demo is, I'm not gonna do much this time because it's pretty much the same. Gonna go to PyPI Cloud and go to setup. So in this case, we're gonna actually build a Docker image or I built a Docker image and deploy that. All that information is here. If you go to Docker file, I have that. And then we're gonna explore how to change the server.ini file really quick. But, so just like you create a password in PyPI server, you're gonna have to create a password here as well. But instead of using HTPasswordD, you're gonna use PyPI Cloud's own executable, PPCJ and password. Once you use that, it's gonna ask you password twice and it just looks like password dot, so it looks like a max password thing. So I was inputting my password for like 10 minutes and notice I was dumb. And yeah, so what you're gonna do is you're in that server.ini file.  I still use a test user and this is that encoded version of Task Password.  So we're using S3, we're using Dynamo for this demo. And if you provide your PyPI Cloud instance enough credentials, for example, I gave AWS access keys and secret key to our pod and then it auto-generates all this for you. So you don't have to do anything by yourself, pretty easy. And then build a Docker image locally and I create a PyPI Cloud namespace and I deploy with the Helm chart. So I'm gonna do yet another forwarding. So this is where that PyPI Cloud deployment is. I'm gonna do that. If I go to local host one more time, so now it's a PyPI Cloud. Looks better, I think. It has nothing because you need to log in. So test user, test password.  The Cloud open with better UI. So I only uploaded one package here. How to upload, how to download is exactly same with the PyPI server. I mean, PyPI server's way of uploading is exactly same with the public PyPI as well. So not gonna go through that one more time. So that's PyPI Cloud. So I wanna kinda compare PyPI Cloud and PyPI server really quick. So PyPI server portability, yes. You can deploy that inside of the Kubernetes as a pod. You can deploy it in EC2, so you can pretty much do whatever you want. Security, yeah, if you put this in your own VPC, yeah, you have your security, and it's a little plus. You have a username and password. Doesn't do much, but still there. Resiliency, so you need to do a little bit of work for this. I'm gonna show you with the diagram how we achieve this in the next slide. But what happens is, if you want to, so in Kubernetes, I'm gonna just keep using Kubernetes as my example, if you wanna have multiple pod for availability and resiliency, in PyPI server, you need to mount that to the disk. If you want to mount multiple pods into one disk in Kubernetes, your PVC, your persistent volume claim has to have a read write many access mode, and you kinda have to have an NFS that's there for you if you want to mount from many different pods. So for us, it was a little bit more work than we expected, so with work, but Resilience is gonna be there. Speed, yes, if you install that caching thing by yourself, you're gonna get speed as well. So PyPI cloud, portability, security, exactly the same thing with PyPI server, so yes, it's there. The beautiful thing about PyPI cloud is resiliency and speed just follows with it. So storage, since you're using S3, GCS, this hosted solution, you don't have to worry about setting up your NFS server or something like that. And speed caching layer is default here, so you automatically get speed without doing anything by yourself. So yeah, next up, we're gonna talk about these. I'm gonna introduce three different types of cloud architecture that you can host your own PyPI server. And I actually use this, use all of this in my current company and my previous company. So we're gonna start with what I used in the past. So we had PyPI server, two instances, multiple instances of PyPI server in EC2. And we did have multiple Kubernetes cluster, I believe most of the other companies do as well, because the blue, green or staging production, I'm gonna just set this as a default option now. So we have a multiple PyPI server that talks to each cluster. And for resiliency, it doesn't have to connect strictly with this guy and this guy. And each PyPI server EC2 instances are mounted to EBS block where we actually store all the packages there. The problem, not the problem, but then so EBS does allow you to mount multiple EC2 machines, but I think the limit is like 16 machines at this time. And then you kind of have to be in same availability zone for that to happen. So for us, little too much work and then we can see the limitation when we started off. So I didn't want to use it next time I'll set it up. So the next time I set it up in the current company, we start with this. We actually use PyPI server in a pot and each of those pot were mounted to EFS, which is a kind of NFS service that MSN provide. And PVC, of course, it has to be read write many. We noticed there was some little slowdown issue for some reason in EFS like 2016. So we stopped using it. So we install Ceph and it was beautiful, but then it was little too much work just for this. So we decided to explore other options. Even though this was working totally fine, we wanted to make something. We wanted to explore something that is simpler to manage. And that's why that's how we ended up with PyPI cloud. So as you can see the diagram is like a lot simpler now. You can deploy your PyPI cloud pot in deployment, state, what is it, replic set, demo set, whatever, into each Kubernetes cluster and they all connect to DynamoDB. I don't have to worry about the scalability and they just do it. So yeah, and then with this setup, our info team didn't have to revisit, hey, this is not working for our PyPI cloud deployment for last half a year. We didn't really worry about it. So I think that's a really big win for startup like us. So yeah, just putting that idea out there. So in conclusion, by using PyPI cloud, we can organize code base with libraries and services without sacrificing efficiency. So not just separating your code base out, but then your CI CD pipeline can be more individualized for each services and library. So whole scalable and secure Python package repository for your cloud native environment. So I kind of suggested two different options, PyPI server and cloud. So if your company has specific infrastructure you're running, try to find what's best suited you and then lastly, engineers can focus on building interesting stuff rather than wasting your time on setting something that is always breaking. Really, yeah. But yeah, thank you. That's everything I wanted to say. Thank you for coming. If you have any other question, I'm gonna stay around for next few minutes. So feel free to talk to me. Thank you.


Hello again, everyone, and welcome to another edition of Yes, We're Here, I'm Jack Curry. And today we're joined by Dwight Gooden, former Met, former Yankee, Dr. Kay, Cy Young Award winner, three World Series championships, one with the Mets and two with the Yankees. And Doc, as I welcome you into the show, I first want to start by asking, how are you and your family handling everything that's been thrown your way with the pandemic? The everything is going well. First, thanks for having me. It's good to be talking to you again, Jack, it's been a while. I'm in Florida now, visiting my grandkids. I have six grandkids, and so I get down here to see them, so this is great. Just try to mix it up a little bit. But thank God, the family's good, everybody's healthy, and I'll be biking in New Jersey real soon. So just taking a day at a time and hopefully we'll get a sports bike real soon. So one of those grandkids is watching YouTube, and he looks up 1984. What does he think about Grandpa Dwight, Grandpa Doc, and what you did to batters during that 1984 season? My eight-year-old grandson, he plays the league, and he loves baseball. I mean, he has a passion for baseball. He speaks to his bat, and he has a thousand questions. And during the summer, he normally is up in New Jersey with me, going to some of the Yankee fans, going to some of the games. And so we talk a lot about it. I show him some videos, and so he's great. My six-year-old grandson, he loves baseball. He plays too in high school, but what's amazing is, I have a 15-year-old son who's my youngest son. Unfortunately, he likes football and basketball. He's not a baseball fan, but when he was playing a little league, biking to New Jersey, I mean, we're going back maybe like 10 years, and I was telling him about, I should pitch where he wanted to pitch. I said, I'll work with you. I'll show you some things to do. And he goes, what do you know about pitching? So I had to pop in some tape for Sean, and to him, I'm just dad. So while he was playing a little league, and then some of his teammates' parents knew I was, and they would share it with their kids. That's how he kind of understood that I played. Now he understands that I did play, but at a time when he first started playing, it was hilarious because he never knew I played or anything about it. Yeah, I would say you knew a thing or two about pitching, but let's start at the beginning. You're 19 years old making your major league debut in the Astrodome for the Met. Do you remember how tense, how excited, how nervous you were that day?  It's a dream come true. It was my father's dream since I was a kid. I'm gonna make it, and now here I am. I finally got the opportunity. Finally got what I asked for, and then a year and a half out of high school, and now I get my first game. So obviously, very nervous, a lot of anxiety, and you're wondering if I'm ready. Did I do enough work? Was it more work than you'd be done? And I remember having lunch with my parents earlier that day, the message kind of flew up into Houston. And after we had lunch, I was just so nervous with anxiety, and the bus was up to a five, and I remember asking the concierge guy how to get to the Astrodome. What's the way you can get there? He goes, why just take a cab? I said, no, I wanted to walk. And it was about three miles, I think, and I ended up walking to the Astrodome. Very nervous. And once I got there, I didn't know how to get in. I ended up climbing like an eight-foot fence. True story, I climbed the fence, and obviously, once I got across the fence, security was right there, waiting on me. And they called, they called us here. I told them I'm docking, and I'm pitching tonight, and I'm like, sure you're pitching tonight. And I remember I had to show my ID. And luckily, Steve Gardner, Steve Gardner, I had trains, was already at the ballpark, and he came out to verify for me, and that's how I started out. And facing the first hitter, Bill Dorn, was very nervous, had my prayers in the stands. But once I, I spoke out to Dickie Thun for the third out in the first inning, that kind of coming down a little bit. You pitched five innings, you got the win. You got a win for being able to jump over the fence. You won the rookie of the year that year. But in 1985, Doc, you had a season for the ages 24 and four, a 1.53 ERA, 16 complete games. We've got a great research staff at Yes. And they told me that conservatively, that's one of the top 10 best seasons a starting pitcher has ever had. What do you remember about that magical season? Thanks for the kind words. Just unbelievable. I remember after my going to spring training in 1985, you know, you hear all about the sophomore jinx, and I actually had a bad spring training because I remember David Johnson was trying to force me to use my changeup. Changeup was terrible. But then he got to the point where every other pitch, I had to throw a changeup no matter what the count was, who the battle was in a situation. And I feel like two winners, the hitters, figured it out. So they'll just take the fastball and the curveball and just sit on this changeup, which was nothing. And once the season actually started, David said, okay, can that changeup, just go back to the pitch where you know the pitch. And having Gary Carter there, a veteran catcher, experienced catcher, he played a huge part of that. And just from the first game, even though I got a notice stage in opening against the Cardinals, but from the start of that season, I just felt like it was going to be something special. Obviously the crowd was bigger. Just a lot of expectation from the media, from the fans, and also for myself. And that's about four, five stars a year. It became more than just a game. And what I mean by that was each start, you wanted to tennis rackouts. You wanted a complete game. You wanted to shut out. Because, you know, that's what the people wanted. And that's what I expected. And no disrespect to other hitters or other teams, but it just was bigger than a game at that time and more than just a start. And I remember between starts, Mel Stardemar would challenge me, so I didn't get complacent what was going on. They always find things to work on and get better. Doc, there's been so much that has been written and so much that has been said about the 1986 Mets. How would you describe the journey you took with that very rowdy, very talented bunch? Oh, man. You said it right. It was a ride. It was just like a roller coaster ride, but a great ride. You know, we got to do something out of night on our SMY.  It was great seeing those guys that just the reminisce, seeing that the guys are healthy. And if that was to do well, because you share so much time with those guys.  And probably true, but we fell off the fans. But the thing about it was a lot of knowledge. And I was mentioning that to the guys, we had a lot of knowledge, a lot of guys that loved to get on baseball. And I remember on Sundays, after they gave us a shade and traffic would be so bad at the games, we'll sit in the clubhouse, drink beer and just talk about baseball for hours. And that's one of the things I missed the most. And so many guys on the team put Eagles aside. We had, like, say Kevin Mitchell, Tim Toffle, Howard Johnson, Danny Heap. Guys who could have been starters on other teams, they put on Eagles aside just for one come and go. And I was the winner of a series. And it started at the top with Frank Cash and baby Johnson later away. Just a great group of guys, a lot of chemistry. And you hear it a lot of times about teams that you got to have chemistry and most of them win a team. But to me, chemistry is, what are you guys doing off the field? What are you doing? We don't have games. We're spending a lot of time together, whether it's going out to eat, whether it's hitting the town or whatever it was. But a lot of us, we're always together and we depend on each other. And if we got down to it, we'll get on each other and somebody threw it up or someone right. But at the end of the day, you do those guys in your corner. That's what made that much special. That team obviously deserves to be celebrated. You mentioned some of the names right there, some of the great players on that team. I talked to Darryl Strawberry a couple of weeks ago and you know this as well as he knew this. There's a belief that that team should have won more, Doc. That you guys, maybe in 88, the Dodgers, you had dominated them all year. You couldn't get past them in the lead championship series. When you reflect on those Mets years, I'm sure you're excited about winning in 86. Do you think those teams left something on the table? Should they have won more? Oh, definitely. At least got to the post season. The team that we had in 86, like I said, when the chemistry stuff was there and after that season over, coming to spring training in 87, we were suspecting the repeat. We had the chemistry, we had the guys. Unfortunately, you know, I was in treatment the first two months and at one time or another, our whole staff had went down with different barriers and injuries and it just didn't come together. And 88, that team there, I thought on paper was probably better than the team we had in 86. I'm not sure if the chemistry was the same, but on paper, statistics was definitely better. I thought we had a better team than the Dodgers. Unfortunately, as you know, in the post season, a lot of times the best team always wins. The team would get hot at the right time and with her shot, the Dodgers got hot at the right time. Because I think that year we only lost it at one time. Unfortunately, they beat us in that series and I think everything changed, which I hate to say was the pitch that threw the mic associate. That pitch still bothers me to the day. Every time 88 come up, I think about that one pitch and he got me and things, but they weigh and I changed the whole series and they got the best of us and then they went on to beat the Oakland. And then after that, we never could get it back together. On paper, we had some great teams. Like, I remember one staff we had, myself, David Cohn, Saber Hagen, Frank Baola, those guys, we thought for sure, but that staff, we should be right there. It just didn't work out and I definitely think we left titles on the table. No doubt about it, but you know, it happens and what can you say? At least we got that one. You had a second act, an important second act in your career with the Yankees. How important was George Steinbrenner in your life, in your career at that time, and making that happen? Oh, George Steinbrenner and his family, I couldn't thank them enough. None of that, when I was suspended for, well, actually in the 94 season and then 95, I was suspended for the entire season. I knew the mess when it cut ties, which I completely understood. I wanted to go back to, you know, just to make you right with the fans and Mr. Steinbrenner gave me an opportunity to come back to the Yankees. I remember the first meeting I had with George in 95, it was right before the playoffs started with Seattle, they had, and we talked, he didn't talk nothing about baseball. He just wanted to know what I've been doing my time, how I've been spending my time, and what's going on with my life. And I thought it was great.  Three days later, after the playoffs was over in Seattle, I had eliminated Yankees. We met again, talked about some of the Yankees, and once my suspension was up, a sound of the Yankees, and it was great. He just told me, pitch while I make a pitch, everything will be good. I was fortunate that year in 96, I got off to a slow start, but he was always in the corner, tough guy, very tough guy, but you knew at the end of the day, he was in your corner. And I remember when my dad was sick in the hospital before he passed away, and this is six o'clock morning, anything that George had done. He flew, he was flying into Tampa for a meeting, and he ran into Ray and Groom at the Yankees Spring Training Complex, and he asked Ray, how's Doc's dad? And Ray told him, because he's not too good, Doc said the hospital would have known. And he told Ray, go into the meeting, tell those guys I'll be in there a little later. He never went to the meeting, he came straight to the hospital, spent about an hour or two hours with my dad, and just talked baseball, just talked about life itself. And that to me, show what kind of guy he was. He didn't have to do that at all, especially at the meeting, but he did that. And gave him an opportunity in 2000 when my career, I thought, was over. I started with Houston, I pitched one game, went to Tampa, pitched eight games, got released. He called me himself, I still won the pitch, said, yes, he said, I'm gonna work out with Billy Connors, you know, in Tampa, if things don't work out, you can't work for me. So after my career was over in 2000, I worked for George for six years, and what a tremendous guy.  But I looked at that as, he was invested back into his team, where all the owners had the same opportunity, but there was pocket in money. George was a fan, as you know, the team, and he won't do anything to try to win. I have to respect that. And I still don't understand, and it's just my opinion, George is not in the whole of fame. I don't understand that, I don't get it, but you know, I don't know. But just a tremendous guy, obviously as an owner, and what he's done for the Yankees, but a tremendous guy, for what he's done, for the people in Tampa, that people don't even know about. He always told me that if you're doing stuff from the heart, who needs cameras? And I've witnessed him doing so many different things, so many people, especially myself and my family as well. Doc, you mentioned how we talked to you about you while you were suspended, not about baseball. What did you learn about yourself, when you didn't have baseball for the end of 94, and then all of 95?   What kind of soul searching did you do at that time? Oh man, at the beginning it was very tough. Not having baseball, like you said, something I've had since I was seven years old, and had that taken away because of my own self-destruction. It was very, very tough. At the beginning it was hard to set, it was a lot of stuff, a pity. Once I got into a rhythm and understanding that I had to take care of a problem first, put baseball aside, take care of what was going on with me first, then things would get better. And I remember talking with Bob Clappage for a bit, and he gave me Rainier Groves number, who happened to live in St. Petersburg, Florida while I was doing the time. And my attention was to try to go to Japan. I said, I want to go to Japan because I still wanted to play. I was in denial about the disease of drugs and alcohol. And once I met Ray, he said, I'll get you to Japan, but you got to get in shape first. And we started working out. He'll come by every day. We went to Eckerd College, our local college, started working out. And this guy, Larry Mail, who was the training for the Mets in the early 80s, he ran into a big way of training players that were injured and trying to make comebacks, what have you. He was working me out. And once I started getting in shape, started going to AA and A meetings, and feeling good about myself. And I told Ray, I don't think I wanted to go to Japan anymore. He said, good, because I wasn't sending you anyway. So it was great. And I got in shape, got going, and then I started understanding, I miss baseball, but most importantly, let me get my life straight first, and then baseball will be there. And that's what I have to do. And once I got that in order, and then I felt good about myself, and then baseball became more important again. You pitched some truly incredible games for the Mets, but in your seventh start with the Yankees, you throw a no-hitter against a very good Seattle Mariners team. Just a memorable night. Your father was having open heart surgery in Florida the next day that had to be weighing heavy on your mind. When you reflect on that no-hitter, what are the first things you think about? Oh, man, incredible. The first thing I think about was where I was at the time, like, you know, that season before I was suspended, as you just mentioned, not knowing about ever getting to a uniform again in the Mates, and especially being back in New York, because I always wanted to make it right with the fans. And once I got an opportunity, I remember when I talk about that no-hitter, wow, I still get goosebumps just thinking about everything that took place prior to that. Like you said, the first several stars, I remember the first three stars, I started out with three, and I actually got put in a bullpen, basically got benched.  Unfortunately, David Cohen got the aneurysm. That got me back into the rotation, and I think it was my third start back in, third or fourth start back into the rotation. That's when I had the no-hitter for the night. I had the no-hitter. That day, I had permission to fly home to build my father, who was having an open-air surgery the next day. And he had been on dialysis for 15 years, and they figured if he didn't have the surgery, he would make it a week. And if he did have the surgery because of his health conditions, he'd probably make it. So I had permission to fly home, but the day of the no-hitter, I just felt that he would probably want me to pitch. I called Joe Tory, who's a manager at the time, told him I was coming in to pitch. He said, no, go be with your father. Take as much time you need. Come back when you're ready. I said, no, I'll see you tonight. I'm coming in to pitch. And the next call went to my mom, which she didn't take it as well. She said, no, you need to be home. Your family's going to be here. Your dad's expecting you here. You need to be here to support your father. So mom, I had to pitch tonight. She said, no, you should be here. And I ended up hanging up on my mom, which you don't do when my mom was self. So I had to because I was just feeling guilty. And the rest of that day, before I got to the ballpark, just a weird feeling.  And all I can think about, am I making the right decision? Should I go home? My dad's going to be okay. Once I got to the ballpark, I remember talking with Steve Donahue, the assistant trainer, and Mel Solomar at Pitch and Coons. They just wanted to make sure I was okay and I'll write the pitch. I said, yeah, I'm fine. The first three rounds that I'd game, I was standing in a walkway between the clubhouse and the dugout. Sometime tearing up, one of them I made the right decision and not just thinking about my dad's situation. Not into the six innings when I realized I had a no hitter going. I look at a scoreboard. You see no runs, no hits, no errors. And you're like, wow. Now the harder stuff is beating faster. You get a little anxiety. And maybe to put my dad's situation aside and just concentrate the rest of the game. And the rest of the game, you're pitching, you know, going with it. I remember the ninth inning, well, up to nothing. And I walked two guys in the ninth. And Mel Solomar came out to the mound. He said, how are you doing? I said, it doesn't matter. I'm not coming out. Because once you get that close, you just got to go for it. Even though that line of the Seattle had, to me, was a tough amount of baseball, offensively. And the last pitch I threw in the game, the Paul Sorrento with a hanging curveball, basically sitting on my tee. And he popped it up. And I thought the ball was never coming down. Once the cheater made the catch, everything, every type of motion was going through my body. Thinking about the prior year where I was out of baseball. Thinking about if my dad's going to be OK. Thinking about I'm doing this in Yankee Stadium. Thinking about prior to that season. I was in a bullpen, one of them we had released. Or whether I need another start. All these different motions went through my mind. And obviously that night, I didn't get to sleep. The next day I fly home, took a ball from the game. You get to my dad. Got to the hospital. He was on life support. But the doctor said he did get to watch the game. And he never made it home from the hospital in a passing way. But the last game he had to see me pitch was a no-hitter. And that's what made it that much special. Yeah, that's a pretty special memory for you to have, to have pitched a no-hitter and knowing that your dad had the opportunity to see it. And Doc, when I think back to that 1996 team, and you were a big part of this, not only great players, but unbelievable human interest stories, everything going on with that team, when did you know you were part of a special crew in 1996? I think probably halfway through the middle of the season where I think we were on a road trip. Wade was talking about this a while back. We were talking. And we were on a road trip. And I think we went like 2 and 12 or something like that on the West Coast trip. And at that time, we could have full-time and went down. But guys, we had a meeting. Guys basically got together and just talked about what can we do to make it better for each guy. And I think that's when we really came together after that road trip. I think it was 2 and 12 or 2 and 10, something like that. But I think after that road trip, we went on to win maybe like 10 out of 15 or something like that. But at that time, that's when I knew we had a special group. SpringTran, obviously on paper, we looked great. We had a great team on paper. But just at the beginning, just had to come together. There's a lot of new guys.  Jeter, Posada, those guys. Besides those four guys, they're both based from different organizations. But I think it took a lot of time for us to get together. But I think after that road trip, we won like 2 games out of 10 or 12, something like that. That's when it really came together. You mentioned Jeter.  You win the rookie of the year. Jeter was only 21 when he started the season in 96, wins the rookie of the year. Was there something you saw in him, Doc, at a young age that led you to believe this kid's going to succeed in New York? At the time, to be honest, I have to say no. I didn't see anything special. And I remember when we got together, because Tony Fernandez was hurt. And we just basically wanted him to play great defense. That was the only thing we talked about. But I must say the one thing I remembered about Jeter was he came to the ballpark every day. Attitude was the same. You didn't know if he was 0-4, 4-4. You didn't know if he had a game when he hit or not. Kept the same attitude the whole time. And it seemed like he was always in the right place at the right time. He didn't do anything to hurt himself. And the most thing I remember about Jeter when I was there in 96 for a rookie of the year, but when I came back in 2000, he was the same guy that he was that I met in 96. And what I mean by that was same personality. Treat the fans the same. He's always there for you guys, for the media. Treat his teammates the same way. I've played with guys. I've seen guys where they've had success. And then they started changing towards the fans, towards the media, towards teammates. But Jeter was always the same guy all the way through. That's one thing I always admire about him. But in 96 that you asked the question. I didn't see anything spectacular or I didn't see his career turn out the way it did, but what the hell of a career he had.  You're part of the 96 World Series team. You're part of the 2000 World Series team. How blessed do you feel that you were able to end your career in the other borough and have an even glossier career because of what you did with the Yankees? Unbelievable. Very, very, very blessed, as you mentioned, because not only the way it turned out, Winners were both Yankees, I mean both New York teams, but to win it in New York can get the opportunity to redo something I missed in 86. What I mean by it was I'm missing the parade in 86. Obviously, you're on the team that won the Borough Series, but you didn't get to celebrate that with your team and with the State of New York win the parade. Unfortunately, I went through a tough time that day, had a major, major drug problem at the time, and missed the parade, it wasn't the parade on TV, but getting the opportunity to do that again, even though I don't get to do the one over with the Mets, but I had to do two with the Yankees and it felt like that was like a relief for me and to do that in New York and with the New York fans, even though Yankee fans, Mets fans, was still to me as all New York fans that always supported me and been in a situation and had the opportunity to do that. I mean, it was a big, big relief for myself and I was able to move on and let go. Doc, I've talked to David Cohn about you a lot and he has talked about how much he loved having you as a teammate, how he loved watching you pitch. There was actually one time where you came to him for a little advice and he couldn't believe that the great Doc Gooden was asking him for some pitching advice. He said when he thinks about your career, he wants to focus on 194 wins. Sa Young, rookie of the year, the World Series titles, that to talk about the Hall of Fame and what might have been missed, that's not fair because only 1% of Major League players get into the Hall of Fame. What about you when you review your own career? Do you think about all that you did or do you think about some of the things that maybe you could have done that but because of your struggles, you never got to that point? That's a great question and a fair question because when I first came to the league, all I remember when I talked to my father was, I just want to be healthy for a long time. I didn't think about any individual awards. I didn't think about the World Series, none of that stuff to happen. Along the way, I got the win just about every award pitch can win. I got to win three rosters, especially during both New York teams. But I remember after my first two years and then going to season 86, unfortunately, and I'll admit it, I, what happened was much fun because I was trying to match the numbers that I had, match the numbers that I had in 85. It wasn't there. Unfortunately, the fans' expectations, the media expectations and more than anything, my expectations wasn't met because I was trying to match those numbers, which unfortunately, I set the bar so high where those numbers probably will never be matched. And normally, when a player has this career, it's normally like you're five or you're six. Unfortunately, I had mine, you're two or possibly, you're one and two. So I was never able to match that. And I used to beat myself up trying to get there. Even about one of my pitch to shout out. It's like, yeah, pitch to shout out. I gave up six hits and, you know, I didn't have four or five strikeouts. I always find some negative. Unfortunately, when I had my time and I got incarcerated in 2006, I got to relive my whole life.  I never thought about the hall of fame, but once I started talking about it, obviously you think about it. I say, you know, I had a pretty good career. I did way more than I expected, way more than anybody expected when I came into the league. So I have nothing to be ashamed of. If anything, I should be proud of it. And it was a privilege, number one, to even play Major League Baseball and accomplish things I was able to accomplish. But unfortunately, I had to go down to rock bottom to understand that and appreciate that. Today, I don't worry about that.  What could have been, I look at the things of what I actually was able to do. And this is no offense to anybody that's in the hall of fame or anything. And my chef, my nephew brought this up to me, which is something I've never thought about. He goes, there's probably guys in the hall of fame wish they'd have had your career. I'll say probably, but, you know, they're in the hall of fame. He said, yeah, but the career you have there's no way you have the right to say you didn't do the things you want to accomplish about the hall of fame. So I understand that it put these more in perspective. And again, that's what I'm not going to anybody because I always got to serve it. But so now I look at it totally different. I'm very, very blessed and accepted of the career that I did have and got to share it. And meet so many guys that were teammates that were still friends of they like you mentioned, but David Cohen was still one of my best friends in baseball. I think that's a perfect answer, Doc. And it shows the perspective that you have on your career and your life. And I think that's a perfect way to end this. It's been great talking baseball with you and my little bit of advice to your son and your grandkids is listen to you about pitching. You know a few things about pitching. Thank you, Jack. Thanks for having everybody. And it's always good to talk with you. And I appreciate it.


Okay, good afternoon. I'm Lieutenant Robert Rock, ROCK with the Denver Police Traffic Investigations Unit, and we're here today to talk about a collision that occurred last night. At approximately 8.30 p.m., a pedestrian was attempting to cross Park Avenue West at Tremont Place when she was struck by a vehicle that was traveling outbound toward Broadway. After the collision, the vehicle continued to drive away from the scene without stopping. The pedestrian is a 66-year-old female. She was transported from the scene with serious injuries and critical condition. Today she remains in the intensive care unit at Denver Health Medical Center. The suspect vehicle that we are looking for is a 1998 Lincoln Town Car, bearing Colorado license plate number QKI285. That vehicle will have damage to the front-side, passenger-side quarter panel and also to the passenger-side-side-view mirror. Immediately after the collision and determining that we had enough information, we issued a Medina Alert, and that went out statewide. We also issued a Denver Auto Body Alert notifying all of the local auto body companies to be on the lookout for this vehicle. We would just ask that anyone with information either about the collision or about the vehicle or its whereabouts would call Crime Stoppers at 720-913-STOP. There's also a text option that you have if you want to refer over to the Crime Alert bulletin that we've sent out to everyone. At this time, I would like to have Nick, who is a volunteer in policing with the Denver Police Department, display for you the side-view mirror piece that we recovered from the scene so that you can get the exact color of the vehicle that we're looking for. This time I would like to entertain any questions that you might have. Yes ma'am. We are currently looking into that. We have some very good witnesses that saw all of this, verified the license plate number with the piece of the vehicle. We feel very confident that we're zeroing in on the correct vehicle, but we will be looking for all video that will help us understand how the collision occurred. I'm sorry? One of the witnesses at the scene, due to the ongoing investigation, I can't tell you who that was specifically at this time. Was she on the north or south side of the intersection? Yes, it's an angular street so we kind of describe that as the outbound direction when you're traveling toward Colfax. That's inbound. She is on the eastern side of the street crossing to the opposite side. We do not know. She was unable to provide any information to us last night and has not been able to today as well. Multiple blunt force trauma to head and body. Sure, our understanding is that the car had multiple people in it, but beyond that we don't know any more information that we can share with you. We would like to hear from the folks that were in the car. It is not uncommon that people who attempt to hide information about an incident that they know about could potentially get charged. And so we would encourage those passengers in that vehicle to come forward and tell us what they know before it gets more serious for them. They haven't released, but did the witnesses identify whether it might have been a male or female silhouette driving anything? Yeah, at this time, we don't have good information on that. Obviously, it was dark with the reflection off the windows and things like that. It's very difficult to tell one way or the other. Yeah, the tragedy in this situation is, is it doesn't appear that our victim has any family locally and we have not been able to contact any family at this point in time. And so this is one of those situations where it appears that our victim may have been a homeless person. And so we're doing everything we can to contact her friends and family that we can identify. But she's suffering this alone at this point in time. As far as the serious ones, this is only the second one that's risen to the level of the Medina Alert that we've had this year. And as far as additional hit and runs, I don't have the exact number for you at this time, but they continue to happen. Can you describe the Medina Alert? Yes. Sure. So several years ago, a young man by the last name of Medina was struck and killed here in Denver. He was a valet who was parking cars. And we were able to finally resolve that case by catching the suspect who was attempting to flee to Mexico. And that young man's family and Larry Stevenson and some other people within the city began what they what we have termed the Medina Alert. We started it in Denver just as a policy where we will contact all the news media immediately. And it's broadcast on the police radios, the type of vehicle we're looking for and a license plate and any descriptions that we have. Then a couple of years ago, it was introduced as a bill in the state legislature and it was passed into law. And now that allows us to notify the state Colorado Department of Transportation and they will put that information on the variable message boards that are on the highways throughout the state of Colorado. Sure. It went out probably around 11 o'clock. I don't have the exact time, but I was notified of this incident at around 9 30. And it was already in the works to get it published as soon as possible. So it went out, they typically run for about a 24 hour period. And then we can work with the state to extend that if necessary. Obviously, they have traffic situations that they have to broadcast and they may have other emergency things that they have to put on those boards. So we we have to be sensitive to the needs of CDOT as well. Lots of residents out there that said that there was a pedestrian that said it's sometimes difficult to get across that intersection because people going along Park Avenue are usually and they said they do see you guys working radar here. So I know you can't think of every intersection in town. But does that one ring a bell to anybody that there aren't crosswalks in four ways there? And they said you we did observe people going very fast. He's found certainly again, it's what we would describe as a complex intersection. You've got multiple lanes of travel in several directions and all that kind of approach. Our traffic engineers, they do a tremendous job in analyzing each intersection, the distance required to cross it and how much time and installing pedestrian signals and things and you are correct. We do do enforcement activities there. It's just we try to bring all of that together along with our education efforts through grants that we receive from CDOT. So it's it's not an easy problem. That particular intersection we haven't had any significant issues in a while. There were more than two I can tell you that that were right around there and that did observe what occurred. So that's about all I can really say about that. Certainly, we think that anytime we have an incident like this, we would like to see them resolved within a few days. In the past, it's sometimes taken us a week or more to catch up with folks. But timing is crucial. We have officers who are actively looking for this vehicle. And with your help, we will have people all over the state of Colorado that are helping us to find this vehicle. So yeah, the sooner we can locate it and find out what happened, the better. Well, we have a serious bodily injury to someone. We have enough information in the form of a license plate number vehicle description. And those are the required elements for the Medina alert. So anytime there's serious bodily injury or fatality involved, that's when we can authorize a Medina alert. At this point in time, we don't have any estimates of the speed. But as you all know, and I've stood up here and told you before, when you have a car that's two to 3000 pounds, and it's a person even at a slow speed, it can do a lot of damage. Yes, ma'am. Certainly it again, it is a we believe it's a 1998 Lincoln town car. It's going to have four doors. Those cars have pretty long noses on the front end. And this particular color has been described as a metallic blue gray. At night, it certainly would look black or even dark blue. It just kind of depends on how the light hits it. So if if somebody sees a dark vehicle, matching similar description, older model town car, have them give us a call it if it's missing a passenger side mirror, then we're definitely interested in taking a look at it. We had one call this morning that turned out to not be the vehicle involved. Oh, certainly. I mean, we don't have their side of the story. We don't know what it was that they even experienced. We're pretty confident that they knew they hit someone just based upon the damage and the debris that we found at the scene. But coming forward is always the best option. Thanks.


It's day three of exercise dragon crossing. Task Force ABER has left Czech Republic and was received and welcomed in Slovak Republic. While in Slovak, Task Force ABER shared mass, played soccer, and conducted aerial resupply operations with the Slovak Republic ground forces. With each event, the U.S. and Slovak troops demonstrate their shared commitment, promoting a peaceful and stable Europe through shared values, experiences and interests, as well as the Alliance's operational freedom of movement for a strong Europe. Continue to follow this story at hashtag DERGUNE CROSSING.