<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7761120478392541874</id><updated>2026-10-06T12:51:52.551+03:00</updated><category term="Windows"/><category term="Visual Studio"/><category term="asp.net"/><category term="Authentication"/><category term="security"/><category term="Node js"/><category term="VB.net"/><category term="Windows 7"/><category term="Node modules"/><category term="Windows Identity Foundation"/><category term="powershell"/><category term=".Net"/><category term="IIS"/><category term="MySQL"/><category term="Windows 8"/><category term="BSOD"/><category term="C#"/><category term="Claims Based Security"/><category term="Federation"/><category term="Sharepoint"/><category term="Sql server"/><category term="WIF"/><category term="certificate"/><category term="configuration"/><category term="dnn"/><category term="dotnetnuke"/><category term="git"/><category term="hyper-v"/><category term="openvpn"/><category term="Azure"/><category term="Chromium Embedded Framework"/><category term="Custom STS"/><category term="Input Languages"/><category term="Language bar"/><category term="MBR"/><category term="Metadata"/><category term="Recovery"/><category term="SilverLight"/><category term="Ubuntu"/><category term="debug"/><category term="development"/><category term="dos script"/><category term="drivers"/><category term="gcc"/><category term="iOS 5"/><category term="iPad"/><category term="k3s"/><category term="kubernetes"/><category term="linux"/><category term="membership"/><category term="mvc"/><category term="repair"/><category term="reset password"/><category term="save-password option"/><category term="webinos"/><category term="2007"/><category term="AC"/><category term="ADFS"/><category term="Atheros"/><category term="Big Blue Button"/><category term="Boot sector"/><category term="C++"/><category term="Compcln"/><category term="Conference"/><category term="Cromwell"/><category term="Custom Configuration Section"/><category term="DELL"/><category term="Device manager"/><category term="DiskPart"/><category term="Duplex Printing"/><category term="Encoding"/><category term="Event Viewer errors"/><category term="Exchange"/><category term="File"/><category term="Format"/><category term="GRUB"/><category term="GRUB2"/><category term="Genomics"/><category term="HP LaserJet"/><category term="HPC"/><category term="IHttpModule"/><category term="Keyboard Layout"/><category term="LDF"/><category term="Lenovo"/><category term="MVPL"/><category term="Microsoft Robotics Studio"/><category term="OMCI"/><category term="P2015dn"/><category term="PHP"/><category term="Productivity tips"/><category term="Profile"/><category term="Remix"/><category term="Reverse engineering"/><category term="SEO"/><category term="SSMS"/><category term="Shortcuts"/><category term="Snip &amp; Sketch"/><category term="Snipping Tool"/><category term="Sql server 2012"/><category term="Startup"/><category term="Storage"/><category term="Toshiba"/><category term="Trojan"/><category term="UAC"/><category term="Url rewrite"/><category term="VCARD"/><category term="VS2005"/><category term="Windows Sharepoint Services 3.0"/><category term="Wordpress"/><category term="Worm"/><category term="XP"/><category term="air conditioner"/><category term="android"/><category term="ansible"/><category term="biometric"/><category term="bootsect"/><category term="broken outdoor unit"/><category term="click once"/><category term="conductive rubber pad"/><category term="contacts"/><category term="cookies"/><category term="dataservices"/><category term="deployment"/><category term="devops"/><category term="disk space"/><category term="display issue"/><category term="edge"/><category term="esxi"/><category term="fiddler"/><category term="fingerprint"/><category term="flux"/><category term="gmail"/><category term="gyp"/><category term="internal unit"/><category term="internet explorer 11"/><category term="laptop"/><category term="locale"/><category term="mail"/><category term="manual"/><category term="migrate"/><category term="mingw"/><category term="msys"/><category term="openSSL"/><category term="outlook"/><category term="pihole"/><category term="porting code"/><category term="powercfg"/><category term="remote control"/><category term="remote desktop"/><category term="repair boot sector"/><category term="routing"/><category term="share internet connection"/><category term="skype voice gateway"/><category term="tapi"/><category term="tapi3"/><category term="teleon"/><category term="unidentified network"/><category term="virtual pc"/><category term="vpnuk"/><category term="wcf"/><category term="wifi"/><category term="win32 api"/><category term="windows Vista"/><category term="βουδαπέστη"/><title type='text'>Botsikas&#39; Blog</title><subtitle type='html'>Technological blog publishing tricky IT solutions</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>110</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-4987467939983509340</id><published>2026-09-26T23:50:44.018+03:00</published><updated>2026-09-26T23:50:44.018+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ansible"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="flux"/><category scheme="http://www.blogger.com/atom/ns#" term="k3s"/><category scheme="http://www.blogger.com/atom/ns#" term="kubernetes"/><title type='text'>Lessons from running K3s in RPI using Ansible and Flux</title><content type='html'>&lt;p&gt;Running K3s on a Raspberry Pi sounds simple, until you try to make a rebuild repeatable: bootstrap the node, get Flux access to Git, and recreate credentials without committing plaintext secrets. I learned a bunch of things the hard way, and I hope writing them down saves the next person (or GenAI model) some of the same back-and-forth. The pattern that worked was a clean hand-off: Ansible prepares the host and the bootstrap prerequisites; Flux takes over once it can read the GitOps repo.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;Ansible gets the first cluster running&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;I started with an Ansible inventory and a site playbook for the Pi. Ansible prepares the host, installs k3s, installs the Sealed Secrets controller, and installs Flux. The ordering matters: the Sealed Secrets controller has to exist before Flux can apply &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;SealedSecret&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; resources.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Flux has a bootstrap problem of its own. It cannot fetch the Git repository until it can authenticate to GitHub, so its first authentication Secret cannot come from that repository. I put the private deploy key and GitHub &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;known_hosts&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; value in Ansible Vault. The vault file is encrypted with &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;ansible-vault&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;, kept out of Git in this setup, and its password is stored separately. The deploy key itself is read-only and scoped to the GitOps repository.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;On that first bootstrap, Ansible installs Flux, creates the ordinary Kubernetes Secret named &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;flux-system&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; from those Vault values, and only then applies the Flux &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;GitRepository&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; and sync objects.&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Sealing credentials for Git&lt;/h3&gt;&lt;div&gt;Once the controller was running, I could create a Kubernetes Secret on the server and pass its YAML through &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;kubeseal&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;. The output is a &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;SealedSecret&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;: encrypted for the controller, safe to commit to Git, and tied by default to its namespace and name. During normal operation, Flux reads that manifest from Git and applies it. The Sealed Secrets controller decrypts it, and Kubernetes gets the regular Secret the application needs.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The committed file contains encrypted values, not the original Secret data. This trimmed example shows the shape; the ciphertext is a placeholder, not something to apply:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;```&lt;/span&gt;yaml&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;bitnami.com/v1alpha1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;SealedSecret&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;some-credentials&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;some-namespace&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;encryptedData&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;admin-password&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;REDACTED_CIPHERTEXT_FROM_KUBESEAL&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;template&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;some-credentials&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;some-namespace&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;Opaque&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;```&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I used the same pattern for credentials I wanted represented in Git, including a sealed copy of the Flux &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;flux-system&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; credential. At first this sounds circular: Flux needs the Git deploy key to fetch the repository, but the sealed deploy key is stored in that repository. The way around that is for Ansible to apply the local copy of the SealedSecret directly to the cluster before it creates the Flux &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;GitRepository&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; and sync objects. Flux is not fetching its own bootstrap credential; Ansible already has the checked-out GitOps files and can reach the Kubernetes API. The Sealed Secrets controller decrypts the manifest and creates the ordinary &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;Secret/flux-system&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;; Ansible can then let Flux start pulling from Git.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The first setup needs a seed credential because there is no sealed deploy key in Git yet, so I used Ansible Vault. Once I had committed the SealedSecret, I changed Ansible&#39;s later-rebuild path: when both the local manifest and the matching controller-key backup are present, Ansible applies the manifest from its local Git checkout and waits for the controller to create &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;Secret/flux-system&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; before applying the Flux source. If either file is missing, Ansible falls back to Vault. Flux will never be in the akward situation of having &amp;nbsp;to fetch the credential it needs in order to fetch Git.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;```&lt;/span&gt;yaml&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;Apply the sealed Flux Git credential&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;kubernetes.core.k8s&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;present&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;{{ flux_git_sealed_secret_file }}&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;kubeconfig&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;/etc/rancher/k3s/k3s.yaml&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;no_log&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;when&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;flux_git_sealed_secret_file_status.stat.exists&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;sealed_secrets_controller_key_file_status.stat.exists&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;```&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I also mark the Vault-created Secret with &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;sealedsecrets.bitnami.com/managed: &quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;. That explicitly allows the controller to take it over and avoid the fight described next.&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;The fight over not managed secrets&lt;/h3&gt;&lt;div&gt;While building out workloads, I sometimes created resources directly in the cluster and moved them into Git later. That led to a few reconciliation timeouts. &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;flux get kustomizations -n flux-system&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; showed the root reconciliation waiting on a SealedSecret that stayed &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;InProgress&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;; &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;kubectl -n some-namespace describe sealedsecret some-credentials&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; exposed the “not managed” conflict.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The cause was an ordinary Secret with the same name that already existed before the SealedSecret was applied. Since the controller will not automatically take over an existing Secret, it left the SealedSecret unreconciled and Flux&#39;s health check eventually timed out.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;After I removed the conflicting Secret and reconciled the root Kustomization again, the controller created it from the sealed manifest. That was safe for this credential because it could be recreated.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The lesson: a Flux timeout is a symptom, not necessarily the cause. Inspect the resource Flux says is still progressing before increasing timeouts or deleting anything. The Envoy Helm hook was a different case, where the operation really did need more time.&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;A slow Helm install needs a longer timeout&lt;/h3&gt;&lt;div&gt;Envoy Gateway also failed during its initial Helm install. I first suspected Docker Hub throttling, but there was no &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;429&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; or other evidence of registry throttling and the pod events showed the certgen image pull succeeded and took about 4 minutes and 55 seconds. The Helm operation timed out while the job was still in progress, then Kubernetes reported the job completed.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I raised the Envoy Gateway &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;HelmRelease&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; timeout to ten minutes. That gives the initial pull and certgen hook room to finish on the Pi.&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;The CRD has to exist before the custom resource&lt;/h3&gt;&lt;div&gt;Once Flux was reconciling the networking manifests, I hit another ordering problem: &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;no matches for kind &quot;GatewayClass&quot;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;. The &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;GatewayClass&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; resource and the Envoy Gateway HelmRelease were being applied as part of the same reconciliation. The Helm chart had not installed the Gateway API CRDs when Flux tried to build and apply the custom resource.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I split the work into two Flux Kustomizations. One reconciles the ingress path that installs Envoy Gateway and waits for it to become Ready. The other reconciles the network routes and declares &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;dependsOn: ingress&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;. That makes Flux wait for the ingress reconciliation, rather than relying on the order of files in a plain &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;kustomization.yaml&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;. That&#39;s a great tool to use when ordering does matter.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;In simplified form, the two Flux resources look like this:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;```&lt;/span&gt;yaml&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;kustomize.toolkit.fluxcd.io/v1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;Kustomization&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;ingress&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;flux-system&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;interval&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;5m&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;wait&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;./clusters/production/infrastructure/ingress&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;sourceRef&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;GitRepository&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;platform-gitops&lt;/span&gt;&lt;/div&gt;&lt;div&gt;---&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;kustomize.toolkit.fluxcd.io/v1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;Kustomization&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;network&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;flux-system&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;interval&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;5m&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;wait&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;dependsOn&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;ingress&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;./clusters/production/workloads/network&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;sourceRef&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;GitRepository&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;platform-gitops&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;```&lt;/span&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Back up the key that does the decrypting&lt;/h3&gt;&lt;div&gt;To rebuild the cluster without resealing every credential, I needed the Sealed Secrets controller&#39;s private key. I exported the controller Secret marked &lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;sealedsecrets.bitnami.com/sealed-secrets-key=active&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;`&lt;/span&gt; and stored the export on an offline USB backup, outside Git. If I lose that key, a fresh controller cannot decrypt the existing SealedSecret manifests. It is private key material.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;My first Ansible ordering restored that key after installing the controller. That let the controller start up and generate a new key before the original one arrived, which meant an extra key and a controller restart. I changed the role to create the namespace, restore the backed-up key, and only then install the controller. On a rebuild, it starts with the key that can decrypt the existing Git-managed secrets.&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Outro&lt;/h3&gt;&lt;div&gt;Overall, it was a great weekend project: I dusted off my Kubernetes knowledge, learned Ansible, explored Gateway API and HTTPRoutes after reading about the Ingress NGINX retirement, and built a small observability stack with OpenTelemetry, Loki, Prometheus, and Grafana. GenAI helped me move quickly, but the most useful habit was treating its suggestions as hypotheses: check the manifests, inspect the live cluster, and ask “do I actually need this?” before adding another component. That back-and-forth helped me challenge my agents and end up with a solution that fits my needs.&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/4987467939983509340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/4987467939983509340' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/4987467939983509340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/4987467939983509340'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2026/09/lessons-from-running-k3s-in-rpi-using.html' title='Lessons from running K3s in RPI using Ansible and Flux'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-264413588610951317</id><published>2026-09-20T09:42:57.283+03:00</published><updated>2026-09-26T23:51:24.622+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="k3s"/><category scheme="http://www.blogger.com/atom/ns#" term="kubernetes"/><category scheme="http://www.blogger.com/atom/ns#" term="pihole"/><title type='text'>Running Pi‑hole on k3s and how GenAI tried to make me run as root</title><content type='html'>&lt;p&gt;I was wrestling with Pi‑hole on single node Kubernetes and hit the classic privileged‑port problem: DNS wants port 53, containers don’t. The first GenAI suggestions were blunt, &lt;b&gt;&lt;i&gt;run the container as root.&lt;/i&gt;&lt;/b&gt;&amp;nbsp;After some challenging from my side, it pivoted to MetalLB which is a nice option in a multi node setup. After digging I discovered a much cleaner path: k3s’s built‑in load balancer (ServiceLB, formerly known as Klipper LoadBalancer). Configure Pi-hole to use port 5353 and map it to 53 at the ServiceLB, no root, no extra components, and it worked like a charm.&lt;/p&gt;&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;h3&gt;The bad advice: root and the MetalLB detour&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;I was porting a setup to k3s and one of the main challenges I had was how to expose the DNS port from within a pod. When I asked for help, the GenAI responses were persuasive but risky:&lt;/span&gt;&lt;/p&gt;&lt;ul role=&quot;list&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;strong&gt;Run the container as root&lt;/strong&gt; so it can bind port 53. That “fix” solves the bind problem immediately, but it opens a huge security surface: processes running as root inside containers are a maintenance and attack vector you don’t want for network services. As a rule of thumb always challenge pods that have &lt;/span&gt;&lt;span style=&quot;color: maroon; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;&quot;&gt;hostNetwork&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;&quot;&gt;true&lt;/span&gt;&lt;span&gt; or &lt;/span&gt;&lt;span style=&quot;color: maroon; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;&quot;&gt;privileged&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;&quot;&gt;true &lt;/span&gt;&lt;span&gt;under securityContext.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;Install MetalLB&lt;/strong&gt; to create a virtual ip and map port 53 there. MetalLB is a solid project for bare‑metal clusters, but it felt like overkill for my small single node k3s cluster.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Both suggestions were workable in theory, but neither was the simplest, safest option for my setup.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;The simple, correct fix with k3s&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;k3s bundles a tiny, pragmatic load balancer that handles &lt;code&gt;Service&lt;/code&gt; objects of type &lt;code&gt;LoadBalancer&lt;/code&gt;. Instead of changing container privileges or adding MetalLB, I created a &lt;code&gt;LoadBalancer&lt;/code&gt; service that exposes port &lt;strong&gt;53&lt;/strong&gt; and forwards traffic to the pod’s listening port &lt;strong&gt;5353&lt;/strong&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Here’s the idea in YAML (trimmed to the essentials):&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;background-color: white; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;v1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;Service&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;pihole&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;dns&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;LoadBalancer&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;selector&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;pihole-app&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;ports&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;dns-udp&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;53&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;protocol&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;UDP&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;targetPort&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;dns-udp&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;dns-tcp&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;53&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;protocol&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;TCP&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;targetPort&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;dns-tcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;To force pihole to use &lt;/span&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;that port, I just had to set the environment variable FTLCONF_dns_port to &quot;5353&quot;:&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;background-color: white; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;FTLCONF_dns_port&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;5353&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;expose both UDP and TCP containerPorts:
&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;background-color: white; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;ports&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;dns-udp&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;containerPort&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;5353&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;protocol&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;UDP&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;dns-tcp&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;containerPort&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;5353&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;protocol&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;TCP&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span&gt;and t&lt;/span&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;he container runs unprivileged, the cluster handles the privileged port mapping, and everything stays secure and simple.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Final thoughts&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;GenAI steered me into two common traps, “just run as root” and “install the shiny external project”. Both options would have been heavier or riskier than necessary. A quick look at what k3s already provides saved time and kept the deployment secure. Hopefully GenAI will pick this article and improve in the next iteration :)&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/264413588610951317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/264413588610951317' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/264413588610951317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/264413588610951317'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2026/09/running-pihole-on-k3s-and-how-genai.html' title='Running Pi‑hole on k3s and how GenAI tried to make me run as root'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-1891351324073741734</id><published>2026-08-17T21:05:00.000+03:00</published><updated>2026-08-19T22:43:44.496+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="Recovery"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows 7"/><title type='text'>Resurrecting a Samsung Galaxy Tab E SM‑T560</title><content type='html'>&lt;p&gt;During vacations, I spent a day bringing an old &lt;strong&gt;Samsung Galaxy Tab E (SM‑T560 / gtel3g)&lt;/strong&gt; back to life. It started as a quick tweak and turned into a proper little surgery: replace the stock recovery, flash a custom &lt;a href=&quot;https://www.lineageos.org/&quot; target=&quot;_blank&quot;&gt;LineageOS&lt;/a&gt;&amp;nbsp;ROM to test, chase down a couple of quirks, and finally install an alternative Android, &lt;a href=&quot;https://viperos.gitlab.io/&quot; target=&quot;_blank&quot;&gt;ViperOS&lt;/a&gt;, build focused on stability. This is what I did and the gotchas I hit.&lt;/p&gt;&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;h4&gt;The plan and the tools&lt;/h4&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;My goal was to get a cleaner, more usable system for media and light tinkering. The process is well documented across xda and youtube videos: Get device into &lt;strong&gt;Download Mode&lt;/strong&gt;, install Samsung USB drivers, open &lt;strong&gt;Odin&lt;/strong&gt;, connect android device to windows host and ensure Odin recognizes it, unselect the reboot option and use a tared &lt;code&gt;recovery.img &lt;/code&gt;to install a custom recovery. Once you have the customer recovery, swip data and install zipped ROMs from memory card.&lt;/span&gt;&lt;/p&gt;&lt;ul role=&quot;list&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;strong&gt;Download Mode:&lt;/strong&gt; Power + Volume Down + Home. &lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;strong&gt;Recovery:&lt;/strong&gt; flashed Pitch Black Recovery. Found the &lt;/span&gt;&lt;span style=&quot;font-family: monospace; white-space: pre-wrap;&quot;&gt;recovery.img&lt;/span&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt; in &lt;/span&gt;&lt;a href=&quot;https://github.com/samsung-sc8830/TWRP-Releases/releases&quot; style=&quot;white-space: pre-wrap;&quot; target=&quot;_blank&quot;&gt;github release&lt;/a&gt;, used 7zip to create a tar archive and then pushed it to the device selecting it as AP&amp;nbsp;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;via Odin 3.13.1&lt;/span&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;. &lt;a href=&quot;https://www.youtube.com/watch?v=1h8aBaG5A0Y&quot; target=&quot;_blank&quot;&gt;This video&lt;/a&gt; &lt;/span&gt;demonstrates the steps clearly, but it skips one important detail: pressing &lt;strong&gt;Power + Volume Down + Volume Up + Home&lt;/strong&gt; all at once triggers a reboot. That’s why the video tells you to release &lt;strong&gt;Volume Down,&amp;nbsp;&lt;/strong&gt;leaving &lt;strong&gt;Power + Volume Up + Home&lt;/strong&gt;, the actual key combo that boots into recovery. If you miss it, don&#39;t worry. Just use that sequence to enter the recovery you just flashed (Pitch Black Recovery).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;strong&gt;ROMs tested:&lt;/strong&gt; &lt;a href=&quot;https://xdaforums.com/t/rom-sm-t560-gtelwifi-4-4-unofficial-lineageos-11-0-for-samsung-galaxy-tab-e.3711283/&quot; target=&quot;_blank&quot;&gt;LineageOS 11 first&lt;/a&gt;, then the &lt;a href=&quot;https://xdaforums.com/t/unofficial-rom-lineageos-14-1-for-galaxy-tab-e-sm-t561-sm-t560.3903780/&quot; target=&quot;_blank&quot;&gt;LineageOS 14.1&lt;/a&gt; which has flickering issues with my screen, and finally &lt;strong&gt;&lt;a href=&quot;https://xdaforums.com/t/discontinued-port-rom-7-1-2-t-560-t-561-viperos-v5-1-for-galaxy-tab-e.4030325/&quot; target=&quot;_blank&quot;&gt;ViperOS 5.1&lt;/a&gt;&lt;/strong&gt; which I kept.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhybSSwpcZAGA43QtuqFuOmOnM6_4QMypF5K8NtlBsLy9w7-Fx0v_UOckHzzr3sNxGKzOXxMe7y1zHMUHkNKAlYKn8KsL52bSoBsVjd_v1Cs1Y94j1qq1rXptQwugq2CvOI3pOobFOFm8eDZrJjhQUu5VC2hjOsyULwDfQ6PYsZYTbGHj4623byljYaARg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;200&quot; data-original-width=&quot;1000&quot; height=&quot;64&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhybSSwpcZAGA43QtuqFuOmOnM6_4QMypF5K8NtlBsLy9w7-Fx0v_UOckHzzr3sNxGKzOXxMe7y1zHMUHkNKAlYKn8KsL52bSoBsVjd_v1Cs1Y94j1qq1rXptQwugq2CvOI3pOobFOFm8eDZrJjhQUu5VC2hjOsyULwDfQ6PYsZYTbGHj4623byljYaARg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;h4&gt;What actually happened&lt;/h4&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Flashing Pitch Black via Odin was straightforward once I had the right image and a stable USB connection. LineageOS gave the usual benefits, snappier UI, fewer Samsung services, and a lighter system, but I hit a hardware‑adjacent software problem that took a few detours to understand.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Both &lt;strong&gt;capacitive buttons&lt;/strong&gt; (the old Android app‑selection button and the back key) were completely &lt;strong&gt;not working&lt;/strong&gt; after the initial flash. I found a &lt;code&gt;keyfix.zip&lt;/code&gt; that added a &lt;code&gt;Generic.kl&lt;/code&gt; keyboard mapping; that didn’t restore the non‑working capacitive buttons but rathe remapped additional functions of the home button. In short, the keyfix changed behavior but didn’t fix the dead capacitive inputs.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;I was ready to live with the partial fix when I noticed a post about &lt;strong&gt;Viperos V5.1&lt;/strong&gt; for the Galaxy Tab E. ViperOS is an alternative Android build focused on stability, and there were no regressions mentioned in the comments besides the known issue of not showing the charging animation if the device is closed. I installed ViperOS 5.1 and that’s the build I’m keeping: stable, minimal features, and tuned for reliable day‑to‑day use. &lt;/span&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;Instead of installing Google Play and its services I went the F‑Droid route: installed F‑Droid, grabbed a handful of apps from there, and even sideloaded Chrome by downloading the APK.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheV9C7WuUNscapn-QRm-9_9OEebVhmino91QRk5RfBy4bTjTQPr3YaKPcnTMixD5M_40ylvtQhBdjyrZ4zCqdh0Tru7end3JTfDsJ7a8yc6h0UCkzxoVYyuxejdbbZEn3zVxbZtLuAuuBhE-zS5YgUc6thVTTw2TvadDUYf1ysZyM2uSGRfkJXHsvudtY/s879/ViperOSSettings.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;879&quot; data-original-width=&quot;580&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheV9C7WuUNscapn-QRm-9_9OEebVhmino91QRk5RfBy4bTjTQPr3YaKPcnTMixD5M_40ylvtQhBdjyrZ4zCqdh0Tru7end3JTfDsJ7a8yc6h0UCkzxoVYyuxejdbbZEn3zVxbZtLuAuuBhE-zS5YgUc6thVTTw2TvadDUYf1ysZyM2uSGRfkJXHsvudtY/s320/ViperOSSettings.png&quot; width=&quot;211&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; Viperos 5.1 is still based on a very old Android branch and receives no security updates, so the tablet can be a useful attack vector for anyone trying to get into your network. Treat it as untrusted, avoid storing sensitive data, and keep the device on an isolated or guest Wi‑Fi network.&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;h4&gt;Windows driver snag&lt;/h4&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;One extra snag worth calling out: my Windows 7 machine refused to accept the &lt;a href=&quot;https://developer.samsung.com/android-usb-driver&quot; target=&quot;_blank&quot;&gt;Samsung USB drivers &lt;/a&gt;at first. Odin wouldn’t see the device because the driver installer failed with &lt;strong&gt;Error 52&lt;/strong&gt; complaining the driver wasn’t signed. Unfortunately the usual trick of toggling test signing and disabling integrity checks with&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS&lt;/pre&gt;&lt;pre&gt;bcdedit -set TESTSIGNING ON&lt;/pre&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;didn&#39;t work for me. The long‑way fix was to upgrade the PC to &lt;/span&gt;&lt;strong style=&quot;white-space: pre-wrap;&quot;&gt;Windows 7 SP1&lt;/strong&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt; and apply &lt;/span&gt;&lt;strong style=&quot;white-space: pre-wrap;&quot;&gt;Windows6.1‑KB3033929‑x64&lt;/strong&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt; (SHA‑2 signing support). After those updates I could run &lt;/span&gt;&lt;code style=&quot;white-space: pre-wrap;&quot;&gt;SAMSUNG_USB_Driver_for_Mobile_Phones_v1.9.5.0.exe&lt;/code&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt; and get usable drivers; Odin then recognized the tablet reliably.&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsdFJxqy7kcolU3cuxNLYqLL9lSC3VMOATyN0CzwofmjMkjdlHu292lN0jfYK92dFtsyp4JgMKHrin4f62QxKF4ADGdGaG7aP9ZWVw5ztdMsUwq0Qu1U3jIH5DSQPZv6jLAB1CYBZ-LskE7LdEadyTrhoIwQcqvM0pQ9wWD9kglh5enhH-HGqr2wQFpLQ/s267/yak-shaving.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;200&quot; data-original-width=&quot;267&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsdFJxqy7kcolU3cuxNLYqLL9lSC3VMOATyN0CzwofmjMkjdlHu292lN0jfYK92dFtsyp4JgMKHrin4f62QxKF4ADGdGaG7aP9ZWVw5ztdMsUwq0Qu1U3jIH5DSQPZv6jLAB1CYBZ-LskE7LdEadyTrhoIwQcqvM0pQ9wWD9kglh5enhH-HGqr2wQFpLQ/s1600/yak-shaving.gif&quot; width=&quot;267&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/1891351324073741734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/1891351324073741734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/1891351324073741734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/1891351324073741734'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2026/08/resurrecting-samsung-galaxy-tab-e-smt560.html' title='Resurrecting a Samsung Galaxy Tab E SM‑T560'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhybSSwpcZAGA43QtuqFuOmOnM6_4QMypF5K8NtlBsLy9w7-Fx0v_UOckHzzr3sNxGKzOXxMe7y1zHMUHkNKAlYKn8KsL52bSoBsVjd_v1Cs1Y94j1qq1rXptQwugq2CvOI3pOobFOFm8eDZrJjhQUu5VC2hjOsyULwDfQ6PYsZYTbGHj4623byljYaARg=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-786578053530410880</id><published>2026-05-03T12:31:00.003+03:00</published><updated>2026-05-03T12:34:35.165+03:00</updated><title type='text'>Upgrading asp.net 6 to 10</title><content type='html'>&lt;p&gt;I recently&lt;a href=&quot;https://github.com/dodekanisou/home-automation/compare/old/net6.0...old/net10.0&quot; target=&quot;_blank&quot;&gt; upgraded one of my projects&lt;/a&gt; from &lt;strong&gt;.NET 6&lt;/strong&gt; to &lt;strong&gt;.NET 10&lt;/strong&gt;, and while the process was smoother than expected, there were several important steps and breaking changes worth documenting. This post summarizes what I did.&lt;/p&gt;&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
With .NET 6 no longer supported and the move to .NET 10 now overdue, it was finally time to bring my project up to date. This was a great opportunity to test the new &lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/core/porting/github-copilot-app-modernization/overview&quot; target=&quot;_blank&quot;&gt;GitHub Copilot modernization feature&lt;/a&gt;.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;I git cloned the repo and dropped the “Upgrade my solution to .NET 10” prompt in the copilot and there it was, copilot removed the hassle of upgrading the .net SDK references, the docker file build stages and even upgraded the packages to have a fully buildable solution. This worked exquisitely well, given that copilot explicitly mentions that they support migration from .net 8 onwards.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;A couple of &quot;Time Of Your Life&quot; (TOYL) units that I would have expected copilot to save were:&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;The upgrade of sln to slnx file which is a simple `&lt;i&gt;dotnet sln migrate&lt;/i&gt;` command&amp;nbsp;&lt;/li&gt;&lt;li&gt;Update the reference from .net 6 in the Readme file like references to the `&lt;i&gt;Release\net6.0&lt;/i&gt;` folder and in the URLs there were some links with reference to aspnetcore-3.1 which were updated manually to aspnetcore-10.0. This is one of those housekeeping tasks that’s easy to forget but important for future contributors.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Since the project had already been migrated from .NET Core 3 to .NET 6, I needed to make another significant change: transitioning from the Generic Host model (used widely in .NET Core 3.1 and .NET 5) to the Minimal Hosting model introduced in .NET 6. This update combines the previously separate Program and Startup classes into a single, simplified Program.cs file. Now, service registration and configuration are managed by WebApplicationBuilder, which replaces the older IHostBuilder and IWebHostBuilder abstractions and creates a more straightforward initialization process. As a result, I guided Copilot to update dependency injection and middleware registration to establish a clear starting point. While I plan to refactor and remove the startup file in the future, all orchestration currently occurs within Program.cs, following the modern pattern.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;The main breaking change I had to fix manually, it was introduced in .NET 8 (and remains in .NET 10): it now requires explicit configuration of known networks or known proxies for forwarded headers like X-Forwarded-For, X-Forwarded-Host, and X-Forwarded-Proto to work. &lt;a href=&quot;https://duendesoftware.com/blog/20250624-dotnet-8017-upgrades-forwarded-headers-and-unknown-proxy-issues&quot; target=&quot;_blank&quot;&gt;Without this, these headers are ignored for security&lt;/a&gt; and this means that your login redirects or the return urls may be ending up to plain http which will break your oauth flows if you are using nginx to terminate the ssl for you. I added the necessary known network entries to keep my reverse‑proxy setup working properly.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Previously, I depended on the .NET CLI secret manager for sensitive configuration, but lately I&#39;ve found environment variables, especially using .env files, to be much simpler for project management. So, I switched from hardcoding `&lt;i&gt;UserSecretsId&lt;/i&gt;` to using the DotNetEnv package. All it took was adding `&lt;i&gt;DotNetEnv.Env.TraversePath().Load();&lt;/i&gt;` in the Main method, which automatically loads the .env file from the solution root. The .env file is ignored by Git, while a `&lt;i&gt;.env.sample&lt;/i&gt;` is included in the repository to help developers quickly see what environment variables are supported. This approach keeps configuration organized and tidy.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Finally, I needed to revise my CI/CD process.&amp;nbsp;I implemented a &lt;a href=&quot;https://github.com/github/combine-prs&quot; target=&quot;_blank&quot;&gt;&#39;combine PR&#39; GitHub workflow&lt;/a&gt; that merges multiple Dependabot pull requests into one. Additionally, I updated Dependabot to handle not just NuGet dependencies, but also Docker images, the .NET SDK, and even GitHub Actions that need periodic updates. Hopefully this will save some TOYL units for me and keep my pet project secure.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Hope this helps!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/786578053530410880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/786578053530410880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/786578053530410880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/786578053530410880'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2026/05/upgrading-aspnet-6-to-10.html' title='Upgrading asp.net 6 to 10'/><author><name>Andreas M. Botsikas</name><uri>http://www.blogger.com/profile/10477012039301070675</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuJatPHJNoGbLzjUin8W8V81_zv6HJhqB3yAWOe-lS4UT5bU4yOtQ5YI6KVwkzs89rkiv8TdWNB9gt1bQKOb1lz9pFG4IZ8bQ4uxudwN0SgtIl3rUcUAWvaylGB8dgNQ/s220/Abot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-4879180923166884137</id><published>2025-12-30T01:37:00.000+02:00</published><updated>2025-12-30T01:37:06.097+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="conductive rubber pad"/><category scheme="http://www.blogger.com/atom/ns#" term="remote control"/><category scheme="http://www.blogger.com/atom/ns#" term="repair"/><title type='text'>Repairing a TVIX Remote Control aka Fixing Unresponsive Buttons</title><content type='html'>&lt;p&gt;I stumbled upon my old TVIX HD M-7000A media player, and discovered that the OK button on the remote control was unresponsive, preventing menu selections and general usability. If you encounter similar issues with your TVIX remote, such as buttons failing to respond (e.g., the red LED does not illuminate upon pressing), the following steps may help restore functionality.&lt;/p&gt;&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;Open the plastic case of the remote control by gently prying it apart with a plastic tool or old credit card; no hidden screws are present. Do not remove the black vinyl cover on top, as it does not need to be detached for disassembly and it is difficult to reattach.&lt;/p&gt;
&lt;style&gt;
.centertable {
  margin-left: auto;
  margin-right: auto;
}
&lt;/style&gt;
  &lt;table class=&quot;centertable&quot; style=&quot;text-align: center;&quot;&gt;
    &lt;tbody&gt;&lt;tr&gt;
      &lt;td&gt;
  &lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEheZeE5Slh8hp7rDwJHUwEokZ1k2zECWR6KuVboNcg8oe9fvtK7U0uPUU6q1NnAXVzb129PhEMXDiwGZhJDzOoB6gyZEgEQBMjR7t4taN1kX_aN96nm3vHckAaUcs8Lxzh6ApkShaJrUiXEpa716AidTGNbIr5X6Fni_V5z0-MAejvof0RyMPfF5tcZv6U&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1267&quot; data-original-width=&quot;225&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEheZeE5Slh8hp7rDwJHUwEokZ1k2zECWR6KuVboNcg8oe9fvtK7U0uPUU6q1NnAXVzb129PhEMXDiwGZhJDzOoB6gyZEgEQBMjR7t4taN1kX_aN96nm3vHckAaUcs8Lxzh6ApkShaJrUiXEpa716AidTGNbIr5X6Fni_V5z0-MAejvof0RyMPfF5tcZv6U=w36-h200&quot; width=&quot;36&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Side&lt;/td&gt;
      &lt;td&gt;
  &lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjlZzNjzbEXsXfSQrQI2O7gS3qQKzL0Ca_5_-Aq416181XTVta6X4_wlvUJcCrDe8r1PQAngAmxUzmjX0vBxd5BowRuRzKEmjokzt3ex4uMinh96gCJKfpbWlOz4O-R1xHr6hDHlVcodUnFieALs001V2kg3NakM6iL6kPh-0pD43idLltwGjtlrWapdsE&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;603&quot; data-original-width=&quot;586&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjlZzNjzbEXsXfSQrQI2O7gS3qQKzL0Ca_5_-Aq416181XTVta6X4_wlvUJcCrDe8r1PQAngAmxUzmjX0vBxd5BowRuRzKEmjokzt3ex4uMinh96gCJKfpbWlOz4O-R1xHr6hDHlVcodUnFieALs001V2kg3NakM6iL6kPh-0pD43idLltwGjtlrWapdsE=w194-h200&quot; width=&quot;194&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Top
  &lt;/td&gt;
      &lt;td&gt;
  &lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjLkqMVjOssfHTH3ZCDRFgnAtrDy4XLrB8HvHuIpLeIMJE68tQh5qHsZjRqB-Ta6E7AwuClKKzAm-EBC9AgvaNJGw_sgK3jXPkNx-7qFKtPiKcyv7eMDy6iUTC1izowpDX7zLv_XjnMjbSjX4j-eDNzi3kxKZCYUw0HJBlCidn67c0rCbbZPuOzO8BkDUE&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;516&quot; data-original-width=&quot;614&quot; height=&quot;168&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjLkqMVjOssfHTH3ZCDRFgnAtrDy4XLrB8HvHuIpLeIMJE68tQh5qHsZjRqB-Ta6E7AwuClKKzAm-EBC9AgvaNJGw_sgK3jXPkNx-7qFKtPiKcyv7eMDy6iUTC1izowpDX7zLv_XjnMjbSjX4j-eDNzi3kxKZCYUw0HJBlCidn67c0rCbbZPuOzO8BkDUE=w200-h168&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Bottom
&lt;/td&gt;
      &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Be careful not to damage the IR led’s cover, as it is attached to the lower plastic casing and won’t come off.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhOOhPRBRE7H73VAnf583TWyl6DC8gJQfMs2lVGcN3XCdVWsI-zKp-Sm83hp-E8iuYDhM_luhXOOKWWibmhUa321uVWivISty5_ZE1UKGwnDA9xfJxAo4kI2E73YajfdTInMNSUZ4gNQszRRTc-1BFd3IxSnawzU-rPJSsjW2wR7ex_1b2CEjdgPJSmhAE&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;613&quot; data-original-width=&quot;689&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhOOhPRBRE7H73VAnf583TWyl6DC8gJQfMs2lVGcN3XCdVWsI-zKp-Sm83hp-E8iuYDhM_luhXOOKWWibmhUa321uVWivISty5_ZE1UKGwnDA9xfJxAo4kI2E73YajfdTInMNSUZ4gNQszRRTc-1BFd3IxSnawzU-rPJSsjW2wR7ex_1b2CEjdgPJSmhAE=w200-h178&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;You will need to push gently the spring of the batteries compartment to release the board.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhkkqqIjDe8mYX0-b6VX8LR37aBHsLaYTiY02Xc2wu3Vcdcs6UtplT-Z9NbEcQUBJLpkpcaoFDyvG56HI5iB19y8hMzkTObb4QokbOemydsY0G5ZboZDA6TpTGcscp2_mpz0ErhOmGpRHoB20z5QOaRCSKw7k1aAzaBWGlWMhClhPTaMmghgM9ylNws-l4&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;698&quot; data-original-width=&quot;478&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhkkqqIjDe8mYX0-b6VX8LR37aBHsLaYTiY02Xc2wu3Vcdcs6UtplT-Z9NbEcQUBJLpkpcaoFDyvG56HI5iB19y8hMzkTObb4QokbOemydsY0G5ZboZDA6TpTGcscp2_mpz0ErhOmGpRHoB20z5QOaRCSKw7k1aAzaBWGlWMhClhPTaMmghgM9ylNws-l4=w137-h200&quot; width=&quot;137&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Once opened, examine the circuit board and rubber button pad for any signs of debris or corrosion. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi46h_a5RkMalOLrrdU_7jq5dsZ3Y6HRKr6kkVJ0F8c7TzKyxzMUj52_BTbDYSfI3pqBVF1LKaHXy9jPegAgwVN_MMQ4AbwwA42jQ2Z7Oo8_q_uh8bVDpaTQQzzRuOMgtkcLV6w3OFBnhugHbGN3cqDxLyU6ZfibD-kp6yW_04xY5_gmzbu7FdJy7rrsuA&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;613&quot; data-original-width=&quot;940&quot; height=&quot;131&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi46h_a5RkMalOLrrdU_7jq5dsZ3Y6HRKr6kkVJ0F8c7TzKyxzMUj52_BTbDYSfI3pqBVF1LKaHXy9jPegAgwVN_MMQ4AbwwA42jQ2Z7Oo8_q_uh8bVDpaTQQzzRuOMgtkcLV6w3OFBnhugHbGN3cqDxLyU6ZfibD-kp6yW_04xY5_gmzbu7FdJy7rrsuA=w200-h131&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Clean the contacts beneath the affected button with isopropyl alcohol and a cotton swab. Ensure the surfaces are thoroughly dry before testing. First try with a conductor, like a wire to see if the circuit is working fine.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgRcRX5ro8sCSEdoCR3lj9lKrD3bBsAIJ4zG2aiMuJj1eifKg6fNkkPVphFTlOKDKZAlpmW3ROd_XhZuwdv5ToxVY3fY1CSRg9dlW27MnKpSMx4xWb_i7rihfO_DhPWtSXjMHa4vTt0YlKzBC7I7DpPsPu8mMTJnZy0mpC3yiAeEg3WrwJTtbBjm7PwyB0&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1331&quot; data-original-width=&quot;864&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgRcRX5ro8sCSEdoCR3lj9lKrD3bBsAIJ4zG2aiMuJj1eifKg6fNkkPVphFTlOKDKZAlpmW3ROd_XhZuwdv5ToxVY3fY1CSRg9dlW27MnKpSMx4xWb_i7rihfO_DhPWtSXjMHa4vTt0YlKzBC7I7DpPsPu8mMTJnZy0mpC3yiAeEg3WrwJTtbBjm7PwyB0=w130-h200&quot; width=&quot;130&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;With the case still open, place the rubber pad over the contacts and test the button’s response.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgmOqTflEqwjtBDPyUtWHKAKQAERqXCWRY6DqMrzh2op0Tc_nkU4aQT9Xw30vF53U6kedLIk43ESbMaq1IFzj1ANZZD4uIYPFPhLLw5Uv5XdkCGq7_QlSx81DcYdXzh73m8telAPEwMzBSsFQiFq4hjEDttizOWtCRFw-RYjR0YZ2-VuBEb9MhJLXWQqwQ&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1253&quot; data-original-width=&quot;940&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgmOqTflEqwjtBDPyUtWHKAKQAERqXCWRY6DqMrzh2op0Tc_nkU4aQT9Xw30vF53U6kedLIk43ESbMaq1IFzj1ANZZD4uIYPFPhLLw5Uv5XdkCGq7_QlSx81DcYdXzh73m8telAPEwMzBSsFQiFq4hjEDttizOWtCRFw-RYjR0YZ2-VuBEb9MhJLXWQqwQ=w150-h200&quot; width=&quot;150&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In some cases, like mine, cleaning did not resolve the issue due to wear of the conductive material underneath the button. Since I hadn’t ordered a Conductive Rubber Pads Keypad Repair Kit (yes, that’s a thing you can buy), a temporary solution was to attach a thin piece of aluminum foil to the underside of the malfunctioning button to restore conductivity. Ensure that the aluminum foil is sufficiently thin to prevent persistent short-circuiting of the affected button.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhtklxO6thmbMLArM34lXZUGIBHjIESxa5yICFaB_CdAnwUUK_HeEHWNJClQCy3yFzMsmkAmP9xw-w-YUegXQgS4UGEuRcDR5jklfOA6agrRz8Qx8_sMrDjALaooz6WGDKzsdHhlZSYYaV63g33VOEQ5RD9LetM1Uwxv5wY0WcV1VqIQyc4t2348X80afw&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;654&quot; data-original-width=&quot;940&quot; height=&quot;139&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhtklxO6thmbMLArM34lXZUGIBHjIESxa5yICFaB_CdAnwUUK_HeEHWNJClQCy3yFzMsmkAmP9xw-w-YUegXQgS4UGEuRcDR5jklfOA6agrRz8Qx8_sMrDjALaooz6WGDKzsdHhlZSYYaV63g33VOEQ5RD9LetM1Uwxv5wY0WcV1VqIQyc4t2348X80afw=w200-h139&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;As a side note, once I got the remote working, I noticed some issues with the firmware. The 1.5.19 beta firmware required selecting DVI output for HDMI video functionality and did not support audio via HDMI; however, optical fiber audio remained operational. For full HDMI compatibility, I had to downgrade to firmware version 1.3.147, as this version reliably supports both video and audio outputs through HDMI and I was lucky enough to have kept it in my hard drive.&lt;/p&gt;

</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/4879180923166884137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/4879180923166884137' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/4879180923166884137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/4879180923166884137'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2025/12/repairing-tvix-remote-control-aka.html' title='Repairing a TVIX Remote Control aka Fixing Unresponsive Buttons'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEheZeE5Slh8hp7rDwJHUwEokZ1k2zECWR6KuVboNcg8oe9fvtK7U0uPUU6q1NnAXVzb129PhEMXDiwGZhJDzOoB6gyZEgEQBMjR7t4taN1kX_aN96nm3vHckAaUcs8Lxzh6ApkShaJrUiXEpa716AidTGNbIr5X6Fni_V5z0-MAejvof0RyMPfF5tcZv6U=s72-w36-h200-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-3757415637264225657</id><published>2025-08-12T00:02:00.037+03:00</published><updated>2025-12-31T00:07:44.224+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AC"/><category scheme="http://www.blogger.com/atom/ns#" term="air conditioner"/><category scheme="http://www.blogger.com/atom/ns#" term="broken outdoor unit"/><category scheme="http://www.blogger.com/atom/ns#" term="internal unit"/><category scheme="http://www.blogger.com/atom/ns#" term="repair"/><title type='text'>Using an indoor air conditioner with a broken outdoor unit</title><content type='html'>During the Daniel extreme flood event in Thessaly, I was fortunate not to lose anyone, but sustained material losses, including two cars and my air conditioners’ outdoor units, which were submerged for two days and destroyed. The internal units were safe, and I wondered if they could function independently for fun. It turns out that any internal air conditioner unit can operate as a fan without the need of an external unit.&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;div&gt;The first thing to do is try to find a schematic. My indoor unit included a diagram showing the internal ports, with three wires (Brown, Blue, Orange) plus ground coming from the outdoor (OD) unit.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhKXZL6G8ytrAcHWbx4GQrcaxXL6RedLvVC6qaDAsM8FdZ5zh_x4n9Fs0xCifGKVXCCzEcYTYTmcDovE9S1eJciHRuCcXDfA5wf7eKYx-8QC1Ax9QfTX_r03dtzvduKBNdIqqUdNSAqzunGHbVFYfIOXtFmAh3Sqht904W992ubs3Y_0ptBXvE9ayEZWuk&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;817&quot; data-original-width=&quot;722&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhKXZL6G8ytrAcHWbx4GQrcaxXL6RedLvVC6qaDAsM8FdZ5zh_x4n9Fs0xCifGKVXCCzEcYTYTmcDovE9S1eJciHRuCcXDfA5wf7eKYx-8QC1Ax9QfTX_r03dtzvduKBNdIqqUdNSAqzunGHbVFYfIOXtFmAh3Sqht904W992ubs3Y_0ptBXvE9ayEZWuk=w177-h200&quot; width=&quot;177&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;According to the schematic, my gut feeling was that the orange cable is likely the signal line for command transfer, while the brown and blue are standard power wires.&amp;nbsp;&lt;/div&gt;&lt;div&gt;I stepped outside to find the repairmen had removed the outdoor units, leaving cables exposed. My setup included gray, brown, black, and ground (yellow-green) wires from the outdoor to the indoor unit: black connected to the orange port 3, gray to the blue port 2, and brown matched with its color on port 1.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgYnNX9GM0G7UUVORvtHI18f-wuq1JXt2qsoG8Q7MEON5i41Hl8Fx-OHg-pBtj4Vid-UJ1dqRe6l8KlzvhfWwutxgsZAAk_EZKWxF6pYtTTp1CXJ8IF4Y4vV-Z-yRGaK_WnvnwzThDhNjpjEzx64nVtBxRWvOftW05cycA7rH-vdpZB9-JDPBpTSn9_ENM&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;169&quot; data-original-width=&quot;294&quot; height=&quot;115&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgYnNX9GM0G7UUVORvtHI18f-wuq1JXt2qsoG8Q7MEON5i41Hl8Fx-OHg-pBtj4Vid-UJ1dqRe6l8KlzvhfWwutxgsZAAk_EZKWxF6pYtTTp1CXJ8IF4Y4vV-Z-yRGaK_WnvnwzThDhNjpjEzx64nVtBxRWvOftW05cycA7rH-vdpZB9-JDPBpTSn9_ENM=w200-h115&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;I also had a power supply with brown, blue, and ground (yellow-green) wires, which would have connected to the outdoor unit if it were still there.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhDnoyyjgMmeUzw_1tjTX6YEkTDi2umRdCbGX_ukKlPHxXg1FPabcGQVWGu__bS8tGnZnuXypKh-WF8B6osEYkr4SM0rQu98Cv4vTIEBDua6WRAHp6EEFI_oO9dWxR3sqdtv5kK1XkVVOXxJ5l4yDQXP44zSow5uouSlafERnysfcOiIVVKEeCDKu0IRRM&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;202&quot; data-original-width=&quot;378&quot; height=&quot;107&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhDnoyyjgMmeUzw_1tjTX6YEkTDi2umRdCbGX_ukKlPHxXg1FPabcGQVWGu__bS8tGnZnuXypKh-WF8B6osEYkr4SM0rQu98Cv4vTIEBDua6WRAHp6EEFI_oO9dWxR3sqdtv5kK1XkVVOXxJ5l4yDQXP44zSow5uouSlafERnysfcOiIVVKEeCDKu0IRRM=w200-h107&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Based on my instincts, I hot-wired the pairs and left the signal cable, the black one, which connects to orange in port 3, untouched.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjmQr0IG8kvMYhDT8-RWMQceAqFWAwv1Bb9ffwCCf5LiIeH9vg2-ZLxiXUOpf-3FVf3-AK2SWRn4CVL_HHWfR1Xl97wwSxsk-tmEW2ipyl5ZS2S0P9x9HwViumuZxssS4k1LVz_HJX91KwHFLWhK-j3t2n_ufU-XJEFqMLKC-55ZLakBew_E9gCidImes8&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;458&quot; data-original-width=&quot;508&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjmQr0IG8kvMYhDT8-RWMQceAqFWAwv1Bb9ffwCCf5LiIeH9vg2-ZLxiXUOpf-3FVf3-AK2SWRn4CVL_HHWfR1Xl97wwSxsk-tmEW2ipyl5ZS2S0P9x9HwViumuZxssS4k1LVz_HJX91KwHFLWhK-j3t2n_ufU-XJEFqMLKC-55ZLakBew_E9gCidImes8=w200-h180&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;After confirming my power protection relays were working properly and my fire extinguisher was ready, I switched on the fuse to power up my monstrosity. I used the remote to select fan mode, and everything operated smoothly! The indoor unit can circulate air around the room, but it won’t cool or heat the space without the outdoor unit, since refrigeration can&#39;t happen. In fan mode, the system functions just like an ordinary fan, simply moving air without changing its temperature. If you try to switch to another mode, the device may get stuck, requiring you to cut the power to reset it.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEib3FGc1tvr26b9DlbTO7h6Jl4mUQ1dYTtS0bZ9Eld8niP5gUpKbgKpgxjpeM4eWpmuuKkpiTn_97oyp1lhKQe56wDEOrGEpxB4amTqX1ci9MGZpyt6yS7M1upa304REanQCo8rRHKDBhin1q3wQ46PTdIS3AMBqr9sIqWGoUsBFrRPZD0RfZO_ycsIlus&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;174&quot; data-original-width=&quot;940&quot; height=&quot;59&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEib3FGc1tvr26b9DlbTO7h6Jl4mUQ1dYTtS0bZ9Eld8niP5gUpKbgKpgxjpeM4eWpmuuKkpiTn_97oyp1lhKQe56wDEOrGEpxB4amTqX1ci9MGZpyt6yS7M1upa304REanQCo8rRHKDBhin1q3wQ46PTdIS3AMBqr9sIqWGoUsBFrRPZD0RfZO_ycsIlus&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Since the experiment was successful, the final step is to rewire the indoor unit so it can be plugged directly into a standard power outlet using a regular power cable, with the signal port left disconnected as illustrated below.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgWeHfe_qv15pK0RZfZO9umfto676d7oOSvep9iCEcKirkaQbXv-eZcL8B_smsetDyjnRczqR0C_YdV2NjStSq6HzugJYAaWnxaiV5BBm2lz-WJTTE8NAwGpp_B57JDkcU6bFKsoZnwNIwr0jhO4HWO9B0uAgJTl0HzyADc_Vl3gChaTzcouSgADcsEZKY&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;853&quot; data-original-width=&quot;591&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgWeHfe_qv15pK0RZfZO9umfto676d7oOSvep9iCEcKirkaQbXv-eZcL8B_smsetDyjnRczqR0C_YdV2NjStSq6HzugJYAaWnxaiV5BBm2lz-WJTTE8NAwGpp_B57JDkcU6bFKsoZnwNIwr0jhO4HWO9B0uAgJTl0HzyADc_Vl3gChaTzcouSgADcsEZKY=w138-h200&quot; width=&quot;138&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Please, always verify the wire colors carefully!!! In a different unit, the installer had mismatched the colors completely and my experiment would have gone terribly wrong. As Einstein supposably said, “Two things are infinite: the universe and human stupidity; and I’m not sure about the universe!”&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhj3TMyq-xpxSzLAq5yRv1_eJq7gDXsIo5hsOUxirdUIjAeD8kOophBOuLHYH0xNokZpkFwSpCHdZsrnKhwIA9gDKZfzsRd_HPe4MF8rkUWCug6HjlbCapvLY6CkXs4elTw3ZH4fYk0mGNrF_WhOyTGqu4no82FcO9lN6W7uo3dJfaNDUzrw17y6Hopdvo&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;620&quot; data-original-width=&quot;509&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhj3TMyq-xpxSzLAq5yRv1_eJq7gDXsIo5hsOUxirdUIjAeD8kOophBOuLHYH0xNokZpkFwSpCHdZsrnKhwIA9gDKZfzsRd_HPe4MF8rkUWCug6HjlbCapvLY6CkXs4elTw3ZH4fYk0mGNrF_WhOyTGqu4no82FcO9lN6W7uo3dJfaNDUzrw17y6Hopdvo=w164-h200&quot; width=&quot;164&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/3757415637264225657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/3757415637264225657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/3757415637264225657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/3757415637264225657'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2025/08/using-indoor-air-conditioner-with.html' title='Using an indoor air conditioner with a broken outdoor unit'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhKXZL6G8ytrAcHWbx4GQrcaxXL6RedLvVC6qaDAsM8FdZ5zh_x4n9Fs0xCifGKVXCCzEcYTYTmcDovE9S1eJciHRuCcXDfA5wf7eKYx-8QC1Ax9QfTX_r03dtzvduKBNdIqqUdNSAqzunGHbVFYfIOXtFmAh3Sqht904W992ubs3Y_0ptBXvE9ayEZWuk=s72-w177-h200-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-6088836579885032354</id><published>2024-11-12T01:37:00.005+02:00</published><updated>2024-11-12T10:20:48.389+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Event Viewer errors"/><category scheme="http://www.blogger.com/atom/ns#" term="Productivity tips"/><category scheme="http://www.blogger.com/atom/ns#" term="Shortcuts"/><category scheme="http://www.blogger.com/atom/ns#" term="Snip &amp; Sketch"/><category scheme="http://www.blogger.com/atom/ns#" term="Snipping Tool"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>How to fix Snip &amp; Sketch not working on Windows 10 (Snipping Tool shortcut issues)</title><content type='html'>&lt;p&gt;
    I often need to take a screenshot and annotate it a bit before I paste it into a chat, Jira ticket or document. On my Windows system, I love the simplicity of the Microsoft Snip &amp;amp; Sketch app (also known as Snipping Tool), which is
    always just a shortcut (Win+Shift+S) away.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
    Unfortunately, on my work laptop (still running Windows 10), I&#39;ve recently run into an issue where the shortcut stops working. &amp;nbsp;When I press the shortcut or even open the app and select to take new snip, no screenshot is taken, and
    the toolbar doesn’t appear. Instead, I see the cursor spinner for a few seconds, but nothing else happens.
&lt;/p&gt;
&lt;p&gt;After some troubleshooting, I found a solution, so I thought I&#39;d write it down for future reference and to help anyone else facing the same issue!&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
    &lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi1oo9OTKIwi2KO6GmC_Z-BElnuq5CyLWdtYETiBI5txBCCaiGHdA3oRi8YsyS67Rsv0FLLpU9ufGQXS43ww1SttWhOUzmioeNg0XOIgmELoKiakSfdsuMW89N50uv43nVe0kpjioERjSrCbx6alWrTxBllkJky0KNwKyDQHlRvpnwFkXsqti0cr-RuZno&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
        &lt;img alt=&quot;Snip &amp;amp; Sketch toolbar screenshot&quot; data-original-height=&quot;88&quot; data-original-width=&quot;471&quot; height=&quot;60&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi1oo9OTKIwi2KO6GmC_Z-BElnuq5CyLWdtYETiBI5txBCCaiGHdA3oRi8YsyS67Rsv0FLLpU9ufGQXS43ww1SttWhOUzmioeNg0XOIgmELoKiakSfdsuMW89N50uv43nVe0kpjioERjSrCbx6alWrTxBllkJky0KNwKyDQHlRvpnwFkXsqti0cr-RuZno=w320-h60&quot; title=&quot;Snip &amp;amp; Sketch toolbar screenshot&quot; width=&quot;320&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;h4&gt;Solution: restarting the Explorer process&lt;/h4&gt;
The fix that eventually worked for me was simply restarting the Explorer process. There are a few ways to restart Explorer, most of which involve using Task Manager. However, my preferred method is to use this one-liner in the Windows Run
prompt (Win+R):
&lt;div&gt;
    &lt;br /&gt;
    &lt;script src=&quot;https://gist.github.com/cbotsikas/bc3be7d22db34d61e256676493bd0108.js&quot;&gt;&lt;/script&gt;
    &lt;noscript&gt;
      &lt;pre&gt;cmd /c taskkill /F /IM explorer.exe &amp;amp;&amp;amp; start explorer&lt;/pre&gt;
    &lt;/noscript&gt;
&lt;/div&gt;
&lt;div&gt;
    &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
        &lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgVhnw0lwTZBb-d0MWB3EHI4VfYNegEXieA87Fs2JrxmVtdtA459kmQKDOPZBlgEwymIceyLg7RCkQIHJC5Vq7c8wzJtAlR0mY5pVzIU7DNCkFyvCxUeDm1YWbr604-_yRKlBG4MxH7t5qy1o6GPuly-eH9LJT3jhFG7_XR_xJ3qRwTmNm_MYQC40w_1Ew&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
            &lt;img alt=&quot;Windows Run prompt to restart Explorer.&quot; data-original-height=&quot;272&quot; data-original-width=&quot;456&quot; height=&quot;191&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgVhnw0lwTZBb-d0MWB3EHI4VfYNegEXieA87Fs2JrxmVtdtA459kmQKDOPZBlgEwymIceyLg7RCkQIHJC5Vq7c8wzJtAlR0mY5pVzIU7DNCkFyvCxUeDm1YWbr604-_yRKlBG4MxH7t5qy1o6GPuly-eH9LJT3jhFG7_XR_xJ3qRwTmNm_MYQC40w_1Ew=w320-h191&quot; title=&quot;Windows Run prompt to restart Explorer.&quot; width=&quot;320&quot; /&gt;
        &lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
        &lt;div&gt;
            &lt;h4&gt;Other solutions to try&lt;/h4&gt;
            &lt;div&gt;If restarting Explorer doesn’t work for you, here are a few other potential fixes that might help:&lt;/div&gt;
        &lt;/div&gt;
        &lt;div&gt;
            &lt;ul style=&quot;text-align: left;&quot;&gt;
                &lt;li&gt;&lt;b&gt;Reset the app&lt;/b&gt;: Go to Windows&amp;nbsp;&lt;i&gt;Settings →&lt;/i&gt;&amp;nbsp;&lt;i&gt;Apps &amp;amp; features&lt;/i&gt;, find&amp;nbsp;&lt;i&gt;Snip &amp;amp; Sketch&lt;/i&gt;, go to&amp;nbsp;&lt;i&gt;Advanced options&lt;/i&gt;, and select&amp;nbsp;&lt;i&gt;Reset&lt;/i&gt;.&lt;/li&gt;
                &lt;li&gt;
                    &lt;b&gt;Reinstall the app&lt;/b&gt;: You can uninstall Snip &amp;amp; Sketch and reinstall it from the Microsoft Store. Alternatively, use the Winget command to install it:
                    &lt;div&gt;
                        &lt;br /&gt;
                        &lt;script src=&quot;https://gist.github.com/cbotsikas/deed886600d0d9e0f47c2ceabb377702.js&quot;&gt;&lt;/script&gt;
                        &lt;noscript&gt;
                          &lt;pre&gt;winget install -e --silent --id 9mz95kl8mr0l --source msstore&lt;/pre&gt;
                        &lt;/noscript&gt;
                    &lt;/div&gt;
                    (You can verify the application ID in the URL of the&amp;nbsp;&lt;a href=&quot;https://apps.microsoft.com/detail/9mz95kl8mr0l?hl=en-US&amp;amp;gl=US&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;app&#39;s Microsoft Store page&lt;/a&gt;.)
                &lt;/li&gt;
            &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div&gt;
            &lt;h4&gt;Error details in Event Viewer&lt;/h4&gt;
            &lt;div&gt;I also checked the Event Viewer and found an Application Error log under&amp;nbsp;&lt;i&gt;Windows Logs&lt;/i&gt;&amp;nbsp;&lt;i&gt;→&lt;/i&gt;&amp;nbsp;&lt;i&gt;Application.&lt;/i&gt;&amp;nbsp;Here are the details:&lt;/div&gt;
            &lt;blockquote&gt;
                &lt;div&gt;Faulting application name: ScreenClippingHost.exe, version: 124.21904.0.0, time stamp: 0x66b25259&lt;/div&gt;
                &lt;div&gt;Faulting module name: ScreenClipping.dll, version: 124.21904.0.0, time stamp: 0x66b25230&lt;/div&gt;
                &lt;div&gt;Exception code: 0xc000041d&lt;/div&gt;
                &lt;div&gt;Fault offset: 0x000000000001bbfd&lt;/div&gt;
                &lt;div&gt;Faulting process id: 0x5008&lt;/div&gt;
                &lt;div&gt;Faulting application start time: 0x01db345fa9ecd727&lt;/div&gt;
                &lt;div&gt;Faulting application path: C:\windows\SystemApps\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\ScreenClippingHost.exe&lt;/div&gt;
                &lt;div&gt;Faulting module path: C:\windows\SystemApps\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\ScreenClipping.dll&lt;/div&gt;
                &lt;div&gt;Report Id: 699ef9b4-2197-4a00-ad9c-36f1672ff32e&lt;/div&gt;
                &lt;div&gt;Faulting package full name: MicrosoftWindows.Client.CBS_1000.19060.1000.0_x64__cw5n1h2txyewy&lt;/div&gt;
                &lt;div&gt;Faulting package-relative application ID: ScreenClipping&lt;/div&gt;
            &lt;/blockquote&gt;
            &lt;p&gt;&amp;nbsp;If you&#39;re seeing similar errors, try these steps, and hopefully one of them will fix the issue!&lt;/p&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/6088836579885032354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/6088836579885032354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/6088836579885032354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/6088836579885032354'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2024/11/how-to-fix-snip-sketch-not-working-on.html' title='How to fix Snip &amp; Sketch not working on Windows 10 (Snipping Tool shortcut issues)'/><author><name>Christos Botsikas</name><uri>http://www.blogger.com/profile/11025565251556231416</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiTqiDC0YkBWXMF6Tm6v265uSq_kyJpD9DkVuowUBHq-4VhF5CdyzIA3gjBqkm9mzlUeHSgddsiYEMswaqSbrY-5LGwyeyCzWWgoHcTaZ_nZ5LH0fDoaCueTLtPMuKUA/s220/myAvatar.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEi1oo9OTKIwi2KO6GmC_Z-BElnuq5CyLWdtYETiBI5txBCCaiGHdA3oRi8YsyS67Rsv0FLLpU9ufGQXS43ww1SttWhOUzmioeNg0XOIgmELoKiakSfdsuMW89N50uv43nVe0kpjioERjSrCbx6alWrTxBllkJky0KNwKyDQHlRvpnwFkXsqti0cr-RuZno=s72-w320-h60-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-4564395318059756070</id><published>2024-10-18T00:42:00.000+03:00</published><updated>2024-10-18T00:42:43.980+03:00</updated><title type='text'>Parse Excel XML using power query in excel</title><content type='html'>&lt;p&gt;I wanted to load an Excel XML file (a.k.a.&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Microsoft_Office_XML_formats&quot; target=&quot;_blank&quot;&gt;Microsoft Office Excel 2002 and Excel 2003 XML Format — SpreadsheetML&lt;/a&gt;) in another Excel file using &lt;a href=&quot;https://learn.microsoft.com/powerquery-m/&quot; target=&quot;_blank&quot;&gt;Power Query M formula language&lt;/a&gt;. It turns out that it&#39;s trickier than I expected so I decided to blog my solution.&lt;/p&gt;&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;Many SAP related tools export this Microsoft 2003 XML format. You can save an excel file in that format by selecting the &quot;XML Spreadsheet 2003 (*.xml)&quot; option in the save as dialog:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgimHxpH2xZBngh06hvRawgtQB3xXCndDUHrGeYzn1INMjOcWltEWTq8Pub7r7PImgfO_kBZpTA5fRGer-efVGwoFt5IabhOvJR6POVwMbq5nrwJLuaXWD_T0azJKtvD6p4PRg03kb18HFeuUqZlpgcCKDllNDYhyToyUwksnsOZXjcBsEmWEL5pi6LLqE&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;53&quot; data-original-width=&quot;279&quot; height=&quot;61&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgimHxpH2xZBngh06hvRawgtQB3xXCndDUHrGeYzn1INMjOcWltEWTq8Pub7r7PImgfO_kBZpTA5fRGer-efVGwoFt5IabhOvJR6POVwMbq5nrwJLuaXWD_T0azJKtvD6p4PRg03kb18HFeuUqZlpgcCKDllNDYhyToyUwksnsOZXjcBsEmWEL5pi6LLqE&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;The file looks like the following:&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;script src=&quot;https://gist.github.com/andreasbotsikas/959eb2925d32e90a2365a2d8e5218b2a.js?file=ExcelXmlExport.xml&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;p&gt;Notice the &quot;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;background-color: white; color: #1f2328; font-size: 12px; white-space: pre;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;pl-ent&quot; color=&quot;var(--color-prettylights-syntax-entity-tag)&quot; face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;background-color: white; box-sizing: border-box; font-size: 12px; white-space: pre;&quot;&gt;mso-application&lt;/span&gt;&lt;span class=&quot;pl-e&quot; color=&quot;var(--color-prettylights-syntax-entity)&quot; face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;background-color: white; box-sizing: border-box; font-size: 12px; white-space: pre;&quot;&gt; progid&lt;/span&gt;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;background-color: white; color: #1f2328; font-size: 12px; white-space: pre;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pl-s&quot; color=&quot;var(--color-prettylights-syntax-string)&quot; face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;background-color: white; box-sizing: border-box; font-size: 12px; white-space: pre;&quot;&gt;&lt;span class=&quot;pl-pds&quot; color=&quot;var(--color-prettylights-syntax-string)&quot; style=&quot;box-sizing: border-box;&quot;&gt;&quot;&lt;/span&gt;Excel.Sheet&lt;span class=&quot;pl-pds&quot; color=&quot;var(--color-prettylights-syntax-string)&quot; style=&quot;box-sizing: border-box;&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;background-color: white; color: #1f2328; font-size: 12px; white-space: pre;&quot;&gt;?&amp;gt;&lt;/span&gt;&quot; line which gives out the type of this xml file.&lt;/p&gt;&lt;p&gt;Once you have this file, let&#39;s assume you place it in&amp;nbsp;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;background-color: white; color: #0a3069; font-size: 12px; white-space: pre;&quot;&gt;C:&lt;/span&gt;&lt;span class=&quot;pl-cce&quot; face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;background-color: white; box-sizing: border-box; color: #0a3069; font-size: 12px; white-space: pre;&quot;&gt;\t&lt;/span&gt;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;background-color: white; color: #0a3069; font-size: 12px; white-space: pre;&quot;&gt;mp&lt;/span&gt;&lt;span class=&quot;pl-cce&quot; face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;background-color: white; box-sizing: border-box; color: #0a3069; font-size: 12px; white-space: pre;&quot;&gt;\E&lt;/span&gt;&lt;span face=&quot;ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace&quot; style=&quot;background-color: white; color: #0a3069; font-size: 12px; white-space: pre;&quot;&gt;xcelXmlExport.xml&lt;/span&gt;&amp;nbsp;and you need to load it in an excel file. Open up Excel and navigate to the Data tab and then select Get Data -&amp;gt; From Other Sources -&amp;gt; Blank Query.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh_CaWcqnFuvocMKBODt504TRux0kdtuvCTMN7jfjoy5CD_YpLF37StZ0M7I4VHnkL95sYvc1TXxZ5UsFGJQLrfD4IYt1EizRT7nI8Y-DVHq4UOICTTQ-rX9na9GaMa9kW8CFQt85VWA44TmdBXzlEC9GQD-szAaUD-lAhcW_Zmr98mMk9FqwT6hOwQBJw&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;619&quot; data-original-width=&quot;555&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh_CaWcqnFuvocMKBODt504TRux0kdtuvCTMN7jfjoy5CD_YpLF37StZ0M7I4VHnkL95sYvc1TXxZ5UsFGJQLrfD4IYt1EizRT7nI8Y-DVHq4UOICTTQ-rX9na9GaMa9kW8CFQt85VWA44TmdBXzlEC9GQD-szAaUD-lAhcW_Zmr98mMk9FqwT6hOwQBJw&quot; width=&quot;215&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;From the ribbon select the advance editor:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiQR6NhqMamRIETuynoWjcKc93YY0Z_ueh75fFXvlZz9nHdhUui1gQuDocHaRwV_DdfVnbEsxGXYJmyVlNyHNozAp7tCGB60mkpV7SFUoOw9AtfEljO9eXC5OgdKoJnG7wiQClqckxH6K5Wjj1Zx5AcH9gODdWDLnKdGVWWdqwc4pKwFXAimnPe32jSxs8&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;146&quot; data-original-width=&quot;267&quot; height=&quot;175&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiQR6NhqMamRIETuynoWjcKc93YY0Z_ueh75fFXvlZz9nHdhUui1gQuDocHaRwV_DdfVnbEsxGXYJmyVlNyHNozAp7tCGB60mkpV7SFUoOw9AtfEljO9eXC5OgdKoJnG7wiQClqckxH6K5Wjj1Zx5AcH9gODdWDLnKdGVWWdqwc4pKwFXAimnPe32jSxs8&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In the editor paste the following M script:&lt;p&gt;&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/andreasbotsikas/959eb2925d32e90a2365a2d8e5218b2a.js?file=ImportExcelXmlInPowerQuery.m&quot;&gt;&lt;/script&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This will load the Excel XML file and you should have all data loaded as strings:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgI2WjYe5fELW3Yvxt9vcg8b0x0_8nWa3ESXvhiNZ97KryLEvzB72iuvESr4aAlMp7wMOKG_Y_GYGaWs3kEyuA7RkujfU3jZjb6lPyao-0ZhRY3lChIP5MzvX94iM9AyCQn4rCZBkS1poVcDvs0PbFyXRfLeq24l6SV2zB7Lsyupj0sgfcauZOOLRt-zCE&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;522&quot; data-original-width=&quot;880&quot; height=&quot;190&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgI2WjYe5fELW3Yvxt9vcg8b0x0_8nWa3ESXvhiNZ97KryLEvzB72iuvESr4aAlMp7wMOKG_Y_GYGaWs3kEyuA7RkujfU3jZjb6lPyao-0ZhRY3lChIP5MzvX94iM9AyCQn4rCZBkS1poVcDvs0PbFyXRfLeq24l6SV2zB7Lsyupj0sgfcauZOOLRt-zCE&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;From there on, you can Close &amp;amp; Load and start building your dashboard using the data you just loaded from an external file.&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/4564395318059756070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/4564395318059756070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/4564395318059756070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/4564395318059756070'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2024/10/parse-excel-xml-using-power-query-in.html' title='Parse Excel XML using power query in excel'/><author><name>Andreas M. Botsikas</name><uri>http://www.blogger.com/profile/10477012039301070675</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuJatPHJNoGbLzjUin8W8V81_zv6HJhqB3yAWOe-lS4UT5bU4yOtQ5YI6KVwkzs89rkiv8TdWNB9gt1bQKOb1lz9pFG4IZ8bQ4uxudwN0SgtIl3rUcUAWvaylGB8dgNQ/s220/Abot.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgimHxpH2xZBngh06hvRawgtQB3xXCndDUHrGeYzn1INMjOcWltEWTq8Pub7r7PImgfO_kBZpTA5fRGer-efVGwoFt5IabhOvJR6POVwMbq5nrwJLuaXWD_T0azJKtvD6p4PRg03kb18HFeuUqZlpgcCKDllNDYhyToyUwksnsOZXjcBsEmWEL5pi6LLqE=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-823908937329099785</id><published>2024-01-05T16:58:00.000+02:00</published><updated>2024-01-05T16:58:01.461+02:00</updated><title type='text'>LogonCommand doesn&#39;t execute in windows sandbox</title><content type='html'>&lt;p&gt;I was trying to use &lt;a href=&quot;https://learn.microsoft.com/windows/security/application-security/application-isolation/windows-sandbox/windows-sandbox-configure-using-wsb-file&quot; target=&quot;_blank&quot;&gt;Windows Sandbox&lt;/a&gt; to run &lt;a href=&quot;https://botsikas.blogspot.com/2024/01/running-ubiquiti-unifi-network-server.html&quot; target=&quot;_blank&quot;&gt;UniFi server&lt;/a&gt; and I wanted to install VC140 as a logon command which seemed to not work 🤔 I was mounting the &lt;i&gt;Desktop &lt;/i&gt;folder where I had both the executable and the &lt;b&gt;&lt;i&gt;startup.cmd&lt;/i&gt;&lt;/b&gt; file. Opening the sandbox and running the script worked. This means that the&amp;nbsp;&lt;i&gt;LogonCommand&lt;/i&gt; should also work, right?&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/andreasbotsikas/3d495725f7107e168e8113e077cf1c7d.js?file=wrong-startup.cmd&quot;&gt;&lt;/script&gt;
&lt;p&gt;Well, no, because the scripts needs to use full paths as mentioned in &lt;a href=&quot;https://www.youtube.com/watch?v=4v0JmPEhaR8&quot; target=&quot;_blank&quot;&gt;this youtube video&lt;/a&gt;.&lt;/p&gt;&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;In order to make the script work, I specified the full path name as follows:&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/andreasbotsikas/3d495725f7107e168e8113e077cf1c7d.js?file=startup.cmd&quot;&gt;&lt;/script&gt;
&lt;p&gt;The final &lt;i&gt;wsb&lt;/i&gt; file is the following:&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/andreasbotsikas/3d495725f7107e168e8113e077cf1c7d.js?file=unifi_server.wsb&quot;&gt;&lt;/script&gt;
&lt;p&gt;In this file, I mount the&amp;nbsp;&lt;b&gt;&lt;i&gt;Ubiquiti UniFi&lt;/i&gt;&lt;/b&gt;, which is found in my host machine&amp;nbsp;&lt;b&gt;&lt;i&gt;C:\sndboxfiles.&amp;nbsp;&lt;/i&gt;&lt;/b&gt;This folder contains the extracted files after installing the UniFi server through the &lt;a href=&quot;https://www.ui.com/download&quot; target=&quot;_blank&quot;&gt;downloaded UniFi-installer.exe&lt;/a&gt;. I also mount the &lt;i&gt;C:\sndboxfiles\Desktop&lt;/i&gt; at the sandbox&#39;s user (&lt;b&gt;WDAGUtilityAccount&lt;/b&gt;) Desktop. In that folder, I have the&amp;nbsp;&lt;i&gt;VC_redist.x64.exe&lt;/i&gt; file which I downloaded from Microsoft and the&amp;nbsp;&lt;i&gt;startup.cmd&lt;/i&gt; which installs Visual C++ quietly. The&amp;nbsp;&lt;b&gt;&lt;i&gt;LogonCommand &lt;/i&gt;&lt;/b&gt;simply executes the script which now works, because the final script invokes the&amp;nbsp;VC_redist.x64.exe with full path name, including the folders.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/823908937329099785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/823908937329099785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/823908937329099785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/823908937329099785'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2024/01/logoncommand-doesnt-execute-in-windows.html' title='LogonCommand doesn&#39;t execute in windows sandbox'/><author><name>Andreas M. Botsikas</name><uri>http://www.blogger.com/profile/10477012039301070675</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuJatPHJNoGbLzjUin8W8V81_zv6HJhqB3yAWOe-lS4UT5bU4yOtQ5YI6KVwkzs89rkiv8TdWNB9gt1bQKOb1lz9pFG4IZ8bQ4uxudwN0SgtIl3rUcUAWvaylGB8dgNQ/s220/Abot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-5677035284672548376</id><published>2024-01-05T16:02:00.000+02:00</published><updated>2024-01-05T16:02:24.551+02:00</updated><title type='text'>Running Ubiquiti UniFi Network Server on Windows 11</title><content type='html'>&lt;p&gt;I was trying to run the self-hosted &lt;a href=&quot;https://www.ui.com/download/releases/network-server&quot; target=&quot;_blank&quot;&gt;UniFi Network Server v8.0.26&lt;/a&gt;&amp;nbsp;on a newly installed Windows 11 but I was getting a cryptic message &quot;Server taking too long to start…&quot; followed by a &quot;Start-up failed&quot; error. It turns out that VC140 runtime is a hidden requirement (Visual C++ redistributable aka MSVC) and in my case it worked fine installing the &lt;a href=&quot;https://learn.microsoft.com/cpp/windows/latest-supported-vc-redist?view=msvc-170&quot; target=&quot;_blank&quot;&gt;latest MSVC for 2015,2017 and 2022 available in the official Microsoft site&lt;/a&gt;. Here is how I discovered the missing dependency.&lt;/p&gt;&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;After installing the product, the whole application is extracted in &quot;&lt;b&gt;&lt;i&gt;%USERPROFILE%\Ubiquiti UniFi&lt;/i&gt;&lt;/b&gt;&quot;. You will notice that the &lt;b&gt;&lt;i&gt;logs&lt;/i&gt;&lt;/b&gt;, &lt;b&gt;&lt;i&gt;data&lt;/i&gt;&lt;/b&gt;, &lt;b&gt;&lt;i&gt;work&lt;/i&gt;&lt;/b&gt; and &lt;b&gt;&lt;i&gt;run&lt;/i&gt;&lt;/b&gt; folders are automatically created the first time you execute the server. To start the server you can use the &quot;&lt;b&gt;&lt;i&gt;bin\start.bat&lt;/i&gt;&lt;/b&gt;&quot; file. In my case, I modified the 2nd line of the bat file to use&amp;nbsp;&quot;%USERPROFILE%\Ubiquiti UniFi\jre\bin\java.exe&quot; executable which is the bundled version of java, instead of using the system&#39;s java.&lt;/p&gt;&lt;p&gt;Looking in the &quot;&lt;b&gt;&lt;i&gt;logs\server.log&lt;/i&gt;&lt;/b&gt;&quot; I observed the following &lt;i&gt;&amp;lt;db-server&amp;gt; INFO&amp;nbsp; db&lt;/i&gt; logs repeating:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;- Database process stopped...&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;- Checking if database needs to be shut down&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;- Database was not running&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;- Database configuration, dir=&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;In the &lt;b&gt;&lt;i&gt;bin &lt;/i&gt;&lt;/b&gt;folder, you will notice&amp;nbsp;&lt;b&gt;&lt;i&gt;mongod.exe&lt;/i&gt;&lt;/b&gt; which is the mongo DB server used by the app. If you try to run this, you will get a much clearer error message saying that VC140 is missing.&lt;/p&gt;&lt;p&gt;Hope this process will help you solve other similar issues running UniFi network server.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/5677035284672548376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/5677035284672548376' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/5677035284672548376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/5677035284672548376'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2024/01/running-ubiquiti-unifi-network-server.html' title='Running Ubiquiti UniFi Network Server on Windows 11'/><author><name>Andreas M. Botsikas</name><uri>http://www.blogger.com/profile/10477012039301070675</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuJatPHJNoGbLzjUin8W8V81_zv6HJhqB3yAWOe-lS4UT5bU4yOtQ5YI6KVwkzs89rkiv8TdWNB9gt1bQKOb1lz9pFG4IZ8bQ4uxudwN0SgtIl3rUcUAWvaylGB8dgNQ/s220/Abot.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-4702118449094619918</id><published>2023-10-16T00:44:00.005+03:00</published><updated>2024-05-17T00:45:20.499+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="configuration"/><category scheme="http://www.blogger.com/atom/ns#" term="laptop"/><category scheme="http://www.blogger.com/atom/ns#" term="powercfg"/><category scheme="http://www.blogger.com/atom/ns#" term="powershell"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>Disabling critical battery action</title><content type='html'>&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;I have an old laptop with an almost dead battery, which I always use tethered to a power source, mostly as a media device connected to my TV. Occasionally, I need to move it, and if it&#39;s open, Windows realizes that the battery is very weak and decides to hibernate, as that&#39;s the default critical battery action. This can become very frustrating. The good news is that you can easily address this issue using Windows&#39;&amp;nbsp;&lt;i&gt;powercfg&lt;/i&gt;&amp;nbsp;command.&lt;/span&gt;&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;If you try to change that action using Control Panel -&amp;gt; Power Options -&amp;gt; Advanced power settings -&amp;gt; Battery -&amp;gt; Critical battery action, you&#39;ll notice that you can only choose between &quot;Sleep&quot;, &quot;Hibernate&quot;, and &quot;Shut down&quot;. There&#39;s no &quot;Do nothing&quot; option as there is in the &quot;Low battery action.&quot;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimDOsEp9G-JgDy0XcseQ5Lt_wP4ia0k3E3neM0PRbvj19AkFsF2gnuo7CjB-eO0KnNkgfZ-1li-eRfPaTrS97gQxq2QF-XxcqZvd8RwBFRh6uY_GSap4NilwdfFjcAmMoQ_Qu06UHJZFK7i6B8Tcq8NeXbvc6Vn0OI1hOcnHMxNSArwfzLB7z4NZjFof4/s437/powerOptions01.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;437&quot; data-original-width=&quot;400&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimDOsEp9G-JgDy0XcseQ5Lt_wP4ia0k3E3neM0PRbvj19AkFsF2gnuo7CjB-eO0KnNkgfZ-1li-eRfPaTrS97gQxq2QF-XxcqZvd8RwBFRh6uY_GSap4NilwdfFjcAmMoQ_Qu06UHJZFK7i6B8Tcq8NeXbvc6Vn0OI1hOcnHMxNSArwfzLB7z4NZjFof4/s320/powerOptions01.png&quot; width=&quot;293&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Fortunately, Windows offers a powerful utility called&amp;nbsp;&lt;i&gt;powercfg&amp;nbsp;&lt;/i&gt;that enables you to manage various power settings. In this case, we will use&amp;nbsp;&lt;i&gt;powercfg&amp;nbsp;&lt;/i&gt;to prevent the laptop from hibernating on low battery. You&#39;ll need a PowerShell or Command Prompt (elevation is not needed), and you can use the following two commands to set &quot;Do nothing&quot; for both &quot;On battery&quot; and &quot;Plugged in&quot;:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;script src=&quot;https://gist.github.com/cbotsikas/be74c8c51f8a6dacd2521e3cab9d8355.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Please note the difference in the&amp;nbsp;&lt;i&gt;set&lt;b&gt;dc&lt;/b&gt;valueindex&amp;nbsp;&lt;/i&gt;and&amp;nbsp;&lt;i&gt;set&lt;b&gt;ac&lt;/b&gt;valueindex&lt;/i&gt;&amp;nbsp;parameters. The zero &quot;0&quot; at the end means &quot;Do nothing&quot;.&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCh5YDCkV0el8-8OxT4AuGQ5HG1aCw0R5UOL3OAp-AHOr6I45xB1YNOskzs-J_aWIu843WP-wmSU2YNXlvJfsHKymB6TC7NVHOovHfC5tvhQpWULdVMheKP1wi_C8gzZ9ntq3PkdWAqLOzrxcJXhsLBn5qakc0caaxyMlPdFX_skq-wxpuVgifHS1MLpc/s1109/powerOptions02.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;625&quot; data-original-width=&quot;1109&quot; height=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCh5YDCkV0el8-8OxT4AuGQ5HG1aCw0R5UOL3OAp-AHOr6I45xB1YNOskzs-J_aWIu843WP-wmSU2YNXlvJfsHKymB6TC7NVHOovHfC5tvhQpWULdVMheKP1wi_C8gzZ9ntq3PkdWAqLOzrxcJXhsLBn5qakc0caaxyMlPdFX_skq-wxpuVgifHS1MLpc/w400-h225/powerOptions02.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;I&#39;ve tested this on Windows 10 but it should work on any Windows version.&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/4702118449094619918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/4702118449094619918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/4702118449094619918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/4702118449094619918'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2023/10/disabling-critical-battery-action.html' title='Disabling critical battery action'/><author><name>Christos Botsikas</name><uri>http://www.blogger.com/profile/11025565251556231416</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiTqiDC0YkBWXMF6Tm6v265uSq_kyJpD9DkVuowUBHq-4VhF5CdyzIA3gjBqkm9mzlUeHSgddsiYEMswaqSbrY-5LGwyeyCzWWgoHcTaZ_nZ5LH0fDoaCueTLtPMuKUA/s220/myAvatar.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimDOsEp9G-JgDy0XcseQ5Lt_wP4ia0k3E3neM0PRbvj19AkFsF2gnuo7CjB-eO0KnNkgfZ-1li-eRfPaTrS97gQxq2QF-XxcqZvd8RwBFRh6uY_GSap4NilwdfFjcAmMoQ_Qu06UHJZFK7i6B8Tcq8NeXbvc6Vn0OI1hOcnHMxNSArwfzLB7z4NZjFof4/s72-c/powerOptions01.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-2617626865437058970</id><published>2023-07-04T18:26:00.002+03:00</published><updated>2023-07-10T17:52:49.502+03:00</updated><title type='text'>Installing Windows 11 in QEMU on Supported Hardware</title><content type='html'>&lt;p&gt;When attempting to install Windows 11 in QEMU, you may encounter the &quot;unsupported hardware&quot; message. This occurs because QEMU does not enable TPM 2.0 support by default.&lt;/p&gt;&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;To resolve this issue, you will need to add virtual hardware to the hardware list that passes requests through to the onboard chip, as demonstrated below (image from &lt;a href=&quot;https://virt-manager.org/&quot; target=&quot;_blank&quot;&gt;virt-manager&lt;/a&gt;):&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip5p1FO7WUbaYGd6neIzjm-kLkJUJn831zwWIx6yeM5J7sMSv9Ud7bpKQy6DVv7ezcxZTdRVOcu-X6Q3j0QgLRhTakDBLk722zhnpqSXci_YxO7ACsCqmO7uEqOQ1FbofnvlJfyjFn8-FiBtS6dCVKt_1QjCdqXvV1tECn0Gduyjv-4sr0bCP5jV57tQg/s744/add-tpm.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;649&quot; data-original-width=&quot;744&quot; height=&quot;279&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip5p1FO7WUbaYGd6neIzjm-kLkJUJn831zwWIx6yeM5J7sMSv9Ud7bpKQy6DVv7ezcxZTdRVOcu-X6Q3j0QgLRhTakDBLk722zhnpqSXci_YxO7ACsCqmO7uEqOQ1FbofnvlJfyjFn8-FiBtS6dCVKt_1QjCdqXvV1tECn0Gduyjv-4sr0bCP5jV57tQg/s320/add-tpm.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;After performing this step, you may receive an error stating that &quot;&lt;i&gt;/dev/fdset/3&lt;/i&gt;&quot; &quot;&lt;i&gt;is not a TPM device&lt;/i&gt;&quot;. This is simply a permissions issue that can be resolved by adding the &quot;&lt;i&gt;&lt;b&gt;/dev/tpm0 rw,&lt;/b&gt;&lt;/i&gt;&quot; line in &quot;&lt;i&gt;/etc/apparmor.d/abstractions/libvirt-qemu&lt;/i&gt;&quot; right before the line that reads &quot;&lt;i&gt;/dev/net/tun rw,&lt;/i&gt;&quot; and restarting AppArmor if you have VMs already running. The final file should look like:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmeoBhjG4h_XQu4hyY14un-9JpBPr2Q6CNTpyMR16SfbDHpAmfp_9AK46X32_u-V3Tfz6MOVNbsZxfldmM5wIqmnVFy2VctUAM5TPNpD6aaJcMB-Yfb9nQCRyeAxhH0eMH7j898x7-DdqTaQprmC6UKsO2H9Nltt_2dZHVds5XyAFDsqtJwZohlIoov9g/s686/edit-libvirt-qemu.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;619&quot; data-original-width=&quot;686&quot; height=&quot;289&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmeoBhjG4h_XQu4hyY14un-9JpBPr2Q6CNTpyMR16SfbDHpAmfp_9AK46X32_u-V3Tfz6MOVNbsZxfldmM5wIqmnVFy2VctUAM5TPNpD6aaJcMB-Yfb9nQCRyeAxhH0eMH7j898x7-DdqTaQprmC6UKsO2H9Nltt_2dZHVds5XyAFDsqtJwZohlIoov9g/s320/edit-libvirt-qemu.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Once Windows is installed, be sure to install the &lt;a href=&quot;https://github.com/virtio-win/virtio-win-pkg-scripts&quot; target=&quot;_blank&quot;&gt;appropriate guest tool as discussed in this ReadMe file&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Additionally, I encountered a problem with screen resolution and was unable to adjust it in the guest OS. After some research, I discovered that selecting &lt;b&gt;&lt;i&gt;Virtio&lt;/i&gt;&lt;/b&gt; as the model in the &quot;&lt;i&gt;Video Virtio&lt;/i&gt;&quot; settings resolved the issue. Naturally, I also wanted to enable 3D acceleration.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif82-9bI-8x7oeNHmlm1e0xcRicxq4RIzQ4m7coW0ATE6lSOREtiWSkYgLsUlWowLZPyNa6EH5i954SFHpBq6NrBCcQqiujK28AloH0yPvehyuRMAPQASyOmlkGnXCeDF-JD5Kq18L73bk9JnNizqmb7dV3fo_z3GA6HZhCx8mDDg3-7rdQRZuBDPvvts/s338/virtio-model.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;93&quot; data-original-width=&quot;338&quot; height=&quot;88&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif82-9bI-8x7oeNHmlm1e0xcRicxq4RIzQ4m7coW0ATE6lSOREtiWSkYgLsUlWowLZPyNa6EH5i954SFHpBq6NrBCcQqiujK28AloH0yPvehyuRMAPQASyOmlkGnXCeDF-JD5Kq18L73bk9JnNizqmb7dV3fo_z3GA6HZhCx8mDDg3-7rdQRZuBDPvvts/s320/virtio-model.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;However, upon doing so, I encountered an error stating &quot;&lt;i&gt;OpenGL is not available&lt;/i&gt;&quot;. To fix this, I navigated to &quot;&lt;i&gt;Display Spice&lt;/i&gt;&quot;, changed the &lt;i&gt;Listen type&lt;/i&gt; to &lt;i&gt;None&lt;/i&gt;, and enabled OpenGL support as illustrated below:&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWeoudM9PSoovouApg9sV0ncEFlZ-1sgH7Wib2K6B7Vi_Bg_QNy6R-oefZmjn-SNB9ZnJuzmau3_W5_qWeX6KG2BnHMIrqq2FJaJ7gIduQD8Dk79xRiA7oob8OOebwAWpBE8fTxeN9a2I0IHlkMQfZ4Iof2bCXFhIYkd0doDm2uFVQZlUV0LT38dy8bkA/s324/spice-settings.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;238&quot; data-original-width=&quot;324&quot; height=&quot;235&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWeoudM9PSoovouApg9sV0ncEFlZ-1sgH7Wib2K6B7Vi_Bg_QNy6R-oefZmjn-SNB9ZnJuzmau3_W5_qWeX6KG2BnHMIrqq2FJaJ7gIduQD8Dk79xRiA7oob8OOebwAWpBE8fTxeN9a2I0IHlkMQfZ4Iof2bCXFhIYkd0doDm2uFVQZlUV0LT38dy8bkA/s320/spice-settings.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Lastly, I would like to share some helpful commands for starting/stopping VMs and backing up configurations:&lt;/div&gt;&lt;div&gt;
&lt;script src=&quot;https://gist.github.com/andreasbotsikas/4afbeadf4df512b51702fe6c4ebc846e.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;If you want to use bitlocker&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I encountered a problem with BitLocker while using TPM passthrough, which required me to manually input the recovery key each time. To resolve this issue, I ended up using a TPM emulation, following the &lt;a href=&quot;https://getlabsdone.com/how-to-enable-tpm-and-secure-boot-on-kvm/&quot; target=&quot;_blank&quot;&gt;steps outlined in this article&lt;/a&gt;. It&#39;s important to choose the correct Linux codename during this process. I mistakenly selected &quot;focal&quot; instead of &quot;jammy,&quot; resulting in an error related to libssl1.1 – a version not officially supported in Ubuntu 22.&lt;/p&gt;&lt;p&gt;Additionally, I needed to manually populate the keys as &lt;a href=&quot;https://superuser.com/questions/1660806/how-to-install-a-windows-guest-in-qemu-kvm-with-secure-boot-enabled &quot; target=&quot;_blank&quot;&gt;detailed in this thread&lt;/a&gt;, in order to enable secure boot in the UEFI BIOS. Be sure to review the comment below the answer, which addresses the missing &quot;count=1&quot; parameter; otherwise, you may end up with an excessively large &lt;i&gt;keys.img&lt;/i&gt; file.&lt;/p&gt;&lt;p&gt;&lt;b&gt;References:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;https://askubuntu.com/questions/1365829/qemu-failed-to-passthrough-a-tpm-device&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;https://www.reddit.com/r/Fedora/comments/qqw3sq/qemu_video_virtio_opengl_not_available_after/&lt;/p&gt;&lt;p&gt;https://superuser.com/questions/1725915/auto-resize-vm-with-windows-greyed-out-since-graphics-type-vnc-does-not-supp&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/2617626865437058970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/2617626865437058970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/2617626865437058970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/2617626865437058970'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2023/07/installing-windows-11-in-qemu-on.html' title='Installing Windows 11 in QEMU on Supported Hardware'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip5p1FO7WUbaYGd6neIzjm-kLkJUJn831zwWIx6yeM5J7sMSv9Ud7bpKQy6DVv7ezcxZTdRVOcu-X6Q3j0QgLRhTakDBLk722zhnpqSXci_YxO7ACsCqmO7uEqOQ1FbofnvlJfyjFn8-FiBtS6dCVKt_1QjCdqXvV1tECn0Gduyjv-4sr0bCP5jV57tQg/s72-c/add-tpm.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-865847307687206765</id><published>2023-05-06T23:51:00.001+03:00</published><updated>2023-05-06T23:51:52.128+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="contacts"/><category scheme="http://www.blogger.com/atom/ns#" term="gmail"/><category scheme="http://www.blogger.com/atom/ns#" term="migrate"/><category scheme="http://www.blogger.com/atom/ns#" term="outlook"/><title type='text'>Copy contacts from outlook to gmail</title><content type='html'>&lt;p&gt;To transfer your contacts from Outlook to Gmail and keep the pictures, you need to export them as vCard files (vcf) and then import them into Google Contacts. However, Outlook does not support exporting multiple contacts as vCard files at once and neither does Google Contacts support importing multiple vCard files at once. You can use a workaround to export your contacts in batches and then combine them into a single file. Here are the steps:&lt;/p&gt;&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Open Outlook (the windows client)&amp;nbsp;&lt;/li&gt;&lt;li&gt;(Optional) If you are using non Eglish characters, you need to change the preferred encoding of outlook to save vCards as Unicode (UTF-8), otherwise gmail won&#39;t import them correctly.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVYnIee11_Y3BIW78cdWVQTBn3lFPE2l5WGRqfKZlzprCS895qpjEYeMnPw7c0GF2YprnApRorvavXGkdtT5T08j4EcIjvBAhRTJ5pgqsrkqoe_9l-XPPVdmu7dilGB5m6qRIjkE-gDwUH30RippEM4ZSZeKHtKm_UQrmdM2K-qRlSjb9B3boRsxiL/s836/Unicode_vCards.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;442&quot; data-original-width=&quot;836&quot; height=&quot;211&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVYnIee11_Y3BIW78cdWVQTBn3lFPE2l5WGRqfKZlzprCS895qpjEYeMnPw7c0GF2YprnApRorvavXGkdtT5T08j4EcIjvBAhRTJ5pgqsrkqoe_9l-XPPVdmu7dilGB5m6qRIjkE-gDwUH30RippEM4ZSZeKHtKm_UQrmdM2K-qRlSjb9B3boRsxiL/w400-h211/Unicode_vCards.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Navigate to the Contacts folder.&lt;/li&gt;&lt;li&gt;Select the contacts you want to export. You can use Ctrl+click or Shift+click to select multiple contacts.&lt;/li&gt;&lt;li&gt;From the ribbon, choose Forward Contact -&amp;gt; As a Business Card. This will create a new email message with the vCard files attached.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJRdNzf1l-L7ElLAGWTvw3GTgw243w-d6IbPMmkYDXWg6-LK33sOkkzHwx274Ihh-RKwz6ao3XIjxdGfkMJnvPQMBX2sPzFraTPgnDXXwRtG-1zU95PzOb48RrTLZrGQ0rfw0yHYnlPJF7uprs2MHKM8i9WlHMGefY8ehZLSP_C3dZP8revjSje48a/s1179/Export_As_Business_Card.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;488&quot; data-original-width=&quot;1179&quot; height=&quot;165&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJRdNzf1l-L7ElLAGWTvw3GTgw243w-d6IbPMmkYDXWg6-LK33sOkkzHwx274Ihh-RKwz6ao3XIjxdGfkMJnvPQMBX2sPzFraTPgnDXXwRtG-1zU95PzOb48RrTLZrGQ0rfw0yHYnlPJF7uprs2MHKM8i9WlHMGefY8ehZLSP_C3dZP8revjSje48a/w400-h165/Export_As_Business_Card.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;If nothing happens for a long time or you get a memory exception, repeat step 4, selecting fewer contacts. In my case, I had to batch them in groups of 50 contacts.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Once the new email message opens, select all attachments by right clicking in one of them and selecting &quot;Select All&quot; (or use the Ctrl+A shortcut) and then right click again to select the &quot;Save As&quot; to save all vCards to a folder on your computer.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBbGEBKouMa2wa3m-cBmSdWz1dEC8cJw8jk3RFhYFoow7wJOyXRkT13qlfCvnaN3DOWO-E7xvdDB0X5kqXBBshnq1kBpygKYJ8V24RzJMXhyxI27FQwIpUn0mGU_SVqWyFxm1yQ9GeplIMZtF58dW-5RH0DxIfFAVFiZhGMMK3GOQDlCfedIDGxcjs/s1440/Select_All.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;553&quot; data-original-width=&quot;1440&quot; height=&quot;154&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBbGEBKouMa2wa3m-cBmSdWz1dEC8cJw8jk3RFhYFoow7wJOyXRkT13qlfCvnaN3DOWO-E7xvdDB0X5kqXBBshnq1kBpygKYJ8V24RzJMXhyxI27FQwIpUn0mGU_SVqWyFxm1yQ9GeplIMZtF58dW-5RH0DxIfFAVFiZhGMMK3GOQDlCfedIDGxcjs/w400-h154/Select_All.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Repeat steps 4-7 for the rest of your contacts until you have exported all of them as vCard files.&lt;/li&gt;&lt;li&gt;Combine all the vCard files into a single file. To do that, open a command prompt window and navigate to the folder where you saved the vCard files. Type &lt;b&gt;&lt;i&gt;copy *.vcf all_contacts.vcf&lt;/i&gt;&lt;/b&gt; and press Enter. This will create a new file called all_contacts.vcf that contains all your contacts.&lt;/li&gt;&lt;li&gt;Log in to your Google account and go to Google Contacts.&lt;/li&gt;&lt;li&gt;Click on Import and then select the file all_contacts.vcf from your computer.&lt;/li&gt;&lt;li&gt;Click Import again to confirm.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;You have successfully imported your contacts from Outlook to Gmail. Gmail tags them with an “Imported on” label, which was a lifesaver while I was experimenting with the vCard encoding. It is unfortunate that migrating contacts between Outlook and Gmail is that complicated...&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/865847307687206765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/865847307687206765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/865847307687206765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/865847307687206765'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2023/05/to-transfer-your-contacts-from-outlook.html' title='Copy contacts from outlook to gmail'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVYnIee11_Y3BIW78cdWVQTBn3lFPE2l5WGRqfKZlzprCS895qpjEYeMnPw7c0GF2YprnApRorvavXGkdtT5T08j4EcIjvBAhRTJ5pgqsrkqoe_9l-XPPVdmu7dilGB5m6qRIjkE-gDwUH30RippEM4ZSZeKHtKm_UQrmdM2K-qRlSjb9B3boRsxiL/s72-w400-h211-c/Unicode_vCards.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-4492342347548361187</id><published>2022-12-31T14:16:00.001+02:00</published><updated>2023-01-11T17:55:27.609+02:00</updated><title type='text'>Dual boot two windows operating systems</title><content type='html'>&lt;p&gt;I wanted a windows installation where I could &lt;a href=&quot;https://github.com/PacktPublishing/Azure-Data-Scientist-Associate-Certification-Guide&quot; target=&quot;_blank&quot;&gt;write my book&lt;/a&gt; and escape from the apps of my everyday windows operating system. You will find plenty of articles about dual boot with Linux, but I couldn&#39;t find one on how to dual boot two windows installations.&amp;nbsp;&lt;/p&gt;&lt;p&gt;In hindsight, after talking to one of my colleagues, there is an easier way to do the same thing using just the windows boot disk and navigating through the &lt;a href=&quot;https://www.windowscentral.com/software-apps/windows-11/how-to-create-a-dual-boot-setup-on-windows-11&quot; target=&quot;_blank&quot;&gt;UI wizard&lt;/a&gt;. This article is still relevant if you want to understand what the wizard does, if you want complete control, or if you want to upgrade the OS in just one of your partitions.&lt;/p&gt;

&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;script crossorigin=&quot;anonymous&quot; integrity=&quot;sha512-STof4xm1wgkfm7heWqFJVn58Hm3EtS31XFaagaa8VMReCXAkQnJZ+jEy8PCC/iT18dFy95WcExNHFTqLyp72eQ==&quot; referrerpolicy=&quot;no-referrer&quot; src=&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://rawgit.com/moski/gist-Blogger/master/public/gistLoader.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;p&gt;You will need the installation iso. You can download the &lt;a href=&quot;https://www.microsoft.com/software-download/windows11&quot;&gt;windows 11 iso directly from Microsoft&lt;/a&gt;. If you are looking for windows 10, you need to download&amp;nbsp;&lt;a href=&quot; https://www.microsoft.com/software-download/windows10&quot; target=&quot;_blank&quot;&gt;the tool&lt;/a&gt; and then save the ISO file as shown in the following screenshots.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt6zXBW_YZcWTgEWTbjuJ7rWxMMF1W8EsSJcvP_YLPuKfcC4D_nFsUCBYYHy4Q_ZdCJomf4TbVi1Rz3TCCcQA88XDRW1o3NLPN1RoFvUmpRQZdlQAm1aIYne2IfPC8O3l9lxwh5ocqGVH-U0VpREBHJSJ9fjWPjIy67DAmEON2RyTZl1QSH7HUDjRI/s981/Windows10Iso.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;232&quot; data-original-width=&quot;981&quot; height=&quot;95&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt6zXBW_YZcWTgEWTbjuJ7rWxMMF1W8EsSJcvP_YLPuKfcC4D_nFsUCBYYHy4Q_ZdCJomf4TbVi1Rz3TCCcQA88XDRW1o3NLPN1RoFvUmpRQZdlQAm1aIYne2IfPC8O3l9lxwh5ocqGVH-U0VpREBHJSJ9fjWPjIy67DAmEON2RyTZl1QSH7HUDjRI/w400-h95/Windows10Iso.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;Once you get the ISO file, mount it by opening it with windows explorer. In the following examples, we assume that the iso was mounted in drive &lt;b&gt;E:&lt;/b&gt;.Open PowerShell in Administrator mode and find the index of the image you want to install.&lt;/div&gt;
&lt;div class=&quot;gistLoad&quot; data-file=&quot;FindIndex.bat&quot; data-id=&quot;313914e29140bb0dadebbf417e0a7f16&quot;&gt;&lt;a href=&quot;https://gist.github.com/andreasbotsikas/313914e29140bb0dadebbf417e0a7f16&quot; target=&quot;_blank&quot;&gt;Loading gist&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In my case, I wanted to extract Windows 10 Pro, so my index was six (6), as seen in the following screenshot:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL-va9mZqMyD55bv-74MghCzuNR6jOkL779qjIwsR6fmGRygFXlwYVtDq-UkdgqYD1cc-IUe63rzUT-MqoDE9Y_Gznde4Ns9tJwp1-1B7Jo-HAGoknN5F8NOm2TpDzLlmO5eOr9f66LTidNfROR4mjg3rlevSplP7DitRWa_ZDNSAg-InZYslHagFK/s532/Windows10ProIndex.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;160&quot; data-original-width=&quot;532&quot; height=&quot;96&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL-va9mZqMyD55bv-74MghCzuNR6jOkL779qjIwsR6fmGRygFXlwYVtDq-UkdgqYD1cc-IUe63rzUT-MqoDE9Y_Gznde4Ns9tJwp1-1B7Jo-HAGoknN5F8NOm2TpDzLlmO5eOr9f66LTidNfROR4mjg3rlevSplP7DitRWa_ZDNSAg-InZYslHagFK/s320/Windows10ProIndex.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;As a side note, when I upgraded to windows 11, I followed the same process, and it seems that Windows 11 Pro is also in index 6, but the image is slightly bigger.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghjhqsSRAt3xWHuimkUiuLCRHD665vpqVdD4YQugw81KENwAL4xpvIzOqxO2iJhn9vIm65LMHylPRwKHYtIuzxMkUek-gNts-Gs7HSBr1Z2foH1Vb5yL_hoJ6MUh7BQuL99ca_Lh9LRJWLBXyriYcfGwzVfP_i9N2JfNmdvnoSaIJnKiQ8nuXLBjQk/s420/Windows11ProIndex.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;139&quot; data-original-width=&quot;420&quot; height=&quot;106&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghjhqsSRAt3xWHuimkUiuLCRHD665vpqVdD4YQugw81KENwAL4xpvIzOqxO2iJhn9vIm65LMHylPRwKHYtIuzxMkUek-gNts-Gs7HSBr1Z2foH1Vb5yL_hoJ6MUh7BQuL99ca_Lh9LRJWLBXyriYcfGwzVfP_i9N2JfNmdvnoSaIJnKiQ8nuXLBjQk/s320/Windows11ProIndex.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Create a temporary folder in c: or wherever you want to extract the windows installation media (in this example, I created c:\tmp):
&lt;div class=&quot;gistLoad&quot; data-file=&quot;CreateFolder.ps&quot; data-id=&quot;313914e29140bb0dadebbf417e0a7f16&quot;&gt;&lt;a href=&quot;https://gist.github.com/andreasbotsikas/313914e29140bb0dadebbf417e0a7f16&quot; target=&quot;_blank&quot;&gt;Loading gist&lt;/a&gt;&lt;/div&gt;
Extract the target image there:
&lt;div class=&quot;gistLoad&quot; data-file=&quot;ExportWindowsImage.bat&quot; data-id=&quot;313914e29140bb0dadebbf417e0a7f16&quot;&gt;&lt;a href=&quot;https://gist.github.com/andreasbotsikas/313914e29140bb0dadebbf417e0a7f16&quot; target=&quot;_blank&quot;&gt;Loading gist&lt;/a&gt;&lt;/div&gt;
Once the process completes you should see the following:
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8TJHaZESTV10G0c2qzcvUXslVnqPFcl8cZdrYrHkeOzbt0hb_n12De0dxkFUxAA9pXdyU5SI7xjeQsOASXnb-bENBC8BR1G2wy2AHmdAj0PmZbmLGu3PqgRJrH9BtwL3J200-x3xNIOu6IK_buXX8TpDhuyGNkCRG6pgxGP2L9C7WTg7m5lFolzBt/s860/ExportImage.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;183&quot; data-original-width=&quot;860&quot; height=&quot;68&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8TJHaZESTV10G0c2qzcvUXslVnqPFcl8cZdrYrHkeOzbt0hb_n12De0dxkFUxAA9pXdyU5SI7xjeQsOASXnb-bENBC8BR1G2wy2AHmdAj0PmZbmLGu3PqgRJrH9BtwL3J200-x3xNIOu6IK_buXX8TpDhuyGNkCRG6pgxGP2L9C7WTg7m5lFolzBt/s320/ExportImage.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Shrink one of your partitions to make room for the new windows partition:&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvWRBZFrYYYCZGmv0QzvWGwfPvTicSg1iE-PWruSRzpIKkKiyx_3vrb5zLP7cwkJn8gyZpgBbbFTulIdjhrXtH2A49EjIwN__vfEdvFR1-igASVEt6cUMhRWsKRs24Uyy_2pPzMGPDfi4nbVEkBDEz15CUlHggTnB7_8cAzPhxiO096dWdZgYP_GO3/s899/ShrinkVolume.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;529&quot; data-original-width=&quot;899&quot; height=&quot;188&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvWRBZFrYYYCZGmv0QzvWGwfPvTicSg1iE-PWruSRzpIKkKiyx_3vrb5zLP7cwkJn8gyZpgBbbFTulIdjhrXtH2A49EjIwN__vfEdvFR1-igASVEt6cUMhRWsKRs24Uyy_2pPzMGPDfi4nbVEkBDEz15CUlHggTnB7_8cAzPhxiO096dWdZgYP_GO3/s320/ShrinkVolume.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;
Create the new partition where you will install your windows, and disable BitLocker for that drive if it is automatically enabled. Let’s assume that you mounted the new partition as drive &lt;b&gt;P:&lt;/b&gt;.&lt;br /&gt;
Apply the extracted image to that partition using the following command:
&lt;div class=&quot;gistLoad&quot; data-file=&quot;ApplyWindowsImage.bat&quot; data-id=&quot;313914e29140bb0dadebbf417e0a7f16&quot;&gt;&lt;a href=&quot;https://gist.github.com/andreasbotsikas/313914e29140bb0dadebbf417e0a7f16&quot; target=&quot;_blank&quot;&gt;Loading gist&lt;/a&gt;&lt;/div&gt;
In the end you should see the following:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0VxFJXkaroO71h547i6o2iaYV9PHAT9XSP3mSkUWz-VPQbxVfE04IClbJ1njr4KmDkCUgjG9Y6Nysv828qCMs1IUPf2OCRNErLPRgcqcRFXy9mQftCUL4ttU2fW8T_T_nX7EXyvxdWif5q81UyirG8UkXl-PqN9dEOr4e3l6s9I9j5u9I2JT3Iw0x/s886/ApplyImage.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;216&quot; data-original-width=&quot;886&quot; height=&quot;78&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0VxFJXkaroO71h547i6o2iaYV9PHAT9XSP3mSkUWz-VPQbxVfE04IClbJ1njr4KmDkCUgjG9Y6Nysv828qCMs1IUPf2OCRNErLPRgcqcRFXy9mQftCUL4ttU2fW8T_T_nX7EXyvxdWif5q81UyirG8UkXl-PqN9dEOr4e3l6s9I9j5u9I2JT3Iw0x/s320/ApplyImage.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Once this is finished, your new operating system is waiting for you to boot it up to finalize the setup process (drivers/user account etc.).&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To boot the new windows installation, you will need to use the bcdboot command and add the new windows installation path (&lt;b&gt;P:\Windows\&lt;/b&gt;) to the list of operating systems you can use. To add it, use the following command:
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDFUwLxh45sDBuYWT5kxUVzlh28cQhz7TtbTOTiy5FAA_34VSg0MA92JtHF0-qJr7a97B02HncdC6p5wxvXT4Y7XvuQnNeAtg_Gefyr12-7XPP88bbpFHL9SjsOQkRx0c1PiAeYziH3zeOyHKTXIHu1iEor5n9ngalvI3aosRLB61t-XnaLAyxkbI_/s686/bcdboot_addlast.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;81&quot; data-original-width=&quot;686&quot; height=&quot;38&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDFUwLxh45sDBuYWT5kxUVzlh28cQhz7TtbTOTiy5FAA_34VSg0MA92JtHF0-qJr7a97B02HncdC6p5wxvXT4Y7XvuQnNeAtg_Gefyr12-7XPP88bbpFHL9SjsOQkRx0c1PiAeYziH3zeOyHKTXIHu1iEor5n9ngalvI3aosRLB61t-XnaLAyxkbI_/s320/bcdboot_addlast.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
If you want to modify the record, you can list all UEFI firmware using the bcdedit command. Typing this command in an elevated PowerShell or command prompt will list all entries. Our target record is the one point to the &lt;b&gt;P:&lt;/b&gt; drive, and the ID is one of the well-known ones &lt;b&gt;{default}&lt;/b&gt;:
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIzhSYmgbkEjdsOHmIcK4aj5B-Vv3_gduc0O4WiE6ZMPqsHctApzqKahAzZbNbhwcuc6hN7HPzuv2QXmahCt7dShCNteOCAftXdj8Qm-uA3l2LYoOdsd5vVQKrdylPjXJuvlfSteX1JXWFHxedSISBlamSmtLa2Ipotqrx8oh84Pn-fqOPZy-h_vOp/s900/Bcdboot_new_entry.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;461&quot; data-original-width=&quot;900&quot; height=&quot;164&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIzhSYmgbkEjdsOHmIcK4aj5B-Vv3_gduc0O4WiE6ZMPqsHctApzqKahAzZbNbhwcuc6hN7HPzuv2QXmahCt7dShCNteOCAftXdj8Qm-uA3l2LYoOdsd5vVQKrdylPjXJuvlfSteX1JXWFHxedSISBlamSmtLa2Ipotqrx8oh84Pn-fqOPZy-h_vOp/s320/Bcdboot_new_entry.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Let’s rename it to something more memorable:
&lt;div class=&quot;gistLoad&quot; data-file=&quot;ChangeOSDescription.bat&quot; data-id=&quot;313914e29140bb0dadebbf417e0a7f16&quot;&gt;&lt;a href=&quot;https://gist.github.com/andreasbotsikas/313914e29140bb0dadebbf417e0a7f16&quot; target=&quot;_blank&quot;&gt;Loading gist&lt;/a&gt;&lt;/div&gt;
You can also set how long you will wait for the OS to load and which OS to load first through the “Startup and Recovery” options of the System properties:&amp;nbsp;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9Jjxv1Sm6Q30dBQAwhi6xLalZeds5HYureqfEIhd4MBEBkl-hYT4BSOK3lIKGXSD01SibPP24Sf_M_TZy4IjtGAN6p8hCJvaGtmVU77AVvwIH7C2RLvTFjcsJPl8GWl8xa3iYvnD3Mzxn2MlXiNedhToIv6pE0mQb1tjPllB7y0yvbNTAgkpMv2fd/s900/StartupSettings.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;645&quot; data-original-width=&quot;900&quot; height=&quot;229&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9Jjxv1Sm6Q30dBQAwhi6xLalZeds5HYureqfEIhd4MBEBkl-hYT4BSOK3lIKGXSD01SibPP24Sf_M_TZy4IjtGAN6p8hCJvaGtmVU77AVvwIH7C2RLvTFjcsJPl8GWl8xa3iYvnD3Mzxn2MlXiNedhToIv6pE0mQb1tjPllB7y0yvbNTAgkpMv2fd/s320/StartupSettings.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;After that, you will need to reboot your machine, select your new operating system, and finalize the setup, and that’s it. Once it’s done, you can use the new operating system as you would typically do. I even upgraded from windows 10 to 11 through the standard Windows upgrade process.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The same process works if you want to install a new windows installation over an existing installation. In my case, I booted in my “&lt;i&gt;Personal windows&lt;/i&gt;”, bitlock unlocked the other windows partition, formatted it, and used the &lt;b&gt;dism /Apply-Image&lt;/b&gt;&amp;nbsp;command to apply the windows 11 image. After that, I had to boot in my other windows partition as usual to complete the installation (no need to modify the boot loader).&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An alternative is to&amp;nbsp;&lt;a href=&quot;https://learn.microsoft.com/windows-hardware/manufacture/desktop/boot-to-vhd--native-boot--add-a-virtual-hard-disk-to-the-boot-menu&quot; target=&quot;_blank&quot;&gt;boot from VHDX&lt;/a&gt;, which is slower than using the actual partition.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, if you are reading this article trying to install an isolated windows installation to try out some software or run an executable you don’t fully trust, you can use the &lt;a href=&quot;https://learn.microsoft.com/windows/security/threat-protection/windows-sandbox/windows-sandbox-overview &quot; target=&quot;_blank&quot;&gt;windows sandbox&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;References:&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;More info on the &lt;a href=&quot;https://www.itechguides.com/convert-esd-to-wim/&quot; target=&quot;_blank&quot;&gt;extract image process&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div&gt;More info on the &lt;a href=&quot;https://learn.microsoft.com/windows-hardware/manufacture/desktop/capture-and-apply-windows-system-and-recovery-partitions&quot; target=&quot;_blank&quot;&gt;apply windows image process&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;How to&amp;nbsp;&lt;a href=&quot;https://learn.microsoft.com/windows-hardware/drivers/devtest/changing-the-friendly-name-of-a-boot-entry&quot; target=&quot;_blank&quot;&gt;rename boot entry labels&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;BCDBoot reference:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-hardware/manufacture/desktop/boot-to-vhd--native-boot--add-a-virtual-hard-disk-to-the-boot-menu &quot; target=&quot;_blank&quot;&gt;Boot to vhd&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-hardware/manufacture/desktop/bcdboot-command-line-options-techref-di&quot; target=&quot;_blank&quot;&gt;BDDBoot options&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/4492342347548361187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/4492342347548361187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/4492342347548361187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/4492342347548361187'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2022/12/dual-boot-two-windows-operating-systems.html' title='Dual boot two windows operating systems'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt6zXBW_YZcWTgEWTbjuJ7rWxMMF1W8EsSJcvP_YLPuKfcC4D_nFsUCBYYHy4Q_ZdCJomf4TbVi1Rz3TCCcQA88XDRW1o3NLPN1RoFvUmpRQZdlQAm1aIYne2IfPC8O3l9lxwh5ocqGVH-U0VpREBHJSJ9fjWPjIy67DAmEON2RyTZl1QSH7HUDjRI/s72-w400-h95-c/Windows10Iso.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-291550176211445451</id><published>2022-12-08T22:56:00.002+02:00</published><updated>2022-12-08T22:56:52.553+02:00</updated><title type='text'>Convert VHS mpg files to mp4 to import in DaVinci Resolve</title><content type='html'>&lt;p&gt;I recently got my hands on a bunch of mpg files ripped from VHS cassettes (32 files spanning 157 GB), and I wanted to edit them with DaVinci Resolve. To my surprise, mpg files are not supported, so I had to convert them. I choose to use FFmpeg and convert them into H.264/MPEG-4 AVC compression format with Advanced Audio Coding (AAC) using the following command:&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/andreasbotsikas/6fc6e65222b9a7fafa43284bd7cf752c.js&quot;&gt;&lt;/script&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;p&gt;The command &lt;a href=&quot;https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/forfiles&quot;&gt;loops through&lt;/a&gt; the mpg files in the directory and converts them to mp4 files using the FFmpeg command. The end result was 3.4 times smaller, meaning that a 7.38 GB 2h and 5minute mpg file shrunk into 2.17 GB with the same quality.&lt;/p&gt;
&lt;p&gt;Note: If you run into an “Unknown encoder ‘libx264’” issue, you will need to get an FFmpeg executable built with the corresponding flag set during build time. I used a build from &lt;a href=&quot;https://www.gyan.dev/ffmpeg/builds/&quot;&gt;gyan.dev&lt;/a&gt;.
&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/291550176211445451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/291550176211445451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/291550176211445451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/291550176211445451'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2022/12/convert-vhs-mpg-files-to-mp4-to-import.html' title='Convert VHS mpg files to mp4 to import in DaVinci Resolve'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-7950704922888206790</id><published>2021-12-01T13:18:00.018+02:00</published><updated>2023-05-12T10:22:35.617+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Azure"/><category scheme="http://www.blogger.com/atom/ns#" term="Cromwell"/><category scheme="http://www.blogger.com/atom/ns#" term="Genomics"/><category scheme="http://www.blogger.com/atom/ns#" term="HPC"/><title type='text'>Genomics in Azure</title><content type='html'>&lt;p&gt;Genomics analysis is an interesting field that has high computational and storage requirements. On top of that, there are compliance requirements, especially if the analysis happens on top of patient clinical data. This makes genomic research activities great candidates to run in an compliant elastic cloud, non other than Azure cloud which even has the recent &lt;a href=&quot;https://docs.microsoft.com/en-us/compliance/regulatory/offering-nen-7510-netherlands&quot; target=&quot;_blank&quot;&gt;NEN 7510 standard&lt;/a&gt; that is a mandatory requirement for all Netherland organizations that process patient health information.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;p&gt;When it comes to genomics, a big chunk of the workload is related to &lt;a href=&quot;https://en.wikipedia.org/wiki/Genome-wide_association_study&quot; target=&quot;_blank&quot;&gt;genome-wide association study&lt;/a&gt;&amp;nbsp;(GWAS)&amp;nbsp;which is the study of association between genomes and genetic variants on certain traits or diseases. This is done by mapping and aligning genomes and then running analysis on top of those sequences. The following diagram shows some of the components you may want to consider for an enterprise ready architecture that supports genomics workloads.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfqHYxTH0uqiT0T1FGYT0PTHFtrAhzoj0Vb0VaY9FUtJ08B9eW7Yx2edS8fd6O57HITa3BV06uSvzW6Z2MO_QHDeJq0Eg8Zi2izfFUAeizVq8VDjfvBxyzP-HWWv0BRWMcGHrtR_w92mc/s2048/Running_Genomics_In_Azure.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1141&quot; data-original-width=&quot;2048&quot; height=&quot;303&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfqHYxTH0uqiT0T1FGYT0PTHFtrAhzoj0Vb0VaY9FUtJ08B9eW7Yx2edS8fd6O57HITa3BV06uSvzW6Z2MO_QHDeJq0Eg8Zi2izfFUAeizVq8VDjfvBxyzP-HWWv0BRWMcGHrtR_w92mc/w544-h303/Running_Genomics_In_Azure.png&quot; width=&quot;544&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Components commonly seen in genomics solutions in Azure (&lt;a href=&quot;https://1drv.ms/p/s!Ao5RxwrMaoA5gnCPeHiaC4aBaQEL?e=Mein1P&quot; target=&quot;_blank&quot;&gt;see pptx version&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Let&#39;s start analyzing the diagram from the storage layer. Data coming out of a &lt;a href=&quot;https://en.wikipedia.org/wiki/DNA_sequencer&quot; target=&quot;_blank&quot;&gt;sequencer&lt;/a&gt;&amp;nbsp;can be 100s of Gigabytes per single sample. So when you are up for population genomics, you can easily reach Petabytes and Exabytes scales. Here are some of the common things you will need to address:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Move data to the cloud. You can use&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/data-factory/introduction&quot;&gt;Azure Data Factory&lt;/a&gt;&amp;nbsp;(ADF)&amp;nbsp;to bring in data from publicly accessible sources, like other clouds, or you can use&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/data-factory/concepts-pipelines-activities?context=/azure/synapse-analytics/context/context&amp;amp;tabs=synapse-analytics&quot;&gt;Azure Synapse pipelines&lt;/a&gt;&amp;nbsp;if you already use it or you want to enable the&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/synapse-analytics/security/workspace-data-exfiltration-protection&quot;&gt;data exfiltration protection that Azure Synapse Analytics offers&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Organize and store data. Have a look at&amp;nbsp;&lt;a href=&quot;https://aka.ms/adls/hitchhikersguide&quot;&gt;https://aka.ms/adls/hitchhikersguide&lt;/a&gt; which offers a great guide on the things you need to consider while structuring a data lake. Also make sure you read about the &lt;a href=&quot;https://docs.microsoft.com/azure/storage/blobs/lifecycle-management-overview&quot; target=&quot;_blank&quot;&gt;life-cycle management capabilities of blob storage&lt;/a&gt;&amp;nbsp;that will help you phase out old research data to reduce the cost of storage and &lt;a href=&quot;https://docs.microsoft.com/azure/storage/blobs/storage-blob-reserved-capacity&quot; target=&quot;_blank&quot;&gt;reserved capacity&lt;/a&gt;&amp;nbsp;that will reduce the overall storage ownership cost.&lt;/li&gt;&lt;li&gt;Govern data perhaps with&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/purview/overview&quot;&gt;Azure Purview&lt;/a&gt;&amp;nbsp;and of course using the&amp;nbsp;&lt;a href=&quot;https://azure.microsoft.com/en-us/overview/trusted-cloud/compliance/&quot;&gt;compliance enforcements tools available in Azure&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;On the compute layer, if you are looking for a research environment where you have some extra compute, you can leverage the&amp;nbsp;&lt;a href=&quot;https://github.com/microsoft/genomicsnotebook/tree/main/genomics-data-science-vm&quot; target=&quot;_blank&quot;&gt;Genomics Data Science VM&lt;/a&gt;&amp;nbsp;which deploys a windows or linux Virtual Machine&amp;nbsp; (VM) with all sort of common data science tools and genomics specific resources, like &lt;a href=&quot;https://github.com/microsoft/genomicsnotebook/tree/main/sample-notebooks&quot; target=&quot;_blank&quot;&gt;sample notebooks&lt;/a&gt; and&amp;nbsp;&lt;a href=&quot;https://www.bioconductor.org/packages/release/BiocViews.html#___Workflow&quot; target=&quot;_blank&quot;&gt;common genomics workflows that can run on top of Bioconductor&lt;/a&gt;. This VM will get you started in minutes but it comes with all the pain of managing the VM, updating the operating system, backing up your configuration etc. Moreover, the whole processing is done within the same VM, so you can only scale up to more powerful and also more expensive&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/virtual-machines/sizes&quot; target=&quot;_blank&quot;&gt;VM SKUs&lt;/a&gt;.&lt;/div&gt;&lt;p&gt;The other approach is to scale out to multiple but smaller VMs, by breaking the job you have to do in multiple smaller tasks. This is where the genomics workflow managers come into play. Workflow managers help scientists scale an existing research process by guiding them in building repeatable and auditable workflows (something you may need, due to regulatory requirements). There are quite a few well-established workflow managers out there:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/broadinstitute/cromwell&quot; target=&quot;_blank&quot;&gt;Cromwell&lt;/a&gt; from the Broad Institute of MIT and Harvard allows you to orchestrate this type of workloads using the&amp;nbsp;&lt;a href=&quot;https://github.com/openwdl/wdl&quot; target=&quot;_blank&quot;&gt;Workflow Description Language (WDL)&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href=&quot;https://www.commonwl.org/&quot; target=&quot;_blank&quot;&gt;Common Workflow Language (CDL)&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://usegalaxy.org/&quot;&gt;Galaxy&lt;/a&gt;&amp;nbsp;is another workflow manager that is widely used in on-premises deployments and works in Azure as well.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/snakemake/snakemake&quot;&gt;Snakemake&lt;/a&gt;&amp;nbsp;is another popular tool, mainly because scientists use Python to define their workflows.&lt;/li&gt;&lt;li&gt;Other solutions like&amp;nbsp;&lt;a href=&quot;https://github.com/nextflow-io/nextflow&quot;&gt;nextflow&lt;/a&gt;&amp;nbsp;that has great integration with Azure,&amp;nbsp;&lt;a href=&quot;https://www.nvidia.com/en-us/clara/genomics/&quot; target=&quot;_blank&quot;&gt;Parabricks that was acquired by NVIDIA&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;https://www.bioconductor.org/&quot;&gt;Bioconductor&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Most of those workflow managers, break the job in smaller tasks and then pass them to a task scheduler to log necessary auditing info, execute and monitor the actual tasks. Task schedulers are either implementations on top of the &lt;a href=&quot;https://github.com/ga4gh/task-execution-schemas&quot; target=&quot;_blank&quot;&gt;Task Execution Service (TES) API&lt;/a&gt;, &lt;a href=&quot;https://slurm.schedmd.com/overview.html&quot;&gt;Slurm Workload Manager&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href=&quot;https://openpbs.org/&quot;&gt;OpenPBS&lt;/a&gt;, all of&amp;nbsp;which are schedulers coming from the &lt;a href=&quot;https://azure.microsoft.com/solutions/high-performance-computing/&quot; target=&quot;_blank&quot;&gt;High Performance Computing (HPC)&lt;/a&gt; field. Most of those schedulers integrate well with Azure native resources like:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/azure/cyclecloud/overview&quot;&gt;CycleCloud&lt;/a&gt;&amp;nbsp;which is commonly used in hybrid scenarios. Manoj has a great two part blog in his LinkedIn profile showing how you can run Snakemake on top of CycleCloud. If you are interested start from his introductory blog &quot;&lt;a href=&quot;https://azure.microsoft.com/en-us/blog/power-your-genomic-data-analysis-on-azure-with-azure-cyclecloud/&quot;&gt;Power your genomic data analysis on Azure with Azure CycleCloud&lt;/a&gt;&quot;. Most of the schedulers support CycleCloud. For example, if you already have bash shell scripts for coordinating and submitting jobs to on-premises Slurm cluster, CycleCloud allows you to reuse the same scripts and operationalize them in cloud elasticity. If you are ok having a VM to host the control plane (CycleCloud comes from an on-premises&amp;nbsp; first approach where you host everything), then this is probably a good option.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/batch/batch-technical-overview&quot;&gt;Azure Batch&lt;/a&gt;&amp;nbsp;is probably the most cost efficient service for running batch jobs. Even Azure Machine Learning (AzureML) is using it behind the scenes to implement scalable training processes. Microsoft has implemented&amp;nbsp;&lt;a href=&quot;https://github.com/microsoft/CromwellOnAzure/blob/master/src/TesApi.Web/BatchScheduler.cs&quot;&gt;Cromwell TES Batch Scheduler&lt;/a&gt;&amp;nbsp;which you can probably port to any workflow manager that support TES (including &lt;a href=&quot;https://snakemake.readthedocs.io/en/stable/executing/cloud.html#executing-a-snakemake-workflow-via-ga4gh-tes&quot; target=&quot;_blank&quot;&gt;Snakemake&lt;/a&gt;) or you can use dedicated integrations like&amp;nbsp;&lt;a href=&quot;https://github.com/Azure/azure-hpc/tree/master/LifeSciences/SnakemakeBurst&quot;&gt;SnakemakeBurst&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/azure/aks/intro-kubernetes&quot;&gt;Azure Kubernetes Service (AKS)&lt;/a&gt;. Owning an AKS cluster is not trivial and you will need to have at least 3 VMs running. I would advise this option only if you already have an AKS cluster running and you want to utilize the spare compute or if you plan to host other loads in the AKS cluster and thus planning to get the know-how of owning an AKS cluster.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Let&#39;s zoom into the Spoke Virtual Network reference on the diagram. Due to the sensitivity of the data handled in such solutions, it is common to see &lt;a href=&quot;https://docs.microsoft.com/azure/security/fundamentals/isolation-choices#networking-isolation&quot; target=&quot;_blank&quot;&gt;networking isolation&lt;/a&gt; on top of the &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/active-directory/identity-protection/overview-identity-protection&quot; target=&quot;_blank&quot;&gt;identity protection that Azure Active Directory provides&lt;/a&gt;.&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/hub-spoke?tabs=cli&quot;&gt;The hub-spoke network topology&lt;/a&gt;&amp;nbsp;is widely adopted by enterprises to allow them scale within cloud. Smaller enterprises may start with the&amp;nbsp;&lt;a href=&quot;https://github.com/Azure/Enterprise-Scale/tree/main/docs/reference/treyresearch&quot;&gt;Trey Research reference architecture&lt;/a&gt;&amp;nbsp;and scale from there.&lt;/div&gt;&lt;div&gt;With the network isolation in place, scientists need to get access to the isolated data and the various resources. If the scientists already have their own devices to support them on their daily work, they can re-use that investment and connect from their machines to the private network with technologies like &lt;a href=&quot;https://docs.microsoft.com/azure/vpn-gateway/tutorial-site-to-site-portal&quot; target=&quot;_blank&quot;&gt;site to site VPN&lt;/a&gt; and &lt;a href=&quot;https://azure.microsoft.com/services/expressroute/&quot; target=&quot;_blank&quot;&gt;Express route&lt;/a&gt; if they were working from on premises environment. Alternatively, scientists could&amp;nbsp;connect with ad-hoc&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/azure/vpn-gateway/point-to-site-about&quot; target=&quot;_blank&quot;&gt;point to site VPN&lt;/a&gt;&amp;nbsp;if they are working remotely. These approaches assume that the enterprise has already got a way to attest for the health of the devices, something that can be imposed using&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/azure/active-directory/conditional-access/overview&quot;&gt;Azure Active Directory&#39;s Conditional Access&lt;/a&gt;. If the scientists don&#39;t have their own&amp;nbsp;devices, then they can either leverage the VM solution mentioned above and get access to it through&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/azure/bastion/bastion-overview&quot;&gt;Azure Bastion&lt;/a&gt;&amp;nbsp;or the enterprise can adopt&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/azure/architecture/example-scenario/wvd/windows-virtual-desktop&quot; target=&quot;_blank&quot;&gt;Azure Virtual Desktop&lt;/a&gt;, probably with a &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/virtual-desktop/configure-host-pool-personal-desktop-assignment-type&quot; target=&quot;_blank&quot;&gt;personal desktop assignment&lt;/a&gt; approach.&lt;/div&gt;&lt;div&gt;&lt;p&gt;Microsoft has provided quite a few &lt;a href=&quot;https://www.microsoft.com/genomics/&quot; target=&quot;_blank&quot;&gt;resources for folks to work with genomics is Azure&lt;/a&gt;, enabling institutes to build &lt;a href=&quot;https://terra.bio/&quot; target=&quot;_blank&quot;&gt;platforms like Terra&lt;/a&gt;&amp;nbsp;which eventually can support any type of research activity.&lt;/p&gt;&lt;p&gt;One of these resources is the&amp;nbsp;&lt;a href=&quot;https://github.com/microsoft/CromwellOnAzure&quot; target=&quot;_blank&quot;&gt;Cromwell on Azure&lt;/a&gt;&amp;nbsp;solution. With this resource, you can kick start easily a Cromwell workflow manager that uses TES as a task scheduler that schedules the jobs on top of Azure Batch. The Microsoft repository provides multiple examples that you can take and customize to your needs, under the&amp;nbsp;&lt;a href=&quot;https://github.com/microsoft/CromwellOnAzure#run-common-workflows&quot; target=&quot;_blank&quot;&gt;&lt;i&gt;Run Common Workflows&lt;/i&gt; section of the readme file&lt;/a&gt;. The idea is that you dockerize you existing tools (or use the existing&amp;nbsp;&lt;a href=&quot;https://hub.docker.com/r/broadinstitute/genomes-in-the-cloud/&quot; target=&quot;_blank&quot;&gt;docker images&lt;/a&gt;) and Cromwell will execute them. For example, if you already have a pipeline that does mutation detection, you can containerize and standardize your pipeline using the&amp;nbsp;&lt;a href=&quot;https://github.com/openwdl/wdl&quot; target=&quot;_blank&quot;&gt;Workflow Description Language (WDL)&lt;/a&gt;&amp;nbsp;or the&amp;nbsp;&lt;a href=&quot;https://www.commonwl.org/&quot; target=&quot;_blank&quot;&gt;Common Workflow Language (CDL)&lt;/a&gt;&amp;nbsp;language. Learning WDL is pretty easy and you can leverage &lt;a href=&quot;https://github.com/openwdl/learn-wdl&quot; target=&quot;_blank&quot;&gt;this great opensource learning path for WDL&lt;/a&gt;. You then establish a process to migrate your data into blob storage where you can build your data providence with native storage account features&amp;nbsp;for &lt;a href=&quot;https://docs.microsoft.com/azure/storage/blobs/security-recommendations&quot; target=&quot;_blank&quot;&gt;security&lt;/a&gt;&amp;nbsp;and &lt;a href=&quot;https://docs.microsoft.com/azure/storage/blobs/security-recommendations&quot; target=&quot;_blank&quot;&gt;data protection&lt;/a&gt;. The data can be picked up by Cromwell to be processed and the results can be stored back in blobs for down stream analysis. Having the &lt;a href=&quot;https://docs.microsoft.com/azure/storage/blobs/storage-how-to-mount-container-linux&quot; target=&quot;_blank&quot;&gt;data in a blob, you can easily attach them&lt;/a&gt; in a Genomics Data Science VM which has all the downstream analysis tools you may be looking for in python, R or even Bioconductor.&lt;/p&gt;&lt;p&gt;If you are already familiar with the SPARK ecosystem, you can use&amp;nbsp;&lt;a href=&quot;https://glow.readthedocs.io/en/latest/tutorial.html&quot;&gt;Glow to do GWAS on top of SPARK&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Finally, if you want to avoid the hassle of building your own platform, you can take advantage of &lt;a href=&quot;http://aka.ms/genomics&quot; target=&quot;_blank&quot;&gt;Microsoft&#39;s Genomics service&lt;/a&gt;, which is a cloud implementation of the Burrows-Wheeler Aligner (BWA) and the Genome Analysis Toolkit (GATK) for secondary analysis. Alternatively, you can look at Microsoft&#39;s partners&#39; turn-key solutions like&amp;nbsp;&lt;a href=&quot;https://illumina.github.io/dragen-azure-quickstart/3.9.03/&quot;&gt;DRAGEN on Azure, provided by illumina&lt;/a&gt;&amp;nbsp;which uses the components mentioned above and provides out of the box pre-built pipelines.&lt;/p&gt;&lt;p&gt;As you saw, Azure provides you with a lot of options when it comes to genomics. From basic elastic infrastructure, to genomics notebooks, to individual components that do specific analysis, as well as end-to-end solutions. To decide what is the best fit for your needs, let&#39;s look into the following questions:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;How much data do you have?&lt;/li&gt;&lt;li&gt;What are you looking to do with it? Are you looking to combine it with Electronic Medical Records (EMR) data or imaging data like &lt;a href=&quot;https://docs.microsoft.com/azure/healthcare-apis/dicom/dicom-services-overview&quot; target=&quot;_blank&quot;&gt;Digital Imaging and Communications in Medicine (DICOM)&lt;/a&gt; data?&lt;/li&gt;&lt;li&gt;What is the current state of your environment? Do you already have a pipeline? Are you looking to scale out the existing pipeline to handle more data?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Once you have those answers you can decide which Azure components you will need. Feel free to use the &lt;a href=&quot;https://docs.microsoft.com/azure/architecture/icons/&quot; target=&quot;_blank&quot;&gt;Azure Icons Pack&lt;/a&gt; and my &lt;a href=&quot;https://1drv.ms/p/s!Ao5RxwrMaoA5gnCPeHiaC4aBaQEL?e=P0vWCh&quot; target=&quot;_blank&quot;&gt;PowerPoint with the schemas shown in this blog post&lt;/a&gt; to start designing your own architectures.&lt;/p&gt;&lt;p&gt;Looking forward seeing what type of solution you came up with, in your genomic journey!&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/7950704922888206790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/7950704922888206790' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/7950704922888206790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/7950704922888206790'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2021/12/genomics-in-azure.html' title='Genomics in Azure'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfqHYxTH0uqiT0T1FGYT0PTHFtrAhzoj0Vb0VaY9FUtJ08B9eW7Yx2edS8fd6O57HITa3BV06uSvzW6Z2MO_QHDeJq0Eg8Zi2izfFUAeizVq8VDjfvBxyzP-HWWv0BRWMcGHrtR_w92mc/s72-w544-h303-c/Running_Genomics_In_Azure.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-1655273333572667641</id><published>2021-09-09T10:14:00.008+03:00</published><updated>2021-12-03T00:02:33.626+02:00</updated><title type='text'> Network link is disconnected</title><content type='html'>You get a new device that has a 1Gb ethernet card (mine has the I219-LM) and you start getting random network disconnects. Been there and it is frustrating. There are a couple of reasons why this could happen (faulty drivers, faulty hardware, more than 100m from router) but in my case, it was a faulty cable that was easily identified with a ethernet cable continuity checker.&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
I have a router far away from my machine. Both devices support gigabit connectivity, but they were auto negotiating and connecting at 100Mbps due to the faulty patch cable.&amp;nbsp; The problem was that from time to time the network connectivity dropped, just like if someone pulled the plug.&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the event viewer in the system log, I could see the following sequence of events from the e1dexpress source:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Warning&lt;/b&gt;: Network link is disconnected.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Information&lt;/b&gt;: Network link has been established at 100Mbps full duplex.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;As a workaround till I get a new patch panel, I disabled the auto negotiation feature of my network card and hardcoded the connectivity to 100Mbps full duplex. Probably will drop it to even less if I observe more disconnects. 
To do that&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Right-click Start menu button.&lt;/li&gt;&lt;li&gt;Click Device Manager.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Expand Network Adapter.&lt;/li&gt;&lt;li&gt;Right-click on the ethernet adapter that is disconnecting&lt;/li&gt;&lt;li&gt;Click Properties.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Click Advanced tab.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Click &quot;Speed &amp;amp; Duplex&quot; from the list of properties&lt;/li&gt;&lt;li&gt;Select 100 Mbps Half Duplex or even less.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Click OK.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzuskOunBOTFtsYvcsiAct50nnMuBXwUTPaxPkoM4BDbK5pPmc0sKm8NXBx6x_tgh_vZ3EjImsS7UN2zjBCBfqa34BeWXYLLByc3kHXSDzghFKP4Jl5zDOXInC1t5Yhm7nRKQwjo_pC0E/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;552&quot; data-original-width=&quot;691&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzuskOunBOTFtsYvcsiAct50nnMuBXwUTPaxPkoM4BDbK5pPmc0sKm8NXBx6x_tgh_vZ3EjImsS7UN2zjBCBfqa34BeWXYLLByc3kHXSDzghFKP4Jl5zDOXInC1t5Yhm7nRKQwjo_pC0E/&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;Hope this helps&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/1655273333572667641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/1655273333572667641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/1655273333572667641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/1655273333572667641'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2021/09/network-link-is-disconnected-long.html' title=' Network link is disconnected'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzuskOunBOTFtsYvcsiAct50nnMuBXwUTPaxPkoM4BDbK5pPmc0sKm8NXBx6x_tgh_vZ3EjImsS7UN2zjBCBfqa34BeWXYLLByc3kHXSDzghFKP4Jl5zDOXInC1t5Yhm7nRKQwjo_pC0E/s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-1090681583114516949</id><published>2020-12-24T14:29:00.002+02:00</published><updated>2020-12-24T14:29:45.951+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Input Languages"/><category scheme="http://www.blogger.com/atom/ns#" term="Language bar"/><category scheme="http://www.blogger.com/atom/ns#" term="locale"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>Remove unknown locale qaa-Latn from windows</title><content type='html'>&lt;p&gt;Got a fresh window 10 installation where I configure US keyboard as default and added Greek as well (the language with π and Σ symbols). I noticed that when I was switching languages a 3rd locale (qaa-Latn) appeared in the list which I couldn&#39;t remove from the windows list. In my case the keyboard was emitting Greek characters but the windows spelling couldn&#39;t recognize the words. In order to remove the extra locale I had to use the following powershell.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/andreasbotsikas/bb9ed51d5f798e7a0b4edf6195e07cbd.js&quot;&gt;&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/1090681583114516949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/1090681583114516949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/1090681583114516949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/1090681583114516949'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2020/12/remove-unknown-locale-qaa-latn-from.html' title='Remove unknown locale qaa-Latn from windows'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-150744944382191158</id><published>2020-09-20T18:59:00.004+03:00</published><updated>2020-09-20T18:59:58.250+03:00</updated><title type='text'>Set proxy for command line in windows</title><content type='html'>&lt;p&gt;&amp;nbsp;Ever wanted to force tools like curl and az cli to pass their traffic through a proxy while running them in cmd.exe?&lt;/p&gt;&lt;p&gt;Set the following environment variables and netsh will automatically pick up them and use them for all network connectivity.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/andreasbotsikas/86a92644da1f1ec00e58e2bad112c8f7.js&quot;&gt;&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/150744944382191158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/150744944382191158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/150744944382191158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/150744944382191158'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2020/09/set-proxy-for-command-line-in-windows.html' title='Set proxy for command line in windows'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-5671531035097243036</id><published>2020-02-18T23:32:00.003+02:00</published><updated>2020-06-05T10:39:50.936+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="edge"/><category scheme="http://www.blogger.com/atom/ns#" term="powershell"/><title type='text'>Download new chromium based edge via powershell</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
If you ever need to download the stable version of the chromium based Edge via powershell, you can use the following one liner:
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;# Stable
# Invoke-WebRequest -Uri &quot;https://c2rsetup.officeapps.live.com/c2r/downloadEdge.aspx?ProductreleaseID=Edge&amp;amp;platform=Default&amp;amp;version=Edge&amp;amp;source=EdgeStablePage&amp;amp;Channel=Stable&amp;amp;language=en&quot; -OutFile &quot;EdgeSetup.exe&quot;
# Dev
Invoke-WebRequest -Uri &quot;https://c2rsetup.officeapps.live.com/c2r/downloadEdge.aspx?ProductreleaseID=Edge&amp;amp;platform=Default&amp;amp;version=Edge&amp;amp;source=EdgeStablePage&amp;amp;Channel=Dev&amp;amp;language=en&quot; -OutFile &quot;EdgeSetup.exe&quot;
&lt;/pre&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/5671531035097243036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/5671531035097243036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/5671531035097243036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/5671531035097243036'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2020/02/donwload-new-chromium-based-edge-via.html' title='Download new chromium based edge via powershell'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-1199611028822825218</id><published>2019-11-11T18:53:00.001+02:00</published><updated>2019-11-11T18:55:26.674+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="Wordpress"/><title type='text'>Fixing an old Wordpress plugin to run on PHP 7</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
You should always update your CMS engine and individual plugins. Unfortunately this is not always possible especially when you have a non actively maintained website and you&#39;ve used commercial theme or plugins.&lt;br /&gt;
&lt;br /&gt;
In my case, I had to deal with an old Wordpress site which was updated but was still running on an older PHP version 5.6.40. Changing the PHP version&amp;nbsp;&amp;nbsp;on the server to 7.3, the site broke with a sneaky&amp;nbsp;&lt;i&gt;Call to undefined function mysql_error()&lt;/i&gt;&amp;nbsp;on the frontend and &lt;i&gt;[] operator not supported for strings&lt;/i&gt;&amp;nbsp;on the admin area. Both errors were caused from a plugin installed by the theme which doesn&#39;t support auto updates. More specifically Revslider 4.6.0 which looks like it was used by various themes in the past.&lt;br /&gt;
I had no other option but to try and fix them manually since I couldn&#39;t downgrade to older PHP version anymore nor invest more resource to change/update the theme and plugins.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;First I had to locate the files and lines causing the exceptions and then look suitable solutions. I was lucky and in my case both errors were easy to fix.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
The admin error, &lt;i&gt;[] operator not supported for strings in&amp;nbsp;/wp-content/plugins/revslider/inc_php/framework/base_admin.class.php:72,&lt;/i&gt;&amp;nbsp;was a syntax error using the short array push syntax when the variable was initialised as a string. Changing the initialisation fixed it.&lt;br /&gt;
&lt;br /&gt;
For the site error, &lt;i&gt;Call to undefined function mysql_error()&lt;/i&gt; in &lt;i&gt;/wp-content/plugins/revslider/inc_php/framework/db.class.php:29&lt;/i&gt;, I&#39;ve changed to the msql&lt;b&gt;i&lt;/b&gt; alternative of the function which requires the mysqli link argument. Thankfully it&#39;s available via the global wpdb class of Wordpress, already utilized on this file.&lt;br /&gt;
&lt;br /&gt;
You can see my changes on the following two diffs.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;script src=&quot;https://gist.github.com/cbotsikas/76f7cf26d5a68e5c2d536263b6481baf.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/1199611028822825218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/1199611028822825218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/1199611028822825218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/1199611028822825218'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2019/11/fixing-old-wordpress-plugin-to-run-on.html' title='Fixing an old Wordpress plugin to run on PHP 7'/><author><name>Christos Botsikas</name><uri>http://www.blogger.com/profile/11025565251556231416</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiTqiDC0YkBWXMF6Tm6v265uSq_kyJpD9DkVuowUBHq-4VhF5CdyzIA3gjBqkm9mzlUeHSgddsiYEMswaqSbrY-5LGwyeyCzWWgoHcTaZ_nZ5LH0fDoaCueTLtPMuKUA/s220/myAvatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-5314807583396650462</id><published>2018-04-05T00:37:00.002+03:00</published><updated>2018-04-05T00:37:55.031+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Exchange"/><category scheme="http://www.blogger.com/atom/ns#" term="mail"/><category scheme="http://www.blogger.com/atom/ns#" term="powershell"/><title type='text'>Exchange view DSN mail contents from queue</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
We had some DSN mails queueing up on our Exchange server&#39;s outgoing queue with error 450 4.7.1 and i was trying to figure out what were those mails in the first place. The &lt;i&gt;Subject&lt;/i&gt; in all those mails looked like spam and since the &lt;i&gt;From Address&lt;/i&gt; was empty, it got me kinda worried and curius at the same time. Using &lt;i&gt;Queue Viewer&lt;/i&gt; wasn&#39;t helpfull since I couldn&#39;t see the origin of the DSN message. I had to use &lt;i&gt;Exchange Management Shell&lt;/i&gt; to find out more info.&lt;br /&gt;
&lt;br /&gt;
In order to view the email contents so that you can check the body and find out more information about the cause/source of the DSN, you need to know the message &lt;i&gt;Identity&lt;/i&gt;, suspend the message&#39;s from processing and then export it.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVb11koHfmLXbAPYAl9tU4AmhpNoBEYy-Aj3eELhNMoeasNkF_YBokTbDxylua9mNWT9se1tDAq0qtuDSx8v6Ch2b49bQL8-JvgFwKtby3bvFLC1v0niej1UWu_h9SPwWSL0Lgra6pRIA/s1600/blog01.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;258&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVb11koHfmLXbAPYAl9tU4AmhpNoBEYy-Aj3eELhNMoeasNkF_YBokTbDxylua9mNWT9se1tDAq0qtuDSx8v6Ch2b49bQL8-JvgFwKtby3bvFLC1v0niej1UWu_h9SPwWSL0Lgra6pRIA/s400/blog01.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
You can either find the &lt;i&gt;Identity&lt;/i&gt; from the Queue Viewer or using PowerShell you can list all list your Message queue with one of the following commands:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Get-message | format-list&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Get-message | select Identity, MessageSourceName, Subject, LastError | where {$_.MessageSourceName -eq &quot;DSN&quot;}&lt;/blockquote&gt;
Once you have the Identity, you need to suspend the message:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Suspend-Message -Identity &lt;i&gt;&amp;lt;YourMessageIdentity&amp;gt;&lt;/i&gt;&lt;/blockquote&gt;
Export the message&amp;nbsp;using the command:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Export-Message -Identity&amp;nbsp;&lt;i&gt;&amp;lt;YourMessageIdentity&amp;gt;&lt;/i&gt;&amp;nbsp;| AssembleMessage -Path &quot;&lt;i&gt;&amp;lt;YourPath&amp;gt;\&amp;lt;Filename&amp;gt;.eml&lt;/i&gt;&quot;&lt;/blockquote&gt;
You can resume the message for further processing in your queue:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Resume-Message -Identity&amp;nbsp;&lt;i&gt;&amp;lt;YourMessageIdentity&amp;gt;&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd5TojwTHj2dtezXNH_P366e_QUE-eC53URx8FCs6V_H0pWCFl0ke-4j-wyT2Qva7e6o0ui32KTqN8DSJUyVUSR5BpLmnjaWHjayMNcQzYu0FmX0cV1LOeIIQ-YMWV5Z7Ojh-GNWaKijg/s1600/blog04.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;316&quot; data-original-width=&quot;1407&quot; height=&quot;88&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd5TojwTHj2dtezXNH_P366e_QUE-eC53URx8FCs6V_H0pWCFl0ke-4j-wyT2Qva7e6o0ui32KTqN8DSJUyVUSR5BpLmnjaWHjayMNcQzYu0FmX0cV1LOeIIQ-YMWV5Z7Ojh-GNWaKijg/s400/blog04.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Now I was able to open the mail contents with notepad and investigate further on the DSN cause. In our case, as I suspected, those were NDRs for non existing mail addresses, nothing to worry about.&lt;br /&gt;
&lt;br /&gt;
Further reading:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://technet.microsoft.com/en-us/library/aa998625(v=exchg.160).aspx&quot; target=&quot;_blank&quot;&gt;Export messages from queues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://technet.microsoft.com/en-us/library/aa997212%28v=exchg.80%29.aspx&quot; target=&quot;_blank&quot;&gt;How to View Messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/module/exchange/mail-flow/get-message?view=exchange-ps&quot; target=&quot;_blank&quot;&gt;Get-Message&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/module/exchange/mail-flow/Suspend-Message?view=exchange-ps&quot; target=&quot;_blank&quot;&gt;Suspend-Message&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/module/exchange/mail-flow/export-message?view=exchange-ps&quot; target=&quot;_blank&quot;&gt;Export-Message&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/module/exchange/mail-flow/Resume-Message?view=exchange-ps&quot; target=&quot;_blank&quot;&gt;Resume-Message&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/5314807583396650462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/5314807583396650462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/5314807583396650462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/5314807583396650462'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2018/04/exchange-view-dsn-mail-contents-from.html' title='Exchange view DSN mail contents from queue'/><author><name>Christos Botsikas</name><uri>http://www.blogger.com/profile/11025565251556231416</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiTqiDC0YkBWXMF6Tm6v265uSq_kyJpD9DkVuowUBHq-4VhF5CdyzIA3gjBqkm9mzlUeHSgddsiYEMswaqSbrY-5LGwyeyCzWWgoHcTaZ_nZ5LH0fDoaCueTLtPMuKUA/s220/myAvatar.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVb11koHfmLXbAPYAl9tU4AmhpNoBEYy-Aj3eELhNMoeasNkF_YBokTbDxylua9mNWT9se1tDAq0qtuDSx8v6Ch2b49bQL8-JvgFwKtby3bvFLC1v0niej1UWu_h9SPwWSL0Lgra6pRIA/s72-c/blog01.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-5164347757574044345</id><published>2017-07-25T15:39:00.000+03:00</published><updated>2017-07-25T15:41:52.557+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dnn"/><category scheme="http://www.blogger.com/atom/ns#" term="dotnetnuke"/><category scheme="http://www.blogger.com/atom/ns#" term="IIS"/><category scheme="http://www.blogger.com/atom/ns#" term="Sql server"/><title type='text'>DNN site&#39;s search issue with index outside bounds of array</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
I had an issue with a&amp;nbsp;DotNetNuke 7.4 site&#39;s DB size. It had grown way too big and we found out about it because of the server&#39;s warnings about low disk..&lt;/div&gt;
&lt;div&gt;
Both Exceptions and EventLog tables had three new logs (General Exception, Scheduler Event Failure, Scheduler Exception) every 30 seconds saying that the &quot;Index was outside the bounds of the array.&quot;&lt;/div&gt;
&lt;div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;It was obvious&amp;nbsp;that there was an issue with the site&#39;s search indexing. Search functionality wasn&#39;t working either. Re-indexing the content or restarting the application pool didn&#39;t help.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In order to fix this issue i had to do the following:&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Stop site&#39;s application pool from IIS.&lt;/li&gt;
&lt;li&gt;Delete all contents in &amp;lt;path_to_your_DNN&amp;gt;\App_Data\Search\ folder.&lt;/li&gt;
&lt;li&gt;Start site&#39;s application pool.&lt;/li&gt;
&lt;li&gt;Re-index content from the site&#39;s Admin -&amp;gt; Search Admin page.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Hopefully this will help someone else too.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
For the record, the Stack Trace was t&lt;block&gt;he following:&lt;/block&gt;&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Index.SegmentTermDocs.ReadNoTf(Int32[] docs, Int32[] freqs, Int32 length)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Search.TermScorer.NextDoc()&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Search.ConjunctionScorer..ctor(Similarity similarity, Scorer[] scorers)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Search.BooleanScorer2.AnonymousClassConjunctionScorer..ctor(Int32 requiredNrMatchers, BooleanScorer2 enclosingInstance, Similarity defaultSimilarity, IList`1 requiredScorers)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Search.BooleanScorer2.MakeCountingSumScorerSomeReq()&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Search.BooleanScorer2..ctor(Similarity similarity, Int32 minNrShouldMatch, List`1 required, List`1 prohibited, List`1 optional)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Search.BooleanQuery.BooleanWeight.Scorer(IndexReader reader, Boolean scoreDocsInOrder, Boolean topScorer)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Index.DocumentsWriter.ApplyDeletes(IndexReader reader, Int32 docIDStart)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Index.DocumentsWriter.ApplyDeletes(SegmentInfos infos)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Index.IndexWriter.ApplyDeletes()&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Index.IndexWriter.DoFlushInternal(Boolean flushDocStores, Boolean flushDeletes)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Index.IndexWriter.DoFlush(Boolean flushDocStores, Boolean flushDeletes)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Index.IndexWriter.PrepareCommit(IDictionary`2 commitUserData)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at Lucene.Net.Index.IndexWriter.Commit(IDictionary`2 commitUserData)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at DotNetNuke.Services.Search.Internals.LuceneControllerImpl.Commit()&lt;br /&gt;
&amp;nbsp; &amp;nbsp;at DotNetNuke.Services.Search.SearchEngineScheduler.DoWork()&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/5164347757574044345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/5164347757574044345' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/5164347757574044345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/5164347757574044345'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2017/07/dnn-sites-search-issue-with-index.html' title='DNN site&#39;s search issue with index outside bounds of array'/><author><name>Christos Botsikas</name><uri>http://www.blogger.com/profile/11025565251556231416</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiTqiDC0YkBWXMF6Tm6v265uSq_kyJpD9DkVuowUBHq-4VhF5CdyzIA3gjBqkm9mzlUeHSgddsiYEMswaqSbrY-5LGwyeyCzWWgoHcTaZ_nZ5LH0fDoaCueTLtPMuKUA/s220/myAvatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-1254337403246650661</id><published>2016-02-13T13:33:00.000+02:00</published><updated>2016-02-13T13:35:56.063+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="LDF"/><category scheme="http://www.blogger.com/atom/ns#" term="Recovery"/><category scheme="http://www.blogger.com/atom/ns#" term="Sql server"/><title type='text'>Recover records after accidental cascade delete</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Cascade delete in an sql table relation may sometime lead to serious data losses. Should this occur, you can make use of the log file (LDF) to review the DELETE statements that took place and hopefully manage to recover your lost data.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;When you realize that an accidental delete has occurred, stop using the database. If you can, stop the sql server instance  and copy the mdf and ldf files of the affected database. In my case, I was called a couple hours later on but no harm was done as there was no backup process and the ldf file was intact.&lt;br /&gt;
You will need to parse the ldf entries to detect the deleted entries. I &lt;a href=&quot;http://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/&quot;&gt;found a blog post&lt;/a&gt; which offers a stored procedure to do that, but unfortunately this didn&#39;t work for me as I was getting an error on the compatibility level (which was wrong). This is why I ended up using &lt;a href=&quot;http://www.systoolsgroup.com/sql-log-analyzer.html&quot;&gt;SysTools SQL Log Analyzer&lt;/a&gt; which as a demo can show you the log file entries. If you want to export the entries, you will have to buy the product.&lt;br /&gt;
This tool works with offline files. This is why I mentioned above to copy the mdf and ldf files. It reads the log and shows the INSERT,UPDATE and DELETE statements on each and every table you have. The beauty of this tool is that is also show the deleted row.&lt;br /&gt;
When the analysis of the ldf file finished, I selected all entries in the tree on the left and selected export. Then I used the &quot;Sql server database&quot; option and exported the deleted only rows to a new database which was created by the tool. Note that I also specified a data filter in order to minimize the number of data.&lt;br /&gt;
After a couple of hours (depending on the size of lost data) you will end up with a new database that has similar tables to the original one and each table will contain the deleted row.&lt;br /&gt;
After that, head to &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/ms186335(v=sql.120).aspx&quot;&gt;the bulk insert msdn article&lt;/a&gt; that mentions how to export and import the data using the bcp command. The process is fairly simple as you have to issue the following commands for each recovered table in the newly created RecoveredDatabase:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;bcp RecoveredDatabase.dbo.MyTable out MyTable-n.Dat -n -T
bcp RecoveredDatabase.dbo.MyTable format nul -n -x -f MyTable-f-n-x.Xml -T&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
This can be easily scripted into a bat file using Excel. You just have to copy the table names from the &quot;Object Explorer Details&quot; window while having selected the Tables folder in the &quot;Object Explorer&quot; of the Sql server management studio. Then do some string manipulation and you will be able to get the complete list of commands in no time.&lt;br /&gt;
Having exported your data, you will want to bulk insert them using the identity insert option described in the msdn article above. To do that, you will have to copy the exported files in C:\RecoveredData\ folder on the machine where you have the original database attached (hopefully you have already started the instance if you did close it down as I mentioned above) and then you will have to issue the following command for each exported table:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;bcp OriginalDatabase.dbo.MyTable in C:\RecoveredData\MyTable-n.Dat -f C:\RecoveredData\MyTable-f-n-x.Xml -E -T&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Using the same excel file mentioned above, ordering the tables in a way that parent tables get to be inserted first and then the dependent child tables, you will be able to generate the complete list of bcp insert commands.&lt;br /&gt;
Hopefully you are as lucky as my friend was and you will be able to restore all your records and then have some time to reflect on your backup policy and perhaps whether you do need the Cascade delete that caused all this.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/1254337403246650661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/1254337403246650661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/1254337403246650661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/1254337403246650661'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2016/02/recover-records-after-accidental.html' title='Recover records after accidental cascade delete'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7761120478392541874.post-9091633488647785489</id><published>2015-10-17T11:49:00.001+03:00</published><updated>2015-10-17T12:15:32.841+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Azure"/><category scheme="http://www.blogger.com/atom/ns#" term="Storage"/><title type='text'>Move Azure blobs between containers</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I finally got some time to tidy up my Azure account. The first thing I wanted to do was to bring all my vms in a single storage, gathering them from various subscriptions. In order to do that I had to copy the vhds (located in the vhds container of each storage account) to their final destination.
&lt;/div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
This is how I ended up creating the following simple program. It schedules the transfer of the blob and then monitors the status of the blobs in order to get an indication of when the process is done.&lt;br /&gt;
If you are more into powershell, you can follow &lt;a href=&quot;https://azure.microsoft.com/en-us/blog/migrate-azure-virtual-machines-between-storage-accounts/&quot;&gt;this&lt;/a&gt; tutorial which also mentions how to mark the moved vhd as a VM image (Virtual Machines-&gt;Disks-&gt;Create).
&lt;script src=&quot;https://gist.github.com/andreasbotsikas/a0500aa976896d070469.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://botsikas.blogspot.com/feeds/9091633488647785489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7761120478392541874/9091633488647785489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/9091633488647785489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7761120478392541874/posts/default/9091633488647785489'/><link rel='alternate' type='text/html' href='http://botsikas.blogspot.com/2015/10/move-azure-blobs-between-containers.html' title='Move Azure blobs between containers'/><author><name>Andreas Botsikas</name><uri>http://www.blogger.com/profile/01752587180565072980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTAr9WKwkogwc5t-UAw8iQbio_o5rwN4eHbBF0fNV1WL4kJYP22rHHhgcuVsBQaXkuJxRieuoYNkP1L4KSjXYrtNZ4KMfyd_9lQdcDIGXA8MwOPizYLtqLJ6RW9nK-vA/s220/Abot.jpg'/></author><thr:total>0</thr:total></entry></feed>