Jekyll2026-02-11T11:58:19+00:00https://tseknet.com/feed.xmlDan TsekhanskiySRE from a Windows guyDan Tsekhanskiy[email protected]Can you use a UniFi Camera as a Baby Monitor?2025-10-05T00:00:00+00:002025-10-06T11:00:51+00:00https://tseknet.com/blog/baby-monitorOur nursery, with the baby monitor seen at the top middle.

To my surprise, I didn’t see much information online about using a UniFi camera as a baby monitor when prepping the nursery for our first child. Maybe because the “Baby Crying” alert was new at the time, or maybe using a UniFi camera for as a baby monitor was just a bad idea. I set to figure that out for myself with some unnecessarily strict requirements:

  1. No subscription
  2. Recordings not stored on the Cloud
  3. Hardwired (no Wi-Fi)
  4. Can be moved to other rooms
  5. Remotely accessible
  6. Crying baby alerts

…and wouldn’t it be cool if I could use my existing homelab setup?

What I already had

  1. A UniFi Dream Machine Pro Max, which I use as my router AND camera recording storage, sitting in my server rack. It comes with two hard drive slots, and I already purchased enough storage for months of camera footage from the various cameras in and around my house. I bought this before UniFi came out with their dedicated Network Video Recorder, and I don’t regret it. I needed a router, did my research, and landed on a UniFi router anyway. Two birds, one stone.
  2. Multiple ethernet ports in each room (maybe a story for a future blog post) which are eventually connected to a UniFi switch that is PoE-capable (Power over Ethernet).
  3. Smart phones and multiple smart tablets.

The Solution

A UniFi G5 Flex camera, on a camera stand, powered via PoE.

crib_day_view The camera’s view

I wasn’t originally going to go with a UniFi camera, but I noticed that UniFi’s Alert manager had a new option for “Baby Crying.” This gave me the idea of at least trying a UniFi camera, but which one? Well, the UniFi G5 Flex seemed to be the one most recommended for its “enhanced” AI detection capabilities (even compared to the G4 Flex). I didn’t need an outdoor camera, or any of the other more expensive features. I bought the G5 Flex and tried out how well it could detect a crying baby and how the alerts would work.

Technically, since I bought this camera before our kid was born, I set up the camera with the “Baby Crying” alert next to a phone playing a baby crying noise 🙃. And to my surprise (based on other user reviews), it worked reliably.

I looked around online and landed on this floor stand for the baby monitor. I opted not to mount the camera to the wall or ceiling as I may want to move around the nursery configuration in the future, and I like the flexibility of being able to move the baby monitor to an entirely different room. I just need to plug it into a wall jack that has PoE in any room of my house and we have a functional baby monitor.

Finally, I used an old Android tablet Samsung Galaxy Tab A9+ 11 on which I installed the UniFi Protect app and have that on a bedside table as a baby monitor overnight. Some drawbacks:

  • Missing common baby monitor features like CO2 detection, breathing monitor, etc.
  • This tablet is quite bright at night, even on its lowest brightness setting
  • The tablet’s live view has cut out a few times overnight due to Android updates or the UniFi app updating

What it cost me

Breakdown of how much this cost (not including things I already had):

$161 to get a solution that fits all of my requirements:

  1. No subscription
  2. Recordings are stored locally on my UniFi NVR for months
  3. Ethernet handles power and data, no Wi-Fi involved (PoE)
  4. Camera can be moved to other rooms
  5. UniFi Protect can be accessed remotely, even outside your internal network
  6. Crying baby alerts fire reliably through UniFi Protect (although we can hear kiddo even without a mobile alert). This works across multiple devices simultaneously, which is useful for when someone else is babysitting.
    baby alert

…and I get to view the baby monitor where I already view all my other security cameras, no additional storage required.

Overengineering

Using a UniFi camera as a baby monitor would, by most, be considered an overengineered solution to a problem that’s already been solved by many cheaper, simpler solutions. But those solutions didn’t meet my requirements (above). See a few examples below, taken from the best sellers list on Amazon as of writing this post. I’ve included references to my requirements, numbered next to each item.

  1. HelloBaby HB6550: Not remotely accessible (5), can only be viewed on the included screen (6)
  2. Kasa EC70: Subscription (1), Cloud Storage (2), Wi-Fi (3)
  3. Tapo C100: Subscription (1), Cloud Storage (2), Wi-Fi (3)
  4. VTech VM819: Not remotely accessible (5), can only be viewed on the included screen (6)
  5. Tapo C210P21: Subscription (1), Cloud Storage (2), Wi-Fi (3)

Parting Thoughts

When I asked my wife if she liked this setup, she said “yeah.”

My favorite part about this setup is that I can continue to use the camera, tablet, etc. even after we no longer need a baby monitor. These are not single purpose devices, and I’m sure we’ll find a use for them beyond this phase of our lives.

Good luck out there, or as kiddo would say “AAH OOH AAH” 👶.

  1. Full disclosure, I did end up getting option 5, the Tapo C210P2, for $20 for travel with the kiddo, since I don’t have my homelab with me when I travel. Paired it with an existing SD card I had from my Nintendo Switch 1 (…since the Switch 2 requires microSD express) for local storage and an adjustable arm clamp to go with it. ↩︎

]]>
Dan Tsekhanskiy[email protected]
How to Ditch Google Photos2025-01-23T00:00:00+00:002025-01-23T12:42:05+00:00https://tseknet.com/blog/google-photos
  • 1. Export
  • 2. Download the Export
  • 3. Automatic Organization
  • 4. (Optional) Manual Organization
  • Parting Thoughts
  • Related Links
  • Ever wanted to migrate from Google Photos to other apps but found the task too daunting? Well, this post describes how I migrated Google Photos to Synology Photos, taking back ownership of my photos. It took a few hours (mostly spent downloading/moving files). The same process can be used to move from Google Photos to any other solution (examples include Immich, NextCloud, ownCloud, etc.).

    Enter GooglePhotosTakeoutHelper 📸

    1. Export

    The first thing to do is export your files from Google Photos. This should be done a few days before you’re ready to migrate your photos to your new photo storage solution. Follow the steps below:

    1. Navigate to https://takeout.google.com/
    2. Click Deselect All
    3. Scroll down to Google Photos and tick the associated checkbox
    4. Scroll down to the bottom and click Next Step
    5. Under Choose file type, frequency & destination:
      • Transfer to can be set to whatever you prefer. I chose Add to Drive (it will upload files to your Google Drive).
      • Select export once
      • Leave file type as zip
      • File size should be set to 50GB
    6. Click Create Export

    That’s it for now! You should receive an email notifying you when your export is ready.

    2. Download the Export

    Once you receive the email that your Google Photos export is ready, go ahead and download the exported .zip archives to somewhere that has enough storage space. To prep your photos for organization (below), extract each individual takeout-DATE-###.zip into a /takeout directory somewhere on your disk.

    Folder structure should look like this:

    ../takeout
    ├─ takeout-20200112T193857Z-001
    ├─ takeout-20200112T193857Z-002
    ├─ takeout-20200112T193857Z-003
    └─ takeout-20200112T193857Z-004
    
    ...etc
    

    3. Automatic Organization

    Start by taking a step back and deciding where you want your photos to live, and if you want any other application to manage your photos (ex: Synology Photos, Immich, etc.). These applications may require that photos are placed in specific directories, so make sure to set these up before continuing. This could technically be anywhere you want, but I’d recommend storing your photos on your storage server (NAS).

    Next up is making sense of the export that Google Takeout provided you. To do this, we’ll use an open-sourced tool called GooglePhotosTakeoutHelper on GitHub following the steps below.:

    1. Download the latest binary from their releases page on GitHub (either Linux, Mac, or Windows)
    2. Launch the downloaded binary as admin (this is different depending on the platform you downloaded)
    3. Hit the enter key when the binary prompts you to select the source directory
      • You should see a pop-up file explorer view, select the /takeout directory from earlier
    4. Go back to the command prompt where the binary is running, and hit the enter key again to select the destination directory
      • You should see a pop-up file explorer view, select your destination directory (can be your storage server)
    5. Let GooglePhotosTakeoutHelper do it’s magic
    6. (OPTIONAL) Organize the resulting /ALL_PHOTOS output folder in the destination directory

    4. (Optional) Manual Organization

    There will almost definitely be photos for which GooglePhotosTakeoutHelper could not identify the date/time. If you’re using Synology Photos, you can click the information (i) icon that shows up when you click a photo and edit the date metadata directly. If you’re using something else, you can try the Files app to edit the photo metadata manually.

    This will be the most annoying, toilsome part of the entire process, depending on how many of your photos were missing the date metadata to start.

    Parting Thoughts

    The motivation for this project was to avoid paying monthly fees to store photos (Google/Microsoft/Amazon/etc.) when I already have a storage server that I’m actively using. Owning where your photos are stored has other auxiliary benefits such as privacy, control, no one can deprecate your data, etc.

    Had issues running through this process? Let me know.

    Go forth and data hoard 💾

    ]]>
    Dan Tsekhanskiy[email protected]
    Plex Downloads Still Suck2024-01-15T00:00:00+00:002024-05-19T19:05:19+00:00https://tseknet.com/blog/plex-downloads
  • The Problem
  • Attempted Solutions
  • Actual Solution
  • Ramblings
  • Related Links
  • Shouldn't Be Hard

    The Problem

    I want to download my movies from my Network-Attached Storage (NAS) server onto my phone.

    Sounds simple, right?

    Attempted Solutions

    I’ll start with a list of solutions that did NOT work for me (and why) so you don’t waste your time, in order of when I tried them, then describe the solution I’ve landed on. I’ll add to this list as I inevitably try other solutions in the future.

    1. Plex Downloads

    Plex downloads used to work great for me, before they “revamped” Sync into Downloads. Ever since this revamp for mobile downloads, I have not been able to reliably download media to my phone using the Plex app on either Android or iOS. I’ve tried multiple disparate media servers, Operating Systems, and different network configurations/locations/VPNs. Most of the time downloads wouldn’t work at all. Sometime in the past month (Jan ‘24) it looks like Plex has made some attempts at revamping their new downloads feature again. This initially looked promising, as at least some of my downloads were succeeding. But… now any file over ~2GB fails to download across devices and different media servers (similar to before, but smaller files work fine now).

    I’ve looked into media server logs, and countless Plex forum/Reddit threads describing the same woes about the revamped Plex downloads feature that I’ve described above. No suggestions in those threads fixed my download issues.

    I will give Plex some credit and say their UX for downloading multiple media files at once (for example: an entire season of a TV show) is actually good. It just doesn’t work for larger files.

    I decided to stop investing time into Plex downloads and moved on.

    Plex technically has a feature that allows you to download the raw file (reliably!) from your media server if you are the server owner. This feature isn’t available in the app, and you have to click each individual item you want to download, click the three dots menu, and then click “Save As.” Doing this on the Plex website for every item I wanted to download wasn’t scalable for things like entire TV shows.

    2. Jellyfin Downloads

    Jellyfin is an open-source alternative to Plex, with support for downloading media from your media server via their open-source Android app. There’s an alternative Jellyfin Android app (with the same issues) called Findroid that’s beautiful, and I would recommend it over the default Jellyfin mobile app on Android. Now on to the issues:

    1. Jellyfin doesn’t have download support for iOS on any of its mobile clients. There is support through the Infuse iOS app, but that requires a paid subscription ($9.99/year). I would prefer to not pay to download my media on my phone.
    2. Jellyfin downloads seem to be the slowest of all the options I’ve tried. For example, multiple different ~30GB movies quoted me 12 hours+ for download over WiFi. That’s definitely not limited by the speed of my network.
    3. Jellyfin does not have support for downloading entire seasons of shows at once. You need to go into each individual episode, wait for the episode info to load, then hit download. Looks like the Findroid team is working on adding this functionality on GitHub.
    4. Opinion: Jellyfin’s UI is worse than Plex’s. This is somewhat curbed by how beautiful the Findroid app is on mobile, but Findroid doesn’t have an app for desktop/the various Smart TVs that I use to watch home media.

    3. Synology Drive

    I briefly considered using Synology Drive on my NAS to expose my media over the internet essentially as you would in Google Drive (but self-hosted). After being quoted about a day for indexing all of my media on the share that I added to Synology Drive, I canceled the indexing job and scrapped this idea. This isn’t my intended use of Synology Drive anyway (it’s more of a Google Drive replacement for me).

    4. VLC

    The same VLC that’s been around since 2001. I briefly played with using VLC to download files from my NAS over SMB (see below) to a local folder on my Android/iOS devices. VLC surprisingly does not have this feature (at least on Android). The closest I could find is this thread from 2016 saying that the feature would be added.

    I briefly looked for other Android video players that could be used to copy files over SMB/FTP/etc., but didn’t find one I liked that had the functionality I was looking for.

    5. Other Android Video Players

    I tried other Android video player apps such as Next Player, MX Player (paid), Stock Android/Samsung video players, mpv, etc. None of them had the functionality of downloading files from SMB to a local directory that I was looking for.

    Actual Solution

    ✨ SMB ✨

    That’s right, the good ol’ reliable SMB (Server Message Block) protocol. No really, just an SMB share on my NAS that allows me to copy/paste files from my NAS to my phone. I mount an SMB share (that I already have available for my internal Windows devices) and copy files to wherever I want on whichever devices I want. No dealing with proprietary download functionality (Plex), unpolished/missing download functionality (Jellyfin), additional overhead for indexing files (Synology Drive), etc. My files, when I want them, without any bells and whistles.

    Cool, so SMB from Android/iOS devices… Now to decide which app is best for copying files from an SMB share to these devices. I played around with a few Android apps before landing on Material Files. This app is basic, beautiful, and allows me to copy files from my NAS SMB share directly to my Android device. Copy, paste, simple.

    For iOS the built-in “Files” app has a “Connect to Server…” option that can be used to connect to a SMB share using the format smb://hostname/folder. From there, you can browse to the media file and copy/paste as your heart desires.

    Ramblings

    I’m convinced that the people writing these media management tools don’t consider downloading a core feature, and don’t have much use for it themselves, based on the frustrations I’ve mentioned in this post. I however still have to give credit to the Jellyfin team for all the good work they do, Jellyfin is a great tool.

    I’ll note that SMB isn’t even my preferred option. Browsing folders instead of the Plex or Jellyfin UI makes them less discoverable for me, as the metadata isn’t as visible (actors, dates, posters, etc.). What SMB does offer however is protection from changes breaking my file downloading, and removing download speed bottlenecks. I would recommend always accessing SMB over a home network VPN, as even SMB has been known to have its share of vulnerabilities and bugs. I’m happy with the solution for now, but who knows, maybe Plex will fix their downloads in the future and I’ll try it again at some point.

    Have better ideas for how to download media to mobile devices? Think I missed something? Have Questions? Comment below.

    Good luck out there 👍

    ]]>
    Dan Tsekhanskiy[email protected]
    How to Automatically Download the Latest Windows Device Drivers2022-10-23T00:00:00+00:002024-01-15T16:32:54+00:00https://tseknet.com/blog/modeldrivers
  • The Problem
  • The Solution
  • Parting Words
  • Related Links
  • Imagine never needing to worry about drivers during Windows Operating System deployment ever again.

    No need to manually download drivers. No need to maintain driver folders on your deployment shares. No need to update drivers whenever something breaks…

    The Problem

    Every Windows deployment environment seems to manage OS drivers differently. Whether it’s dumping every driver into a single folder in your deployment share, one driver folder per OS, or one driver folder per model, these all require manual maintenance of your deployment share. What if there was a way to automatically, reproducibly, and consistently download OS drivers at deployment time…?

    The Solution

    Scrape manufacturer websites using RegEx for direct driver download URLs. RegEx works well for this but…

    Perl Problems

    With that out of the way, I’ll start by sharing the entire script, then describing it in more detail below. I’m always open to suggestions, so feel free to open a pull request or comment below!

    The ideal solution is automated and doesn’t require updating when new OS drivers are released. Let’s get into how the sauce is made:

    What it does

    Refer to the code above for the most up-to-date information.

    I wrote this script to simplify deploying drivers in my environment. What began as an idea to use RegEx to scrape driver URLs quickly turned into a fully automated solution (thanks Powershell!). This script is slightly modified for GitHub to include all the steps necessary to download, install, and deploy OS drivers.

    Automating driver downloads from manufacturers is no discovery. As far as I can tell, manufacturers have been publishing discoverable web endpoints (of varying usefulness…) for driver downloads for over a decade now. Recently, I’ve seen these endpoints improve to the point that this script is now possible. What I haven’t seen is a single script that does everything from scraping the endpoint, to downloading, to installing, without the need to jump through intermediary cab files. What this solution provides is simplicity. No need to worry about OS drivers beyond specifying the manufacturer and model.

    The scripted solution can be run directly from your system being deployed in WinPE or WinRE. The Manufacturer parameter tells the script which website to query for drivers. The Model parameter tells the script to query the manufacturer’s website for the exact string of your query and find the associated driver download link.

    Once the download link for the driver pack is obtained, the script downloads the file to the local $env:TEMP directory and leverages pnpunattend.exe to install all drivers in that directory. Finally, the script cleans up files placed in $env:TEMP and exits.

    What it doesn’t do

    Install WinPE drivers (only OS drivers).

    Parting Words

    This is where I acknowledge that downloading drivers from the manufacturer’s website during deployment may increase deployment times (vs. downloading from an internal endpoint). This is a worthwhile trade-off for the time saved from managing individual driver packs in deployment shares. While this script applies OS drivers before booting into the OS during deployment, I would also recommend running Windows Updates once booted into the OS for the first time.

    This script also assumes that manufacturers test their drivers before deployment (not always the case), and that the “latest” OS version drivers will work on your systems. You’ll have to discuss if this added automation is a worthwhile trade-off with your team. Heck, feel free to fork this script entirely to add resiliency, or submit PRs to improve the script itself.

    Hopefully, this script saves you some time that could be better used on automation, rather than fumbling with OS driver deployment 💻🔂⏩

    ]]>
    Dan Tsekhanskiy[email protected]
    Blog Posts Made Easy With Jekyll and GitHub Codespaces2022-06-10T00:00:00+00:002022-06-10T11:59:40+00:00https://tseknet.com/blog/jekyll-codespaces
  • GitHub Codespaces
  • Jekyll Run Extension
  • Iteration
  • Always Improving
  • Related Links
  • Local web development is so 2020.

    The world has changed a lot since my first blog post about… well… how I made this blog. Naturally, my process for authoring new posts has improved since then. All you’ll need to get started is a Visual Studio Codespace and a single Visual Studio Code extension. Let’s dive right in and show you how the sauce is made.

    GitHub Codespaces

    A codespace is your development environment that’s hosted on a GitHub VM, available everywhere, for free.

    If you haven’t yet, start by navigating to the GitHub Codespaces (quick start) quick start guide and open up your repository (via the Code dropdown on the GitHub repo).

    Jekyll Run Extension

    The Jekyll Run VS Code extension allows you to Build & Run Jekyll sites.

    To get started with Jekyll Run:

    1. Navigate to the extensions tab (ctrl+shift+x) in the VS Code side panel, search for and install “Jekyll Run”
    2. (Optional) Enable Incremental Jekyll builds (only update files that have changed) in your VS Code settings by adding the following to your VS Code settings.json:
      "jekyll-run.commandLineArguments": "--incremental",
      
    3. Open your VS Code Command Palette (ctrl/cmd+shift+p)
    4. Type Jekyll Run, and hit enter (or press ctrl+F5)

    If you haven’t yet installed the required bundles, you’ll see the following error:

    Bundle Install

    Click Run bundle install to install the required bundles.

    Iteration

    Simple Browser

    To make previewing changes to my website easy (and all in one window), I leverage the built-in VS Code extension called Simple Browser. By default, when you run the Jekyll Run command, a new browser window will open directly to your in-progress blog post. To open this link in VS Code, side-by-side with your Markdown code:

    1. Copy the link from the newly opened website window (should end with .githubpreview.dev)
    2. Open your VS Code Command Palette (ctrl/cmd+shift+p)
    3. Type Simple Browser and hit enter
    4. Paste the copied link into this newly opened VS Code tab

    That’s it! Now your entire blogging workflow is within VS Code, no alt-tabbing or second monitor required.

    Unfortunately, the --livereload flag added in Jekyll 3.7 does not work on Codespaces, meaning you’ll need to refresh manually to see live changes.

    Always Improving

    This is by no means the end state for my blogging setup, but rather a method for me to unify on Codespaces for all my GitHub development. Know of a way I can improve this setup? Feel free to leave a comment below.

    Hopefully, this post makes your blogging workflows just a little bit easier 🚀

    ]]>
    Dan Tsekhanskiy[email protected]
    10 Things I Wish I Knew Before Moving to London2021-12-28T00:00:00+00:002021-12-28T21:40:38+00:00https://tseknet.com/blog/nyc2lon
  • 1. Finding a Place to Live
  • 2. Exploring
  • 3. Recursive Issues
  • 4. Proving Yourself
  • 5. Making Friends
  • 6. Getting Around
  • 7. Contactless Payments
  • 8. Air Bud
  • 9. Dog Parks
  • 10. London Weather
  • In Summary
  • References
  • What’s this? A non-technical post?

    In a brief departure from the technical nature of this blog, I thought I’d take a shot on blogging about a personal life update – I’ve moved to London from NYC.

    For your amusement, here’s a list of the top things that frustrated me about my move from NYC to London. This post aim’s to help folks moving abroad avoid the same pitfalls, especially while trying to navigate COVID-19 restrictions. Or you know, just provide an entertaining, quick read for the rest of you. I’ll note that this list was created while I was pretty frustrated with the entire experience, so… enjoy!

    Disclaimers:

    1. I was not forced to move.
    2. I consider having the option to move (financially, logistically, etc.) a privilege.
    3. I have never lived abroad for more than a few weeks. A lot of these items will seem silly to seasoned expats.
    4. Many of these items are specific to moving during a pandemic. Your mileage may vary (YMMV).

    With that out of the way, let me vent for a minute… 😤

    1. Finding a Place to Live

    The London letting market is more competitive than anything I’ve seen in NYC.

    Examples:

    • On the same day a flat was listed, the agent sent out an email requesting sight unseen offers. This is after I’d already been flat hunting for a couple of weeks, so I was pretty desperate. I put in an offer (well above asking, for a place sight unseen) and was still denied.
    • For the second time in a week, on the way to view a flat, the agent called me to tell me that the place had been already let. This was for a flat posted the day before.

    Now, I know how competitive the renting market in NYC can be; this was levels above. COVID-19 compounded these issues. With everyone moving back to London post (third) lockdown, and the summer stock of flats being eaten up, the supply of flats simply could not keep up with demand.

    2. Exploring

    An unintended consequence of having such difficulty finding housing was that I was forced to explore all over London.

    I’d go so far as to say I’d recommend shopping around different flats in different boroughs as a way to get used to any new city. I got relatively familiar with the different neighborhoods and where I would (ideally) like to live. This also got me comfortable with getting around London, to the point where I don’t need directions to/from major tube stops.

    3. Recursive Issues

    Establishing identity in a new country requires existing identity.

    These are things that I expected to have issues with. Some examples of recursive issues:

    • To get a mobile phone plan, you need (an existing) UK phone number and a bank account. They use this phone number to contact you about your phone plan.
      • You also need a UK phone number for a bunch of other things (UK NHS, internet, etc.)
    • To let a flat, agents want to you have letting history in the UK.

    A local friend can help you get started with a mobile plan, and I ended up needing to shop around to agents that didn’t mind my non-existent local letting history.

    4. Proving Yourself

    Guilty until proven innocent.

    At no fault of the lovely phone operators that I spoke with, having to prove that I am who I say I am was quite difficult.

    Given that I did not yet have a local identification card in the UK when I arrived (due to post office delays), I had no way to open accounts. I had to spend countless hours on the phone, trying to even understand the requirements to open things like a bank account. Phone operators were not necessarily trained in assisting cases such as mine, and most seemed confused when discussing alternate methods for proving my identity. I should clarify that I’ve had no issues opening accounts elsewhere.

    5. Making Friends

    Londoners are friendlier than you think.

    From previous trips here, and based on what I’ve heard from friends, I assumed that I would be treated differently being from the US. The reality is that everyone has been very welcoming. London is a big city. There are people from all over, and I’ve seen nothing but warmth so far.

    Meetup.com and/or reddit.com are both great tools for meeting people in new cities. Prior to COVID-19 and the restrictions that have come with the current state of the world, I’d use these nearly everywhere I was traveling. At the very least, you’re guaranteed to meet an open group of people. At most, you’ll make long-term friends, as I have from these events.

    6. Getting Around

    The London tube is far better than NYC’s trains.

    • First of all, everything is contactless (more below). NYC is catching up here, but London has this well established.
    • The London tube is much cleaner than your average NYC subway.
    • I have yet to wait for a train more than three minutes here. Compare that to waiting for 20+ minutes in NYC’s sauna stations. The tube seems to be liked far more here. That said, there are always things to complain about.
    • Expect to pay much more to ride the tube here compared to NYC. This improved service comes at a cost. Also expect to pay by distance rather than a flat rate per ride.

    7. Contactless Payments

    You just need your phone.

    Contactless payments in London are similar to NYC, but what feels like years ahead in adoption. You can pay for all of the same things that you’d expect in NYC, but you can leave that backup card at home. Do yourself a favor, leave your entire wallet behind. Even the NHS COVID pass is on your phone (compared to the physical card required in the US).

    8. Air Bud

    Pet travel is awful.

    My pup Eevee for context.

    Every airline that has an approved route from NYC to London no longer allows pets over ~20 pounds on the plane. Not under your seat, not booking a separate ticket, not emotional support animals, and not in standard cargo. Speaking to several airlines, they quote that this is because of reduced staffing caused by the COVID-19 pandemic. I spent over 80 hours creating spreadsheets, contacting every airline, trying to understand rapidly changing policies, just to conclude the above.

    This left me with the only option: shipping Eevee via pet cargo on a separate flight. This meant booking an export agent from NYC, an import agent in London, and paying thousands (!!) of dollars to coordinate this all. I shopped around multiple different options, and thousands of dollars is indeed the cheapest you can do this for. Even after booking multiple agents to handle this for us, as you cannot do this yourself per airline policy, this will require meticulously timed vet appointments and dozens of emails and calls to coordinate.

    9. Dog Parks

    There are far fewer dog parks in London.

    In my experience, most folks here take advantage of the lax off-leash laws in the plethora of regular parks. Given that Shiba Inu’s are notoriously bad off-leash, this was an issue.

    After months of consistent training (and pockets full of treats), my pup now enjoys long (off-leash) runs in the nearby parks and I can sleep easy knowing she will always run back. She’s thriving.

    10. London Weather

    The sun does come out… tomorrow.

    There are sunny days in London, many more than expected. That’s not to say that most days will be sunny. Most will indeed be partially rainy and grey. If you’re someone that can’t survive in this kind of climate, just keep that in mind. The upside is that it doesn’t get as cold as NYC on average, so the wind hurts your face much less.

    In Summary

    London has been a great experience so far.

    I’ve mentioned several not-so-great things that I’ve noticed as part of this move, but most hindrances are now dealt with. I now get to sit back and enjoy this beautiful city. I’d highly recommend at least visiting if you ever have a chance.

    Hopefully this post was helpful for folks looking to make a similar move soon. Drop a comment if you have any questions about your upcoming move, or you believe I’ve missed something that you’ve experienced as part of your move already.

    I’ve enjoyed this brief departure from technical blog posts, but rest assured I’ll be getting back to my regularly scheduled technical content.

    Cheers 🍻

    References

    1. Contactless and Oyster account
    2. British Airways - Travelling with pets
    3. Heathrow - Travelling with pets FAQs
    4. London Weather Averages
    ]]>
    Dan Tsekhanskiy[email protected]
    How to Determine Windows Version2021-07-16T00:00:00+00:002021-12-07T22:51:36+00:00https://tseknet.com/blog/windows-version
  • Registry
  • PowerShell
  • Windows API Call
  • End-User Options
  • Why This Matters
  • Where to go from here
  • Related Links
  • Sounds simple, right?

    Microsoft surfaces Windows Version numbers in various locations:

    • There are Registry values, which are desperately missing documentation.
    • There are numerous PowerShell Cmdlets, Windows API calls, etc.
    • There are also end-user options such as the winver command, which pops up a window that tells the user what their Windows version is.
    • And many more…

    Helping you make sense of this all is where this post comes in.

    There are many tools available to help you determine which version of Windows your clients are running such as SCCM, PDQ. This post will focus on built-in methods for determining Windows version.

    Registry

    The following Registry values can be used to determine the version of Windows a system is running:

    Key Value Data Example Explanation
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion ReleaseId 2009 Version number integer (as a string). Added in version 1803, Deprecated with 21H1
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion DisplayVersion 20H2 Version codename mixed string. Added in version 1803.
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion CurrentBuild 19042 Version build number, used by winver.exe.

    The values listed in the table above are not officially documented by Microsoft (see below)

    Word of Warning

    Microsoft has not communicated changes to these Registry values, documented their official support, or guaranteed against breaking changes in the future. This has lead to a frustrating experience using the Registry keys above, given how inconsistent Microsoft’s updates to these keys have historically been. Examples:

    • ReleaseID was deprecated in version 21H1. The ReleaseID for 21H1 remains 2009.
    • Server 2012R2 doesn’t have ReleaseID or DisplayVersion (they weren’t added to Windows yet)
    • Server 2016 has ReleaseID (1607) but no DisplayVersion
    • Server 2019 has ReleaseID (1809) no DisplayVersion

    PowerShell

    Below are some examples of how you can use PowerShell to determine the version of Windows your systems are running:

    # Using the System.Environment Class
    [System.Environment]::OSVersion
    
    # Using the Win32_OperatingSystem CIM Class
    Get-CimInstance Win32_OperatingSystem
    
    # Using the systeminfo executable
    systeminfo.exe /fo csv | ConvertFrom-Csv
    
    # Using the Get-ComputerInfo Cmdlet
    # NOTE: OsHardwareAbstractionLayer was deprecated in version 21H1
    Get-ComputerInfo | Select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer
    

    Windows API Call

    The only supported (documented) systematic way of determining a Windows version is through a Windows API call to the AnalyticsInfo class. This can be done via PowerShell as shown below:

    Credit: @pronichkin

    End-User Options

    Microsoft documentation lists a few commands end-users can use to determine which version of Windows they are running. For example, the winver command, or the Windows Settings menu can be used to determine Windows Version. This is meant to be more end-user facing for verification, rather than for use to determine system version at scale. Examples below:

    winver winversettings

    Why This Matters

    Once you’ve determined the version of Windows your systems are running, you can use this information to take deterministic actions such as installing Windows Updates, applying patches, etc. For example:

    You can query the DisplayVersion registry value (above) to determine which version of Windows your systems are running. Then, you could set the Registry values listed below that tell Windows which version the system should be running. With three registry keys, you’ve fully controlled which version of Windows your systems will attempt to upgrade to!

    Key Value Data Example Explanation
    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate TargetReleaseVersion 1 Setting this to one enables Feature Upgrades to the TargetReleaseVersionInfo version
    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate TargetReleaseVersionInfo 20H2 The target version of the system
    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate ProductVersion Windows 10 New in Windows 11 - one of “Windows 10” or “Windows 11”

    These registry values can either be set directly, or via Group Policy

    Where to go from here

    While it’s not necessary to manage which versions of Windows are running on your fleet, it’s likely valuable information to your Enterprise which versions of Windows are currently running on your fleet. If just for the fact that Windows regularly ends support for versions of Windows.

    Further, I’ll note that the examples above are not meant to be an exhaustive list of ways to determine Windows version, but rather a reference for myself and other folks managing a Windows environment. These methods have proven useful to me when troubleshooting issues, setting policy, etc. Hopefully you’ll find them useful as well.

    Finally, managing Windows versions has always been a moving target. So I look forward to making another post about how to manage Windows versions in the future, once Microsoft has deprecated the existing methods posted above.

    Feel free to reach out if you run into any issues, and see related links (below) for further reading. Hopefully, this post saved you some Googling around trying to find all this information 🔎

    ]]>
    Dan Tsekhanskiy[email protected]
    Set Windows Timezone via Location Services2021-01-04T00:00:00+00:002021-01-05T04:05:53+00:00https://tseknet.com/blog/timezoneThis post aims to help those of you trying to set the Windows time zone without relying on DHCP options or similar solutions. Set the registry values below then restart for Windows to update a systems’ timezone via NTP by leveraging Windows Location services.

    I’ve used this solution when provisioning new deployments of Windows hosts. This can also be used on existing hosts via a configuration management tool such as SCCM or Group Policy.

    Note the current values of these registry keys before making any changes, in case you want to revert these changes once Windows time picks up the new timezone. Making registry changes can cause system instability.

    1. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tzautoupdate
      • Name: Start
      • Data: 3
      • Type: REG_DWORD
      • Explanation: This is the equivalent of navigating to Date & Time in the Control Panel and ticking Set time zone automatically to on. Changing this to 4 will disable this setting.
    2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location
      • Name: Value
      • Data: Allow
      • Type: REG_SZ
      • Explanation: Turns on Windows Location Services. Required to determine location when setting timezone via NTP.
    3. (Optional) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
      • Name: Type
      • Data: NTP
      • Type: REG_SZ
      • Explanation: The time service synchronizes from the servers specified in the NtpServer (below) registry entry.
    4. (Optional) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
      • Name: NtpServer
      • Data: time.windows.com,0x9
      • Type: REG_SZ
      • Explanation: Space-delimited list of peers from which a computer obtains time stamps.

    Scripted Solution

    Run the following in a PowerShell Window running as administrator then restart:

    Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\tzautoupdate -Name Start -Value 3 -Type DWord
    Set-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location -Name Value -Value Allow -Type String
    Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters -Name Type -Value NTP -Type String
    Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters -Name NtpServer -Value 'time.windows.com,0x9' -Type String
    

    Parting Words

    Once configured, the registry keys above allow systems to determine timezone via Windows Location Services, and reach out to NTP to get the correct local time. For further exploration of Windows time, check out w32tm.exe or my WinTZ PowerShell Module.

    Feel free to reach out if you run into any issues, and see related links (below) for further reading. Hopefully, this post makes your Windows time issues a thing of the past ⌛

    ]]>
    Dan Tsekhanskiy[email protected]
    Help Desk Intern to SRE @Google in Five Years2020-11-16T00:00:00+00:002020-11-17T18:47:08+00:00https://tseknet.com/blog/helpdesktosre
  • Always be Learning
  • Passion
  • Ask questions
  • Take Charge
  • What’s Next?
  • Footnotes
  • Five years ago I was a help desk intern. Today is my first day as an SRE at Google.

    Let’s start with the understanding that working on the help desk puts you in the perfect position to eventually transition into one of these roles. Help desk affords you the ability to see how the technologies that the business relies on function, as you’re often tasked with troubleshooting when they don’t work. Learning through reverse engineering, especially in IT, is often an overlooked method of gaining a deep understanding of new technologies. Reverse engineering requires you to get your hands dirty and take a deep dive into what you’re troubleshooting. This is where learning happens.

    Next, let’s discuss SRE. SRE started in 2003 at Google and is often compared to DevOps (coined around 2008). SRE is what you get when you treat operations as if it’s a software problem.1 These two disciplines share the same foundational principles but have subtle differences.2 I’ve found these to involve themes such as code-based configuration, reliability, and service (rather than server) management.

    Let’s dive right in with themes I’ve kept in mind throughout my career. If you’re interested in the actual positions I’ve held as a reference, check out my LinkedIn.

    Always be Learning

    Throughout my career, I’ve found one theme to be ever-present: Always be learning.

    Regardless of the position, I’ve always aspired to go above and beyond what was “written on the tin” of the job requirements. Are there tasks that you find mundane and repetitive? Automate them. I’ve often found the quickest way to learn a new programming language is to find a simple problem and start looking up potential solutions to that problem in a given language. Try to replicate those solutions, and work through the issues you run into along the way.

    Once you’ve fixed your first problem, odds are you’ve become at least familiar with new technology, and provided value in the process. Here’s where I note that value is subjective. For example, a side project I worked on to get my feet wet with Go sends friends daily emails of the cutest pictures from Reddit. Did that provide value to anyone other than the person who’s day was most definitely improved by receiving cute pictures? Definitely. It helped me get familiar with a programming language that I had never seriously touched before.

    Every toolbox starts with one tool. What’s important is you keep adding multipurpose tools to your toolbox. For example, Puppet, Terraform, Git, etc. can be used to solve a wide variety of problems. Notice I did not mention problems for a company here.3 Learning these tools will take some effort, but this is your toolbox. It’s got your name right on the front in big bold letters. You can take it with you wherever you go.

    These tools can be used to automate your company’s fancy new rollout or even automate your grandparent’s software updates. You’ll soon see your toolbox overflowing with tools. Every tool you master will put you in a significantly better place in the job market than you were, or at the very least, grow your toolbox and help you solve the IT problems you are facing.

    Passion

    It helps if you’re passionate about what you do.

    I am passionate about all things IT, job-related or not. I’ve been fortunate to pick a career that allows me to explore my passions, and a company that allows me to explore new ideas and designs that are fueled by my passions.

    I often say that I’d be doing IT-related side projects even if I wasn’t in the IT industry. Ever since playing with (and on) my dad’s computer at five years old, I’ve had a passion for all things technology. I enjoy taking things apart (read: breaking things), figuring out how they work, and (sometimes) putting them back together.

    I often work on side projects on GitHub or my home lab (stay tuned for an upcoming post), in addition to my day job.

    Ask questions

    Be comfortable not being the smartest person in the room.

    Especially since joining Google, it’s clear to me that there will always be someone more knowledgeable than you. Reach out to those people.

    I’ve been lucky to hold positions where curiosity could be endlessly fed by fantastic peers and mentors. Often when troubleshooting issues, even during my internship, if I had questions, I could just turn to a peer and ask away. I’ve found that people love talking about things they’re experts in. If you’re fortunate enough to have peers such as these, make sure to thank them early and often.

    Learning when to ask questions is a skill in and of itself (and a good interview question). There’s no definitive answer for when is the right time to reach out. What’s certain is you will find yourself reaching out, especially as you learn new technologies, programming languages, etc. Just know that questions are part of the learning process. If you find yourself spending endless cycles on a problem, that’s probably a good sign that you could reach out for some help.

    Finally, asking questions is part of the process of how a junior member of a team becomes a senior member. Eventually, that junior member asking questions becomes the senior member fielding them. The cycle continues.

    Take Charge

    Set goal. Set aside time. Accomplish goal. Repeat.

    I’ve adhered to the principles of S.M.A.R.T goals4 and calendar blocking5 to meet those goals. Being intentional with your time is a productivity “hack” I wish I’d learned long ago. If you’re serious about an endeavor, set aside time to accomplish it. Remove all other distractions from your life, and focus on achieving what you’ve set to achieve. Set goals, and keep yourself accountable for achieving your goals.

    Life will always get in the way. Be reasonable with your goals. Everyone is different, and timelines are likely to slip. It’s important to be realistic and kind to yourself when goals slip.

    Set aside time to set overarching goals for your career. Some example questions should help you get started:

    1. Do I want to work until retirement?
    2. Do I want to run my own business?
    3. Do I want to work from home?
    4. Do I want to work full time or part-time?
    5. Do I want to move?
    6. What do I need to start working on to achieve these goals?

    What’s Next?

    An unending thirst for knowledge, fantastic mentors, and taking advantage of opportunity have led me to this point in my career. What’s next for me? My toolbox still has plenty of room. My career still has plenty of room to grow. What’s for certain is I’ll continue to ask questions, break things, and share my journey with you along the way.

    Now get out there and take charge of your career 💪

    Footnotes

    1. What is Site Reliability Engineering (SRE)?
    2. DevOps vs SRE
    3. Career vs. Job
    4. SMART Criteria
    5. Be Intentional
    ]]>
    Dan Tsekhanskiy[email protected]
    Be Intentional With Your Time2020-09-15T00:00:00+00:002020-09-16T14:20:54+00:00https://tseknet.com/blog/intent
  • Call to Action
  • Success
  • Failure
  • Conclusion
  • Related Links
  • Intend to be intentional.

    Time—somehow it’s already 5PM, and the last thing you remember is sipping your morning coffee. How can you take control of your day?

    If you are serious about an endeavor, you will remove every distraction from your life. This is the idea behind intentionality that we’ll dive into today. Set aside time to do the things that are important to you.

    One of the first, and best, things that I’ve learned from my time working at Google has been: if you don’t take control of your time, someone else will. You will inevitably be pulled into meetings, you will have the urge to work through lunch, and you will make up reasons to avoid working on the task at hand.

    I struggled with meeting overload. Trying to get things done within 30-minute breaks between meetings is not sustainable. Combining my meetings onto “meeting days” (future blog post), in conjunction with blocking out time to work on what I determine to be valuable allowed me to regain control over my time.

    Example calendar blocks for a standard Tuesday:

    Example Calendar

    Let’s dive into how you can take control of your time.

    Call to Action

    Time keeps on slippin’, slippin’, slippin’ into the fuuuture… whether or not you take control of it is up to you.

    I challenge you to think about something that you want to accomplish today. Now get out your calendar and block out time to get that task done. More importantly, set a notification to remind you that this event is upcoming, giving you ample time to prepare and set everything else aside.

    Intentional Example

    Start small. Examples include settings aside time to appropriately respond to an email, read one chapter of a book, or go for a one-mile run. If you don’t set aside time, you will become burdened with the tax associated with context switching between getting your task done and everything else on your plate. It’s easy to become complacent if you aren’t intentional. Setting aside a calendar block is your personal accountabilibuddy.

    Tasks can be as specific or as vague as you’d like. What’s important is that there are clear exit criterion. If your goal was “run one mile” in your 15-minute calendar block, then there’s no question of what the exit criteria is. If your goal is something like “investigate work issue,” the exit criteria may be that you’ve identified the root cause of your work issue. It’s ultimately up to you how specific you are with your goals, I’ll just note that the smaller the scope of your goal, the more likely it is to be achieved.

    Use your calendar as your to-do list to prioritize tasks. The first time you intend to work on something, create a calendar block to work on it. Don’t wait until it’s been on your to-do list for months, as the same dread you associate with that task will be there, just on your calendar instead of your to-do list.

    Success

    You did it 🎉

    I guarantee you will get a better feeling from accomplishing a task you’ve blocked out time to accomplish vs. just checking something off a to-do list. This is more than a chore. It’s something you set out to do, set aside a specific time to do it, and you’ve done it. You’ll feel better knowing you’ve intentionally set aside scheduled time for that task, and accomplished your goal within that time frame.

    Failure

    Life—it has a way of getting in the way.

    It’s critically important to not beat yourself up if you haven’t accomplished your task in the allotted time slot. Other things will come up. In this likely scenario, simply reschedule your calendar event for a later date.

    Learn from your mistakes. Why were you not able to accomplish your goal? Was the time you allotted too short? Was the task harder than you initially expected? Did other tasks overrun your allotted time? These are all opportunities for better scheduling in the future. Ultimately, if it’s something you truly care about, you’ll make time.

    Conclusion

    Be intentional with your time. Take control of your day. Begin by reflecting on what is important to you. Next, create a block of time on your calendar to achieve that goal. Reflect on whether that goal was achieved, and don’t be too hard on yourself if it wasn’t. Iterate, improve.

    I wrote this article in the hopes that it helps you accomplish your goals. I invite you to let me know if it worked. Let me know if it didn’t work. Let me know if you have any suggestions for how this methodology can be improved.

    Now get out there and hack your productivity 💪

    ]]>
    Dan Tsekhanskiy[email protected]