All right, thanks so much for that introduction. Like you said, I'm Vicky Steves, the librarian for research data management and reproducibility at New York University. I'm joined by Sarah Nguyen, who is a research scientist also at NYU. Our third team member on this project, Genevieve Milliken is in the chat, so be sure to give a nice hello there. So to start us off, we're gonna be talking about Ice Age. And yes, the acronym doesn't manage the pronunciation, but that's just the way it goes. Ice Age is an Alfred P. Sloan funded project that looks at basically two streams of work to try and help with saving all of y'all's work that is in the get data format on get hosting platforms. So those two streams of work include a behavioral study around how folks in academia are using get and get hosting platforms, which Sarah will talk about way more in depth. This second stream of work focuses on evaluating how those materials are currently being archived and how we can assist in aid and where the gaps are and where we can move forward as a community. So the goal of this project in a nutshell is to make sure the wonderful work that you all are doing, producing great get repos and the context that adds to its meetings, such as issue threads, PR discussions, wikis can go from this really highly active, collaborative state to a state where they are stable, citable and under professional preservation. So here are the three of us pictured, but I also wanted to just mention this work would not be possible without our amazing colleagues in NYU Libraries, Digital Library Technology Services, which is our digital preservation unit. And before I get too ahead of myself, most of y'all at CSV are probably familiar, but before we go into some more depth, I want to make sure everyone has the same baseline understanding of what Git is. Git is basically a revision control system. It's a command line tool. The point of Git and other revision control systems is to be able to compare, restore and merge changes to our plain text materials like code. So using Git facilitates collaboration, transparency, obviously something CSV and us care a lot about, which is awesome. So we love Git. There are also these things that we're calling Git hosting platforms. They're literally platforms on the web where people either host a copy or host a copy of their Git repositories. They add some features on top that enable wider spread collaboration as well. So the most popular is GitHub followed by GitLab, BitBugget and Sourceforge. So we're focusing on those, but as you can see from this very small screenshot from Wikipedia, there are a lot more. I especially want to give a shout out to SourceHut, which has this really cool sort of non, this cooperative model for hosting platform that looks really interesting. So check out SourceHut. And since this project has scholarly in the title and we're gonna be saying things like scholarly ephemera to denote parts of a repository we want to save, I thought we should show you some concrete examples of what exactly we mean by scholarly Git usage. So there are some of the perhaps more obvious ones like using GitHub to publish data and code as supplementary materials to a paper. But there are also some really interesting uses. How yay, I was in the Yenny group if you caught his presentation yesterday and I gave a shout out to this bio archive preprint, it's my favorite one. It details really in depth how they went from a manual quality assurance procedure for their lab for their data to an automated one using GitHub and Travis. So using this Git hosting platform, which is meant to do software engineering to do automatic QAQC on data is a really awesome scholarly usage. But even there are whole journals that run on top of GitHub's infrastructure such as the Journal of Open Source Software, JOS and then the Journal of Open Educational, it's Jose. And they conduct peer review and the entire publishing workflow on GitHub. So these are some of what we mean when we say scholarly Git usage. And the extent to which this is present in Git hosting platforms is pretty big. Sarah is gonna talk a little bit about some of this scoping in depth but I really love this background piece that comes from Hasselbring et al. I highly recommend y'all read the preprint. They basically identified 5,000 repositories that host research software specifically. They did that by looking at GitHub itself but then also citations of repositories in ACM's digital library and archive. They found the most were in life science, the next were in general science and then the third were unpublished or archives which is like backups. So these are some really interesting scoping of the extent that this material is present. So then the problem we wanna solve is there's all this really interesting tooling going on around using Git. So many different platforms. This source code by itself is really valuable but it's also contextualized by the scholarly ephemera around it like issue discussions. And no current project captures both the source code and that ephemera. So we want to be able to get everything together. My emoji and my elephant in the room which didn't actually show up my dad is GitHub's archiving program which you may or may not have heard about. Not gonna say a lot about it because David Rosenthal's blog post there that I linked at the bottom says everything you need to say but I will also just highlight that none of these projects are really solving the problem that we wanna solve in that keeping the code together with this scholarly ephemera to everyone's benefit. So I'm gonna pass it off to Sarah who's gonna talk about the gap analysis. Hi everyone, this is Sarah. Can you hear me okay? Okay. So as he said, my name is Sarah Neane and I am the research scientist focusing on Git on the behavioral side of Git and Git hosting platforms. Next slide please. So throughout my research, I've basically phased it out into five different parts starting with a literature review of just anyone who has mentioned Git, GitHub, GitLab, Bitbucket in their papers or in their studies. And then we go into systematic review, a focus group, broad survey and user experience interviews. I'm going to be focusing most of today's talk on our broad survey as that's something that we've had some preliminary data to share but if we go to the next slide, I can share with you basically the research questions that we're focusing on as we do the, when we started off with the literature review which is basically just seeing how scholars use Git and Git hosting platforms as a toolkit to carry out their specific use cases which is pretty similar to programmers and anyone else that uses Git but specifically we're trying to just make sure that we can serve as librarians and archivists, those people who are doing things that are research and education based. And then we also in the end want to be able to teach people who have experienced Git but have not yet been able to fully incorporate it into their workflow. How do we better introduce this topic to them and how do we better make it so they can bake it into their workflow process? So feel free to check out our blog that we've been updating as we just go through different types of papers and just a summary of all of those. Next slide, please. So just listening to yesterday's talk, it seems pretty, it was awesome just to see other people who are also just studying how people can use Git and make science and just research and information more open. So it's very similar to how many developers will already use it but we did pinpoint these Git experiences specifically how scholars use them through the literature review. And obviously that's version control because that is what Git is based off of but community and collaboration was a huge one just like as Git hosting platforms are social coding platforms. Method tracking, we see those through lab notebooks, education, Git, all of those different hosting platforms have a classroom setting. Data processing, reproducibility, publishing, publishing is a huge one. So these are all specific buckets into what we call scholarly use cases. And if we go to the next slide, this is just a paper that we want to highlight because it recently came out just this past week and it was written by a graduate student on just how they overcame barriers using open source software and they also referenced Git and Git hosting platforms as a main point of use as they used open source software and collaborated with their peers. So I highly recommend you check that out. So if you go to the next slide, I'm gonna give you some examples of just very relevant use cases of how scholars and researchers are using Git. So many of you might know that Johns Hopkins University Center for Systems and Science and Engineering came out with this awesome dashboard based off of Esri just showing the spread of COVID-19. So they are actually posting their data on GitHub and their visuals are being fed to on Esri. So they're connecting the two platforms together. And you can see there's about more than 1200 issues but those are not being preserved in a specific way. Yes, Git is a decentralized way where each person can take the source code but these types of conversations that are happening on issues and pull requests are what we're interested in because that kind of just plays into the scholarly workflow of peer review and collaboration. So that's just one repository. Next slide, please. This next GitHub repository is another one that I like to highlight because it is also very relevant to COVID-19. Some of you might have seen some discussion happening on the interwebs last week about how this code base that was basically saying that this type of modeling could show and reveal some information on how to reduce COVID-19 mortality. And it was basically taken down and also retracted even though it was just a preprint of a report but in this issue, which is closed, there was a long discussion of how they're testing and there was many bugs which no one is a perfect coder but it's just so important to be able to see this type of discussion happening throughout these types of data and modeling and scripts and code, which isn't currently being saved in many of the platforms that we're looking at. If you go to the next slide. So after the literature review of just looking at how people are using Git through conversing through issues, I'm interested in going through a systematic review, basically seeing how all published papers, how have they been referencing URLs and to Git hosting platforms and Git within their workflow? So this would just be a large harvest of articles and metadata.  Next slide, please. So phase two of the research is a focus group which is also in progress right now. We've been interviewing small groups of three to six researchers, students, anyone who is what we call a minimal user. So someone who has been exposed to understanding or just has seen the world of Git but has not yet been able to incorporate it into their workflow. And we're mostly interested in this because a lot of people will be found are enthusiastic about version control systems and Git being a very popular one for exposure is something that they get excited about once they're in the classroom, but they tend not to bring it over into their daily workflow. So within these focus groups, we wanna understand what is that bottleneck? What is that threshold where they just cannot enter that door, open up that door to include Git into their workflow? So we're excited to see how that is incorporated. One tweet that we'd like to highlight is from Christy Whitaker, Kirstie Whitaker from the Allen Turing Institute. And she was basically talking about how her experience of teaching someone a pull request which is kind of a foundation to using Git and sharing code and source code with each other. But if you can't even get over this one barrier of a pull request, how are you supposed to even incorporate it into your larger workflow with all of the other different types of commands? So this is something that we're interested in of just making tools and a toolkit for people to understand. And then part three of the research is a survey which we hope you all can participate in and share with your colleagues.  And we just wanna get into a wide range and comparable senses of just how you were introduced to Git, how you learned it, who taught you, do you teach it? What's your daily use behavior? The survey takes less than 10 minutes. So I hope you're able to participate and so we can get your feedback. Five minutes. Five minutes. I'm just slow at clicking multiple choice buttons. So some preliminary findings within this survey. Again, Mr. Kosh's cone is telling you please participate and share widely if you have time. One of the first questions that we do ask is when did you first start using a version control system? And this is just a nice time series. Obviously this is a very small population right now as we just, I was the only recently put out the survey but I'm excited to see any sort of trends of the year that someone has picked up Git or a version control system and what major events have happened around that. We can see a spike happened in 2005 when Git was born. I can't say that's clearly correlated but that is something that is interesting to me. It was also interesting just to see that in 1990 we haven't had anyone who has adopted a version control system immediately after 1994 or earlier. And then it'll be interesting to see when funding agencies start mandating data and source code be made openly available, will there be an actual spike in there? A few years afterwards we do see this in 2015 which I haven't been able to find a notable event timeline for that year but if anyone has experienced anything or remembers from their memory, it'd be great to hear that. Next slide please. Another preliminary finding is we do ask people what version control system did you start out using and what version control system do you use now? Because as you, we all know we're all interested and curious about learning about different technologies. So just because you started it with Git doesn't actually mean that you'll stick with it if you learn Mercurial or SVN which has been pretty rare to be honest, obviously just because many places have been not supporting other types of version control systems but it'll be interesting to see. In the other category, other people had, participants had submitted that they use Microsoft SourceSafe, Perforce, Fossil, Darks. So there's a lot of different version control systems that people actually do still use. Next slide please. So why did you first enter the world of Git in version control? I like this question just because it's kind of like your motivation or intention to version control. Obvious factors that we just need a version control system. In our focus group, something interesting is all of our focus group attendees who are minimal users, they had stated that they heard that it would get them a job in the future which for right now, we see that not very many people have responded to that. Other types of reasons on why people have entered the world of Git in version control was that their workplace was requiring the use of it or it was required for a web development course that they took. Someone said that they needed to back up their code which is really interesting to us just because we are looking at the preservation aspect of it for long-term use. Others wanted to replicate the code on multiple computers. Better documentation for complex projects which is also something that we're really excited about just because we do see this type of version control system as a way so that we can have code and open science. Someone also said that it was superior to SVN which I find is funny. So this next one is... Sarah, maybe for the sake of time we'll run through this a little quicker so I can do the final overview. So let's just skip ahead to part... So basically we have quite a few preliminary findings but if we skip ahead to part four which is basically the closing of understanding the behaviors behind Git is we're going to be doing user experience interviews. So we hope to be able to take some more one-on-one time with participants to understand how you actually use Git. And now I'll pass it to Vicky so we can wrap it up. And the last question of the survey does ask if you wanna participate in this so we hope you will. I'm just gonna really briefly go over part of Genevieve's project, sorry to the project. So obviously she's available to answer questions. This is her beautiful bunny Oshi. And she did basically a huge environmental scan in parallel to the work Sarah's been doing looking at four key areas of the ways that people are capturing and preserving source code and ephemera. So I'll go through them briefly. So web archiving which is the use of crawlers or similar software to capture and preserve a look and feel of content on the web. So projects of interest I'll talk a little bit about later archive it web recorder and memento tracer. We're also interested in self archiving which hopefully a lot of you have done now that you're familiar with Zenodo. This is looking at the motivations of depositing core code into general like Zenodo subject like GenBank or institutional repositories. So what are the motivations for where people choose to put their codes, put their code what makes one platform more attractive than the other whereas the feature parody questions like that. We're also interested in the use of API's indexers to automatically capture this code. So obviously software heritage is the big one in the space where they have public copies of many public repos across multiple get hosting platforms including sunsetted platforms like Google code. They have all the open material on Google code. So they're capturing the source code and then there are projects like GH archive and GH torrent that are capturing the ephemera using GitHub's API. And then there's a really awesome project Sarah which allows it's a mix of programmatic capture and self deposit where basically you make a copy to an institution's GitLab and then some metadata is put into an institutional repository for greater discovery. So very cool. And then obviously the last piece is software preservation which is around sort of the best practices in curating and making accessible for the longterm source code but also compiled binaries in those ephemera. Some projects of interest include obviously software preservation network just a member based organization similar to the data curation network which is also member based. I'm really interested in drawing the line between spin and DCN especially because DCN produces really excellent primers on writing code for data curators. But also of interest are the UK and US research software sustainability institutes which forefront open reproducible sustainable practices for research software. All of them. We did some tool crafting. We're gonna do more. Here's all of our info. Talk to us. Thank you. Sorry. Because there will be available on Slack if you are more keen and would like to know more. Thank you so much for your talk. It was very insightful and you explained Git in a new way that I've never heard of before and now I get it. Thank you. Hey, good.


What's going on? I am Greg Sussman joined today by Megan Nunez of Fandle who's here to break down week eight and her best pass What's going on Megan? Not a whole lot just trying to find some winners for the week Back on the grind here this weekend trying to find the the easiest winners So we hope and that begins one a surprising spot It's the battle of the AFC north two of the best teams in the NFL the Baltimore Ravens and Lamar Jackson taking on the undefeated Pittsburgh Steelers in this one the Ravens are four-point favorites Despite the fact the Steelers haven't lost the game yet this season and you're riding Lamar Jackson You're riding the Ravens in this rivalry match a lot of ours there. Why do you like the Ravens with the points? Okay, so yes, I'm betting against the only undefeated team in the NFL Not only are they undefeated but they have looked completely dominant and shown little to no flaws Except in the second half of that Titans game and I'm thinking that may carry over this week against the Ravens I love Lamar Jackson and John Harbaugh off of a buy John Harbaugh is nine and four against the spread off of a buy I think this Ravens team did need that extra week to prepare for that Pittsburgh offense And I think that the offense is actually going to pose a problem Especially Lamar Jackson for this Seattle defense who while have been lights out Showed that they have some weaknesses in that second half of the Titans game so I'm gonna go ahead and take the nine and four against the spread with Harbaugh and Lamar Jackson off of a buy laying a four at home and this rival I'm gonna go with the Ravens minus four After that explosive first half Pittsburgh Steelers were in a shell for most of the second half And then Big Ben tried to get it going again and there are a couple of interceptions there It wasn't the Big Ben We had seen the first five weeks over the NFL season are in the first five games now They face their arch rivals the Baltimore Ravens a team whose defense is just getting more ferocious and Lamar Jackson with a week of Rest well, it's a dangerous spot for Pittsburgh Megan going with the Ravens and the four points here That Titans Steelers game was close last week as the Titans showed that never say die attitude The last few weeks the schedule has gotten really rough for Tennessee That changes here in week number e with Tennessee taking on Joe Burrow and a Cincinnati Bengals Titans are six point favorites Here finally getting a little break in the schedule The six points is a pretty big number given how well Joe Burrow has played yet.  You're backing Ryan Tannehill and you're taking the points here Six point favorites or the Tennessee Titans Yeah, so as you brought up Philip the game from last week the Tennessee Titans Well, they got absolutely dominated in the first half Really showed their grit and true colors in the second half and show that they are really never out of a game As you said, I do get a break in the schedule now going to play the Bengals And look Joe Burrow and that offense can put up some points But I just don't think that that team is built to play 60 minutes of football With elite quarterbacks and running backs like Ryan Tannehill and Derek Henry I like the six here because you don't have to worry about that backdoor from burrow So I think the Titans get it done easy here. I like the Titans in this spot minus the six Riding Derek Henry and Ryan Tannehill never seem like a bad idea and as we keep saying here Cincinnati who's played well enough did fall at the end of Baker Mayfield and the Cleveland Browns last week This week Derek Henry is not going to let up and Titans will win by at least six points according to Megan One final game to get to and it's the same final game we do every week and it's Mr Unlimited it is Russell Wilson and the Seattle Seahawks Plenty Barnburner on Sunday night because there's just never a normal Seahawks game on Sunday night Falling to the Arizona Cardinals when it was all said and done in overtime You're back here on the Seahawks this week They are three-point favorites against the San Francisco 49ers 49ers who are down three running backs already if not four Um, the Seahawks down two running backs if not three. So it's a weird situation But Russell Wilson the important part here is healthy And if Russell Wilson is healthy the Seahawks are certainly in an advantageous position. You like Seattle minus three this week I do um, and you probably already knew that they were going to be on my card I I love backing the Seahawks and it was just some weird miracle that collar Murray covered last week So I'm just I went to bed with that game With the Seahawks being up 10 and I woke up and almost wanted to cry But that's neither here nor there. I'm going to go and take Russell Wilson and be super cliche and take him off that loss They're going to be back at home at the 12th man again 12th manless. Well for the most part And um, I I like them in this spot. He always plays really well against the 49ers the 49ers They went from being like busts to studs in like three weeks Um, and look they they beat the Rams and they beat the Patriots, but the Patriots haven't looked great And I don't know if I'm sold on the Rams being a great team So look, I like Russell Wilson in this bounce back spot at home minus three. Um, I I'm rolling with mr. Unlimited A bounce back performance for Russell Wilson is really what it is. He didn't have a great second half Again, it's arizona. We need to call that out. He's unbelievable in the first half and that connection to tyler lock It was fantastic But the second half wasn't great. Russell Wilson through three interceptions in that game Again, san francisco a team. He does play well, but a defense that knows him. Well, it should be another good one Between seattle and san francisco on sunday. Megan backing russo wilson and the three points for seattle this week That's gonna do it for us here the fan deal area. Megan. We appreciate your time. Good luck this weekend Thank you. Have a wonderful weekend and happy halloween Thank you so much. Happy halloween eave eave eave and halloween in general to see you as well tomorrow Time back. You'll join us as we finish out his dfs card with top value plays on the sleep for reagan newness. I'm greg sussman Thanks so much for watching and we'll see you back here tomorrow for another edition of the fan duel hurry up


I'm preparing my client Linda for her trial next week and if you're getting ready to go to trial there's three things you got to remember to be a very effective witness. The first thing you've got to remember is to answer only the question that's asked. So one time I got injured in an accident like three years ago and my neck still hurts till this day and then three years before that I one time went to a chiropractor and he told me that my neck was out of linemen. Stop. Secondly, when you're testifying at trial don't look at the lawyer, don't look at the opposing counsel, don't look at the judge. The most important person in the room is a juror or jury. Three, don't guess. If you don't know the answer to the lawyer's question, don't make something up to make him feel good. Again, number one, only answer the question that's asked of you. Don't answer or drone on for things that have nothing to do with the question. Number two, most important folks in the room are the jury. And number three, if you don't know the answer, don't make something up and it's perfectly okay to say I don't know.


Potential deployment of French troops to Ukraine may be of benefit to Russia. Medvedev, eliminating French military personnel that may appear in Ukraine, would be a critical but not particularly difficult mission for the Russian armed forces, but for Paris, such a humiliating defeat of its legions would be tantamount to being guillotined. Russian Security Council Deputy Chairman Dmitry Medvedev said, Actually, for the success of our cause, it would be nice if the restless French dispatched a couple of regiments to Bandera land. It would be very problematic to hide such a number of servicemen, so systematically eliminating them would not be the most difficult task, but surely the most important one. But just think of the beneficial knock-on effect. He wrote on his Telegram channel, as Medvedev noted, with so many coffins to be delivered to France from a foreign country, it would be impossible to hide the mass deaths of professional soldiers. There will be no chance of getting away with various lame excuses and speculations that mercenaries choose their own fate, and that they are risking their lives at their own discretion. He warned, the deputy head of the Russian Security Council pointed out that such military personnel would become full-fledged combatants as part of an interventionist contingent and so their destruction would be a priority and a matter of honour for the Russian armed forces, as for the Gallic roosters in the French leadership. It would be tantamount to being guillotined. They would be torn to pieces both by the enraged relatives and angry members of the opposition who have been assured all along that France is not at war with Russia. Also, it would be a good lesson for other rambunctious fools in Europe. Medvedev predicted, he suggested that the immortal lines of 19th century classic Russian writer Alexander Pushkin will prove their timeless relevance once again. Then send your numbers without number, your maddened sons, your goaded slaves. In Russia's plains there's room to slumber. And well, they'll know their brethren's graves. On March the 19th, Russian Foreign Intelligence Service Director Sergei Naryshkin said that France was already preparing a military contingent to be sent to Ukraine, which would initially amount to about 2,000 soldiers. Putin needs refineries in Navopolansk and Mazir of Belarus. Ukrainian drones may fly there. A tenth of fuel production in the Russian Federation has been paralysed as a result of Ukrainian attacks. This is a serious blow to the Russian economy. The Charter 97 website spoke about this with Ukrainian Military Political Observer of the Information Resistance Group, Oleksandr Kovalenko. Firstly, the shocks affected the export of Russian petroleum products, which is the main item in filling the Russian budget. Secondly, internal economic destabilization occurred, which is already manifesting itself very eloquently. It affected domestic civilian and commercial consumers. Gasoline prices are rising, queues are lining up for it. In a number of settlements and in some places, there is a shortage. Kovalenko added. However, the Russian authorities do not pay much attention to civilians. But if the commercial component begins to suffer, then this again is an impact on the budget that finances the war against Ukraine. Thirdly, a blow was also struck to the supply of fuel and lubricants to the Russian occupation forces. Here, I will immediately emphasize that Putin will sacrifice anything. Civilians, commerce, he may not even fill ambulances, but everything will be sent to war. Damaged plants, refinery stations and transport hubs currently do not provide the full volume of petroleum products, processing as well as their transit. The length of delivery of fuels and lubricants increases. The Russian occupying forces are beginning to feel a progressive deficit, but the first signs are already happening against the backdrop of a collapse in exports and a deficit for domestic consumers. Such attacks are effective. They will continue if only for the reason that the restoration of any of these oil refineries in itself is unacceptable. In addition, there are several refineries left in the near affected area that should be taken out of operation. The experts said, perhaps Russia will use the Belarusian oil refineries in Mazir and Navapolatsk for its needs. Is there a possibility that some unidentified UAV will fly to these objects? According to the expert, it is possible that Putin will use them, but they will not be able to compensate for the dozens of Russian refineries that have failed or are temporarily out of order. This will be some kind of situational compensation that will not have a critical impact on the resumption of supply to the domestic consumer in the Russian Federation or the occupying army. On the other hand, if this facility takes part in this kind of support and supply, then who knows? In Belarus, after all, there are partisans who act in the interests of the Belarusian people and not the Lukashenko regime. It is possible that something could happen there too, Kovalenko said.


J.C.L.L.O. The Jell-O program, starring Jack Benny, with Abe Lyman and his orchestra coming to you from Radio City, New York. The orchestra opens the program with I double dare you. In the Jell-O program tonight, it comes to you from New York instead of from Hollywood. But there's no change in Jell-O with its six delicious flavors. Jell-O is always good wherever you have it, New York or Hollywood, North or South, at home or in a restaurant. You can count on Jell-O to be tops in goodness every time. For Jell-O brings you that special, extra-rich fruit flavor. A flavor as delicious as the fresh ripe fruit itself. That's why Jell-O tastes so grand. All six flavors are tempting and refreshing.  Just be sure to get genuine Jell-O when you buy. Look for the big red letters on the box. They spell Jell-O. We bring you a man who traveled all the way from California to New York. That gypsy of the airwaves, Jack. Jell-O again, this is Jack Benny, your little nomad talking.  It's a grand gesture. Oh, well, don't mention it, Jack. I only hope I'll be able to fill down Wilson's shoe. What is that? I said, I hope I can fill down Wilson's shoe.  You should see that guy. Well, well, tell me, Jack, what kind of a trip did you have to New York? Did you fly in? No, no, Harry, I took one of those new streamlined trains and believe me, they are classy. I mean, they're the last word in luxury. Yeah, so I heard they tell me the service is marvelous. Oh, it is, although I think they overdo it a little bit. They do? Yes, I didn't mind when the conductor sent me gardenias. But when the porter took me in my berth and sang rock-a-bye, baby, I thought that was going too far. And the candy vendor was he Ritzy. He was Ritzy, eh? You should have heard him. He was on the aisle yelling candy, peanuts, popcorn, and annuities. I tell you, Harry, it's absolute, pardon me a minute. Hello? Who? No, I'm sorry, miss. Phil Harris didn't come to New York with me. What? No, I can't run home and get him. Goodbye. That's all I've heard from every girl in town. Phil Harris, Phil Harris. Well, anyway, Harry, it looks like we're going to have a lot of fun tonight. And I don't know whether you know it or not, but your boss, Fred Allen, is coming up here. Oh, he is? See, that's funny. He told me he was going to an egg roll. An egg roll? Well, maybe that's what he thinks this is. Hi, Jack, old boy. Welcome to New York. Oh, hello, Lyman. How are you? Little Lord Pauntleroy is with us. Hey, Harry, you know what Lyman did to me last summer in Hollywood? What? I was nice enough to invite him to my house for the weekend, and he put a shark in my swimming pool. He did? Yes. I thought it was a rubber one until I started missing toes. How do you like that for a trick? That was one of my best skates. Yeah. Well, look, Abe, just attend to your music tonight and keep away from me. Come in. Oh, how do you do? Greetings, Mr. Benny. I don't think we've ever met before. My name is Ripley. Oh, Bob Ripley. Believe it or not, man. Well, it was nice of you to drop in, Mr. Ripley. What can I do for you? Well, Jack, you know I'm always on the lookout for curiosities of all kinds. Yes, yes, yes. I never miss your program, your cartoons, either. What's on your mind? Well, I would just like to get a few angles on you and your work. Oh, oh, I see. Well, go right ahead. Now first, is it true that when you make a picture, you wear a silver fox to pay? Yes, but only on special occasions. As a rule, I wear a subdued fright wig, you know? Now another thing.  Yeah, around Carnegie Hall, I'm known as Yasha, there. Is it true that the strings on your violin were made of the tail of a wild cat who later committed suicide? Well, he didn't commit suicide, but he is wilder than ever, Bob. One more question, Jack. I see. I understand that you have been recently chosen as one of the best-dressed men in America. Is that right? Yes, I cannot deny that. Well, is that suit you're wearing now a sample of your taste in clothes? Well, of course, don't go by this. This is just a little lounging outfit. Oh, you mean you look better if you were lying down. Yes, but it isn't fair to judge me by this suit. Really, Mr. Ripley, you'd love my soup and fish. Oh, I see. You cook, too. I was talking about my formal attire. Are there any more questions? No, believe it or not, I think I've got all I need. Thanks very much. You're welcome. Would you like a picture of me, Mr. Ripley? Not unless you've got three arms. Goodbye. Goodbye. Well, well, Harry, Ripley seems to be a nice chap, although his questions were rather embarrassing. Now, what would I do with three arms?  I could also punch you in the eye with that one. Well, let's get on with the show. And now, folks, our conductor, Abraham Lyman, will play What's It Gonna Be, Abe? Here, it's written in this little book. Open it and read it. Why don't you read it yourself? If I could read, I'd get my own program. Oh, that's right, huh? Go ahead and open it. OK. Ouch! My finger. I knew I'd get you with that mousetrap gag. Fine, I had to come to New York for that.  OK. Mr. has changed a little. I see some new faces in there. Yes, Jack, and I'd like to have you meet some of the boys. This is my first violinist, Michie the Mug.  Hi, it's good. And Jack, this is my piano player, Michien Gunstakowski. My, what name? Say, Abe, who's that new saxophone player over there? You mean Butch? Yes, yes. I noticed he was scribbling on a piece of paper all during the last number. Now, what was that for? Well, every month he has to write a letter to the parole board. That's sweet of him to remember. Say, Harry, that's a nice bunch of boys Abe has here. Yes, they are. They all came in calf, which they drove. Oh. Hi, Jack, since I am taking Don Wilson's place here, is it all right if I say my little piece now? Oh, sure, Harry. Go right ahead. I've been waiting there. Ladies and gentlemen, if you're looking for an economical dessert, be sure and go to your nearest grocer and ask for a package of jello for heaven's sake. Jello for heaven's sake. It comes in six delicious flavors, strawberry, raspberry, cherry, orange, cherry, and strawberry. What happened to lemon and lime? Oh, yes. Lemon, lime, strawberry, raspberry, and cherry. Now orange has disappeared. Look, let it go, will you please? Oh, no, oh, no. So insist on genuine jello. Look for the big red letters on the orange. That's on the box. Poor Don Wilson.  Oh, well, thanks anyway, Harry. You tried. Well, what do we do now, Jack? Well, Harry, if I was in Hollywood right now doing this program just about this time, Mary would walk in and say, hello, everybody. Hello.  Well, Kate, you couldn't have walked in at a more opportune time. Am I glad to see you? I'm glad to see you, too, Jack. Are you having a good time in New York? Oh, wonderful. Kate, you know Harry von Zell. Oh, sure. Hello, Harry. Glad to see you, Kate. And this is our temporary maestro, Abe Lyman. Yes, I've met Mr. Lyman before. Sure. Hello, smithy. Abe, don't mind him, Kate. He's a little on the rough side. That's all right. We'll get along all right, Jack. Hiya, slat. Well, I'm glad you're taking it the right way. And I must tell you how much I've enjoyed your programs, Kate. They've been grand. Thank you, Jack. By the way, Mary told me that as soon as I saw you, to give you her love, and a great big kiss. How about Phil Harris? There you go, just like the rest of them. No, Kitty, what do all you girls see in Phil? Well, he's handsome, charming, suave. Debonair. Debonair?  Well, I was reading a book one day and stubbed my eye on it. I thought so. Well, anyway, Kate, how about that kiss Mary wanted me to give you? Now, come on, come on, Kate. None of your lip, Benny. All right, but you don't know what you're missing. You know, Kate, I'm a leading man in Hollywood. Well, I'll see you there sometime. Today, you can always find me on Vine Street right in front of the Owl drug store. Say, I meant to tell you, Jack, Mary sent me a letter yesterday, and it's all about you. Do you want to hear it? Oh, no, don't bother. Yeah, let's hear it, Kate. Come on. Oh, it's probably nothing. Well, here it is anyhow. Dear Kate. I'm glad to hear that you're taking my place. But as this is the first time you've ever worked with Jack, there are some things that every girl should know. It starts out bad there. If Jack asks you out to dinner and tells you there's a marvelous floor show at the automat, don't fall for it. Isn't that awful? However, if you do go out to a nightclub with Jack and he asks you to dance with him, say no, as he'll want to roll up his pants and do the minuet. That's very funny there.  That's a sweet ending, anyway. Well, Kate, you are going to sing a number for us, aren't you? You bet I am. Would you like to hear, this time it's real? Yes, sir. Abe, give Miss Smith a melodious background with feeling, harmony, and a nice, smooth rhythm. Oh, you mean I should be debonair? Yes, and tell your guitar player to put his shoes on. Sing, Kate, debonair, yes. Sung by Kenny, sung by Kate Smith, accompanied by debonair and his orchestra. And, Kate, I must say that you're saying just as good for jello as you do for Calumet baking powder and swans down cake flour. Gee, a double feature there, huh? You know, Kate, I would like to reciprocate in some way. Is there anything I can do for you while I'm in town? Oh, no, Jack, thanks just the same. But you've been so sweet, Kate, I insist. Well, all right. If it'll make you any happier, you can buy me an ermine wrap. Well, I'll do that. And now, hey, wait a minute, you mean real ermine? Well, Kate, I'd run right out and buy you one, except today is Sunday and every place is closed. I can get one of my boys to open the store for you. Don't worry about it, Kate. I'll make up for it some way, you know. Oh, pardon me. Hello, Kenny. It's Kenny Baker. Well, Kenny, how are you, kid? What? No, no, Kenny. She's not taking your place. Look, Kate Smith is a star on her own program. What? Why doesn't she stay on it? Now, Kenny. I'm sorry, Kate. Now, listen, Kenny, I don't want to discuss it with you any further. I'll see you when I get home. What? Yes, yes, I'll bring you one. Now, hang up. Goodbye. What a kid. What does he want? Oh, the little copycat. He wants an ermine wrap, too. I hope what he said didn't offend you, Kate. Oh, no. I think he's one of the cutest little brats in the world. Yeah. Good evening, Mr. Berry. Were you looking for me? Yes, Rochester, just a minute. Well, goodbye, Kate. And thanks again so much. Thank you, Jack. So long, and it's been a pleasure. You're welcome. Well, Rochester, I haven't seen you since we got off the train four days ago. Where were you? I've been weekendin' up in Harlem. We had a gin barbecue. I had to do all my own unpacking. What do you think I brought you along for? You didn't say. It's supposed to be working for me, and you spent all your time in Harlem. Suppose you went to all the hot spots. There ain't no cool ones there. Look, Rochester, go right over to the Waldorf Astoria and straighten up my suite. Did you move from the YMCA? Rochester, I just went there for a swim. Now, run along. What do you say, Sean? I wonder if I could have an advance on my salary. Look, I already gave you an advance. I want something in advance of that. It's $5. Could you, uh, $8.50, what for? I promised to buy my gal a sun lamp. Giving Tuesdays, I'll be sure to be up at my hotel. But, gentlemen, I'm certainly surprised to see so many of you in here. It's not raining outside, is it? No, it's not raining, Fred. These people are all here to see me. And you're not, uh, giving away dishes or anything? No, sir, it's just me.   Now, wait a minute, Jack. Before we start this punchin' Benny show, there's something we've got to straighten out right now. What's that, Fred? I'm not going to open my mouth on this program, except to yawn, until you give me what you promised me. What I promised you? You know, don't play possum, Benny. Now, hand over that Boy Scout knife. I knew you'd remember that. All right, here it is. Wait till I take the chain off. I want the knife chain and everything that goes with it. Oh, I suppose you even want this else to.  Well, here's the knife, Fred. Take it and consider our deal closed. Now, wait a minute, you're not rushing me into this. I want to see if it's in good condition first. Ah, here's the big blade, here's the corkscrew, here's a fingernail file, there's the ping-pong paddle, there's the bottle opener. Hey, what's this thing here? That's a folding bed. Are you satisfied? Well, I guess it's all right. Say, Jack, have you, uh, my mood changes here. I see. Jack, have you, uh, have you? Well, the strips can go from now on, I say. It's too late, it should have gone before. Have you been having, have you been having a good time in New York? Have you seen any shows or anything? Yes, Fred, I saw the Ed Wynn show, that was swell. I saw a George M. Cone show, that was grand. And then I saw your picture. Well. Well, what about it? Nothing, Fred, but if you got paid for that picture and I think you did, you should split 50-50 with Sandy Claus. Now, look, Jack, if you were referring to that screen triumph, Sally, Irene and Alan, that picture. That picture? The studio forgot to put me in it. I just put myself in it. That picture is funnier than Don Wilson thinks you are. Is that so? Do you ever hear yourself enjoy you? No, but I'm having my mirror wired for sound. I'll get around. You're jealous, that's what's the matter with you. Yeah, that's why I made a picture last year called Artisan Models, that was a sensation. I got 85 belly laughs. I'll say you did. You should have pulled in your stomach too, it was terrible. My stomach had nothing to do with it, it was my performance. And at least I photographed well. Oh, I suppose I didn't. Listen, Fred, I saw a sweepstake winner in a newsreel yesterday that looked better than you did. And he was selling fish at the time. Artisan Models, what were you in that celluloid omelet? An artist or a model? I was an easel, Smarty. An easel? Yes. Look in a weasel, play an easel. Now listen, Fred, just out of a swell twist, we should have said a schlemiesel, that would have fixed it. Yeah, it would have been better here, yes. It would have helped here. Well, might as well do it now, as long as we're here. Now listen, Fred, listen. Shall I slice him down, Mr. Benny? Never mind, Rochester. Oh, now wait a minute, who is this swarmy here? Swarmy? I'm Mr. Benny's butler. Butler, hey? Well, listen to me, you Ethiopian jeevs. One more word out of you, and you'll be butling in a shroud.  I ain't scared. That's the stuff. Wait a minute. What is a shroud? A shroud, my untutored friend, is a windbreaker for a ghost. Oh, I'll make way for a coward. Yes, there. You see, Fred, now I'll probably have to get a new butler. Well, hello there, Fred. Well, Harry von Zell, what are you doing over here in the enemy's camp? Well, I came here to help Jack out tonight. He needed an announcer. Oh, is he going to pay you? Certainly not. He's doing it as a favor. Of course, I will buy him a necktie or something, Fred. What do you mean something?  Well, I thought so. Benny, you're so tight, you've not only got the first dollar you ever earned, you've got the guy's right arm that handed it to you. Well, it was loose. Now, let me tell you something, Alan. Let me tell you. Hey, play it out, fellas. You're upsetting me. Oh, are we bothering you, Abe? Yes, we are. Yeah, why don't you two guys be debonair? Debonair. If you say debonair once more, I'm going to ask you what it means. Now, wait a minute. He's not saying debonair. He's got a ventriloquist with him. He's not. But what you're going to ask him what it means, will you know if his answer is correct? Don't worry about me, Fred. I know plenty of big words. Now, listen, you itinerant buffoon. The only big word you know is your right name. Well, what if I did reduce it a little? My right name wasn't so long. It wasn't, eh? While your name was so long, it took 15 minutes to write it in shorthand. And then they had to send the pencil to the Mayo Brothers to recuperate. You should talk. When you were in Vaudeville, they had to put your right name on a rubber marquee. That's Balkanized Slander, Benny. Why, you weather-beaten gargoyle. Hold on there, Mr. B.   One more crack and I'll hit you on top of the head so hard you can tie your shoes with your teeth. Oh, you will, eh? Yes, I will. I'm taking my Boy Scout knife and getting out of here. That's fine. Thanks for coming over, you town-hall Buddha. You're welcome. You walk-heagun whippersnapper. Goodbye. Fine guy. I'm nice enough to invite him up here. What do I get? Hey, Jack. What is it, eh? Here's your knife back. My knife? How'd you get it away from Allen? My flute player bumped into him. Oh, boy, that's marvelous. Thanks, eh? You want his watch, too? Never mind. Never mind. Let's play, eh? So the crowning touch to a good meal is the dessert, the happy ending. Well, that's where Jello comes in, the happy ending for any meal. For Jello looks so festive and tastes so delicious, it makes the ideal dessert for any occasion. And Jello is quick and easy to prepare. Serve it perfectly plain, if you like, a clear, glowing mold of Jello, or garnish it with whipped cream, fruit, or nut meats. It's grand, no matter how you serve it. But remember, only Jello brings you that delicious, extra-rich fruit flavor. Don't accept any substitutes. Get the real thing, the one and only genuine Jello. For the 26th program of the New Jello series, and we'll be with you again next Sunday night at the same time broadcasting from Hollywood, California. And I want to thank Harry Bonzell, Bob Ripley, Kate Smith, Abe Lyman, and Fred Allen for their cooperation. It was a grand gesture. And now, folks, we... Come in. Mr. Benny? Yes? Is the program over yet? Just about. Say, how did you get to New York anyhow? And I hope I land pretty soon. Oh, good night, folks. Who is taken from sunny? This is the National Broadcasting Company.


the only thing where this is probably going to go wrong is if I remember correctly from node, it's not possible to have a shared node, you can only have shared of bin entries, which means that we're going to have to do some unnecessary matching, which is a little sad. Specifically, this is going to be a bin entry, last bin entry iterated over, even though we know it will always be a node, which also means that in our iterator implementation, we won't actually do things like, I guess, didn't we have a as node? Yeah, we did as node, because we know that this must be a node. So we're going to do an expect. We only ever iterate over nodes. I guess that's why it's not traverser. That's why this isn't being traverser. Traverser. So I'm doing something wrong here. Where's my syntax error? Traverser line 35. Great. Finally, formatting. Oh, cool. Hi, Zorin. Thanks for editing Rustation Station episodes. It's really awesome. All right. So I think in theory, that means that this iterator should now work. So here, notice, we don't actually get to use the end here. This is going to be equals bin. But that's fine. We don't really worry about that. Okay, yeah, I think that's good. I think that's good. And in theory here, we could have a bunch of test cases here for this iterator in particular, right? I think where this is going to get complicated is the guards. I don't have a good solution for that. I think what we'll want here is actually a node iter. Yeah, this really is a, I guess it's a bin entry iter. But it really is a node. Why does it do that?  That seems fine. Because that is what it's going to yield, even though it's not necessarily what you, even though we know that they are all nodes. And so this is going to be a bin entry, sadly. And so here, one thing we could do is like, in fact, why don't we do it anyway? Mod tests, we can have like an integration test here, which uses super, super, I guess just create is fine. And here, we could actually set this up if we wanted to. That might actually be the right thing to do is rather than have this do all the inserts, we can just construct the table the way we want. But that would be the rather than this using the flurry, the like top level hash map interface, this could just use the like construct a table itself and then do the iteration, just so we have more control over like, where are there forwarding nodes and that sort of stuff. See, maybe we just want to do that. This doesn't care about things like hashes. So we can just, it's totally fine for us to construct what is essentially an illegal table here. So let's do that. Let's just do that. That seems great. It are empty, right? So I'm going to just create a, I forget exactly what's in a table again. So table, I guess fine, it'll be an old new. Use super because I want the types from this module. And this is just going to be, I don't know, like 16 seems fine. Because it's a default anyway, right? I guess default capacity. No, I want it to be 16. And then we're going to say iter is going to be a bin entry iter. I guess we need a guard. So let's do self. Let's do here use cross beam epic. And we're going to, we're going to construct a new one of these. Didn't we add a constructor to this? We didn't. Great. So we're going to do a bin entry iter. And we're going to do table, I guess shared from table. And we're going to do a guard as a reference to the guard. And then we're going to do assert equals iter dot count should be an iterator, right? Zero. And we're just going to see what happens.  Bin entry. Okay, that is easy to do. Unexpected type argument table doesn't take s. That's lovely. That is lovely. We don't need the s here at all. Because all it cares about are the tables. Oh, that makes me so happy. This, this great. This is great news. Love simpler type signatures. All right, what else do we have? That's a bunch of stuff here. I'm guessing a bunch of it is going to be related to shared not implementing D ref one, one, two. What? Fine. I guess I'll do cargo check first.  Okay, so traverser is not going to need atomic or owned. Well, we are going to need owned down here. So we'll do this and owned. But it's going to more going to be things like here, right? Where it's unsafe for us to D ref bin, for example. And we need to we need to argue why this is safe. This is like the normal that the normal argument we have to make. And the argument here is that she why does this even need? It's a good question why that even matters. Like, how could this possibly be unsafe shared was read under the guard? I guess. Flurry guarantees that a table read under the guard is never dropped until after that guard is never dropped or moved until after that guard is dropped. Right? This is the same sort of safety guarantee that we've been using everywhere, essentially. And my guess is that most of the other ones here are probably going to be the same. What is this index? Right? Table stack index is an eye size. Even though there's just no way it's ever negative. I just do not believe it. But I guess it was we said overflow. I don't want to care about overflow. I really don't. Yeah, I don't believe it. I don't buy it for a second. But maybe I'm just being stupid, but I don't buy it. I don't want to inherit their weird oddities for how this should be. Oh, yeah, that it didn't compile because I mixed use size and eye size. But instead of doing the casts, I'm just going to use use size everywhere because I think I believe that that is the right thing to do. Um, is to not inherit the like overflow behavior from Java. Um, 86 no field length on option table stack. Um, okay, this we can unwrap because of the while let some above while at some.  One, one, seven. This is another unsafe D ref safety is that flurry guarantees that a bin entry read under a guard or it's really just any read under a guard from inside table will remain valid until after the guard has been dropped. I should take care of that. One, three, one is probably going to be the same argument here as my guests. Um, see, this is this is unsafe safety. Flurry only deallocates after guards guard drop. And we really could use this for like all of them. All of those in this file at least are really just relying on that same, that same safety guarantee on 33. Take value of method bin. No bins. That's the one 145. This is going to be the same thing where we're going to do that. A match unsafe bin D ref. And this is the same safety guarantee 148. Here, here we have to make the same safety guarantee that for the other place where we follow moved. So if you recall in lib this one. Yeah. So the argument there. In fact, the argument here is the same as the one for why following moved here is safe as for following moved in bin entry find, which is that we still hold a reference to the top level table. Um, and, uh, since that hasn't been freed, nothing, nothing later than it has been freed either because we haven't dropped the guard that we used to read the top level table and 49 actually, this is another thing that's kind of stupid. We need to keep the table and that needs to be passed as a shared down here. I think because it can't, I guess the table stack in theory could store references instead of shared probably, um, but it wouldn't be able to restore them. So, um, in fact, one thing we could probably do here, let's, let's finish it with shared first, but I think we could probably make this a regular reference rather than a shared. And, uh, same with this, in which case we could even make it a node. In fact, how about we just do that? So this is going to be a reference to a table under that guard, right? Oh, I guess we can, that's fine. We can take a shared here, um, and then do like this. Oh, I see. No, this can just be an option table. Is the real way to do this where we're going to say that, um, table Len is going to be this or a table is that, and then we're going to return some table and table bins Len. And that's going to be table. That's going to be Len. And the reason for this is because that we already established the, the fact that we're allowed to deref these shards when we access them. And because the guard, because we know that the guard is out living, uh, this iterator, uh, which this mean this can be now, uh, we already know that all of the references that we deref are going to outlive this guard. As we store this guard in the iterator itself, um, these can be stored as references because they're going to remain valid for the entire time. The reason we want this to be a shared is because it's going to be read out by the caller. And that means that it might be null, right? Like for example, if the table hasn't been allocated yet, and we want to keep that interface. So we're just trying to be nice to the, to the caller. But everywhere else here, these can just be node, node. In fact, it means that this can even yield these because the guard again, remember is tied to the iterator. So as long as the iterator lives, as long as the iterator lives, the guard lives. And this returned thing is tied to the lifetime of the guard. And so it's fine for us to return them, which even means that even if you drop the iterator, this is gonna, this reference is going to remain valid because it remains valid until, until the guard is dropped. It is independent of the lifetime of the iterator, which is what we actually want. Which also means that this can be a reference. And it also means that this is really a none. It also means this unsafe can go away. And here we're going to need, this is going to be next. And if next.isNull, then e is none. I guess we can just do let e, we can just do e is, if next is null, then e is none. Otherwise, and this is going to be just another D ref, right? Where if it's not null, then we're going to have to an unsafe next.d ref. And the safety here is again that flurry only, the flurry does not drop or move until after guard drop. The move is important here because if it could move, then that would also invalidate the pointer stored under the shared, right? And then this is going to be a sum. And the next here we also know is going to be a node. Because only nodes follow nodes. If, and now this becomes, if let sum e equals e, self.table this no longer has to be unsafe because we already do the D ref in the constructor. This can now just be a straight up self.table. This does have to have an unsafe because here we're getting another shared bin dot D ref. But then we can match on the bin just fine. That's fine. I guess this is really, these can probably all just be represents star. No, they probably can't be actually this probably does have to say dot D ref. Um, and then prev is going to be none now. It's no more of this shared business where we can avoid it. This is going to be if let sum prev is self prev. And I guess this doesn't even need to say this because it's already, it starts it as none. So we can just say if not next is null, then this then is this. Let's see. What else do we got here? That does have to be unsafe. That does have to be unsafe. E can now be set to node no longer need the E to just refer to bin entries because the reason we couldn't before is you can't construct a shared node or you can only construct shared bin entries. But now that the references it's fine. Um, okay. That makes me so much happier. Let's see what this looks like. Oh, I mean, it's going to, it's going to complain, right? Now this, we still need to import node into here. Should make it a little better. Line 45 prev is now also going to be a none 89. It's going to be s dot table. It's going to be some of s dot table. So the, I guess really for this iterator business to work, like this has to be option table because it could be that the table stack is generated over. Okay. So the thinking here, first of all was table can be none, right? If it hasn't been allocated yet, but I don't think you should construct a table stack on something that isn't allocated yet because you wouldn't see any forwarding nodes. So technically this should actually, you should never be able to construct a table stack where the table is none. And so really this should be some is guaranteed to be and here where we call push state where is our push state up here. So this is an is none. This is an as ref unwrap and down here, we actually know that this is is none in if above, right? We know that this is some because of this is none up here. And so therefore we can operate on it. All right. Let's see what that gives us 45, expected node. Prev. This is also an option because there might not be, there might not be a previous node that we've iterated over. Are we at now 94? This is just getting rid of the reference. You know, it probably doesn't matter there either. 121. Oh, this is just bad parenthesizing of me 94. Yep. This now is just not a thing because remember here, this is where we set when we're storing one of these stack is like table stack that we use to keep track of how deep we are. We use this at the table to none, which is what the Java thing did to get things garbage collected, I assume, whereas for us, that's now a reference. And you can't set references to none. They need to always be valid. But I don't think there's any reason why this wouldn't be. So I think we're just going to do that. And then 130 is going to be that. All right. How are we doing 151? Oh, I see. This is a raw pointer. It is not a, it's a raw pointer. It's not a shared and 151 expected option. Right. I expected table found star. Now I see because this is going to do a match by reference is why. And 56. Can I borrow s dot zero is mutable as s is not declared as mutable. That's fine. Nice. All right. Now let's see if this test actually does anything. So here we're going to do a node iter. With a shared from that table. Let's test the lib. We need atomic and we need shared. Wait. How do you go from a, from an own to a shared? Isn't there into shared? That's fine. Although I kind of wanted to. This consumes self, which is a little sad. But, but I guess what we can do here is table is table dot into shared with the guard. And now this table can be passed in here. We assert on it. The iter is dropped. And so now we can do table dot into owned. Actually, I don't even need that scope. And the safety here is nothing holds on to references into the table anymore.  Great. And cannot infer key type. Fine. Key type is going to be use size. Ooh, segmentation fault and valid memory reference. All right. So something here is broken. I guess actually there's there's an even simpler test here, which is we don't even do this. We don't do this. We just do shared no. Let's just make sure that that actually works. Right. Like this is just super straightforward stuff. And I guess we need a type here as well. That's fine. All right. So at least that works. So this is like iter new and this is iter empty. Right. Notice that they're different. This one has been allocated, but all the bins are empty. Whereas this one is like a complete blank. And my guess is that the seg fault occurs up here where we need to check if bin is null. Then what? What does it do? It only executes this whole business. It's just going to loop. I think this code gets executed even if the current bin is null. So we actually need, we need these lines to come down here. And then this is going to be if not bin is null, then we're going to do this. And then we're going to do that. Nice. Okay. So we now have an iterator that iterates over nothing. So that seems helpful. Now let's see if we can get it to iterate over something that's relatively straightforward. Iter simple or something, right? So here, what are we going to do? Well, I guess here there's going to be a bin entry node. All right. Remember here, we're not actually constructing a valid table necessarily. All we're doing is constructing something that can be iterated over. Node here is going to be hash is going to be zero. Key is going to be zero U size. Now this should no longer be necessary. Value is going to be atomic new zero U size. Next is going to be atomic null. And lock is going to be, I guess, mutex new. So we're going to here have to use, I guess, parking lot mutex. And now let's first of all, just check that it gives a count of one. It might very well not expected bin entry found owned like so. This is actually not what we want. We want atomic null bins. And then we're going to say bins zero is that the other one would have created 16 instances of this, which is not what we want expected. All right. This has to be a semicolon. We want 16 of that mutex new of nothing. All right. That crashes drop table with non empty bin. Oh, we're hitting IC during testing. If you remember in our in our lib code, let's say drop table. Well, in our drop of table, we're going to drop all the bins, but we assume that all the nodes have been dropped by the, the like flurry map business. And so we will have to work our way around that. And the easiest way is probably just to provide a helper for emptying bins. So this is just going to be like empty bins of a new table. I have water. Thanks. Good call. Okay. So it's a can be and all it's really going to do is I suppose. Actually, I'm going to make this even easier for us. I'm going to say that in test mode, in test mode, we're going to be really nice and drop the tables. Ah, that's not right either. It's a little annoying, right? Because we don't really have to drop things in tests. But it would mean that if you run a lot of tests, you're just going to like consume a bunch of memory might not matter too much here, but it just feels dirty to not do it. Um, how about we do something like fine, we're going to go back to what I had here. And then this is going to move through all the bins. And then it is going to, and then here, I guess we're going to actually walk the nodes. And this is the same thing the flurry map does, right? Remember the flurry map will walk the table and for each one, drop all the nodes within each bin. It's a little awkward to replicate this functionality here. Like that seems a little excessive. The other option actually is for us to just construct a flurry hash map. Um, but it doesn't seem great either. Here's the actual solution to this, which is, um, Imple, uh, here, we're actually just going to have a private drop bins on table drop bins. That's just going to do the same thing. This boom. And then we're going to do table drop bins. Save great, great stuff. And the reason we want to do that is we can do in traverser. Um, we can do let mute t, t drop bins. And then we can do the same here. That does great. Okay. So now, um, okay. So it means they can iterate over at least one element. And I guess really what we want is, uh, something along the lines of we want to search. I guess we want something like here. E is iter dot next, uh, unwrap. And then at the end, we want assertic, uh, iter dot next is none. That's really what we want to do to make sure that the iterator doesn't yield items that aren't there. And then we want to assert something like the key should be zero. And the value, actually key is zero should be fine. We can make it 42 if we want to, but yep. And then we could make this, we could make this have a bunch of elements, but I think that is relatively uninteresting. The one thing we can do is at least move this to like the middle of the map. It shouldn't make a difference. What we will want though is something like, uh, iter forward, right? This is where it gets a little bit more hairy, right? Where we're going to have one table and then we're going to have a next table. This is going to be deep bins, deep table. So here what we're doing is we're constructing, um, we're constructing the deep table that's going to be pointed to, and we're going to construct the shallow table, which is the one that has just forwarding entries. And here, I guess really what we want is, uh, for bin and bins, remember how when a table is moved, when there's a resize, all of the bins are replaced with these forwarders. But we kind of want to emulate the case where only some of them have. So what we're going to do is all of the ones from, let's say, eight and onwards, um, we want bin to be equal to, let's say, bin entry moved, and that's going to be at, so this is going to be, construct the forwarded to table, uh, and then construct the forwarded from table. And now we want to make sure that it still yields just that one element, right? So you'll notice that bin, uh, bin eight is going to get forwarded, right? And so in theory, it should arrive at this entry in the deeper table. I guess we're about to find out. Uh, this needs to be a star. And 261, this should say deep table. And I guess actually here, this is going to be deep table drop ins. Can't compare U size with I 32. Why does it think the key here is I 32? Interesting. Well, and this does need to be mute table. That's fine. Great. Okay. So it does follow forwarding, right? We're constructing the iterator over the, the top level map, and then it follows the forwarding record and returns the one at the bottom. Okay. So now we have like a low level iterator test. And now finally, we can go back to the original test we were trying to implement. Uh, this is going to be bright again, um, which is this, these map check tests.  How did I, it's going to include the formatting business. Yeah. Add source, iter. So here, what we want, I guess, is, uh, we added node, iter. This ad contains key and the formatting. I think we can get rid of at this point. All right. So now it's time for us to try to port the first of these concurrent tests. And that's going to be map check. Um, and I think what I want to do here is I want to make their tests, uh, like Java or I guess upstream JDK JDK JDK is good. JDK, uh, map check dot RS. And so here, cause I want these to map onto easily map onto the, the Java tests, if possible, right? Uh, so I'm going to use the same imports as I used over there. Um, and now we're going to have to figure out what to do to this file. And to save all of your eyes, I'm going to actually, no, that's not how I'm going to do it. That's not how I'm going to do it. I'm going to raw. We're going to do map check dot Java. There we go. That way we don't have to switch to this all the time. And I'll go over to somewhere darker. Um, okay, main, uh, new map. Okay. That's fine. Run test force, mem. T one, I'm guessing is test one. Uh, how are these even run? How weird. Oh, the setup of this file is awful. Um, okay. I guess the idea is that T one is a particular test that they're going to run with things that are absent and things that are not. Okay. That's fine. I can do that. Why does it run multiple iterators? But all right. T one, just, just, just go with it, man. This is going to be a static string name and use size. It's going to be a flurry hash map. Who knows what the types here are. Object. G. Thanks. What calls test? Run test, s test, test, s. Key. Okay. Run test. Map, map class. Map class. New map. Okay. What does a new map do? Map class. New instance. Okay. What is the key type? New object. I see. They're actually not even using a specific type. They're just using the object type. That's chickening out. It is true actually that like we could make all of these generic over the key and value. And because we can, we will. Because why not? Awful stuff. Awful stuff is what it is. Uh, t, t1. Great. Um, okay. So key. This should say keys. It's not key. They're lying. Is a vec of k and expect is a use size. Sure. If you say so. Uh, let sum is zero. Let itters is four. They do timers, which we're not going to do. Although my guess is they probably uses for benchmarking as well. I'm just going to ignore the benchmarking aspect for now. For j in zero to itters. Uh, for i in zero to n. Why are they doing plus plus j on one? And then I want if map dot get, uh, map dot get keys. I is some, this is where we probably want to overwrite, um, the square bracket operator on the map, just so we don't have to call the get method. So we could totally clean up the API for this a lot, right? Um, is some then some plus equal one. I can think of such better names for these variables, uh, time adult finish. And then at the end cert equal, uh, sum and expect time itters. All right. We have ported t one. I'm going to, um, set up the structure around it to before we start porting the other teas. Okay. So they then have a fn, uh, test. Great. I don't think I want that. I think I want a test t one present, which is really get present. Let's use sane names for these. Uh, and that this does size s key size. Okay. So there's some notion of like a set of keys. Do they run tests multiple times? Yes, they repeat the test multiple times, but with the same set of keys. What an odd way to run these tests, but okay. Um, this is going to be a let, uh, size s key. Okay. So the call to the call to test is they do let size. Okay. They, ah, they shuffle the keys. That's how they differ with each repetition. Um, maybe this would be good for a macro. Actually, um, is keys dot Len, uh, don't care about the start time. Okay. So there's a, it's like a let keys is equal to a vector of some form and that vector is of size. Where does size come from? Sure. Why not? Num tests. No, I refuse. Uh, size is 50,000. Uh, where does absent size come from? Okay. So they have const size is going to be 50,000. They have const absent size, which is going to be 117. Um, and then they really have a, this is really a macro rules. Uh, something like stress, maybe, which really just takes the name of a testing function. Well, let's write it for one person and see what comes out the other side. Uh, let keys is going to be some back. Then there's going to be a key start shuffle, which means we're going to need R and G stuff. Let's do that in a bit absent. I is new object. Why do they even have an array of absent? This variable is not used. Oh, it's a awful, awful stuff. Okay. So they have a vector of absence, which are just objects run test size is keys.len. And then what else does tests do? The keys are just basically random numbers. Because, um, so in, if I remember correctly in Java, objects are hashed by their pointer, which is sort of kind of random. And so what this is going to do is it's going to give you different objects each time. Um, so really this is going to be something like, um, a zero to size map nothing, uh, like grand sort of collect. And there's an argument for like, you could shuffle it if you want to, but now that it's random anyway, it's like not clear. It matters. Um, and then this compute size again, because of course, why not get present is then passed in. Why is this a separate parameter? Isn't it always just the length of the third field? It's definitely always just the length of the, the number of keys. Like they say size equals key dot length and absent size. If we recall, absent size is just the size of absent. So in all these cases, the first argument is just the length of the third argument. Right. Am I missing something? Certainly for T one. So this is not going to take an N. It's also not going to have a name. It is going to take a keys and it is going to take an expect. And then this is just going to be for key in keys. And then this is just going to be key. Great. That is much better. That makes me much happier. Now get present is going to do that. And the, as the, is the S actually just empty? Nothing populates the S right? It's just new map, which just creates a new instance. Okay. So it is indeed initially empty. And that is presumably why, why does it expect? No, no, no, no, no, no, no, no. Here it actually expects all of them to be present. Where does it fill? It doesn't. Instead, this put test fills the map. So that's why.   So really there's just one test and it's like everything. And the everything test is going to construct a bunch of keys. Then it's going to run a put test, which is T three, because of course it's T three. Uh, and it's going to give so, okay, okay, okay, okay. So there's a map, which is going to be just a flurry hash map new. And T three is going to be given a reference to the map, reference to the keys. And I think that's probably it actually. So T three, bear with me here, T three, why these names? Why, why, it's awful. It's going to be generic over that. This map is actually going to be this and this is going to be this. It's going to take also a map, of course, of K and V. Uh, and it's going to take a keys and it's going to take an expect. Very exciting. And what is it going to do with it? Well, some is null, zero, uh, N. If I recall is size, which is the length of key. It's awful for I in zero, zero to keys, Len. And then if, uh, map dot put keys, I absent, which not entirely clear what this is going to be yet. Absent mask is none. Okay. So expect here is the number of non overwrites. And then assert equals some and expect. Because it's a little unclear what this absent business is. I think, I think this is really just going to be like, uh, none absent size. What an insane way to get absent mask is absent size minus one. Absent size minus one. And this is going to be like, uh, sure, an option of U size of absent size. I'm just going to put absent. That seems fine. Although there's the absent things are all supposed to be distinct.  Um, okay. And so everything is going to run T three with that and keys and expect, uh, expect all of them to succeed. It's going to run it again and it's going to expect none of them to succeed. So this is put absent. This is put present. Then I'm just going to ignore contains. Yeah, let's ignore that for now. Let's, let's do the ones we have. Uh, why is T six different than T one? Why? Why are any of these things the way they are? What an insane way to, I can't find, okay. So T one is going to be given a map and keys. And we're going to expect to get zero and then get absent is going to be still S, but the keys are going to be all the absent keys. I see. So the absent keys, there's going to be some scent of absent keys and there's going to be some set of present keys and we need them to be separate from one another. And so here this is where Java has a bit of an advantage in that they are all distinct anyway. And what we are going to do is this, keys dot shuffle. And here we're going to need an R and G at some point. And then we're going to say key, absent keys is keys zero to absent size and keys is going to be keys absent size and onwards. And I don't know why this is using absent as the values. Any ideas? We were in the test with the same keys, but in shuffled order. Yes, we can do that too pretty easily now. But why is it using the absent things as values? Is that just a way to choose random? I think maybe so. It can't quite be random because we have to be able to check for it later. That's what's going on. Okay, so we're going to go with values. And this is going to be values, I mod values. Yeah, the trick here is we need to fill the map with a bunch of values, but it refers to later check that the right values are there for the right keys. We need to be able to refer back to what the value should be for any given key. Which is why it's using a list here rather than just randomly choosing the values. Okay, let's make all the values zero right now because currently we don't have any tests that actually check that the value is something reasonable. So I think because otherwise we're going to have to like can't actually be zero. How about currently this will only work with you besides 43 and that's fine. Yep, that would do it. And I think the only thing we're really missing now is like we need our RAND is what's the current version of RAND? Current version of RAND is zero seven. And here we want to do RNG is I guess I probably need this, don't I? So we've got an RNG and now we want to shuffle using that RNG. And now if we try that fetch RAND that's fine. And using new object we guarantee that the value is unique as well. Yeah, so this is why for this test now actually the values are all unique. But they're just increasing integers, but they're still unique. Method is never used traverser. That's fine. I guess this can be pubcrate because this will be used traverser. No ditter just to get rid of that warning. The ditter unused import. That's fine. I don't really care about it anymore. But it doesn't actually run. Oh, right for this to work. I need mod rs and I need mod was it called map check? What am I missing? Test JDK. No test target name JDK. Oh, I probably need test JDK mod. Probably has to be test JDK rs for it to pick it up. This seems like a bug actually. This seems like something that should be fixed. Yeah, this is definitely broken file not found from module map check. Yeah, this is very broken. This is I forget what the test JDK map check. This should not be necessary. But it suggests to me that the paths are just completely off. That's too bad. All right. So map check at keys is not an iterator. That is totally right because it's already now a slice put is private. That seems unfortunate. Right. That's because it's called insert. Also this needs a guard. This should say insert. What else do we have? Absent size. This was absent mask. And in fact, these two I'm not using yet. So we can get rid of them. 38. Okay. We need some brackets there. That seems fine. Pretty sure this is valid. Method not found in flurry hash map 15. Interesting size. Method not found. Oh, yeah. This is only available assuming that you follow all the bounds that flurry hash map requires of you. Which is admittedly a little annoying. That's fine. We're going to have the same for T3 except we don't need the value. We need you stand 18. Don't care about the iteration. That's fine. Don't care about arc. Do you care about 34? Nope. 33 cannot move out of keys. I see. I think we're actually going to require that it's copy. Either that or we could have all the values be references. But I think we're just going to say copy instead for now. Hey, all right. I've been amazed actually this dream how everything has worked. Like not quite. There have been some things we've had to debug. But like this is like one of their test cases and it just works. I'm sure there are things that are broken. But like I think this also implies given the tests we've written so far that the implementation is like actually a pretty faithful port. Because otherwise a bunch of things would be broken. Right.  It does these like forwarding iteration works fine. That's pretty neat. That's pretty neat. Not going to lie. It's already we're already like almost six hours in. So I think I'm going to end it there. Let me just commit the stuff that we have. Add tests, start porting, Java tests, visibility issues. There's obviously there's a bunch more of test suites that need to be ported. But I think this is something where it would be great if if like you as the viewers like take a stab at porting some of these tests now that we have the rough framework in place. And just like see if they work. If something is broken, then we should fix it. But at least now we have get insert and iterators. And so that should be enough for you to develop at least most of those tests. And in theory for people to start doing benchmarks. Once we get some more tests, we can set up like CI and stuff on it as well. The biggest sort of feature I think that is missing apart from the ones we talked about very early in the stream of sort of optimizations is support for remove. The remove method I think is not that complicated compared to what we've ported so far. So if you want to take a look at it, I think you should. As mentioned, though, it'll be a while until I do the next stream. I'll still monitor this repository and like try to handle things like pull requests and stuff. But I won't be doing a stream on it for a while. My guess is that the next stream will be like in a couple of months. I don't know exactly. But know that I still want to do more streams. I just need to settle my PhD first. So thanks everyone for watching. Keep like watch this repository and see what happens. And please like consider this project, our project, not my project. If you want to like submit PRs to add CI, improve the read me, improve the docs, like or add tests like please, please do. And I will do whatever I can to actually keep up with whatever you contribute. I hope it's been useful. I don't know whether it will do more streams on concurrent HashMap itself because I think the port is now it's like unclear that a fourth part would teach you that much more about about new topics, as opposed to just more about concurrent HashMap. So take a look at the live coding voting page that that's a good question. Does that even still work? It does. So here you can vote on what streams you want to see next. So feel free to go in there and vote. I'll post the the link in chat. The repo I think was linked above. It's just on github johnhoo slash flurry. I don't know if that's a name that will stick, but I'll post it into chat as well. And yeah, so vote there for the upcoming stream idea that you want to see. And whenever I end up streaming next, that will probably be what I'm doing. I'm also giving a couple of talks in February that I hope will be published online. And so I'll tweet out links to those when they are. Same as with this episode. As always, the recording will be up just. Yeah, just feel free to follow me on Twitter and then you'll see any of these announcements. Great. Thank you for watching. It's been fun. And I will see you the next time I stream. So long for you.


Welcome folks. This is Tom O'Brien of TFNN. We have 5 days a week. We go 7 hours a day. We go 24 hours a day on the internet at TFNN.com. Always remember folks, whatever you think about, you bring about whatever you focus on grows up. Everyone's having a great day, safe day. It's making a great night, folks. Don't make assumptions. Don't know. Don't take anything personally. Your truth is personal to you. Your own opinions and point of view reflect your own agreements and are personal to you. It's no one's truth but your own. Mockin' wise! Let's take a look at it out here. We have the Dow Industries trading up 53. Nasdaq's up 113. S&P's up 17.5. Gold. Gold contract up $3.50. Trading at 2004 an ounce. You get silver up 24 cents. $24.83 an ounce. Late sweet crude up 85 cents. Trading out at $79.59 a barrel. Notes and bonds. Ten year note. Down 14 ticks. Trading 111.20. The 30 year down 19 at 125.18 and King dollar. King dollar right now. Trading, where is she? There it is. Trading flat at 101.355. The euro is at 110. The yen is at 141. The British pound is at 128 to 1 U.S. dollar. iPhone numbers<PHONE_NUMBER>. Give us a call folks. Want to know what's going on in your world and the world of the S&P's. Let's take a look at them. What do you have? Well, we go over to the spy first. You know, took out the high from about a week. Well, just about a week ago, right? Let's take a look at this. Yeah, about five days ago. That high there that was generated on the spy is 456.43 and we did 456.73. Right now, you're at 456. The contraction is pretty dramatic. We got 35 million shares and we had reached the high with 65 million. We'll see how this next 30 minutes, I mean, 60 minutes go, but the bottom line is that you're up there with like volume. You're going to have the Fed do the announcement at two o'clock tomorrow. We're going to have Microsoft and Google come out with the numbers right at the close, after the close, but literally Microsoft and Intel, I mean, in Google, the way they do it, they come out right after the close. Now, if you take a look at the futures, this is kind of intriguing that we missed the highs just by a spec. You know, the high was 4609.25. We hit 4608.75.  We'll see how this baby shakes out. Right now, you're on the second one, but that was a quick sell down. We'll see how this shakes out. Now, you can see what it was doing. If you're watching Target TV, you're going right into that monster bar. So you'd have to get below 4598 in order to basically say that you're going to get to lower price, because the top of that bar we got into, which is the 4602. And that's what we are right now. And, you know, dug into it, but that's a long bar, man. So the bottom of that bar is that 4596. We go to the NQs. We'll first just look at the Qs. We take a look at those Qs. And the Qs, you know, you've got 27 million shares. That 27 million is going to 71. So, but bottom line on the top. And then if we go to the NQs, we take a look at the NQs, which we're going to see. That's interesting with the NQs. See, it's interesting. You know, it's interesting about the NQs, too. The NQs didn't have the big bar that the S&P had to get that S&P going, you know, because that bar came in at, what is it, 1,300 hours. That's one o'clock. And the bar, this is going to be intriguing, man, because this is saying that the Nasdaq's going to, basically the Microsoft and Google just aren't going to come in, because this doesn't have it, which is really unusual, actually. Gold. Let's go take a look at the gold contract. Gold contract rejected lower price out here again today. We take a look at the gold contract.  You're inside the higher range now. You're at $3.80. Your trading out is 2004. We get over to the dollar. We take a look at the dollar. It's going to be, that dollar is going to be moving on this statement tomorrow. The take is that we're going to get the aspect of a, you know, quarter point hike. The real question is, is that what's going to be in the statement? And what the dollar had just done, the dollar just did a 50% retracement of the last move down. Now, listen to this. This is pretty cool. If you're wondering, you know, we had talked about Michael Wilson from Morgan Stanley before.  And he threw, I talked about this yesterday, that he threw in the towel, right? Well, listen to this. This is wild, man. When I was listening to this this morning, that, let me get this, I got to put this back further so you can see how this works. Because this is a trip. This is quite a stat. And this is what I was talking about earlier, that not since 1929, folks, okay, when the market has done more than a 7, 6, 7, 6.8 retracement of the low, not since 1929 has not that market gone on for another bull versus taking out that low.  It's quite a stat, though. So this is going to get really intriguing watching this whole thing shake out, man. So we'll see where it's going to go. But that's quite, that's quite a stat. Yesterday, you know, when he was basically thrown in the towel, I'm saying, this is intriguing.  You know, I, and I'm suspecting, I'm actually suspecting when I heard this this morning on Bloomberg, when they came across with that number, that that was, you know, one of the things he was looking at saying, okay, man, the retracement is so big that the bottom line is that, you know, we think he thinks at this particular point that, yeah, you're going to get a pullback. But what that stat says is that you're not going to go take out that low that was established. Hey, but guess what? Stats are stats. That's the bottom line. Let's get over and take a look at Google. So we take a look at Google. Google right now. Not much action, man. You know, yeah, I mean, Google has action on the way down. It's up 159, but that action is on the way down. Microsoft has been on a tab, you don't believe, I mean, this is something else for sure. The real question is, yeah, Microsoft, Microsoft, they're from ballgame. We probably got a ying and a yang after the close. Stay right there, folks. We're going to come back with our man, Mr. Tim Mord. We have the dial industrials trading up 68 dazs, except 125. S&Ps are up 20. We're coming right back. Currencies, commodities and bond markets are as important as ever right now with how they're driving the volatility in equity markets across the globe, which is why it's a great time to try out Teddy Kegstad's Tiger Forex report. Teddy Kegstad breaks down the forex markets every Monday using his 30 plus years of experience as a trading veteran of futures, forex, stocks and options. Teddy releases his weekly Tiger Forex report every Monday morning with coverage of all the major currency pairs, including the dollar index, the euro dollar, pound dollar, dollar Swiss, dollar yen, as well as many more. And he also has weekly coverage of the crude oil market.


You can't talk about Ghouls and Ghosts for Sega Genesis without comparing it to its 16-bit contemporary, Super Ghouls and Ghosts on Super Nintendo. So what's the difference between the two games? There's two major ones I'll point out. It should be mentioned though that Ghouls and Ghosts came out two years before Super Ghouls and Ghosts in 1989, pretty early on in the Genesis lifespan, so it's a little rough around the edges compared to the SNES game in terms of visuals and sound. In fact, I don't blame you if you wanted to compare this to Ghosts and Goblins on NES instead, but since SNES and Genesis are kind of my thing, I'll stick with just comparing those two. The gameplay is as you'd expect with two big differences. Number one, you can throw your projectile up in addition to left and right. That might not sound like that big of a deal, but in a trial and error game like Ghouls and Ghosts, it is a major aspect that gives the game a completely different feel from the SNES game to the point that the level design is decidedly different, which is of course a good thing. Since it takes that extra mechanic into consideration and makes it feel very useful instead of just something different for the sake of being different from the SNES game, there's even a level here that almost feels like a vertically scrolling shooter, so that's pretty cool. The second major difference is that there's no double jump here like there is in Super Ghouls and Ghosts, so yeah, another reason why vertically shooting is a good idea here because at least you can clear a little more real estate to allow jumps to be a bit easier. But yeah, other than those two differences, the gameplay is about what you'd expect. You still have to beat the game twice, sadly, and you still have to use a special weapon to defeat the final boss, Bummer. The most frustrating thing it has in common with the SNES game is how freaking hard the very first level is. The key is to just keep moving. If you stop for a second to take out an enemy or if you dare turn around, you'll be swamped with enemies in no time flat. Most of the weapons are the same. There's the lance, the axe, the knife, the torch, but there's also a disc that floats close to the ground and a sword that's only used for melee combat. That's not a projectile. Later on your second go-round, you have to get the Psycho Cannon, which is this game's version of the goddess bracelet, and all the armor upgrades are here as well. Ghouls and Ghosts does ease up a little after that insane first level, but not too much. The difficulty you'd expect from a game in this series is definitely here, no doubt about that. Seems like there's a lot more checkpoints here though, so that makes the game a little more forgiving than the SNES counterpart. There's also a cheat code here that allows invincibility. Hey, that sounds sweet, right? Yeah, this game is still really hard, even with the cheat code, because the platforming here is really tricky, especially without the double jump if you're used to the SNES game anyway. At least there's unlimited continues. I will say I think Super Ghouls and Ghosts is just a bit more polished. Well, of course it is, it's two years older, but I mean more polished beyond the graphics and sound. The enemy design is a little less ruthless with patterns that are easier to pick up quickly. Super Ghouls and Ghosts is a little more of a pure puzzle platformer, whereas Ghouls and Ghosts almost feels like a shoot-em-up at times, with the amount of enemies you're swarmed with. Plus the Arthur sprite is bigger in the Genesis game, and that makes you a bigger target, and that's no fun. But hey, that's definitely not a bad thing. Ghouls and Ghosts is definitely worth playing today. It's a really tough challenge with a lot of trial and error, and damn, that first level is so hard. But it's certainly one of the better Genesis games I can remember playing, which is pretty damn cool considering it's an arcade port from 1989. So yeah, if you liked Ghosts and Goblins or Super Ghouls and Ghosts, the Genesis edition of Ghouls and Ghosts does not disappoint. It's a tough but fair challenge that lives up to what you'd expect from the series.