When installing Windows from an ISO on a typical Intel-based PC, the process is usually straightforward—create a bootable USB drive, install the OS, and you're good to go. However, installing Windows on an ARM-based device like the Surface Pro X is a whole different story. This is because the standard ISO files don't include the necessary drivers for ARM-based devices. Therefore, you need to manually inject drivers and take additional steps to ensure everything works smoothly. In this guide, I will walk you through the detailed steps I used to successfully install a clean version of Windows 11 on my Surface Pro X.
With the release of Edge based on Chromium and Edge WebView2 Runtime by Microsoft, Chromium has been playing an increasingly important role on Windows desktops. In daily work, when a user opens Outlook to send and receive emails, uses Teams for meetings, and browses the web with Edge, there are already three instances of Chromium running simultaneously on the operating system. In a corporate environment, configuring the system to use a PAC (Proxy Auto-Configuration) script can place significant request pressure on the servers hosting the PAC script in today's widespread Chromium ecosystem.
Managing IT environments in enterprises often requires installing or replicating specific software versions to troubleshoot customer issues or conduct tests. I recently faced a situation where I needed to install a specific version of Office 365. In this blog, I'll share my experience and the tips I learned.
In software development, choosing the most efficient method to parse large datasets is crucial for performance. I conducted an experiment to compare two different approaches for counting line breaks in a large text file using Node.js: using indexOf
and manual byte-by-byte checking.
If you've ever developed HTML emails, you're likely aware of the challenge they present. Unlike modern web browsers that largely adhere to web standards, email clients like Microsoft's Outlook have unique quirks that can make your perfectly crafted email look different from what you intended.
With the retirement of IE11, many Windows users find it challenging to determine the Security Zone of a URL by the traditional method of opening a webpage in IE and checking the page properties. This poses a significant inconvenience for system administrators and security analysts since Security Zones are crucial for understanding the safety of URLs and their interaction with the system's security policies.
Recently, I conducted an identification test on WiFi7 wireless network cards and encountered some intriguing issues and solutions that I'd like to share with you all. Previously, when identifying network card properties on Windows, the Win32_NetworkAdapter class was commonly used. If the returned PhysicalAdapter
property is true
, it signifies that the card is a physical network adapter. However, when conducting the same test on WiFi7 cards, I discovered that all the PhysicalAdapter
properties returned by Win32_NetworkAdapter
were false. Further research indicated that Win32_NetworkAdapter
is now deprecated, with MSFT_NetAdapter class being the recommended replacement.
With the increasing need to support Windows 11 ARM64 cases, I've found myself needing to run this operating system in a virtual machine (VM) through Hyper-V. Although similar, installing a Windows 11 ARM64 VM isn't quite the same as installing a 64-bit Windows version. One of the main differences is that you can't directly use an ISO file for installation. Additionally, you won't be able to enable TPM on a Windows 11 ARM64 Hyper-V. This blog post aims to guide you through the steps to successfully set up your virtual machine.
Working with TypeScript often involves precise type checking and sometimes necessitates repetitive type assertions to tell the compiler what we "know" about a variable's type. While the language's robust type system enhances code quality, sometimes it can get verbose, especially when dealing with DOM elements. This blog post aims to introduce a feature in TypeScript called User-Defined Type Guards, a way to reduce redundancy and make your TypeScript code more readable and maintainable.
Addressing the frequently encountered issues with the upgrades and installations of Edge or Edge WebView2, this article aims to help readers gain a better understanding of the common scenarios in the MicrosoftEdgeUpdate.log
.
When working in development environments, it might be necessary to generate your own Certificate Authority (CA) and SSL certificates for testing purposes. These instructions use OpenSSL, a powerful toolkit for the SSL and TLS protocols. Below, I've detailed how to create these certificates on Windows, but similar processes can be applied across different platforms.
Microsoft Edge's Application Guard is a security feature that helps protect your organization's devices and data by isolating potentially malicious websites in a separate container. There are two modes of Application Guard: standalone mode and enterprise-managed mode. In enterprise-managed mode, all new Edge windows for untrusted URLs will be opened in the Application Guard container by default. As an administrator, you can specify certain URLs as trusted, which will be opened in the user's host. All other URLs that are not specified as trusted will be considered untrusted and will be automatically opened in the Application Guard container in Edge. In this article, we will cover how to configure Application Guard in enterprise-managed mode using Group Policy or Microsoft Intune.
On-premises sync allows Active Directory (AD) users to roam Microsoft Edge favorites and settings between computers without connecting to Microsoft cloud services. This feature is available in Microsoft Edge version 85 or later.
As a chatbot developer, it is often necessary to run your chatbot locally and map localhost to the internet using ngrok. However, every time ngrok is started, the URL it generates changes, which can be a hassle when you need to update the endpoint for your chatbot in Azure. To solve this problem, we can implement an automated process that retrieves the ngrok endpoint and updates the Azure bot endpoint for us.
Edge and Chrome do not allow users to install extensions outside of the Edge/Chrome Web Store by default. This article will introduce how to deploy a self-hosting Edge/Chrome extension to the Microsoft Edge browser, including allowing users to install external extensions manually and silently installing external extensions in Edge.
I have dealt with many Edge crash issues in my work. Most of them were caused by third-party modules, resulting in Edge failing to launch. Some of these crashes occurred in both Edge and Chrome, while others only happened in Edge. There was only one case where the crash was caused by a bug in Blink (The rendering engine of Chromium) and affected both Edge and Chrome. I am writing this article to summarize the steps to take in order to eliminate the possibility that an Edge crash issue is caused by a third-party module.
In this article, we will go over several command-line flags that can be useful for troubleshooting issues with Microsoft Edge and Google Chrome. These flags allow you to override certain default settings and can be a valuable tool for debugging problems. I will periodically update this page with additional flags as needed.
The Windows 10 version 20H2 release automatically includes the new Chromium-based Microsoft Edge browser instead of the legacy version of Edge. This article provides general information about Edge on Windows 10 version 20H2.
My Azure VM sometimes gets deallocated for some reason, so I created a PowerShell script and configure it as a scheduled task to monitor the VM status and start the VM once it is deallocated. The script uses a precreated Azure service principal
to automatically authenticate Azure and Azure PowerShell cmdlets
to detect the VM status, if the status is deallocated
then it calls Start-AzVm
to start the VM, the script execution result is recorded to a log file.
Bot Framework (v4) provides OAuth sign-in feature to authenticate against an OAuth login provider. However, there are few samples showing how to use Sign-in Card to authenticate against a third party login service. This article will show you how to use Sign-in Card to authenticate a third party login service.
Symptom: Edge failed to start and browse any webpage, it always showed: "That's odd... something stopped working, so this page can't load." The detailed error message was: Unable to create content process", error code was: 0x8027025b. The root cause was: "ALL RESTRICTED APPLICATION PACKAGES" permission was missing on system folder: C:\Windows\System32
and "S-1-15-3-1024-1065365936-1281604716-3511738428-1654721687-432734479-3232135806-4053264122-3456934681" permission was missing on HKEY_LOCAL_MACHINE\Software
. This article will show you how to fix this issue by adding back the right permissions.
The 2019 July update: KB4507460 of Windows 10 version 1607 and Windows Server 2016 has a known issue where Internet Explorer 11 and applications using JavaScript or the WebBrowser control may fail to run. Logic App Editor in Visual Studio is also affected by this issue since it uses Internet Explorer render engine: mshtml.dll and jscript9.dll to display the webpage in Visual Studio. The provided workaround in KB4507460 does not fix the issue of Logic App Editor as Visual Studio has its private registry keys, this article will show you how to work around this issue by changing Visual Studio private reigstry key. Latest update: Microsoft has fixed this issue in 2019 August cumulative update: KB4512517.
QnA Maker can automatically create a Bot on Azure that links to the knowledge base you have. Recently, I was asked many times that the QnA Bot created by the template does not display the follow-up prompt. The follow-up prompt is just a PREVIEW feature of QnA Maker. The QnA Bot template has not supported this follow-up prompt feature yet. Before Microsoft Bot Framework
officially supporting follow-up prompt feature, we have to make code change in order to support it in our QnA Bot. In this article, I will show you how to implement the follow-up prompt by changing the Bot code.
I've started supporting Microsoft JDBC Driver for SQL server. The driver provides Java database connectivity from any Java application, application server, or Java-enabled applet. As a beginner of Java programming, I am writing this tutorial to record how to create a simple console Java application to connect SQL server using JDBC Driver.
HTTPS is widely used on Internet to secure the data being transferred. However, when a browser needs to send a HTTPS request through proxy, since the request hostname and port number are all encrypted in HTTPS request header and even the proxy cannot get them, then how does the proxy know where to send client's request? To solve this problem, the browser sends a HTTP request with method CONNECT and the target hostname and port number to the proxy. When receiving the CONNECT request, the proxy establishes a TCP connection to the requested hostname on the specified port and then returns HTTP 200 response to tell the browser the requested connection was made. After that, the proxy should just blindly forward the packets back and forth between the client and the server without looking at them until the tunnel is closed.
I was developing a tool to inlinify the external Web Worker references in a JavaScript file. It checks all external Web Worker references like: new Worker('worker.js')
and then reads the content from worker.js
, eventually transforms the external reference to inline reference like: new Worker(window.URL.createObjectURL(new Blob(["/* the code of worker.js */"])))
. The function of the tool seems to be very simple, I was considering to use Regular expression to find out the value of the external Web Worker reference, however it turned out that a lot of edge cases cannot be covered by the Regular expression solution. In the end, JavaScript AST (Abstract Syntax Tree) parser became the life saver.
I was recently developing a text file parser based on File Reader API in browsers. To prevent the heavy file parsing job from blocking the UI thread, using Web Worker to parse the file would be the best choice. Web Worker needs to parse the text file into lines and transfer each line to the main thread. We will encounter performance issues on transfer speed and memory usage when Web Worker needs to pass hundreds of thousands, or even millions of lines. Most browsers implement the structured clone algorithm that allows you to pass more complex types in/out of Web Worker such as File, Blob, ArrayBuffer, and JSON objects. However, when passing these types of data using postMessage()
, a copy is still made. Therefore, if you are passing a large 100MB file, there's a noticeable overhead in getting that file between the worker and the main thread. To solve this problem, postMessage()
method was designed to support passing Transferable Objects. When passing Transferable Objects, data is transferred from one context (worker thread or main thread) to another without additional memory consumption, and the transfer speed is really quick since no copy is made. However I still see notable performance issue when Web Worker needs to pass massive Transferable Objects.
The FileReader
API in HTML5 allows web browsers to access user files without uploading the files to the web servers. It not only lightens the load of web server but also saves the time of uploading files. It is very easy to use FileReader.readAsText()
to process a 300K log file. However, when the file size grows to 1GB, or even 2GB, then the page might crash in browser or not function correctly. This is because readAsText()
loads the full file into memory before processing it. As a result, the process memory exceeds the limitation. To prevent this issue, we should use FileReader.readAsArrayBuffer()
to stream the file when the web application needs to process huge files, so you only hold a part of the file in the memory.
It is very common to use anonymous functions as parameters in JavaScript. Event binding, async callback and so on all use anonymous function. ES6 introduced new Arrow Functions which has shorter syntax as a replacement for anonymous function. The basic syntax is: (arguments) => {expression or return value}
.
We can use the form: varable.property
to get and set the value of an object: var obj = {a:1}
in JavaScript. This is the most common and convenient way we code in JS, however the property that is created in this way can be easily modified and is enumerable. The Object.defineProperty() allows precise addition to or modification of a property on an object. It has been widely used in some popular two-way binding JS libraries.
Before solving website compatibility issue in IE11, we need to understand the nature of compatibiltiy issue and our target. Most webpage compatibility issues in IE11 can be divided into following two scenarios:
After upgrading to IE11, web page layout may be broken. The most common reason is the web page runs in a newer document mode in IE11. However, the layout issue might still occur even if the document mode is same as before. This is because IE11 uses natural metrics
for font rendering while previous IE versions use Windows Graphics Device Interface (GDI) metrics
.
Some IE/IIS issues may involve client certificate. It always took me hours to deploy a test website that requires client certificate. Therefore, I am going to write this blog to record every steps including: creating self-signed root CA, server certificate, client certificate and configuring IIS.
I have used Visual Studio to deploy Azure Website, the integration of VS and Azure makes web deployment very easy. However, I have another website that is built by Gulp automating tasks. And therefore, I was looking for a single command to deploy website using Gulp, like: gulp deploy
. Azure offers many options to deploy Web App: Visual Studio, Git, Powershell, FTP, manual deployment. After weighing all the factors, I chose Gulp + Git to automate the deployment. Each Azure Web App allows user to create a Git repository as the deployment source. Local Git Deployment to Azure App Service shows how to enable the Git repository from Azure portal and how to deploy your app to Azure App Service from a Git repository on your local computer. This article will focus on how to automate the deployment using Gulp.
We usually need to rerun node server.js
when debugging Node.js project, which is painful and inefficient. Actually we can use nodemon to automatically restart node by monitoring the files change.
Compatibility view is unable to resolve all compatibility issues in Internet Explorer 11. Enterprise Mode was first introduced in April 2014 IE11 cumulative security update. It was originally aimed at emulating the behaviors of IE7 and IE8 to avoid the common compatibility problems associated with web apps written and tested on older versions of Internet Explorer. Later update of this feature added the ability to specify the document mode (5~11) for a certain website. In order to use comprehensive functions of Enterprise Mode, please first update IE11 to the latest version: KB4018271.
I was recently researching HTTP/2. However I can only see encrypted network packets in Wireshark because all browsers only support HTTP/2 that run over TLS. Actually Wireshark does provide some settings to decrypt SSL/TLS traffic.
Compatibility View is the most common backward compatible solution in Internet Explorer, it can be configured by Compatibility View Settings, Group Policy and Local intranet security zone. We can control some of the sub-domains to be displayed in Compatibility View and some of them not by using these configurations.
Browser Mode determines the User-Agent that Internet Explorer sends to servers and the document mode Internet Explorer defaults to. This article is going to explain the relationship between them in detail.
I recently encountered an issue that a webpage does not function in IE11 with exception "SEC7111: HTTPS security is compromised by (null)". It turned out it was caused by using document.write()
function in the HTTPS webpage.
ECMAScript 2015 (ES6) provides a stricter way to declare variables: let which can be used to supersede legacy var statement. The let statement declares a block scope local variable while the variables declared with var are scoped to the function block level. Although it is very loose and comfortable to declare variables with var, but this characteristic usually leads to some unexpected behaviors, especially in a complicated project.
We need to take special care of the performance while hooking up to the onscroll event as it fires more frequently with shorter interval time comparing to other events like mouse and keyboard. The FPS drops if your onscroll event contains elaborate logic or animations. In addition, user usually scrolls the mouse wheel continuously, it may aggravate the FPS drop, increase the browser CPU usage and impact the user experience. Developers sometimes don't notice such kind of issue since most development machines have better performance than normal user machines. Next, let's talk about how to prevent the performance issue caused by onscroll event.
Recently I was adding comment function to my blog article pages, IE always prompted message: "Internet Explorer has modified this page to help prevent cross-site scripting" when browsing a specific article page. After debugging by Fiddler, I found the reason was that the article title began with: JavaScript:
, which triggered the XSS filter considering it as a javascript protocol string and blocking the web page. Actually the title was just a normal string without any script code.
External file references in web page like: JavaScript and CSS may block page rendering. They force the browser to wait for the files to be downloaded, parsed and execute. Assuming that there is a JavaScript file reference which needs 2 seconds to be loaded, then the browser will stop rendering until the JS file is loaded after 2 seconds. We need to eliminate any potential blocking external JavaScript and CSS files when optimize web page.
The browser sends http header: If-Modified-Since and If-None-Match to check whehter a static file has been updated when it fetches the file again. If the file has not been updated, the server would send 304 Not Modified HTTP header message and the browser would use cached version instead of downloading the file again. This is the default cache mechanism of most web servers, however there is some room for improvement in the web performance. The default cache behavior still requires establishing HTTP connection between the client and the server in order to check whether the file has been modified. It may takes the browser tens to hundreds of milliseconds to talk to the server and it also consumes server resources.
It is easy to confuse attribute with property when manipulating DOM object by JavaScript. document.getElementById('test').getAttribute('id')
, $('#test').attr('id')
, document.getElementById('test').id
and $('#test').prop('id')
return the same id: "test". In this article, I will explain the differences between attribute and property.
Beginning January 12, 2016, older versions of IE browser (8~10) will not be supported anymore. A growing number of enterprises and individual customers start migrating to Internet Explorer 11. Upgrading to IE11 is an easy job for individual customers, however it could be challenging to IT administrators in large enterprise as they need to ensure the success of hundreds and thousands PCs.