Christian Wenz:
Hi and welcome to a new episode of Adventures in.NET. I'm Christian Venz and with me today are co-hosts Mark Miller and Adam Furmanek.
Mark Miller:
Christian,
Adam Furmanek:
Hello folks.
Mark Miller:
I think we should be called co-adventurers, not co-hosts.
Christian Wenz:
Co-adventurers, I haven't seen the latest Indiana Jones yet, so I don't know whether an adventurer is a positive or negative thing, so I try to stay
Mark Miller:
Okay. All right, we'll put that
Christian Wenz:
neutral.
Mark Miller:
on the table till we've seen the movie.
Christian Wenz:
Okay, okay, we will, we will. And in this episode, Adam would like to talk about, well, let me just say without giving away too much, networking in.NET. and how you should not do it. Would that be a kind of sufficient description of what we've planned for today?
Adam Furmanek:
make it a little bit more specific that we are going to talk about network like instant messengers networking this kind of stuff not going down to drivers but yeah you basically nailed it so let me start this run for many years and I was working on a project that which goal was to connect the various instant messengers and make them into one network. I'm talking here about like Facebook messenger, WhatsApp, Slack, Discord, Jabber, XMPP, ICQ, IRC, Steam, and probably could go on and on. I even forgot what other protocols I supported in that project. And the idea was... to basically allow for inter-communication. So the user, like using Facebook Messenger, could connect someone from Google Meet or from Slack channel or whatever else and just share messages back and forth. And...
Christian Wenz:
Actually, I was using a software like that like, I don't know, 15 years ago or even longer. Oh, it started with a T. Help me. Do you know what I mean? It was like it had AOL Instant Messenger plus ICQ plus I don't know what. I mean, most of the things you mentioned weren't even invented back then, right? Oh, it started with a T. Let me look that up, please proceed. But
Adam Furmanek:
Sure
Christian Wenz:
I
Adam Furmanek:
thing.
Christian Wenz:
loved the approach back then, but yeah, I think eventually they gave up because the services
Adam Furmanek:
Yeah,
Christian Wenz:
back
Adam Furmanek:
I
Christian Wenz:
then were
Adam Furmanek:
am.
Christian Wenz:
not that standardized. So they kind of pulled the plug on them.
Adam Furmanek:
Yeah, let's actually go through a little bit of history once you mentioned that. There were many approaches to achieve that. Some approaches were based on like building a multi-communicator stuff, Pidgin, Miranda on Windows or some other applications. They aimed to basically do that, that you had like multiple plugins for different networks. and you as a user could basically have all your favorite protocols inside one Messenger application, right? And that was pretty cool. The problem with that approach or like lack of feature was that, okay, you could message someone from, let's say different networks, like people from Messenger, people from WhatsApp and whatnot. but like you couldn't message someone over Facebook Messenger and that wouldn't be rooted to different WhatsApp icon. Let's put it this way. There was no interoperability between those. And some other applications, for instance, IAM Plus, which was actually a pretty cool communicator, they tried doing something like that, that instead of, that they would let you join various bridges in this way. For instance, IAM Plus application that I was using personally for many years, let you do something like this, that you could receive a message from Skype or from Slack, whatever. And if you were not around your computer when this message arrived, then IAM Plus was mailing you. So you could receive an email, reply back to that email, and then your response would get delivered to Messenger, to WhatsApp, whatever else. which was pretty neat, I must say. And I was using this application just because I was too lazy to configure all those networks I mentioned. And back then, like I really had like 15 or 20 different networks that I was using day to day. And I was just, let's put it this way. It wasn't a fun experience when I got a new mobile phone, tablet or computer and I had to configure all of that. So I decided to start working on a platform that would let me do that. And another note on the historical stuff. Couple years back, something like maybe a decade ago, it used to be way easier than doing stuff like that today. Why? Because 10 years ago, Facebook was basically running on Jabber. Same was Google Hangouts, I think it
Christian Wenz:
Mm-hmm.
Adam Furmanek:
was called back then. Generally, there was a very nice traction around the job or XMPP protocol. It got really popular like 10, 15 years ago, which was supposed to be very extensible. I think XMPP stands for Extensible Messaging Platform Protocol, something like this, which was XML based, which lets you integrate various servers. It was federated, open source, the idea was anyone could, you know, spawn their own server. connect to this big family of Java servers and you could talk between servers. And actually Facebook supported that. Same that Google, Google Hangouts back then. And it was really cool time. You could talk from Google to Messenger to some other networks, very easy. The problem with that, and now it's my speculation, because those networks were like you couldn't make money. out of that they decided to basically close those solutions. Another problem with that was though that there was no standard way of doing like video calls or file transfers between these networks so generally if you wanted to send I don't know like a funny cat video it was a little bit harder on the protocol level but I think they decided to lock those things down just because well they couldn't monetize.
Christian Wenz:
But may I ask a question? Maybe that's too technical at the moment. But so if you have XMPP as kind of the lingua franca that everyone speaks and I'm on, I don't know, AOL instant messenger and like to send a message to a Facebook messenger user. So what is the sender address? And how could that Facebook user reply to someone
Adam Furmanek:
Very,
Christian Wenz:
outside the ecosystem then?
Adam Furmanek:
very good question. If you go to Facebook Messenger and you click on your friend, you will find big number indicating this is like a person ID.
Christian Wenz:
That's
Adam Furmanek:
Yeah,
Christian Wenz:
a Facebook ID, okay, okay.
Adam Furmanek:
so that your XMPP address for that was something like big number at Facebook.com,
Christian Wenz:
Mm-hmm. Okay.
Adam Furmanek:
I think. Yeah.
Christian Wenz:
So it's not displayed when you are within the ecosystem, but with an XMPP Savvy
Adam Furmanek:
Yeah,
Christian Wenz:
clients you could
Adam Furmanek:
yeah,
Christian Wenz:
find it out. Okay. Okay
Adam Furmanek:
exactly
Christian Wenz:
that makes sense
Adam Furmanek:
right. And XMPP had also one additional feature which sounds really cool, but it's terrible to maintain. And this feature is called gateways. Meaning you actually touched upon this topic a little bit. XMPP server lets you build a gateway to some other non XMPP network. For instance, IRC, Slack. GaduGadu, which was very popular Polish network, AOL, ICQ, other stuff. So then if you, for instance, had some user 123 with ID 123 in some AOL or whatever else, it would be represented in your Java server as 123 at aol.myjabberserver.com. So they would mimic those Java IDs inside the network. And then the server would know that, hey, when you message the user like this, server knows who sends the message. So they know how to connect to AOL using your account and deliver it to the user using your AOL account or whatever else. So it sounds really cool. You just start one server, one Java server. and you have gateways to various networks around the planet, to some of them you connect directly like to Facebook, Google Hangouts back then, to some other networks you connect via gateway, works like a charm. The problem arises though, and the problem is maintaining those gateways is actually very, very hard and time consuming. And so those applications that were popular back then, well, they dropped support for various networks. And that's why I decided to implement my own solution entirely in.NET. So the whole idea to implement the solution was I just wanted to replicate and what IAM Plus gave me back then. It gave me connection to Facebook, Skype, couple other stuff. and got me this email notification when the message was, when I was in the round. So I just wanted to build something like that. And I wanted to use Jabber. Why? Because it has gateways. So how hard could that be? Took me two evenings to start an application that was basically connecting to a Jabber server, running emails back and forth, sending messages. And I thought that's gonna be it. And this
Christian Wenz:
I mean,
Adam Furmanek:
is how this
Christian Wenz:
sound
Adam Furmanek:
journey.
Christian Wenz:
sounds trivial, right? It's standardized.
Adam Furmanek:
Exactly right,
Christian Wenz:
Maybe
Adam Furmanek:
gateways!
Christian Wenz:
someone has already started, started like a boilerplate implementation.
Adam Furmanek:
open source, free to use, supported by the community. How hard could that be? And this is how my journey started. Like, I don't know how long that was, six, seven years ago back then. And the application was supposed to be really simple. And now it's grown up to a really big piece of stuff. And just to give you like a little bit of idea how it was supposed to start, how it started, and what I support now. So initially the scope was to support just Java, sending and receiving emails and routing them over the XMPP network. And that's it. It's not like tier one application. If it dies, that's okay. I can just use native client because the whole point was, okay, I don't want to configure a new device, right? Must work on Windows, wasn't using Docker back then, nothing like this. It was supposed to write it like two evenings. never touch it again. And fast forward six years from back then, it now supports things like web, desktop and
Christian Wenz:
Hey
Adam Furmanek:
mobile. It can encrypt messages over text, SMS, or even call me with messages when some important priority contact like talks to me. And I can use it on the airplane without wifi, actually being up there, it still works. I can share files, media, videos, whatever else between networks, meaning that I can send one image to Facebook, WhatsApp, Slack, Discord, whatever, still works. I can call people over like cellular or GSM network. I can actually make a bridge between like Messenger and Google Voice with camera, with voice, with all that stuff. I can schedule messages to be sent later on. I support, my notes tell me I support 30 plus networks. That may still be true. I actually don't use that many anymore.
Christian Wenz:
But Adam, why? Why?
Adam Furmanek:
That's a very good question. And it all started just because I really wanted to have
Christian Wenz:
Because
Adam Furmanek:
this
Christian Wenz:
you
Adam Furmanek:
email.
Christian Wenz:
could.
Adam Furmanek:
Yeah, just because I could, yeah. Just because I could. And the hardest part about that, it actually turned to be tier one service. Meaning that if it breaks, I really get paged overnight. Yes, I do page myself with my private project, which sounds crazy. But yeah, I use it every day and it really works. And talking about the architecture a little bit because we are.NET Podcast, so let's focus on that. Initially, I just wanted to use a Jabber server, that's it. So I just wanted to have one XMPP client, right? But then the problem with Jabber started that, like I mentioned those gateways in XMPP and the problem with those gateways is first they are very flaky. they really lose messages, drop messages, got disconnected, very hard to maintain. Second, if you don't want to pay for decent Jabber server, which is actually hard because there are not so many decent servers anymore, then you don't have a support for networks that you are connecting to, meaning that even if you are happy with some integration to, I don't know, WhatsApp. then this integration may be gone, just like that any other day. So I started actually re-implementing some of those networks, either by using.NET libraries or by using non-.NET libraries, for instance, Java, Python, JavaScript, or then even started like scraping the web the hard way. meaning that I can scrape HTML or I can extract messages over web sockets or I wrote a couple of extensions to Google Chrome just to extract messages from various networks there is quite a lot of machinery behind the scenes but all written in.NET just to support those networks answering your question again because I could and it gave me tons of fun but still a lot of work and many
Christian Wenz:
So
Adam Furmanek:
years
Christian Wenz:
how is
Adam Furmanek:
working on that.
Christian Wenz:
the distribution, so in your personal communication using the tool, how's the distribution between those networks? Is it like you support 30 networks, but 99% is WhatsApp or is that really an even distribution and there's really lots of cross network communication? Because when I use the tool, Mark remind me, it was trillion. And back then I was not using it for cross messaging, but for only having one app with kind of all of my contacts in there. So that was really, really helpful.
Adam Furmanek:
Mm-hmm.
Christian Wenz:
Nowadays, I wouldn't say I have standardized, but nowadays I can kind of remember who is where or who can reach where best, right? But how is that distribution? So of those 30 networks, how many of them, I mean...
Adam Furmanek:
Really good question. And actually this changes over time. When I
Christian Wenz:
Okay.
Adam Furmanek:
started, when I started my main networks were Messenger for most of my friends, Jabber for some of my friends from like my computer science university because obviously programmers, they want to use Jabber, open source, free to use yada, you get the vibe. No one else uses that, but well, we all freaked out. And Skype just to talk to my mom. And I think that was it back then. And Gadugadu, which was Polish network and I had like two friends on this network. So most of that probably 80, 90% was messenger back then and those other networks weren't that used. However, over time it actually grew and changed the traffic as well. I'm rarely using Skype nowadays. Messenger is still probably the main network I use, but it's not 90% anymore, probably something like half of that. The other half consists of WhatsApp, Slack a lot,
Christian Wenz:
Mm-hmm.
Adam Furmanek:
Discord channels quite a lot, and IRC. I was actually very active on IRC at some point, now it's a little less useful, especially that, what was it called? Free IRC, not FreeIRC. Anyway, they migrated to Libera or Libera or whatever you call them now. So generally then people dropped IRC, but anyway, this other percent, 50% is like the distribution of these networks. So this changes over time and like a hopefully one day I'll be just using one network. And if I were to choose, that is actually a very good question, which network to choose, I would probably just stick with Messenger. Definitely not WhatsApp, but I will get to that in a second, right after I explain the architecture. And probably not other networks. However, if I ever go to China, then probably WeChat is something I will need to support.
Christian Wenz:
Makes sense, yeah.
Adam Furmanek:
Talking a little bit about architecture, because we said it's all in.NET. Generally, I won't be going much into libraries I was using, but I just want to stress that This architecture started as like very simple application, one process doing all that stuff, but quickly you realize that, hey, it actually needs to be a distributed system with queues in between. So I actually implemented my own queuing system because I wanted to be low resource user, so didn't want to run rapidMQ. I named the system TQS, a trivial queuing system. And now I should rename it to something like terrible queuing system or whatever. It works, but it's not trivial anymore. But
Mark Miller:
Nice!
Adam Furmanek:
it's the same vibe as with SBT in Scala. It started off simple build tool. Now they call it Scala build tool because it's not simple anymore.
Mark Miller:
Nice.
Adam Furmanek:
So moving on, own queuing system, own NoSQL databases, et cetera, et cetera, and basically spawning a set of processes where each process is just one connector that connects to a specific network. And this connector encapsulates stuff like the library to connect to a particular network or the web scraping logic or whatever else just to get messages back. And now when it comes to implementing that stuff, this is actually a very nice thing around how to connect to a network. It seems like super easy, right? I just take a library that connects to a network and it's all good. But then you realize is not as trivial as you may think. First, those libraries, they really have crazy bugs. I mean, deadlocks, memory leaks, segfaults and other stuff. So generally, I initially started implementing that as, okay, create new thread, on this new thread connect to the network. If something pops up, kill the thread, create a new one, reconnect, right? But then I quickly realized that this is completely not reliable. Why? Because first, You can't even figure out whether your connection is still alive. And most of the libraries, especially now when you use a single weight model, they like you don't have those timeouts anymore. Either you get the exception or you have no idea what's going on behind the scenes. And
Christian Wenz:
Is that
Adam Furmanek:
some...
Christian Wenz:
also one of the issues of the Castrel web server, that kind of you don't have that timeout explicitly set up? Yeah.
Adam Furmanek:
Exactly right. This is like just a pattern. Whenever you use any locking, always use timeouts. Otherwise you get a deadlock. And with one thread, like when you don't know whether this connection is still alive or not, you don't know what to do. But then comes the other thing. Let's say that you realize, okay, connection is probably dead. So I should do something about that. What can I do? I can't kill the thread in.NET because then most likely you just terminate the process. Okay, maybe I just killed the socket, but then if you kill the socket, then you might be surprised that you can't reconnect to the same network from the same process anymore because your operating system will stop you because it will tell you, kinda there is some different deadlocking in network stack? No, probably not. So that's doing any of these. on threading level is just not sustainable. You need to move to processes level. And even if you think about that and distributed architecture, you have the same problems when you talk about like, let's say enterprise ready systems. How do they know whether this other node is still alive? Well, you could do some inter process, inter nodes like ping communication. You could have some watchdog, some daemon, but how do you know whether like your watchdog thread is not slow like crazy or delayed? And maybe the opposite, maybe it's only the watchdog thingy that is still running, but everything apart from the watchdog is already dead. How do you recognize that? And actually, I learned that this even very simple task, how do I figure out whether connection is still alive? How do I build a watchdog? This is a computer science on its own. Really, there are tons of different protocols, approaches, and best practices how to get it right, and it's not trivial, even though it sounds trivial.
Christian Wenz:
So when you
Adam Furmanek:
But.
Christian Wenz:
started, there were no shoulders of giants you couldn't stand upon. Like, ah, there is this open source official client for NetworkX. They must have certainly encountered and solved those problems.
Adam Furmanek:
And here comes the answer, most of the times not. There were some clients for some networks, but most of those clients were kinda open source and you know, passionate based
Christian Wenz:
Mm-hmm.
Adam Furmanek:
or implemented by passionates. And the quality of these clients were, was like, it differs. Some clients were pretty cool, some of them were not. Some of them were like completely synchronous. Some of them were based on like callback mechanisms. So generally having that consistent was very hard. For some networks, there were no clients in.NET at all. For instance, Skype. Skype was actually a very interesting protocol because I think I re-implemented it four times. There was a library, I think I started with something like Java for Skype, then it was like Skype for web or the other thingy, but they were basically Java libraries. And those Java libraries I was running on.NET using, what was it called? Not JNDI, but there was this Java virtual machine implementation on.NET. Let me actually Google that in the background really quick so we can share this name. But anyway, you can run.NET applications on.NET pretty easy because there is this JVM. implementation for that. But the problem with that was that Java has different like exceptions model. Meaning that if you have the exception, unhandled exception on a thread, then in Java it's cool. It doesn't kill you, doesn't change the stuff for you at all. But if you have unhandled exception on.NET, then it takes your process down. So you can't run this thing really easy. And if you are using libraries from like different protocols from different languages, then unfortunately those libraries may simply not inter-operate well with your solution that you're having. So you need to implement like anti-corruption layers for some other libraries and carrying on this Skype topic. So... I started with those two libraries and it happened that the support for them, like the autodrop support, right? Or they simply stopped working just because Microsoft decided to migrate Skype from, like they bought Skype, they migrated link to something they renamed it Skype for web, sorry, Skype for business. Then they merged these two networks together. So you could talk from Skype to Skype for Business and the other way around, I think. And then they migrated it to completely different architecture. So all the libraries were gone and there was no official client for that. So what? So there were other libraries, they tried to use Skype using HTTP based web interface. And this interface is kinda cool. It works, but you get throttling, but sometimes not features are supported. And sometimes it breaks because the message format changed. And for instance, Messenger library, there is a very popular Messenger library in JavaScript world, which doesn't use MQTT protocol, which is like used by the official Messenger client on mobile, but they use web calls for doing that stuff. So sometimes you get throttled and what not. So generally I had to re-implement Skype for times. With WhatsApp, it was also similar because WhatsApp was actively banning external clients. So there was a library that was replicating a regular WhatsApp protocol and emulating very old Android phone. This
Christian Wenz:
Ha ha
Adam Furmanek:
very
Christian Wenz:
ha.
Adam Furmanek:
old Android phone had specifically crafted IDs of the device and protocol version. So the protocol was still working and WhatsApp wasn't banning it. But then it changed and they started banning that so WhatsApp stopped working for me. So I had to re-implement WhatsApp and I used scraping. So now I scrape WhatsApp actually using, first I was scraping just the regular HTML but now I'm scraping the index DB I think and the WebSocket communication which is there. So I... Open the browser, connect over WhatsApp for web to my account, extract the database and translate it to my stuff.
Christian Wenz:
Because the web application is then using indexedDB and basically stores all the messages in and you just watch out for
Adam Furmanek:
and
Christian Wenz:
changes
Adam Furmanek:
important
Christian Wenz:
in that file.
Adam Furmanek:
stuff, and important stuff is web application is provided by WhatsApp because this is WhatsApp web
Christian Wenz:
Yeah.
Adam Furmanek:
interface.
Christian Wenz:
Yeah, yeah, yeah.
Adam Furmanek:
So if they change something, it still works. I just scrape the internals.
Christian Wenz:
Yeah, yeah,
Adam Furmanek:
In some
Christian Wenz:
yeah.
Adam Furmanek:
other networks, you can do similar tricks, but depending on the frameworks you have, you may use different approaches. For instance, I think that lots of like WhatsApp interface is implemented in React. So you can also get messages from React props. If you know React framework, you know the components, the props, you can extract those props using regular JavaScript code. If some other interface, I think Skype was implemented back then, at least this Skype interface that was integrated into outlook.com, it was implemented with Knockout. So you could just get Knockout binding is that get the JavaScript objects with the messages. Some other networks, for instance, Twitter. It's easier to scrape Twitter if you go to mobile version of Twitter at m.twitter.com,
Christian Wenz:
Yeah, yeah, yeah.
Adam Furmanek:
or maybe I should be saying m.exe.com, I don't know, don't
Christian Wenz:
m.exe.com,
Adam Furmanek:
know
Christian Wenz:
yeah,
Adam Furmanek:
whether
Christian Wenz:
who knows?
Adam Furmanek:
it works. Then scraping the full blown web page of Twitter, because the mobile version was like using some, like the HTML DOM. had the message IDs stored and whatnot, and the full blown webpage didn't have that at some point, right? For some other networks, you can just open the webpage and plug into WebSockets and extract messages which are coming over there. For some other networks, you can mimic the WebSockets. For instance, there was this Slack library that was opening the WebSocket and talking to the server just like the regular Slack client. but it required the API key to work. And now Slack changed to OAuth keys and whatnot. So this library, I don't think it works. At least it stopped working for mass Slack workspaces. So generally maintenance and implementation of all these various clients is something that really takes time. It takes time because... It works for some time and one day it just breaks just because they change something in the protocol library or wherever else. And that's why it blow up significantly at least initially. Moving on, so we have our protocols, right? We have some integrations with different stuff. We have some queuing, we have some distributed system, NoSQL database that I implemented and other stuff. Now comes the question, okay, how do you implement an interface for that? Because initially I wanted to have just emails going back and forth. But then I thought, Okay, I have emails. How about sending text messages? How do you send a text message to yourself? Obviously without paying for that because we want to be this open source and cheap. And actually the trick that many applications use nowadays and it's not just me, other applications is the same, is two factor authentication. So you... create an account wherever, Twitter complained that people use it like this. So you create an account in Twitter, you hard code your username and password and when you want to send yourself a text message, you just emulate browser with CURL or whatever else that you enter email, password, click login and then you need to confirm that with second factor authentication, right? So we get the text message. You have no idea what's going on, but you get a notification kinda, right? And this is actually a very nice way you can extend that to even getting a phone call, because like you can get a second factor via voice call, right, so Microsoft, Twitter, GitHub, they can call you if you just select proper things in CURL. And multiple applications, they use that, which is abusing the service obviously, but hey,
Christian Wenz:
Yeah,
Adam Furmanek:
you
Christian Wenz:
and
Adam Furmanek:
can do
Christian Wenz:
isn't
Adam Furmanek:
that.
Christian Wenz:
that like a binary thing? I mean, you get the two factor of text message, but the only information is that you got a text message because you
Adam Furmanek:
Exactly
Christian Wenz:
cannot really
Adam Furmanek:
right.
Christian Wenz:
use the code in there, right? Or add additional information.
Adam Furmanek:
Yeah, you can't control the body of this
Christian Wenz:
Yeah,
Adam Furmanek:
message.
Christian Wenz:
yeah.
Adam Furmanek:
So it works as like a notification that
Christian Wenz:
Yeah.
Adam Furmanek:
something happened, but you don't know what's going on around, right? So if you want to get a regular texting messages, obviously there are services for that, like Twilio and other stuff, right? You pay like dirt cheap and you get the messages. But now comes the question. Okay, so we started with the very simple interface, which was emails. Now we would like to go with text messages, but one may ask a question, are text messages secure? Are emails secure? Emails you can get secured just by using public infrastructure obviously, but for text messages you get like a question whether they are encrypted and whatnot. And unfortunately, it's super easy to decrypt messages when they go over the wire or over the, right? So what do you need to do? You need to implement your own encryption and then you start sending text messages which are encrypted end to end, so you can get that secure. And you may be surprised, but sending messages like this is illegal. Why? Because texting, text communication, SMS, is legally allowed only for human to human communication. So if you send anything that is base64, not even encrypted, but you know, hashed or whatever, you are breaching the law in some countries.
Christian Wenz:
Wow.
Mark Miller:
What? Wait, yeah, I'm like, what? What countries? Like, what if I'm just sending a secret code, you know, to my to my wife or something like that? You know?
Adam Furmanek:
Secret code is okay, but if your whole message is encrypted and it's basically gibberish from human point of view, this is illegal, but because it shouldn't be used like that.
Christian Wenz:
But if Mark's wife can, you know, read base 64, it's just a matter of training. I mean, there's
Mark Miller:
We
Christian Wenz:
no
Mark Miller:
used
Christian Wenz:
reason.
Mark Miller:
base 256. We don't want the kids to know what's happening here.
Adam Furmanek:
So anyway, you do realize that maybe now you're breaching, breaking the law just by encrypting your stuff so no one can read that. But anyway, then you realize
Christian Wenz:
It's
Adam Furmanek:
yet another thing. Okay, so I do send a text message to my phone. How do I read it on my phone? Because Mark's wife is now proficient with reading base 256, but I am not. How do I do that? And then you realize yet another thing which may be tricky, that there is only one application. I'm talking from Android world, not iPhone world, but on Android, there is like only one application is allowed to read and write text messages. I mean, sending those messages, right? And accessing that, sorry, to be precise, accessing the SMS database, only one application is allowed to do that.
Christian Wenz:
I refer to database because some, I think even the Uber app does that, right? It requests
Adam Furmanek:
they
Christian Wenz:
the
Adam Furmanek:
capture
Christian Wenz:
privileges
Adam Furmanek:
the notification.
Christian Wenz:
to read text messages and then they automatically extract the two factor
Adam Furmanek:
Yes,
Christian Wenz:
of code,
Adam Furmanek:
yes,
Christian Wenz:
right?
Adam Furmanek:
you can extract the notification about the message, you can even send the message, but you can't read the database of messages.
Christian Wenz:
So the history of messages, basically.
Adam Furmanek:
Sys
Christian Wenz:
That's
Adam Furmanek:
tree
Christian Wenz:
what
Adam Furmanek:
of
Christian Wenz:
you can't
Adam Furmanek:
messages,
Christian Wenz:
do. OK,
Adam Furmanek:
exactly,
Christian Wenz:
OK. Mm-hmm.
Adam Furmanek:
yeah. So now comes the thing that, okay, even if you install many applications, because like you, I don't know, you used your built-in Google application or Samsung application, then... you want extend those applications to basically decrypt these messages, right? What you can do instead is you can configure your own application for SMS, but then you need to use it. So if you have like a Wear OS devices, smartwatch or whatever else, you either need to implement another smartwatch application for this text messages, or you lose that, you know, your ecosystem basically, right? Not to mention that it was another thing that I was super surprised. Actually implementing application that handles MMS, multimedia messages, properly is rocket science. And I'm not like overestimating that. If you go on the internet and look for open source applications that can send and receive MMS messages properly... especially when you have flaky internet or you are offline just at this moment, really there are not many applications doing that. Literally I found one and I tested like tens of them. So there is no standard for that. MMS is actually a crazy protocol that you need to re-implement on your own again. And there are not many open source solutions that you could use. So just getting this done is tricky. And if you want to have ecosystem cooperation, so smart with another stuff, you get lost. So you can get another approach for doing that. Because just like we are hacking stuff, how do you hack the stuff on Android? Well, there is a fantastic application called Automate, very similar to Tasker. I think Tasker is a little bit more popular on Android. But Automate is basically an app that you can configure like, callbacks for various events that I have like, I don't know, I received a message, I changed my GPS location, someone is calling me, there is this kind of notification, yada yada. And you basically have like block UI based programming language that you can do, if this happened, I do that. Okay? And this thingy lets you basically run, for instance, Node.js code, extract the SMS content, and write that to file. And once you have that written down to file, the next step you do is I just start a web server hosted on my mobile phone and I write a very simple web page that reads those files and shows them in an ICI. This is actually the easiest way to implement an application native, kinda native application running on your phone without going through. Android, Xamarin, other stuff, certificates, installation and whatnot, just create a webpage. Deployment is super easy, works well and you have access to whole JavaScript world that gives you anything you can think of. So this is how you can implement like an interface for text stuff. But okay, that's cool. We have emails, we have text messages. But let's face it folks, we would like to have some decent UI, right? And we are too lazy to implement our custom decent UI. So what do we do? Why not take Rocket Chat or Slack application just for that or IRC? There is actually a fantastic application in IRC world which is called B2B. B2B is like a, just like Jabberhead Gateways, B2B is a custom IRC server. that has gateways to various other networks. So now you can talk from IRC to any other network you have. I mean, Java, Messenger, Twitter, yada, yada. But at the same time, you can take any web client or mobile client or desktop client that works with Slack or IRC or Webknot. And the only thing you need to do is you need to extract messages from there. So what do you do? You create a new Slack workspace. You create a new channel that represents Mark Miller or Christian Wentz in Facebook, WhatsApp, whatever. You log into Slack over the regular UI, tap your message, hit enter and there you're good. And then you configure webhook from the Slack channel that takes the message and sends it to your server. And once you get that, bank you have the communication and you have decent web UI for free and native applications of whatever kind that will be supported forever and ever as long as it still works. The only problem
Christian Wenz:
And
Adam Furmanek:
you
Christian Wenz:
as
Adam Furmanek:
still
Christian Wenz:
long as they
Adam Furmanek:
do...
Christian Wenz:
are, they are webhooks, right? But yeah, I
Adam Furmanek:
As
Christian Wenz:
mean,
Adam Furmanek:
long
Christian Wenz:
they
Adam Furmanek:
as there
Christian Wenz:
are so
Adam Furmanek:
are webflux.
Christian Wenz:
instrumental to the functionality of Slack, so
Adam Furmanek:
Yeah, that is exactly
Christian Wenz:
they would go
Adam Furmanek:
right.
Christian Wenz:
last, right?
Adam Furmanek:
Yeah, and there is another yet another issue you need to solve just like we said with text messages are they're safe Now you may consider do I want to put my confidential Message to christian wenz which is supposed to only root to facebook. Do I want to put it in slack? How about we encrypt it again? So we open up slack you inject a little bit of javascript code that will capture your enter keyword when you click it, take the message, encrypt it with JavaScript, yada yada, and then you send encrypted message over this channel, and then you decrypt it on the other.
Christian Wenz:
What kind of encryption are you using? Are you using a pre-shared key so that the server knows and then the client knows? Because otherwise, I mean...
Adam Furmanek:
As we mentioned, we are lazy. So obviously we use pre-shared key that is very well hard coded and not through that anytime. But I'm just kidding. But yeah, you just use
Christian Wenz:
Yeah,
Adam Furmanek:
AES
Christian Wenz:
yeah, okay.
Adam Furmanek:
like advanced encryption standard,
Christian Wenz:
Yeah.
Adam Furmanek:
that's it. Because the only thing you need to do is you encrypt in the browser in this Slack entry
Christian Wenz:
Yeah,
Adam Furmanek:
point.
Christian Wenz:
yeah.
Adam Furmanek:
It gets delivered via webhook to your code, to your server, which you control. You decrypt over it over there and send it to messenger, to WhatsApp, to whatever you wish. So this is how you take that. And those approaches with like, you know, hacking various networks, hacking various encryption schemes and whatnot, you can extend that to other scenarios as well. For instance, to have voice calls just like that. You can, for instance, I'll very quickly touch upon this topic. How would you build an interface that would basically, like I would like to talk over my phone, dictate the message and get it sent to Mark over Facebook. or over WhatsApp. How would I do that? Well, easy. You just call yourself on Google Voice. Because Google Voice gives you automated transcription on
Christian Wenz:
Ah,
Adam Furmanek:
email.
Christian Wenz:
of course, of course.
Adam Furmanek:
Once you have transcription to email, you get the text and send it over. Free, cheap, bang. And it works. So generally doing that stuff, connecting all those crazy dots of enterprise world, you can really build this thingy which kind of does the job. And that's the whole point.
Christian Wenz:
Wow, I love that. So I mean, just ballpark number. Many of these things, I mean, they are all ingenious, right? But some of them sound like kind of hacks that rely on that nothing changes on the third party systems that would break your implementation. So ballpark number. How many of those things will still work like one year from now without your code interventions? Like 90% or? or 99 or 50.
Adam Furmanek:
Very good question. It's more like 99%,
Christian Wenz:
Excellent.
Adam Furmanek:
definitely not 50. The hardest part actually is now maintaining, maintaining actually WhatsApp. WhatsApp maintenance is really painful. And I'm trying to think what other protocols broke recently. And honestly, I can't think of any. What's like, Active protocols that I support now that I use every day are something like Slack, Messenger, Skype, WhatsApp, Twitter, Discord. I don't use Jabber, but it should still work. But anyway, let's take those six protocols, right? Out of them, only WhatsApp requires an active maintenance. And this, just to give you numbers. This active maintenance is something like touching the code every third, every fourth week. So that's pretty often I would say. WhatsApp breaks really often.
Christian Wenz:
because they change the web UI so often, it kind
Adam Furmanek:
Just
Christian Wenz:
of looks
Adam Furmanek:
because...
Christian Wenz:
stable to me. I mean, I'm using the Windows client quite a bit, but I mean, that's basically an electron app, right? So it
Adam Furmanek:
Yeah.
Christian Wenz:
might be the same code as the web interface, I would guess.
Adam Furmanek:
actually WhatsApp is very flaky, I would say. I mean, I am opening the webpage every couple of minutes
Christian Wenz:
Mm-hmm.
Adam Furmanek:
just to get the messages. And sometimes it works for a couple of days, sometimes like every five hours it logs me out,
Christian Wenz:
Wow.
Adam Furmanek:
right? But also the webpage breaks. The webpage breaks like the classes, the message format, the placement of things. it just changes. So maintenance is pretty intense but with other things I would say 99% of that will work a year from now.
Christian Wenz:
Wow. That is pretty amazing and probably is a testament to the solid architecture and approach you have, although it still sounds like voodoo in some respect. All
Adam Furmanek:
Exactly,
Christian Wenz:
right.
Adam Furmanek:
exactly. I mean, like I said, the funnest part actually, because like when you do something, at least that's in my case, when I do something just for myself, coding stuff,
Christian Wenz:
Mm-hmm.
Adam Furmanek:
TTT, tests, continuous integration, maybe we'll be there, maybe not, because it's just a tiny project that was supposed to be done in like two evenings,
Christian Wenz:
to an evening
Adam Furmanek:
right?
Christian Wenz:
soon.
Adam Furmanek:
Yeah, and then at some point I realized that I have no idea what's going on and I had to debug a memory tab through my application. So definitely, really it was surprising to me how it all turned that, you know, started with something this small and it turned out to be this big, lasts for so many years, is now critical application for me. And it works, still works despite the code quality and how rough it was implemented
Christian Wenz:
And I mean,
Adam Furmanek:
in
Christian Wenz:
there
Adam Furmanek:
Fuzz.
Christian Wenz:
was at least a 10-minute description, there were so many interesting problems to solve as part of the journey, right? So that there
Adam Furmanek:
That
Christian Wenz:
was
Adam Furmanek:
is
Christian Wenz:
a
Adam Furmanek:
true.
Christian Wenz:
constant flow of not only frustration but also of motivation, I reckon. Are you not afraid that now once this episode airs, WhatsApp and the other teams can come knocking at your house and want to see the code so that they can stop it from working?
Adam Furmanek:
Well, I'm just opening WhatsApp web.
Christian Wenz:
Yeah, yeah, okay, fair
Adam Furmanek:
They
Christian Wenz:
enough, fair
Adam Furmanek:
won't
Christian Wenz:
enough.
Adam Furmanek:
stop it from
Christian Wenz:
Yeah, yeah,
Adam Furmanek:
working.
Christian Wenz:
fair enough. If it runs on a client, it's out of the control of the server, that is conflict. Super, super fascinating discussion. Actually, we have to resume that discussion in a later episode, definitely, because I'm also super interested about the.NET specific choices you had to make, libraries that worked well, and especially those that did not work well, because I think we can all learn from that. So really, really fascinating project, Adam. Maybe we can eventually share a screenshot of that or something. I'd be really, really interested to see that. All right. But now it is time for picks. So Adam, would you be the first to pick today?
Adam Furmanek:
My pick would be related to what I did, but only kinda. Whenever you go abroad and we spoke about text messages, whenever you go abroad and you need to confirm like your banking transaction that you want to send
Christian Wenz:
Mm-hmm.
Adam Furmanek:
money, you pretty often need to confirm that either with push notification or with text message or whatever else, right? This changed. The problem with push notifications is that, well, what happens if you lose your phone while being abroad?
Christian Wenz:
Yeah,
Adam Furmanek:
That's a problem
Christian Wenz:
that's my
Adam Furmanek:
and a
Christian Wenz:
greatest
Adam Furmanek:
serious one.
Christian Wenz:
fear. That's my greatest fear, switching phones. Because I mean, switching phones with the data, that all works reliably well. 2FA does not always work
Adam Furmanek:
Exactly.
Mark Miller:
Thanks for watching!
Christian Wenz:
reliably well. I mean, especially those authenticator applications. I mean, there are two big ones, right? So one can
Mark Miller:
Yeah.
Christian Wenz:
migrate it, no questions asked, and the other one has to be migrated via cloud, and like 50% of the accounts. do get migrated and the other 3% do not get migrated. So I'm super
Adam Furmanek:
Exactly.
Christian Wenz:
psyched about your pick today.
Adam Furmanek:
So generally, generally my suggestion is despite what they tell you on all the security podcasts, text messages
Christian Wenz:
I'll stop listening
Adam Furmanek:
are...
Christian Wenz:
now.
Adam Furmanek:
Oh, sorry for that
Christian Wenz:
Hahaha
Adam Furmanek:
Christian. Mark, for you. So text messages are better than push notifications when you do travel because you can use a virtual phone number. or Zadarma or whatever else and my pick is Zadarma. That's a service you need to pay for. So it's not a product placement, I just try to convince the idea. Get yourself a virtual phone number that will route all the text messages you get to your email. Obviously you need to have proper encryption and work node. This way, if it happens that you lose your phone while being abroad. or whatever else, you can still get the text message delivered to email and you can still send that money transfer. So if you need to buy an airplane ticket while being abroad, and it happened to me once when I used to live in the US and I was traveling Europe, I realized, okay, my mobile number, US-based mobile number has no roaming at all. No roaming. So while being in Europe, I had no access to text messages and buying an airplane ticket, that was quite a... So get yourself a virtual phone number and never get looked out from your banking account.
Mark Miller:
So Adam, does this mean that with the virtual phone number, I use that phone number for every 2FA
Adam Furmanek:
Yes,
Mark Miller:
mobile message?
Adam Furmanek:
for
Mark Miller:
I changed
Adam Furmanek:
every,
Mark Miller:
all of that.
Adam Furmanek:
yes, you go to your banking application and you change your phone number from your regular one to this virtual one and that's it. And you install a mobile application on your mobile phone which can get those messages or you get them over email or whatever else. So technically like your flow does not change much. And the only change here is that it uses virtual number, which works regardless of whether you have this phone or you lose it or it gets sold or whatever. That's it.
Mark Miller:
Okay.
Christian Wenz:
And so those virtual phone numbers, they can't be kind of detected as such. And so it could be on a block list. So from time
Adam Furmanek:
Day.
Christian Wenz:
to time, I use mail, postal mail packages, forwarding services. So when whatever shops don't send something to my country, I get an address in the country of the shop. And then they send it there, and that service forwards it to me. But sometimes I can't use that specific address I got at the forwarding provider. So I was wondering whether this is also the case for virtual phone numbers.
Adam Furmanek:
That's a very good question. Technically they can be detected and one can tell apart whether there's a virtual
Christian Wenz:
Mm-hmm.
Adam Furmanek:
phone number or not. However, it does not mean that it won't work. It works with all my banking accounts,
Christian Wenz:
Excellent.
Adam Furmanek:
with stock brokers and whatnot. You may want to look for your service provider,
Christian Wenz:
Mm-hmm.
Adam Furmanek:
obviously, especially that if your, let's say, banking account is in Germany, then maybe service provider from Spain won't be recognized as virtual phone number they would just have
Christian Wenz:
Mm-hmm.
Adam Furmanek:
no idea, right? So that's the idea, but yes, technically they can be detected that it's virtual from them.
Mark Miller:
You know, this is actually I think has other uses as well. When I moved to Spain, one of the things that I found was essential was having a local Spanish cell phone because I needed that to verify essentially to FA or maybe just verify that I was actually at that phone number and that it was in Spain to sign up for internet, for example. Right? Any of the local services will often ask for a Spanish number, and then they'll send you a text message. And that's all I've used this phone for the entire time was basically just confirming on the text that I've got a Spanish phone number, so I can get my internet or get whatever the thing is I wanted to get. But I'm betting do they have the ability for you to pick the country you want the virtual phone number to be in?
Adam Furmanek:
Yep, they do. And what's more, now when you travel and you actually want to use this phone number not only as two-factor authentication but as a real phone number, with eSIM, it's super trivial now,
Christian Wenz:
Okay, great.
Adam Furmanek:
right? You can buy eSIMs for various countries from multiple providers now, so no more buying physical SIM card.
Christian Wenz:
Yeah,
Adam Furmanek:
You just go with
Christian Wenz:
yeah.
Adam Furmanek:
eSIM
Christian Wenz:
So
Adam Furmanek:
and
Christian Wenz:
for
Adam Furmanek:
that's
Christian Wenz:
me,
Adam Furmanek:
it.
Christian Wenz:
for me, eSIM was a game changer. I mean, within Europe, due to free roaming, I mean, I can use my local number everywhere. But outside Europe, yeah, eSIM. Because before that, I always had a dual SIM phone. Then, you know, I got for the various countries where I'm regularly enough, I had the specific local SIM, which I hope to use often enough so that it doesn't expire. But yeah, within eSim and Plus and app, there are various providers. Maybe it will be one of my picks for the upcoming shows. But today, today I got a different pick since Sean couldn't join us today, I thought, okay, I have to do a streaming pick because it wouldn't be adventures in.NET without a streaming tip. So I started watching on Apple TV Plus, I started watching Hijack. So Hijack is a show and the main actor, or main star is Idris Alba. I think he's rumored to be, you know, one of the potential new James Bonds, very, very famous
Mark Miller:
Right.
Christian Wenz:
actor. He's starring in Hijack. So it's like seven episodes. And basically it's a plane that flies from Dubai to London. which takes seven hours and there are seven episodes which are well almost an hour so you know where this is going to right or where
Mark Miller:
Holy
Christian Wenz:
it's leading
Mark Miller:
crap.
Christian Wenz:
to and of course
Mark Miller:
Wait, don't tell me anything else. This sounds awesome already.
Christian Wenz:
Yeah, exactly. Well, it's not like 24 real time, like 24 the series.
Mark Miller:
Yeah.
Christian Wenz:
So not that real time, but close enough. Right. So I'm four out of seven episodes in. And when we are recording this, the final episode will come out in five days. So I'll need to wait at least four and a half days so that I can binge watch it to the end. It is well done. And obviously, some things happen on that flight. Right. I don't want to give away too much. But the name of the series, it's called hijack might give you
Mark Miller:
Don't tell me anymore!
Christian Wenz:
But I won't tell you anything else might give you a hint as what is happening But I mean again, I'm four episodes in but I still don't know exactly what kind of what is happening, right? So I'm hooked and looking forward to the final three episodes. So go check it out mark
Mark Miller:
Are
Christian Wenz:
over
Mark Miller:
these
Christian Wenz:
to you.
Mark Miller:
Christian,
Christian Wenz:
Yeah
Mark Miller:
are you able to binge watch the whole thing or are the episodes coming out
Christian Wenz:
They're
Mark Miller:
every
Christian Wenz:
coming
Mark Miller:
week?
Christian Wenz:
out one every week, so episode 6
Mark Miller:
Ugh.
Christian Wenz:
came out this week, episode 7 will come out next week. So, and I mean, I always watch, you know, in the evening as a kind of a self-constraint, so that I don't watch like, you know, four hours straight, because, you know, I have to get up and work the next day. But when I have watched one episode, there's still time for another episode, right? And therefore, I'm kind of stalling or delaying watching... episode 5 because when I'm watching
Mark Miller:
because...
Christian Wenz:
episode 5 I have to watch 6 right after
Mark Miller:
Yeah.
Christian Wenz:
that and I mean if I've watched 6 and there's only one more to go then you know maybe I'm inclined to you know what I'm saying right so
Mark Miller:
Yeah, yeah, yeah.
Christian Wenz:
I'm patient and I'm secluding myself for 5 more days
Mark Miller:
Yeah,
Christian Wenz:
and then I'll watch the rest.
Mark Miller:
that's awesome. I actually, my favorite way to binge watch is one episode a day. So I like waiting till there's like, you know, we watched, my wife and I watched Game of Thrones. We waited till the whole thing was done,
Christian Wenz:
Mm-hmm.
Mark Miller:
essentially, and then we got into it, started watching it, we watched the entire series, essentially one episode a day, and it was awesome. That kind of pacing was perfect, I really loved it. We're, with the kids, we're watching Breaking Bad right now. Same thing, one episode a day and it's really, really good.
Christian Wenz:
It depends on the cliffhangers though, right? I mean, if there's a cliffhanger and I mean, so, so one of those episodes ends with a shot being fired and you just hear it.
Mark Miller:
Right.
Christian Wenz:
I can't go too bad.
Mark Miller:
Wait,
Christian Wenz:
I
Mark Miller:
don't
Christian Wenz:
can't go
Mark Miller:
say
Christian Wenz:
too bad,
Mark Miller:
anything.
Christian Wenz:
right? I mean.
Mark Miller:
Don't say anything. What are you talking about? Don't say anything. That was a hypothetical.
Christian Wenz:
Hypothetical, yeah
Mark Miller:
All right.
Christian Wenz:
of course of course.
Mark Miller:
All right. My pick is the Barbie movie. I recently saw this. This is directed by Greta Gerwig, who I'm convinced now is a genius, by the way. She's a genius because she's got, you know, the movie, I'll tell you, has got, first of all, excellent. one of the best performances by Margot Robbie that I feel like I've seen incredible performance by her, great performance by Ryan Gosling, great writing, Greta Gerwig is one of the writers and she directed it. Great directing. I'm convinced she's a genius in part because of this movie. This movie has got a strong fabric woven feminism kind of kind of resonances throughout this movie. And I think she presents the argument for feminism in an incredibly powerful way in this movie. And the movie is, these messages Our legacy, they're kind of hidden. You kind of, you know, some of them, they'll resonate. They'll resonate with you if you've experienced this or if you're aware of them, that sort of thing. But at one point, she effectively raises the idea that, you know, effectively raises the proposition to men of what if women were all in charge instead of men? Because I think as men, one of the things that is easy to take for granted is that, you know, we can, it's essentially the privilege, it's, you know, the privilege that it's easier for us to get jobs in positions of authority, for example. Right? That's kind of just easy and just kind of happens, I think more for men than it does for women. And anyway, she basically, I feel like at a moment, like I was like, and the thing is, I know I go in knowing all the arguments, right? I'm kind of as well informed of a feminist in the male body as I can be, I think. But she is able to put forth. an argument more compelling than the logic and the rational thought of everything that I was bringing in. And I think she's a genius for being able to do it because I've never seen that done before in a way that I thought was as effective as it was in a movie that was as entertaining as it was. It was incredibly entertaining all the way through. And so, yeah, I think she's a genius. Margot Robbie's excellent. And if you are at all in a world where you're thinking, hey, maybe things aren't equal between men and women. and you're thinking about that and you want to be a little more, you know, knowledgeable about that or a little more informed and you want to be entertained. That's the movie you want to go see.
Christian Wenz:
And that's exactly the movie you would not expect if you don't have the context and hear that a new Barbie movie is coming out.
Mark Miller:
Right. Yeah, it could be something you might easily
Christian Wenz:
Yeah,
Mark Miller:
dismiss.
Christian Wenz:
exactly, exactly.
Mark Miller:
And
Christian Wenz:
But I've heard great
Mark Miller:
if
Christian Wenz:
things
Mark Miller:
you...
Christian Wenz:
about the movie. It scores well
Mark Miller:
Yeah,
Christian Wenz:
on
Mark Miller:
if you...
Christian Wenz:
IMDb as well, right?
Mark Miller:
Yeah, no, it's excellent. Yeah, if you want to have a good relationship with... If you're a man and you want to have a good relationship with any woman at all, you want to see this movie, right? If you're not informed, you will be, I think, incredibly informed and at least sensitive, certainly to... you know, the differences and the distinctions and what it's like to be, you know, a woman in this world that we have right now.
Christian Wenz:
Excellent. Thanks, Mark. One final question. Are you team Barbieheimer or team Open Barbie? Because isn't that the meme at
Mark Miller:
Ha
Christian Wenz:
the
Mark Miller:
ha!
Christian Wenz:
moment? Because the Barbie movie and Christopher Nolan's Oppenheimer movie, they started on the same day. Right. And there are these mash up fake movie posters with both of the movies and actually several movie theaters. They are offering double features so you can watch them back to back. And so if you're a Team Barbie-heimer, you first watch Barbie and then Oppenheimer, and Team Oppenbarbie, you do this vice versa, right? So
Mark Miller:
I love
Christian Wenz:
I
Mark Miller:
it.
Christian Wenz:
was wondering, I haven't watched either of them yet. So I'm rather considering the new Mission Impossible movie to watch at the movie
Mark Miller:
Yeah.
Christian Wenz:
theater, and then wait for the other movies for streaming services. But
Mark Miller:
What?
Christian Wenz:
still on the fence. What do I look and what do I watch first?
Mark Miller:
Well, I am going to... I've actually... So I'm in Spain. I'm in Valencia, Spain. And I got a text message from my son who said, just got out of Oppenheimer. You must see it. Find an IMAX theater. So I searched for the closest IMAX theater and the closest one appears to be in Portugal. It's a different country and I got to go drive, you know, five to nine hours to get to it or something
Christian Wenz:
If
Mark Miller:
like that.
Christian Wenz:
there are some
Mark Miller:
So I'm
Christian Wenz:
concessions
Mark Miller:
like...
Christian Wenz:
you have to make, my friend.
Mark Miller:
I know, well, I don't know. I don't know if the concession is gonna be a smaller screen or if it's gonna be a nine hour drive, but
Christian Wenz:
The
Mark Miller:
you're
Christian Wenz:
letter
Mark Miller:
right.
Christian Wenz:
maybe.
Mark Miller:
There's gonna be. There's gonna be something. And so that recommendation came in. I'm seeing a lot of good reviews for Oppenheimer. I want to see it. And I really I want to see Tom Cruise's movie, too, because I've been watching these behind the scenes on his
Christian Wenz:
Yeah,
Mark Miller:
stunts
Christian Wenz:
crazy.
Mark Miller:
and the way they're making this movie, this the way the movie is being made, it's probably it could be like one of the last times a movie like this is made in this way, where they're doing so many practical stunts with practical. I you know, practical equipment that's really happening in the really interacting with plus Tom Cruise is like practicing practicing. He's doing something like 13,000 motocross jumps, right just for one particular stunt where he goes off the edge with a with a parachute on the on his back. Right. And so this guy is like just practicing, practicing. I just don't think there's another there's another opportunity coming in the future, where somebody's gonna be able to make a movie like this. I want to see it. but it's a part one
Christian Wenz:
Yeah, yeah,
Mark Miller:
and
Christian Wenz:
yeah.
Mark Miller:
you know
Christian Wenz:
Again,
Mark Miller:
how I am.
Christian Wenz:
cliffhanger
Mark Miller:
I don't
Christian Wenz:
issue,
Mark Miller:
I don't want
Christian Wenz:
yeah,
Mark Miller:
to wait.
Christian Wenz:
yeah.
Mark Miller:
There's going to be a gunshot at the end of Mission Impossible
Christian Wenz:
It might,
Mark Miller:
part
Christian Wenz:
it
Mark Miller:
one
Christian Wenz:
might be.
Mark Miller:
and I don't know what happened. I can't wait a year to find out that. So I don't know what to do
Christian Wenz:
You
Mark Miller:
but
Christian Wenz:
have
Mark Miller:
I
Christian Wenz:
to
Mark Miller:
want
Christian Wenz:
wait
Mark Miller:
to
Christian Wenz:
for
Mark Miller:
see
Christian Wenz:
the double
Mark Miller:
it.
Christian Wenz:
feature next year then probably. Yeah. I got that. All right.
Mark Miller:
Yeah, that's what I want to do maybe.
Christian Wenz:
Excellent. All right. Great episodes. Thanks, gentlemen. Thank you, everyone, for tuning in and see you all next time here on Adventures in.NET. Bye-bye.