RSSAmplifier

Blog

cyotek.com Summary RSS

cyotek.com Summary RSS

RSS feed ↗263 posts

Latest posts

Tools we use - 2025 edition

(Belated) Happy New Year all! The desolation continues and this blog is still pretty much inactive. Not sure on the exact cause, but I do know I feel little desire to write when most of the topics I write about are a little old-school, so a LLM would spit something out much faster and possibly better quality. Of course, likely the LLM includes my blog posts in its training material, as they have…

Azure Trusted Signing

It's the end of the year, so as well as having to do the usual " Tools We Use " post, I also need to renew our code signing certificate. Code signing has been a funny old journey for me, and one that originally was a total pain - from trying to get the certificate in the first place to self destructing certificates to revocation . For the last couple of years certificates were provided via the use…

Tools we use - 2024 edition

Happy New Year all! I still don't have my publishing mojo back so this blog has become rather desolate, but who knows, my mind might stop jumping from one idea to the next and actual settle down enough to do some work. Operating Systems Tool Description Windows 11 Secondary development environment. (Still) Not a fan. Windows 10 (Virtualized) Testing VM (32bit and 64bit) Windows 10 Professional…

Introducing WebView2 support, part 1

Note that WebCopy 1.10 and Sitemap Creator 1.3 onwards no longer supports Windows Vista, 8 and earlier versions of Windows 10 . WebCopy 1.7 introduced website authentication using Internet Explorer. Even at the time I knew it was a stop-gap solution and long term the plan was to have WebCopy support both Gecko and Chromium engines for advanced support. Of course, in Cyotek-land plans never come to…

Tools we use - 2023 edition

Oh look, here were are with the traditional new years post one month after the new year started. So clearly I don't have my publishing mojo back yet. When I look back over the last years drafts I see two partially written blog posts, one a review of Crafting Interpreters (tldr; Go Buy It!) and another of the Synology DS1821+ NAS (tldr; it's not bad!) and that is it. The main change this year is…

Resolving SVN error "Could not open the requested SVN filesystem"

Recently I bought a Synology DS1821+ to complement a pair of long-in-the-tooth HP N40L micro servers running Windows. Although I originally bought it just for storage and "real" RAID, I found it such a delightful device that I decided that it should replace the micro servers completely. Prior to this I've never really used Docker, but the Synology DiskStation Manager (DSM) software makes it a…

Tools we use - 2022 edition

Happy New Year! So much for 2022 being better than 2021, I think the lack of updates to this blog speaks on how unproductive I've been this year but this time I haven't even really worked on our different software offerings or looked at support tickets or forums in months. Will 2023 be any better? Right now it doesn't feel like it, so I'm not even going to try to make any promises. Operating…

Painting the borders of a custom control using WM_NCPAINT

Over the years I've created a number of controls that require borders. Sometimes, I'll draw the borders manually as part of the normal user paint sequence. Other times I'll apply the WS_EX_CLIENTEDGE or WS_BORDER styles and let Windows handle it for me. The advantage of the latter approach is that that means there is nothing I need to do; the borders will automatically paint, and as they are…

Tools we use - 2021 edition

Happy New Year! There is no denying it, last year was pretty dour. Although I worked on this, that, and the other, my motivation was at an all time low and I wrote virtually nothing for this blog. On top of that, I didn't manage, or even make progress, on any of my goals for the year. Here is hoping 2022 is better than 2021. Operating Systems Tool Description Windows 10 (Virtualized) Testing VM…

Cyotek Historical Date Library

Some months ago I was trying to create a timeline of British pre-history and needed to be able to store dates. The .NET DateTime or DateOnly structures are completely unsuitable for these as their ranges are far too small, nor do they allow for partial dates. I did spent a little time poking around to see if there was some existing code, but there doesn't seem to be a lot of detail out there. I…

CrowdStrike Falcon False Positives

For the past several months the CrowdStrike Falcon endpoint protection platform has been flagging builds of our WebCopy and Sitemap Creator products as malicious. A few weeks after this originally started I contacted their support to try and get a solution. Each time, they would check the builds, state they were clean and whitelist that one build. Of course, as soon as our CI server pushed out a…

Introducing 64bit builds

Previously the only Cyotek product which included 64bit binaries was WebCopy, and these weren't especially easy to discover. Future builds of Cyotek products will include separate setup programs (or portable zips) for 32bit and 64bit support. Currently you can download 64bit versions of WebCopy, CopyTools v2, Spriter and Slicr from the Nightlies download section. Other products will follow as they…

Removal of support for Windows Vista, Windows 8 and early versions of Windows 10

Future versions of Cyotek products will retarget to use .NET Framework 4.8, from the current of 4.6. This change will mean that newer versions of our products will no longer be able to be used on Windows Vista, Windows 8, Windows 10 (version 1507) or Windows 10 November Update (version 1511). Supported versions are Windows 7 SP1, Windows 8.1 and Windows 10 Anniversary Update (version 1607) or…

Tools we use - 2020 edition

Happy New Year! Last year was... interesting to say the least. Hopefully 2021 will be somewhat better but it seems more and more likely that we've dug our own graves and care not a whit. With that morbid thought out of the way, here we are with another edition of Tools We Use. While I still haven't got the blog redirects switched on for the new platform , I recently upgraded that through various…

Creating a custom single-axis scrolling control in WinForms

Over the years, I have written several custom controls that supporting scrolling. However, almost invariably they have some flaw that meant scrolling was sub-optimal. For example, in our Gif Animator software, the frame reel can cut off the last frame. In other programs, scrolling goes beyond visible items and thus presents an empty control at worst or a smattering of items at best. As it seems…

kbd Markdig Plugin

I try to keep my markdown documents plain, avoiding HTML where possible. The core cyotek.com website is mostly powered by markdown, with embedded HTML and arcane constructs with assorted regular expression processors. The new blog uses pure markdown and although currently still uses an arcane construct or two for compatibility, these are provided via Markdig extensions rather than regular…

Initial thoughts on the Cooler Master Pi Case 40

Today I received a pair of Cooler Master Pi Case 40 cases, a Kickstarter project I backed in July. It has actually been available for purchase from other retailers for some time whilst backers such as myself cooled our collective heels. This case is a passively cooled aluminium case for the Raspberry Pi 4 that also features a programmable button (e.g. for switching it on an off). It is also…

An introduction to using Windows Image Acquisition (WIA) via C#

In this post I'm going to cover a basic crash course for using the Microsoft Windows Image Acquisition library (WIA) in a C# WinForms application. It's mostly based around using the various built-in dialogues in order to easily add image acquisition and printing to your application, I don't go into deeper functionality such as command execution. I started writing this post in September 2019 before…

Simulating Bacterial Chemotaxis

Some months ago I was reading an article that described the behaviour of E. coli bacteria and comparing that to working patterns. An odd comparison, but what struck me was the fact that the bacteria behaves in such a simple fashion with basic rules. This got me thinking that this could be good behaviour to model for enemy AI given basic rules can lead to complex looking behaviour as ably…

Cyotek.Drawing.BitmapFont Version 2 Released

I've slowly been picking up the reins on my languishing open source projects, and the first to get a proper release is our BMFont parsing library, Cyotek.Drawing.BitmapFont . What's New and Improved The original library targeted .NET 2.0, the new package targets .NET 3.5, 4.0, 4.5.2, 4.6.2, 4.7.2, and 4.8, .NET Standard 1.3, 2.0 and 2.1, and .NET Core 2.1, 2.2 and 3.1. Unfortunately dotnet build…

Initial thoughts on the Adafruit I2S 3W Stereo Speaker Bonnet for Raspberry Pi

In my previous Argon ONE review , some of the photographs show a pair of white cables, one going into a USB slot and another the audio jack. These belong to a set of Logitech Z120 speakers I'd bought for use with things like the Raspberry Pi to avoid more plugs. Unfortunately however, I swiftly discovered that these are not a very good fit for the Pi - when they are plugged in and switched on,…

Committing to a Git repository using custom dates

Occasionally I want to create a Git repository for some ancient piece of code in my SVN repository. As I haven't had any luck in exporting parts of my giant mono repository, I tend to just grab the lowest folder, initialise a new git repository and commit. But if I do that, then everything is tagged with the current timestamp, which is definitely not what I want for code that I haven't touched in…

Adding Scripting to .NET Applications

Adding scripting to your application can be a good way of providing your power users with advanced control or for allowing it to be extended in ways you didn't anticipate. Our Color Palette Editor software allows the use of dynamic templates via the use of the Liquid template language by Shopify. This is quite powerful in its own right and I will likely use it again in future for other templating…

Writing DOOM WAD files

In a prior post , I described id's WAD format used by classic games such as DOOM and how to read them. This post covers how to write them. As with my first post, this only covers the original WAD format, not the enhanced ones which followed. The Format A brief recap on the format. There is a 12 byte header which details the wad type, the number of lumps of data it contains, and an offset where the…

Decoding DOOM Picture Files

In my previous post , I described id's WAD format used by classic games such as DOOM and how to read them. While researching the format though, I wasn't 100% sure that I was extracting lumps properly - the only readable file I'd discovered was DMXGUS in DOOM1.WAD , and also LICENSE in DARKWAR.WAD ... hardly conclusive. Armed with the specification from the DOOM FAQ , I decided to take a brief…

Reading DOOM WAD Files

WAD "Where's All the Data" files used by DOOM and various other games are simple containers, similar to zip and other archive formats, without additional complexity (such as compression) and data-centric rather than file. This article describes how to read the WAD files used by DOOM, DOOM II, Rise of the Triad and similar games of that era. Yes, I'm talking DOS and 1993, not the more modern…

A review of the Argon ONE Raspberry Pi 4 Case

This is my own review using hardware I researched and bought myself. There are no affiliated links in this article. When the Raspberry Pi was originally announced in 2012 I rapidly pre-ordered the Model B and tried my best to use it as a normal computer. Regretfully, the hardware was just not suitable - I couldn't even use it for the most basic of web-browsing, let alone any work. I tried again…

Installing Mopidy and pHAT Beat on a Raspberry Pi

I've been running Mopidy for a few weeks now on a Raspberry Pi 3 Model A using a spare set of computer speakers. As I also have a spare Raspberry Pi Zero W, I decided to buy a HAT for this that would allow me to use a set of proper hi-fi speakers that were powered by the Pi instead of external power. This article describes how to set up the Mopidy music server with selected extensions using the…

Tools we use - 2019 edition

Happy New Year! The past few months I've been feeling quite burned out and haven't updated this blog much - I have half a dozen half-finished blog posts and our product updates have suffered too. I didn't want to break the tradition though and fortunately the number of updates were small, so here is the 2019 list of "Tools We Use". As far as personal goals go, 2019 was mostly a dud. I didn't…

Resolving compile error "Interop type cannot be embedded. Use the applicable interface instead"

Recently I've been experimenting with the Microsoft Windows Image Acquisition Library (WIA), a COM library that therefore requires the use of interop in .NET. In the course of testing some of the different features of this library I triggered a compile error I haven't come across for a long time. As it isn't often I work with COM interop I thought I'd write a quick post detailing how to resolve or…

CanoScan LiDE 100 Windows 10 and Windows 11 Compatibility

Although officially the Canon CanoScan LiDE 100 scanner is not supported on Windows 10 or on Windows 11, I have found that it is fully functional. This article describes the versions of Windows I have tested the scanner with along with any observations. Quick Summary Windows Version Bitness Supported? Windows 11 (21H2) 64bit Yes 1 Windows 10 (21H2) 64bit Yes 1 Windows 10 (21H1) 64bit Yes 1 Windows…

Book Review: The Ray Tracer Challenge

A few months ago I heard about a book named The Ray Tracer Challenge by Jamis Buck. The premise of the book is that it would teach you how to write a ray tracer from scratch. The unique approach of the book (and one I have never come across in any other book) is that it would do this via a test driven approach - the book would provide the test cases and their inputs and outputs, and you fill in…

Error VSP1048 when trying to instrument assembly created using Visual Studio 2019

In short - projects created using Visual Studio 2019 by default are compiled in a deterministic fashion, meaning if you compile the file multiple times without any changes, you will get identical output each time. Previous versions of Visual Studio used to include the compilation timestamp as part of the file header, causing the output to be different each time. I'm not sure of the reasons why,…

Creating a custom type converter part 3: Types to string

I have discussed creating type converters a few times on this blog, and recently came across another use for them. I have a .NET Standard library that uses a variety of struct instances that are sometimes properties of concrete classes. I also have a .NET Framework 4.7.2 demonstration application to work with the library that uses the PropertyGrid control to provide easy editing facilities. Note:…

WebCopy 1.8 - JavaScript Support

One of the long standing requests/complaints is for WebCopy to support JavaScript enabled websites, e.g. modern SPA's where JavaScript is used to build the page. Traditionally this is something I have always put onto the furthest of back burners as in order to support this natively I'd have to essentially write half a browser, something that would be a full time job and a half and not something…

WebCopy 1.8 - New Project Wizard

In my previous post regarding WebCopy 1.8, I briefly covered a general grab-bag of some of the new features in this version. This post is dedicated to another new feature, the New Project Wizard. Whilst you can still create a new blank project as with previous version of WebCopy, there's also a new GUI that will ask a series of questions and create a neatly configured project. This is very much a…

Introducing WebCopy 1.8

It's been over two months since the last CI build of WebCopy was made, and during this time I've been working quite hard on some major internal refactoring and adding a long requested feature. It hope it's worth the wait, I need a break! WebCopy 1.8 nightly builds are now available for download and so this series of posts will describe some of the changes and new functionality that have been made…

Setting tab stops in a Windows Forms TextBox control

I was adding a Wizard to one of my applications, and the final screen of this Wizard was a summary of the user's choices. I wanted the user to be able to copy this to the Clipboard if required, and so I'd used a TextBox rather than the ListView I might have otherwise used. However, this presented a minor issue as I'd chosen to use tabs to delimit the information, and the varying length of text…

Changes to CrashPlan for Small Business that may affect developer backups

This morning I received the following email from Code42 regarding their CrashPlan for Small Business service Dear Valued Customer, We are resending this notification to ensure that you are aware of recent changes we made to our application. Should you have any questions, or need assistance, please contact our Support team. The CrashPlan ® for Small Business Code42 app is intended to back up your…

Creating an ndrules file for use with NDepend

A long time ago, I wrote of some initial experiences using NDepend . Since then, I've done little with the product, although I did integrate it with Jenkins for both pipeline and freestyle jobs and so every time the CI builds it executes NDepend. However, the NDepend configuration used by these jobs is (probably) significantly out of date. As I've just upgraded NDepend to the current version, I…

Migrating from Azure translation API version 2 to 3

Almost two years ago I wrote a post describing how to translate text using Azure cognitive services , however the API it uses is to be switched off and so I needed to migrate from the version 2 API to version 3. Whilst most of the code I post on this blog is used in one form or another, I've been using the TranslationClient client presented in that article as-is for the past two years. OK, I…

Website history gallery

The Cyotek (and Ariad Software) websites have gone through a lot of iterations over the years. The current website software dates from 2011, with the design from 2013, and both are in drastic need of an overhaul. As I plan on redeveloping the site using ASP.NET Core, I'm also going to introduce a new look at the same time. With that in mind, I thought it might be interesting (for myself at least!)…

Handling the orientation EXIF tag in images using C#

Two weeks ago I received an interesting support ticket from a user of our ImageBox control, stating that when being used for .png files, the control was absolutely file but when used with .jpg files that had been rotated using Windows Explorer shell context menus, they were displayed in the original orientation. As soon as I read the ticket I had a hunch what was going to be the ultimate cause,…

Frustrations of third party software

No detailed blog post, just a screenshot that neatly echo's my ongoing frustration with Resharper. It was a lot longer than 7 seconds too... All content Copyright (c) by Cyotek Ltd or its respective writers. Permission to reproduce news and web log entries and other RSS feed content in unmodified form without notice is granted provided they are not used to endorse or promote any products or…

New option in Visual Studio 2019 keeps console window open after debugging

For as long as I've been writing console applications, I've at the end of Main I've always had a piece of code to require user input before exiting when in debug mode, in order to review any output before the window closes. Not an onerous task, but one I immediately do as soon as creating a new application. New features? Today I created a new .NET Core console application in Visual Studio 2019…

Reading cookies from Internet Explorer

In order to work around cases where it wasn't possible automatically authenticate with a website, I wanted the ability to use an embedded Internet Explorer window for manual authentication and then reuse the cookies. This article describes how to read cookies indirectly using InternetGetCookieEx or directly from a WebBrowser control. Reading cookies The InternetGetCookieEx Win32 API can be used to…

Using message filters in Windows Forms applications

For a utility application, I wanted to add an item in the system menu. It's been quite a long time since I last did this (and was in VB6), so I decided to find some ready made source code. This class provides a nice little helper for wrapping the system menu to add new commands to it, but it requires the owner form to hook into its window procedure and forward messages on which I felt was an…

Tools we use - 2018 edition

Happy New Year! While once again it's that time for the list of software products and services I personally used throughout the previous year, it's also a birthday of sorts - this year will be the 10th year since Cyotek was reactivated after being shut down and also since I started blogging for the first time. Very little change from previous years, this may change as I force myself to move to…

WebCopy 1.7 - local file name generation

As part of WebCopy 1.7's mission to reduce user confusion and make the product more appealing, a pair of new options for controlling local file name generation have been introduced, as well as correcting a potentially confusing bug. Preserving the original extension By default, WebCopy will name local files to match their content type. For example, if you download the homepage of a website which…

WebCopy 1.7 - tls/ssl invalid certificate handling

You should add an option to ignore checking for an SSL certificate. The above quote is the last part of a piece of uninstallation feedback I received about WebCopy on Friday. This isn't the first time I've had an anonymous feedback about ignoring SSL errors and each time it has happened it has been frustrating and even bewildering as the option is already there and has been since 2013 ! As a…