Hopefully we can hear me, can't we? Sorry, am I not on? I cannot tell, but I can't. Oh, although I'm also disappointed I didn't hear about Dash because I was keen to, but actually it's sort of a nice that these two ties together are sort of interesting because we're exactly coming at the problem from different ends in the sense that we just saw this kind of nice high level, like here's really big, what's going on, things are happening, and I'm exactly coming out from the other direction. This is barely, the data we're going to look at today is not actually big, instead I'm going to look at a small problem as a way to start to just get some practical experience about how to use a particular tool that will scale up to big data. So a lot of these big data talks are kind of giving us this big overview. I'm going to do the reverse, but in return what I'm going to do is I'm going to give you a chance that you can leave here and you can just immediately go out and get online and start doing some analysis using the things I'm going to show you here. This would be directly and immediately applicable, but maybe not quite so exotic and exciting. I also want to take a second and ask your indulgence just to point out I'm really pleased to be able to speak to you here today. And I mean that and it's because, so it was right after Kiwi Picon last year in Dunedin for those of you who were there. Almost immediately after Kiwi Picon I became incredibly dangerously sick. And I was wrapped up, put away the stuff from Picon because I was helping out with a conference and then spent the next month in the hospital and then spent the next two, two and a half months at home recuperating. And so I'm very much not taking it for granted that I'm able, literally able to be here speaking to you today. When I say I'm happy to be here, I'm really happy to be here.  But that's the way it is. So yeah, I'm Tom and I work for One-Away Play, which is a mobile game studio in Dunedin. But I want to start not by talking about my work at Runaway, but thinking back to a job I had previously. So several years ago, I was working in the United States for a large television network working with the delivery of online video. And in a setting like that, and probably a lot of settings where you're working, this is also true, we were collecting a lot of data. We were logging all kinds of stuff. And we all knew, everyone in the team knew that that data contained material that we could use to gather some valuable insight about how our application was performing, about what our users were doing, and that we should be able to look at that data and find some things we could do, concrete things to improve the performance, the usability of our app. But we didn't do that for the most part. And we didn't do it for a reason that we don't do a lot of things in this industry. And it really came down to time. In this case, in particular, it was computing time. We did do some analysis of our log data just to get, basically, we just settled for getting the data we had to have. And just running those reports every day took a couple of hours. When it takes that long to run your reports, you have less time to begin with, but you also just don't have the kind of feedback loop that's going to lead you to experiment and play with your data and try to say, oh, what kind of insights could I derive from it? So now, today, when we play again, we're logging a lot of data. So it's a mobile game studio, but we've got data coming from our API servers. We've got data coming from our mobile application analytics packages. So all kinds of data coming in. And unlike what I was doing before, we're actually starting to go ahead and look at that data and to gain insights from it. And more than that, we actually sort of play around with the data a little bit and say, let's just play what if, and let's see what we can figure out from this data. And there are concrete things we do there to improve it. So for example, right now, we're in the process of internationalizing a lot of our games. And the decision about what language is, which should we be doing next, well, that's coming from looking at our analytics and getting a miss some insight and saying, ah, I think that this language here would be the next one to go after. Things like that. So we're able to do this because we're able to do things quickly and also we're able to do things cheaply because like most organizations, we're very resource constrained. And BigQuery is an example of a tool that lets us do this quickly and cheaply. So what's BigQuery? Yeah, it's a thing from Google. It's part of their, what is it, Google Cloud Platform suite of products. And its strength is that it lets you quickly query large sets of data. That's what it's for. And you query it just using SQL, which a lot of us are already familiar to. So when I say that you'll be able to leave here and immediately go to work, you know, analyze some data, I mean, for a lot of us that's definitely true because you can already write the SQL you need to do the queries. From those two things, you might say, well, then it's just a big DBMS. And while strictly speaking, that's probably true, but that's not really ideally how you would use it. You could, but don't. If that's what you need is a DBMS, use a proper DBMS. The workflow in BigQuery is more likely that you're going to generate your data somewhere else on some other platform, and then import your data in batches into BigQuery, run your queries and whatnot, and gain your insight that way. There's about three ways that you can get it. I mean, it's got a web console, and we'll see there's a couple of things you have to do in the web console. It's got, there are some CLI tools that Google distributes, and those tools are written in Python, interestingly enough. So a lot of the basic day-to-day maintenance stuff you can do with CLI. More importantly, for our talk, is that it's got a remote API, and you can get that remote API using libraries available in pretty much all the common languages people are using today, including Python. Now, Google says that their Python libraries are currently in beta state, but I find in practice they're totally stable and ready to use. They've played with them in both Python 2 and 3. Everything seems good. And again, because Google is using Python for their own stuff, so it's not surprising that those libraries are in a good state. BigQuery, of course, also integrates a lot of other tools. That's how I came to it, because my mobile analytics packages that we're running on the games, Google Firebase tools, so surprisingly, the data from my mobile analytics package imports directly into BigQuery for me to analyze it. And it plays well also with other things, and it also plays with other things on the way out. But for that matter, again, importantly for us, it plays well with Python, so that means you can run your analysis in BigQuery and then perhaps use nice Python data visualization tools or things like that. And we can all enjoy it. Let's see. So here's the thing. It was earlier this year, in fact, it was not that long before the RFP for Python came out, that I started messing around with BigQuery because, again, I started using an analytics package that made it worth my time to figure it out. If I'm going to figure out some new technology, I completely fail at learning things in the abstract. I just like to have a problem to solve, and then I work through how to use the tools to solve the problem, and that way I learn about the tool. And so that's what we're going to do in this talk. We're just going to work through a problem, a nice, modest problem that we can all make some sense out of and hopefully have a little bit of fun with. So our plan, we're going to create something called a project, and we'll see right away what that is. And within our project, we'll set up our data set and tables. And we'll go ahead and prepare our data and load that data into BigQuery, and then we can run some queries, see how that works, and then we'll beat ID, click Kiwis, and clean up afterward. And that also relates to, in some ways, BigQuery is a tool that you have to pay for, but there's a few little tricks that we'll learn here that help us keep the cost under control. So first, what's the problem? Sometime in the last year or so, I had on the city of Twitter ratios, a lot of us in various industries are looking at social media. And social media, our American people talk about engagement, but you can't tell it was engagement good or a bad thing. And somewhere this idea of Twitter ratio has emerged. If you're interested in a little bit more about it, the linked article there in Esquire describes it in a little more detail. But here's the basic idea. So here's a tweet that I put out there, and we can see that I have one reply and I have one retweet. So if we look at the ratio of reply, there were retweets. The Twitter ratio for this tweet is one. And in general, that would be a pretty good Twitter ratio. We're OK with that. We're OK with that because the assumption behind this is that a retweet generally is going to correspond to agreement or some sort of positive reaction to my tweet where a reply is more likely to correlate to disagreement or some other negative reaction to my tweets. Maybe somebody wasn't too excited about PyCon last year and replied to it. Maybe they did. Maybe they didn't. Whether that assumption is valid or not, let's look at the data and see what we can figure out. But that's what we're looking at. We're going to be looking at replies over retweets. It's a problem here. My own Twitter timeline is what we might call boring. And so in particular, I wanted to have to go back to 9th of September of 2016 because I don't have that many tweets on my timeline to have replies and retweets so I can get a non-degenerate Twitter ratio. So we're not going to get a lot of insight from looking at my Twitter timeline. I mean that in more ways than one. I need a better collection. So what do I want? I want a collection of tweets and there's a few things.  I'd like it if those were tweets that had a large audience. So then a lot of people had a chance to respond to them. A lot of people had a chance to reply or to retweet so that we can actually look at some sensible Twitter ratios. And related to that, that means that I would really like it if those tweets were likely to elicit a strong response from the people who saw them. So that way, we'd get some reaction. And again, maybe this exploration of the Twitter ratio in our case might be more meaningful. So I've got to suss out a source of tweets that's going to satisfy that property. OK, problem solved. Not hard at all. So what I did was I harvested data on a collection of Donald Trump's tweets. I collected about, actually I think it's 31047 tweets that he excreted between March 2009, when he opened his account, December of 2017, when I finished putting together the set. And in particular, so for each tweet, I just collected, of course, the ID, Twitter's ID for a timestamp so we can see when it happened. The text of the tweet, the number of replies and retweets, because obviously I need to calculate the ratio. Yeah, I didn't worry about tweets. So I excluded some tweets because they didn't have text, just because I was too lazy to make a more flexible scheme. It's just an example here, after all. OK, so we've got our data. So let's get to work on figuring out the problem. So the first step, well, OK, we just have to set up a project. This is just a Google Cloud computing project. Nothing exciting going on here. But just so you know what you need to do. And for whatever reason, Google doesn't make it super easy to figure out, oh, I want to do BigQuery. Where do I start? So here's where you start. You go to console.cloud.google.com. You'll have to log in with a Google account in order to get this thing. There's a little project menu, and you set up a new project. The project is just a big container for a bunch of cloud platform resources. In particular, it lets us deal with BigQuery inside it. You're going to have to enable billing for it, because this is a service for a fee. However, there's a pretty generous cap. So for example, all the preparation I did for this talk, I never incurred any fee. And for the stuff that I actually do at work, I've yet to incur a fee larger than $10 a month for the things that I'm working on. So you can play with this quite a bit without worrying too about it too much. Another important thing we've got to do at the Google console here is we're going to set up our service account. So I'm just going to go over to the user management section, create a new service account. I'm going to give it the privileges that it needs. So over there, I made it a BigQuery admin, which is a little bit overkill, but it's a small project zone. So that I can get a set of credentials that I'm going to download in JSON format. And we're going to see in just a minute how I'll keep using that to connect my client to BigQuery. Once that's done, I don't need to go to the web console anymore. And I've been against the web console, but from here on out we can do everything we want to do in Python. So the first thing I'm going to need to do is I just need to connect to BigQuery. So how am I going to do that? OK, I need the Google Cloud library, so I just have to pip install Google Cloud BigQuery. And I'm able to do that. Go ahead and set up a BigQuery client. And I just give it the file name from that JSON file that I downloaded on the last slide. And so now I've got a client that's connected and is able to interact with the remote BigQuery API. The first thing I'm going to do is set up a data set. A data set is just because they didn't want to reuse the word database, but it's a database. It's a collection of tables and other resources. There's some metadata you can throw on it and things like that. Basically, it's just a place to keep your tables. You have to do this little kind of two step that we see here where I create a data set reference, and I give it a name, and then from the reference I create this data set object.  And that's where I'm actually making the remote API call. Anything where you have the client dot something. That's where the remote API call is happening. And now I've got the data set up on the Google Cloud platform. The whole point of this is just so that I can set up a table. All right, now I'm going to set up the table, and there's actually, well, I'm hinting that there's more than one way to do it. But what are we going to do? Again, that same kind of pattern. I set up a reference. I create a table, and I can specify my schema. And we've got about the same kind of column types that you'd have on other relational databases, not quite so many, not quite as much variety. More just some plain vanilla data types. So I can specify what my schema is, and then tell my client, go and create the table. Now the next thing I need to do is I need to load some data into that table. I can load in a number of formats, but we're going to go ahead and use JSON. And so here's just a quick sample of some of the JSON that I collected. So again, I've got one JSON object for each tweet. They're actually separated by new lines. And they've got the fields that correspond to the columns that we set up before. You need to go into a little bit of effort here to make sure that BigQuery can correctly parse things and get the right data types. The one place where I find it's particularly finicky is in any kind of date time fields. Get your time stamp correctly formatted. Otherwise, BigQuery is going to insist that's a string. So there's what the data looks like. Thing is, that data is actually pretty self-describing. So in practice, I don't generally bother specifying a table schema. But instead, what I'm just going to do is set up the table, give it the same name. And again, here's a pattern here we're going to see a few times. I need to create a job config.  And that's just a way that I can specify options on the job. So the option I'm going to specify is that I'm going to say that my data is new line to limited JSON. And so far, this is the same as if I'd done what I did on the previous slide. But this next bit, that auto-detect is saying, I didn't bother to specify a schema. You're just going to auto-detect the schema from the structure of my JSON data. And in practice, I find that works fine. If I had specified the schema, if I had done it the way we did on the previous slide, just don't set an auto detector and load up your data. OK, so I've got a job config. I'm going to open my data set, my JSON file, in binary mode there. And then I'm going to call this load table from file option, give it the file handle, tell it what table I want to go in, put in my job config options. And it's going to load that data up. And of course, this is going to take a while, depending on the size of your data. The job actually is going to execute asynchronously. So I can go on and do some other things. I'm not particularly fast. I'll just let it go. Of course, things can go wrong if you have to learn as I did the hard way that you've got to get your timestamps right. So you might have to check the results of your job to make sure that things loaded correctly. Now that we've done the work to be sure that we can, I don't see any point in pausing to reflect on whether or not we should, let's just go actually go ahead and look at some tweets. So the first obvious question to ask is, well, let's just go find the tweet with the worst Twitter ratio. No big trick there. Set up my client, set up an SQL query string. And this is just SQL. The only little thing to know is I've just highlighted how I specify the table. Because that's slightly different than you see in some other contexts, including even in some other big query contexts. With the Python library, the table names enclosed in back ticks, and it's projectname.datasetname.tablename.  And I'm going to get back a query job object. So again, remember, all these API calls are actually happening asynchronously. And although big query is fast, it's not instantaneous. So I'm not going to get the results back right away. I'm going to get back to this job object. And so the reason why I'm bothering to print the job state there is just to demonstrate that while I'm waiting on the results, I can query the job state. I expect that when we're running this thing, the job state should come back and say it's running. Because I've just fired off the job, I print the state, the job's running, and I'm waiting on the results to come back. So I might not want to. So I'm going to collect the results with that query job result. But that's going to block if the job isn't done yet. So if I don't want to block, I need to handle that somewhere in my code. In this particular example, I didn't have anything better to do with my time. So I'll go ahead and wait on the result to come back. I'm going to get an iterator. So I can iterate over the rows of results. But my query is going to return exactly one row, one result. So I'll just immediately turn it into a list. And then result, the first and only item on the list, is the result. It's the tweet with the worst Twitter ratio of everything in the timeline. I'm sure you're all excited to see that. No, don't laugh yet. There's an issue. It turns out about 20 minutes before Danny came to me yesterday and said, hey, Tom, could you do your talk early? I noticed that the tweet was wrong. It didn't match. There's no way it was right. Because it turns out there's a bug somewhere in how I collected the data. And so I've got some tweets where it's underreporting the number of retweets. So we were going to have a funny moment here. It was going to be special. And it didn't happen. I'm not going to bother to show you the tweet yet. But it's OK, because I'm just going to make you wait a little bit longer. Because we're going to do some more queries. And we'll actually let us get around this problem. So sorry, but bear with me. There is an issue, however, if you were paying attention. And say, wait a minute, replies over retweets. Well, what happens when the number of retweets is 0? We can't divide by 0. That's clearly going to be a problem, Tom. And I definitely have not addressed it. Yeah, in fact, I have. It has never tweeted something that somebody hasn't retweeted. So I just didn't have to worry about that case in this which was my data. OK. Another issue, though, if we just stop and think about this for a minute. And this was the insight that we were going to derive from the tweet that I didn't show you. But we can still figure this thing out. If this Twitter ratio thing really works, you really need to have a decent number of replies and retweets to kind of smooth out the data. Because clearly not every reply is going to be disagreement and things like that.  Probably wasn't. So really, when we look at our data, find some threshold value and say, let's only consider tweets that have a certain number of replies and retweets. But what's the right threshold for that data? And this is a nice bit of the story is to say, when you've got tools to let you do this kind of quickly, you'll just experiment and try things out. And that's exactly what we'll do. And while we're at it, we can just see how to use a name parameter. So let's go try to figure out what the good threshold value is. As an aside, finding that threshold value is going to get around the problem of my data set. Because once we set the right threshold, it excludes my problematic tweets. So first thing I'm going to do is just set the query string. And I want to try different threshold values in there. So I just preface it with an at symbol. And now I populate that later on when I run the query. To populate that, I've got to do a bit more work. So I've got a list of candidate threshold values here, between 5 and 1,000. And let's try and figure out how high do we have to go before it works. So for each one of those values, I'll loop through. I'll create this scalar query parameter. I'll name it threshold, and I'll set its value. Then I'll set up a job config. This time it's a query job config, because I'm going to use it to pass options to a query job. And in particular, I'm going to give it a list of parameters. In my case, it's a list with one parameter that it can use to populate the query string. And then I'm going to go ahead and fire off my query using the client.query call. And here, again, I'll exploit the asynchronous nature. Those calls aren't going to come back for a while anyway.  Stuff the job object in a list. And then after I fired off all the jobs, then I'll go back through the list and accumulate the results. In that way, get my results back a little bit faster. So I ran this, and I found that if you get around 500 worked out to be a good threshold value, we could start to draw some interesting conclusions with that threshold value at 500, at least 500 replies and 500 retweets. It smooths out the issue that I had earlier. So now, I'm pretty sure, this is the slide I expect, I can show you the Trump tweet that we can say has the worst Twitter ratio. No, the problem. So yeah, this has a poor Twitter ratio. I don't know if I mentioned it earlier, but what's considered a poor Twitter ratio? Generally, if it's greater than two, we'd think it's a bad ratio. So 9.4,000 replies, 1,000 retweets. This has a bad Twitter ratio, but it doesn't really seem to satisfy our hypothesis. Because after all these inviting replies, I am not going to go through all those tweets to see if they are disagreement or if they are just sensible replies. But they probably are. So actually, the first insight we've got is that clearly this Twitter ratio thing doesn't always work. But of course, that wasn't too surprising. And you're feeling disappointed, don't be, because if you look at the next highest Twitter ratio, now Trump's going to Trump for us.  And we've got a poor Twitter ratio. So oh, it seems to work. So yeah, what's the insight we have? Yeah, Twitter ratios clearly don't always hold up, but they do seem to hold up sometime. If we went through Trump's Twitter timeline and looked at the high-ratio tweets, there's some gems in there. Gems. But anyway, we're just sort of cherry picking. Or we seem to be just cherry picking the worst tweets. What do we really look at these things in aggregate and answer some questions about that? So we can do that. Like what if we just go, what's his average Twitter ratio across all the tweets? Across all the tweets that over my threshold, because that's important. So we'll go ahead and do that. This is an example of something where I could have, on a less speedy platform, I might have calculated some intermediate results and saved them to make things like this faster, but there's no need to do that here. I'll go ahead and calculate the average, get my result back, and then again, because average is a column in my result set coming back. Ultimately, when I want to get that value, I can just say result.average, and there's the result. So it turns out his average ratio is somewhere around 0.56. Is that good or bad? Well, actually, I can't tell you, because I haven't analyzed anybody else's Twitter timelines to see. I don't know what Obama's Twitter ratio average is. But it does lead me to a question. I like, is that good or bad? Well, think about this thing. We've been looking at, he's been tweeting since 2009, while he's the same person, but we don't think the same thing of him over that time. So it might be interesting to just look at his own history year by year, and see if we can find out something from that. Now, I'm not going to bother to show you the code for figuring out year by year, because it's actually very similar to the code you've already seen, but all the codes on GitHub, so you can go play with the code. But in particular, to say, let's look at his average Twitter ratio year by year. Now, in 2009 and 2010, he didn't have any tweets that got over that threshold value of 500 replies or 500 retweets. So I don't have an average for that. Any kind of bounces around in this range, 0.4 to 0.6, somewhere in there, doing OK. And then 2017, the ratio blows up. So clearly, what's happened is some bizarre and inexplicable thing happened. Somewhere right here around maybe end of 2016, beginning of 2016. I'm not being ironic. A bizarre and inexplicable thing happened right about there that causes Twitter ratio to shoot up. So that's kind of interesting. But another question that occurs to me when I look at this, I say, well, OK, but we think of a bad Twitter ratio as a ratio more than two. So how often does he get a tweet with a bad ratio? It's kind of if we break that down year by year, the pattern seems to hold up. He's having a very good year, if you think of it that way. Again, some things happened right in here that we might want to explore further, or we might not. However, it's also important that when we're only looking at tweets that have at least, what, 500 replies, 500 retweets. There's only 6,380 of them. So only 2% of the total tweets that we looked at in this case have this high Twitter ratio. I don't really know what we can conclude based on that. I'm not too excited to find out. But it does actually kind of hold up anecdotally, what do people say? Which is that mostly he cruise along on Twitter, has a good time, doesn't cause any trouble. And it's just that small percentage or ratio that are the ones that really seem to cause some trouble. So OK, we've played around with our data a little bit. And I want to emphasize that we played around with the data a little bit. I like it because, again, I've got a platform where I can just quickly get my results, get my feedback, see what's next. Nothing particularly hard about this, no rocket science, no rockets, not particularly any science. We can do it. A couple other little find points here. One, now notice how I kept doing these year by year calculations here. Now, I still have a small data set, so it's not a big deal. But on the subject of cost control, big query builds you for your queries based on how many bytes do you have to scan to answer your query. So you'd like to structure your data and your queries in such a way to minimize the number of bytes. So if I'm going to do a lot of year by year things, I should break down the data into a table for each year so then I can just scan one year at a time in each particular query. So every query that I did to produce each year result there, I scanned the whole table. If I'd broken it down into a table for each year, then each query would have scanned a smaller fraction and could have racked up less. But, again, I was working with a small enough data set that I wasn't concerned about that. So first cost control measure says if you're going to access your data in chunks like that, then split up your data into chunks like that, into tables. Or there's actually a way you can take a table and partition it to sort of create these virtual boundaries between your data so that you only scan a particular partition. Another thing about cost control says now I'm done with the data. So the other way that I'll rack up charges is if I store the data on BigQuery. Now in this case, that's easy. Because I've already got the data in a JSON file locally, so I don't need to keep it on BigQuery. So I'm just going to delete the whole data set. If I ever want to redo the queries, I can just go back to the beginning and start again. And which is just create the data set in reverse. So you just take the create data set step and then copy and paste delete instead of create. And you delete the data set. Now the data is off BigQuery and I'm not racking up any storage charges. And that's fine because I've already got to copy the data, but what if I don't? Couple scenarios that could happen. One is, I mean, all I did was read that data and analyze it, but I could have done operations that created and saved new data in some tables. And what if I want that data? Or what if, in the case that I have where I'm exporting data from one tool into BigQuery, and then I'm done with it on BigQuery, but I don't have my own copy of the data and I'd like to get it back out. How am I going to do that? I've got a couple options here. I can go back to the web console and just pick the tables and download them as JSON files again. And that's fine, but if you have a lot of tables, that's going to get annoying really, really fast. So I'd like to not do that. But there's not an easy way to download my tables directly from BigQuery otherwise. However, there is a way out. There's such a thing called an extract job where you extract your table as a JSON or other formatted file into Google Cloud Storage. Now that doesn't solve your problem because now you pay for it in Google Cloud Storage, not in BigQuery, except in Google Cloud Storage, it's trivial to write a Python to just download all those files over HTTP. In particular, it would be actually quite easy to write an all-purpose Python program that exports all your tables to Google Cloud Storage and then downloads all those files from Google Cloud Storage and then deletes all the stuff that you got up there so that you're not storing anything. It takes care of that nice and easily for it. Well, OK. So hopefully, we've had a little bit of fun here. And we've given you something where you can actually go out, like I say, and put this to work. Because I'm sure that most of you, like me, are sitting in some situation where you actually are sitting on some data that needs to be analyzed. And what you just need is a tool to make it easy and accessible to do so. And this one seems to satisfy that. The data set and all the code, including some of the code that I told you I didn't show you, is all on GitHub. So you can go have a look at that. I'd like to fix the problem of the data set. So when I do, I'll post a second set with the fix on there in case you want to get that, both as a matter of principle, but also because I'm sure there's one or two more good conference talks that could come out of that batch of data, whether I gave it or somebody else does. The data's there. All right, thanks. I don't know if we have time for questions, but there's tea afterwards. So we have time that way. So we have time for some questions, if anyone has any. In your examples, you were manually writing the SQL queries. Do you know if the client also has a more pythonic ORM type interface? It does not. If you think about it, the kind of queries that you're going to, the ORM interfaces generally handle all your routine cases, but when you want to write some detailed query, when I'm using the ORM library, at some point I have to drop to SQL. And that's the typical use case there. There's nothing stopping any of us from adapting one. It definitely could be done. But I don't think there's a lot of use for it. When you were looking at the year by year data, you said you had to run the query multiple times once for each year. Is that because there is no group by equivalent? Yeah, I could have done something like that. But again, there's an object lesson there, which is I didn't go out of my way to optimize SQL because I'm going to get my results back quickly anyway. So in fact, I said I'm going to, and I think this is actually a pretty realistic development trade-off in a lot of settings. I said I could spend time writing a smarter piece of code, but in the end it's going to be a net time loss for me. Pretty much, if you can do an SQL, you can do it. If you were going to normalize your data, say by a number of followers or flux in followers through time, where in your workflow there would you incorporate that? I'm going to punt and say I'm not sure where in the workflow I would incorporate that because I'm not sure if that's something that I would use when I was constructing my data set before I loaded it up. Or whether I could, I just, yeah, I'm just going to punt and say I really don't know. I'll have to play with that more. You know, I didn't hear you very well, and so maybe we can repeat that. If you can compare this tool with other alternatives that we already have in terms of performance, like how long it takes you to perform the SQL against another tool that we already have, things like Hadoop and Hive and a lot of no SQL setup that we have already. Yeah, I mean, certainly we could do that kind of thing. I think A, to do that meaningfully, I need a much larger set of data to do that kind of thing. And moreover, in my particular case, I'm not that motivated to because I have other reasons why I'm using BigQuery, which in particular is integration with the other tools that I'm using. So that sounds like a perfectly worthwhile analysis to do, but I haven't done it.


Good morning, everyone, and thanks for joining us for the 16th meeting of the Ukraine Defense Contact Group. It's great to see everyone this morning. Let me say just a few words first about the terrible tragedy that Israel is now enduring. The full horror of the attacks by Hamas continues to become more clear and more appalling. The United States stands firmly with Israel as it defends itself and its citizens from this vile Hamas terrorist assault. We will stay in close contact with our Israeli partners and ensure that they have what they need to protect their country. As President Biden has made clear, no other party hostile to Israel should try to exploit these despicable attacks. Like any other country, Israel has a bedrock right to defend itself from terrorism and aggression. And our support for Israel's security will remain ironclad, especially in this hour of atrocity and challenge. Now, let me turn to today's agenda. By gathering this Contact Group again, we remind the world of our shared commitment to support Ukraine today and for the long haul. Let me start by thanking President Zelensky for joining us today. Mr. President, it's an honor to have you here. And you can see firsthand the scope and the determination of the coalition that has done so much to help Ukraine's fight for freedom. Let me also thank Minister Umarov and the rest of the Ukrainian delegation for joining us today. I'm delighted to be here with our new Chairman of the Joint Chiefs of Staff, General C.Q. Brown. Welcome to your first Ukraine Defense Contact Group, General. It's great to have you here with us. Now this coalition continues to make history with our unity and our steadfast support for Ukraine. So make no mistake, the United States will stand with Ukraine for as long as it takes. And today I look forward to working together to do even more to get Ukraine's brave defenders what they need at this crucial moment. We're here to deliver what it takes for as long as it takes so that Ukraine can live in freedom. So today we'll discuss Ukraine's immediate requirements as it fights back against Russia's flagrant aggression. And we'll hear from Minister Umarov and his team who will update us on Ukraine's current counteroffensive. Ukraine is making steady progress forward and it continues to liberate key terrain from the dug-in Russian invaders. This is a hard, dangerous fight and we salute the incredibly brave Ukrainians risking their lives to drive back Putin's army of aggression. In the current battle, only underscores the importance of the life-saving security assistance from everyone here that has kept Ukraine in the fight. So as winter approaches, our task in this contact group is to fold. We must continue to rush Ukraine what it needs to meet its current challenges, even as we continue to develop Ukraine's combat capabilities to ward off future dangers. So we're here to dig deep to meet Ukraine's most urgent needs, especially for air defense and ammunition. I look forward to hearing about the new support packages that many countries here are preparing. And I'm proud that the United States will announce its latest security assistance package for Ukraine, valued at $200 million. It includes AIM-9 munitions for a new air defense system that we will soon deliver to Ukraine, as well as artillery and rocket ammunition, precision aerial munitions, anti-tank weapons and equipment to counter Russian drones. That puts America's total commitment at some $43.9 billion since the start of Putin's war. And I'm proud that this coalition of some 50 nations of goodwill from around the world has rallied to commit more than $33 billion in security assistance to Ukraine. In fact, more than a dozen of our allies have committed more to Ukraine than the United States as a percentage of their GDP. Now, we're also here to discuss how to balance our immediate support to defend Ukraine with our longer-term assistance. The next step forward in our long-term vision will be working with our fellow contact group members to organize what we're calling capability coalitions. These coalitions will be responsible for coordinating contributions from coalition members for each major capability area. We've already organized highly effective coalitions focused on Leopard tanks and F-16 training, which have marshaled resources from multiple countries. But now we're taking this concept a bit further. We're asking countries to organize coalitions focused on wider capabilities beyond just specific platforms. Just as this contact group surges capabilities to support Ukraine's immediate needs, we will also organize ourselves to coordinate our investments in Ukraine's future force. Now we all know better than to underestimate the degree of Putin's malice and frustration. And we saw that again last week with the horrifying Russian missile strike in the Kharkiv region that killed dozens of Ukrainian citizens. We should be ready for the Kremlin to again bombard Ukraine this winter with cruise missiles and drones. We should expect Putin's forces to cruelly and deliberately put Ukraine's cities, civilians, and critical infrastructure in their gun sites. And by turning civilians into targets, Putin hopes to break the spirit of the Ukrainian people and plunge them into bitter cold and darkness. But he will fail. And we all know it. Putin hoped to demoralize the Ukrainian people. Instead, he demoralized the Russian military. Putin hoped to isolate Ukraine. Instead, he isolated Russia. And Putin hoped to fool the whole world. Instead, he couldn't even fool his own mercenaries. So this war of aggression, in this war of aggression, nobody should assume that time is on the Kremlin's side. We stand together today determined to ensure that Ukraine has the support that it needs for another winter of war. Unity will remain for the beating – will remain the beating heart of this coalition. The Kremlin never predicted our strength in our unity of purpose. And the Kremlin certainly did not bargain on our continued resolve nearly 20 months into Russia's needless and reckless war of choice. So I'm inspired again, looking at all the countries around this table, even while Putin has left pleading for support from Iran and North Korea. We stand together. Putin stands alone. And everyone here understands the stakes and why Ukraine's fight to defend itself matters. Ukraine matters because Putin's war of choice is a vast and urgent threat to security in Europe. Ukraine matters because Russian aggression clearly challenges our NATO allies.  Ukraine matters because Russian attacks on Ukrainian grain are deliberately inflicting hunger and suffering on innocent people around the world. And Ukraine matters because if great powers can invade their peaceful and democratic neighbors with impunity, it will claw away the rules-based order that has made the world so much safer since the end of World War II. That is what has brought us together again. As I've said before, I continue to firmly believe that our support for the forces of freedom in Ukraine will hold fast in any season or any storm. So thanks again for being here. And now, for the first time in person at the Ukraine Defense Contact Group, let me give the floor to President Zelensky. Mr. President, welcome again. We're delighted to have you here. Thank you so much. Thank you so much, Mr. Minister Olsen. Thank you for your support and leadership. It indeed feels like a true warrior is leading the Ramstein team. Thank you so much. Dear ministers, dear generals, I'm grateful to each of you for your tireless work and for the strong joint decisions you have made for us, for all our people. Thank you so much. Come around. This is the first time you are participating in a Ramstein meeting. And I think it is very symbolic, given your military background, that a combat pilot and an F-16 pilot. And I'm sure that together we will do many good things to defend freedom. Yes, Mr. Secretary General, and I thank you for your faith in Ukraine, for your confidence that Ukraine will be among the allies in NATO. Ladies and gentlemen, next Monday we'll mark the 600th day of our resistance to Russia's full-scale aggression against our people, against Ukraine. And today no one can say for sure how many more days we will have to defend our independence and to defend our identity. But we can already say several things which are, I think, important. First, Putin will not achieve Ukraine. Second, Russia cannot afford a new arms race. And so democracy can win this battle. And it is necessary not only for our country but for every nation, for the whole world. Our time is not the time for the slavery of nations. You all know that Moscow's ambitions have never been limited to Ukraine, and we all want these ambitions to be defeated in Ukraine as soon as possible. And this is the best opportunity so that we don't have to look for shells and supply tanks to other countries in Europe, Asia, Africa, that the Russian dictator may try to turn into ruins or seize into his crazy empire or zone of influence. And I know that NATO is ready and capable of protecting its members from external aggression. And may we never have to experience this in reality. And I know what steps can protect Europe and the world from the spread of Russian aggression. And I know what is needed to speed up the just end of this war. Let me emphasize a just end, full protection of our sovereignty, full restoration of our territorial integrity, full guarantee of Ukraine's security after this aggression. And we are now in a special situation on the front line, you know, and in a situation where it is important to prove pressure. And without any pauses, it's very important. Without any pauses, you will understand the principles of effective defense. And it is the defense that does not leave the enemy a chance to rest, recover, choose any other tactics. Russia has lost the initiative for today, and we are putting pressure on it. We are. It is Ukrainian courage and your support that determine what is happening on the battlefield and most importantly, most importantly, what will happen on the battlefield. And although the occupiers are still trying to storm our positions, although our defense and counter-offensive actions are very difficult, it is still Ukraine. It is our soldiers who determine the course of events. And Russia cannot handle this war on its own. You can see it. It needs a run. Russia cannot succeed without the Shahids and other help. It needs North Korea, just imagine. For the first time in its history, Moscow has gone to Pyongyang to bow down. And the Russian, flexibly, is escaping our naval drones and missiles, traditional buyers of Russian weapons, see how superior the weapons made by the free world and used by Ukraine as are. Russia is slowly, but surely withdrawing from various points of geopolitical fractures in the world because it lacks its own threats. But at the same time, at the same time, it still has enough resources to incite conflicts and turn them into full-scale tragedies. And this is happening in the Sahel, and it can happen even more painfully in Israel and in the Middle East as a whole. We must not allow this to happen. We can prevent it, and we have to put even more pressure so that the aggressor weakens faster and does not have time to adapt to our pressure. And we need to make sure that Russia is heading for defeat and does not even attempt to claim anything else. One of the most vital battles here is the one against the Kremlin's key tool, its greatest perverted pride, the pride of the terrorists. And last winter, Russia wanted to turn it into a weapon against us by destroying all of our power plants and supply network, and I'm grateful to all of you, every country, every leader who helped us with air defense and energy equipment. It's really what a life saver for us, for all of us, for our people, our children. And obviously, this winter, Russia will try to repeat those tactics. But with certain conclusions and greater terrorist efforts, please know that even during that attack on Israel, terrorists target one of the largest power plants in the region. And until last winter, when Russia relied on these tactics, other terrorists had not done so in such attacks. And of course, our task now is to get through this difficult time through this winter. But in fact, the real power of this task is fulfilled is much greater than just getting through the winter. Air defense is a significant part of the answer to the question of when this war will end. And whether it will end justly for Ukraine. And I'm confident that it can be so, it will be so. Everyone can see what the protection of the sky gives. It is guaranteed that there will be normal life in the cities. There will be an economy. There will be people. A long-range air defense can also ensure the functioning of our corridors in the Black Sea and the Danube region. Air defense will ensure that Russian jets will not be able to approach our Ukrainian borders. And therefore, it will solve the issue of Russian guided bombs. And we all need this kind of push now, a step forward in our defense, air defense. For Ukraine, this will be a victory of life. And this is vital for Russia. It will be a failure of its key strategy, the strategy of terror. What will it have left by this? And we need to protect people. We need the opportunity to live and accumulate economic activity. And we need normal exports, grain is the key to global food security, Ukraine and grain. And then there is metallurgy also and other goods of our exports. It is economic basis of life. We need children to be able to study at schools, not only online, and we need people to live not only from one air alarm to another, but based on their plans for these weeks, better months. When this happens, the majority of our people who have found temporary refuge abroad will start to come back. Millions of Ukrainians, I'm sure, the stronger we are socially and economically, the more powerful we will be in the military sense. We will be able to ensure the work of a greater number and capacity of defense industries in Ukraine. We will be able to depend much less on the assistance of our partners. And we will be able to provide more support to the front line. Dear friends, we must win the Winter Battle against Terror, and we can win it. And along with it, we can win the battle for how and whose terms this war will end. Ukraine can survive, and it will. It will survive. However, it is important to take the weapons out of the hands of the enemy. What is Russia's strengths? Let's be honest, only the fact that they can't destroy lives. Russia is not capable of doing anything else. Is it a security donor? Really? No. A supporter of development? No. A political poll? No. A source of economical growth? No. A terrorist? Yes. Yes. That is the only thing. And that threatens Ukraine and many other nations. We need to get this instrument out of Russia's hands, the instrument of terror. And the answer is air defense and other types of weapons, the list of which we'll discuss in my team, of course, we'll share with you. And above all, please remember that these will not only help to bring a just end to the war for us, but also keep the war away from you, from your borders and borders of your allies from the Alliance. Missiles and drones will not fall in Romania and Poland or elsewhere if they cannot overcome the protection of the Ukrainian sky. Terrorists like Putin or like Hamas seek to hold free and democratic nations as hostages. And they want power over those who seek freedom. The terrorists will not change. They just must lose. And that means we must win. We do. It requires patience. It requires steady and continuous support. We need to take the right steps, steps that save lives of the people for real, vital steps and strengthen their defense significantly. Air defense is a must, and I'm sure you heard me. Thank you for your invitation. Thank you very much for your attention and for your common, big support during all these days, weeks, months of full-scale war. Thank you and your nations. Slavo Green. My name is Mara Karlin. I'm the Acting Deputy Undersecretary of Defense for Policy, and I will be the facilitator for today's Ukraine Defense Contact Group. I would like to now turn to NATO Secretary-General Stoltenberg. Thank you. Mr. Umerov and General Brown, distinguished colleagues, it's a great honor to welcome you all to the NATO Headquarters. Secretary Austin, De Lloyd, thank you for your leadership. You have been instrumental since day one in garnering international support to Ukraine's war effort. President Zelensky, your leadership, the heroism of the Ukrainian Armed Forces and the resolve of the Ukrainian people have impressed us all. When President Putin launched his full-scale invasion of Ukraine last year, he thought Kiev would fall within days and Ukraine within weeks. He was wrong. The Ukrainian Armed Forces have exceeded expectations again and again. You have taken back 50 percent of the territory seized by Russia since February last year. You have inflicted a high cost on the Russian forces. Russia is degraded militarily, weaker economically, and more isolated politically. But there is no sign that Putin has given up on his ambitions. On the contrary, Russia has increased attack on critical infrastructure and is preparing again to use winter as a weapon of war. So we must continue to step up and sustain the steady flow of weapons and ammunition to Ukraine. The stronger Ukraine is on the battlefield, the stronger they will be at the negotiating table, and the sooner this war will end. We need to put in place a long-term framework that will ensure history does not repeat itself. Therefore, all Allies agree that Ukraine will become a member of NATO. At our villainous summit in July, Allies removed the requirement for a membership action plan. We introduced a program to make Ukraine's Armed Forces fully interoperable with your future Allies. We established the NATO-Ukraine Council, where Allies and Ukraine sit as equals. So there, Blodomyr, again, it is a pleasure to welcome you to NATO.  We will stand with Ukraine for as long as it takes. Thank you. Thank you, Secretary Stoltenberg. We will now pause as the press departs. Thank you all very much.


While falls are the leading cause of fatal and non-fatal injuries for older Americans, Sarah Winkelman stopped by a fall assessment today to see how Crowing County is taking action to prevent falls. We want to make sure that she's a safe walker in the community. The goal of safety and independence is key at today's fall assessments in Crowing County. Sit, stand, walk 10 feet and walk back and based on those assessment results and how long that took, we will tell them they're a variable risk for falling. During the stand-up and be strong exercise, participants are asked to cross their arms, sit down and stand up as many times as they can within 30 seconds. Those who only get up and down eight times or fewer can be considered high-risk. One, two. Falls are not a normal part of aging, even though we see that one in three adults over the age of 65 will experience a fall in this year. For many of the participants at today's assessment, the reality of falling is extremely real. I'm worried about falling. I fell a couple of weeks ago and I hurt my ribs, maybe a broken rib and I don't want to do that again because it really hurts. Some tips including increased lighting, adding stair rails and removing throw rugs can all help reduce the risk of falling. When you do fall, talking to your physician is the most important thing to do because it can be anything related to your strength to possibly medications that you're on and all of that needs to be assessed to keep you safe and independent and in your own home as long as possible. Something that many participants are thankful for. Oh yeah, this is just made for me. Any citizen age 65 or older is encouraged to come to one of the upcoming assessments or balanced classes. I like the dedication that these facilitators have. It's all volunteer and it truly is something where we keep that prevention thing going for the community we serve. With community members that will remain safe, active and independent. Reporting in Cross Lake, Sarah Winkelman, Lakeland News. The times and locations of the upcoming fall assessments and balance classes can be found on our website lptv.org. If you've enjoyed this segment of Lakeland News, please consider making a tax-deductible contribution to Lakeland Public Television.


Hey everybody, thanks for watching! I put this video together for two reasons. Number one, to help educate those interested in the sounds each duck makes. And number two, to have live recordings to practice to to call waterfowl in. Please consider subscribing and let's get started! American Black Duck American black ducks are similar to mallards in size and resemble the female mallard in coloration. Though the black duck's plumage is darker. The male and female black duck are similar in appearance but the male's bill is yellow while the female's is a dull green. The head is slightly lighter brown than the dark brown body and the speculum is iridescent violet blue with predominantly black margins. In flight, the white under wings can be seen in contrast to the dark brown body. American black ducks dabble in shallow water to feed on plant material and small aquatic animals insects, amphibians, etc. In freshwater habitats and mosques and crustaceans in maritime habitats. Black ducks are most common in the Atlantic and Mississippi flyways with most distributed along the Atlantic coast from the maritime provinces to Florida. They are most abundant on coastal wetlands ranging from the maritime provinces, Lake Erie and the St. Lawrence River and Canada to the mid-Atlantic coast in the United States. Common Golden Eye The common golden eye like the barrel's golden eye is named for its brilliant yellow iris.  Male common golden eyes have a blackish iridescent green head with a white circular patch between the eye and the base of the bill. The breast, sides, belly and patch across the secondaries and secondary wing coverts are white. The back, rump and upper tail coverts are black and the tail is grayish brown. The bill is black and the legs and feet are yellowish. Female common golden eyes have chocolate brown heads, a whitish neckband and speckled gray back and sides. The bill is blackish becoming yellow near the tip and the legs and feet are yellowish. Common golden eyes use brackish and saltwater bays and deep freshwater habitats in the winter and dive to feed on a wide variety of available animal life. In inland areas during the summer and fall they feed on aquatic insects, crustaceans and aquatic plants. Along coastal wintering grounds they feed largely on crustaceans, small fishes and some plant material. Some may move from the interior to the Atlantic and Pacific coast and south along the Mississippi and Snake Rivers. Along the Atlantic coast birds winter from Newfoundland to Florida and on the Pacific coast from the Aleutian chain south to California. Barrel's golden eye In flight a Barrel's golden eye is difficult to distinguish from a common golden eye. A puffy oval shaped head, steep forehead and stubby triangular bill help distinguish it from a resting common golden eye.  The dark back contrast with the white neck, breast and belly. The scapulars are black with a distinctive row of rectangular white spots.  The bill is black and the legs and feet are yellowish. The female Barrel's golden eye has a dark chocolate brown head with a narrow whitish collar. The back and sides are dappled gray and the chest, breast and belly are white. Barrel's golden eye is dived to feet on aquatic insects, crustaceans, small fish, fish eggs and pond weeds found in freshwater habitats and mollusks, especially blue mussels. Sea stars and marine worms found in marine habitats.  The remainder of the head is blackish with an iridescent green and purple sheen.  The upper wing service is blackish except for the white speckling extending from the inner and middle secondaries across to the outer lesser and marginal culverts. The bill is light blue gray and the legs and feet are fleshy pink. Female buffalo heads have a brown shed and neck except for an oval white patch that extends from below the eye back towards the nape of the neck. The breast, sides and flanks are dark gray, the back is blackish, the belly is whitish and the tail is grayish brown. The upper wing service is blackish brown except for the inner and middle secondaries and inner greater culverts, which are white tipped with black. The bill is dark gray and the legs and feet are grayish. Buffalo heads from eastern Alberta migrate to the eastern United States and the Gulf Coast of Mexico and birds from western Canada migrate south along the Pacific flyway.   The bill is blackish and the legs and feet are blueish gray. The iris is bright red in the spring but duller in the winter. Female canvas backs have a light brown head and neck grating into a darker brown chest and foreback. The sides, flanks and back are grayish brown. The bill is blackish and the legs and feet are blueish gray. Canvas backs migrate through the Mississippi flyway to wintering grounds in the mid-atlantic United States and the lower Mississippi alluvial valley or the Pacific flyway to wintering grounds along the coast of California. Historically, the Chesapeake Bay wintered the majority of canvas backs but with the recent loss of submerged aquatic vegetation in the bay, their range has shifted southwards towards the LMAV. King Eider Male king eiders have a black lower back, rump, scapulars, tail culverts, breast, belly and sides. The tail is brown black and the bill is orange, sweeping upward into an orange frontal shield outlined in black with a pale blue crest. The neck, chest and foreback are creamy white. They have a white patch at the base of the tail and the four part of the upper wings. The legs and feet are dull yellow to orange. Female king eiders are tawny brown, barred with dusky brown chevrons, V-marks that can be similar in color to common eiders. The bill and facial skin are dark olive gray and the legs and feet are grayish. King eiders dive great depths to feed on mollusks, crustaceans and aquatic insects. They also feed on ill grass, witching grass and algae. There is a record of one king eider feeding on the bottom in 180 feet of water in the Bering Sea. Common Eider Common eiders are the largest duck found in the northern hemisphere. They are stocky, thick necked birds that hold their heads below body level during flight. Male common eiders have a primarily white head, neck, chest and back. The breast, belly, sides, rump, tail culverts and tail are black. The crown and forehead have a black cap while the cheeks are pale green and are used in breeding displays.  The head has a distinct sloping profile. The bill is olive gray turning yellowish near the facial area and the legs and feet are grayish green. Female common eiders are russet brown to gray. Common eiders dive to feed on mollusks and crustaceans found in shallow waters around submerged ledges and reefs off rocky coastline. Common eiders are difficult to track because most migrate over large bodies of water in remote areas. In the east they winter from Greenland to the Gulf of St. Lawrence and south along the Atlantic coast of Virginia. In the west they winter south to southern Alaska. Greater Scop Greater and lesser scop are often found together but the larger size of the greater scop is very obvious. Male greater scop also have a larger, more round, green tinted head than male lesser scop. Male greater scop have a glossy black head tinted green. The neck, breast and upper mantle are glossy black and the flanks and belly are white, sometimes with gray vermiculations on the lower flanks. The back is whitish with fine black vermiculations and the tail and upper and under tail culverts are black. The wing has a broad white speculum spanning nearly the entire length of the primaries and secondaries. The bill is a light blue gray with a black nail, the legs and feet are gray and the iris is yellow. Female greater scop are brown with white oval patches around their bills. The females bill is similar to that of the male but slightly duller and the legs and feet are gray. Greater and lesser scop are counted together because they are difficult to distinguish during aerial surveys. Greater scop dive to feed on aquatic plants and animals. In coastal areas, mollusks constitute the principal diet items. In freshwater habitats, seeds, leaves, stems, roots and tubers of aquatic plants are important items. Lesser scop Lesser and greater scop are often found together. The smaller size of the lesser scop is very obvious. Lesser scop also have a smaller, less round, purple-tinted head than greater scop.  The neck, breast and upper mantle are glossy black. Vermiculations on the sides and flanks are all brown in contrast with white chest and belly. The back is light gray with broad, heavy vermiculations of sooty black. The tail, upper and under tail culverts are black. The wing has a white speculum in the inner primaries or light brown, becoming darker towards the tips and outer primaries. The bill is a light blue-gray with a black nail. The legs and feet are gray and the iris is yellow. Female lesser scop have a brownish head, neck and chest and white oval patches around their bills. Lesser scop dive to feed on seeds of pondweeds, whige and grass, wild rice, sedges and bullrushes. They also feed on crustaceans, aquatic insects and small fish. Ringneck duck. Although male ringneck ducks superficially resemble their counterparts in greater and lesser scop, their peaked, angular head profile, distinctive white bill markings and uniformly dark upper wings distinguish them. Female ringneck ducks most closely resemble female redheads but are distinguished by their smaller size, peaked, angular head profile and pale region around the face. The ringneck name is derived from a faint brownish ring around the base of the neck which is visible only upon close inspection. The legs and feet are gray blue and the iris is yellow. Ringneck ducks are silent except in display when a low whistling note is uttered.  Ringneck ducks dive in shallow water to feed on the tubers, seeds and leaves of moist soil and aquatic plants. Pawn weeds, coontel, water millfoil, hydrilla, sedges, grasses, wild rice, etc. They also eat aquatic insects, snails and clams. Surfscoter. Male surfscoters are entirely black with a white patch on the forehead and a larger white triangle on the nap. Male surfscoters are entirely black with a white patch on the forehead and a larger white triangle on the nape. They have large bills which are swollen on the top and truncated on the sides with black feathers extending to near the nostrils. The bill is multi-colored white, red, yellow and black, appearing mostly orange from a distance. The legs and feet are reddish orange with dusky webs and the iris is white. The female surfscoter is fairly uniformly colored dark to black brown with occasional whitish feathers. There are two whitish patches on the cheeks below the eyes. The bill is greenish black or bluish black. The legs and feet are dull orange and the iris is pale or brown. Female plumages of all scoter species are similar. The surfscoter hen can be differentiated from the black scoter by the more sloping forehead and white face patches. The surfscoter feeds mainly on mollusks, crustaceans, aquatic insects, small fish and on green plant matter such as pawn weeds, wild celery, muskgrass and the seeds of sedges and bullrushes, rarely diving in water that exceeds 30 feet deep. They forge in the zone of breaking waves easily diving through wave crests. Black Scoter Black scoters are among the most vocal of waterfowl species. Male black scoters are entirely black except for a yellow protuberance on the base of the bill and the gray lower surface of the flight feathers. The legs and feet are dusky and the iris is brown. Female black scoters are dark brown with light whitish cheeks, chin and throat which contrast with a dark brown. The legs and feet are dusky and the iris is brown. Black scoters dive to feed on mollusks, crustaceans and small fish found in marine and freshwater habitats. Their diet also includes small amounts of ill grass, muskgrass, witchen grass, pawn weeds and algae found in inland habitats. Major wintering areas for black scoters include the Pacific Coast from the Aleutian Islands to Southern California, the Great Lakes and the Atlantic Coast from Newfoundland to South Carolina. Hooded Merganser The Hooded Merganser is the smallest of the three Merganser species occurring in North America.   Wavy black lines can be seen on the tawny sides and flakes. The hind back, rump and tell are dark brown. The long narrow serrated bill is black. The iris is bright yellow and the legs and feet are dull yellow. Female Hooded Mergansers have a gray brown head and neck with reddish brown crest.  The upper bill is black edged with orange and the lower bill is yellow. The legs and feet are greenish in color and the iris is brown. Hooded Mergansers dive in fresh water to feed on small fish, crayfish and other crustaceans and aquatic insects. Common Merganser The long narrow bill with serrated edges readily distinguishes Mergansers from all other ducks. Common Mergansers are among the largest ducks but are less stocky than iders and golden eyes. In flight, they appear more elongated than other ducks flying in trailing lines close to the water's surface.  The lower neck, breast and under parts are creamy white with a variable pink wash. They have black backs and upper wing coverts with white scapulars. The bill is red with a blackish Coleman and Nail. The legs and feet are deep red. Female Common Mergansers have a tufted red brown head that is clearly defined from the lower neck by a clear whitish chin. The back and sides are silver gray and the breast and belly are white. Common Mergansers eat mainly fish, amphibians, crustaceans and other invertebrates obtained by diving underwater in marine and freshwater habitats. Hope you guys enjoyed this video. If you did, give it a thumbs up and we'll see you on the next one.


when James Harden is healthy there are not many teams in the league that can stop him. His return tonight is a welcome sight for everyone in Netsland. Prior to the hamstring strain he suffered on the last day of March. Harden was having a fantastic season in 34 games with the Nets. The nine-time all-star was shooting nearly 47% from the field while averaging just a tick above 25 points per game to go along with 11 assists and nearly nine rebounds. For all the latest now we want to bring in our Michael Grady and Michael you know my partner in the studio Frank Isola always says that James Harden was in that MVP conversation until he got hurt. Well put that aside put the MVP discussion aside James Harden is back and that's what Nets fans are most concerned about. Yeah no doubt about it a lot of excitement about James Harden returning he's been putting a lot of work in the gym making sure that he's ready to give it a go and they've taken a lot of precaution as well with the performance team working with James and making sure that he's not 100% 200% ready to get back out there on the court. Remember after he initially hurt it against the Houston Rockets he tried to make a comeback against the New York Knicks only played four games and it had to step out. He was rehabbing and then had a setback which led to an extended stay of James Harden being out of the lineup and after more than a month he's ready to return. Earlier I talked with Steve Nash and I asked him how James Harden will be utilized tonight. Yeah he'll be on a you know minutes restriction we'll monitor that and make sure that we try to mitigate the risk as much as possible and ease him back into play but uh yeah that's that's basically the plan similar to when Kevin returned from the hamstring as well. Now Chris you said everybody is excited about James Harden being back the fans here at Barkley Center excited the coaching staff definitely excited. Hey we're excited but nobody has to be more excited than James Harden's teammates and the way that he's able to create for other guys on the floor he draws and jump double teams just like Kevin Durant and Kyle Reirving but his craftiness and his ability to have precision passes to his teammates and set them up for high quality looks there are a number of guys on this Nets roster who are having career highs in terms of shooting percentage and James Harden is a big reason why and his ability to get his guys easy looks so they're all excited about his return Chris.


Hey everyone, welcome back on I am Greg Sussman joined today by Megan Union's Oh Fandall who's here to give us her winning week five picks. What's going on Megan? Not a whole lot. Just hoping to get some winners this week and every week of course. Absolutely and that is not going to change here this week in week five. So let's begin in Cleveland where the Brownies are coming off a big win against the Dallas Cowboys and they are a point and a half underdog at home to the Indianapolis Coles. No respect for the Browns coming off a win against Dallas. No and look if you're a Browns fan you have to be excited about the season. Sure you got smoked by the Ravens but it's been pretty smooth sailing since then especially after this Dallas game. I mean it wasn't just spectacular plays from Odell Beckham Jr. They dominated the line of scrimmage and got like 200 rushing yards in that game.  This week as you said they're playing the three-in-one Colts who are the Browns are also three-in-one. But as dirty as it feels I trust the Browns more than I trust the Colts. Philip Rivers he's old man Rivers you don't know what he's going to do for you what you can expect. He has plays that he makes that sometimes just leave me scratching my head and ultimately I think those are going to end up costing him games. I like the Browns as home dogs in this spot. I think Stafansky keeps this offense rolling. I mean last week it was so exciting. You had Jarvis Landry throwing a touchdown to Odell Beckham. I mean it was electric. Give me the Browns as home dogs here. It's so rare to say you're going to trust a team like the Browns over anybody but over Philip Rivers he does tend to let you down in a big spot. Well it kind of makes sense. Two three-in-one teams you know people realize that the Browns three-in-one here going into week five led by Baker Mayfield and Odell Beckham even though there is no Nick Chubb in the lineup. Kareem Holland and Diernis Johnson can certainly carry the load and they will this week or at least let us cover the spread. Browns plus one and a half at home over at the Fandales Sportsbook. We mentioned that the Browns took down the Cowboys and the fact is Doc Prescott throws 450 yards every single game because the Cowboys defense is just laying up so many points. But right now Giants aren't scoring any points which means you're not going to have to come back from that much down this week. The Cowboys are nine and a half point favorites against the New York Giants here on Sunday over at the Fandales Sportsbook. Maybe this one won't be a nail by their Cowboys fans. So I just talked about how the Browns kind of put it to the Cowboys last week but there's no denying that. They got gashed for over 200 yards but the Giants don't have near the run attack that the Browns did because they lost they won Barclay. There's no denying that this Cowboys team has talent. They just have to figure out how to use it in a cohesive matter. I really I think this is going to be a get right spot for the Cowboys. I the Giants anemic offense just awful. The Cowboys are America's team. They need to get right spot. They need to feel like bullies. I think that they just beat up on this Giants team. I think this is the opportunity for the get right spot. I like this game here and I'm taking the Cowboys America's team with all the points Giants have played teams tough. But they haven't seen an offense quite like Dallas Cowboys yet at nine and a half points. They may smoke them that maybe this get right game as you're alluding to Cowboys are heavy favorites and worth laying the juice. According to Megan one last game to get to that Sunday night football. We're letting us cook with the Seattle Seahawks were seven point favorites against the Minnesota Vikings and Vikings team that does not look great thus far this season. While the Seahawks on the other hand, they're just blowing teams out over the water. At least this offense is anyway Seattle minus seven at home. That's where you're going with your final pick of the week. I am and I'm just going to keep riding this train. I know it's a lot of point. Last week I laid off the game because I thought it's probably a weird spot for Mr. Unlimited going from Seattle down to Miami. That humidity that heat a one o'clock game and he covered the spread and he won. I don't know why I decided to pick Derek Carr instead of my dude Mr. Unlimited. But I'm not doing that this week. I'm going to ride back with my boy Russell Wilson and I know that the Vikings have looked relatively good over the last couple weeks. Jefferson's kind of taken some heat off feeling, but let's be honest. They haven't looked like a good football team, especially defensively. And that sounds weird because obviously like summer. So yeah, I'm going to go ahead and take my boy Mr. Unlimited in prime time at the 12th man, even though there's not a 12th man. Still think there's a lot of good stuff happening in Seattle under Pete Carroll and my boy Mr. Russell Wilson. Let him cook. I'm going with the Seahawks minus the seven. I think it's going to be a great time. Russell Wilson at home is in a good spot against the Minnesota Vikings. And yeah, I totally agree with you in Miami. It was weird for a lot of that game. The offense recovering didn't end up that way, but the Seahawks are rolling right now and the Vikings. Well, Justin Jefferson, as you mentioned, has stepped up and David Cooks played well. Also, I don't see how they keep up with Seattle's cooking offense. Seattle and the seven point home favorite is Megan's final pick of the week. There you have it. Those are the winners for week five. Megan, you guys, we appreciate the time. Good luck this weekend. Thank you. Good luck to you all as well tomorrow on the show. Time. Becky will join me as we'll go over his top value plays here for week five for Megan. Yes, I'm Greg Sosman. Thanks so much for watching and we'll see you tomorrow for another edition of the fan du Luria.


As man can do it we did It's not big enough I'm gonna get bigger chap the songs As fans one of my favorite. There you go, dude Nice that is so good swinging the sword of the freaking claymore nice, dude What a good drawing real footage of one s-fans massage or arrived in the mail. Okay, thanks for the cooking lessons s-fand Yeah, I look spaghetti tacos or Spaghetti tacos are probably the most delicious Meal that you could possibly have Yeah, you throw a little bit of Tony's on there and it's great. What in doubt run. Oh No We've gone through this whole zone Hey, yeah, but Wait, who else is famous with me? Wait, is this the first time I've been at a twitch video? Wait, is it the first time in a twitch video? I don't think I've been at a twitch video. So I look listen I'm very jumpy whenever I play horror games. Okay, Pog you. I'm famous Dude, that's cool. May them birthday. Thanks. You see once again.   We can watch the video. Okay We brought a backpack on a water ride and we put a plastic bag over it Why is it so cold Soda explains vigors raid-leading experience wait what? Wait, well, how do we get there? Wait, what how did he get launched? What soda you bastard?    Are they actually together like she so Such conviction. Yeah, we're not gonna do markup bottom video. What do you mean bottom video?  Hassan's rich God 50 53 K With ads in chat, you know why this is this is with ads in chat This is people typing the word ads So this isn't as one of the top. This is the top 30 channels of Complainers that's what this actually is is top 30 channels of complainers I mean we're on here, too, but it's because people are like it's it's usually like people understand You know what I mean? This isn't unironically. This is complainers people need to understand like how it works now I completely agree with this.  I think it's bad for the live streaming format It's it doesn't fit the medium right on YouTube if there's an ad at a certain point then it's like, okay The video pauses it plays the ad and then video continues. That's fine for live streaming. It's live You want to see it right then? It's really bad. So what can we do? We can game the system as much as possible like I said and then If I just know when ads are running then nobody is nobody is going to get nobody's gonna get screwed Right, and that's that's the important thing to me.  We've got an overwatch legend. All right, dude I'm ready man. I could do it. All right. Just forget my room. Yes, sir Because I'm playing games give me a hug. Okay There's a hug. Oh, you almost touched my nuts. Yeah, I know Wait, do you like watching death note? I've already seen it. Would you want to watch it with us 40? What This guy watches my stream you've already seen it logic chance I don't get my stream to you play the smitty were burgeoning Jensen every single week You can't tell me. Oh, I've already seen it. I don't want to do it again.  I don't know why nobody's thought of that. Take a chance. They should have a job So what is this one true king I real trans my contest Halloween special Wait, what the frick a pink panda with a nerve gun and a broken heart Okay, let's know Okay. Well, anyway, I Don't know where that was gonna continue to go. So I just went ahead and stopped it while I could yeah We're not gonna look at anymore Wait, what is this? I don't know how the YouTube algorithm just goes nuts sometimes What what what what the frick? Yeah, dudes sub my YouTube channel if you see this Okay So anyway, she doesn't have an only fans her only fans She yep. Plus one. What is this? If I got the offer, would you consider joining OTK? Absolutely. I think the people behind OTK are Amazing people. I think they do a great thing for the twitch community and the bow community I would be honored to be a part of it, of course Well, oh on people behind OTK are big streamers with really big hosts, and we just we just stop it there Just kidding. Well, actually that part is true