Cyotek Newshttps://blog.cyotek.com/atom.xml2021-10-08T07:20:45ZCrowdStrike Falcon False Positivesurn:uuid:8cde1d62-c4d3-4aed-9de4-a2f8cf2197292021-05-19T07:20:59Z2021-05-19T07:20:59Z<p>For the past several months the CrowdStrike Falcon endpoint
protection platform has been flagging builds of our WebCopy and
Sitemap Creator products as malicious.</p>
<p>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 new build, they
automatically flagged it as malicious again.</p>
<p>It has now been several months and their support doesn't answer
emails or provide any reason why they keep flagging the software
as malicious. As we are quite certain these are false positives
(firstly, every build is sent to <a href="https://www.virustotal.com/" rel="external nofollow noopener">VirusTotal</a> for analysis by
multiple engines, second, each time we originally contacted them
with one of the file hashes they investigated and reported
clean) we have decided to add CrowdStrike detections
<code>Win/malicious_confidence_80% (D)</code> and
<code>Win/malicious_confidence_90% (D)</code> to an ignore list. Therefore,
if one of these is the only detection, the build will be made
available for download.</p>
<p>Of course, there are no guarantees and so you should still be
cautious when downloading files from the internet.</p>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/crowdstrike-falcon-false-positives .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comIntroducing 64bit buildsurn:uuid:a62201e3-629c-439e-95ef-fc85c038a9ee2021-03-30T07:01:37Z2021-03-30T07:01:37Z<p>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.</p>
<p>Currently you can download 64bit versions of WebCopy, CopyTools
v2, Spriter and Slicr from the Nightlies download section. Other
products will follow as they are updated.</p>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/introducing-64bit-builds .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comRemoval of support for Windows Vista, Windows 8 and early versions of Windows 10urn:uuid:1c1f72dd-e128-41e8-a84b-7c44aae8306d2021-03-19T17:17:30Z2021-03-19T17:17:30Z<p>Future versions of Cyotek products will retarget to use .NET
Framework 4.8, from the current of 4.6.</p>
<p>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).</p>
<p>Supported versions are Windows 7 SP1, Windows 8.1 and Windows 10
Anniversary Update (version 1607) or higher. For more
information on .NET Framework operating system support, please
consult the <a href="https://docs.microsoft.com/en-us/dotnet/framework/get-started/system-requirements" rel="external nofollow noopener">Microsoft System Requirements documentation</a>.</p>
<p>.NET 4.8 is built into Windows 10 May 2019 Update (version 1903)
or above, or you can download it directly from <a href="https://dotnet.microsoft.com/download/dotnet-framework/net48" rel="external nofollow noopener">Microsoft</a>
for earlier versions. Note that the appropriate Cyotek product
setup will automatically download and install .NET 4.8 if
it isn't detected.</p>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/removal-of-support-for-windows-vista-windows-8-and-early-versions-of-windows-10 .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comWebCopy 1.8 - JavaScript Supporturn:uuid:2899371e-241f-4385-9f92-0abfdcb1ca382019-06-29T19:18:35Z2019-06-29T19:18:35Z<p>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 I'm interested in doing. Other solutions
did exist but I never really looked into them.</p>
<p>It recently occurred to me however, that I'd put into place all
the building blocks I needed to have WebCopy support JavaScript
execution (in a limited fashion, more on this later) using
Internet Explorer. And it was easy, in fact, the hardest part
was sorting out threading issues - despite the fact that WebCopy
<em>currently</em> only crawls on a single thread, it does run on a
different thread to the UI in order not to freeze it, which COM
can have a problem with.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-1.8-browser-option.png" class="gallery" title="That is a big warning message!" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-1.8-browser-option.png" alt="That is a big warning message!" decoding="async" loading="lazy" /></a><figcaption>That is a big warning message!</figcaption></figure>
<p>The end result? A new <em>Use Web Browser</em> option can be found in
the <em>Project Properties</em> dialog. When set, WebCopy will do its
own downloading and remapping of content, but it will use an
embedded Internet Explorer session to do the crawling.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-1.8-browser-off.png" class="gallery" title="The current version of WebCopy can't detect links generated via JavaScript" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-1.8-browser-off.png" alt="The current version of WebCopy can't detect links generated via JavaScript" decoding="async" loading="lazy" /></a><figcaption>The current version of WebCopy can't detect links generated via JavaScript</figcaption></figure>
<p>The screenshot above shows a scan of the <a href="https://demo.cyotek.com">WebCopy demonstration
site</a>. The page <code>dom.php</code> has a few lines of JavaScript to
build a list of links. As seem above, previous versions of
WebCopy are completely oblivious to these extra links.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-1.8-browser-on.png" class="gallery" title="A small step for software applications, a giant leap for WebCopy" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-1.8-browser-on.png" alt="A small step for software applications, a giant leap for WebCopy" decoding="async" loading="lazy" /></a><figcaption>A small step for software applications, a giant leap for WebCopy</figcaption></figure>
<p>The image above is the same website scanned using WebCopy 1.8
and the new option enabled - you can see how it has detected
additional links, due to allowing JavaScript to execute. If you
peer hard enough you will also see that it was significantly
slower due to scanning the website using this technique.</p>
<h2 id="listing-the-cons">Listing the cons</h2>
<p>Although I'm pleased to be able to finally offer this
functionality, there are a <em>few</em> caveats.</p>
<blockquote>
<p>This functionality is very new, and very experimental. It is
by no means certain that I have ironed out all the potential
issues. <strong>Caveat Emptor!</strong></p>
</blockquote>
<ul>
<li>Crawling may be substantially slower. HTML documents will be
downloaded twice, and the headless web browsing will also add
significant overhead</li>
<li>JavaScript is being executed. This can lead to your sessions
being finger printed, tracked, malicious content being
downloaded, any number of things</li>
<li>This functionality currently uses the latest version Internet
Explorer that is installed on your computer. Not all websites
play nicely with IE</li>
<li>Keeping with the Internet Explorer theme, it will share and
use global cookies</li>
<li>Some options won't apply - for example the user agent. If a
website is particularly unfriendly, it may serve different
content to WebCopy than it does to the hosted Internet
Explorer session</li>
<li>WebCopy will remap only the original document it downloads,
not the JavaScript executed version. I don't plan on changing
this behaviour</li>
<li>This system only supports non-interactive scripts, e.g.
JavaScript that executes when the page loads. <em>I have no
intention of supporting scripts that normally require user
interaction to run, e.g. clicking a button or scrolling a
window</em></li>
<li>It occurs to me as I write this post that I have no idea what
will happen if the scripts try to open a popup window.
Probably nothing good!</li>
<li>Potentially more issues. <strong>Experimental code!</strong></li>
</ul>
<h2 id="i-dont-want-to-use-internet-explorer-cant-i-use-chrome-or-firefox">I don't want to use Internet Explorer, can't I use Chrome or Firefox?</h2>
<p>Neither do I. Microsoft have dropped the ball so many times with
web browsers I'm amazed they are still in the game. Although I
wish they'd just decoupled Edge from the OS and updated it more
frequently than giving into Google and adopting Chromium. But
I've probably stated this before, plus, as usual, I digress.</p>
<p>To get back to the point, I expect future versions of WebCopy
will support both Firefox and Chromium. However, as these
browsers are several times larger than WebCopy, they won't be
included by default. So I also need to have a nice system so
that you can easily add extra browser engines to WebCopy from
within the application and without needing to install anything.</p>
<p>I'm also considering supporting Edge as Microsoft appear to be
adding support for this to .NET, as long as you're on the latest
Windows 10. However, given that it's probably &quot;old&quot; Edge then
this may not happen as adding support for <em>two</em> obsolete
browsers <strong>and</strong> with one only available to a fraction of users
is going to be a waste of the time I simply don't have to waste.</p>
<p>I'll have more to write about this in future I'm sure!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2019-06-29 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/webcopy-1-8-javascript-support .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comWebCopy 1.8 - New Project Wizardurn:uuid:d783e81a-a96a-4b27-a9f8-6a601d5c45912019-06-29T19:03:12Z2019-06-29T19:03:12Z<p>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.</p>
<p>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.</p>
<p>This is very much a work in progress, the first couple of pages
in particular need to be made more user friendly rather than
just reproducing parts of the main (and complicated) properties
window.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-1.8-newprojectwizard-filetypes.png" class="gallery" title="Using the New Project Wizard to only copy files of a given type" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-1.8-newprojectwizard-filetypes.png" alt="Using the New Project Wizard to only copy files of a given type" decoding="async" loading="lazy" /></a><figcaption>Using the New Project Wizard to only copy files of a given type</figcaption></figure>
<p>This page is potentially the most useful part of the new Wizard.
It allows you to select the types of files you're interested in,
be it images, audio or several other types and will use use this
select to generate a set of pre-built rules using either content
types or extensions as appropriate.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-1.8-newprojectwizard-rules.png" class="gallery" title="Entering rules is a little easier in this Wizard, with more to come" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-1.8-newprojectwizard-rules.png" alt="Entering rules is a little easier in this Wizard, with more to come" decoding="async" loading="lazy" /></a><figcaption>Entering rules is a little easier in this Wizard, with more to come</figcaption></figure>
<p>The Rules page makes it a little easier to enter a bunch of
exclusion rules.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-1.8-newprojectwizard-summary.png" class="gallery" title="Showing the summary of changes" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-1.8-newprojectwizard-summary.png" alt="Showing the summary of changes" decoding="async" loading="lazy" /></a><figcaption>Showing the summary of changes</figcaption></figure>
<p>The Summary page shows how the choices you made in the previous
pages are going to be used to create a WebCopy project.</p>
<p>There's a few more pages, but they are basic and don't offer
anything really new over the existing UI.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2019-06-29 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/webcopy-1-8-new-project-wizard .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comIntroducing WebCopy 1.8urn:uuid:9d8ac927-4914-4e7c-a2e6-35229b6c2a7f2019-06-29T19:02:08Z2019-06-29T19:02:08Z<p>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 <em>long</em> requested
feature. It hope it's worth the wait, I need a break!</p>
<p>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 to the software. This first
post will cover a grab bag of smaller changes.</p>
<blockquote>
<p>Files saved with WebCopy 1.8 are not compatible with older
versions. Please ensure you have a backup of WebCopy projects
so you can revert to an older version of WebCopy if required.</p>
</blockquote>
<h2 id="rule-improvements">Rule Improvements</h2>
<p>The most obvious change is that when you open WebCopy the Rules
List now has three columns rather than two. Although I wrote
back in 2014 about WebCopy 2.0 and a more <a href="https://blog.cyotek.com/post/webcopy-2-0-rules-and-query-strings">extensive rule
system</a>, the simple fact is WebCopy has 10 years of bug fixes
and improvements to the core engine and while there is work to
do, I'm not in a hurry to rewrite it. However, the rules system
could do with some TLC to avoid users having to become regular
expression wizards.</p>
<p>I've added the ability for you to choose which part of the URI
is used by the rule. By default this is the path and query
string (same as previous versions), but you can also tell it to
look at just the path, or just the query, or you could include
the domain too. As a result of this change the <em>Use full URL</em>
flag has been removed. Any rules with this flag currently set
will be automatically upgraded to new settings.</p>
<p>I've also added the ability for rules to run against the content
type of a given URL. This will make it much simpler to scan a
website and only keep images or other resources, rather than
having to set up a rule that tries to check URL extensions.</p>
<blockquote>
<p>Content type rules currently only work if HEAD checking is
enabled (this is the default). If this option is not set, the
rules probably won't work - I'll address that in a future 1.8
nightly</p>
</blockquote>
<h2 id="scan-depth">Scan Depth</h2>
<p>A new UI option has been added allowing you to control the scan
depth. This option only applies if the domain matches the
primary domain being copied.</p>
<h2 id="link-distance">Link Distance</h2>
<p>You can now choose to only include files that are directly
linked to the source page being copied, or within a certain
&quot;click distance&quot;.</p>
<h2 id="cookies">Cookies</h2>
<p>Cookie name/value pairs can now be set for each project.</p>
<p>The UI where cookies are displayed has also had various
usability tweaks.</p>
<h2 id="setup">Setup</h2>
<p>WebCopy setup is now using InnoSetup version 6. This should make
it easier to add local installs as currently Setup requires
power user access to install. This isn't available yet however
as I have looking into resolving the last few hurdles preventing
me allowing the &quot;portable&quot; zips to be enabled.</p>
<h2 id="memory-improvements">Memory Improvements</h2>
<p>Last but not least, some technical changes to make things run a
little smoother.</p>
<p>The code WebCopy uses to build site maps is 10 years old at this
point, being the same code used by Sitemap Creator. Saying that
it isn't very efficient is quite the understatement. In
addition, it doesn't handle the ability to load portions on
demand, so in order for WebCopy to display a sitemap it has to
build the entire map upfront and this results in a wide range of
out of memory exceptions for some users. For WebCopy 1.8, this
has been replaced with a simpler system that &quot;walks&quot; the
sitemap, creating only the bits needed at that point. Expand a
branch and only the immediate children are loaded - this should
mean that initial load time of the tree is substantially faster
and memory requirements are much lower.</p>
<p>The sitemap and diagram extensions have also been updated to use
this new code. While both of these still need to scan the entire
map, the fact it isn't building this map out of inefficient
string operations means these shouldn't cause a crash either,
although this doesn't solve all problems with the diagram
extension.</p>
<p>I still need to do performance profiling, but I'm quite happy
with the functionality thus far and am confident that this
change will wipe out a great deal of the out of memory
exceptions that users experience. The old code isn't used at all
now by WebCopy (Sitemap Creator still uses it at the moment).</p>
<p>In a related note, the way links are identified has changed too,
resulting in a nice reduction in memory required for large
projects. Unfortunately as a result of these changes, older
versions of WebCopy won't be able to open project files saved
with WebCopy 1.8.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2019-06-29 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/introducing-webcopy-1-8 .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comWebsite history galleryurn:uuid:cd73dd4f-0b19-4df0-b4e6-5fa32c5dd66f2019-03-13T19:32:59Z2019-03-13T19:32:59Z<p>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!) to put together a rogues gallery of some of
the iterations.</p>
<p>Fortunately I still have the archived source code for the oldest
versions on this page, and the <a href="https://archive.org/" rel="external nofollow noopener">Internet Archive</a> was able to
supply snapshots for iterations between version 10 and 12. Some
of the designs I forgot were ever a thing!</p>
<p>I did find that the oldest versions (&quot;<em>For best results, this
site requires Microsoft Internet Explorer 4.0 or higher, and a
screen resolution of 800*600, high color</em>&quot;!) don't actually
render properly in modern browsers, there were issues with font
faces and spacing. Amusing as that was, I ended up taking
screenshots of these old sites using Internet Explorer in IE5
compatibility mode. The remainder were captured as a personal
last huzzah in Edge before Microsoft abandon it in favour of
something far worse.</p>
<h2 id="version-12">Version 12</h2>
<ul>
<li>First published: 21May2011</li>
<li>Technology: ASP.NET MVC 3 / 4 (2013) / 5 (2014), SQL Server, C#</li>
<li>Editor: Visual Studio (2010, 2012, 2013, 2015)</li>
</ul>
<p>This is the current version of the software and longest running
version of the website. It has a <em>very</em> long change log of all
the bits that have been bolted on over the years, bug fixes,
performance improvements. A lot of work!</p>
<p>The current design was introduced in 2013 and has had only a few
touch-ups since.</p>
<div class="article-gallery">
<a href="https://images.cyotek.com/image/blog/archivedwebs/webs-120a-home.png" class="gallery" title="Current home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-120a-home.png" alt="Current home page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-120a-product.png" class="gallery" title="Current product page page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-120a-product.png" alt="Current product page page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-120-home.png" class="gallery" title="Original home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-120-home.png" alt="Original home page" decoding="async" loading="lazy" /></a></div>
<h2 id="version-11">Version 11</h2>
<ul>
<li>First published: 01Aug2009</li>
<li>Technology: ASP.NET MVC 1, SQL Server, C#</li>
<li>Editor: Visual Studio (2008, 2010)</li>
</ul>
<p>This was the first version developed after bringing cyotek.com
back online after a 4 or 5 year break. Originally it just hosted
a blog as at the time we had no products (Visual Basic and
ActiveX were dead), but I did want to write, and also see what
the fuss was with MVC especially as I am not a fan of WebForms.</p>
<p>Unlike the older versions of this website, version 11, 12 and
likely the upcoming 13 use purchased templates which I then
tweaked to suit my needs. Website design had come on in leaps
and bounds since the older days of the web and I make no
pretence at being a UI/UX designer... table based layouts are so
last millennium!</p>
<p>While I have the source code for the site, I don't have any
readily available populated database backups and so the
screenshot is from the Internet Archive.</p>
<div class="article-gallery">
<a href="https://images.cyotek.com/image/blog/archivedwebs/webs-110-home.png" class="gallery" title="Home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-110-home.png" alt="Home page" decoding="async" loading="lazy" /></a></div>
<h2 id="version-10">Version 10</h2>
<ul>
<li>Date: 2001-2005</li>
<li>Technology: ASP, Microsoft Access, VBScript</li>
<li>Editor: Microsoft FrontPage 5.0 / 6.0</li>
</ul>
<p>Out of all the versions of this website that have existed, new
and old, the style of this version is my favourite. I love the
dotted lines mixed with Times New Roman headers and Verdana
font. Not sure what I was thinking when I designed that last
sidebar though...</p>
<p>Another reason these websites look better in some ways that the
newer versions is the lack of adverts. It is high time to start
getting users to pay for our software instead of relying on
adverts.</p>
<p>Regretfully, this was the last version of the website before it
took a several year hiatus - and I can't find a single copy of
the databases it used in any archive I possess. In those days
<a href="http://www.innovasys.com/" rel="external nofollow noopener">Innovasys</a> used to host the website, but after 14 or so
years, I somehow doubt they have a backup either.</p>
<p>At some point in this period we renamed from Ariad Software to
Cyotek, moved to <a href="http://www.cyotek.com">www.cyotek.com</a> and here we've been ever
since.</p>
<div class="article-gallery">
<a href="https://images.cyotek.com/image/blog/archivedwebs/webs-100-eol.png" class="gallery" title="End of life placeholder - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-100-eol.png" alt="End of life placeholder" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-100e-home.png" class="gallery" title="Final home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-100e-home.png" alt="Final home page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-100d-home.png" class="gallery" title="Home page iteration - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-100d-home.png" alt="Home page iteration" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-100c-home.png" class="gallery" title="Home page iteration - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-100c-home.png" alt="Home page iteration" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-100b-home.png" class="gallery" title="Home page iteration - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-100b-home.png" alt="Home page iteration" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-100a-home.png" class="gallery" title="Home page iteraion - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-100a-home.png" alt="Home page iteraion" decoding="async" loading="lazy" /></a></div>
<p>I also found this dreadful banner graphic I created at some point.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/archivedwebs/cyotek.gif" class="gallery" title="Trendy!" ><img src="https://images.cyotek.com/image/blog/archivedwebs/cyotek.gif" alt="Trendy!" decoding="async" loading="lazy" /></a><figcaption>Trendy!</figcaption></figure><h2 id="version-9">Version 9</h2>
<ul>
<li>Date: Aug2000</li>
<li>Technology: ASP, Microsoft Access, VBScript</li>
<li>Editor: Microsoft FrontPage 4.0</li>
</ul>
<p>This was the first version of the site to be something other
than static HTML, and also the first version to be on its own
domain - <a href="http://ariad-software.com" rel="external nofollow noopener">ariad-software.com</a>. Basic forums were added, and
the links page was also data driven. A product registration
system was also added, although this database is empty so I
don't recall if it was ever fully implemented.</p>
<p>When trawling through the Internet Archive I found multiple
different styles of home page as the style transitioned to what
became version 10.</p>
<p>I also fondly remember when my operating system allowed me to
customise its appearance, instead of the increasingly dumbed
down and inflexible system that Microsoft have forced down our
throats since Windows 8.</p>
<p>The logo changed from the original triangular shapes to a
bizarre webbed version, created using an auto shape in Serif
DrawPlus and far too little imagination. A little later the
square logo was introduced which we've been stuck with ever
since.</p>
<div class="article-gallery">
<a href="https://images.cyotek.com/image/blog/archivedwebs/webs-100-home.png" class="gallery" title="Home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-100-home.png" alt="Home page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-100-product.png" class="gallery" title="Product page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-100-product.png" alt="Product page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-100-forum.png" class="gallery" title="Forums - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-100-forum.png" alt="Forums" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-90-home.png" class="gallery" title="Original home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-90-home.png" alt="Original home page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-90-product.png" class="gallery" title="Original product page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-90-product.png" alt="Original product page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-90-forum.png" class="gallery" title="Original Forums - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-90-forum.png" alt="Original Forums" decoding="async" loading="lazy" /></a></div>
<h2 id="version-8">Version 8</h2>
<ul>
<li>Date: Feb2000</li>
<li>Technology: HTML</li>
<li>Editor: Microsoft FrontPage 4.0</li>
</ul>
<p>This version (and all lower versions) were hosted on GlobalNet,
the first real ISP I used after CompuServe. Astonishingly, it's
been at least 20 years since I had an account with them, yet the
final page I added to that account (to redirect to
<a href="http://www.ariad-software.com" rel="external nofollow noopener">www.ariad-software.com</a> for version 9 onwards) is still present -
<a href="http://www.users.globalnet.co.uk/%7Eariad" rel="external nofollow noopener">www.users.globalnet.co.uk/~ariad</a>. That is <em>really</em>
impressive.</p>
<p>The side menu is using JavaScript to make 3D buttons when the
mouse passes over them. Earlier websites had used JavaScript to
update the &quot;you are here&quot; footer, but I think this might have
been my first use for adding visual pizazz. I didn't see any
evidence in the later versions, but I specifically recall
purchasing a program called DHTML Menu Builder to do more
advance menus.</p>
<p>I remember the first time I saw Xara's vector graphics program I
was blown away. Here was a program doing real time gradients,
even while resizing the shapes or rotating them - I hadn't seen
that on Windows before at such quality and speed. I don't
remember using that program, but I did use their Webstyle
program a lot to create the graphical bullets, and headings used
in ActiveX product demonstrations.</p>
<p>HTML Help seems to be the new hotness and so my WinHelp content
looks like it is getting deprecated in favour of more ActiveX
controls.</p>
<div class="article-gallery">
<a href="https://images.cyotek.com/image/blog/archivedwebs/webs-80-home.png" class="gallery" title="Home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-80-home.png" alt="Home page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-80-product.png" class="gallery" title="Product page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-80-product.png" alt="Product page" decoding="async" loading="lazy" /></a></div>
<h2 id="version-7">Version 7</h2>
<ul>
<li>Date: Apr1999</li>
<li>Technology: HTML</li>
<li>Editor: Microsoft FrontPage 3.0</li>
</ul>
<p>The site is starting to grow up a little, with lots more
downloads, new ActiveX controls and new product - Ariad
ScrapBook code repository. There's even files with version
information in for update checks. All still static HTML.</p>
<div class="article-gallery">
<a href="https://images.cyotek.com/image/blog/archivedwebs/webs-70-home.png" class="gallery" title="Home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-70-home.png" alt="Home page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-70-product.png" class="gallery" title="Product page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-70-product.png" alt="Product page" decoding="async" loading="lazy" /></a></div>
<h2 id="version-6">Version 6</h2>
<ul>
<li>Date: Dec1998</li>
<li>Technology: HTML</li>
<li>Editor: Microsoft FrontPage 3.0</li>
</ul>
<p>Nothing but a home page.</p>
<div class="article-gallery">
<a href="https://images.cyotek.com/image/blog/archivedwebs/webs-60-home.png" class="gallery" title="Home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-60-home.png" alt="Home page" decoding="async" loading="lazy" /></a></div>
<h2 id="version-5.x">Version 5.x</h2>
<ul>
<li>Date: Oct1998</li>
<li>Technology: HTML</li>
<li>Editor: Microsoft FrontPage 3.0</li>
</ul>
<p>Quite a basic website, the only downloads available were for
HelpWrite Professional, our software for authoring Windows Help
files and a smattering of ActiveX controls authored using Visual
Basic 6. There was a small support section with a few Knowledge
Base articles and the de-fact Links page. All done via static
HTML files, although the download pages have a form bound to a
Perl script.</p>
<p>And of course, it wasn't enough to be Ariad Software, but Ariad
Software <em><strong>Online</strong></em>!</p>
<p>The main difference between the point versions was the
appearance, not the content.</p>
<div class="article-gallery">
<a href="https://images.cyotek.com/image/blog/archivedwebs/webs-52-home.png" class="gallery" title="5.2 Home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-52-home.png" alt="5.2 Home page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-52-product.png" class="gallery" title="5.2 Product page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-52-product.png" alt="5.2 Product page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-51-home.png" class="gallery" title="5.1 Home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-51-home.png" alt="5.1 Home page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-51-product.png" class="gallery" title="5.1 Product page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-51-product.png" alt="5.1 Product page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-50-home.png" class="gallery" title="5.0 Home page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-50-home.png" alt="5.0 Home page" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/archivedwebs/webs-50-product.png" class="gallery" title="5.0 Product page - " ><img src="https://images.cyotek.com/image/thumbnail/blog/archivedwebs/webs-50-product.png" alt="5.0 Product page" decoding="async" loading="lazy" /></a></div>
<h2 id="update-history">Update History</h2>
<ul>
<li>2019-03-13 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/website-history-gallery .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comWebCopy 1.7 - local file name generationurn:uuid:36aa7518-d4b5-4a9d-903e-ecf9fb8132aa2018-11-17T12:28:42Z2018-11-17T12:28:42Z<p>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.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-localfileoptions-1a.png" class="gallery" title="A screenshot of the adjusted Local Files configuration settings" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-localfileoptions-1a.png" alt="A screenshot of the adjusted Local Files configuration settings" decoding="async" loading="lazy" /></a><figcaption>A screenshot of the adjusted Local Files configuration settings</figcaption></figure><h2 id="preserving-the-original-extension">Preserving the original extension</h2>
<p>By default, WebCopy will name local files to match their content
type. For example, if you download the homepage of a website
which is named <code>index.php</code>, WebCopy will save a local file named
<code>index.html</code> - end users would probably very confused trying to
open a <code>.php</code> file and either the operating system doesn't know
how to handle it, or it executes the PHP runtime.</p>
<p>While this approach works, it does mean the original extension
is lost. For 1.7, we've introduced a new <strong>Keep original
extension</strong> option, located in the <strong>Local Files</strong> category.
When set, if WebCopy needs to change the extension, it includes
the original extension as well. Our hypothetical <code>index.php</code>
file would be called <code>index.php.html</code> when saved locally.</p>
<p>This option is currently enabled for all new projects, although
we are currently evaluating this. As with most new options, it
is not set for existing projects and must be explicitly enabled.</p>
<p>We've also fixed a bug where WebCopy would change extensions
when it shouldn't. For example, downloading <code>jpg</code> images would
cause the local files to have a <code>jpeg</code> extension. WebCopy now
only changes extensions if they don't match any registered
extension for the appropriate content type.</p>
<h2 id="using-query-strings-to-construct-the-local-file-name">Using query strings to construct the local file name</h2>
<p>The query string <a href="https://demo.cyotek.com/features/querystrings.php">demonstration page</a> includes links to a
page with two different query string</p>
<ul>
<li><code>https://demo.cyotek.com/features/querystringstest.php?section=alpha</code></li>
<li><code>https://demo.cyotek.com/features/querystringstest.php?section=beta</code></li>
</ul>
<p>Current versions of WebCopy only consider the page name for
local file generation, therefore when copying the demonstration
website the above examples are copied locally as</p>
<ul>
<li><code>querystringstest.html</code></li>
<li><code>querystringstest-1.html</code></li>
</ul>
<p>This can make very difficult to identify which page the offline
file originally belonged to.</p>
<p>WebCopy 1.7 introduces another new option, <strong>Use query string in
local file names</strong>, also found in the <strong>Local Files</strong> category.
When enabled, WebCopy will consider the query string of the URL
as well as the page name. With the option set, the pages above
would now be saved as</p>
<ul>
<li><code>querystringstest-section-alpha.html</code></li>
<li><code>querystringstest-section-beta.html</code></li>
</ul>
<p>Each key pair in the query string will be present in the
filename, separated by dashes. This option is currently not
enabled by default for new projects.</p>
<h2 id="are-these-options-helpful">Are these options helpful?</h2>
<p>As always we hope these new options will be useful to end users.
Would they be helpful for you? Do you think we should offer
other options? Please <a href="https://www.cyotek.com/contact">let us know</a>!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2018-11-17 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/webcopy-1-7-local-file-name-generation .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comWebCopy 1.7 - tls/ssl invalid certificate handlingurn:uuid:1938366c-5c89-457e-a421-a7a7fa59cdc62018-11-04T19:33:40Z2018-11-04T19:30:56Z<blockquote>
<p>You should add an option to ignore checking for an SSL
certificate.</p>
</blockquote>
<p>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 <strong>as the option is already there and has been
since 2013</strong>!</p>
<p>As a result a small usability change has been made to 1.7. Now,
when you copy a website, if your project hasn't been configured
to ignore SSL errors and it detects the primary website is using
an invalid certificate it will prompt you on what to do.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-ssl-1a.png" class="gallery" title="An example of WebCopy prompting how to handle an invalid certificate" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-ssl-1a.png" alt="An example of WebCopy prompting how to handle an invalid certificate" decoding="async" loading="lazy" /></a><figcaption>An example of WebCopy prompting how to handle an invalid certificate</figcaption></figure>
<p>In the above dialog, clicking <strong>Cancel</strong> will abort the crawl.
Clicking <strong>Ignore</strong> will resume crawling the website, ignoring
any certificate issues. There is also a <strong>View</strong> button to
display the actual certificate itself.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-ssl-1b.png" class="gallery" title="Viewing an invalid certificate using built in Windows tools" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-ssl-1b.png" alt="Viewing an invalid certificate using built in Windows tools" decoding="async" loading="lazy" /></a><figcaption>Viewing an invalid certificate using built in Windows tools</figcaption></figure>
<p>As it stands, I'm not really happy with the <em>Ignore Certificate
Errors</em> option as it will apply to any URL detected by the
crawl, including 3rd party domains. I've logged #338 to
investigate adding more control so you can ignore errors on
specific domains for example. Of course I'm fully aware this
will add even more complexity... in between a rock and a hard
place.</p>
<p>In 1.7, the SSL options have also been moved - previously they
were under the <strong>Advanced</strong> category, now they are under the
<strong>General</strong> category and so hopefully are easier to find.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-ssl-1c.png" class="gallery" title="The slightly reorganised Project Properties dialog" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-ssl-1c.png" alt="The slightly reorganised Project Properties dialog" decoding="async" loading="lazy" /></a><figcaption>The slightly reorganised Project Properties dialog</figcaption></figure>
<p>This new prompt is currently available in <a href="https://www.cyotek.com/cyotek-webcopy/downloads">1.7 nightly
builds</a>, please <a href="https://www.cyotek.com/contact">let us know</a> if the dialog helps or
hinders, or if you have any other feedback about either this
feature of WebCopy in general.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2018-11-04 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/webcopy-1-7-tls-ssl-invalid-certificate-handling .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comWebCopy 1.7 - web browser authenticationurn:uuid:9e50a583-41b0-4ac5-8ec9-69188caa94ec2018-10-31T17:05:59Z2018-10-31T17:05:59Z<p>There are five main features WebCopy (and Sitemap Creator) need
based on user feedback and our own observations. In no
particular order, these are making the product easier to use,
supporting multiple downloads at once, being able to pause and
resume a copy, JavaScript support and authentication. The
current plan is to address three of the five in WebCopy 1.7,
starting with authentication.</p>
<p>Since the earliest days of WebCopy, it has supported challenge
authentication (where a web browser prompts you for credentials)
and form based authentication (where you enter credentials into
a web page). Almost all web sites use the latter approach and
with WebCopy this can either be tricky to configure or
impossible due to websites using interactive methods such as
authenticators or captcha codes.</p>
<p>In order to resolve this, WebCopy 1.7 includes a new option
named <strong>Log in use web browser</strong>, found in the <strong>Passwords</strong>
property page.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-externallogin-1a.png" class="gallery" title="The new option to enable using a web browser for authentication" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-externallogin-1a.png" alt="The new option to enable using a web browser for authentication" decoding="async" loading="lazy" /></a><figcaption>The new option to enable using a web browser for authentication</figcaption></figure>
<p>When this new option is set, WebCopy will display a browser
window when you copy a website to allow you to authenticate with
the web site. Once authenticated, the cookies associated with
the site are applied to WebCopy's crawler and copying will
commence.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-externallogin-1b.png" class="gallery" title="Using an embedded web browser to authenticate with the website to be copied" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-externallogin-1b.png" alt="Using an embedded web browser to authenticate with the website to be copied" decoding="async" loading="lazy" /></a><figcaption>Using an embedded web browser to authenticate with the website to be copied</figcaption></figure>
<p>This new feature is currently available in <a href="https://www.cyotek.com/cyotek-webcopy/downloads">1.7 nightly
builds</a>, please <a href="https://www.cyotek.com/contact">let us know</a> if this feature helps
or hinders!</p>
<p>You can learn more about this feature and any caveats on the
<a href="https://docs.cyotek.com/cyowcopy/current/externalauthentication.html">documentation page</a>.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2018-10-31 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/webcopy-1-7-web-browser-authentication .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comWebCopy 1.5 beta releasedurn:uuid:68c7bafa-655c-4b3f-9d14-75d558c13d4e2018-06-11T18:51:43Z2018-06-11T18:38:54Z<p>A new beta of WebCopy has been released, one I hope will resolve
some of the plethora of uninstall feedback I've been receiving
recently relating to users having problems logging into web
sites using WebCopy.</p>
<h2 id="form-posting-fixes">Form Posting Fixes</h2>
<p>When WebCopy posts a form, it downloads the existing form, pulls
out all the values and merges these with the specific values the
user has configured. That way, you can easily post login forms
that include hidden parameters containing anti-forgery tokens or
other meta data that may be generated dynamically.</p>
<p>Unfortunately, the original implementation of this only
supported <code>input</code> elements, and to add to the tale of woe, the
unit tests for this feature only contained matching elements. It
was only by chance when I was testing the a new demo added to
our <a href="https://demo.cyotek.com">demonstration website</a> that omission was noted. WebCopy
now correctly detects <code>input</code>, <code>output</code>, <code>select</code>, <code>textarea</code>,
<code>object</code> and <code>button</code> elements, while excluding <code>reset</code>,
<code>button</code> and <code>image</code> input types.</p>
<p>If you come across a website that uses basic form posting and
you still can't log into it, please <a href="https://www.cyotek.com/contact">let us know</a> the URL of
the login form so we can investigate. <em>Please do <strong>not</strong> send
credentials for any website to Cyotek!</em></p>
<h2 id="capture-form-improvements">Capture Form Improvements</h2>
<p>In addition to this, the Capture Form tool has had a slight
overhaul. Previously, it used the HTML at the time the document
was rendered. Now, it uses the current state of the document,
allowing you to fill in form fields and have those values
reflected in the form definition that WebCopy will create.
Hopefully, this will help users avoid having to guess what
parameters may not may not be required to fill in and lead to an
easier experience.</p>
<h2 id="local-file-remapping">Local File Remapping</h2>
<p>Previous versions of WebCopy were somewhat inflexible in how
local files were remapped, leading to the incredibly confusing
situation where you could tell WebCopy to download a PHP
website, and the local filenames would still have a <code>.php</code>
extension instead of HTML (remember that WebCopy <a href="https://docs.cyotek.com/cyowcopy/current/crawllimits.html">cannot
download raw source</a>). As it also relied on content types
registered on the users computer, it was also possible that it
would use the wrong extension, or not be able to supply an
extension.</p>
<p>WebCopy now includes an embedded mime database of all registered
types, courtesy of <a href="https://github.com/jshttp/mime-db" rel="external nofollow noopener">mime-db</a> so that any valid content type
should be remapped appropriately. In addition, there's a new
default setting where WebCopy will remap <em>all</em> downloaded files
unless the content type is <code>application/octet-stream</code> (the type
usually used for binary downloads like executable programs).
Hopefully this too will address one of the poor initial
impressions that WebCopy can give.</p>
<h2 id="head-checking">HEAD Checking</h2>
<p>Another poor experience users have received from WebCopy is web
sites that don't support the <code>HEAD</code> method. This is supposed to
allow you to return the pertinent details of a resources, such
as its type and size, without having to download the entire
resource. This is a great feature for web crawlers, as it means
it can quickly check to see if it <em>should</em> download something
without downloading content it doesn't need. For this reason,
head checking is enabled by default in WebCopy projects.</p>
<p>If a server doesn't support the <code>HEAD</code> method for whatever
reason, then WebCopy's default behaviour would be to skip
processing that URL. Not a great experience if was the entry
point for the website and nothing was downloaded! WebCopy now
tries to be a bit smarter and keeps a map of each domain it
visited during the current crawl, and, if a <code>HEAD</code> check fails
for a given domain WebCopy will proceed with a normal <code>GET</code> and
disable head checking for that particular domain.</p>
<h2 id="and-more">And more</h2>
<p>In addition to the major user experience improvements above,
there are quite a number of bug fixes and minor tweaks, details
of which can be seen in the <a href="https://www.cyotek.com/cyotek-webcopy/revision-history">release notes</a>.</p>
<p>We would be very grateful for continued feedback into WebCopy,
every little helps!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2018-06-11 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/webcopy-1-5-beta-released .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comWebCopy 1.4 beta releasedurn:uuid:13d1eeeb-31d9-4758-a70d-0da1a6f6efa72018-04-15T13:22:38Z2018-04-15T13:19:52Z<p>A beta version of WebCopy 1.4 complete with a fundamental change
to how rules are ran, various performance improvements, UI
tweaks and miscellaneous bug fixes has been released.</p>
<h2 id="rule-changes">Rule Changes</h2>
<p>In previous versions of WebCopy, rule processing would stop as
soon as the first rule was matched. This made it impossible to
do standard tasks like exclude all HTML pages from being
downloaded (but still scan them) and only download image
resources, as an example.</p>
<p>Now rule processing will continue and the last match is the
final result. This allows for much better control over
processing. We've added a new <em>Stop Processing</em> flag too, so
that you can halt the processing when a desirable match is
found.</p>
<blockquote>
<p>All projects created with older versions of WebCopy will
automatically have the <em>Stop Processing</em> flag applied to
existing rules so that it behaves in a backwards compatible
manner.</p>
</blockquote>
<p>As a result of this change, the hacked in <em>Reverse</em> and <em>Do not
allow children to inherit this rule</em> flags are deprecated will
be removed in the next version of the software.</p>
<h2 id="improved-quick-scan">Improved Quick Scan</h2>
<p>When I was looking at metrics, I was shocked to see huge amount
of calls to the documentation for the Quick Scan dialog. On the
one hand, it was interesting to note that hyperlinks to more
information were being used, but on the other hand Quick Scan
was a hack I put in and the dialog was almost completely
useless. Oh, and the documentation for it wasn't very helpful
anyway.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-quickscan-1d.png" class="gallery" title="The original Quick Scan dialog" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-quickscan-1d.png" alt="The original Quick Scan dialog" decoding="async" loading="lazy" /></a><figcaption>The original Quick Scan dialog</figcaption></figure>
<p>We've made some improvements to the dialog so that it is now
hopefully useful. The main part of the dialog is now taken up
with a diagram showing the results of the quick scan. This
dialog updates in real time as you change options so you can get
a feel for how to configure the crawl.</p>
<p>You can also include or exclude domains and pages via a context
menu - this will set up additional hosts or rules as
appropriate.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-quickscan-1a.png" class="gallery" title="The new and improved Quick Scan dialog" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-quickscan-1a.png" alt="The new and improved Quick Scan dialog" decoding="async" loading="lazy" /></a><figcaption>The new and improved Quick Scan dialog</figcaption></figure>
<p>There's still more work to be done - the diagram control doesn't
support keyboard users at all, and really needs to be able to
zoom and so we'll continue to improve this over future updates.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-quickscan-1b.png" class="gallery" title="The diagram updates with a real-time preview of what will be downloaded" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-quickscan-1b.png" alt="The diagram updates with a real-time preview of what will be downloaded" decoding="async" loading="lazy" /></a><figcaption>The diagram updates with a real-time preview of what will be downloaded</figcaption></figure><h2 id="tweaked-editors">Tweaked Editors</h2>
<p>It has been a long annoyance to me the strange way list based
editors for Rules and Forms worked - it felt as though they went
out of their way to make it difficult to add or edit items.
These have now been rewrote to actually make sense, although
visually they look the same as they did previously.</p>
<p>You can also now reorder rules in their list by dragging and
dropping.</p>
<h2 id="rule-checker">Rule Checker</h2>
<p>A new tool for quickly checking rules has been added - this can
be useful if you want to test what rules will match a given URI.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-quickscan-1e.png" class="gallery" title="The new Rule Checker dialog in action" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-quickscan-1e.png" alt="The new Rule Checker dialog in action" decoding="async" loading="lazy" /></a><figcaption>The new Rule Checker dialog in action</figcaption></figure>
<p>You can activate this tool from the new button on the main
window although I expect this will be removed in a future update
when we try to de clutter the UI (it's also available from the
window's menu)</p>
<h2 id="performance">Performance</h2>
<p>Quite a few changes have been made to improve memory usage to
avoid &quot;Out of memory&quot; crashes which can occur just about
anywhere.</p>
<h3 id="url-lists">URL Lists</h3>
<p>Previously WebCopy would load all data into these lists at once.
Apart from the slow performance of filling lists with tens of
thousands of items, it doesn't help with memory usage. Now, the
lists are &quot;virtual&quot;, meaning they actually only contain enough
items to fill what's currently visible and the rest are fetched
when required. You can still sort the lists by any column or
search the lists, it's just a <em>lot</em> more efficient than it was.</p>
<h3 id="site-maps">Site maps</h3>
<p>We've also began work on reducing the memory requirements of
site maps, and while we've made some progress (viewing a website
diagram should be less likely to crash), there's some major work
needs to be done - the site map you see in the application can
have scant resemblance to its internal structure, and this will
take more time to resolve.</p>
<h2 id="bug-fixes">Bug fixes</h2>
<p>Quite a number of additional minor bugs have been fixed, view
the <a href="https://www.cyotek.com/cyotek-webcopy/revision-history">release notes</a> for more information.</p>
<h2 id="documentation">Documentation</h2>
<p>We've continued to iterate on the documentation in an effort to
improve it.</p>
<h2 id="continual-improvement">Continual improvement</h2>
<p>We hope this update is useful. Of course we'll continue to
improve WebCopy, there's still lots more to be done!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2018-04-15 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/webcopy-1-4-beta-released .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comOn Product Feedbackurn:uuid:0a276d27-0720-41b7-b48a-1d03a923a16a2017-10-22T16:58:37Z2017-10-22T16:58:37Z<p>It's been a few months since the installation programs for our
products were updated to request feedback on when the affected
product is uninstalled. Since percolating through our different
release channels we've been receiving more and more feedback,
particularly regarding WebCopy.</p>
<p>What surprises me is that while the vast majority is anonymous
&quot;reason code&quot; feedback without context, there is quite a lot of
quality and useful feedback describing problems and
shortcomings. Which is <em>really</em> helpful, and I wish I had
thought to put this in years ago. (It was only after a third
party tool I use prompted for feedback and then fixed the issue
that my feedback related to that I belatedly thought &quot;Oh,
wouldn't this be a good thing to do&quot;.)</p>
<p>There seems to be three rough groupings in regards to WebCopy
feedback</p>
<ul>
<li>Firstly, when WebCopy doesn't download a website properly due
to issues with the software</li>
<li>Secondly, when WebCopy doesn't download a website properly,
but the user didn't know that it would have if they had
modified project settings from their default values</li>
<li>Thirdly, that WebCopy is too hard to use</li>
</ul>
<h2 id="software-issues">Software Issues</h2>
<p>Fortunately, some users have take the time to explain the
problems they had using WebCopy, and either their descriptions
were valid enough for me to trace the issue, or they provided
contact details and provided additional details when I followed
up with them.</p>
<p>Regretfully however, some feedback would mention a problem, but
without any context (such as source website) or details that
would help me isolate the problem. As feedback can be anonymous
(which is perfectly fine), there's no way for me to follow up in
these cases.</p>
<p>Some feedback was noting the lack of features (e.g. multiple
downloads at once) which are on the list but just haven't been
implemented yet. Or the ability to copy dynamic JavaScript sites</p>
<ul>
<li>I'm going to have to get that done sooner rather than later,
but to support some of these features is going to require
changes to WebCopy's licensing model.</li>
</ul>
<h2 id="default-values">Default Values</h2>
<p>If there's one thing the feedback is proving, it is that a lot
of default values in WebCopy are no longer sensible defaults and
cause numerous issues that mean a site isn't copied correctly
and the user assumes it's a bug rather than bad settings.</p>
<p>As WebCopy has evolved over the years, many settings have been
added or expanded, but often are left at &quot;safe&quot; default values,
or it just wasn't considered to change the default. This is
something I'll be looking at in a future update, to go over all
WebCopy settings and redefine sensible defaults.</p>
<h2 id="too-hard-to-use">Too Hard To Use</h2>
<p>I was astounded when this feedback started appearing. When I
receive donations for the software, I usually respond with a
note thanking the user for the donation - and I would use words
such as &quot;stubborn&quot;, &quot;quirky&quot; or &quot;unwieldy&quot; to describe the
program. But while I always thought bits of the UI were clunky
to use, I never thought that the program as a whole was <em>that</em>
hard to use. Clearly I'm wearing blinkers when it comes to
WebCopy.</p>
<p>Changing the user interface is a fairly massive job, especially
to try and simplify it (which probably means Hide Almost
Everything once the default settings are resolved). One sensible
suggestion was to make use a of New Project wizard which would
ask questions and then configure a copy project accordingly,
that will be happening. I'd like to get a few more bugs out of
the way before I start tearing up the UI, but I've been
scribbling ideas on bits of paper and hopefully future versions
of WebCopy will be easier to use.</p>
<p>Also in the too hard to use camp were feedback items saying the
documentation was lacking. So I'll be looking at trying to make
the documentation more comprehensive too, as well as expanding
the Knowledge Base with better tips and helpers that don't
belong in the core docs.</p>
<h2 id="moving-forward">Moving Forward</h2>
<p>Although I'd guess that most of the users who try and discard
WebCopy as not being fit for purpose will never see this post,
I'd like to say a heartfelt <strong>thank you</strong> to everyone who has
provided feedback and I hope future versions of WebCopy will be
that much better because of it.</p>
<p>It's also worth pointing out that submitted feedback isn't going
into a bin where it will be stamped on by some angry bytes -
your feedback is being read by real humans and real humans are
following up if more information is required or ensuring that
genuine issues are logged in our issue tracker tracker to be
fixed in future versions of the product.</p>
<p>And if you download any Cyotek product yourself and decide you
don't like it - that's absolutely fine. But if you could take
just a couple of minutes to explain why it wasn't suitable for
you that could be of enormous help to us - the more detail the
merrier. And it won't hurt our feelings <em>too</em> much - honest
feedback is appreciated!</p>
<p>And, you can always <a href="https://www.cyotek.com/contact">contact us</a> with bug reports or suggestions.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2017-10-22 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/on-product-feedback .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comForgotten Developments 01 - The Roguelikeurn:uuid:d779b04f-f19d-480d-8916-e219a2d13f562017-07-03T05:36:18Z2017-07-03T04:25:29Z<p>Shortly after getting our Boulder Dash clone to a playable state
and celebrating the fact that a game had finally been
&quot;completed&quot;, I wanted to create something more original and
decided to create a <a href="https://en.wikipedia.org/wiki/Roguelike" rel="external nofollow noopener">roguelike</a>.</p>
<p>Work on this new game proceed reasonably well and I had a
playable prototype where you could run around a multi-levelled
procedurally generated dungeon, each level of which was
populated with items and monsters. The game was fully data
driven using object composition rather than fixed inheritance.
Components were a mix of C# and Lua.</p>
<p>Development of the game was halted and to date hasn't resumed.
Plus, if I remember correctly I broke the OpenGL engine we use
and so the game doesn't render correctly any more.</p>
<p>I recently found a bunch of screenshots from mid 2013 back when
I thought I might do a sort of &quot;Screenshot Saturday&quot; charting
how the game evolved. They show that I couldn't make my mind up
about the HUD for the game, and judging from the last screenshot
the monster generation is out of hand.</p>
<p>As I have no idea if or when this project will ever get resumed
I decided to post these images as footnote to some of Cyotek's
forgotten developments.</p>
<h2 id="resource-credits">Resource Credits</h2>
<p>The pixel art graphics are from a tileset called
<a href="http://eight2empire.blogspot.co.uk" rel="external nofollow noopener">eight2empire</a>; sadly this hasn't been updated since even
before these screenshots were taken but it is still a fairly
comprehensive set of tiles with features that other tilesets
don't have. With that said, if/when this project gets put back
on the front burner I'll be replacing it with something higher
resolution.</p>
<p>I couldn't find any information to hand on the source of the
graphics I used for the earliest HUD iterations - I'll update
this post with credits when I find out. Some of the latter
images are using elements from <a href="https://opengameart.org/content/golden-ui-bigger-than-ever-edition" rel="external nofollow noopener">Golden
UI</a>.</p>
<p>Apparently I couldn't make my mind up which fonts to use either,
some of the ones featured in the screenshots include <a href="http://members.bitstream.net/%7Emarksim/atarimac/fonts.html" rel="external nofollow noopener">Atari
Classic Chunky</a> (link not working at time of posting),
<a href="http://www.dafont.com/drakoheart-leiend.font" rel="external nofollow noopener">Drakoheart Leiend</a>, <a href="http://www.dafont.com/barkentina-1.font" rel="external nofollow noopener">Barkentina 1</a> and <a href="http://www.dafont.com/8bitoperator-jve-old1.font" rel="external nofollow noopener">8bitoperator
JVE</a>.</p>
<h2 id="screenshot-gallery">Screenshot Gallery</h2>
<div class="article-gallery">
<a href="https://images.cyotek.com/image/blog/untitled/20130530 212024.png" class="gallery" title="2013-05-30 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130530 212024.png" alt="2013-05-30" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130530 212045.png" class="gallery" title="2013-05-30 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130530 212045.png" alt="2013-05-30" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130530 2121.png" class="gallery" title="2013-05-30 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130530 2121.png" alt="2013-05-30" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130530 2141.png" class="gallery" title="2013-05-30 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130530 2141.png" alt="2013-05-30" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130531 1728.png" class="gallery" title="2013-05-31 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130531 1728.png" alt="2013-05-31" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130601 091733.png" class="gallery" title="2013-06-01 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130601 091733.png" alt="2013-06-01" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130601 091737.png" class="gallery" title="2013-06-01 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130601 091737.png" alt="2013-06-01" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130601 091749.png" class="gallery" title="2013-06-01 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130601 091749.png" alt="2013-06-01" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130601 0919.png" class="gallery" title="2013-06-01 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130601 0919.png" alt="2013-06-01" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130601 0920.png" class="gallery" title="2013-06-01 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130601 0920.png" alt="2013-06-01" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130601 0921.png" class="gallery" title="2013-06-01 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130601 0921.png" alt="2013-06-01" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130601 0925.png" class="gallery" title="2013-06-01 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130601 0925.png" alt="2013-06-01" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130615 1019.png" class="gallery" title="2013-06-15 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130615 1019.png" alt="2013-06-15" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130615 1021.png" class="gallery" title="2013-06-15 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130615 1021.png" alt="2013-06-15" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130622 1044.png" class="gallery" title="2013-06-22 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130622 1044.png" alt="2013-06-22" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130622 1045.png" class="gallery" title="2013-06-22 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130622 1045.png" alt="2013-06-22" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130625 1838.png" class="gallery" title="2013-06-25 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130625 1838.png" alt="2013-06-25" decoding="async" loading="lazy" /></a><a href="https://images.cyotek.com/image/blog/untitled/20130707 1132.png" class="gallery" title="2013-07-07 - " ><img src="https://images.cyotek.com/image/thumbnail/blog/untitled/20130707 1132.png" alt="2013-07-07" decoding="async" loading="lazy" /></a></div>
<h2 id="update-history">Update History</h2>
<ul>
<li>2017-07-03 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/forgotten-developments-01-the-roguelike .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comPalette Editor 1.6; in and outurn:uuid:e9120386-e271-4445-b271-4e1d258d6e7d2021-10-08T07:20:45Z2017-07-02T15:48:19Z<p>A new release of <a href="https://www.cyotek.com/cyotek-palette-editor">Cyotek Palette Editor</a> is now available.
The focus of this release is to expand on how you get data in
and out of the Palette Editor.</p>
<h2 id="import-and-export">Import and Export</h2>
<p>To start with, the original <strong>Import Palette</strong> feature of
previous versions has been replaced with an <strong>Import and Export
Wizard</strong>. This provides the same import palette functionality of
previous versions, but also now provides the ability to export
the current palette to any other format.</p>
<p>A new CSS Import plugin is also available, which will scan a CSS
file and look for HEX and RGB colors to import. And if you can
import CSS, then you may wish to export CSS too, so we've
provided that ability too.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/paled-2a.png" class="gallery" title="Exporting a palette into CSS" ><img src="https://images.cyotek.com/image/thumbnail/blog/paled-2a.png" alt="Exporting a palette into CSS" decoding="async" loading="lazy" /></a><figcaption>Exporting a palette into CSS</figcaption></figure>
<blockquote>
<p>Tip: The first iteration of CSS Import doesn't actually parse
CSS directly, instead it looks for color values. So you could
actually use it to extract colors from any plain text document
which contains hexadecimal colors!</p>
</blockquote>
<h2 id="printing">Printing</h2>
<p>Although printing feels a little old fashioned, well Cyotek
feels that way too sometimes! The palette editor now offers a
handy print function that lets you print out the contents of a
color palette.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/paled-2b.png" class="gallery" title="Previewing the output before printing a palette" ><img src="https://images.cyotek.com/image/thumbnail/blog/paled-2b.png" alt="Previewing the output before printing a palette" decoding="async" loading="lazy" /></a><figcaption>Previewing the output before printing a palette</figcaption></figure><h2 id="templates">Templates</h2>
<p><a href="https://www.cyotek.com/cyotek-spriter">Spriter</a> and <a href="https://www.cyotek.com/cyotek-slicr">Slicr</a> both offer templating support.
Spriters template support is a token replacement system, while
Slicr uses <a href="https://en.wikipedia.org/wiki/ASP.NET_Razor" rel="external nofollow noopener">Razor</a> templates. Both have their advantages and
their weaknesses.</p>
<p>The Palette Editor now supports templates too, using Shopify's
<a href="https://shopify.github.io/liquid/" rel="external nofollow noopener">Liquid</a> language. This allows a template to be more advanced
than just token replacement, without having to know an entire
programming language or introducing security risks. And it is
fast to use, without the burden of having to compile Razor
templates.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/paled-2c.png" class="gallery" title="Example templates" ><img src="https://images.cyotek.com/image/thumbnail/blog/paled-2c.png" alt="Example templates" decoding="async" loading="lazy" /></a><figcaption>Example templates</figcaption></figure>
<p>Using templates you can export a palette to your own custom or
standard format with ease. Does the CSS Export plugin not
produce CSS to your exact requirements? No problem, create a
custom template. Instead of having a static image, perhaps you'd
like to generate a HTML swatch page - you can do that too. There
are lots of possibilities.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/paled-2d.png" class="gallery" title="Editing a template with live preview" ><img src="https://images.cyotek.com/image/thumbnail/blog/paled-2d.png" alt="Editing a template with live preview" decoding="async" loading="lazy" /></a><figcaption>Editing a template with live preview</figcaption></figure><figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/paled-2e.png" class="gallery" title="Output from a modern HTML swatch template" ><img src="https://images.cyotek.com/image/thumbnail/blog/paled-2e.png" alt="Output from a modern HTML swatch template" decoding="async" loading="lazy" /></a><figcaption>Output from a modern HTML swatch template</figcaption></figure>
<p>There's also a command line client for running templates, so you
can automatically generate content for a given palette as part
of a batch or script process.</p>
<h2 id="color-swatch-images">Color Swatch Images</h2>
<p>The <strong>Create Preview Image</strong> feature (now renamed to <strong>Create
Swatch Image</strong>) has also had a minor upgrade. It now supports an
improved version of the preset system originally introduced in
<a href="https://www.cyotek.com/cyotek-gif-animator">Gif Animator</a> making it easy to create custom styles that
you can switch between.</p>
<p>It is now also possible to directly copy a swatch image to the
clipboard without having to open the swatch image dialog first
or generate an output file. You can also copy the preview image
directly from the swatch image dialog too.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/paled-2f.png" class="gallery" title="Using presets" ><img src="https://images.cyotek.com/image/thumbnail/blog/paled-2f.png" alt="Using presets" decoding="async" loading="lazy" /></a><figcaption>Using presets</figcaption></figure><h2 id="more-information">More information</h2>
<ul>
<li><a href="https://docs.cyotek.com/cyopaled/current/importexport.html">Import Export</a></li>
<li><a href="https://docs.cyotek.com/cyopaled/current/paletteprint.html">Printing</a></li>
<li><a href="https://docs.cyotek.com/cyopaled/current/templates.html">Templates</a></li>
</ul>
<h2 id="help-us-improve">Help us improve</h2>
<p>You can grab beta builds of version 1.6 from the <a href="https://www.cyotek.com/cyotek-palette-editor/downloads">downloads</a>
page.</p>
<p>How would <em>you</em> like to see the palette editor improve? Recent
suggestions included the ability to generate a series of colors
with hue shifting - now on the road-map. We'd love to hear your
suggestions too!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2017-07-02 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/palette-editor-1-6-in-and-out .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comTransforming hyperlinks when copying websitesurn:uuid:36bbfb34-0cc9-414b-9ade-00773500c8e22017-05-29T14:03:55Z2017-05-29T12:57:44Z<p>Recently a website I infrequently use was badly defaced, and in
the course of repairing the damage the owners of the site
temporarily took it down. As I found it to be a very useful
resource I lamented not having an offline copy and so when the
site was restored, I decided to make a copy without further ado.</p>
<p>However, as I swiftly discovered, that was a problem - the site
used JavaScript for many internal links, and WebCopy doesn't
support JavaScript. Somewhat fortunately, when I looked at how
the JavaScript links functioned, I discovered they were all of a
predicable nature - a call to a single function with two string
arguments. The destination URL was a simple concatenation of
these arguments with no extra processing.</p>
<p>Although WebCopy is our most popular product, it actually got
started accidentally as an offshoot of Sitemap Creator to make a
copy of a long forgotten website. And the reason for bringing up
that trivia is that right from the start Sitemap Creator had a
feature where it could transform page titles to remove the extra
text these typically have. This functionality has now been
re-purposed to allow WebCopy to intercept a URI at the detection
stage and transform it into something different.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-uri-transforms-1b.png" class="gallery" title="New options for replacing detected URI strings are now available" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-uri-transforms-1b.png" alt="New options for replacing detected URI strings are now available" decoding="async" loading="lazy" /></a><figcaption>New options for replacing detected URI strings are now available</figcaption></figure><h2 id="what-can-you-use-it-for">What can you use it for?</h2>
<p>The initial use case is to transform values from one form into
another in a predicable fashion, for example to remove calling
an interim page or to handle very simple JavaScript.</p>
<h2 id="how-do-you-use-it">How do you use it?</h2>
<p>You can find the configuration settings in the <strong>URI
Transforms</strong> section of the <strong>Project Properties</strong> dialog.</p>
<p>Each replacement is comprised of a <em>Pattern</em>, a <em>Replacement</em>
and an optional <em>URI</em>. The pattern is a regular expression which
is used to both match the source link and define any result
groups. Replacement is another expression which defines how the
URI is transformed. Finally, URI can be used to only perform the
pattern matching on links belonging to a given URI.</p>
<p>Regular expressions are a vast and complicated topic and it
would be nice if WebCopy didn't depend so much on them - they
don't make WebCopy very easy to use in many respects. WebCopy
does include a basic editor for expressions which can be quite
handy for testing patterns and replacements but it could be
improved.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-uri-transforms-1a.png" class="gallery" title="The built in editor can help with testing regular expressions" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-uri-transforms-1a.png" alt="The built in editor can help with testing regular expressions" decoding="async" loading="lazy" /></a><figcaption>The built in editor can help with testing regular expressions</figcaption></figure><h2 id="usage-scenario-cutting-out-the-middle-man">Usage Scenario: Cutting out the middle man</h2>
<p>One use case is for cutting out an interim page. For example,
one page may ultimately link to another, but it does this by
first calling an interim page with a query string argument
describing the destination. The interim page will perform some
action (such as logging the &quot;click&quot;, showing a timed advert,
etc.) and then navigate to the destination. By using a
transform, we can manipulate the URL to discard the interim page
and just go directly to the destination, remapping the source
link appropriately.</p>
<p>The WebCopy <a href="https://demo.cyotek.com/javascript/uritransform.php">demonstration page</a> includes an example of this
behaviour. The <strong>Middleman Redirect</strong> link will navigate to
<code>redirecttracker.php?url=uritransformfinal.php</code>. We can use a
simple pattern to strip out the bulk of the URL and just keep
the query string parameter.</p>
<ul>
<li>Pattern: <code>redirecttracker\.php\?url=(.*)</code></li>
<li>Replacement: <code>$1</code></li>
</ul>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-uri-transforms-1d.svg" class="gallery" title="Breakdown of a pattern for capturing simple redirection links" ><img src="https://images.cyotek.com/image/blog/webcopy-uri-transforms-1d.svg" alt="Breakdown of a pattern for capturing simple redirection links" decoding="async" loading="lazy" /></a><figcaption>Breakdown of a pattern for capturing simple redirection links</figcaption></figure>
<p>This pattern matches <code>redirecttracker.php?url=</code> and captures
everything after in a group. The replacement then simply outputs
the contents of the group, <code>uritransformfinal.php</code> in the above
example.</p>
<p>If you tell WebCopy to crawl the demonstration site without the
above transform, it will find <code>uritransformfinal.php</code>, but the
source page will still point to the original redirection page.
With the above transform in place, WebCopy will never know that
<code>redirecttracker.php</code> exists - it will skip directly the final
page.</p>
<h2 id="usage-scenario-converting-simple-javascript-links">Usage Scenario: Converting simple JavaScript links</h2>
<p>For a more advanced example, the <a href="https://demo.cyotek.com/javascript/uritransform.php">demonstration page</a> also
has three hyperlinks with the following <code>href</code> attributes</p>
<ul>
<li><code>javascript:openPage('1', 'index')</code></li>
<li><code>javascript:openPage('1', 'second')</code></li>
<li><code>javascript:openPage('2', 'index')</code></li>
</ul>
<p>Clicking the first link will navigate to <code>1-index.php</code>, the
second to <code>1-second.php</code> and the third to <code>2-index.php</code>. While
not really best practice for modern websites, this mirrors the
behaviour of original site I wanted to copy.</p>
<p>If you do a normal scan using WebCopy, while it will detect all
three links above, it will silently ignore them. To get WebCopy
to correctly process these links we need to detect the calls to
the <code>openPage</code> function, and construct a replacement URI using
the two parameters, plus an extension.</p>
<p>This can be done with the following transform</p>
<ul>
<li>Pattern: <code>javascript:openPage\('(.*)',\s?'(.*)'\)</code></li>
<li>Replacement: <code>$1-$2.php</code></li>
</ul>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-uri-transforms-1e.svg" class="gallery" title="Breakdown of a pattern for capturing simple JavaScript links" ><img src="https://images.cyotek.com/image/blog/webcopy-uri-transforms-1e.svg" alt="Breakdown of a pattern for capturing simple JavaScript links" decoding="async" loading="lazy" /></a><figcaption>Breakdown of a pattern for capturing simple JavaScript links</figcaption></figure>
<p>The above expression will first try and match
<code>javascript:openPage('</code> (braces are escaped with <code>\</code> as they are
special characters). It will then capture any characters between
the first set of single quotes into a capture group. After the
closing quote, it will then match a <code>,</code> character. The <code>\s</code>
token means to match any white space character, and the <code>?</code>
makes it optional. Next the pattern captures any characters
between the second set of single quote characters and matches a
closing brace. In fairness, the pattern could be simplified
further, but then it would look even more confusing to newcomers
so I've tried to keep it more explicit.</p>
<p>The replacement expression basically combines the two groups
(the <code>$1</code> and <code>$2</code> tokens represent capture groups from the
pattern) with a <code>-</code> between them and then adding the <code>.php</code>
extension.</p>
<p>Now when scanning the demonstration website, WebCopy will find
those three links and automatically transform them, therefore
finding and downloading the linked pages. At the end of the
copy, when WebCopy remaps downloaded HTML to ensure links are
local to the copy, it will also replace the source links with
the transformed name.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-uri-transforms-1c.png" class="gallery" title="Links dialog showing that WebCopy has successfully downloaded pages previously only accessible via JavaScript" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-uri-transforms-1c.png" alt="Links dialog showing that WebCopy has successfully downloaded pages previously only accessible via JavaScript" decoding="async" loading="lazy" /></a><figcaption>Links dialog showing that WebCopy has successfully downloaded pages previously only accessible via JavaScript</figcaption></figure><h2 id="getting-the-build">Getting the build</h2>
<p>Currently this functionality is only available in nightly
builds, available from the WebCopy <a href="https://www.cyotek.com/cyotek-webcopy/downloads">download page</a>.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2017-05-29 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/transforming-hyperlinks-when-copying-websites .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comDynamic color schemes now available in Palette Editor (+ localization)urn:uuid:8e47c7fd-0644-40de-af8c-ae168ed940342017-05-09T17:46:19Z2017-05-09T17:46:19Z<p>Back in 2014, I posted a <a href="https://blog.cyotek.com/post/a-sneak-peak-at-upcoming-features-for-the-color-palette-editor">brief article</a> with a sneak peak at
upcoming color scheme functionality and undo/redo support. While
the undo/redo feature was deployed with the next build of the
software, color schemes have been languishing incomplete and
only available within debug builds for over two years. I'm
pleased to say that finally that color schemes are going to see
the light of day as the first step in making Palette Editor more
than just a mere editor.</p>
<h2 id="color-schemes">Color Schemes</h2>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/paled-1a.png" class="gallery" title="Viewing live color schemes in Palette Editor" ><img src="https://images.cyotek.com/image/thumbnail/blog/paled-1a.png" alt="Viewing live color schemes in Palette Editor" decoding="async" loading="lazy" /></a><figcaption>Viewing live color schemes in Palette Editor</figcaption></figure>
<p>The Color Schemes feature originally demonstrated has now been
tidied up and is available for general use. By selecting a base
color, a number of different sets of harmonious colors are
generated. The UI lets you easily add all colors in a set to the
current palette, or individual swatches. You can learn a little
more from the <a href="https://docs.cyotek.com/cyopaled/current/aboutpaletteschemes.html">online documentation</a>.</p>
<p>The following schemes ship with the editor</p>
<ul>
<li>Analogous</li>
<li>Complementary</li>
<li>Harmonious</li>
<li>Monochromatic</li>
<li>Split-Complimentary</li>
<li>Square</li>
<li>Tetradic</li>
<li>Triadic</li>
</ul>
<p>Currently these schemes are hard coded into the application but
a future update will allow these to be user defined for more
flexibility.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/paled-1c.png" class="gallery" title="Context menu for working with individual colors in a scheme" ><img src="https://images.cyotek.com/image/thumbnail/blog/paled-1c.png" alt="Context menu for working with individual colors in a scheme" decoding="async" loading="lazy" /></a><figcaption>Context menu for working with individual colors in a scheme</figcaption></figure><h2 id="localization">Localization</h2>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/paled-1b.png" class="gallery" title="Cyotek Color Palette Editor - with localization support" ><img src="https://images.cyotek.com/image/thumbnail/blog/paled-1b.png" alt="Cyotek Color Palette Editor - with localization support" decoding="async" loading="lazy" /></a><figcaption>Cyotek Color Palette Editor - with localization support</figcaption></figure>
<p><a href="https://www.cyotek.com/cyotek-gif-animator">Gif Animator</a> was the first Cyotek product to offer some
localization support and by building on the lessons learned from
that, has now also been added to the Palette Editor.</p>
<p>In the currently nightly builds localization support is limited
in some respects and there are the same set of caveats that
apply to Gif Animator.</p>
<ul>
<li>Documentation is not localized, and it is likely to remain so</li>
<li>Not all UI components have been localized. Specifically, a
number of common dialogs have yet to have localization support
enabled.</li>
<li>All non-English translations are provided via machine
translations and its pretty likely that some may be inaccurate
or out of context</li>
<li>Some dialogs will reflow to fit larger (or smaller) text
translations, but the majority are fixed and translated text
may therefore not fit correctly</li>
<li>The application will always default to English instead of
trying to map the current locale - the language can be set in
the <a href="https://docs.cyotek.com/cyopaled/current/optionslanguage.html">options dialog</a>.</li>
</ul>
<h2 id="bug-fixes">Bug Fixes</h2>
<p>Version 1.5 also has a number of bug fixes, including a nasty
performance issue on Windows 7 and various corrections to copy
and paste handling. A full list of corrections can be found on
the <a href="https://www.cyotek.com/cyotek-palette-editor/upcoming-changes">upcoming changes</a> page.</p>
<h2 id="feedback-welcome">Feedback Welcome</h2>
<p>You can grab beta builds of version 1.5 from the <a href="https://www.cyotek.com/cyotek-palette-editor/downloads">downloads</a>
page.</p>
<p>How would <em>you</em> like to see the palette editor improve?</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2017-05-09 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/dynamic-color-schemes-now-available-in-palette-editor-localization .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comIntroducing Delete Profilesurn:uuid:d5325269-340a-48cb-b12e-cca1344670792017-02-23T19:33:29Z2017-02-23T19:33:29Z<p>Since CopyTools was first introduced, it has supported the
copying and moving files only. While files could be deleted,
this was only as part of a mirrored profile job and not
something you could directly control. CopyTools now has a new
dedicated job type for deleting files from a source folder,
along with new options for including files by date. I think this
feature was first requested back in 2014 - it's been a while
coming.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/delete-job-preview.png" class="gallery" title="Previewing a delete job" ><img src="https://images.cyotek.com/image/thumbnail/blog/delete-job-preview.png" alt="Previewing a delete job" decoding="async" loading="lazy" /></a><figcaption>Previewing a delete job</figcaption></figure><h2 id="selecting-the-copy-mode">Selecting the copy mode</h2>
<p>Existing builds of CopyTools require you to select your source
and destination folders, and then choose how files are to be
copied. Clearly that couldn't work with delete jobs as there are
no destinations. So the <strong>Edit Profile</strong> dialog has been
reworked so that the very first question you're asked is what
you want to do.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/editprofile-1a.png" class="gallery" title="Selecting a job type in the updated UI" ><img src="https://images.cyotek.com/image/thumbnail/blog/editprofile-1a.png" alt="Selecting a job type in the updated UI" decoding="async" loading="lazy" /></a><figcaption>Selecting a job type in the updated UI</figcaption></figure>
<blockquote>
<p>Note the UI is subject to change, while I like the clear
ability to see all available options instead of a combo box,
buttons aren't really appropriate controls to use, and control
labelling still refers to &quot;copy&quot;</p>
</blockquote>
<p>Once you have selected a mode the wizard steps will be updated
to include or exclude the <strong>Destination</strong> stage if appropriate.</p>
<h2 id="selecting-the-files-to-delete">Selecting the files to delete</h2>
<p>As well as the new copy mode UI, the <strong>Files to copy</strong> stage has
also been reworked by splitting it into new sections.</p>
<p>The <strong>Inclusions and Exclusions</strong> section has the original
options for choosing which files to include and which to
exclude.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/editprofile-1c.png" class="gallery" title="The redesigned Files to Copy tab" ><img src="https://images.cyotek.com/image/thumbnail/blog/editprofile-1c.png" alt="The redesigned Files to Copy tab" decoding="async" loading="lazy" /></a><figcaption>The redesigned Files to Copy tab</figcaption></figure>
<p>A new section has been added, <strong>Old and New Files</strong>. This allows
you to select files based on age and allows the use of absolute
or sliding values. For example, you might want to delete all log
files over 90 days old. However, it doesn't just apply to delete
jobs - equally, you might want to archive all log files over 90
days old, which you could do just as easily.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/editprofile-1d.png" class="gallery" title="Configuring date filter options" ><img src="https://images.cyotek.com/image/thumbnail/blog/editprofile-1d.png" alt="Configuring date filter options" decoding="async" loading="lazy" /></a><figcaption>Configuring date filter options</figcaption></figure><h2 id="deleting-empty-folders">Deleting empty folders</h2>
<p>We've also introduced a new flag (accessed from the <strong>Copy
Mode</strong> stage) that lets you select if empty folders should be
deleted. When this flag is set, CopyTools will delete any
existing empty folders it finds while determining which files to
copy. For delete job types, it will also apply to any folders
which are empty due to their contents being deleted by the job.</p>
<h2 id="retry-and-error-options">Retry and error options</h2>
<p>Also new in the current nightly are new options for controlling
what happens when CopyTools can't copy a file. Previously, it
would just log the failure and move on, but now you can choose
between the following options</p>
<ul>
<li>Do nothing</li>
<li>Wait, then retry the copy once more</li>
<li>Retry the copy at the end of the run</li>
</ul>
<p>The time that CopyTools waits before retrying is available, but
there's currently no UI setting for it - that will follow in
another update.</p>
<p>Currently files are only retried once. Potentially I'll be
adding a configurable number of retries in a future build.</p>
<p>You can also configure what happens when CopyTools encounters a
problem, such as not being able to copy a file and opt to either
ignore the error, or cancel the entire profile.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/editprofile-1e.png" class="gallery" title="The updated Copy Mode stage with new options for how errors are handled, and no options for setting the copy mode" ><img src="https://images.cyotek.com/image/thumbnail/blog/editprofile-1e.png" alt="The updated Copy Mode stage with new options for how errors are handled, and no options for setting the copy mode" decoding="async" loading="lazy" /></a><figcaption>The updated Copy Mode stage with new options for how errors are handled, and no options for setting the copy mode</figcaption></figure><h2 id="getting-the-new-build">Getting the new build</h2>
<blockquote>
<p>Important! Please check the notes in the <a href="https://blog.cyotek.com/post/introducing-copytools-2-0#getting-the-alpha">CopyTools 2.0
announcement</a> post for details about differences between v1
and v2 profile files, and known issues.</p>
</blockquote>
<p>The delete job type, date filtering options and retry options
are available in the current CopyTools 2.0 alpha, which can be
obtained from the <a href="https://www.cyotek/cyotek-copytools/downloads" rel="external nofollow noopener">nightlies</a> download section.</p>
<h2 id="updating-stable-releases">Updating stable releases</h2>
<p>I'm very aware that since the <a href="https://blog.cyotek.com/post/introducing-nightly-builds">nightlies</a> were introduced the
number of stable releases has plummeted as we've just been
relying on the latest builds being available, despite the fact
they don't show up as upgrades for stable builds and not all
users are comfortable using them. This is something we'll be
addressing over the coming months, by releasing stable builds of
products and then getting back into a regular release cadence.
And getting the documentation back in sync!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2017-02-23 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/introducing-delete-profiles .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comIntroducing CopyTools 2.0urn:uuid:d4a27c19-6e29-4962-9791-4814d42429232016-11-29T17:04:57Z2016-11-29T17:04:57Z<p>Out of our product range, my own personal favourite is
CopyTools. This program has been working in the background for
years quietly ensuring every digital file of import is backed
up, and even performing some maintenance tasks such as
downloading Azure SQL databases.</p>
<p>As with most software it is by no means flawless, and recent
(internal) builds compounded the issue rather than improving it.
Although it was originally supposed to support remote sources
such as FTP servers and Azure blob storage, the model was too
rigid and in order to add this support would require massive
changes to program's core, instead of supporting the
extensibility model that most Cyotek products offer.</p>
<p>As a result of this, for the last few months we've essentially
ignored all other products while we worked on what has now
become CopyTools version 2 and we can now offer the first alpha
build of version 2.0.</p>
<p>While it's flagged as alpha, I can state that it has been
running in production for a month now without major incident.
But still, given the purpose of CopyTools, I feel an &quot;alpha&quot;
status is appropriate at this stage, especially as I haven't
really retested all the UI options.</p>
<blockquote>
<p>Again, just to be clear - this is an <strong>alpha</strong> build. Just
because I'm running it in production doesn't mean you should.
<strong>Here be dragons!</strong></p>
</blockquote>
<h2 id="whats-new">What's new</h2>
<p>The user interface, by and large, remains the same - there small
changes here and there, but it's pretty much the same as before.
A lot of the work involved rewriting the core engine along with
a huge effort in expanding the test suite.</p>
<p>The main new feature of this build is end point support. As I
mentioned in my intro, originally CopyTools was supposed to
support local file copies and FTP. Instead it ended up being
local file support and compressed archive support bolted on top
of that. Now however, end points are properly defined, and are
not tied to the core engine, meaning they can be replaced at
will.</p>
<p>New options for retrying files that are in use were also added,
but there's no UI exposure yet so these options are currently
unavailable.</p>
<h3 id="ftp">FTP</h3>
<p>CopyTools now includes basic FTP support. This new end point is
bi-directional, which means means you can easily copy from an
FTP server to a local system, local files to an FTP server, or
even FTP server to FTP server.</p>
<h3 id="command-line-execution">Command line execution</h3>
<p>We've also included a command line client for previewing or
executing profiles. This was initially written solely to provide
a quick means of running the engine for performance/memory
profiling scenarios, but is now part of the core product and can
be used in scripting or task scenarios.</p>
<h2 id="getting-the-alpha">Getting the alpha</h2>
<blockquote>
<p>You should uninstall version 1 prior to installing version 2
otherwise obsolete program files are left behind</p>
</blockquote>
<p>You can download the alpha from the <a href="https://www.cyotek.com/cyotek-copytools/downloads">Nightly
Builds</a> page.</p>
<blockquote>
<p>CopyTools 2.0 stores profiles in a different file
(<code>profiles.xml</code>) from version 1 (<code>profiles.ctp</code>). When
installing the alpha, your profiles will be automatically
migrated, leaving the original profiles intact - allowing you
to easily revert back to version 1 if required</p>
</blockquote>
<p>After installing CopyTools, the setup program will launch the
program with the poller <strong>suspended</strong>. Before either resuming
the poller, or restarting CopyTools you should check that all
profiles were successfully migrated. For profiles using
inclusion/exclusion masks, it is also strongly recommended you
preview the profiles first to ensure the masks operate as
expected (see <strong>Known Issues</strong> for more details).</p>
<h2 id="known-issues">Known issues</h2>
<h3 id="help-files">Help files</h3>
<p>Help files haven't been updated for this build.</p>
<h3 id="profiles-using-inclusionexclusion-masks">Profiles using inclusion/exclusion masks</h3>
<p>The method by which inclusion/exclusion masks are processed has
been changed. As a consequence, it is possible that there could
be subtle differences and files that were previously excluded
may not now be and vice versa. We strongly recommend that you
preview any profiles using inclusion/exclusion masks and check
the preview looks correct.</p>
<p>If the preview does not look correct and is including (or
excluding) files that it shouldn't be, please <a href="https://www.cyotek.com/contact">contact
us</a>, including the full path and name of the file, and
the relevant mask.</p>
<h3 id="profile-flags">Profile flags</h3>
<p>The <em>use multi thread directory scanning</em> flag is currently
ignored.</p>
<h3 id="command-line-client">Command line client</h3>
<p>If the command line client is used to run a profile while the
GUI client is running, the GUI client will not update to reflect
the last run and outcome. It will also overwrite that
information when it next runs any other profile.</p>
<p>In addition, if both the CLI and the GUI try to run a profile
that is using the same log file, one of the processes will fail.</p>
<h3 id="access-denied-using-windows-vista">&quot;Access Denied&quot; using Windows Vista</h3>
<p>Now that we no longer support Windows XP, we have Windows Vista
VM's as a &quot;lowest common denominator&quot; for running smoke tests.
When trying to preview/copy profiles on Vista where reparse
points are involved, an &quot;Access Denied&quot; error message will
appear, even if the option to skip reparse points is enabled.
And of course the Visual Studio 2015 remote debugger doesn't
support Vista, so I'll have to fix this one a little later.</p>
<h2 id="whats-next">What's next</h2>
<p>Future builds should address some other shortcomings, such as
adding new copy modes and finally sorting out the scheduling -
keep an eye on the <a href="https://www.cyotek.com/cyotek-copytools/upcoming-changes">upcoming changes</a> page for details as and
when they occur.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2016-11-29 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/introducing-copytools-2-0 .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.com.NET 4.6 is now required for all Cyotek productsurn:uuid:f9c19782-a4e7-4a4f-bed0-67b54ee51c252016-04-02T10:08:22Z2016-04-02T10:08:22Z<p>It's been a year since I <a href="https://blog.cyotek.com/post/on-webcopy-continuous-integration-net-framework-4-5-and-end-of-windows-xp-support">announced</a> that WebCopy would be
moving from Microsoft .NET 3.5 to 4.5, therefore ending XP
support. As Microsoft have now discontinued support for 3.5 and
4.5, <strong>all</strong> Cyotek products will be using .NET 4.6 in
subsequent builds, starting with the <a href="https://blog.cyotek.com/post/introducing-nightly-builds">nightlies</a>.</p>
<p>This change will mean that no future builds of our products can
be used on Windows XP. Vista Service Pack 2 will be the
<em>minimum</em> supported operating system.</p>
<p>.NET 4.6 is built into Windows 10, or you can download it
directly from <a href="https://www.microsoft.com/en-us/download/details.aspx?id=48130" rel="external nofollow noopener">Microsoft</a> for Windows 8.1 and below.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2016-04-02 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/net-4-6-is-now-required-for-all-cyotek-products .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comIntroducing nightly buildsurn:uuid:146e4432-ed72-433e-81fc-0fdc00afda3c2016-03-06T11:20:04Z2016-03-06T11:20:04Z<p>At the start of the year, all of our build processes were
finally CI friendly and wired up to <a href="https://jenkins-ci.org/" rel="external nofollow noopener">Jenkins</a>. Now, whenever
a commit is made to our SVN repository, the relevant products
are built, tested, and deployment artefacts produced.</p>
<p>As well as building the setup programs our users ultimately
install, the build process now also extracts all the files and
tests them for dependency errors, using a slightly more improved
version of a sample I <a href="https://devblog.cyotek.com/post/assembly-reference-scanner-sample">posted some years ago</a>. This will
hopefully avoid future issues where we introduce a new
dependency then forget to update setup with it, as has happened
in the past.</p>
<p>Although a lot of our code is still woefully lacking in
available tests (and the UI themselves are never tested, save
manually), what tests do exist are ran for each build.</p>
<p>If any tests or deployment checks fail, the build itself is
flagged as failed and no artefacts are produced.</p>
<p>Therefore if artefacts are produced, there is some surety that
it can be expected to run without issue, which slightly lessens
the burden of deploying the releases - usually an XP or Vista
virtual machine is fired up and a manual smoke test is performed
on the basics, plus checking any new functionality.</p>
<p>With these safeguards in place, and concious that sometimes
there is quite a delay between official releases, we've decided
to have the latest CI build automatically uploaded to cyotek.com
each day. Not really nightly builds, but the term is easily
recognisable and so will do.</p>
<h2 id="danger-will-robinson">Danger, Will Robinson!</h2>
<blockquote>
<p>These builds are provided AS-IS and are not supported by
Cyotek.</p>
</blockquote>
<p>Although I want to make these builds available for users with
problems with existing releases, I do want to stress the point
`- <strong>these builds are created and uploaded via a fully automated
process and have not been reviewed or vetted by anyone at
Cyotek</strong>.</p>
<p>In other words, while our basic checks will pick up some issues
(and we will continue to iterate and improve on this process),
there are no guarantees that the code is fit for purpose. For
example, we could have introduced a bug in CopyTools where it
goes on a rampage and deletes files instead of copying them. In
theory, that shouldn't happen as there are actually quite a lot
of tests around this functionality. But, the point remains - it
could and we wouldn't know about it.</p>
<p>So please, if you make use of nightly builds to work around a
bug in WebCopy, or CopyTools, or any of our other products note
that the builds are <a href="https://www.cyotek.com/support/kb/general-question-and-answer/about-nightly-builds">provided AS-IS, and have no warranty</a>.</p>
<p>It is also possible that functionality added in a nightly build
could subsequently be removed, which could lead to its own set
of problems, for example incompatible file formats.</p>
<h2 id="ok-ok-enough-with-the-warnings-where-can-i-find-nightly-builds">OK, OK, enough with the warnings - where can I find nightly builds</h2>
<p>If you haven't been scared off yet, automated builds will appear
in a new <strong>Nightly Builds</strong> section of the product's
<strong>Downloads</strong> page. Not all products will have had nightly
builds switched on at the time of posting as we make final
checks on the updated build processes.</p>
<h2 id="where-can-i-find-change-logs-or-information-about-what-is-in-a-nightly-build">Where can I find change logs or information about what is in a nightly build</h2>
<p>Although most commits do include notes in the changes in the
commit, they aren't for public consumption and wouldn't make a
lot of sense if posted verbatim either. As CI builds are
triggered after each check-in, this could be for the most
trivial of reasons, which is why only the last daily build will
be uploaded.</p>
<p>However, we tend to record pending changes in the <strong>Upcoming
Changes</strong> section of each product, so this should be the first
place to stop when checking what goodies a nightly build may or
may not have.</p>
<h2 id="what-about-updates">What about updates</h2>
<p>Nightly builds are currently invisible to release checks and
won't be included. When a new stable release is found, a nightly
build would detect that as usual, but normal releases cannot
detect nightlies.</p>
<h2 id="you-said-its-not-supported-but-copytools-deleted-all-my-files">You said it's not supported, but CopyTools deleted all my files!</h2>
<p>Sorry, the files are provided AS-IS. Remember, no human has been
involved with the production and deployment of these builds, so
potentially issues could be present.</p>
<h2 id="you-said-its-not-supported-but-i-found-a-bug">You said it's not supported, but I found a bug</h2>
<p>You can always report issues with nightly builds on the
<a href="https://forums.cyotek.com">forums</a>.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2016-03-06 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/introducing-nightly-builds .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comIdentifying genuine Cyotek softwareurn:uuid:1ffc7db0-6dab-4fa4-b5c1-cec1269fb0ba2017-01-07T13:13:38Z2015-10-27T19:35:41Z<blockquote>
<p>Update 07Jan2017. As of January 2017, all binaries are signed
as Cyotek Ltd</p>
</blockquote>
<p>Every so often, we'll receive a Google alert which has a link to
HerdProtect or TotalVirus with a page merrily listing one of
Cyotek's executable files are being a virus. I'll duly check
these pages only to discover that while it might be one of our
files (or a file with the same version information), it has been
modified, renamed and then dumped in one of the Windows system
folders attempting to masquerade as another component.</p>
<p>Official Cyotek programs don't go anywhere near your Windows
system folders, nor do they try and pretend to be Windows Update
or any other program. Finally, (with the exception of CopyTools
(and not by default)), Cyotek programs don't try and run
themselves at system start up.</p>
<p>This sort of thing isn't really great advertising for Cyotek, so
I thought I would write this post reminding users to take
caution when downloading files and to use common sense, along
with outlining how you can check if the files are valid.</p>
<p>Firstly, try to download them direct from the software vendor
themselves, or a trusted mirror. Cyotek setup programs do not
include additional third party programs, they don't try and
change your default browser, or install any browser extensions.
If you download from a mirror, then make sure it's not a mirror
that has that re-wrapped our setup program in their own
&quot;Download Manager&quot; (even though it's against the license
agreement to do that) that then tries to sneak in some other
software.</p>
<p>All Cyotek products released since 2013 (bar a few exceptions
around the end of 2014) are digitally signed - both the setup
program and all EXE/DLL files within them that we have created.
Third party program files may or may not be signed by their own
authors, that isn't something we can control.</p>
<p>So what does this mean? It means that the files are guaranteed
to have been created by Cyotek and so therefore in theory are
safe. (Unless of course Cyotek has managed to distribute the
certificate and keys outside the organisation, or our computers
themselves are infected with nasties).</p>
<p>Currently the software is signed with my own personal code
signing certificate, although that should hopefully change to a
proper company one in the new year. We used to validate the
certificates on start-up then refuse to run if they were
invalid, but we disabled that check after the
<a href="https://blog.cyotek.com/post/comodo-certificate-revoked">incident</a>.</p>
<p>For the technically savvy, you can also check the file hashes -
if the hash of the file you have download doesn't match the hash
published by the software vendor then the file has been modified
and should be suspect.</p>
<p>And of course, make sure your system is protected at least via
UAC, firewalls and anti-virus / anti-malware.</p>
<h2 id="checking-if-a-file-is-digitally-signed">Checking if a file is digitally signed</h2>
<p>To check if the file you have downloaded is digitally signed,
right click the download and choose <strong>Properties</strong> from the
context menu. This should then display a dialog similar to the
one below. (These screenshots are from Windows 10, but the
dialog hasn't changed much since Windows 95)</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/checkcrt-1c.png" class="gallery" title="The File Properties dialog containing a Digital Signature tab" ><img src="https://images.cyotek.com/image/thumbnail/blog/checkcrt-1c.png" alt="The File Properties dialog containing a Digital Signature tab" decoding="async" loading="lazy" /></a><figcaption>The File Properties dialog containing a Digital Signature tab</figcaption></figure>
<p>If the <strong>Digital Signature</strong> tab is not present, then file isn't
signed.</p>
<p>If the tab is present, then it is signed - but that doesn't mean
all is well.</p>
<h2 id="checking-the-digital-signature-is-valid">Checking the digital signature is valid</h2>
<p>To view the certificate, select it from the <strong>Digital
Signature</strong> tab and click the <strong>Details</strong> button. This will then
present a dialog similar to this image</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/checkcrt-1d.png" class="gallery" title="Viewing the digital signature properties" ><img src="https://images.cyotek.com/image/thumbnail/blog/checkcrt-1d.png" alt="Viewing the digital signature properties" decoding="async" loading="lazy" /></a><figcaption>Viewing the digital signature properties</figcaption></figure>
<p>The first page of this new dialog should state if the signature
is valid or not, and who signed it. Currently for Cyotek
products this will appear as</p>
<ul>
<li>Name: Cyotek Ltd</li>
<li>Email: support@cyotek.com</li>
</ul>
<p>Products signed before January 2017 may have the following
details instead</p>
<ul>
<li>Name: Richard Moss</li>
<li>Email: richard.moss@cyotek.com</li>
</ul>
<p>(Although as <a href="http://www.cyotek.com/blog/startssl-code-signing-certificates-are-crippled">StartCOM timebomb</a> their certificates this is
now a moot point)</p>
<p>If you then click the <strong>View Certificate</strong> button, yet another
dialog will be displayed, this time displaying the certificate
itself. All Cyotek products are either signed with StartCom
certificates for recent releases, or Comodo for older builds.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/checkcrt-1e.png" class="gallery" title="Viewing the certificate properties" ><img src="https://images.cyotek.com/image/thumbnail/blog/checkcrt-1e.png" alt="Viewing the certificate properties" decoding="async" loading="lazy" /></a><figcaption>Viewing the certificate properties</figcaption></figure><h2 id="determining-if-the-signature-is-invalid">Determining if the signature is invalid</h2>
<p>If the digital signature isn't valid, this should be clearly
shown on the properties dialogs of both the digital signature
and the certificate itself.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/checkcrt-1g.png" class="gallery" title="An invalid digital signature" ><img src="https://images.cyotek.com/image/thumbnail/blog/checkcrt-1g.png" alt="An invalid digital signature" decoding="async" loading="lazy" /></a><figcaption>An invalid digital signature</figcaption></figure><figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/checkcrt-1h.png" class="gallery" title="An invalid certificate" ><img src="https://images.cyotek.com/image/thumbnail/blog/checkcrt-1h.png" alt="An invalid certificate" decoding="async" loading="lazy" /></a><figcaption>An invalid certificate</figcaption></figure>
<p>If the file has been modified, the signature will be
automatically invalidated - don't run the program, just download
a fresh version from a trusted source.</p>
<p>Another reason why a signature could be invalid is because the
certificate itself was revoked, as I have found myself. Letting
the software vendor know there's an issue with their certificate
would most likely be appreciated as they might not even know!</p>
<h2 id="security-warning-examples">Security warning examples</h2>
<p>I couldn't actually take a screenshot of the Windows 10
protected desktop, but I did capture the Windows XP and Windows
Vista prompts from our testing VM's. These prompts appear when
you run an installation program that is digitally signed.
Assuming you are sensible and haven't switched UAC off, you
should see these sort of prompts whenever you run installation
software.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/checkcrt-1a.png" class="gallery" title="Windows XP confirmation dialog showing the present of a certificate" ><img src="https://images.cyotek.com/image/thumbnail/blog/checkcrt-1a.png" alt="Windows XP confirmation dialog showing the present of a certificate" decoding="async" loading="lazy" /></a><figcaption>Windows XP confirmation dialog showing the present of a certificate</figcaption></figure><figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/checkcrt-1b.png" class="gallery" title="Windows Vista confirmation dialog showing the present of a certificate" ><img src="https://images.cyotek.com/image/thumbnail/blog/checkcrt-1b.png" alt="Windows Vista confirmation dialog showing the present of a certificate" decoding="async" loading="lazy" /></a><figcaption>Windows Vista confirmation dialog showing the present of a certificate</figcaption></figure><h2 id="closing-notes">Closing notes</h2>
<p>As a I mentioned at the start, probably the best place to get
Cyotek files is directly from Cyotek.com. While some mirrors
pick up our files, we don't actively monitor mirrors or update
them ourselves. And we never stick them on torrent sites. If you
do download from third parties, check the digital signatures are
present and intact.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2015-10-27 - First published</li>
<li>2017-01-07 - Added note about new certificate</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/identifying-genuine-cyotek-software .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comsrcset attribute support, custom attributes, 300 status support and moreurn:uuid:dca0bf79-0b66-4167-87a3-3c9a0b2e600b2015-09-12T12:35:26Z2015-09-12T12:10:07Z<p>A new beta version of WebCopy has been released, containing a
range of features and bug fixes.</p>
<blockquote>
<p>If you're finding WebCopy useful, please <a href="https://www.cyotek.com/donate">donate</a> to keep
the project alive</p>
</blockquote>
<h2 id="custom-attributes">Custom Attributes</h2>
<p>If you tried to use WebCopy to copy a responsive website, then
it is possible that WebCopy wouldn't pick up custom images if
they were referenced in ways that <a href="https://docs.cyotek.com/cyowcopy/current/crawlsupport.html">WebCopy won't detect by
default</a>, such as on custom data attributes.</p>
<p>With WebCopy 1.1.1 or higher, you can now define your own HTML
crawler expressions. It sounds complicated, but it's not - in
the simplest fashion, you can just enter the name of an
attribute, and WebCopy will check for any match on any HTML
element.</p>
<p>For example, consider the HTML fragment below, which references
<strong>background3.png</strong> and <strong>background1.png</strong>.</p>
<figure class="lang-html highlight"><figcaption><span>html</span></figcaption><pre class="code">
<span class="literal">&lt;</span><span class="name">img</span> <span class="name">data-original</span><span class="symbol">=</span><span class="attribute">&quot;/assets/img/background3.png&quot;</span> <span class="name">src</span><span class="symbol">=</span><span class="attribute">&quot;https://www.cyotek.com/assets/img/background1.png&quot;</span> <span class="name">alt</span><span class="symbol">=</span><span class="attribute">&quot;Background&quot;</span> <span class="name">style</span><span class="symbol">=</span><span class="attribute">&quot;width: 100%;&quot;</span><span class="literal">/&gt;</span>
</pre>
</figure>
<p>By default, WebCopy will only find <strong>background1.png</strong> as it is
on the standard <code>src</code> attribute. By simply adding
<code>data-original</code> to the custom attributes list, WebCopy will now
find and process <strong>background3.png</strong> too.</p>
<p>In addition to this basic form, you can also do more advanced
expressions by entering XPath statements. Continuing the above
example, if you add <code>//img/@data-original</code> as a custom
attribute, then WebCopy will only look at attributes named
<code>data-original</code> that belong to <code>img</code> elements.</p>
<p>Hopefully this approach strikes a nice balance between something
easy for users, and then something for the power user.</p>
<h2 id="srcset-support">srcset Support</h2>
<p>Staying with the responsive theme, WebCopy now supports the
<code>srcset</code> attribute. This attribute allows you to specifying
multiple images for a single <code>img</code> element, and the browser will
choose the most appropriate one.</p>
<figure class="lang-html highlight"><figcaption><span>html</span></figcaption><pre class="code">
<span class="literal">&lt;</span><span class="name">img</span> <span class="name">style</span><span class="symbol">=</span><span class="attribute">&quot;width: 400px; height: 400px;&quot;</span>
 <span class="name">src</span><span class="symbol">=</span><span class="attribute">&quot;https://www.cyotek.com/image-src.png&quot;</span> 
 <span class="name">srcset</span><span class="symbol">=</span><span class="attribute">&quot;image-1x.png 1x, image-2x.png 2x, image-3x.png 3x, image-4x.png 4x&quot;</span>
<span class="literal">/&gt;</span>
</pre>
</figure>
<p>In the above example, that single <code>img</code> tag references five
different image files. WebCopy will now detect and process all
five images.</p>
<p>The <a href="http://demo.cyotek.com/">WebCopy demo site</a> has been updated to include custom
attributes and srcset attributes.</p>
<h2 id="multiple-choices-status-code-support">&quot;Multiple Choices&quot; Status Code Support</h2>
<p>The 300 status code is often used by Linux based web servers
(such as Apache) as a user friendly 404 - if you try to access a
specific URL that doesn't exist, but it almost matches other
URLs, the web server will return the list of matches. I don't
think I've ever seen an IIS website return 300, it always seems
to just 404.</p>
<p>Previously WebCopy ignored this status code - it knew it was a
redirect, but couldn't do anything with it as it didn't include
a location header. Now, WebCopy will download the body
containing the list of URLs and crawl each of these.</p>
<p>I doubt this feature will see much real world use, but you never
know!</p>
<h2 id="performance-improvements-and-bug-fixes">Performance Improvements and Bug Fixes</h2>
<p>Although I don't go out of my way to profile WebCopy for
performance (most of the time will be spent downloading files
after all), I do keep an eye out for areas that could do with
improvement. While adding support for <code>srcset</code> (which is fairly
unique in terms of HTML attributes as it lets you specify
multiple values in a single attribute), I refactored the
crawling code and got a small performance improvement.</p>
<p>No WebCopy update would be complete without a bug fix or 10, and
so we have a number of fixes implemented, including (finally) a
fix for a bug which could leave a project unreadable by WebCopy.
A full list of corrections can be found in the <a href="https://www.cyotek.com/cyotek-webcopy/revision-history">release
notes</a>.</p>
<h2 id="and-next">And next?</h2>
<p>Even though all the tests (old and new) pass, due to the changes
to crawling, multi value attribute reading and writing and the
other new features, I'm still classing this as a beta build -
there's bound to be some edge case I haven't come across yet.</p>
<p>The next update is going to (finally!) tackle WebCopy's woeful
support for query strings and vastly improve that, perhaps then
making it possible to copy forums more easily.</p>
<p>However, I stress again that we need your support - if you're
using WebCopy and it is useful to you, please <a href="https://www.cyotek.com/donate">donate</a>!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2015-09-12 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/srcset-attribute-support-custom-attributes-300-status-support-and-more .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comStatus updateurn:uuid:7f968588-6f92-4714-8999-c5a82cb96d902015-08-15T17:49:35Z2015-08-15T17:49:35Z<p>It's now been more than a month since my slightly glum post
about the state of WebCopy (and other product) updates, so I
thought I'd post a brief update.</p>
<p>The last month has been spent developing and testing a new
system for collating exception details and work is progressing
well. It has been a really fun project to work on as I took the
opportunity to use things I wouldn't normally use, such as a
full REST API for managing pretty much everything, proper
constructor based dependency injection (the last time I &quot;used&quot;
DI I basically stuck the container on a static and treating it
as a service locator... not the best of ideas) and IoC
practices, component based UI using React.js and vanilla-flux,
Azure websites, Azure SQL Database and even more. I'll probably
write something more about this in technical blog posts in the
future.</p>
<p>One of the really cool things about the project is that I've
been dog-fooding it using live errors submitted using the
existing exception handler - when an exception is logged into
Cyotek.com using the old API, it now also dumps the raw context
into an Azure service bus queue. Every so often the prototype
API will poll this queue, pull out the messages, convert as much
information as possible into the new format and then log the
data into the new system. By leaving the messages on the queue,
it also means if I wipe the database, I can have all that
information repopulated. This has helped a great deal in getting
varied information for testing - and also helps let me know of
problem areas in a way I just couldn't see previously.</p>
<h2 id="ok-youre-having-fun-but-is-it-going-to-help">Ok, you're having fun - but is it going to help?</h2>
<p>In terms of managing the exceptions, some of the key
improvements are</p>
<ul>
<li><p>Event Aggregation<br />
Previously all exceptions were logged as isolated units with
no concept of repetition. Each unique exception is now a
single &quot;event&quot; with multiple &quot;occurrences&quot;. A notification is
sent for each new event, but (and this is the key bit for me)
repeat notifications will also be sent if the exception
continues to be raised. Currently, this is every 10 repeats,
but I'll probably add some way of configuring this based on
frequency or age. This prevents you being overwhelmed if you
get dozens+ of emails telling you about the same exception
(which is what happens now!), but also (and this is why I
stopped using Sentry in the end) means that if something
Really Bad is happening, you will continue to get periodic
emails so you know something is amiss, instead of getting a
single notification for a critical issue which you could
easily miss.</p>
</li>
<li><p>Language Merging<br />
This is actually another part of the aggregation, but as it
was another pain point in the original system I am happy its
resolved. Exception data is provided in localized form, so I
frequently get the same exception in English from one user,
Chinese from another, and French from a third. Or any other
language! Again, with each exception being isolated, it means
a lot of time manually translating the text. This sort of
information is not used to categorize exceptions in the new
system (only the underlying type, call stack, inner exceptions
and basic product details are used), so now I can happily see
(using the dog-fooded data!) exceptions grouped regardless of
language - and no need to translate as long as at least one
English occurrence is present. However, I'm also now including
the language code too, so at some point I can build in
automated translation if required.</p>
</li>
<li><p>Resolving Events<br />
Cyotek.com has no idea if an exception has been resolved, and
so will continue to blindly send notification emails even if a
bug is long fixed should users not update. Events can now be
resolved, and notifications will no longer be sent once this
has happened. Of course, if the same exception reoccurs in a
newer version of the product, it will automatically be
re-raised.</p>
</li>
<li><p>Actions<br />
This probably won't make it into the first round of client
updates, but one of the things I liked about vbCodeShield
(going back 15 years here!) was that it was able to provide
contextual responses for an exception. For example, it could
report that a newer version was available, or provide a link
to an article which described work-arounds. This is something
that would be useful when Cyotek's desktop applications crash
too (even if it's just to let you know we're aware of the
issue and working on it!) and so will be added to the new
system.</p>
</li>
<li><p>Visualizing<br />
I mentioned in the previous post there was no way of viewing
the exceptions except from the notification emails. There is
now a nice(ish) looking front end for viewing exception groups
and all their data, including rudimentary searching and
commenting. Plus the all important <strong>Resolve</strong> button! It
needs more work but as for the time being it will only be
viewable by us, it doesn't matter. I do plan to stick the
source on GitHub at some point though.</p>
</li>
</ul>
<h2 id="i-dont-care-about-any-of-this-where-are-the-updates">I don't care about any of this, where are the updates?</h2>
<p>Currently all development time has been spent on the new system,
but as the logging functionality is now mostly complete, and the
front end work doesn't matter quite as much as it is internal
only, work is resuming on our core product range - commits with
bug fixes have already started.</p>
<p>I have continued to receive numerous support requests for
WebCopy in the past month and I'm now starting to consider
scrapping it completely - for a freeware product is it taking an
unacceptable amount of resource just answering support tickets,
let alone developing it. All of which is impacting too much on
other projects. Still, &quot;don't be hasty&quot; would seem to be a good
idea at this point and I'd rather avoid this route if possible -
so identifying why so many support requests are needed (bad
code, bad documentation, etc) will be a good start.</p>
<p>I'll also be using the dog-fooded information from the new
exception system to start looking at the most reported bugs (the
most frequently occurring bug is <strong>System.Net.WebException:
(411) Length Required</strong>) and getting those fixed in the next
update will be the first priority. And probably updating the
documentation to state exactly what WebCopy can (and more
importantly) <strong>can't</strong> do would be a good next step. I've also
added 64bit builds to WebCopy for the first time, which may help
with memory issues that some users experience (although fixing
this properly is also on the list!).</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2015-08-15 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/status-update-august-2015 .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comBug tracking and software updates, or when free software isn't freeurn:uuid:b65737f6-5e10-4559-b3a8-a0c2a5f5510c2015-07-10T19:26:02Z2015-07-10T19:26:02Z<h2 id="when-a-molehill-becomes-a-mountain">When a molehill becomes a mountain</h2>
<p>As I finalize this post, I'm staring at almost 2000 emails, all
of which are automated error notifications. Around 1000 of these
are for <a href="https://www.cyotek.com/cyotek-webcopy">WebCopy</a> alone, stretching back nearly two years.
There's lots of duplication, and lots of issues that have
already been fixed in newer versions of the software.
Regardless, however you look at it it is an unmanageable amount.</p>
<p>Some quick background into exceptions - when a fatal exception
occurs, the end user is given the chance to report this (meaning
it's possible we could never receive reports of rare
exceptions). The report is then dumped into the database behind
cyotek.com - some of it in an old table for recording the basics
of an exception, the rest as HTML in an even older and poorly
designed issues table. Oh, and that not-very-readable HTML is
sent as a notification email.</p>
<p>Aside from the odd tinkering to to the format of information
dumped into these tables, they are unchanged from when
cyotek.com was &quot;rebooted&quot; back in 2009. There are no management
features, no fancy reports. The only way to get at it is to look
at the raw tables in SQL Server.</p>
<p>Not fit for purpose is possibly the politest way of putting it.</p>
<p>It's time to put the brakes on the already sporadic product
updates and sort this out once and for all. I had been looking
at services like <a href="https://raygun.io/" rel="external nofollow noopener">RayGun</a> or <a href="https://airbrake.io/" rel="external nofollow noopener">Airbrake</a>, but that is cost
prohibitive right now. Also, I'm slightly wary of aggregation
services after self hosting <a href="https://www.getsentry.com/welcome/" rel="external nofollow noopener">Sentry</a> for a year. (Although
that probably just means changing our workflows rather than any
concrete issues with aggregation per se)</p>
<p>So, product updates will probably be on hold while our error
tracking systems are rewritten from the ground up. Once they are
replaced and the old system deactivated, hopefully we can start
working on the backlog.</p>
<h2 id="free-software-isnt-free-or-why-new-features-bug-fixes-and-anything-else-is-never-timely">Free software isn't free (or why new features, bug fixes, and anything else is never timely)</h2>
<p>Right now, all Cyotek products are freeware - with optional
donations. We have had donation links for years, hoping that
people would find the products valuable enough to donate and
therefore covering the costs of developing and supporting the
products. The reality has been somewhat different for some time
now, and so it is almost inevitable that other options are going
to have to be considered in the future.</p>
<p>The other cost, of course is time. It takes time to develop new
features, and time to test them effectively, the lack of which
has been a problem in the past. It also takes more time to fix
bugs and resolve design issues from poor planning. Of course, it
takes time to do proper planning too. And with Cyotek being
such a small company but one with a fairly diverse range of
products, that time is spread even thinner. There's a long list
of things I want to do with WebCopy, Gif Animator and CopyTools
in particular, but major features are major for a reason and
burnout is also real.</p>
<p>Not to mention, there is the time of the user as well. Why waste
their time with a program that doesn't fit their needs, or is
slow or unintuitive?</p>
<p>I sometimes feel we're stuck in a bit of a catch-22 situation.
Despite having thousands of users at least running our products
now and then, the tiniest fraction of users donate anything.
Perhaps the remainder don't like the products, find them feature
limited, or too unstable. It would be nice to improve that
particular metric - at the very least I'd love to get rid of the
blight that is advertisements.</p>
<h2 id="its-a-long-tunnel-but-theres-always-light-at-the-end">It's a long tunnel, but there's always light at the end</h2>
<p>In the short term, we need to concentrate on sorting out the
error systems so at least we're no longer ignoring/being
paralysed by the mounting pile of issues (killing off issue
reports from obsolete versions of the software would be an
excellent start!).</p>
<p>Then, after any particularly nefarious bugs are cleared, I can
start properly planning product road-maps, and getting the
wheels in motion again with solid, stable and feature rich
software.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2015-07-10 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/bug-tracking-and-software-updates-or-when-free-software-isn-t-free .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comEffect Presets and Image Optimizationurn:uuid:a2390e70-fa31-4da3-9110-6deaa3fd5e0b2015-06-22T20:18:02Z2015-06-22T20:18:02Z<p>I'm currently juggling time between our different software
products, trying to balance bug fixes for one to general
improvements to another. Today, I want to show a glimpse of some
improvements being made to our <a href="https://www.cyotek.com/cyotek-gif-animator">Gif Animator</a>.</p>
<h2 id="effect-presets">Effect Presets</h2>
<p>For some time now, I have been using an extension with Gif
Animator that allows limited scripting using JavaScript. I
mainly use this extension to automatically apply effects to
animations via macro's, an example of which you can see below</p>
<figure class="lang-javascript highlight"><figcaption><span>javascript</span></figcaption><pre class="code">
<span class="keyword">function</span> applyCyotekText<span class="symbol">(</span><span class="symbol">)</span>
<span class="symbol">{</span>
 <span class="keyword">if</span><span class="symbol">(</span>app<span class="symbol">.</span>ActiveFrame <span class="symbol">!=</span> <span class="keyword">null</span><span class="symbol">)</span>
 <span class="symbol">{</span>
 <span class="keyword">var</span> effect<span class="symbol">;</span>
 <span class="keyword">var</span> config<span class="symbol">;</span>

 effect <span class="symbol">=</span> app<span class="symbol">.</span>GetEffect<span class="symbol">(</span><span class="string">&quot;Text&quot;</span><span class="symbol">)</span><span class="symbol">;</span>

 config <span class="symbol">=</span> effect<span class="symbol">.</span>CreateToken<span class="symbol">(</span><span class="symbol">)</span><span class="symbol">;</span>
 config<span class="symbol">.</span>Text <span class="symbol">=</span> <span class="string">&quot;Cyotek&quot;</span><span class="symbol">;</span>
 config<span class="symbol">.</span>Angle <span class="symbol">=</span> <span class="number">30</span><span class="symbol">;</span>
 config<span class="symbol">.</span>Font <span class="symbol">=</span> <span class="keyword">new</span> System<span class="symbol">.</span>Drawing<span class="symbol">.</span>Font<span class="symbol">(</span><span class="string">&quot;Segoe UI&quot;</span><span class="symbol">,</span> <span class="number">11</span><span class="symbol">)</span><span class="symbol">;</span>
 config<span class="symbol">.</span>TextColor <span class="symbol">=</span> System<span class="symbol">.</span>Drawing<span class="symbol">.</span>Color<span class="symbol">.</span>FromArgb<span class="symbol">(</span><span class="number">64</span><span class="symbol">,</span> <span class="number">64</span><span class="symbol">,</span> <span class="number">96</span><span class="symbol">)</span><span class="symbol">;</span>
 config<span class="symbol">.</span>AntiAlias <span class="symbol">=</span> <span class="keyword">true</span><span class="symbol">;</span>
 
 app<span class="symbol">.</span>ApplyEffect<span class="symbol">(</span>effect<span class="symbol">,</span> config<span class="symbol">)</span><span class="symbol">;</span>
 <span class="symbol">}</span>
 <span class="keyword">else</span>
 <span class="symbol">{</span>
 alert<span class="symbol">(</span><span class="string">&quot;Select a frame before trying to apply an effect.&quot;</span><span class="symbol">)</span><span class="symbol">;</span>
 <span class="symbol">}</span>
<span class="symbol">}</span>
</pre>
</figure>
<p>Originally I intended on releasing this extension as I thought
it was kind of cool. Well, it <strong>is</strong> kind of cool. But... it's a
bit much expecting users to write scripts for this sort of
thing. My next thought was maybe I could have Gif Animator
generate the scripts, which is feasible but still doesn't seem
like a great idea. Not to mention the JavaScript interpreter I
was using didn't like talking to some parts of my API leading me
to add in horrible methods like &quot;GetEffect&quot; instead of the
existing indexers that serve the rest of the program quite well.
No thanks!</p>
<p>So I decided to add presets which you can load and save directly
from the effect configuration dialog.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/effects-dialog-presets.png" class="gallery" title="Easily configure presets for your favourite effects" ><img src="https://images.cyotek.com/image/thumbnail/blog/effects-dialog-presets.png" alt="Easily configure presets for your favourite effects" decoding="async" loading="lazy" /></a><figcaption>Easily configure presets for your favourite effects</figcaption></figure>
<p>To load a preset, just select it from the drop down list and it
will be immediately applied to the dialog configuration. Or, you
can reset the configuration to the default for the effect by
clicking the <strong>Reset to Default</strong> button.</p>
<p>Of course, you can save a preset too - just set the dialog
configuration as you see fit, click the <strong>Save Preset</strong> button
and give it a name. A small block of json will be saved
containing the effect data in your user data directory for the
program.</p>
<figure class="lang-json highlight"><figcaption><span>json</span></figcaption><pre class="code">
<span class="symbol">{</span>
 <span class="string">&quot;Alpha&quot;</span><span class="symbol">:</span> <span class="number">75</span><span class="symbol">,</span>
 <span class="string">&quot;Angle&quot;</span><span class="symbol">:</span> <span class="number">45</span><span class="symbol">,</span>
 <span class="string">&quot;AntiAlias&quot;</span><span class="symbol">:</span> <span class="keyword">true</span><span class="symbol">,</span>
 <span class="string">&quot;Font&quot;</span><span class="symbol">:</span> <span class="string">&quot;Segoe UI, 11.25pt&quot;</span><span class="symbol">,</span>
 <span class="string">&quot;Text&quot;</span><span class="symbol">:</span> <span class="string">&quot;Example!&quot;</span><span class="symbol">,</span>
 <span class="string">&quot;TextColor&quot;</span><span class="symbol">:</span> <span class="string">&quot;Black&quot;</span><span class="symbol">,</span>
 <span class="string">&quot;X&quot;</span><span class="symbol">:</span> <span class="number">7</span><span class="symbol">,</span>
 <span class="string">&quot;Y&quot;</span><span class="symbol">:</span> <span class="number">20</span>
<span class="symbol">}</span>
</pre>
</figure>
<p>Much easier than writing a script by hand! Admittedly, scripting
is a more powerful solution but my goal at this point is to make
the program as easy to use a possible in the GUI, and catering
to the power users via the CLI.</p>
<h2 id="effect-configuration-ui-improvements">Effect Configuration UI Improvements</h2>
<p>I've also made the dual pane preview control slightly easier to
use by adding buttons for manipulating the zoom, as sometimes I
find I want to size the image to fit, and generally that can't
be done with a single spin of the mouse wheel. Buttons are now
available to allow this and other basic zoom tasks, along with
an indicator of the current zoom level.</p>
<p>Although I don't see performance being an issue currently, there
are now controls to disable the automatic updating of the effect
preview whenever you adjust fields in the dialog, along with a
button to trigger a manual preview when automatic refreshes are
disabled.</p>
<p>Oh yes, and I added the ability to maximise the dialog - that
one was bugging me.</p>
<h2 id="image-optimization">Image Optimization</h2>
<p>I mentioned above I wanted to make the program easier to use.
Part of that meant getting rid of the old <strong>Optimize Image</strong>
dialog. While there was nothing specifically wrong with the
dialog as such, it didn't lead well to choosing the right type
of colour reduction and didn't have very many options - for
example no monochrome support and no reduction options other
than nearest colour.</p>
<p>Those who read the programming side of this blog may be aware I
spent some time researching dithering algorithms, and these are
now part of Gif Animator, meaning when you optimise an image,
you can choose a dithering algorithm which can often produce
much better results.</p>
<p>This is done via the new <strong>Decrease Color Depth</strong> menu, which
provides the ability to decrease the number of colours in an
image from between 2 and 256.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/color-reduction-menu.png" class="gallery" title="New menus for colour reduction" ><img src="https://images.cyotek.com/image/thumbnail/blog/color-reduction-menu.png" alt="New menus for colour reduction" decoding="async" loading="lazy" /></a><figcaption>New menus for colour reduction</figcaption></figure>
<p>The different modes are fairly similar, offering a choice of dithering routines and various options depending on the colour depth. Sadly, there's no ordered dithering at present as I haven't finished (well, started) my research into those algorithms yet.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/decrease-color-depth-8bit.png" class="gallery" title="Reducing the colour depth of an image" ><img src="https://images.cyotek.com/image/thumbnail/blog/decrease-color-depth-8bit.png" alt="Reducing the colour depth of an image" decoding="async" loading="lazy" /></a><figcaption>Reducing the colour depth of an image</figcaption></figure>
<p>You might notice the dialog has the same zoom, preview and
preset controls as the original text effect screenshot above.
This is because the colour reduction functions are in fact just
another type of image effect. Which is quite handy from a number
of perspectives!</p>
<h2 id="release-date">Release Date?</h2>
<p>At the moment I'm not quite sure when this update will be
released. I'm still wrestling with if I should leave Gif
Animator on .NET 3.5, or move it (and all other Cyotek products)
to .NET 4.5. There isn't really an incentive to stay on the
legacy platform except to support a legacy OS and I don't really
have the time or the budget for that.</p>
<p>I'd also like to implement some ordered dithering as this type
of dithering really fits in well with 8bit images.</p>
<p>Hopefully this glimpse of future functionality is useful, as
always, feedback is welcome.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2015-06-22 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/effect-presets-image-optimization .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comOn WebCopy, Continuous Integration, .NET Framework 4.5 and end of Windows XP supporturn:uuid:a1e5351f-50b2-4a87-ba2f-9b55ba6ddafe2015-04-11T08:01:43Z2015-04-11T08:01:43Z<blockquote>
<p>This is quite a long post so I'm just going to add an
important bit of news here - WebCopy 1.1 <strong>will not</strong> be able
to be installed or ran on Windows XP</p>
</blockquote>
<p>WebCopy, like most Cyotek products, is built in C# using
Microsoft .NET Framework 3.5, thus allowing it to run on Windows
XP onwards. Each time the product is built, a batch file is
manually ran which goes away and compiles the solution, signs
the files, does some &quot;deployment ready&quot; checks, generates the
documentation and then generates the setup. Tests are not run as
part of this process as generally they are always running in the
IDE via <a href="http://www.ncrunch.net/" rel="external nofollow noopener">NCrunch</a>.</p>
<p>Once a build has been completed and we're thinking about
deploying it, we then fire up a Windows XP virtual machine in
<a href="https://www.virtualbox.org/" rel="external nofollow noopener">VirtualBox</a> and proceed to run a basic smoke test - this
usually involves opening the demo project, downloading the demo
website, then creating a new project, pointing it to a small 3rd
party website, downloading that, then saving the project. Just
the basics in other words.</p>
<p>If this smoke test passes, then we upload the setup to
cyotek.com, copy the <a href="https://www.cyotek.com/cyotek-webcopy/upcoming-changes">Upcoming Changes</a> content into a new
document, then link it all together - and a new release is ready
for end users to download.</p>
<p>It's actually not a laborious process (except for the smoke
test) as for the most part, while not fully automatic, all the
major actions are handled by several batch scripts and
specialist actions. But it would be very nice to have this all
done automatically.</p>
<p>Which is why I feel an intense surge of glee whenever I look at
this display:</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/ci-1a.png" class="gallery" title="Starport Successfull! Wait, wrong universe. Well, it makes me happy anyway." ><img src="https://images.cyotek.com/image/thumbnail/blog/ci-1a.png" alt="Starport Successfull! Wait, wrong universe. Well, it makes me happy anyway." decoding="async" loading="lazy" /></a><figcaption>Starport Successfull! Wait, wrong universe. Well, it makes me happy anyway.</figcaption></figure>
<p>This is <a href="https://www.jetbrains.com/teamcity/" rel="external nofollow noopener">TeamCity</a>, the product we are using for <a href="http://en.wikipedia.org/wiki/Continuous_integration" rel="external nofollow noopener">continuous
integration</a>- basically, whenever changes are checked into
version control, TeamCity goes away and creates the build
without us having to manually trigger it. It also gathers the
build artefacts ready for more processing.</p>
<p>I evaluated both <a href="http://jenkins-ci.org/" rel="external nofollow noopener">Jenkins</a> and TeamCity for this job,
starting with Jenkins. It didn't require any configuration
changes on the server or agent hosts, and produced a build.
(Eventually anyway, it took a lot of effort to get the WebCopy
build into a shape where it would work purely via checkouts.
Un-versioned files and hard coded tool paths <strong>do not</strong> help!).
But, I didn't warm to Jenkins, mainly because it's so incredibly
ugly, and because out of the box functionality is quite limited
(for .NET shops) unless you want to start installing a multitude
of plugins.</p>
<p>Next I tried TeamCity. I originally looked at this back in 2013
(with version 7) and ended up shelving it then (mostly because
the builds just wouldn't run correctly). While Jenkins worked
out the box, TeamCity needs a full blown database server of some
sort (SQL Server for us!) and need tinkering to the firewalls on
both the server and the agent. But in terms of UI user
friendliness it's light years ahead of Jenkins. And as the
screenshot shows, WebCopy is happily being built.</p>
<p>But what does this mean?</p>
<h2 id="more-frequent-builds">More Frequent Builds?</h2>
<p>Firstly, more work needs to be done with the build process - the
batch files are sometimes a bit fragile and don't make for easy
error detection. I'd been looking at <a href="http://fsharp.github.io/FAKE/" rel="external nofollow noopener">FAKE</a> a couple of weeks
back as a possible replacement, but there are other options such
as <a href="https://github.com/nant/nant" rel="external nofollow noopener">NANT</a> and probably a bucketful of others. Once the build
has been converted to use something else, then I'll start adding
the automated unit/integration tests into the process.</p>
<p>And then... I plan on having TeamCity talk to cyotek.com to
automatically publish &quot;nightly&quot; (except they won't be that
frequent!) builds to hopefully get new versions of the software
out quicker.</p>
<p>We've also been spending substantial time recently rewriting
core tests for WebCopy's crawling engine so that we can be much
more confident in it's abilities, know immediately if
regressions are introduced, and to ensure oversights and bugs
are swiftly rectified. Oh yes, and to make the things faster.</p>
<h2 id="moving-to.net-4.5-removal-of-xp-support">Moving to .NET 4.5, removal of XP support</h2>
<p>Some parts of WebCopy are crying out for performance
improvements. Lets start with the basics, such as threading.
Threading is a way of a program doing more than one thing at
once. WebCopy does use threads, but only to keep the UI from
being blocked, and for supporting actions such as update checks
or RSS updates. The core crawling is done on a separate thread,
but essentially all ancillary actions are a big chain, one link
after another.</p>
<p>While there's nothing really stopping use from staying with .NET
3.5 and expanding the threading capacity, newer versions of .NET
make this much easier with lots of built in goodness like
concurrent collections, parallel workers and much more easy ways
of making asynchronous calls - the ones in WebCopy currently are
difficult to debug when things go wrong.</p>
<p>.NET 4.5 is built into Windows 8 onwards, and is available as a
download for Vista and Windows 7. <strong>It is not available for
Windows XP</strong> however, so it is highly likely that WebCopy
1.0.10.1 will be the last version available for this OS.</p>
<p>Based on submitted analytic's data, the breakdown of WebCopy
users per operating system looks like this</p>
<table>
<thead>
<tr>
<th>Operating System</th>
<th style="text-align: right;">User %</th>
</tr>
</thead>
<tbody>
<tr>
<td>Windows XP / Server 2003</td>
<td style="text-align: right;">12%</td>
</tr>
<tr>
<td>Windows Vista / Server 2008</td>
<td style="text-align: right;">1%</td>
</tr>
<tr>
<td>Windows 7 / Server 2008 R2</td>
<td style="text-align: right;">68%</td>
</tr>
<tr>
<td>Windows 8 / Server 2012</td>
<td style="text-align: right;">12%</td>
</tr>
<tr>
<td>Windows 8.1 / Server 2012 R2</td>
<td style="text-align: right;">6%</td>
</tr>
<tr>
<td>Windows 10</td>
<td style="text-align: right;">1%</td>
</tr>
</tbody>
</table>
<p>At 12% the XP user base is larger than I would have expected,
but I think it's time to drop support regardless.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2015-04-11 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/on-webcopy-continuous-integration-net-framework-4-5-and-end-of-windows-xp-support .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comWebCopy and some welcome form updatesurn:uuid:f330a31b-aab3-4bd2-b506-020adceca1ae2015-03-22T07:28:56Z2015-03-22T07:21:49Z<p>One of the biggest sources of support requests for
<a href="https://www.cyotek.com/cyotek-webcopy">WebCopy</a> are to do with posting forms, and
WebCopy's ongoing inability to handle dynamic values.
Thankfully, with WebCopy 1.0.10.0 this issue has finally been
resolved as we have introduced a variety of improvements with
forms, including value merging and a new tool to capture form
data.</p>
<h2 id="how-it-used-to-work">How it used to work</h2>
<p>So what was the problem? Well, consider a typical login form.
The HTML (at the barest minimum) will be similar to the
following fragment.</p>
<figure class="lang-html highlight"><figcaption><span>html</span></figcaption><pre class="code">
<span class="literal">&lt;</span><span class="name">form</span><span class="literal">&gt;</span>
 Username: <span class="literal">&lt;</span><span class="name">input</span> <span class="name">type</span><span class="symbol">=</span><span class="attribute">&quot;text&quot;</span> <span class="name">name</span><span class="symbol">=</span><span class="attribute">&quot;username&quot;</span> <span class="literal">/&gt;</span>
 Password: <span class="literal">&lt;</span><span class="name">input</span> <span class="name">type</span><span class="symbol">=</span><span class="attribute">&quot;password&quot;</span> <span class="name">name</span><span class="symbol">=</span><span class="attribute">&quot;password&quot;</span> <span class="literal">/&gt;</span>
 <span class="literal">&lt;</span><span class="name">button</span> <span class="name">type</span><span class="symbol">=</span><span class="attribute">&quot;submit&quot;</span><span class="literal">&gt;</span>Login<span class="literal">&lt;/</span><span class="name">button</span><span class="literal">&gt;</span>
<span class="literal">&lt;/</span><span class="name">form</span><span class="literal">&gt;</span>
</pre>
</figure>
<p>WebCopy handles this type of form very well.</p>
<p>One of the scourges of the internet are spammers, and as a
result of this, forms often include dynamically generated tokens
used to validate the form values, as demonstrated in the snippet
below.</p>
<figure class="lang-html highlight"><figcaption><span>html</span></figcaption><pre class="code">
<span class="literal">&lt;</span><span class="name">form</span><span class="literal">&gt;</span>
 Username: <span class="literal">&lt;</span><span class="name">input</span> <span class="name">type</span><span class="symbol">=</span><span class="attribute">&quot;text&quot;</span> <span class="name">name</span><span class="symbol">=</span><span class="attribute">&quot;username&quot;</span> <span class="literal">/&gt;</span>
 Password: <span class="literal">&lt;</span><span class="name">input</span> <span class="name">type</span><span class="symbol">=</span><span class="attribute">&quot;password&quot;</span> <span class="name">name</span><span class="symbol">=</span><span class="attribute">&quot;password&quot;</span> <span class="literal">/&gt;</span>
 <span class="literal">&lt;</span><span class="name">input</span> <span class="name">name</span><span class="symbol">=</span><span class="attribute">&quot;__RequestVerificationToken&quot;</span> <span class="name">type</span><span class="symbol">=</span><span class="attribute">&quot;hidden&quot;</span> <span class="name">value</span><span class="symbol">=</span><span class="attribute">&quot;SVPMPZEjIMFD-Ne5cUm7IiMWKUSyHk3aU1mRGRJNvtmjkSfAusVyOgseFgVXdcZZdxlTHpdUJKIqKgwkqSgYUM7T8tDtCOZighFwIhgc_QW_Ccrr2_QaZ0jD9EVgYSZdVQlgaA2&quot;</span><span class="literal">&gt;</span>
 <span class="literal">&lt;</span><span class="name">button</span> <span class="name">type</span><span class="symbol">=</span><span class="attribute">&quot;submit&quot;</span><span class="literal">&gt;</span>Login<span class="literal">&lt;/</span><span class="name">button</span><span class="literal">&gt;</span>
<span class="literal">&lt;/</span><span class="name">form</span><span class="literal">&gt;</span>
</pre>
</figure>
<p>These tokens will change (generally for each particular session)
and therefore WebCopy has been completely unable to submit such
forms. Even if you opened the form in your favourite browser and
extracted the tokens and pasted them into WebCopy it was
unlikely to work as they would likely be treated as different
sessions and have different values.</p>
<p>Forms often tend to set cookies now as well, so when you
download the page containing the form, a validation cookie is
saved. Then, when the page is submitted the cookie is used to
help with the validation process. WebCopy only did the <code>POST</code>
action, but not the <code>GET</code> and so no cookies would ever be set.</p>
<h2 id="how-it-works-now">How it works now</h2>
<p>A new property, <strong>Merge Values</strong>, has been added to form
definitions. This is enabled by default for new forms, but
disabled for any existing projects (although of course you can
turn it on).</p>
<p>When this property is set, WebCopy will automatically get the
page containing the form, apply any cookies, then attempt to
extract the form data. Any parameters that haven't been
explicitly defined will be automatically merged and then the
merged data will be posted.</p>
<p>A simple correction, but one that should hopefully reduce the
number of support requests, and disappointed users for that
matter.</p>
<h2 id="what-happens-if-multiple-forms-are-present">What happens if multiple forms are present?</h2>
<p>Some pages may include multiple forms, for example searching,
registration, etc. WebCopy tries to be smart about this - if
multiple forms are present, it will try and match a single form
who's <code>action</code> attribute matches the form URI. If it can't do
that, then it tries to match a single form without an <code>action</code>
attribute. And if that fails, it won't do anything.</p>
<blockquote>
<p>Note: You can use the Test URI tool to verify that your login
form actually logs you in before doing a fully copy or analyse</p>
</blockquote>
<p>There's also a third option - I added the ability for a form
definition to include an XPath query to select the <code>FORM</code>
element. However, as one of the other frequent criticisms of
WebCopy seems to be that the UI is too complicated, I have
chosen not to add it to the UI at this point in time. The only
way to specify the value currently is by direct editing of the
project file. I probably will not expose this option unless
users start reporting being unable to post to complicated pages
(in which case I'll try to make the auto detection cleverer) or
until 2.0 which ought to include simple / advanced display
modes.</p>
<h2 id="thats-nice-but-how-about-helping-me-create-the-form">That's nice, but how about helping me create the form</h2>
<p>I agree that currently it's not exactly the easiest of tasks to
create a form definition as you have to know the URI and then
the different (static) values to submit, which means you have to
poke around in a sites HTML. <em>Ok, maybe some of the criticism
about WebCopy's UI is justified.</em></p>
<p>For this reason, a rudimentary (and somewhat experimental)
<strong>Capture Form</strong> tool has been added. This tool will display a
window containing a web browser displaying the root page for the
website you want to copy, and a list of detected forms.</p>
<p>Simply navigate to the login page, select the form to use, and
then tick any parameters to include - ie user name and password
fields, but not fields with odd values. (A future update will
probably automatically exclude the hidden fields automatically).</p>
<blockquote>
<p>Note that you don't have to fill in the form and submit the
page as WebCopy is simply parsing the HTML that you have
navigated to.</p>
</blockquote>
<p>The submit the dialog and you have a new form definition.
Hopefully that will become a useful feature for users of the
product!</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/captureformtool.png" class="gallery" title="An example of capturing a form automatically" ><img src="https://images.cyotek.com/image/thumbnail/blog/captureformtool.png" alt="An example of capturing a form automatically" decoding="async" loading="lazy" /></a><figcaption>An example of capturing a form automatically</figcaption></figure><h2 id="anything-outstanding-with-form-support">Anything outstanding? (with form support!)</h2>
<p>Currently the main bug left outstanding is it isn't possible to
submit multi-lined form values due to the way the UI is a single
edit field. I don't really want to start breaking the UI up in
1.x, that is a 2.0 planned task.</p>
<p>I also don't want to keep the new Merge Values property hanging
around for long - it's currently really only there so that
existing projects behave the same way they always have. Once I'm
certain the new code is performing as expected this setting will
removed and all form posting will use the new behaviour.</p>
<p>It is possible that there will be issues with the new
implementation, for example cases where the auto detection fails
to identify the right form on pages with multiple forms.</p>
<p>This release also includes quite a few other bug fixes and is
definitely recommended that all users upgrade to this version.</p>
<p>If you find any problems (or have any suggestions) please let us
know!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2015-03-22 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/webcopy-and-some-welcome-form-updates .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comCreating preview images from a colour paletteurn:uuid:a0c4c123-5e06-4ef6-ab46-8b788442513e2015-01-19T06:56:13Z2015-01-18T17:12:42Z<p>If you use Cyotek's <a href="https://www.cyotek.com/cyotek-palette-editor">Color Palette Editor</a> to create palettes
that are displayed on community sites such as forums, then it
can be handy to display a preview of the palette.</p>
<p>A new feature in the Palette Editor can now produce these images
for you as this post briefly describes.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/palette-preview-image-1a.png" class="gallery" title="Creating a preview image from a colour palette automatically" ><img src="https://images.cyotek.com/image/thumbnail/blog/palette-preview-image-1a.png" alt="Creating a preview image from a colour palette automatically" decoding="async" loading="lazy" /></a><figcaption>Creating a preview image from a colour palette automatically</figcaption></figure>
<p>To create a preview image, open a palette, then choose <strong>Create
Preview Image</strong> from the <strong>Tools</strong> menu.</p>
<p>Currently you can choose from the following options</p>
<ul>
<li><em>Rows</em> and <em>Columns</em> define the basic layout</li>
<li><em>Margins</em> allow you to configure the space around the edges of
the image</li>
<li><em>Spacing</em> allows you to configure the gap between swatches in
the image</li>
<li><em>Background</em> lets you choose a background colour</li>
<li><em>Swatch Size</em> is used to set the size of the colour swatch
blocks</li>
<li>You can show a border around the swatch blocks, useful if a
swatch shares the same background colour as the image itself</li>
<li>You can specify a title to be displayed</li>
<li>You can configure how swatch labels are displayed</li>
<li>For title and label text, the following options are also
available
<ul>
<li>Font</li>
<li>Text and background colour</li>
<li>Horizontal and vertical alignment</li>
<li>Relative position to and offset from swatch colour block</li>
<li>Maximum size of the label</li>
</ul>
</li>
</ul>
<p>Then simply specify the output file name and the graphic will be
saved ready for you to reuse elsewhere. Each time you export an
image, the current setting are saved for future sessions.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/palette-preview-image-1b.png" class="gallery" title="Various options give you flexible output" ><img src="https://images.cyotek.com/image/thumbnail/blog/palette-preview-image-1b.png" alt="Various options give you flexible output" decoding="async" loading="lazy" /></a><figcaption>Various options give you flexible output</figcaption></figure>
<p>This is currently an early version extension - there's more
options I'd like to add, but it's functional now so use it and
feel free to suggest improvements!</p>
<p>In my experiments I have found using a small pixel font with
anti aliasing disabled (the font in the examples is <a href="http://pixelfonts.style-force.net/" rel="external nofollow noopener">Marke
Eigenbau</a> for the labels and <a href="http://members.bitstream.net/marksim/atarimac/fonts.html" rel="external nofollow noopener">Atari Classic Chunky</a> for
titles) works well, but I'd be interested in hearing of other
good looking fonts.</p>
<blockquote>
<p>Note: There is currently an issue where you cannot use an
anti-aliased font with a transparent background. Either
disable the anti-alias option, or choose a solid background
colour. This is a limitation of GDI so may be difficult to
work out (and using GDI+ creates ugly inconsistent text)</p>
</blockquote>
<p>Finally, a few example image files generated from one of the
sample palettes provided with the editor.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/palette-sample-1.png" class="gallery" title="An example palette" ><img src="https://images.cyotek.com/image/thumbnail/blog/palette-sample-1.png" alt="An example palette" decoding="async" loading="lazy" /></a><figcaption>An example palette</figcaption></figure><figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/palette-sample-2.png" class="gallery" title="An example palette" ><img src="https://images.cyotek.com/image/thumbnail/blog/palette-sample-2.png" alt="An example palette" decoding="async" loading="lazy" /></a><figcaption>An example palette</figcaption></figure><figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/palette-sample-3.png" class="gallery" title="An example palette" ><img src="https://images.cyotek.com/image/thumbnail/blog/palette-sample-3.png" alt="An example palette" decoding="async" loading="lazy" /></a><figcaption>An example palette</figcaption></figure><h2 id="update-history">Update History</h2>
<ul>
<li>2015-01-18 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/creating-preview-images-from-a-colour-palette .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comCOMODO Certificate Revokedurn:uuid:d8a48e4f-8e5a-4fc1-bf35-ba7212b58f772014-12-13T01:38:22Z2014-12-13T01:19:38Z<p>For the past two years, all Cyotek products have been digitally
signed, providing some peace of mind that when you download one
of our products you can be certain it hasn't been tampered with.</p>
<p>At some point in the last few days, COMODO have revoked the
certificate we use, for reasons I'm still trying to ascertain
from their support department. The net result of this is every
Cyotek product released in the past 10 months is now unusable,
as when you try and start any executable, it will immediately
crash due to the revoked certificate.</p>
<p>Emergency releases of most products have been released without
digital signatures until we obtain a new certificate from
another CA (clearly we will not be using COMODO again as no
matter what their reasons for doing it, it has been handled in
just about the worst way possible).</p>
<p>There is a caveat with the new builds - they haven't been as
thoroughly tested as they might otherwise be. But given the
number of exceptions being logged from the now completely broken
products, it's the lesser of two evils.</p>
<p><strong>If you are affected by this issue please visit the appropriate
product page to download the interim version sans digital
signatures.</strong></p>
<p>New properly signed builds will be posted as soon as possible.</p>
<p>We are sorry for the inconvenience for this incident, we did not
receive any sort of notification from COMODO about their
actions, and their response to why they did it hasn't actually
answered the question.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-12-13 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/comodo-certificate-revoked .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comPotential support for localizationurn:uuid:464c845d-19db-4ac3-9eb6-aef75cd4b7b32014-10-28T20:28:57Z2014-10-28T20:28:57Z<p>After the last mammoth update to Gif Animator, I wanted a task
that was slightly distracting rather than just fixing bugs. A
couple of requests in the past have been about localization, so
I had a look at the metrics we have gathered on software usage
to see what different languages were being used.</p>
<p>The vast majority of sessions for all our products (around 70%)
used English, followed by a variety of other locales, the top
four being French, Chinese, Spanish and Russian (around 20% for
those four) with the final 10% in a long list of other
languages. So, well worth taking a look at localization!</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/localization-1d.png" class="gallery" title="Selecting a language" ><img src="https://images.cyotek.com/image/thumbnail/blog/localization-1d.png" alt="Selecting a language" decoding="async" loading="lazy" /></a><figcaption>Selecting a language</figcaption></figure><h2 id="finding-strings">Finding Strings</h2>
<p>The first task was to identify strings. In a typical application
there's going to be an awful lot of them, and Gif Animator is no
exception. Of course, a lot of those aren't valid targets for
localization, things like control names, command line arguments,
file names - all sorts of things that don't need to be included.
I wrote a tool to scan our source code and pull out as many
valid strings as possible.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/localization-1a.png" class="gallery" title="Finding strings" ><img src="https://images.cyotek.com/image/thumbnail/blog/localization-1a.png" alt="Finding strings" decoding="async" loading="lazy" /></a><figcaption>Finding strings</figcaption></figure>
<p>The screenshot shown above shows the output being ran on just
Gif Animator's core libraries. Even with all the &quot;best guess&quot;
exclusions it has made, that's still a lot of strings to look
at. And it doesn't even cover the entire software. This may take
some time...</p>
<h2 id="translating-strings">Translating Strings</h2>
<p>The next problem is translating the strings. In one respect,
it's quite simple - use a web service such as <a href="http://www.microsoft.com/translator/" rel="external nofollow noopener">Microsoft
Translate</a> or <a href="https://translate.google.co.uk/" rel="external nofollow noopener">Google Translate</a> and you're good to go (I
haven't looked into Googles offering, but Microsoft give you 2
<em>million</em> characters of free translations via their API and is
well worth a look).</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/localization-1b.png" class="gallery" title="Automatically translated phrases" ><img src="https://images.cyotek.com/image/thumbnail/blog/localization-1b.png" alt="Automatically translated phrases" decoding="async" loading="lazy" /></a><figcaption>Automatically translated phrases</figcaption></figure>
<p>Unfortunately automatic translation isn't as awesome as it might
first appear.</p>
<p>Part of the problem is while the translation tools are
remarkable pieces of code, they aren't 100% accurate. Just
comparing a screenshot of the <strong>File</strong> menu for Notepad in
German shows that the translations don't match, perhaps to do
with the different contexts. For example, <strong>Exit</strong> is listed as
<strong>Beenden</strong> in the screenshot but <strong>Ausfahrt</strong> in the automatic
translation.</p>
<h2 id="other-problems">Other Problems</h2>
<p>The fact that translations are possibly inaccurate is only one
problem, during the course of experimenting with localization
I've identified a few others. Perhaps if you are a skilled
translator you already know the answers to these, I certainly
don't!</p>
<h3 id="keyboard-accelerators">Keyboard accelerators</h3>
<p>Power users will be used to certain standard key combinations,
for example Alt+F, X to exit an application. At least, that's a
standard key combination for English locales. Referring back to
my German example, that combination now changes to Alt+D, B.</p>
<p>Originally I had planned to try and mirror accelerators. But if
<strong>File</strong> in German is <strong>Datei</strong>... well, there's a distinct lack
of a F. I could try and auto detect, and use the first free
letter, but again that's going to cause problems. For example,
my screenshot shows that <strong>Format</strong> in German is still
<strong>Format</strong> and (in Notepad at least) the accelerator remains the
same - O. But if I was to use automatic accelerator calculation,
then it would end up as F as there's no other top level menu
starting with F.</p>
<p>So, there's one problem, and a remarkably frustrating one.</p>
<h3 id="short-cut-keys">Short-cut Keys</h3>
<p>The next problem I identified is related to the first. Again,
power users will frequently make use of short-cut keys, such as
<strong>Ctrl+N</strong> to create a new document. The convention of these is
widespread. But what about short-cuts for text that is
different. For example, formatting something as bold. In many
editors, this is Ctrl+B. However, if I ask Google Translate for
Bold in German... it gives a <em>lot</em> of results. And not one
starts with a B. Do you keep the Ctrl+B shortcut or do something
else?</p>
<p>Either of the above issues could be infuriating for an end user,
to have application text displayed one way, yet keyboard support
that is at odds with other applications.</p>
<h3 id="layout">Layout</h3>
<p>The final problem is one of layout. The screenshot in the
previous section section shows the program we're using to do
automatic translations. One thing is very apparent - some of the
translations are much longer than their English equivalents.
This means overlapping text and controls in the UI. Again,
something else that is bound to annoy an end user!</p>
<p>Another issue that I haven't even began to investigate would be
right to left layouts which is probably going to be quite
problematic to address.</p>
<h2 id="does-it-work-though">Does it work though?</h2>
<p>With the caveats of the issues mentioned above, it actually does
work. The below image shows Gif Animator running with a
in-progress Russian translation.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/localization-1c.png" class="gallery" title="Gif Animator, localized. Sort of." ><img src="https://images.cyotek.com/image/thumbnail/blog/localization-1c.png" alt="Gif Animator, localized. Sort of." decoding="async" loading="lazy" /></a><figcaption>Gif Animator, localized. Sort of.</figcaption></figure>
<p>It's very incomplete - only bits of the UI have been translated,
not one of the menu items has an accelerator, some strings are
missing from the packed language file and I haven't even began
to look at localizing messages and the other libraries used by
Gif Animator. Also, I haven't a clue what any of it says. It
might be accurate, or it might be deeply insulting.</p>
<p>It's going to be quite a challenge!</p>
<p>The next update to Gif Animator will (probably) include some of
these draft language files. However, without community support
to improve the files it may not be a perfect experience and
therefore subsequently dropped. We can fix technical issues (and
do some digging into how accelerators and short-cuts are handled
in other languages), but hiring professional translators is
unfortunately not possible.</p>
<p>Ultimately, I'm sure the software would be more useful to end
users if it &quot;spoke their language&quot; so hopefully this experiment
will work out.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-10-28 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/potential-support-for-localization .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comGif Animator 0.0.4.0 Beta Releasedurn:uuid:adbc2a10-6a26-4d8f-b0d2-68770e35f14e2014-10-12T08:25:53Z2014-10-12T08:25:53Z<p>It hasn't been long since the last update to Gif Animator and
although I don't want to make a habit of cluttering the product
blog with boring release notifications I'll probably make an
exception for releases with interesting new features or
important bug fixes. Both of which I think this update qualifies
for! This update offers various UI tweaks and enhancements, some
performance improvements, the odd new tool and quite a few bug
fixes.</p>
<p>You can view a full list of changes <a href="https://www.cyotek.com/cyotek-gif-animator/revision-history">here</a>, a condensed
summary is available below, and you can download from the <a href="https://www.cyotek.com/cyotek-gif-animator">usual
place</a>.</p>
<h2 id="whats-new">What's New</h2>
<ul>
<li>A new tool for <a href="https://blog.cyotek.com/post/gif-animators-new-transparency-tool">selecting frame transparency</a></li>
<li>The ability to <a href="https://blog.cyotek.com/post/resizing-and-cropping-round-1">resize frames and animations</a>, or to crop
large images when importing them into an animation</li>
<li>Better/faster rendering of thumbnails and animation previews</li>
<li>New options for controlling thumbnails</li>
<li>Improved Clipboard support</li>
<li>UI teaks</li>
</ul>
<h2 id="whats-fixed">What's Fixed</h2>
<ul>
<li>Fixed some issues with displaying squares or smudges instead
of the … character</li>
<li>Fixed a couple of different issues with looping support for
animations</li>
<li>Fixed various issues when importing files</li>
<li>Fixed numerous issues with commands being enabled when they
shouldn't be, doing the wrong thing if triggered via hotkeys,
or not checking to see if things were possible before trying
to do them anyway. Or they did nothing at all</li>
<li>Fixed numerous regressions caused by last update's switch to
an entirely new application model</li>
<li>Fixed a number of UI inconsistencies or crashes due to UI
trying to process invalid frames (or frames being processed in
a batch operation)</li>
</ul>
<h2 id="whats-not-fixed">What's Not Fixed</h2>
<ul>
<li>Documentation. I had wanted the documentation to be fully
overhauled for the next update, but there wasn't time for this</li>
<li>Bugs. There have been a couple of bugs reported which we
haven't been able to reproduce and therefore fix. If you
experience a software crash, please try and explain the
context of the crash to give us a fighting chance to fix it</li>
</ul>
<h2 id="whats-next">What's Next</h2>
<ul>
<li>.NET 4. With some exceptions most of our products target .NET
3.5, and this is now hurting development - it's time to move
on. Not that I plan on giving up on beloved WinForms for WPF!</li>
<li>Palettes. While Gif Animator needs to be easy to use, it also
should offer support for power users. Palettes are an
important part of animations and Gif Animator currently has
poor support for these</li>
<li>Advanced Optimisation. Another powerful feature of GIF files
is the ability to have tiny images with only the changed
pixels from the previous frame. Again, Gif Animator doesn't
make it easy to make use of this functionality</li>
<li>More Bugs. There still issues on our backlog to be resolved
and likely more to be discovered</li>
</ul>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-03-27 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/gif-animator-0-0-4-0-beta-released .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comResizing and cropping, round 1urn:uuid:36d3092e-879e-4d97-8383-7275d27eae132014-10-08T17:54:06Z2014-10-08T17:54:06Z<p>The next update to the Gif Animator is fast approaching, and
it's quite a big one - there's a very long list of both bug
fixes and new features. In fact, I'm pretty pleased with the way
the product is evolving, although there's still much to do.</p>
<p>A number of enhancements in the next update are to do with
resizing and cropping of images, and that is what this post will
talk about.</p>
<h2 id="adding-larger-images">Adding Larger Images</h2>
<p>Currently, if you <em>add</em> an image to an existing animation by
using the <strong>Add Image</strong> command and the image you are adding is
larger than the animation, the &quot;canvas size&quot; of the animation
will be increased.</p>
<p>However, if you paste an image from the Clipboard or use the
<strong>Replace Image</strong> command, then the image will be added as is
with no further adjustments. If you then save the animation,
it's effectively invalid because one or more frames are bigger
than the supposed bounds. Gif Animator doesn't have a problem
opening such animations, but I noted in testing that Internet
Explorer refused to play such animations. Not really ideal!</p>
<p>Now, no matter how you add an image<sup>1</sup>, if the image is
larger than the source animation a dialog will be displayed
asking you how to proceed, offering the following options</p>
<ul>
<li>Increase the animation canvas size</li>
<li>Crop the image</li>
<li>Resize the image</li>
</ul>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gif-animator-import-image.png" class="gallery" title="Adding a larger image to a fairly small animation" ><img src="https://images.cyotek.com/image/thumbnail/blog/gif-animator-import-image.png" alt="Adding a larger image to a fairly small animation" decoding="async" loading="lazy" /></a><figcaption>Adding a larger image to a fairly small animation</figcaption></figure>
<p>The screenshot above shows an example image being added to an
animation that is only 32 x 32 pixels in size, and shows the
crop option. Cropping allows you to select part of the image (no
larger than the canvas size) and import just that part.</p>
<p>I'll cover the two resize options in the sections below.</p>
<blockquote>
<p><sup>1</sup> Currently if you add an entire animation to an
existing animation, it will do the old behaviour and just
resize the animation canvas.</p>
</blockquote>
<h2 id="changing-the-canvas-size">Changing the canvas size</h2>
<p>While each frame in an animation can have a custom size, the
animation as a whole has its own size. I'm going to call this
the canvas size for want of anything better, and it's a
recognized convention anyway. You can make the canvas larger, or
smaller, and rearrange the positions of the images of each
frame.</p>
<p>While you can currently change the canvas size easily enough,
you have to manually reposition any frame offsets which isn't
ideal. The next update helps to mitigate this by providing a new
<strong>Resize Canvas</strong> tool, which as noted can be accessed
automatically when importing a large image, but can also be used
at any other time.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gif-animator-canvas-size.png" class="gallery" title="Resizing the canvas of an animation" ><img src="https://images.cyotek.com/image/thumbnail/blog/gif-animator-canvas-size.png" alt="Resizing the canvas of an animation" decoding="async" loading="lazy" /></a><figcaption>Resizing the canvas of an animation</figcaption></figure>
<p>Here we see an example of the tool in action - firstly you
specify the size of the new canvas, either by simply specifying
a percentage to increase/decrease the size by, or providing
absolute values, along with helpful previews to show you the
outcome.</p>
<p>In addition, you can also define how you want existing frames
repositioned - for example, you might be adding some form of
background graphic and wish to push existing frames into the
bottom right. At the moment you can select one of 9 positions, a
future update will add finer control in a similar manner as
offered by the <strong>Text</strong> and <strong>Watermark</strong> effects.</p>
<h2 id="resizing-an-entire-animation">Resizing an entire animation</h2>
<p>Of course, you might not want to change the canvas size. Perhaps
you have a large animation and you want to create a smaller
version. With the <strong>Resize Animation</strong> tool this can now be
easily done.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gif-animator-resize-animation.png" class="gallery" title="Resize an animation and all the frames within it" ><img src="https://images.cyotek.com/image/thumbnail/blog/gif-animator-resize-animation.png" alt="Resize an animation and all the frames within it" decoding="async" loading="lazy" /></a><figcaption>Resize an animation and all the frames within it</figcaption></figure>
<p>This tool offers similar percentage or absolute based sizing,
and also allows you to specify the resampling mode of the
resized frames. Any custom offsets used by frames will be
automatically adjusted to fit the new size.</p>
<h2 id="resizing-an-image">Resizing an image</h2>
<p>Sometimes you might want to resize the image contained in a
frame and this too is now possible, using the same interface as
resizing an animation above. As with most other frame tools, you
can select multiple frames in the animation and resize them all
at once.</p>
<h2 id="anything-else">Anything else?</h2>
<p>That's about it for this update, in terms of resizing
functionality at least. I have quite a few more ideas for
functionality in these areas, but a release isn't a release
unless it's ... well, released!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-10-08 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/resizing-and-cropping-round-1 .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comGif Animator's new transparency toolurn:uuid:491295d0-cb7a-4da0-b48b-a9ddd9a12c6c2014-09-30T19:28:34Z2014-09-30T19:28:34Z<p>GIF images have both their strong sides and their downsides.
Whilst not supporting any form of alpha transparency, they do
offer turning one colour entry per frame into a fully
transparent pixel.</p>
<p>I've spent the last week fixing some of the bugs that have been
reported and a bunch more regressions due to the new libraries,
whilst also trying to fix (with scant success) some others that
I can't reproduce locally or have any idea how they occurred.
Glorious bugs...</p>
<p>In between the fixing, I've also been improving. One of the
improvements to be found in the next build is an improved
transparency selection tool.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gif-animator-transparency-old.png" class="gallery" title="Pick a colour, any colour, but which is the right one?" ><img src="https://images.cyotek.com/image/thumbnail/blog/gif-animator-transparency-old.png" alt="Pick a colour, any colour, but which is the right one?" decoding="async" loading="lazy" /></a><figcaption>Pick a colour, any colour, but which is the right one?</figcaption></figure>
<p>The image above shows the current transparency tool which allows
you to select the colour that will be excluded from the rendered
image. While there's nothing wrong with the dialog per se, it's
not very helpful either.</p>
<p>Lets have another go at making a more useful feature!</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gif-animator-transparency-new.png" class="gallery" title="Oooo, shiny!" ><img src="https://images.cyotek.com/image/thumbnail/blog/gif-animator-transparency-new.png" alt="Oooo, shiny!" decoding="async" loading="lazy" /></a><figcaption>Oooo, shiny!</figcaption></figure>
<p>The first obvious difference is that there's now a preview which
operates in the same manner as other previews in the software,
synchronised panning, zoom etc. So at least now when you select
a colour from the palette, you can tell if you've picked the
right one!</p>
<p>While the original palette selection is still available (it's
now on a secondary tab) the primary focus of the dialog is a
clickable image of the selected frame - simply click the area of
the image you want to make transparent, and it's as simple as
that. If you're setting the transparency of multiple frames at
once, you can also choose which frame to use as the preview
source.</p>
<p>There's also a &quot;live preview&quot; option - check this box to have
the preview automatically update as your cursor moves across the
image.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gif-animator-transparency.gif" class="gallery" title="Using the new transparency tool" ><img src="https://images.cyotek.com/image/blog/gif-animator-transparency.gif" alt="Using the new transparency tool" decoding="async" loading="lazy" /></a><figcaption>Using the new transparency tool</figcaption></figure>
<p>This new tool will be in the next update - to be released as
soon as I can squish some more bugs!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-09-30 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/gif-animators-new-transparency-tool .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comGif Animator 0.0.3.0 Beta Releasedurn:uuid:69d52eac-f0ee-4cc1-87cd-9cbb1e57f93b2014-09-21T17:15:44Z2014-09-21T17:15:44Z<p>Today I'm pleased to announce the latest update for Gif Animator
has been released. This new version is the first of our products
to use new libraries that provide much more functionality that
was previously available - even if the UI itself doesn't look
that much different, under the hood it's <em>very</em> new.</p>
<p>Some of the notable changes in this update include</p>
<ul>
<li><a href="https://blog.cyotek.com/post/first-looks-at-multiple-documents-and-docking-windows#multiple-documents">Multiple documents</a></li>
<li><a href="https://blog.cyotek.com/post/first-looks-at-multiple-documents-and-docking-windows#window-layouts">Configurable window layouts</a></li>
<li><a href="https://blog.cyotek.com/post/upcoming-support-for-portable-settings">Portable settings</a></li>
<li>New Text effect for adding text to frames</li>
<li>New Watermark effect for overlaying images on frames</li>
<li>Ability to generate a sprite sheet / texture atlas from an animation</li>
</ul>
<p>More information on smaller updates and bug fixes can be found
in the <a href="https://www.cyotek.com/cyotek-gif-animator/revision-history">release notes</a></p>
<p>We very much hope you find this update useful!</p>
<h2 id="who-needs-documentation-anyway">Who needs documentation anyway?</h2>
<p>The help file hasn't been updated for this release, and so
there's bound to be discrepancies between what help says and
what the application does. We'll be updating the documentation
in a subsequent update, and some of the new features will also
be described in upcoming blog posts.</p>
<h2 id="new-code-new-bugs">New Code, New Bugs</h2>
<p>There is a <em>lot</em> of new code in this update, and while we've
made some effort to test it, we can't anticipate or cover
everything. So there's bound to be bugs. If you encounter any
problems using this software, please let us know!</p>
<p>In addition to actual show stopping crash bugs, there may also
be quirks of the UI that prevent you from working effectively.
As an example of one noticed while doing a pre-release smoke
test the <strong>Save</strong> button is disabled when the <strong>Frame</strong> or
<strong>Animation</strong> properties windows are active. The software does
think there's a good idea for doing this, but it doesn't help
the workflow of someone who tinkers the properties of an
animation and then wants to save without extra clicks! So we'll
address that for the next release too.</p>
<p>We also haven't done much with performance. First time start-up
is quite slow (slow enough that I ended up fixing the splash
screen originally added for <a href="https://www.cyotek.com/cyotek-spriter">Spriter</a> back in
2011 (but it didn't work and so was never switched on),) after
that though it uses a new caching system that should help.
However, we still have ideas to implemented to boost this even
more in addition to still needing to do some dedicated
performance profiling.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-09-21 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/gif-animator-0-0-3-0-beta-released .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comUpcoming support for portable settingsurn:uuid:1d7a029b-8304-495c-b685-3adc153c4d0c2014-08-17T11:52:21Z2014-08-17T11:52:21Z<p>In my <a href="https://blog.cyotek.com/post/first-looks-at-multiple-documents-and-docking-windows">last &quot;all products&quot; update</a>, I discussed how the user
interface was being made more useful. In this second, shorter,
update I will briefly cover upcoming changes to settings.</p>
<p>As with the previous UI update, this will only apply to new
versions of our tool set that have been redeveloped to use the
new libraries (at time of writing only an internal build of <a href="https://www.cyotek.com/cyotek-gif-animator">Gif
Animator</a>).</p>
<h2 id="portable-applications">Portable applications?</h2>
<p>There's been a couple of occasions where I've received user
requests for portable versions of our tools.</p>
<p>All of Cyotek's supported products have been developed using C#
and the .NET Framework (either version 3.5 or 4.0 depending on
the product). This means they cannot be truly portable in the
same way a self-contained C++ application could be. But, as .NET
is built into most versions of Windows now, the barriers are
mostly related to our software rather than anything else.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/settings-1a.png" class="gallery" title="Default settings located in the Windows Registry" ><img src="https://images.cyotek.com/image/thumbnail/blog/settings-1a.png" alt="Default settings located in the Windows Registry" decoding="async" loading="lazy" /></a><figcaption>Default settings located in the Windows Registry</figcaption></figure>
<p>Currently, all application settings are stored in the Registry
located below <code>HKEY_CURRENT_USER\Software\Cyotek</code>. This makes it
a little more complicated to sync settings between two machines,
or have the binaries on a USB drive for portability.</p>
<h2 id="changes-to-settings-formats">Changes to settings formats</h2>
<p>The new application libraries both change these defaults, and
add a bit more flexibility.</p>
<p>By default settings are no longer stored in the Registry, but
are stored as XML files located below
<code>C:\Users\&lt;UserName&gt;\AppData\Roaming\Cyotek\</code>. You can change
this back to the Registry if required, or switch to ini file
style settings if that's what you prefer.</p>
<p>This now means it's a lot more easier to sync settings at the
very least, although it still means writing to the file system
of the host, which defeats the point of sticking the tool on a
USB drive!</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/settings-1b.png" class="gallery" title="Settings stored in the users application data folder" ><img src="https://images.cyotek.com/image/thumbnail/blog/settings-1b.png" alt="Settings stored in the users application data folder" decoding="async" loading="lazy" /></a><figcaption>Settings stored in the users application data folder</figcaption></figure>
<p>The image above shows a screenshot of the new settings folder,
complete with several files that contain the application
settings, window layouts and toolbar configuration. Although not
strictly related to settings, the tools will also cache
application data here too.</p>
<h2 id="ability-to-override-paths">Ability to override paths</h2>
<p>If we truly need to offer portability, then we need to provide a
way for the user to specify where settings and data files are
located. This can now be done by creating a file named
<code>system.ini</code> in the same folder as the application.</p>
<blockquote>
<p>Note: The technique described below may change before final
release</p>
</blockquote>
<p>Currently this file supports the following settings:</p>
<ul>
<li><code>UserDataPath</code> - the path where user settings are stored</li>
<li><code>CommonDataPath</code> - the path where common (all user) settings
are stored</li>
<li><code>TemplatesPath</code> - the path where templates can be found
(derived from <code>CommonDataPath</code>)</li>
<li><code>SamplesPath</code> - the path where samples can be found (derived
from <code>CommonDataPath</code>)</li>
<li><code>SettingsType</code> - the settings format</li>
</ul>
<p>User should only need to change <code>UserDataPath</code>, and possibly
<code>CommonDataPath</code> but the others ought to be fine as is. Each of
the four paths accept a value that is relative to the executable
folder.</p>
<figure class="lang-ini highlight"><figcaption><span>ini</span></figcaption><pre class="code">
[<span class="section">System</span>]
UserDataPath<span class="symbol">=.\</span>settings
</pre>
</figure>
<p>Using the above example, if the program was on <code>X:\tools</code>, the
path where settings would be both read from and written to would
be <code>X:\tools\settings</code>.</p>
<p>This makes it possible to reconfigure the software to have their
setting files elsewhere (for example a Dropbox sync folder) or
located on a USB device and not touch the host system.</p>
<h2 id="other-considerations">Other considerations</h2>
<p>At the moment, if you want to overwrite the path, you have to
explicitly force this. I'm considering also have the software
detect if it is running from a USB drive, and if so, to
automatically have settings and data stored on the USB drive
relative to the application folder. If you have any comments (on
either method), let me know!</p>
<p>I mentioned the <code>SettingsType</code> value above. This can be either
<code>ini</code>, <code>xml</code> or <code>registry</code>, allowing you to choose between two
text based formats, or the Windows Registry. Of course, choosing
the latter throws easy syncing out of the window but the options
are there for those who need them.</p>
<p>Another minor change from how Cyotek's applications currently
work is that settings are no longer saved as soon as they are
changed (well, unless you're using registry settings of course).
Instead, they are saved prior to being exported (or new settings
imported) and when the application exits.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-08-17 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/upcoming-support-for-portable-settings .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comFirst looks at multiple documents and docking windowsurn:uuid:46645db3-f905-48c7-b7cf-ab6b620530242014-08-06T18:57:56Z2014-08-06T18:57:56Z<p>Two years ago we created a prototype for a new version of the
help authoring tool we used to offer. The main reason for the
prototype was to trial writing a new product using test driven
development (TDD) techniques. This worked very well, but not so
well when it came to adding a user interface.</p>
<p>All our current tools use a standard series of libraries we've
developed over the years, and provide vast amounts of common
functionality, from settings management, windows and UI
components, plug-ins, and a lot more. However, they all work
around the principle of a single application window bound to a
single document, with a variable amount of custom views that can
be hosted in that window.</p>
<p>That approach doesn't really work with something like a help
project, where you have the project itself, content topics, and
any number of other items that you might want to open side by
side. Out of the 7 productivity tools we currently offer, four
of them would be more useful if they were MDI and all of them
could benefit from better layout management.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gif-animator-current.png" class="gallery" title="What if you want to edit multiple animations at once? What about frame editing?" ><img src="https://images.cyotek.com/image/thumbnail/blog/gif-animator-current.png" alt="What if you want to edit multiple animations at once? What about frame editing?" decoding="async" loading="lazy" /></a><figcaption>What if you want to edit multiple animations at once? What about frame editing?</figcaption></figure>
<p>At the end of last year, as soon as the <a href="https://www.cyotek.com/cyotek-gif-animator">Gif Animator</a> alpha
was released we started working on rebuilding our application
framework from the ground up. This has now been ongoing for the
past eight months, writing objects, testing objects, and
steadily adding to the required features.</p>
<p>I'm not going to talk about most of this as I suppose the end
user doesn't really care about the implementation details that
delight us, but I will talk about the UI improvements! And some
non-UI features in a future post perhaps.</p>
<p>The image below shows a screenshot of an updated build of Gif
Animator using the new library.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gif-animator-new.png" class="gallery" title="A look at the next version of Cyotek's Gif Animator... spot the differences from the earlier image" ><img src="https://images.cyotek.com/image/thumbnail/blog/gif-animator-new.png" alt="A look at the next version of Cyotek's Gif Animator... spot the differences from the earlier image" decoding="async" loading="lazy" /></a><figcaption>A look at the next version of Cyotek's Gif Animator... spot the differences from the earlier image</figcaption></figure>
<p>At first glance it should seem very familiar to the current
build - frames on the left, properties on the right, and so on.
But a closer look should show a few new UI clues...</p>
<h2 id="multiple-documents">Multiple Documents</h2>
<p>The first noticeable difference is the document has it's own
tabbed header. You can now open multiple documents and work on
them from the same instance of the program.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gif-animator-mdi.gif" class="gallery" title="A brief look at the multiple document interface" ><img src="https://images.cyotek.com/image/blog/gif-animator-mdi.gif" alt="A brief look at the multiple document interface" decoding="async" loading="lazy" /></a><figcaption>A brief look at the multiple document interface</figcaption></figure>
<p>Although I haven't tried to demonstrate it here, you can group
windows horizontally or vertically or float them. You can also
switch from the &quot;tabbed MDI&quot; mode to a more classic MDI window
mode if needs be.</p>
<h2 id="window-layouts">Window Layouts</h2>
<p>The second difference is that the tabs for the old views are now
at the bottom of the properties area, and there's pinning icons.
These &quot;views&quot; are now proper windows, and can be dragged around,
docked to the application window, floated, docked to floating
windows, use auto-hide, and a whole lot more!</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gif-animator-windows.gif" class="gallery" title="A brief look at window layouts" ><img src="https://images.cyotek.com/image/blog/gif-animator-windows.gif" alt="A brief look at window layouts" decoding="async" loading="lazy" /></a><figcaption>A brief look at window layouts</figcaption></figure>
<p>This allows you to set up your window &quot;just so&quot; and have things
where you want them, rather than where we think they should go.
Layouts persist across sessions, and there's also a handy
&quot;reset&quot; option just in case.</p>
<h2 id="whats-next">What's next</h2>
<p>I now think these features are stable enough to firstly show off
as something other than vapour-ware, and also as something that
should be appearing sooner rather than later.</p>
<p>Currently our plans are for the Gif Animator to use the new
libraries with the next update, and then the <a href="https://www.cyotek.com/cyotek-palette-editor">Color Palette
Editor</a> to follow after that.</p>
<p>The plans are less certain for <a href="https://www.cyotek.com/cyotek-spriter">Spriter</a> and <a href="https://www.cyotek.com/cyotek-slicr">Slicr</a>, as
the new framework isn't compatible with the existing library and
lot of work will be required in order to utilize the new
libraries.</p>
<p>There's also almost certainly bugs in the new code, and possibly
feature gaps as well if some esoteric feature one of the other
programs relies on isn't present in the new code. But eventually
all our productivity tools should be sporting the new features.</p>
<p>We hope you find this sneak peak useful, and as always <a href="https://www.cyotek.com/contact">welcome
your comments</a>.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-08-06 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/first-looks-at-multiple-documents-and-docking-windows .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comA sneak peak at upcoming features for the color palette editorurn:uuid:13ae0430-fee5-40b9-9a09-3a484ab3acee2014-07-30T18:47:34Z2014-07-30T18:47:34Z<p>Updates have been slow the last few months as most of our
development time has been on rewriting our application
framework, which I'll talk about in another post.</p>
<p>With this post, I wanted to quickly demonstrate some upcoming
features of the <a href="https://www.cyotek.com/cyotek-palette-editor">Color Palette Editor</a>. The first of these
features has been work in progress for a while now and
regretfully it'll probably be WIP for a bit longer yet.</p>
<h2 id="colour-schemes">Colour Schemes</h2>
<p>When I first wrote the editor, the idea always was that it could
be used to help you to choose colours in addition to blindly
selecting values. This is done via the <strong>Schemes</strong> view which
appears (at least in debug builds, sorry :)) on the right hand
side of the application window.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/paledit-schemes.gif" class="gallery" title="The Schemes View" ><img src="https://images.cyotek.com/image/blog/paledit-schemes.gif" alt="The Schemes View" decoding="async" loading="lazy" /></a><figcaption>The Schemes View</figcaption></figure>
<p>Currently the schemes view can generate colors in the following
fixed schemes. Each scheme uses the same saturation and
luminance, but with a different hue.</p>
<ul>
<li><strong>Harmonious</strong> - 12 colours (including the base) evenly spaced
throughout the wheel</li>
<li><strong>Complimentary</strong> - two colours at opposite ends of the wheel</li>
<li><strong>Analogous</strong> - one colour at either side of the base colour</li>
<li><strong>Triadic</strong> - three colours that are evenly spaced across the
wheel</li>
<li><strong>Split Complementary -</strong> two colours side by side at the
opposite side of the wheel from the base colour</li>
<li><strong>Tetradic</strong> - two pairs of complimentary colours at opposite
ends of the wheel</li>
</ul>
<p>In the current build, once you have selected a base colour, you
can then select a scheme and drag around the primary colour to
generate new colours.</p>
<p>Unfortunately this won't be in the next build. Firstly, as it
isn't complete - you can't add the schemes to a palette, nor can
new schemes be created as currently it's hard-coded to the 6
above and I'd prefer a bit more flexibility!</p>
<p>However, the main reason is that the colours in the scheme are
wrong, because the wheel itself is &quot;wrong&quot;.</p>
<p>The Color Palette Editor uses a wheel modelled after <a href="http://en.wikipedia.org/wiki/HSL_and_HSV" rel="external nofollow noopener">HSL</a>.
However, the formula's for the schemes above are based on a
red-yellow-blue (<a href="http://en.wikipedia.org/wiki/RYB_color_model" rel="external nofollow noopener">RYB</a>) model. This model divides the wheel
between warm and cold colours (for example blue is opposite
orange), making it much better for this type of thing.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/hsl-wheel.png" class="gallery" title="HSL Example" ><img src="https://images.cyotek.com/image/thumbnail/blog/hsl-wheel.png" alt="HSL Example" decoding="async" loading="lazy" /></a><figcaption>HSL Example</figcaption></figure><figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/ryb-wheel.png" class="gallery" title="RYB Example" ><img src="https://images.cyotek.com/image/thumbnail/blog/ryb-wheel.png" alt="RYB Example" decoding="async" loading="lazy" /></a><figcaption>RYB Example</figcaption></figure>
<p>The images above show the two wheels.</p>
<p>Currently I haven't decided how to work with this. I don't want
two different wheels, but this would then mean replacing the HSL
wheel completely with an RYB one. For the time being therefore
this feature will still be disabled in the next version.</p>
<h2 id="undo-and-redo">Undo and Redo</h2>
<p>For some reason adding undo/redo support to our applications has
always been bottom of the pile in terms of enhancements. But as
we need this for properly supporting upcoming features (for
example the schemes above) and because a user mentioned it,
finally we've gotten around to adding it. Maybe it will now find
its way to the rest of our products!</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/paledit-undo.gif" class="gallery" title="Undo and Redo? About time!" ><img src="https://images.cyotek.com/image/blog/paledit-undo.gif" alt="Undo and Redo? About time!" decoding="async" loading="lazy" /></a><figcaption>Undo and Redo? About time!</figcaption></figure>
<p>Undo/Redo hasn't yet been fully integrated with all options but
barring any issues this should be in the next build.</p>
<h2 id="comments">Comments</h2>
<p>I'd love to hear any comments you have on these features, or any
other features you'd want to see.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-07-30 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/a-sneak-peak-at-upcoming-features-for-the-color-palette-editor .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comWebCopy 1.0.9.0 released - multiple hosts and proxy server supporturn:uuid:34e9fe8a-2f76-4bc5-a1e6-156f4b8f02132014-06-01T20:36:22Z2014-06-01T20:36:22Z<p>The latest update to WebCopy has just been released, and
includes two new features which expand the usefulness of the
product.</p>
<blockquote>
<p>These features are considered experimental at this stage -
they haven't been as fully tested as some other features, and
as a result they either might not work properly or have
unintended side effects.</p>
</blockquote>
<h2 id="multiple-hosts">Multiple Hosts</h2>
<p>One of the more odd omissions of WebCopy was the fact it
wouldn't crawl other hosts. You could copy sub domains, but what
about if you used a CDN with a completely different domain name?
Fortunately that deficit has now been rectified. The
<strong>Additional Hosts</strong> configuration page lets you specify
additional domains to crawl.</p>
<p>Now, when WebCopy finds an external URI, it will check to see if
the domain is listed as safe to crawl. If it is, it will
promptly download the linked resource, and then attempt to scan
it for further links, and expand from there.</p>
<p>As these additional hosts can be jumped into from any level,
some project settings won't apply to the additional hosts - for
example the <strong>Crawl Above Root</strong> setting. Therefore it is
important to make sure you use rules to control how content is
downloaded.</p>
<h2 id="proxy-server-support">Proxy Server Support</h2>
<p>Previously, WebCopy would use the system defined proxy server
settings. Now you can config your own independent settings on a
per-project based. This allows all requests during a crawl to be
sent via the proxy.</p>
<h2 id="odds-and-ends">Odds and ends</h2>
<p>With these features being new and only tested in a limited
fashion, there could be bugs or side effects - please let us
know if you experience any problems.</p>
<p>As is usual for these updates, there is also a handful of bug
fixes and minor new functionality, mostly around the UI
interactions, but also including a fix where WebCopy would treat
certain URI's as sub domains even though they weren't.</p>
<p>We hope you enjoy this update to the product!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-06-01 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/webcopy-1-0-9-0-released-multiple-hosts-and-proxy-server-support .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comGif Animator and Image Effectsurn:uuid:863fef4e-b2f3-4191-8b2a-6fc75741150f2014-04-06T14:07:23Z2014-04-06T14:07:23Z<p>Although we haven't really drawn attention to it by providing
samples or SDK documentation, all of Cyotek's products are
extensible in various ways. As long as you can code in a .NET
language and can work with the API each product provides that
is.</p>
<p>Cyotek's Gif Animator is no exception. The currently released
version supports the same level of &quot;standard&quot; add-ins that other
products include, and the development version now includes a new
experimental image effects plugin system too.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gifan-applyeffect.gif" class="gallery" title="Applying an effect to multiple animation frames" ><img src="https://images.cyotek.com/image/blog/gifan-applyeffect.gif" alt="Applying an effect to multiple animation frames" decoding="async" loading="lazy" /></a><figcaption>Applying an effect to multiple animation frames</figcaption></figure>
<p>When it came to adding support for custom image effects, I
wanted to simplify the process of how to create them as
typically extension development isn't the most intuitive of
tasks. In additional, I was originally going to directly reuse
the effects library that Spriter uses, but that's not really
possible.</p>
<p>Behind the scenes, Spriter's image processing is a little clunky
- it passes <code>Bitmaps</code> and <code>Images</code> around and expects effects to
return the same information. That doesn't make for the fastest
of processing, even though Spriter does try to mitigate this in
small ways.</p>
<p>Gif Animator on the other hand, works purely with the
<em>description</em> of an image. For an optimized frame, this is a
flat array of bytes pointing to entries in an 8bit palette. An
unoptimized frame uses a flat array of 32bit ARGB colours. Image
processing is therefore much faster and there's no need to
create images at each turn - only when you actually want to
display an image on the screen.</p>
<p>Part of the problem is also writing effects. Ideally, effects
should essentially be macro's which take a colour and do
something with it. Why make it horribly complex?</p>
<p>I currently use <a href="http://www.getpaint.net/" rel="external nofollow noopener">Paint.NET</a> for most of our image editing,
and that has an extensive plugin scene. <a href="http://www.boltbait.com/" rel="external nofollow noopener">BoltBait</a> provides a
<a href="http://www.boltbait.com/pdn/codelab/help/overview.asp" rel="external nofollow noopener">handy overview</a> on how Paint.NET does it's processing and
more importantly provides CodeLab, a tool which takes a portion
of user code and converts it into a full effect, without the
user having to worry about development environments, references
or any number of things. I thought it worked really well, so I
reused the idea's for Gif Animator.</p>
<p>The screenshot below shows an example of the new Effect Builder
extension for Gif Animator:</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/gifan-effectsbuilder.png" class="gallery" title="An example effect that inverts the colours of an image" ><img src="https://images.cyotek.com/image/thumbnail/blog/gifan-effectsbuilder.png" alt="An example effect that inverts the colours of an image" decoding="async" loading="lazy" /></a><figcaption>An example effect that inverts the colours of an image</figcaption></figure>
<p>Not quite macro status (at the moment you still need to generate
a DLL, although this tool will do it for you) but much better
than Spriter's solution, plus it's WYSIWYG - much easier for
testing. I wonder why I didn't think of this myself.</p>
<p>The effects API is also somewhat derived from Paint.NET's - I
had a look at the older source code from when it was made
available and I've borrowed some idea's from that too. I thought
the technique I am using in Gif Animator for image processing
was fast (essentially I use pointers when I actually <em>want</em> to
create a true bitmap or for deconstructing an existing bitmap
and the rest of the time it's just accessing values in an
array), but Paint.NET is doing something beyond that. At some
point I'll spend some more time with that code and see if
there's some new tricks for me to learn, but the code I've
previously written is more than suitable for the task.</p>
<p>One thing I'm not doing yet is multi-threading effects. I think
I have a peculiar blind spot when it comes to that. I'll happily
use asynchronous, background, or multi-threaded tasks to keep a
UI responsive, but I never seem to consider using it to break up
execution of a single task. Off the top of my head I can only
think of one place I do that, and that is the directory scanning
parts of CopyTools. So with that said, these effects won't be
threaded at the current time, although given that animations are
typically fairly small I don't think this will be a problem. The
effects API is designed to be quite generic for use with Gif
Animator and any new products of a similar nature, and I intend
to update Spriter to use this too - although given how Spriter
works this may have be a &quot;version next&quot; feature.</p>
<p>Originally I only planned to obtain implementation ideas from
the CodeLab plugin, but in the end I used a lot of code from it
too, specifically in regards to the syntax highlighting and
intellisense. Normally I would use our customized version of the
<a href="http://www.digitalrune.com/Products/WindowsForms/TextEditorControl.aspx" rel="external nofollow noopener">DigitalRune Text Editor Control</a> but I wasn't happy with the
extreme flicking I was getting when testing intellisense, so I
went with CodeLab's rich text version
- it's not without it's own flaws, but no crazy flicker. As a
result of this, I'll make the source code available for the
Effects Builder with the next update release and then look later
at sorting out the normal editor.</p>
<p>As for when the next release will be, at the moment I'm not
sure. Currently the effects extension doesn't support any form
of configuration UI which is fairly important for anything other
than the most basic of transforms, so unless any bugs are found
that ought to be fixed sooner rather than later I may delay the
release to work in the effects API some more.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-04-06 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/gif-animator-and-image-effects .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comWebCopy 2.0 - Rules and Query Stringsurn:uuid:c1572356-7507-44b6-ad29-d125349576ea2014-03-27T18:40:11Z2014-03-27T18:40:11Z<blockquote>
<p>Note: WebCopy 2.0 isn't even in alpha yet. Images and
descriptions below are from prototype's testing the
feasibility of new functionality and how it might work. These
features might never see the light of day, look different,
work different, etc.</p>
</blockquote>
<p>As soon as WebCopy was originally completed, I knew it had a
rather large flaw. The system of rules it uses is quite
powerful, but fatally limited. Essentially you have a regular
expression to match a URL, and a number that tells WebCopy what
to do. Great if you can write regular expressions and want to do
a limited number of things. Utterly useless if you want more
control - such as skipping files which are 1GB in size, or that
are &gt; 10 levels deep.</p>
<p>Some of the most frustrating support requests we deal with tend
to be people trying to copy forums using WebCopy. While it's
technically possible, it's not an easy thing. Forums can have
many thousands of links, and a lot of them are replicated many
times for &quot;new posts&quot; and &quot;replies&quot; and so on. In most cases,
copying this is not what you want as it adds zero value to the
copy.</p>
<p>You could use regular expressions to filter out URI's containing
query strings of particular keys and values, that much at least
is possible (if regular expressions don't scare you aware that
is). But you can't manipulate the query string <em>at all</em>. Ok, you
can clear it completely, but that's going to be useful in a tiny
percentage of cases.</p>
<p>I wanted to add a proper rules system to WebCopy, but doing so
means a substantial rewrite of much of the crawling engine, and
that means essentially it's a &quot;version next&quot; feature. For the
last several months WebCopy updates have slowed down in terms of
bug fixes and enhancements that are directly to do with the
crawling engine. It's stable enough for most people it would
seem.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-ruletest.png" class="gallery" title="An example of a prototype rule engine" ><img src="https://images.cyotek.com/image/thumbnail/blog/webcopy-ruletest.png" alt="An example of a prototype rule engine" decoding="async" loading="lazy" /></a><figcaption>An example of a prototype rule engine</figcaption></figure>
<p>The screenshot above shows a prototype GUI for a new rule
engine. The bottom half of the screen shows the conditions of a
rule, and the upper half shows the results of the rule being
evaluated against a list of URI's - everything highlighted in
reddish orange has been matched against the rule, and so if this
were a fully functional application, the specified actions would
have been carried out.</p>
<p>It is currently my intention that this rule engine will control
all aspects of crawling in WebCopy 2.0, be it simple exclusions
of URI's, manipulation of query strings, or changes to the
downloaded HTML. Of course, the GUI might not look like you are
configuring rules of this nature, but behind the scenes that's
what it will be doing.</p>
<p>One of the great things about this type of system is that each
rule is self contained, making it so much easier to test, which
should mean for a more stable product from the start without
daft mistakes.</p>
<p>My final comments are regarding query strings, and the animation
below should describe nicely how that is being planned so far.</p>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/blog/webcopy-ruletest-wizard.gif" class="gallery" title="An Outlook style Rule Wizard GUI that lets you filter on multiple values for a string query string and then re-evaluates the URI list" ><img src="https://images.cyotek.com/image/blog/webcopy-ruletest-wizard.gif" alt="An Outlook style Rule Wizard GUI that lets you filter on multiple values for a string query string and then re-evaluates the URI list" decoding="async" loading="lazy" /></a><figcaption>An Outlook style Rule Wizard GUI that lets you filter on multiple values for a string query string and then re-evaluates the URI list</figcaption></figure>
<p>As I mentioned in the block quote at the start of this post,
nothing is final, not the functionality, nor the types of rules
that will be available, nor how the GUI will work - but I'll
touch upon the GUI specifically in another post.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-03-27 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/webcopy-2-0-rules-and-query-strings .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comAnnouncing the Product Blogurn:uuid:7eca8913-a3c9-430d-bea4-6896199030492014-03-27T18:40:00Z2014-03-27T18:40:00Z<p>This site has operated a <a href="https://www.cyotek.com/blog">blog</a> for several years now,
but it is mostly focused on .NET development topics.
Occasionally I've wanted to post product specific information,
but haven't wanted to put this in the blog as for all intents
and purposes, cyotek.com has two different audiences - those who
download and use our <a href="https://www.cyotek.com/products">products</a> and those who consume
our <a href="https://www.cyotek.com/source-code">source</a> <a href="https://www.cyotek.com/open-source">code</a>. I'd be betting
that there's not a lot of cross over between the two!</p>
<p>One of the recent support requests I received included a
question on how to keep up to date on product updates. Of
course, each product has a built in check for updates feature
(either manual or automatic), but there's no real way of keeping
track.</p>
<p>To resolve this, we've added a second blog to the site which
will contain topics of interest to users of our products. Each
product now also includes a dedicated RSS feed for articles for
that specific product. In a future update we'll also add
dedicated feeds for downloads too, allowing instant notification
of when new files are available.</p>
<p>Hopefully you find the new product blog useful, as always we'd
appreciate any comments - either <a href="#comments">here</a>, on the <a href="https://forums.cyotek.com">forums</a>,
or you can <a href="https://www.cyotek.com/contact">contact us</a>.</p>
<p>As the product pages don't include visible links to the RSS
feeds, here's a quick list for products current at the time of
publishing:</p>
<ul>
<li><a href="https://www.cyotek.com/cyotek-copytools/rss">Cyotek CopyTools</a></li>
<li><a href="https://www.cyotek.com/cyotek-gif-animator/rss">Cyotek Gif Animator</a></li>
<li><a href="https://www.cyotek.com/cyotek-palette-editor/rss">Cyotek Palette Editor</a></li>
<li><a href="https://www.cyotek.com/cyotek-sitemap-creator/rss">Cyotek Sitemap Editor</a></li>
<li><a href="https://www.cyotek.com/cyotek-slicr/rss">Cyotek Slicr</a></li>
<li><a href="https://www.cyotek.com/cyotek-spriter/rss">Cyotek Spriter</a></li>
<li><a href="https://www.cyotek.com/cyotek-webcopy/rss">Cyotek WebCopy</a></li>
</ul>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-03-27 - First published</li>
<li>2020-11-23 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://blog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> 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 opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://blog.cyotek.com/post/announcing-the-product-blog .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.com