Hello everybody It's really great to be back here in Berlin for CCC. It's been a long time since I've been able to make it here previously, I've always been Around this time preparing for another conference CES, but I'm done with that now. Thank God and It's really good to be around so many really brilliant people. It's very humbling so Thanks for having me here Today I'm going to talk about a implementation of a man-in-the-middle attack on HDCP and The device that we use For the attack is actually being used to overlay Twitter feeds on top of an HDMI feed that is going to the projector And of course I had trouble setting up just a moment ago But it seems to be running now if you tweet to bunny studios or 28c3 You should see your comment going across the top provided that Wi-Fi doesn't fall over So that being said let's get started First I guess you know what is HDCP? It's you know, it's the high-definition content protection. It's a pixel level encryption operating on the link layer And the cipher structure is a little bit odd. It's a stream cipher it generates 24 bits of pseudo random data per cycle and Internally has a structure of a pair of block functions that Run once per clock cycle. There's a LFSR based Key scheduler sort of that whitens the block functions at the beginning of every horizontal retrace and The block functions themselves are initialized with a bunch of different things including a 64-bit Initial vector that also evolves during vertical blanking intervals Key the interesting thing about HCCP is a key management component. It's They use a key management system that allows you to just use distributed private keys With some sort of key revocation. It's pretty weak A public key in in their parlance is called a key selection better vector And it's a 40-bit number consisting of 20 zeros and 20 ones The private key is a vector of 40 56-bit numbers and there's a dot product between the two that generates a shared secret All of the private keys used in the system are derived from a master key consisting of a 40 by 40 matrix of 56-bit numbers the master key was leaked about a year ago to this day and it can be Computed directly from a collection of private keys that recovered perhaps from a set of video cards as shown here I had nothing to do with it But thank you to whoever did it It's actually been a lot of fun for me doing this and in a lot of respect to the people who did it so Why HCCP in the first place why would someone want to use it? Well, I don't want to use it But why why why do people put it into different things the idea is that they want to be able encrypt video transmissions They want to create a studio to your TV set fully encrypted path, right? So it's compliments ACS BD plus another Encryption technology to create the studio to screen cryptographic chain. However, the that chain was broken a long time ago ACS was the weakest link people can rip out movies all they want So it turns out that when the HCCP master key was was released a little bit of a no-op Because from the content access standpoint because people already had access to the content through others vulnerabilities And it's also possible to build strippers based upon legitimate HGCP keys that have been available for a long time. Basically people take out an HCCP receiver chip and then just hook them up to the LCD port or some some frame buffer and they can get the data they need out so the master key itself from the content manager standpoint wasn't big news, but So then the question is why would I bother to try to implement this man in the middle attack on HCCP and It's all about control right at the moment Broadcasters and studios Control your screen you actually don't really get the right to manipulate the video That is being broadcast to you because the DMCA makes it illegal for you to decrypt the video to allow you to manipulate it so there's there's a sort of control war going on over who can put something on your very own screen and it sort of irritates me that I am not able to go ahead and modify my You know data it within my own home because of some technicalities due to the DMCA so Just a overview of the things are restricted if you want to do like a picture-in-picture from two feeds That's not possible because of HCCP If we do content overlays like what's happening up here That would not be possible if you want to do filtering and modification the image That's not possible because it's all encrypted And as a result, there's actually very few commercial HDMI video mixing solutions that can operate on Broadcast and movie content. So the goal of implementing the attack is to Allow consumer side content remixing So the idea is that we want to be able to add web content You know internet content to existing TV live comment and chat So if you're watching your favorite program You can tune in to Twitter feed and see what people are kibitzing about Over-the-top advertising so you could imagine based upon some algorithms To be able to detect and add and eliminate them or replace them with entirely new ads are more targeted to you You can do interactive TV so we can add interactive elements to broadcast TV and Another goal of the project was to be compatible with any TV hence the name any TV but also net TV So that's the goal question is how do we do it? It's what I'm here to tell you about so this is a bit of a eye diagram but it's sort of the this outlines the Overall sequence of events and sort of also includes what the any TV does On the left here is the video source. So there'll be your set top box So your blue a player your ps3 whatever it is. This is a video sync. So this is your your TV set basically and there's a set of Handshakes that go back and forth and down here. I've put the man in the middle attack box. That's sitting on the link and There's a set of steps here a 1b 1b 2c 1 basically they go step by step for the handshake and Then here is a corresponding set of things. I do while the handshake goes on to intercept it and do the man in middle attack so the first thing we do is It's interesting we we read the device capabilities Actually, not what we do what the set top box does is it queries a monitor and says hey monitor What are you capable of doing? So we'll talk about that step first this one is Important to also man in the middle Because it's a single bus Called DDC it's basically I squared C over HDMI and it's shared between two functions the monitor capability Identification and the key exchange itself And there's two things that we need to do. We need to snoop it and we also need to squash it So snooping is easy. You just sort of watch a key exchange and see the bits go by the squashing is a little more complicated and interesting With squashing you basically want to force the TV to have the characteristics that we only support The reason is that you know, there's some TVs have 3d TV Some TVs do some strange scan modes that we don't support and we would like to have this work as sort of a seamless consumer experience So we actually rewrite the aided record on the fly as it's negotiated back and forth between the TV and the set top box So this is a circuit that enables the snoop and override It's this this is a standard sort of I squared C circuit here. You have a driver. You have a receiver of a pair of pull-ups And then on top of it we have The snooping of the clock is easy you just listen to it and then snooping of the data is easy you just listen to it and then To override the data because it's open collector bus. This is easy You just you know have a pull-down transistor and to override the one you essentially have to override an active Zero driver so we put a big wonk and fat on there And we have a little bit of a current limit resistors so in case they're both on at the same time You don't burn out the board It works. It's and it's we can go into more details later as to how it affects your liability But it in fact it shouldn't have any impact at all upon the reliability of the link Now in order to do the snoop and override the implementation uses a highly over sampled I squared C Implementation so I squared C itself is very slow 100 kilohertz clock we over sample at 26 megahertz and Based basically whenever the clock transitions we have a small window where essentially we can say Whoop we didn't want to zero we want to one and we actually switch around so that by time the next edge comes along At the sampling window the data is what we want it to be And The way it works in terms of the protocol level is you know We're listening basically only here at the address phase And then we decide on the acknowledge bit if we want to go ahead override the data So we say okay, you're reading this particular part of the record. I don't care. Let it through you're in the next part of the record I do care. I want to squash 3d TD capability. I go ahead and I rewrite the record on the fly So this allows me to basically change only the bits that are need changing during the monitor identification protocol Also we override the hot plug bus so there's a little wire that is used to detect when you actually plug in your TV set And the hot plug bus also has a fat on it so we can go ahead and Simulate the cable being unplugged without having unplugged the cable This is important because Basically the hot plug kicks off the whole state machine again for resynchronization and reloading all the records And so we do this a couple of times particularly on boot to go ahead and manipulate all the edits and all of the key state So back to the diagram again now that we've gone ahead and we've Intercepted and modified the basic handshake of capabilities. We now have to intercept and listen to and do something with the actual key exchange the key exchange is Pretty simple set of steps The link controller goes ahead and writes 64-bit random number Initialization vector and then it sends over its public key and it reads back the public key Once the public keys are exchanged you initialize a cypher state And and then you and then you go the man in the middle is again listening and accepting these The key exchange and itself goes ahead and creates a shadow rom of everything that's going and then we initialize a cypher to have Exactly same synchronization state as this so that we can on a pixel by pixel basis encrypt data to the identical cypher state and swap them on the fly Let's see is there anything I didn't say here right so getting the The all the initialization vectors is accomplished with I squared C sniffing And once basically the key exchange is captured The last right is a defined address that actually triggers an interrupt that goes to the host CPU This is all done in FPGA by the way goes to host Linux CPU that then triggers a unit of event That does all of the math for computing the shared keys so here's a I Like to write out the math all together because a lot of times I read these equations and I I don't get them and they're too complicated So this helps me Think it through When you're competing the private keys, it's you basically take K, which is the master key This is this is the matrix of 40 by 40 56 bit numbers and you do it dot product with the public key You can get essentially a vector of 40 56 bit numbers Which is the private key vector for the source and then you take basically take the transposition of the master key Multiply it by the other public key and you get the other private key vector This is done by the by the Linux host computer and Basically once you have these Private key vectors we then Multiply back again by the key selection ventures to derive the shared secrets the shared secrets should be identical I compute both to make sure we haven't got corruption on the line And then after the shared secrets computed we're good to go on the ciphers so The ciphers themselves it's as I had mentioned earlier Once you plug it into the hardware and you initialize the key schedules the cipher state has to Evolve based upon pixel clock first But then also an h-sync v-sync data garband timings and a bunch of other bits and pieces So in fact when you have a frame of video, this is a frame the active pixels are here and Then there's overscan on the edge for the h-sync and v-sync periods They actually only turn on the encryption for Actual data right so you so if you actually don't synchronize the cipher state and turn it off when you're not transmitting video data Your cipher gets un-synchronizing you get white noise At the back end, so we have to basically build a system that also passively observes the guard bands the sync patterns and so forth those are all unencrypted and Align our cipher state in addition the way that they do audio transmission and other things inside of HDMI as they have these data islands they're hiding inside the sync areas and they're marked by a special coding region and And once those happen, you know the next 16 or 32 clock cycles is is a data island and so we have to essentially extract all that timing and And use that to synchronize the cipher state So again, this is sort of a recap of how the pixel by pixels like Swapping happens here is sort of our encrypted video. I sort of hash over it to indicate. It's been x-word It's like the number one goes over a cable We synchronize pixel by pixel and then any TV will just go ahead and render only the portion of video that We really want to swap out it encrypts it with a synchronized cipher and then it just takes those and swaps those with the Pixels that I've encrypted and then on the TV side when you decrypt it instead of getting the number one you get the letter i Basically, that's how the overall system works So that's all the sort of the math and the crypto stuff the actual implementation is much more hairy There's a lot of like real-world stuff you have to deal with so I'm gonna go into a bit of that the Overlay pixels need to be exactly time to the video pixels and the overlay itself so for example this stuff that's coming across the top here is All being computed by the the local Linux computer that's on any TV and those look like dev FB zero We're just writing dev FB zero with with webkit to to create this this overlay There's a bunch of challenges to doing this the Linux interrupt jitter for a frame sync is way too high You can't just use that to synchronize frames the local oscillators also drift over time so Up to hundreds of pixels per frame is allowable within the PPM spec of the local crystal oscillators And if you don't if we don't have absolutely tight synchronization You would see the overlay sort of jittering and looking very nervous on the screen So there's a few Techniques we use to synchronize a frame buffers first We don't use the local pics clock to clock the LCD controller on the SOC We actually take the pics clock from the incoming video and feed that back into the processor and say Here's your clock for that so that gets rid of entirely all of the clock drift issues and PLL drift issues that you can have it's a it's a it's something that's a very convenient thing that helps solve a lot of the problems The next thing we do is we Listen to the data going by and we have to derive all the timings Dynamically from the video and we set the frame buffer properties to match So on the fly we listen we say the sink is this long the video is this wide and this high Corresponds to this CA a mode and then we program our frame buffer to match that so of course We don't do that programming right if you even walk by one pixel the frame starts drifting with time and This you would think would be something that's actually quite easy to do but in fact a lot of Vendors have buggy implementations. They're not actually CA compliant So you really have to just measure and use heuristics to try and make it bug compliant with all the weird equipment out there That doesn't actually quite work the way the standard says The other thing is that the you know when the LCD frame buffer starts as a DMA We basically trigger that with an interrupt based on upon the v-sync from the video stream but as mentioned before the interrupt latency of Of Linux is quite long and it has a lot of jitter So there's about eight lines of elastic buffer within the FPGA that allows us to absorb the jitter and we have a system that actually tries to measure the interrupt delay Between when the interrupt edge arrives and when the actual DMA starts and we actually pre-compensate that so we actually Start the LCD DMA a little bit earlier so that the first pixel arrives and the actual first pixel comes in the frame So there's a whole bunch of bits and pieces and stuff that we do to get that to work just so just right So The way we do the overlay over videos we use chroma key Many people know about go over it here in case you don't If I were to turn off the overlay you would just see a big pink screen like this with just the the data That you want to overlay essentially every color that is magic pink f 0 0 0 f 0 is swapped with background color It's a little bit tricky in some spots to do this Because you can have anti aliasing sometimes turned on and the pink will bleed into your images and so forth So you have to be a little careful when you design the content so that magic pink doesn't bleed and create pink rings around everything And so this is what the FPGA implementation looks like on the inside. There's a block diagram of it The HMI comes in we deserialize it to RGB. We have the I squared C like DDC bus, which is being snooped and squashed And then we have a local PLL sync that recelizes data. There's a multiplexer here that based upon the genlocked Data coming from the FIFO is Encrypted and then selected on pixel by pixel basis if the incoming data matches the chroma key That's basically the entire implementation of the pipeline For the device Now there's a few optimizations. We had to do to get this to work. Well One thing is key caching So every video is sourcing when you plug your blue a player into your TV the shared secret actually never changes Over the life of the device and people rarely replugged things in with each other So even though we can almost compute the shared secret on the fly for most devices Some devices are very fast and they run a little faster than protocol and they won't catch and you get like white noise So what we do is we cash the computed key The first time we compute it write it to a temporary location and we just check it's the same If it's not the same that we ain't the hot plug line and we and we re-initialize The other thing we do is we do eated caching This is a little more important because without eated caching eated is the record that describes the monitor's capabilities You see a double blink of the screen We do the first blink of the screen to read it value and then the second blink to overwrite it and And that sort of creates a bad user experience. We do eated caching And so that's the the core FPGA I want to talk a little more about the bigger system picture of how it's all wrapped together and Works in practice. There's FPGA up here, which we saw the block diagram of we use a PXA 168 and 800 megahertz arm CPU And 128 megabytes of DDR2 a micro SD firmware. We have an infrared remote detector so you can use remote control to control it We have a OTG connector on it and we have Wi-Fi on the board and so of course I like Hardware and so I conclude pictures of hardware This is the FPGA here. It's a Spartan 6 FPGA You can see that in fact the HDMI pins go straight up in the FPGA There's no Intervening buffers the Spartan 6 is capable of driving and interpreting at HDMI on the fly without any help of its own Micro SD card. It's you can swap it with a bigger disc if you want. That's the PMIC The IR receiver some status LEDs must have the blinking lights This is the Wi-Fi chip The CPU and a little boot spinor and this is an extender because typically you're going to hide the device behind your TV So you can actually plug in a little infrared receiver on a long wire and put it where you need it to be The Solution is also a complete open stack So a lot of times, you know, we focus a lot on sort of u-boot to linux to webkit and so forth this Solution here actually we open source the plastics the PCB the FPGA the verilog Of course the u-boot the Linux webkits open source the widgets are open source is stored in github And then we go one step beyond that we actually give you a provisioning server so that if you were to actually develop your Own system you can actually bring up your own update network and so forth and a build system on top of that Based upon open embedded I'll go into that a little bit more in a moment so the application environment for this This overlay here and looks like Wi-Fi fell over which is why we don't have any more Tweets going across The application over meant this guy here is basically HTML JavaScript The CSS template is configured basically make the background magic pink so anything you draw over it blocks the screen the apps are all JavaScript HTML programs and But you can extend it to use anything that uses devfb zero so if you use stl flash whatever it is you can also use it with this infrastructure We use github to store all of our demo apps so every time you reboot the client We do a git pull and if there's new widgets or something it just pulls right down to your device And you have new widgets on the device And the firmware updates are also served from an ec2 infrastructure So we provide an AMI that allows you to replicate this yourself Another thing we do is we provide an HTTP API so the so the events that you saw previously scrolling across the top here are actually You can actually issue them from any device in network. We actually Broadcast ourselves with a zero conf Bonjour, you can discover it with a smartphone for example and Based upon the discover IP address if you get an SMS in your smartphone It can go ahead and forward the event to any TV. So an SMS could then scroll across the screen The it's it's basically this is what an example call looks like it's just a get request and you just And you can send events to any TV So the idea here is that if you had a smart home environment or you want to do something where you overlaying something in Your screen you don't want to do a lot of work or programming You just go ahead and you just discover the IP address and use HTTP to go ahead and overlay the events very quickly and very easily This allows you to avoid having to do a lot of coding To get some sort of new system and new functionality Also, we provide a turnkey build system We have a public Amazon ec2 instance with a pre-built angstrom distribution So it's great that you can get sourced But the problem is if you want to build the kernel, you know QTX and everything you're downloading source for seven hours And then you're building for another seven hours and then you find out doesn't work You misconfigured something and then you're splitting another seven hours. Just get going.  They're generated for either served via web page from the server and so there's a big Binary file here that basically you need to download that once Burn it on your device But once you've downloaded that and burn it on there the device is keyed to go back to your server for updates So then code development becomes not, you know code something scp it on and run it You just simply just do a push get get push It does the build and then through O package it triggers an update and your stuff just ends up on your device And this is something that you can just get without having to do a lot of work So we call it like 30 minute sort of running start We want to get developers going on the platform without having to do a lot of mucking around with cross-compilers and so forth The hardware is open. I'm a hardware guy. I like hardware. So of course, I'm going to include the porn for hardware This is the case design. It's done in solid works You can download and look at it. I put graffiti on the inside and bits and pieces It's made in steel tooling out in China I Love the the way it looks and the way it smells It's true The if anyone's ever seen me get like a new like gadget out I always like open the anti-stat bag and I smell it because you can I've been in the factories You can tell what flux they're using what process they're using and sort of how the weather was in Shenzhen when they built it that all comes with a box and It's and the other thing is is you know the Chinese will tell you that you can only use German steel for For making these tools because Chinese steel is too soft. I don't know what it is But they always say we can only buy German steel and they tell me that as like an advertising thing. So Steel comes from Germany Schematics are of course open online. I designed an LTM You can get the source files download them and play with them and the PCB layouts as well are available for you To go ahead and browse and modify So this is a you know, complete open Solution that we provided the hardware schematics PCB design FPGA The software a complete turnkey build environment, you know, including everything from top to bottom So we tried to be very complete completionist about this and the goal We had is we want to go from half an hour from getting the device to essentially a sort of a production grade Build environment where you can actually give it to someone else and say, you know Have the device and we can push updates to you and you can actually Use it for your own application and you can get it now actually at Adafruit.com They're actually kindly being my distributor for the product So just to recap and I said I go fast and I did go fast The I've demonstrated a HGCP man and middle implementation. It's a complete solution We intercept the key exchange on the fly We derive the shared secrets and synchronize the transmit ciphers we multiplex overlay video using chroma key We avoid decrypting data. So if you notice in the entire path, we never actually decrypt data So we're I call it DMCA safe DMCA says it's illegal to circumvent copyright People say, wow, were you doing this as well? I didn't circumvent anything. I didn't decrypt anything. So how can you be mad at me for DMCA? And we also modify edid records to force compatibility We enable a video compositing function So if you had an old TV or legacy TV that didn't have smart TV, you can go ahead and add that to it You can modify video content now You can block ads you can go ahead and show live internet commentary so and so forth on top of your device and it's a completely open hardware and software stack and I like to emphasize that it's a non infringing use of the master key so there's a sort of legal notion that if you have something that is Has only the purpose of only has an illegal purpose Then owning it is tantamount to sort of committing the crime So if you have a bunch of like I know TNT in your backyard, then they think you're a terrorist, right? So prior to this the only use of the HGCP master key was circumvention, right and the thing that I like the most about this is that it blurs the association of the master key essentially with privacy now You can have the master key. There's a legitimate use for it. It's not infringing. It's commercially useful. It's been well implemented It's not a sham There's a sort of argument that says well you have this like kind of like backup use or wherever it is and then Everyone says backup backup and everyone knows it's sort of tantamount to some something else This one's a you know bonafide use so it helps Sort of legitimize the distribution and existence of the of the master key So thanks for your attention. I'll take questions now Okay, normally you would queue up, but I'll make an exception for you Hey bunny. Hey So given that you're not doing you're doing pixel by pixel substitution Is there a limit with your FPGA and your processor on how many pixels you can substitute given the overall screen resolution? Right, so it's it's all it all happens on the fly and so the limit is limited by the pixel clock rate of the FPGA a Standard Spartan 6 without the really expensive transceivers limit to 95 megahertz picks clock, which is a gigahertz line right basically And that corresponds to a 1080 i resolution or a 1080p 24 It doesn't do 1080p 60, which is a common resolution, but You can actually overclock the FPGA and it actually works most of the time to get to that But as a commercial product we block the overclocking, but it's very easily disabled You could do it yourself if you wanted to If you have questions, please try to queue up at the microphones, but we have one from the Internet, I think Okay, we have two questions What can this do other than overlays, what can this do other than overlays? Well, so this the the UI you see here is a It's it's a webkit browser, right? So It's a little bit tough to in this environment for me to do the demo But basically there are Android apps and iPhone apps that work with this and I can take pictures and share them on the Screen, so just sling the picture to the screen and you can also enter a URL and view a web page on the screen as well And or anything else that you can do, you know imagine coding with JavaScript HTML, right? These are this is just sort of like an example Demo that we did sort of just give you an idea of flavor, but there's not actually the final thing That's it's really up to you guys to tell me what you can want to do with it Okay, right Yeah, and another question Sorry Why don't you hook up your own? Edid Edid yes, okay, or read the original and provide the modified copy from the controller Can you say can you say that one more time? I didn't quite understand it The whole question or the last just a whole question. Why don't I hook up? Your own ID oh Edid, okay, why don't I just go ahead and blast like a generic Edid in because not You'd not every TV is a 720p or 1080p TV There's some really crappy TVs out there You can damage them like if someone actually in the world had a CRT Right and they weren't very careful about it and we actually overdrove the sink You could burn out the tube or something so we have to read the monitors capabilities and respect that and then deselect the modes that we Don't allow. That's why we do the overriding Okay, and the last one how complicated would be to use your own hardware to decrypt the HDCP right how hard is it to decrypt HDCP? I knew that. Yeah, it's gonna come so There's a For I guess for you know strictly legal reasons. There's a substantial barrier that I've put in to Decrypting but it's not it's not like an impossible barrier. It's more like an effort barrier, right? so for example this device here the actual device itself has the master key, but it has no actual Public key of its own it must borrow the public key from a source and a sink for it to work I actually checks to make sure you have a properly licensed device on both ends of the link And that's for another legal reason you want to make sure that you're following all the licensing rules and so forth to do this In order to have it actually just decrypt on its own and needs to provide its own public key someone has to put that in there, right? that's Possible to the extent to this crowd. I mean there's many smart people who could do it But regular consumer could not let it you know easily go and hack the very long to do that So it's theoretically possible, but there is it's the same point for legal reasons I made sure there was at least a barrier so it's not like one was like clipped here and you have like a radio that can listen to like Radio bands or something like that which would create sort of a blurring of the line of the legitimacy of the product Okay question over there Hi there and how many people have been Working on this pretty impressive piece of hardware and how long did it take to actually develop and build? Okay, so the question was how many people are working on it and how long did it take This this hard was signed in Singapore. I've moved there about a year and a half ago We conceived it about last year this time had just some sketches showed to people see what they thought we did a a Stretch card so basically just the FPG itself and we plugged it actually into the LCD port of an existing Chumbie device that we had at the time and Just demonstrated the overlay in May And then we finalized the boards and did the tooling and so forth. We had production by October and Basically, we've been now going through sort of the process of getting out to distribution we had a team of I think at the biggest point it was about five or six people working on it very very talented people and I'm really lucky to be working with them And most of them are softer guys actually actually all them are softer guys I'm the only hardware guy on the team So the hardware is the hardware the the case design the board layout The board bring up is done by me and then the rest of guys do all that really insane stuff with the build system and Linux and you know that you know the software bits that I don't get quite so well, so Okay, another one over there How full is the Spartan and Have you enough room to do a full alpha mixer instead of chroma key, right? so The Spartans at 87% which is pretty full as far as FPGAs goes, but it's got some space There's stuff you can strip out so a lot of it is the line buffers It actually turns out we don't need eight lines you get away with like probably two lines in most cases So that would actually free up a lot of resources alpha blending If you are willing to just outright decrypt the data to do the alpha blending and then re-encrypt It is actually trivial to do. It's just a very small path. It wouldn't take much data There's some very smart guys here at this conference I've been talking to have given me really good ideas on how to do it without ever decrypting the data I haven't implemented that fully but We're gonna we're gonna give that a try and see if we can do something there, but should be able to fit Okay, another question from the internet and then over there Okay How would it be a footprint compatible? Compatible replacement to use the Spartan six parts with the high-speed transceivers Okay. Yeah, so that's the question. Can we put the the The t-series Spartan six and that has like the gigabit transceivers that lets you do 3d TV and stuff like that So unfortunately Xilinx did not make them footprint compatible You actually have to really out the board between the two and that's a difficult So there is a part you can drop in that would allow you to do 3d TV standards and so forth But it's like 50 bucks right the current part. I have is like a tenth that costs so The feeling I have is that the market wouldn't bear the cost of just that much added cost to the device So we we decided to use them a much lower cost part There's a thought that will do like a like a pro version or a higher-end version with like You know for people who are willing to pay that much more money for a device But it would require a full re-spin of the PCB and so forth to good to do it and a lot more money Okay, two questions over there Now the sliding up of the overlay which could be seen a few times during the talk Is it an artifact from the overlay going out of sync with the video feed or what is it? And can it be alleviated or is it just there? Yeah, no, that's um the whole as you saw I was struggling a bit with the demo here There's a bit of a hat going on here. It's it's going from a a Display port to HDMI to overlay to a VGA converter and then So and so forth so somewhere along the way the sink is getting a little corrupted and and when I lose v Sync it rolls a bit just like you would always roll if you lose v-sync on a TV chat set If I think if I didn't have this VGA converter in the middle, it would be much more stable I didn't I never see it on a full digital link But that's my guess as to what's going on Then our question over there Okay, then we have another one from the internet and then there Okay, this is a long question. I will try to make it short Okay How difficult would it be to Hs the FPCA part to make this Part of OSS drivers for this commercial Available hardware for HDMI capture I had trouble understanding how difficult to write what kind of driver a OSS OS X drivers, so you want to write OS X drivers for what purpose for Okay, I must say the question. There are commercial Available HDMI captures interface Unfortunately, there are no OSS Drivers for this yet. How difficult would it be to adjust this? FPCA part to make this part of OSS drivers for this commercial Available hardware for HDMI capture For each so basically how difficult is it to take this hardware and turn it into something that is HDMI capture with OS X I think no, it's about OSS open source software open source The question seems to hinge on the fact that there seem to exist FPGA to PCI Express boards that have an FPGA and an HDMI connector and then PCI express connector right and He wants to know how difficult would be to adjust your approach to Basically run on the FPGA in these existing hardware boards. It should be easy I think I mean the the the very long is open source, right? So you can you can get that and compile it and the interfaces are there So if you had an existing dev board with PCI express and two HDMI ports on it it's you just have to map out the pins and and and and Get it to compile. It's smart. I think Okay, then there's a question Hi, is it possible to split one source to different to two different or more different videos and TV sets and what about merging audio And what was the last part of the question what merging what audio because HDMI is also possible to transmit audio signals Oh audio. Yes. Okay. So the first part. I believe was asking. Can you split it to two different outputs? Yes, you can I mean the board itself doesn't have the second port on it, right? And so one of the limitations of the chip I have is I've now saturated the number of LVDS outputs I have and so you have to go to higher-end chip But if you want to just replicate to end different ports, that's actually quite easy That's not hard at all You just have to pick which one is the master e did that does the transaction and handshaking and the rest of them Slave off of it and it also assumes they're not unencrypted could each device will have their own key So if it's all encrypted you can only go to one As for audio the wires are there to do audio. It's a firmer update just a firmer update to do audio I haven't Audio itself is a little more complicated because there's CRC is around the audio and and some clock adjustment drift and so forth I haven't gotten through and put all the code to do audio But that's one of the things that you should be able to do in the future is to be able to overlay audio as well inject audio Okay, is there another question from the Internet? Oh, we don't know Okay Why don't you use that? Sorry a arm. Why do I use an arm? FIQ to avoid the Linux kernel R IQ latency. Oh, okay when I use an FIQ I don't know it was hard. It was harder than the other way. I did it, right? I think I seem to remember so, you know my a lot of the kernel stuff was done by some of the guys I work with and I help with that but I Think the explanation I had was that we had to do a lot of tweaking on the existing kernel get the FIQs to work And it would be difficult and so it was easier for me to do something in hardware to wrap around it And so that's what we did Okay, it's a hardware problem. I I may speak to that. I also had some similar problems and the FIQ also has some latency So that's not even completely foolproof solution. Yeah, even then okay any more questions from the audience or the internet. Otherwise We seem to be finished.


But I just want to show quickly a couple of projects I've been working on and been involved in over the last several months. I work for an organization called Tactical Tech and we are not for profit and we do a lot of work with activists. A lot of the work we do is around privacy and expression, a lot of work around net freedom. We did some fun stuff last year and it's called Me and My Shadow. The idea of this project was to just kind of look at in a fun way what kind of digital traces you're leaving behind every time you're engaging with technology. So we have this one really cool interactive visualization thing where you can go in and go, oh I use Facebook, I use a computer, I use a mobile phone. How much am I giving away? Oh, I'm so screwed. That's fun but one of the other things that we did was actually look at terms of services and privacy policies of different organizations, different online web services we use pretty much every day and kind of figure out what do they actually say. This is Yahoo. There's some stuff about Twitter and stuff. So basically these are long really and nobody wants to read through them but what do they actually say? That's all we really wanted to get to. So this is what we did. That's what it actually says. We've done this with a few of them. This is with Twitter for example. That's an excerpt from the privacy policy sometime around April 2012. It's long, it says a lot of stuff about, oh we don't do this, we don't do this, we don't do this. What do you guys actually do with my stuff? This is what they actually do with your stuff. Anyway, this is not what I want to talk about today. That's one to use, just poke around a bit and play. This is a slightly more serious project I've been involved in a little bit of late and it's called Terms of Service Didn't Read. So like we all do, I do this too. I just click every time I see a checkbox which says I have read Terms of Service and I agree to it and I just go ahead and use the service. But there are times when I really wonder, okay, how do I actually know what these guys are doing without actually having to read through all of this stuff? And that's what this project does. It's a community project where a bunch of people get together and contribute to kind of rating what different TOS for different websites say. The way it works is there's a working group which is a mailing list which anyone can kind of join and contribute data to.  So I have a little Chrome extension here. Do you see that little question mark right up there in my bar? That question mark exists because there's no class that's been assigned to it. The working group's been doing a bunch of work on this and figuring out, okay, this is what Twitter actually does. It deletes your account after 30 days. It keeps it right to your content. That's a bad thing. Twitter provides archives of their Terms. That's kind of a neutral thing. They do a good thing. They promise to inform about data requests. So if someone's a government's asking them for your data, they are going to tell you that they were asked. So it just basically grades different Terms of Services on an A to E scale.  So a lot of these haven't been graded yet, but yeah, one service that we all kind of like, which has been graded a very high B is GitHub. Most things, they seem to do most things right, except they can change stuff anytime, sometimes without notice. Your personal information is limited, is useful limited purposes. This is what they do with it. And there's a few bad things they do. So yeah, it's just, it's useful sometimes. And it's just something I wanted to bring to everyone's notice because this project could use a lot of help. And I think it's, yeah, it has been helping a lot of people use these services every day. So that's it from me.


Okay, guys, shall we start? So good afternoon everybody. Last session of the day, pretty exhausted I think, everybody. So here we are talking about automate testing with Behat, Selenium, PhantomJS, and Nightwad.js. So speakers, who are the speakers? My name is Nikhil Sukul. I am Senior Drupal Architect in 5G Solutions, a company based in Tune as well as US. I am working in Drupal Domain for the last 17 years, no, my overall experience 17 years plus. I am working in Drupal Domain for the last 9 years or so. I have with me Senior Developer, Drupal Senior Developer, Gaurav. Hi everyone. My name is Gaurav Bashpre. I am a Senior Developer at 5G Solutions. I am working with Drupal more than 5 years. So here we go. So guys, we all are here talking about testing. So let's say what happens when computer is not invented. How you to find the bugs? So when there were no computers, there were no bugs in computers. So everybody was having a plain slate. Anybody found any bug? No. Nobody found any bug because there were no computers at all. Now then we started building computers and we started writing the code for it. And when we started writing the code, bugs started coming. And bugs started coming with full force, based on the quality of code what we write. And then we deploy testers. We get the testers. And what the best thing about testers? See, the testers should not is not on his desk. So we can deploy code, hurry up. We don't have the will in on our plate, so we can always deploy and see the code. And that is not told in the job interview of any tester. Then this kind of situation will happen for a tester. Okay. And this is what happens when you are in support mode. And what you get is somebody in the middle, late show stopper, kind of a person who is a big tester headache, a kind of a bug with any tester can get whenever you are in a support mode and you get a late night call from a product manager that there is a big bug coming on the website. And this is what is said by a product manager or whoever managed the account that actually it is not a bug, it's an undocumented feature. Okay. So these are what we have for testing. So what is testing? So in general, testing is something where we are finding well how something works. So define what something works, what something works means what is being expected. So what is expected as per the software which is being developed as per the requirement of the software, what is expected if the testing is a process of evaluating that particular process and give you the expected output. So how we do testing? We do testing like this. This is a very good slide. You can actually take this slide and give to a client and he will be very happy. See receive the client documentation, prepare the list of scenarios to test and then we send across to the client. The client will say, okay, the scenarios are correct. If they are not correct, it will be keep on iterating. If it is correct, it will go to prepare a detailed test case plans. And then again, you go to the client, then the client will say, no, it's not working. Again, you will keep on iterating otherwise will say yes. And then you will say, voila, my test case is created and now I can execute the test plan. This is what generally how to do writing a test case and how to receive a documentation from the client. And then you go to the execution of a test plan. And why we do testing? What is the requirement? Why we do testing? So testings are good when you want to find a defect in development phases. So people will say, yeah, we do unit testing. But remember, unit testing is a part of test. We have to do unit testing. We have to do testing for whatever code we are writing. And it actually improves a lot for whatever functionality we are developing. It makes customer reliability and the satisfaction and for the application. So a customer becomes more confident with you. He understands that there are less bugs in your application. So he becomes more and more confident that my whatever outcome will be coming from the application will be very reliable, very quality friendly. And while you are testing, please also test for the performance of the application, the performance of the software. So testing is required when you do performance testing for an application. And while doing development for an application, if you are not doing testing, it is very expensive once you find it after the development is being happened. You all agree that once the development happened, if you have a fixed bit project, it is delivered to the client and the client come back with 10 different bugs. It is not in your scope for that cost. It is all beard by you because you haven't tested it properly on the first place. So generally there are three types of testing you can categorize functional, non-functional and maintenance. So functional means you have various kind of testing like unit testing, integration, smoke, acceptance testing, localization, globalization, interoperability and so on, these big numbers for it. Non-functional, which generally happens for every project, it should happen for every project if possible, performance, endurance, load testing, volume testing, scalability testing, usability testing of the application and so on. And then the last is maintenance. There you have regression testing and maintenance based testing, which generally happens based on the support plan. Now who will test your application? Somebody from this group? I don't know, okay. From here? No, I don't think so. From here? Yes, there are few people from here. Can you recognize the picture? Where it is taken from? Zupincon, Dublin. So there are some testers here in this picture who will be doing testing. So let's again categorize testing with respect to execution. So there are two types of execution. Now everybody is getting excited, we are coming to the real thing. This is what the session is all about, manual testing and automated testing. Excuse me, I am not going to cover manual testing at all. I am only going to cover automated testing. But yeah, let's compare it first. What is the difference? Or where the automation testing can be useful than manual testing? So automated testing is very useful with regression testing. Now think about a manual tester. I have a sprint going on and after a sprint he write the test cases and he did manual testing for 500 test cases. After two weeks, again a sprint need to happen, a hot fix maybe. And then the pert manager said, can you please execute 500 again? And this guy will say, I will take a beer first and then I will think about it. Because again I have to think of 500 test cases manually. So let's use automation testing there. And since he is doing manual testing, definitely it's a human testing so it will be slower. It won't be very fast. Whereas if you made an automated testing script, it will be far more faster. It is, automated testing is very good for build verification testing on short form as BVT. The initial cost of automated testing if you create any automated testing framework using the tools, it might be high. You might have to invest some money or invest some time for it. But after some time when you run it, it will be very cost effective. So let's talk about automated testing for this session. This is what happens when automated testing is actually from Stone Age. You can see that. It comes with a computer and it's still being automated the same way. Okay, so automated testings are two types you can categorize. One is the real browser testing. I don't think I need to tell about what real browser testing means. Everybody does real browser testing. You create an application, you open a browser known as C-H-R-O-M-E. Guys, it is Chrome. You open Chrome, you open Firefox, you open R-E. Don't open R-E, it's bad. So let's think of Chrome or Firefox. And those are generally used for real browser testing. It's a no-brainer. You create an application, you create a website, open the browser, do testing on it. You find your test there. You can see whether there's a error and you fix it. Then you have headless browsers. Headless means no head. So headless means the browser testing doesn't require any graphical user interface. Now this can be automated because it is not requiring you to open a browser. And you can actually do the testing or writing a script in headless which can do the testing for you. The examples are PhantomJS, ZombieJS and all. I love zombies. Yeah, really do. So what is the difference between headless and real browsers? Headless are faster than real browsers, definitely. Because I am not opening Chrome, clicking on the button and doing it is actually happening everything in the background.  Headless browsers are not representing real users. Yeah, so I won't be writing the headless browsers with the 500 users name. I'm only writing a headless browser with one functionality and say that please log into a particular system, check login is working or XYZ is working or not and give me the test case output of it. I won't be saying that Jack will be logging or XYZ will be logging. I can give, I don't have to give any names for it. So there's no real user who's represented for headless browser testing. Array detection in by the way in browsers are real browsers are easy-peasy because it is visual. You're actually looking at the browser and you can find out very easily where the bug is. Whereas in the case of headless, you have to wait for the reports to come out. So when the headless browser will do the background testing and the reports will come out, then you will see that there were ten test cases which were failed based on what functionality you have asked for. And headless browser doesn't support Ajax. I mean Ajax are browser based. So headless doesn't have a browser, so doesn't support Ajax. Anybody has idea what is this? Anybody? Yes? Okay, very close. It is Selenium Firefox plugin. So it's a Selenium IDE which is being used for Firefox. And it is good for those guys who want to start Selenium IDE or you want to start what Selenium does actually. If you install a Firefox plugin of Selenium, you can actually record all your functionality there. It will generate scripts in the background. And you can run the script again. It will record all the actions there. To the beginner, this is a very good tool. So what is Selenium? Selenium is a web driver. It's a collection of open source API and it is used to automate your testing web application. And above all, it is platform independent. It is one of the, I think, first automated testing web driver which is being used. Very popular web driver and it is very successful in its automated testing domain. How Selenium web driver works? So they are actually having, it is actually working in Java. So Selenium is absolutely based on Java. So it has their own interfaces which are written in Java. A class need to implement those interfaces. A class can be a Chrome class, a class, a driver of a Firefox driver. And those classes which are being implemented on interfaces can have their own functionality. So the Selenium web driver gives you an interface from which you can actually create based on your browser different interfaces. You can download Selenium from this link. It will give you a Java file, which means you need to have Java to run Selenium there. Gaurav, can you show that? Sure, I'm going to start Selenium server. So Gaurav, I'm going to start the Selenium server for you guys and show how Selenium starts. These are the basic commands which is Java-jar that driver name. So you can see, jar is a command to extract the jar until run in a particular port. So when you hit Enter, it will actually say blah, blah, blah, and say Selenium server is up and running. So now Selenium is running for you, right? Okay, let's go back. Sorry guys, we didn't test it this, so it happened. Okay, so next, talk about Behat. So I think I heard about Behat when I was working in Drupal itself because when there was a module for Behat in Drupal, that was the first time I learned about Behat and it was really amazing. When I saw that, I can write something in plain English, rather than writing a JavaScript code there. So Behat is an open source behavior driven development framework which is written in PHP and it's actually used a special language, English-like language known as Gherkin. So it's a business readable, specially behavior description, and it doesn't have any logic, it's more like a plain English. So think of a tester who doesn't understand any programming language, but know how to write test cases in plain English, and he wants to use an application so he can use Behat. He can write test cases directly in plain English in Behat, which will be converted into a machine language using PHP, which can be used by Behat to execute the test cases. This is an example of Gherkin, how to write a test case. So there are something like feature which is there in Gherkin, then you have scenario, some intermediate business situation, then given and when these are the keywords, you can use whatever you want and you keep on writing scenarios and based on the scenario, the PHP will generate a script for you automatically. So then next come is Mink. So Behat is a testing, so Behat is a testing tool. Now Mink is a simulator for that Behat. So Behat will give you an idea, this is an English-specific language, I can use Gherkin, I can write test cases. Now how to execute test cases? So those test cases will be executed if you use Behat with Mink. So Mink is a simulator for Behat to execute it on the browser. What is a browser simulator or browser emulator? It's an abstraction layer, so it's not actually a real browser, but actually giving you the feel it is running in the browser and running it the same way in any browser the things will work. So Mink supports with respect to browser both headless as well as in-browser capability. It is also having capability with single consistency and it is written in PHP 5.3+. You can download Mink and install with Behat, the link is available here. So let's show about Mink. So the first thing what we are showing here is Behat with Mink with headless, that is there is no browser interaction. So once you run it, what happening is it is actually giving a scenario. The scenario is written as Gherkin and what is happening? He is actually giving a I am on slash, that is the URL. When I will follow login, which is a button, I will fill username and password. These are the username and password. Admin address 123 is my own Gmail password. Please use it. Then we say login and then we say logout and my account. This is the scenario. It will attempt. Then again it will attempt another scenario with wrong credentials, bogus pass. What a wrong credential. Then again login and again my account. So it will say that for two scenarios where two passed, it will take 14 steps. It will execute everything and give you the output. Now this is headless part of Behat. Here is another one. Now Behat with real browser. So it is opening the browser in the background. It is logging the same credentials. Now both the credentials are written and then it stops. It was very quick. If you guys have seen it, I can't slow it down. But what happened was whatever was in the headless scenario is now being run by Behat using the browser. So the headless scenario works very well when you have a continuous integration engine like Jenkins or anything, where you can want to see the pass and fail. And Behat scenarios where you want to execute the test cases on real browser and check it out how it works there. So next is PhantomJS. Now what is PhantomJS? PhantomJS is a headless browser. So headless browser means that it doesn't have a browser. It's only a headless browser. But it also requires you a JavaScript API to write code to execute few things in that headless browser. So PhantomJS, you can download Phantom from here if you want to. And PhantomJS is good for headless website testing. Again PhantomJS doesn't have its own test runner, which means when you're executing PhantomJS is not going to give you pass or fail. It will actually execute few things like you can execute the test cases if you want to. You can do a screen capture if you want to. You can actually select the HTML element using PhantomJS and see how it is working. And since it doesn't have any test framework, it is only used for those kind of purposes. But okay, let's see Phantom first then we'll go for Casper. So let's see what Phantom can do. Okay, so can you open the folder of Phantom? So what happened there was, okay, let's for the people to see whether it is really working. Let us try again. Let's delete all these two images. We are trying to create the screen capture functionality with PhantomJS. Now if I go to the folder again, it is being executed again. Can you show the code of PhantomJS from where we have done it? So here what is happening in PhantomJS? You can see there are few objects available there, page.open, page.evaluate. These are JavaScript API available within Phantom.js. And what we are trying to do is we are trying to grab the elements from query selector like clicking the element, then give the name, give the password and click on submit. And it will again render the login page. Whatever is being output here, we are taking the screenshot of that and putting in the same folder. Can we show the screenshot? So this is what happened when you logged in in admin and admin credentials. We took the screenshot of that and the second one. And this is what has happened after you logged in. So one is before login, you took the screenshot, took in the credentials and one is after login. This is what PhantomJS is doing with just JavaScript API. Now you might have seen, I haven't used Selenium here. I have only used PhantomJS. So PhantomJS doesn't require Selenium to run this thing. It can run it standalone by itself. Now what is Casper? Now CasperJS is built on top of PhantomJS. And what is capable of? This can be used as a test running tool. When you run CasperJS, it uses the same kind of PhantomJS APIs. On top of it, it can actually give you the perception of pass and fail. Currently what we did, we just did the screenshot, right? But we want to know after admin, whether it was done pass or a fail scenario, you can capture using CasperJS. Okay. So here what's happening? I clicked on Casper underscore loginJS. It is actually using same PhantomJS script. But on top of it, it is having its own wrapper for Casper. Once I execute it, it's giving me the scenarios. Pass, pass, pass. M3 were passed. It took so much amount of time. This is being done using CasperJS, which is run on top of PhantomJS. Now show the script. Now using CasperJS, if you see, they are using similar kind of assert exists. These other assert exists which are available in CasperJS. Rest everything are based on the API available in PhantomJS. So based on that, we are running it. And based on this, we are getting the output of a test case. Now, lately, I actually went through a session which was given in one of the Drupal con for nightwatch.js. So there are so many other tools which are available. Nightwatch.js is also one of them. Now what nightwatch does is actually based on Node.js. It's an end-to-end testing solution. And it has a big web driver API. All these are good. But the major aspect for nightwatch.js is it is used for real browser testing. It is not headless. Like CasperJS, PhantomJS, which are headless. Nightwatch.js is real browser testing. It is used along with Selenium. This is the architecture of nightwatch.js. So it has a test script. It has a test runner. It takes the Selenium and the way we were talking about the web drivers of Selenium. It takes like that, runs based on the web browser. So it's a real browser testing framework. I'm going to show demo. Now let's see the nightwatch demo. So before that, nightwatch, once you install, it gives its own executable, nightwatch. Then you can give the command for DrupalLogin. T is for testing. Then DrupalLogin.js, whatever you have created. Then json is the file. And c stands for configuration. So it's a real browser testing. It will open the browser. It will again log in. Once log in, it will say, okay, this is already being passed. Then it's going to second section. It's going to give the bad username password. And it will give the assert. And then it becomes a total. So it's a real browser testing with respect to nightwatch.js. Now let's see the code of nightwatch. So for nightwatch, you can write something like this. We have given pause deliberately so that we can show you clearly what's happening. But in night browser, it is very much JavaScript language. It is being written. And it has a very simple way of writing the code. It grabs the thing the way you can see elements are getting grab of HTML. And then it is being executed. Okay. So all this what I have just told you, it's a bit confusing. Few of them are headless. Few of them are real browser testing. Few of them are both. Which is what? What to use and where? So let me go through it. Okay. This will be, we'll start slowly. Okay. Let's start one by one. Now pay attention here. It's a GIF. Okay. I can't control it. So one, two, three. This is headless browser. I am giving a notion. This is real browser. Okay. They are dancing. B hat plus Ming plus Selenium all goes to real browser testing. Okay. B hat plus Ming plus Selenium goes to real browser testing. If you come together. Night watch plus Selenium goes to real browser testing. They are any way real browsers. B hat plus Ming plus go to driver. Goes to headless. They are again headless. Okay. Fourth one. Phantom and Casper. They are headless. Right. B hat plus Ming plus Selenium plus Phantom goes to headless. Okay. Come on. Done. Now go down. If you want, I can try one more time. Just for your information. Let's try again. Okay. Headless browser and real browser. Please dance. Okay. B hat plus Ming plus Selenium goes to real browser testing. Okay. Yeah. Got it. Next. Night watch plus Selenium goes to real browser testing. Because night watch is real browser testing. Okay. Third. B hat plus Ming plus go to driver. Goes to headless. Okay. Fourth. Phantom and Casper. Headless. They don't have any head. B hat plus Ming plus Selenium plus Phantom goes to headless. Sure. Come on in. Yeah. That's it. Okay. Yep. Always goes to a real browser. A very last example where it's Phantom. So this evening we've seen Phantom. Just one more browser control. Absolutely. I really like the observation. So there, Phantom is already a browser. Selenium is already a browser. Yeah. A web driver. So you can either use Phantom or use Selenium. If you install both, it doesn't matter. It becomes a headless browser. Very good observation. Yeah. Because I have a covered PHP unit. Whatever I have covered, I just took that. For that, I have another session which I will give an afterwards about PHP unit and simple unit and other things. But I will touch separately for it. Yeah. So for a while, like two months later, nothing worked. Like the drivers were no longer compatible with the current version of the browser. Was able to sort that out. The project was installed for a couple of months and the same thing happens. Like the drivers are no longer compatible with the latest versions of the browser. So I find that we need that to catch up. And in the end, we just decided to go on, like in the Damian package manager, go to an operation and try to work with operation of the Selenium driver. And the drivers in this case were like the browsers. So how do you catch up with all the latest versions of everything? Like I know it's a little bit different. Yeah. So how do you keep up with that? So I think we keep up the same way the way Drupal.org keep up with the latest version. We need to keep up updating the drivers whenever, as soon as they come. But in my opinion, based on whatever we have seen so far and what we are using, we are going towards more on JavaScript-based browsers now, phantom.js and all rather than only dependent on Selenium. Because Selenium is a Java-based browser and it requires a Java-based setup for everything. If you go for something that doesn't require a Java-based setup and you can still do the work, it will be better. And this way we are more working towards phantom.js and all the others, which doesn't require Selenium as necessary. Okay, so we did that. If you have seen, we run the same test in Headless as well as the same test in the browser. The difference was that there is a message for wrong user which was coming. I was giving a bad password that was coming within the browser itself. Whereas in the case of Headless, it will be a pass-off scenario there. You can see in the command line. What's the difference? Yeah, I understand. Don't worry when the YouTube will come to pause it and slowly go through it. It will be easy. Yeah, I think the main reason which we are tempted to go for Headless is the complexity of a project and when we have to do regression testing a lot. And I still believe that we should do the first round of testing as manual for UI, if possible, because you see the visual changes very clearly. Okay, otherwise I think it will be really good if we can do the manual testing or the way it is being done, opening the browser and closing the browser thing. But using Jenkins as a continuous and empty engine, it is better to use Headless there. And then you get the test cases and see the pass and fail what is happening there. My vision for this session was because when I was keep on trying to get various Headless as well as the real browsers sessions across the board for various places in internet and never find any session which is talking all four about it. It is always one single place for one single technology. And I was really getting confused. So I installed four and say I will give all four. Give from my side. Be happy. Yeah, so I think if there is a session of Night Watch in Drupalcon, which has happened by that person. If you see that, he is actually using Night Watch to call browser stack from an API. That is possible because they are real browser testing. And then from the API, you can execute it there and you get the check results. So we have tried that and it works with respect to that. So I think that's the way it works for browser stack. No, it's not so complicated at all. Sorry. Yeah. But this is Night Watch, right? So Night Watch was using an API from browser stack. Yeah, Selenium Viya, which is actually doing that and getting the things. I haven't tested with API. I haven't tried it, but I will do. Anybody else? Thank you.


Hello, everyone. Welcome back to another mid-journey tutorial. And this one is going to show you how to combine images for a unique look. For example, I've got a samurai here, and then I've got this burning village here. I combined them, and I got a samurai standing in front of a burning village. How did I do that? Simple. All you got to do is hit this plus sign here. This allows you to upload a file or files. You can upload multiple. And I'm just going to select two images. I'm going to select a burning village. I'm going to hold down Command. And then I'm going to select the samurai or its control on a PC. And then presto, click Open. Both of them go up. I'm going to hit Enter. Now they're uploading. The next step to combine them is just I'm going to left click on the first image here. And now I'm going to right click on it, and you're going to see Copy Link. Select that. Click Out. Now go to your prompt, type in Imagine. And then just copy, paste that in. Now hit Spacebar. And now I'm just going to click on the second image, which is the samurai. Right click on him, Copy Link. Click Out. Make sure there's a space here, Command V. And now I've got the two images links in there. I'm just going to hit Enter, and I'll come back right when it's done. All right, welcome back. Let's see what we got here. Click on it. Yeah, very cool. We've got that samurai right in front of a burning village. How good is that? If you don't get great results, make sure that you have dash dash V4, meaning that you're in version 4, because version 3 wasn't that good at this. And yeah, there you go, guys. Thanks for watching.


It fascinates me how many women are holding on so tight to a mediocre relationship, to a bread from relationship, to a situation ship they hold on so tight. But Jonathan, I have this amazing chemistry with him.  Okay, I get it. And again, he maybe has a full head of hair or whatever it is that you think that you won't get with the next generation of guy. Not generation, but the next person out there, that you're literally hung up on this fear-based way of dating.  This is why I continually recommend book after book, including my book.


Bismillahir Rahmanir Rahim. Hello, we are going to share importance of self-management. And it is very important to know about how a person is committed with the goals and also with the objectives of the life and also doing some activities. We will see about it is helpful in the lifelong learning. And we are also seeing that it is associated with organizational goals. It is associated with our goals. And then the goals that are established with other people, that is collective effort for achieving the commitments and also achieving those goals. We are seeing that it is associated with different objects. And then with the performance and organization, how is to accomplish all sort of activities which are related with others and all activities are entirely related with the organizational activities and goals. The personal productivity of the person is going to improve itself. He is feeling a change in his abilities. This change in his own activities is his success. And this is the mark of self-management. And this is what we want to create a sense in him that he should feel the sensitivity of the time. And that his commitments should be fulfilled and a comparison should be made with him. And these are all leading towards the success of the life.  Similarly, a broader personal network is designing a device. I have to do many activities. His personal activities, his academic activities and his social activities are developing a connection between them. And similarly, there are many things in which he has to face some problems. There are some complex problems too. Whether he is demoralized or he strengthens himself with his own successes and efforts and he tries to self-control himself. And he makes himself successful. He is also willing to embrace a different change. He feels that he has to make a new thing. He observes other things and he likes what he likes. He doesn't want to repeat what he has done before. He wants to move ahead. And this is only possible when he learns to do small things. And when his footing is established, he starts moving ahead. And similarly, he is observing a lot of things in the organizational structure. He is observing his coordination, his interaction with people. And overall, the performance of the organization is correlating its own performance with it. He wants it to establish its own ability with respect to all other organizational persons and organizational structure and goals. Same like his work definition is kept in front of him. He keeps the situation in front of him. And he develops new things, new opportunities and new definitions. And he develops his potential in such a way that he can develop a sense of what I am and what I do. And he compares with the other sometimes. Whether I want to be like this or I want to move ahead. And these small things lead him to self-management. He establishes himself with the help of self-management activities. Thank you very much.