tag:blogger.com,1999:blog-55698942024-03-08T11:32:43.001+00:00Distributed MemoryDiary, commentary, reviews, snippets to preserve on-lineSteve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.comBlogger1687125tag:blogger.com,1999:blog-5569894.post-45432666136938675702024-02-19T16:23:00.003+00:002024-02-24T18:02:53.978+00:00Anime 2023 and a bit<p>I took the opportunity to catch <b>Suzume</b> when it was playing at the local arthouse cinema. For the first film in-theatre in almost a decade, and first Shinkai since I noped out of <i>5cm/s</i> at a frozen railway platform, it made a good occasion to get back into each of those.</p>
<p>First and foremost, the boy-meets-girl strand is not played as the core of the movie, but comes about 3rd or 4th in the queue, after such things as chasing trouble-making cats, and saving Japan when there aren't <i>Yūsha</i> or <i>Tōji</i> around to deal with a problem more of the sort they are geared up for. And it does have the visual lushness that we expect from a Shinkai movie. Nothing too profound, but certainly more than worth the time spent.</p>
<p>One remarkable thing about the movie, in retrospect, is that <a href="https://www.youtube.com/watch?v=cON1-yyNXzw">the associated McDonalds ad</a> could be considered to contain a "canon deleted scene" - while there are many sponsors of the movie who have had co-promotions containing some excerpts (e.g. Narita Airport), the McD ad is one comprised entirely of animation, only part of which appears in the actual movie.</p>
<p>For TV shows, a glitch with Crunchy lasting from late July to mid November meant there was a big gap in watching, but the general quality of the airing shows meant that it hardly made a noticeable difference to my watching.</p>
<p>Released from the paywall, I finished <b>LycoReco</b>. Having started out as a cute girls do black ops series, it suffered the usual fate of series that start mostly episodic then grow a plot. The tale of a genki-girl natural born assassin who's all Sixth Commandment all the time doing clandestine peacekeeping activities would have been fine by itself, without bringing in a pound-shop Joker as a running antagonist. A sad case of a story having far more than just the one implausibility, almost an example of why you don't do that. Harmless to frustrating.</p>
<p><b>Birdie Wing</b> (1st cour) suffers another of the standard anime tics. MC, who is a legend in the world of clandestine gambling golf, and sees off other mob-owned players on an amazing mutable underground course meets another player who might be her equal - and then gets a special entry into an Under-15s tournament to play against her. Yep, this legend with a significant track record is another 14 year old prodigy. Mid-cour, the mafia element wraps up and suddenly it's a Japanese high-school golf tournament in the same vein as, say, <i>New Prince of Tennis</i>, right up to the point where the cour ends and we have to wait for the second to air, a year after the first. Decent enough time-filler, pity about the cliff-hanger.</p>
<p><b>Yurei Deco</b>, or <i>The Adventures of Hack'n'Berry, Finn, and the Detective Club on Tom Sawyer Island</i> was an interesting sub-Matrix style soft dystopia, with a couple of surprise (at least to me) gender reveals. I didn't notice whether there was any discussion of this elsewhere at the time, but it seemed one of those series that fly under the radar, and thus get under-appreciated. Good.</p>
<p><b>Shadows House S1</b> definitely speed-ran what was a long atmosphere building introduction to get to the first major event of the series, and its immediate consequences. <b>S2</b> recovered well from the first season's uncertain adaptation, and reached a logical pausing point without rushing matters. Verdict: Good, recommended.</p>
<p><b>The Case Study of Vanitas</b> - it's shoujo, it's silly, and if <i>LycoReco</i> is yuri-bait, then this is definite yaoi-bait. But then you expect a story of vampires in c1900s Paris to be full of raging haemosexuals anyway. In all, it was, let's say, interesting, though the mood whiplash from drama to slapstick and back got a little tiring after a while; but it's always interesting to see an anime take on places I've actually visited. Verdict: mostly harmless. Watch <i>Brotherhood of the Wolf</i> for a take on the same material as inspired the second cour that doesn't suffer from out of place levity.</p>
<p>Running through into the new year, from the backlog, <b>Wonder Egg Priority</b> which was a mess - so many things handwaved into the plot in the last few episodes to keep things happening, and then dropped or left dangling. Verdict - to travel hopefully is far better than to end in a soggy thud.</p>
<p>Ditto for <b>Vivy : Fluorite's Eye Song</b> which has the disadvantage of having become so dated in such a very short time. It kept itself together somewhat better at the end, though gave no explanation as to e.g. why going back a few more hours for the do-over to the do-over wasn't a thing. It was better when it was being an idol anime than anything else. I was amused by the ep 3 "Hotel Sunrise" disaster - of course it's a colony drop : with that name, it had to be.</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO_yDFsjuoNZOrXIEyimZe0NkabWrtvjpjRORUXFfSsiF_CDhvuoAIV77BmxadTMqeRw7Y1NMP0OlR2NFHFa1B5YNKvdllGpYLc8frkl1sFy_SDI_oblQdGrrSsyY3ygd2p9Ff46vc4m441vzAQce0Pn6SFZw_3n7BDkUzziAYCwfaf9gwR7oB/s1600/MEQZIE4_o.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="268" data-original-width="499" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO_yDFsjuoNZOrXIEyimZe0NkabWrtvjpjRORUXFfSsiF_CDhvuoAIV77BmxadTMqeRw7Y1NMP0OlR2NFHFa1B5YNKvdllGpYLc8frkl1sFy_SDI_oblQdGrrSsyY3ygd2p9Ff46vc4m441vzAQce0Pn6SFZw_3n7BDkUzziAYCwfaf9gwR7oB/s1600/MEQZIE4_o.png"/></a></div>
<p>Adding to the "and a bit", Caught <b>The Boy and the Heron</b> in the first week of January '24. It was OK (enough that I didn't feel annoyed about having to take my least favourite route home for night riding because of flooding on the quieter ones), but I feel that <i>The Wind Rises</i> would have stood as a better finisher, rather than doing one more encore. I wonder what his next movie will be. It felt to me that the film was rather about Miyazaki reconciling himself to the fact that Goro hasn't taken up the torch, and wonder about past events that might have surfaced in the film. Like that self-inflicted injury that I was sure was going to lead to wrath descending on the kid who'd bullied him, but went nowhere beyond writing the school back out of the story.</p>
<p>I tried a couple of episodes (prologue and Ep1) of <b>G-Witch</b>; and the former was a generic enough AU Gundam set up, seemingly entirely set aside in a first episode that hit the all beats of "Utena in Mobile-suits" (as has been the apparent summary of the series). Alas, Suletta is no Tenjou-san - indeed I can't offhand think of another example of such a wittering ninny as the eponymous witch in the MC role, at least in anything I stuck with. Haven't watched any further</p>
<p>Also, still in progress, a 20-years-later rewatch of <b>Evangelion</b>.</p>
<p>So that just leaves me with <b>One Piece</b> as an on-going thing, which is frankly better than most of the above for having less pretensions to start with.</p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-53228361763926545682024-02-10T14:34:00.005+00:002024-02-10T14:34:59.621+00:00F# and OpenSilver v2.1<p>An update to <a href="https://stevegilham.blogspot.com/2023/11/f-and-opensilver-v20-continued.html">the previous series of posts</a>, just three months after the last one. </p>
<p>Compared to previous iterations, "it just works". The only changes from the original Silverlight code are</p>
<ul>
<li>The XAML is precompiled where it stands in a new F# App project, rather than being loaded at runtime</li>
<li>The Y-coordinate related changes in the XAML and F# from 2.0 need to be applied</li>
<li>The background image is compiled as <code>Content</code>, and in the XAML, referred to by <code>ImageSource="ms-appx://textured_paper.png"</code>, but is otherwise as before (note, I've change the background texture on my website in the last 15 years) </li>
</ul>
<p>In particular, no messing about with <code>IntermediateOutputPath</code>, or having to create stubs for anything; as I said, "it just works".</p>
<p>Now it's <a href="https://github.com/SteveGilham/astroclock/tree/master/astroclock.opensilver2.1/astroclock.opensilver2.1">all in one place</a>, I've deployed <a href="https://stevegilham.com/astroclock/">a live version</a> too.</p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-16291560256049349412024-01-01T14:58:00.001+00:002024-02-10T15:22:10.177+00:00Q4 Cycling<p>Keeping up the ride every day</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGG9AzS1UL0usL9zWQKNdle852QszC267wu-S1zSptA8spUjZIk87CGYV_2iHN1bUBXVLlbyoefcmFwhtr3Kr0ry0CKwWYlTlFUEJ_K519GdSI9Et_d_IB1e8i-KWKl7mKA3NftBb-Awew6wxNN13yZE465rZcM8Ib5-hyBUzFv-LJta1eR0Q0/s1600/Miles23q4.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="340" data-original-width="604" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGG9AzS1UL0usL9zWQKNdle852QszC267wu-S1zSptA8spUjZIk87CGYV_2iHN1bUBXVLlbyoefcmFwhtr3Kr0ry0CKwWYlTlFUEJ_K519GdSI9Et_d_IB1e8i-KWKl7mKA3NftBb-Awew6wxNN13yZE465rZcM8Ib5-hyBUzFv-LJta1eR0Q0/s1600/Miles23q4.png"/></a></div>
<p>The weather stayed good - T-shirt and shorts good - into mid-October, so gave the chance for a few late long rides out into the country, and off-road, too.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2p8AhJK"><img src="https://live.staticflickr.com/65535/53250803791_777f3ceee2.jpg"/></a>
<p>End of Butler's Lane</p>
</div>
<p>The month ended with Totals : winter bike reset to 0 (new odo), summer bike 4551.2 (up 429.4), folding bike 234.44 (unchanged) and 19.7 off meter for 449.1 total, 4053 YTD.</p>
<p>November was unremarkable, with one last long ride out to the Golden Ball for lunch. The month ended with Totals : winter bike 259.92, summer bike 4561.6 (up 10.4), folding bike 234.44 (unchanged) and 12.6 off meter for 282.92 total, 4336 YTD.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2poot1U"><img src="https://live.staticflickr.com/65535/53418244464_f231eaef23.jpg"/></a>
<p>Abbey Bridge, 2 years on</p>
</div>
<p>December, too, was unremarkable, with no real wintry weather. The month ended with Totals : winter bike 604.89 (up 344.97), summer bike 4563.1 (up 1.5), folding bike 250.5 (up 16.06) and 6.92 off meter for 369.45 total, 4705 YTD, a new PR.</p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-85790168979663279572023-11-08T14:00:00.003+00:002024-02-10T14:35:08.779+00:00F# and OpenSilver v2.0 (Continued)<p>An update to <a href="https://stevegilham.blogspot.com/2023/11/f-and-opensilver-v20.html" target="_blank">the previous series of posts</a>. </p>
<h3>Building while <code>NuGet</code>ting</h3>
<p>While I stand by my assertion that the previous post showed the simplest way to build (by not using NuGet to get the package, but referencing the key assembly the old-fashioned way) here is how to build with OpenSilver 2.0.1 as a NuGet reference. First, add properties</p>
<pre class="code">
<SkipXamlPreprocessor>true</SkipXamlPreprocessor>
<OpenSilverGenerateAssemblyInfo>false</OpenSilverGenerateAssemblyInfo>
</pre>
<p>then if there isn't already a <code>$(ProjectName).OpenSilver.XamlDesigner.fs</code> file in the root of the project (generated there by the OpenSilver compiler taking some untested path before it was switched off), it should look like this:</p>
<pre class="code">// <auto-generated>
// Generated by the FSharp WriteCodeFragment class.
// </auto-generated>
namespace FSharp
open System
open System.Reflection
[<assembly: System.Runtime.CompilerServices.InternalsVisibleTo("XamlDesignerBackground")>]
do()
</pre>
<p>added with Compile Action of <code>None</code>, and then see it's copied into the appropriate place by</p>
<pre class="code"> <Target Name="FixUp" BeforeTargets="BeforeCompile;CoreCompile">
<ItemGroup>
<MisgeneratedFiles Include="$(ProjectName).AssemblyInfo.OpenSilver.XamlDesigner.fs"/>
</ItemGroup>
<Copy SourceFiles="@(MisgeneratedFiles)"
DestinationFolder="$(IntermediateOutputPath)"
/>
</Target>
</pre>
<h3>Publishing less</h3>
<p>In the browser project, rather than enabling AOT, which saves time, and not space, have properties</p>
<pre class="code"> <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
<BlazorEnableCompression>false</BlazorEnableCompression>
<!-- Uncomment to enable AOT compilation when publishing -->
<!--<RunAOTCompilation>true</RunAOTCompilation>-->
</pre>
<p>and it doesn't hurt to switch of satellites in the Presentation project, either.</p>
<p>That takes us from </p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheQ6Rmi4k4BI123Ep2VLU26obD7wXmXAg5pldNfHJE6FS7QHyGJI7rDEH_UZhxThMGHFfFhySAovUD4YGj68QYAmhrBC_Z_ntxCs_2LO_RvCMhntF7VQXjWFlQ0SqeQFyIe_Q3KCCYYW-fV6EwAgA0pdYZiKSpkyu8tvTv90bEM44YKBTsxp11/s1600/Screenshot%202023-11-08%20135451.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="230" data-original-width="338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheQ6Rmi4k4BI123Ep2VLU26obD7wXmXAg5pldNfHJE6FS7QHyGJI7rDEH_UZhxThMGHFfFhySAovUD4YGj68QYAmhrBC_Z_ntxCs_2LO_RvCMhntF7VQXjWFlQ0SqeQFyIe_Q3KCCYYW-fV6EwAgA0pdYZiKSpkyu8tvTv90bEM44YKBTsxp11/s1600/Screenshot%202023-11-08%20135451.png"/></a></div>
<p>to</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaVGgVEsOpKe7u8rYKMF6h7fHIZ_59IXnqbDTfp_B2izFhTLEAQ2hxHRdLL9PaQTp2U3NeWg8Z-l6yenlGcR_RdFZMyVw7mzw6qmeRJdeF5VaLazrpImo1GL2wNpgtXy-knm1UU31DD2cY_4F02jzZ7KHCs3uNm10kIMFa-IWmY-9Zz9BqyaCe/s1600/Screenshot%202023-11-08%20132427.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="261" data-original-width="347" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaVGgVEsOpKe7u8rYKMF6h7fHIZ_59IXnqbDTfp_B2izFhTLEAQ2hxHRdLL9PaQTp2U3NeWg8Z-l6yenlGcR_RdFZMyVw7mzw6qmeRJdeF5VaLazrpImo1GL2wNpgtXy-knm1UU31DD2cY_4F02jzZ7KHCs3uNm10kIMFa-IWmY-9Zz9BqyaCe/s1600/Screenshot%202023-11-08%20132427.png"/></a></div>Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-30412440243339763222023-11-02T19:08:00.004+00:002024-02-10T14:35:23.151+00:00F# and OpenSilver v2.0<p>An update to the <a href="https://stevegilham.blogspot.com/2022/10/f-and-opensilver-v11.html" target="_blank">previous series of posts</a> following the v2.0 stable release of OpenSilver. </p>
<p>The good news is that proper F# support in promised in the pipeline, but for now we still have to do some work.</p>
<p>Proceed as before, but in the F# project that inherits from the abstract C# w/XAML, a NuGet based reference to OpenSilver 2.x invokes the XAML preprocessor, and adds a file in the intermediate output directory to the compilation list. I've not found any simpler way to suppress this than by side-stepping NuGet entirely for this project</p>
<pre class="code">
<Reference Include="OpenSilver">
<HintPath>$(NuGetPackageRoot)opensilver\2.0.1\lib\netstandard2.0\OpenSilver.dll</HintPath>
</Reference>
</pre>
<p>and having to manage the version.</p>
<p>The other thing I noticed in 2.0 was that the sense of the Y-axis seems to have changed wrt render transforms, e.g. to draw a clock face with a series of lines radiating from a centre of (120,120) like this, rotations incrementing 30 degrees at a time, the negative Y values from 1.1 needed to be positive
<pre class="code">
<Line
Name="t1"
X1="0" Y1="-108"
X2="0" Y2="-100"
Stroke="White"
StrokeThickness="2">
<Line.RenderTransform>
<CompositeTransform Rotation="30" TranslateX="120" TranslateY="120" />
</Line.RenderTransform>
</Line>
</pre>
<p>and for the clock hands, add an extra 180 degrees as well as negating the Y values (that the unlabelled 1 o'clock and 7 o'clock lines have swapped makes no odds, but the hands are important).</p>
<p><a href="https://github.com/SteveGilham/astroclock/tree/master/astroclock.opensilver2" target="_blank">The resulting code for running with v2.0 can be found here.</a> The published code comes to ~130Mb, which is a lot chunkier than 25kb of JavaScript needed to do the job, but I guess it could be possible for many apps to share the same library files.</p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com2tag:blogger.com,1999:blog-5569894.post-43197366023239930432023-10-07T20:58:00.003+01:002023-10-07T20:59:50.914+01:00An Engineer does (AI) Art - the beginning<p>I've been playing with automated image generation for a long time, starting with various bits of CGI for CAD in the day job, unglamorous things like dithering for 4-, 8- and 16-bit images, more interesting things like using depth maps to make line drawings out of architectural renders; and also using it for amateur art - for example, at least one cover of the <i>Alarums and Excursions</i> APAzine c1990.</p><div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIQKOh2rwehh-98Ay0uyvhv3Ngn3WzZN3ry3SRc2VEnPj3WCHi81bCMtyvkVf2MOxrSW6noCP2PgsljzbR7bcpAjlTk-yWmh-X3aeOQz46FKucf3DoSL77eytRXColPztvyhwZglNMf70Scg46WT4KgrhKJwvnd3aaFOiHB0YHbG1VyFJFaZfr/s1600/me-elgreco.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="322" data-original-width="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIQKOh2rwehh-98Ay0uyvhv3Ngn3WzZN3ry3SRc2VEnPj3WCHi81bCMtyvkVf2MOxrSW6noCP2PgsljzbR7bcpAjlTk-yWmh-X3aeOQz46FKucf3DoSL77eytRXColPztvyhwZglNMf70Scg46WT4KgrhKJwvnd3aaFOiHB0YHbG1VyFJFaZfr/s1600/me-elgreco.jpg"/></a></div>
<p>When I stopped doing that for a day-job, it was rather more arm's length - seeing sites like "In 20 Years" (whose predictions must surely soon be testable), some site that would take a picture and render it in the style of El Greco - image above creation date 1-AUG-2009; then more recently (3 years ago) another face-to-portrait website, which rendered randomly in a variety of artists' styles</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYS-UMh3Iyv7C2NJo6zQOFF2R-2tRTXuPm7hDH_Trmo7HC5Vr3V869m1NU1xyFKj1nmCoVGtl8vVe-_YV4f8kvWnLHbToJ8ex3wc6qT-QOz8U2AsOebfdd1jGH9hgVDGjWLvuddw2zdJ1GuPCjEB96vPZZxkRik66QB3wCyQ8F9bt84A1KGHWP/s1600/k3cF3Kwgz0Eo-_port.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYS-UMh3Iyv7C2NJo6zQOFF2R-2tRTXuPm7hDH_Trmo7HC5Vr3V869m1NU1xyFKj1nmCoVGtl8vVe-_YV4f8kvWnLHbToJ8ex3wc6qT-QOz8U2AsOebfdd1jGH9hgVDGjWLvuddw2zdJ1GuPCjEB96vPZZxkRik66QB3wCyQ8F9bt84A1KGHWP/s1600/k3cF3Kwgz0Eo-_port.jpg"/></a></div>
<p>So when Stable Diffusion became available on HuggingFace last autumn, my first thoughts were "new profile pics using photos less than a decade old", but also "if this is intelligent, and takes pure text input, maybe I can illustrate the stories I wrote back in college days".</p>
<p>The former was quickly successful, as the image I adopted for my GitHub account shows</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV32Q0nKNLkTQafRY1vPSC5cqTB0b4NsAWya4bwNko0w5wDOHq-5NHpMSMuGTYl8BQCwTWToUZYvhCiK1aibedNQEADcQDW5hL-0HgdUTk0BCT7B5HZMN8k3kbbyDCVzht041h1liPHAB9MyIO_GypWJIp-K-OApVO92BwgZpAtST_fVETltGM/s1600/img2img637993950809658611github.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="400" data-original-width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV32Q0nKNLkTQafRY1vPSC5cqTB0b4NsAWya4bwNko0w5wDOHq-5NHpMSMuGTYl8BQCwTWToUZYvhCiK1aibedNQEADcQDW5hL-0HgdUTk0BCT7B5HZMN8k3kbbyDCVzht041h1liPHAB9MyIO_GypWJIp-K-OApVO92BwgZpAtST_fVETltGM/s1600/img2img637993950809658611github.png"/></a></div>
<p>The latter was less successful - trying to prompt a character who on first glance looks like they stepped out of a black and white photograph seemed to be beyond its comprehension. But by the end of a second day trying, I had a limited proof of concept</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBAbfx3M1vx3ehaMdfzWGEY8VQmfe3pMQMyIs2Krn0rP-P-BHCGpS40K6BVFQRiE8kvdw8AEg-GoAsI67fIiAkACbpXDKOl59ZWjCfx7NNmNBzQGjkckFJY0EXPWvLPADOI3Uu2tooymIgqvpzN6ocnp6vaDU4c3xFBLKiZ0R7_sQbDa_J1UkV/s1600/wolf637989598152694253nwxg.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBAbfx3M1vx3ehaMdfzWGEY8VQmfe3pMQMyIs2Krn0rP-P-BHCGpS40K6BVFQRiE8kvdw8AEg-GoAsI67fIiAkACbpXDKOl59ZWjCfx7NNmNBzQGjkckFJY0EXPWvLPADOI3Uu2tooymIgqvpzN6ocnp6vaDU4c3xFBLKiZ0R7_sQbDa_J1UkV/s1600/wolf637989598152694253nwxg.png"/></a></div>
<p>Noodling around on HuggingFace, I was aiming for just one thing, a plausible cover illustration; but given the lack of control, it was a case of just rolling dem bones, until one day in early January, I got something so close, yet still so far.</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXQ7TcJriw0VRMP4ArWe9nRR4m6lv9BHSMILmlQmBWQ3Zc7Gsv0fp11gRzpKN-gat2wPvDSUcMhyphenhyphenBrXNIVIaWXek9hnxl2oVVaJcbKrzudZAKKoKeFOCjcy8SVuhWLA6qHsCBTLVh_i8eSN1OGB4HXur3cvOgeYDmiTl5RrJWA_5fOELmzhw2F/s1600/img2img638089809436967511.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="400" data-original-width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXQ7TcJriw0VRMP4ArWe9nRR4m6lv9BHSMILmlQmBWQ3Zc7Gsv0fp11gRzpKN-gat2wPvDSUcMhyphenhyphenBrXNIVIaWXek9hnxl2oVVaJcbKrzudZAKKoKeFOCjcy8SVuhWLA6qHsCBTLVh_i8eSN1OGB4HXur3cvOgeYDmiTl5RrJWA_5fOELmzhw2F/s1600/img2img638089809436967511.png"/></a></div>
<p>soon after which I said enough is enough, and installed the Automatic1111 WebUI, in CPU only mode on the workstation I'd meant as a dev box in retirement. It might take 10 minutes for a single 512x512 or equivalent image, but finally I could start actually working with the tools.</p>
<h3>To be continued...</h3>
<p>Upcoming episode preview : how I'd render those last two pictures today</p>
<div class="separator" style="clear: both;"><div style="display: block; padding: 1em 0; text-align: center; "><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvOosLtj8Isn6GDBl5Y4nnVkIKOY9VabYhtehYDZn7nM5zLeVNoci_IW8F3d-PFn81KREqmLzb4-BrqWp5mmQOnKZAQolDEn_qVJn_XiXO8p1lGcLMhPBL3dsvB4qax8QJC6AbHcWTxI3hogfTua1-x6qt5sca-Iw7tv6oDvX_leLM3jEt_hGU/s768/00015-425854423.png"><img alt="" border="0" width="320" data-original-height="768" data-original-width="768" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvOosLtj8Isn6GDBl5Y4nnVkIKOY9VabYhtehYDZn7nM5zLeVNoci_IW8F3d-PFn81KREqmLzb4-BrqWp5mmQOnKZAQolDEn_qVJn_XiXO8p1lGcLMhPBL3dsvB4qax8QJC6AbHcWTxI3hogfTua1-x6qt5sca-Iw7tv6oDvX_leLM3jEt_hGU/s320/00015-425854423.png"/></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhufJCnU0b_hrqahxD9dtna0k_Veeu7DhtJm9ZJzAK7d-C2sEgdWvCPDkEoSdAxmr8Etp41altLEgLES_SnT-uXHJ52i7TDjeWZVdj66C_ujFxDndbMdlN2ruj8DbC1qKOLUXXAaGS5YHaA6COUXuTB8dXlTiZCQ5q5BbKzQX0mj0TOWhbS1p6h/s768/00019-3511556528.png"><img alt="" border="0" width="320" data-original-height="768" data-original-width="768" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhufJCnU0b_hrqahxD9dtna0k_Veeu7DhtJm9ZJzAK7d-C2sEgdWvCPDkEoSdAxmr8Etp41altLEgLES_SnT-uXHJ52i7TDjeWZVdj66C_ujFxDndbMdlN2ruj8DbC1qKOLUXXAaGS5YHaA6COUXuTB8dXlTiZCQ5q5BbKzQX0mj0TOWhbS1p6h/s320/00019-3511556528.png"/></a></div></div>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-517368848423432422023-10-03T20:50:00.001+01:002023-10-03T20:50:28.517+01:00Q3 cycling<p>A ride every day, though either for some business, or on a few occasions, more than just a token couple of miles around the neighbourhood to make the every day happen.</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGFfYkZnHGyTZFZ-c6CWLjGoMcPVwAqBLlENdhHibhV5AJ3nveIVhYxU0gbn1T6Af_wv11uFRJI2qKdtftjSNZO7q870WTS6JiXyiydQwtVO5guplKk85VN8lBOFcHAVsVDsnEWJoYTtS3ORiEIzNus189KsC8s1GaFpRV_W4U62O5xildNoSK/s1600/Miles23q3.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="340" data-original-width="604" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGFfYkZnHGyTZFZ-c6CWLjGoMcPVwAqBLlENdhHibhV5AJ3nveIVhYxU0gbn1T6Af_wv11uFRJI2qKdtftjSNZO7q870WTS6JiXyiydQwtVO5guplKk85VN8lBOFcHAVsVDsnEWJoYTtS3ORiEIzNus189KsC8s1GaFpRV_W4U62O5xildNoSK/s1600/Miles23q3.png"/></a></div>
<p>A disappointing season, summer often wet, mostly cloudy and windy, at best sultry behind the wind, and few T-shirt days, only picking up with a belated spell of warn, clear, calm weather in September, so for most of the period the longest ride days are either multiple errands, or going to a moderately distant pub for lunch.</p>
<p>July was mostly a washout. Totals : winter bike reset to 0 (new odo), summer bike 3234.7 (up 371.4), folding bike 217.05 (up 41.1) and 13 off meter for 425.5 total, 2692 YTD.</p>
<p>August was not much better. Totals : winter bike still 0, summer bike 3610.3 (up 375.6), folding bike 234.44 (up 17.4) and 5.6 off meter for 398.6 total, 3090 YTD.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2p19UxL"><img src="https://live.staticflickr.com/65535/53166635874_8410fa5d36.jpg"/></a>
<p>Birthday ride to new territory for a pub lunch</p>
</div>
<p>September brought belated summer, and rides to redo Little Cow Lane, and bits of the Ickneild Way, as well as long rides for pub lunches. Totals : summer bike 4121.8 (up 511.5), and 1.9 off meter for 513.4 total, 3604 YTD.</p>Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-5476996683900135592023-07-11T18:49:00.001+01:002023-07-11T18:49:25.774+01:0020 years of blogging<p>And what a time it's been, ranging from film reviews, proto-tweeting, holiday diaries, through random bits of programming stuff as I ran into it (and continue to run into, but at a lower rate these days), roughly annual anime reviews (cinema having fallen by the wayside) and lately, logging bike rides at quarterly intervals. And I guess how the last 5 years since retirement went will be how the next years go too.</p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-75346784052384916102023-07-01T17:27:00.005+01:002023-10-03T21:30:40.663+01:00Q2 Cycling<p>A ride every day, though either for some business, or just a token couple of miles around the neighbourhood to make the every day happen.</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaEbM7lOPt8XMe7qFLMg-wce0Rqs2tjihA23NxG-02uPXoR2fwVo7MFtaRWTLfYxiptj5Uw5pBlw9bCZMLmiez7QGOpLbGFlJ2smWtx-PBbdO_4ncXl3MW0o6khuDWbhxkg73f_SETTf42CynIQMGXsgEO_rh3L6A2RqZGoil5RPJMElCaSXLd/s1600/Miles23q2bis.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="341" data-original-width="604" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaEbM7lOPt8XMe7qFLMg-wce0Rqs2tjihA23NxG-02uPXoR2fwVo7MFtaRWTLfYxiptj5Uw5pBlw9bCZMLmiez7QGOpLbGFlJ2smWtx-PBbdO_4ncXl3MW0o6khuDWbhxkg73f_SETTf42CynIQMGXsgEO_rh3L6A2RqZGoil5RPJMElCaSXLd/s1600/Miles23q2bis.png"/></a></div>
<p>A fairly nondescript quarter, generally cool and windy, with few T-shirt days.</p>
<p>April ended on a high note with one warm day where on a whim, I rode down to Bishop's Stortford to join a cycling provision rally (blue line on map) for a 52 mile round trip. Totals : winter bike 3459.4 (up 365.3), summer bike 2191.8 (up 58.8) and 0.6 off meter for 424.7 total, 1249 YTD.</p>
<iframe src="https://mapsengine.google.com/map/embed?mid=zlzFqwjtypbQ.kaxfNN5UpL7M" width="640" height="480"></iframe><br />
<p>May was disappointing, with continued cold NE winds, so almost all business rides until a badly timed holiday at the end of the month. Totals : winter bike 3610.5 (up 151.1), summer bike 2410.2 (up 218.4) and 78.2 off meter (holiday) for 447.7 total, 1697 YTD.</p>
<iframe src="https://www.google.com/maps/d/embed?mid=1MSGgb1X46mBjq97tZigYhGxQAMVq4Hk&ehbc=2E312F" width="640" height="480"></iframe>
<p>The cloud from the cold NE wind slowly burned off, leaving the end of the holiday slightly warmer, but June as a whole had few days that enticed me to rides for amusement's sake, and only one 40-miler.</p>
<p></p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<!-- flickr -->
<a href="https://flic.kr/p/2oHyWJn"><img src="https://live.staticflickr.com/65535/52978945473_2f02b7c6d6.jpg"></a>
<p>Dullingham station</p>
</div>
<p>Still, I passed 2000 miles YTD on the 16th, only a day later than last year, despite fewer miles ridden each month in the spring. Totals : winter bike 3610.5 (no change), summer bike 2863.3 (up 453.1) and 116.5 off meter (holiday) for 569.6 total, 2266 YTD.</p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-37628043366098966872023-04-03T09:40:00.002+01:002023-04-03T10:00:36.896+01:00Q1 cycling<p>A ride every day, though either for some business, or just a token couple of miles around the neighbourhood to make the every day happen.</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnVuR_gQoZudPJu6iSMnbIFsOg9eahQ9AyOTVtDpR30-3kxietiWM0Lr84mOjoZLxmGtV08OaSZfAnnOAkKs_PH1_IYjkY4ATBWpYkPs9-nPICDy2qtWcYGkxTKcZML8jQlh8PQ2DBzZzFGbrXeiEKx2QiBli9CPrCxDZE6JGF_k74F-ZKAA/s1600/Miles23q1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="340" data-original-width="604" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnVuR_gQoZudPJu6iSMnbIFsOg9eahQ9AyOTVtDpR30-3kxietiWM0Lr84mOjoZLxmGtV08OaSZfAnnOAkKs_PH1_IYjkY4ATBWpYkPs9-nPICDy2qtWcYGkxTKcZML8jQlh8PQ2DBzZzFGbrXeiEKx2QiBli9CPrCxDZE6JGF_k74F-ZKAA/s1600/Miles23q1.png"/></a></div>
<p>January was cool, ending cold, but generally dry. The long ride was scoping out the route to crem and wake for a friend's funeral, though on the day I ended up getting a lift from crem to wake and back. Despite other known cyclists amongst the mourners, none of them had braved the sub-zero temperatures. Just as well, given the state of the provision there</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUBVVapO2Rn2erlpsuG6gPclN79ltP6bmyIe2TJIR3E-UoeKfMaBiUUwN9XEl2vtFWIyAnjwHK6j39q_8N8tWJ7qg1tMKqZ68GGHwV_uM7hG06PQhDcOsY8b8UJ4qeVaqDrwXwouvnYHRcGd1Gf7IqFHTtnPnOIemdcACGXi1UADN1SA786w/s1125/Fm2rgQlXgAI9s8S.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="577" data-original-width="1125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUBVVapO2Rn2erlpsuG6gPclN79ltP6bmyIe2TJIR3E-UoeKfMaBiUUwN9XEl2vtFWIyAnjwHK6j39q_8N8tWJ7qg1tMKqZ68GGHwV_uM7hG06PQhDcOsY8b8UJ4qeVaqDrwXwouvnYHRcGd1Gf7IqFHTtnPnOIemdcACGXi1UADN1SA786w/s320/Fm2rgQlXgAI9s8S.jpg"/></a></div>
<p>though I actually used one of the signposts in the car park as a hitching post.</p>
<p>Winter/black bike only, ending at 2569.1 + 1.5 off meter for 291.6 miles ridden for the month.</p>
<p>February, chill but dry, meant that towards the end of the month I could even use the bridleway for my routine trips, even if from time to time, the headwind and lingering soggy patches meant that some parts were wheeled. The long rides included scouting for, then attending, a screening appointment in Longstanton - and finding that some of the near finished cycleway by the Northstowe roundabout had been ripped up since I was there in the autumn</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2ohzMMn"><img src="https://live.staticflickr.com/65535/52696198083_15697682a7.jpg"/></a>
</div>
<p>leaving the dual carriageway to Northstowe with no crossings over the crash barrier from the stub of the path. Ultra bad design.</p>
<p>Winter/black bike only, ending at 2873 for 303.9 + 4.3 off meter = 308.2 miles ridden for the month (599.8 YTD).</p>
<p>March, wet and at times stormy, was a bit of a collapse after the previous months, with no long business-related rides, and too cold/windy for the sort of long rides I was doing at the same time last year.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2omEYgN"><img src="https://live.staticflickr.com/65535/52742474916_3eba10f8a7.jpg"/></a>
</div>
<p>That was traversable by coasting through, with feet not getting too wet from the splashing; it lasted a few days, but the rain on the 31st resulted in another such flood, lingering into April.</p>
<p>Winter/black bike only, ending at 3094.1 for 221.1 + 3.4 off meter = 224.5 miles ridden for the month (824.3 YTD).</p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-36427069906751926702023-01-02T18:48:00.001+00:002023-01-02T18:48:35.151+00:00Anime 2022<p>aka the year Funiroll paywalled most things.</p>
<p>Still I did get to watch some things</p>
<p>Clearing up from the backlog -- <b>Un-Go</b> which was weird detective story in a near/alt-future Japan after a war, with a mix of AI, powersat-politics and battling kami : OK but who comes up with mix-and-match ideas like that to even make them work in the first place?</p>
<p><b>Heroic Age</b> did what one pretty much might have expected from the initial (and well-trodden in the literature) premise, and thus did manage to stick a satisfactory ending.</p>
<p><b>Nobunagun</b> turned out to be a fun take on the "super-powered school-girl vs alien greeblies" genre, when ditzy mil-otaku Sio goes all-in when she discovers she can channel Oda Nobunaga in the form of a Gatling gun with <i>moar</i> dakka-dakka. This had the weirdest take yet out of Japan for the secret identity of Jack the Ripper.</p>
<p><b>Schoolgirl Strikers</b> was a more genre-pure instance of super-powered school-girls vs alien greeblies, with some added power of friendship -- it managed to do things right which <i>Ange Vierge</i> spectacularly fumbled, including having most off the non-combat sections being elsewhere than the hot tub.</p>
<p>In the "Cute Girls Do Cute Activity" corner, <b>New Game!</b> presented a very sanitized -- and very gender-bent -- view of the software development process; <b>New Game!!</b> was more of exactly the same, but I hope that code review, and check-in integration and testing, are handled better than in the anime, in the same way one hopes the code from <i>Senko-san</i> is not representative of real life.</p>
<p>When watched in binge mode, rather than weekly-as-aired, <b>Space Brothers</b> flows much better than it did at the time -- the introductory recaps can be ignored, along with the 3-episode mid-run total to-date recap. Watching 10 years on, there is also the amusement at the near future that has NASA getting to the moon again, with not a hint of SpaceX-style private space activity - at least not this side of the "now read the manga" last episode.</p>
<p>And for something completely different, <b>Akiba's Trip</b>, to see the context for the otaku memes it spawned (e.g. "It doesn't matter what a man's salary is worth; what matters is how much of it he spends on his hobbies!"). It lampoons one otaku hobby a week, including actual <i>Street Fighter V</i> gameplay footage in the vidya episode, before wrapping up with the big boss fight. Also, clothes get removed in every battle. Verdict : entirely harmless.</p>
<p>Interrupted by paywalling at the half-way point, <b>C3</b> was just slightly weird; <b>18if</b>, with its witch-of-the-week formula didn't leave things quite as hanging, and in places seemed to be unexpectedly good in its variety (cf <i>Sengoku Collection</i>). It also gets an honourable mention for the episode where the WotW is intending to kill three nasty pieces of work who killed her family - and while MC's mentor is all "then you'll be as bad as they are", the MC says in effect "sounds reasonable to me; do you need any help?", taking over for the boss bad's turn.</p>
<p>From the Winter season the one-shot <b>Sorairo Utility</b> was too short to establish real "a cute girls doing activity" scenario; <b>Sabikui Bisco</b> was crazy enough in its take on the "a random disaster strikes (at least) Japan, and things become weird and anarchic" genre to follow to the end, though the finale echoed <i>Vividred Operation</i> for the way all the characters spent time being heartfelt at each other while the big bad was charging up his lazors -- in all, too many crazy ideas, and not really enough establishing of conflict; and my reaction to <b>Tokyo 24th Ward</b> was simply this
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu9hRAUnrVb3NmT4NOW6C538ztQbPTgqJhaZdTYHYeuWb3wZltrp76Z5AndPLTdiVRW6SWMduFsIWwOlop6-28Ck9tKFybZp4AHlj8CLT9YpaG4UdqRqCAqBs_ksKq9sI_gBEI9KfUxosj2c7oJE9UdYl-Nd0Uu77gxsNrQZY94h1SW59-pg/s1100/tokyo-24th.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="500" data-original-height="500" data-original-width="1100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu9hRAUnrVb3NmT4NOW6C538ztQbPTgqJhaZdTYHYeuWb3wZltrp76Z5AndPLTdiVRW6SWMduFsIWwOlop6-28Ck9tKFybZp4AHlj8CLT9YpaG4UdqRqCAqBs_ksKq9sI_gBEI9KfUxosj2c7oJE9UdYl-Nd0Uu77gxsNrQZY94h1SW59-pg/s1100/tokyo-24th.jpg"/></a></div>
<p><b>Akebi's Sailor Suit</b> didn't establish itself as an alternative CGD-whatever, and the weird art style didn't help motivate; I ended up finishing it as a backlog item. For most of the season after the first episode, it was not too far from being "creepy lesbian stalker sue adds girl of the week to her harem" (exceptions like the episode where the girl of the week is a stalker herself and they prowl together hardly count). After all these years, I confess that I don't understand the neuroticism about having/making friends in high-school that percolates some series (<i>Uruhara</i> being another example of same that springs to mind). Perhaps it's a girl thing. After a while one habituates to the slightly uncanny character designs, as it works towards the big sports' day climax - a change from the usual school festival trope. Verdict: harmless.</p>
<p>The charge of "too much crazy, too little establishment" for <i>Sabikui Bisco</i> can also be levelled at Spring's (gacha-game tie-in) series <b>Estab-Life</b>, which adds the one-style-fits-all 3DCG characters that are becoming too common these days, including an apparent high-school girl with a long track record as an operative (on a par with the <i>Dirty Pair</i>, but without the associated trail of destruction). In all, mostly harmless, somewhat silly.</p>
<p>At mid-year, everything got paywalled, so I only watched the teaser episodes of <b>LycoReco</b>, and was spared what sounded like a disappointing thud of an ending</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuqpwpaSfepzQzh0aziMyVSyLsvZ_TRmLfzr51u2gnPiyUHId_Jy0btDVszpA6eyrPIaltNj9o-Rzvz4N5djGMjiQ7GL8gYqFibo6TYrPqcpUsS1vCoVox1WzyQuCnGa-LRBasi0txlUgoQgpXF1tXrbTvYB9yyKFm2KMTnVJkAjzEVxwp6g/s640/vlcsnap-2023-01-02-19h39m42s694.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="360" data-original-width="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuqpwpaSfepzQzh0aziMyVSyLsvZ_TRmLfzr51u2gnPiyUHId_Jy0btDVszpA6eyrPIaltNj9o-Rzvz4N5djGMjiQ7GL8gYqFibo6TYrPqcpUsS1vCoVox1WzyQuCnGa-LRBasi0txlUgoQgpXF1tXrbTvYB9yyKFm2KMTnVJkAjzEVxwp6g/s320/vlcsnap-2023-01-02-19h39m42s694.png"/></a></div>
<p>With winter came <b>Pui Pui Molcar : Driving School</b>. After the first season's "everything goes" mayhem, it was hard to see where they could take it, but this new set-up makes sense. Which may be why it's just so-so. Still, a harmless few minutes of Saturday morning cartoon.</p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-53915087332953757002023-01-02T18:04:00.003+00:002023-01-02T18:04:50.412+00:00Q4 cycling<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxP4zMQNnguH2F3yAp-h54eA0yz0xN6pBjBPQFfZf_tWfQDDvVkDImZnQ7wzL4YJ4M7xL4kBGRJpod2Bc25-gsIsLT9ubePi5TDWAUkvkEBl4ttYoTjgjeQYQi5D5WDwsE6_ZMcnMRpxairI_0S_Efw5WdfCVG290tk93rLvRM5yyiW5nvGA/s604/Miles22q4.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="340" data-original-width="604" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxP4zMQNnguH2F3yAp-h54eA0yz0xN6pBjBPQFfZf_tWfQDDvVkDImZnQ7wzL4YJ4M7xL4kBGRJpod2Bc25-gsIsLT9ubePi5TDWAUkvkEBl4ttYoTjgjeQYQi5D5WDwsE6_ZMcnMRpxairI_0S_Efw5WdfCVG290tk93rLvRM5yyiW5nvGA/s604/Miles22q4.png"/></a></div>
<p>Overall mild, but wet in November, and cold in mid-December, so a steady background of utility rides, kept the numbers up.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2nRotiA"><img src="https://live.staticflickr.com/65535/52411077288_51776085e0_z.jpg" /></a>
<p>Tree down</p>
</div>
<p>Despite the previous month's rain, such had been the drought that October remained off-road season, with firm going on bridleways. With mild weather and light in the afternoons, plenty of business rides, and a few longer ones to do things like checking the progress of the cycle-path signed to Longstanton, or the newly placed archaeological signs along the A1307.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2nSqB3m"><img src="https://live.staticflickr.com/65535/52422810036_bd26d3ace6_z.jpg" /></a>
<p>End of the line at Northstowe</p>
</div>
<p>Totals at the end of the month 1862.2 on the old bike (+321.2), 2133 on the new (+87.3), for a total of 408.2 miles for the month, 4185 YTD.<p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2nXoaf5"><img src="https://live.staticflickr.com/65535/52478915508_4ebaaa3648_z.jpg" /></a>
<p>Second load</p>
</div>
<p>November's weather was less clement, but, with old customs resuming, I did get the chance to use the trailer I'd bought for my birthday, to transport bits of old fencing that had been languishing for more than a year to the village bonfire for disposal. And while there were a few dodgy spots, off-road remained feasible until almost the very end of the month, provided a decent interval was left after each fall of rain.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2nYJGwv"><img src="https://live.staticflickr.com/65535/52494239481_4e83030716_z.jpg" /></a>
<p>Mostly dry, still</p>
</div>
<p>Totals at the end of the month 2048.9 on the old bike (+186.7), for a total of 186.7 miles for the month, 4372 YTD.<p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2o3Leyp"><img src="https://live.staticflickr.com/65535/52539804971_9e4809e05c_z.jpg" /></a>
<p>It was like that when I found it</p>
</div>
<p>Apart from a long ride to visit friends between Christmas and the New Year (partly into the teeth of a small gale on the way back), December's rides were at most into town. The main highlights were infrastructure related, like the unofficial opening of a stretch of the segregated route into town that had been fenced off for nearly a month; and, of course, an anniversary visit to the Abbey bridge to see that the desire line was not being thwarted by red tape - just that, as last year, the going was a bit soft just at the moment.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2o7RwBR"><img src="https://live.staticflickr.com/65535/52586103903_9279c04a78_z.jpg" /></a>
<p>Desire line one year on</p>
</div>
<p>Totals at the end of the month 2279 on the old bike (+230.1), 175.96 on the folder (+16.2) for a total of 246.3 miles for the month, 4618 for the year; almost 10% more than my previous best of 4215 miles in 2014 when cycle commuting 19 miles was a regular thing. To think that I worried about retirement taking that base-load away, and leaving me lacking exercise!</p>Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-84230561401112562722023-01-01T20:54:00.004+00:002023-01-01T20:54:52.994+00:00AltCover - 5 years on : what happened in 2022<p>2022 was a comparatively quite year, only 8 releases in all, mostly bugfixing, tracking compiler changes, or working around places where I put <code>Mono.Cecil</code> under unexpected stress, and have to work around until it gets a next release; but with a lot of changes in processes, under the covers. You can read the release notes for the details; this post is aimed at the bits that the end user shouldn't see.</p>
<p>The year started by getting my FxCop wrapper into a state where I could persuade it to process <code>netstandard2.0</code> assemblies, at least most of the time, thereby enabling me to drop the debug-only <code>net472</code> builds for libraries. Not all <code>net472</code> builds could in fact be processed - the Avalonia-based GUI threw intractably even though it could build happily against that target -- <code>The following error was encountered while reading module 'System': Security attribute type does not have a default constructor</code>.</p>
<p>Allowing assembly-level suppression attributes meant that I could also enhance the Gendarme-based scrutiny of the codebase; even if sticking at <code>netstandard2.0</code> means warnings about not using preferred method overrides from later API levels.</p>
<p>The release of Cake v2 gave me excuse to test and update the relevant APIs -- and another such overhaul in the autumn with Cake 3.0 dropping the deprecated <code>NetCore</code> names.</p>
<p>This was the year to also add dependabot, mostly for keeping the CI build actions up to date, with some prompting about other dependencies; though things like F# updates with compiler changes were actually the most significant unexpected maintenance-level change.</p>
<p>As a maintenance tool, fantomas matured this year, especially with its integration of <code>.editorconfig</code>, to the point that there are only a few "quirky" files where I have to back changes out, mostly with hacky <code>#if/#endif</code> nesting; so it's an on-going tool rather than a once-per release spring-clean. The worst bit is when a compiler generated method with a line-number in its name gets moved, and the static analysis suppression shutting up warning about the bad habits of code generators has to be updated.</p>
<p>The already massive Fake build script also increased its level of automation, keeping track of SDK versions via XML parsing of project files, to keep static analysis dependency paths up to date.</p>
<p>Belatedly, after the release in late 2021, the icons for VS2022 became available, and have been incorporated into the visualizer; this was also the year when I dropped the abortive FuncUI stub, and instead started to experiment with the massive changes in Avalonia 11 - that will be something on-going into the coming year!</p>
<p>Having started to centralize build process late in '21 by using <code>Directory.Build.*</code> files, late '22 saw the adoption of central package versioning, which simplifies much of the update process across the multi-solution sprawl. On the upside, while there's only one place to update, the Visual Studio UI doesn't do that, so while it can identify the updates, it's still a manual process at that one point. It also means having to add more verbiage to <code>Nuget.config</code> files intended to consume just-minted packages as part of build validation testing.</p>
<p>The big change at the end was not net7.0 itself (problems with the 7.0.100 release on <code>dotnet test</code> aside), but the way that didn't play well with the Fake CLI tool, or with the Appveyor CI; so I've replaced the former with net7.0 built drivers for what were scripts and are now source files within the drivers; and the latter with GitHub for doing things like Coveralls reporting -- redone as the old tool I'd been using stopped working at some point mid-year -- and release to NuGet. Of course with my build versioning having incorporated the AppVeyor build number, I needed to take a gratutious minor version bump as even my GitHub build numbers were lower than the AppVeyor ones. In the end, I took a big break and have (ab-)used <code>NerdBank.GitVersioning</code>, starting with the 1-Jan-23 anniversary release.</p>
<p>In many ways the 7.0.100 fail was a forunate one, as it gave me a reason to improve the AltCover scripting APIs, used extensively by AltCover's own build process, to emit raw property/value pairs rather than just composed command-line arguments; and having dropped support for early Fake5 releases, to use its property/value APIs rather than the composed command-line ones.</p>
<p>One last little bit of build-process work was in sorting out the assertion behaviour of Unquote - it casts about to see what libraries are visible and makes an opinionated choice (with NUnit being at the end of its preferences); a little hacking to catch and re-assert means that I can now do <code>Assert.Multiple</code> of Unquote tests - or take multiple bites at a failure, when Unquote tells me that two long strings differ, NUnit can point at where.</p>
<p></p>Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-45264235610189106092022-11-16T09:39:00.002+00:002022-11-18T22:33:46.435+00:00Hacking Fake.Build for net7.0<p>It's too early yet to do the AltCover after-action for <code>net7.0</code> <a href="https://stevegilham.blogspot.com/2020/11/altcover-road-to-net-5-f-5-and-github.html" target="_blank">like I did for <code>net5.0</code>; but it is proving a slog like <code>net5.0</code> rather than being too transparent to mention like <code>net6.0</code> was.</a>
<p>While the <code>dotnet</code> 7.0.100 build has <a href="https://github.com/microsoft/vstest/issues/4014" target="_blank">its own problems</a>, the <code>Fake</code> build system currently (5.23.x, 6.0 alpha) doesn't handle it at all - the former may work for limited scenarios, but more complicated ones fall over with library version mismatches; the latter politely askes for a v6 runtime and stops.</p>
<p>So, you have a build process based on a Fake script, but want to run with v7.0.100 as SDK, through your project <code>global.json</code>. What do?</p>
<p>Well, the Fake documentation <a href="https://fake.build/guide/getting-started.html" target="_blank">gives some alternatives</a> - turn the script into a <code>net7.0</code> project that links against the Fake libraries; but that imposes some restrictions on how you set up targets, because you can only define such things (as opposed to the functions that define the target's intended action) after setting up a build context. Or you can run as a fsi script, but the documentation then leads into how to hack <code>paket</code> into the mix.</p>
<p>However, since net5.0, scripts are able to reference <code>nuget</code> packages directly, so rather than having a <code>paket.dependencies</code>, with a <code>#r "paket: groupref [whatever] //"</code>, and a call out to <code>paket</code> on the command line, your scripts can be self-contained, with a block of <code>#r "nuget: [library][, optional version]</code>" lines at the top, and a command line that is just <code>dotnet fsi [my fake script.fsx]</code>
</p>
<p>And doing it this way, you can build on the <code>net7.0</code> runtime.</p>Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-67165680745813883202022-10-07T20:35:00.002+01:002022-10-07T20:36:28.586+01:00F# and OpenSilver v1.1<p>
An update to the
<a
href="https://stevegilham.blogspot.com/2021/10/f-and-opensilver-v10.html"
>previous series of posts</a
>
following the v1.1 stable release of OpenSilver.
</p>
<p>The recipe given as before just works, when all packages are updated and the browser project build is done with <code>net6.0</code>. One warning is emitted using the latest (6.0.401) SDK, about the <code>IntermediateOutputPath</code> override. The fix is to create a <code>Directory.Build.props</code> in the browser project directory, and move the two lines added to the project previously to the new file
</p>
<pre class="code">
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IntermediateOutputPath>shorter file path here</IntermediateOutputPath>
<BaseIntermediateOutputPath>$(IntermediateOutputPath)</BaseIntermediateOutputPath>
</PropertyGroup>
</Project>
</pre>
<p>While the <code>System.Windows.Application.LoadComponent</code> API now exists, it requires build-time XAML compilation, and that the named class which it decorates exists in the same assembly, so at this time <a href="https://github.com/SteveGilham/astroclock/tree/42df6b72bfcdfcfd965c58cba801e237d581ef4b" target="_blank">would only make an adjustment to the C# assembly</a>, replacing the constructor <code>InitializeComponent</code> call with one to <code>LoadComponent</code>, but leaving the same inheritance in the F# layer.</p>
<p>It is <a href="https://twitter.com/OpenSilverTeam/status/1577732666132250641" target="_blank">possible that the 2.0 release</a> will allow XAML compilation in the F# layer, but on-the-fly compilation seems not to be on the cards.</p>
<p>Also, in language independent mode, the <code>ImageBrush</code> and <code>ImageSource</code> APIs used by the original Silverlight AstroClock are now present. Alas, while that means uncommenting that XAML clause can be done without compile or runtime error, the interesting bits are marked <code>NotImplemented</code>, and live in a "work in progress" source folder, so there is currently no point in doing so.</p>
<p><a href="https://github.com/SteveGilham/astroclock/tree/aa37a8aeac90d1eef81fc3875f0a98d186ae6767">The resulting code for running with v1.1 can be found here.</a></p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-73986456913829455012022-10-02T20:23:00.005+01:002022-11-13T21:09:38.971+00:00Q3 Cycling<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMm29rtEj_bvWJ3NJC9nTVomFJuBI9I9_OaRs5jv71pohTjrM6IcNzShPkVagYNP0bC0woP8AEDdgAkMX91GThPjBB-2wYTkkhOrzXsatOPKsQ_ahbZg7CeaOt7m6Qs08zOOA9hjLGEyeKe7i-z-GuV78OoBskxXfIF-RbpjNML6kVdmwhSA/s1600/Miles22q3.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="341" data-original-width="604" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMm29rtEj_bvWJ3NJC9nTVomFJuBI9I9_OaRs5jv71pohTjrM6IcNzShPkVagYNP0bC0woP8AEDdgAkMX91GThPjBB-2wYTkkhOrzXsatOPKsQ_ahbZg7CeaOt7m6Qs08zOOA9hjLGEyeKe7i-z-GuV78OoBskxXfIF-RbpjNML6kVdmwhSA/s1600/Miles22q3.png"/></a></div>
<p>Hot and parched for the first two months, then cooler and damper. This meant a fair bit of riding when it was comfortable to do so, and a collapse in September.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2nxzPK9"><img src="https://live.staticflickr.com/65535/52209595354_2263ef0fa6_z.jpg" /></a>
<p>Fen Road, Fenstanton</p>
</div>
<p>July was mostly business rides or enjoying the sunshine locally, with one long ride up to St. Ives at the start of the really hot spell mid-month. Notably, the month ended with the arrival of the "<a href="https://ourplaceinspace.earth/" target="_blank">Our Place in Space</a>" exhibition, which straggled from Midsummer Common, all the way to Waterbeach, with a return ride that time down Mere Way.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2nFLocS"><img src="https://live.staticflickr.com/65535/52302187640_7ae21716f0_z.jpg" /></a>
<p>Inner System</p>
</div>
<p>Totals at the end of the month 1213.7 on the old bike (+48.8), 1438.7 on the new (+515.3), for a total of 564.1 miles for the month, 2803 YTD.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2nCTosy"><img src="https://live.staticflickr.com/65535/52269604788_7a6cf0027c_z.jpg" /></a>
<p>Ely in the distance</p>
</div>
<p>Early in the month, I did a ride through Aldreth, north through Witcham to Coveney, before returning, adding the northernmost point of the limits map. This was in the driest part of the summer, and there were signs of wildfires on Grunty Fen that looked like stubble burning had made a comeback. The dry weather also gave chance to see what Cow Lane was like in the dry (and how not-green Horse River Green had become).</p>
<p>I did the space ride a couple more times, to get pictures when there were fewer other folk around, exploring also the adequate (for during the day) cyclepath along the A10 from Waterbeach to Milton, and then towards the end of the month, riding up to St Ives again, up to Houghton and Wyton, before riding the St Ives perimeter road, gaining another bit of limits; then passing a major crash on the A14 and getting my photos onto the <a href="https://t.co/Rooah1orG3" target="_blank">BBC news website.</a>.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2nGXLrW"><img src="https://live.staticflickr.com/65535/52315725192_818c7e477f_z.jpg" /></a>
<p>Houghton Mill</p>
</div>
<p>Totals at the end of the month 1264.9 on the old bike (+51.2), 1913.1 on the new (+474.4), and 159.76 for the folder (+38.8) for a total of 564.4 miles for the month, 3368 YTD.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2nJBB1x"><img src="https://live.staticflickr.com/65535/52334424195_a8040d67db_z.jpg" /></a>
<p>Rivey Hill West - the dry way up</p>
</div>
<p>Before the weather completely broke, I made another Linton to Gt Chesterford run, finding a third bridleway, and the dry way up Rivey Hill; but after a ride to explore some new trails and find lunch on my birthday, the weather broke -- some rain, but mostly cooler, so most of the rides for the rest of the month were pure A-to-B, including going to hear the city's proclamation of the new King.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2nKYfqx"><img src="https://live.staticflickr.com/65535/52349768791_3bd58dfe92_z.jpg" /></a>
<p>Proclamation</p>
</div>
<p>The only long ride was the Camcycle/CTC byways and highways ride around Cambridge at the end of the month, and that mostly by virtue of having to get to and from the start in addition to the circuit (which was around the length of a pretty-way each way circuit-commute to the Science Park, if not quite the same track).</p>
<p>Totals at the end of the month 1541 on the old bike (+276.1), 2045.7 on the new (+132.6) for a total of 408.7 miles for the month, 3777 YTD, having passed last year's whole-year total during the group ride.</p>
<iframe src="https://mapsengine.google.com/map/embed?mid=zlzFqwjtypbQ.kaxfNN5UpL7M" width="640" height="480"></iframe><br />Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-44328216120680624212022-07-01T16:41:00.005+01:002023-07-01T17:28:17.783+01:00Q2 Cycling<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFNQxGtsAv2jctCWppiv1Y-FbhKQoUejT1soUu8blm3hESAJMJKNwlWrptUI4M06DcxQTqQNAkAP14kqyfvc_BdP1DapkFL_FUR3nmxQ968w9wD59ekYHO2cSlCiIZqUPiqlecv7d1ADhM5CNIpSpz94mL8ePPk4Li03pKklhai1AHjG3yKg/s1600/miles22q2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="340" data-original-width="604" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFNQxGtsAv2jctCWppiv1Y-FbhKQoUejT1soUu8blm3hESAJMJKNwlWrptUI4M06DcxQTqQNAkAP14kqyfvc_BdP1DapkFL_FUR3nmxQ968w9wD59ekYHO2cSlCiIZqUPiqlecv7d1ADhM5CNIpSpz94mL8ePPk4Li03pKklhai1AHjG3yKg/s1600/miles22q2.png"/></a></div><p></p>
<p>Dry, mild to warm weather, was the overall tone of the quarter, meaning that the ground was dry enough for off-road riding; and a lot of riding did get done.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2neBowj"><img src="https://live.staticflickr.com/65535/52006203806_cbde600709.jpg" /></a>
<p>St Helen's, Colne</p>
</div>
<p>Good Friday, an unscripted ramble up and around the busway took me north of St. Ives, and allowed me to add a little nubbin to the east of Earith to the "Outer Limits" map (mid-green), and from there things snowballed. The Easter weekend also saw a ride along the bridleway from Little Cow Lane through Linton, following parts of the Ickneild Way -- a much drier route than the previous, until Linton, and there finding that the bridleway had a river running down the middle. And from there, the next few rides kept up the theme, following the Ickneild Way west from Gt. Chesterford, and a bit further north from Linton. The month closed with a different big ride, up byways from Rampton to Aldreth.</p>
<p>Totals at the end of the month 947.8 on the old bike (+336.7), 250.2 on the new (+203.1), for a total of 539.8 miles for the month, 1141 YTD.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2njk8ss"><img src="https://live.staticflickr.com/65535/52059613810_d25daf93b4.jpg" /></a>
<p>Avenue nr Little Bradley</p>
</div>
<p>May Day holiday, I took more of the Ickneild Way, north from Six Mile Bottom towards Newmarket (north from Burrough Green on the Outer Limits) and back to explore the byways that linked up to the Wilbrahams; and then having pushed the limits a bit, the next week I did the section south from Burrough Green to the Thurlows, with some exploration of byways near Carlton on the return. The following week, more Ickneild Way, from Melbourne to Letchworth, and another new section of limits. Finally, rounding the month off, I took my first cycling holiday since late '17, the <a href="https://www.cyclebreaks.com/tours/gardens-gallopers" target="_blank">CycleBreaks Gardens and Gallopers tour</a>; marred slightly by pouring rain on the first day, it was a nice mix of new, familiar and "I've only cycled this in the opposite direction before".</p>
<p>Totals at the end of the month 1164.9 on the old bike (+217.1), 480.9 on the new (+230.7) + 14.1 off meter, and 151 on the tour bike, for a total of 612.9 miles for the month, 1754 YTD.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2nsg3em"><img src="https://live.staticflickr.com/65535/52149347750_0a841457eb.jpg" /></a>
<p>Bridleway</p>
</div>
<p>June opened with a ride out to Burwell, the byway-defined salient on the limits map, followed by another limits buster, going down from Wendens Ambo and Newport, south of Saffron Walden to Radwinter, then taking the Little Cow Lane path back, reaching the 2000 mile mark on 15-Jun vs 21-Aug-21, then finally a reprise of the Aldreth run, this time taking the byway looping north of Haddenham to Wilburton.</p>
<p>Totals at the end of the month 1164.9 on the old bike (+0), 923.4 on the new (+442.5) and 120.96 (+42.5) for the folder, for a total of 485.0 miles for the month, 2239 YTD - a number which I have considered a reasonable whole-year total in the past!</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2ntH5na"><img src="https://live.staticflickr.com/65535/52165744339_87199e2543.jpg" /></a>
<p>Stuck in a rut</p>
</div>
<iframe src="https://mapsengine.google.com/map/embed?mid=zlzFqwjtypbQ.kaxfNN5UpL7M" width="640" height="480"></iframe><br />Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-75393485935249105402022-05-13T09:26:00.001+01:002022-05-13T09:26:35.940+01:00F# under the covers XIX -- `with` clauses<p>Once again, the half-year update has included some interesting changes in code generation, this time around <code>try</code>/<code>with</code> clauses.</p>
<p>Two cases to show this, one simple, one more complex. As always, decompilations are for debug (unoptimized) builds, though in this case, the release builds differ only in details of the branch instructions.</p>
<pre class="code">
try
...
with
| :? FormatException -> Default
</pre>
<pre class="code">
try
...
with
| :? ArgumentException as a -> a |> (logException store)
| :? NotSupportedException as n -> n |> (logException store)
| :? IOException as i -> i |> (logException store)
| :? System.Security.SecurityException as s -> s |> (logException store)
| :? UnauthorizedAccessException as u -> u |> (logException store)
</pre>
<p>Before the 6.0.300 SDK update, the simple case was entirely direct in its handling of the exception</p>
<pre class="code">
.try
{
...
IL_006d: leave.s IL_0098
} // end .try
catch [netstandard]System.Object
{
IL_006f: castclass [netstandard]System.Exception
IL_0074: stloc.s 8
IL_0076: ldloc.s 8
IL_0078: isinst [netstandard]System.FormatException
</pre>
<p>but afterwards it becomes much fancier, with duplication of effort in the handled case, and only makes sense if the exit from the <code>filter</code> in the unhandled case is faster than from a <code>catch</code>.</p>
<pre class="code">
.try
{
...
IL_006e: leave.s IL_00b5
} // end .try
filter
{
IL_0070: castclass [netstandard]System.Exception
IL_0075: stloc.s 8
IL_0077: ldloc.s 8
IL_0079: isinst [netstandard]System.FormatException
IL_007e: stloc.s 9
...
} // end filter
catch
{
IL_008c: castclass [netstandard]System.Exception
IL_0091: stloc.s 10
IL_0093: ldloc.s 10
IL_0095: isinst [netstandard]System.FormatException
IL_009a: stloc.s 11
...
} // end handler
</pre>
<p>the new code being equivalent to C# <code>catch (object obj2) when ((((Exception)obj2) is FormatException) ? true : false)</code></p>
<p>The more complex case was like</p>
<pre class="code">
catch [netstandard]System.Object
{
IL_0010: castclass [netstandard]System.Exception
IL_0015: stloc.1
// ArgumentException ex2 = ex as ArgumentException;
IL_0016: ldloc.1
IL_0017: isinst [netstandard]System.ArgumentException
IL_001c: stloc.2
// if (ex2 == null)
IL_001d: ldloc.2
IL_001e: brfalse.s IL_0022
...
</pre>
<p>or, decompiled</p>
<pre class="code">
catch (object obj)
{
Exception ex = (Exception)obj;
ArgumentException ex2 = ex as ArgumentException;
if (ex2 == null)
{
NotSupportedException ex3 = ex as NotSupportedException;
if (ex3 == null)
{
// ... throw on exhaustion
}
NotSupportedException j = ex3;
Exception e4 = j;
logException(store, e4);
return result;
}
ArgumentException a = ex2;
Exception e5 = a;
logException(store, e5);
return result;
}
</pre>
<p>but now it looks like</p>
<pre class="code">
catch [netstandard]System.Object
{
IL_0010: castclass [netstandard]System.Exception
IL_0015: stloc.1
// object obj2 = ex;
IL_0016: ldloc.1
IL_0017: stloc.2
// if (!(obj2 is ArgumentException))
IL_0018: ldloc.2
IL_0019: isinst [netstandard]System.ArgumentException
IL_001e: ldnull // omitted in release
IL_001f: cgt.un // omitted in release
IL_0021: brtrue.s IL_0065
...
IL_0065: ldloc.1
IL_0066: unbox.any [netstandard]System.ArgumentException
IL_006b: stloc.s 7
</pre>
<p>or in C#</p>
<pre class="code">
catch (object obj)
{
Exception ex = (Exception)obj;
object obj2 = ex;
if (!(obj2 is ArgumentException))
{
object obj3 = ex;
if (!(obj3 is NotSupportedException))
{
// ... throw on exhaustion
}
NotSupportedException j = (NotSupportedException)(object)ex;
NotSupportedException ex5 = j;
bool store5 = store;
NotSupportedException e4 = ex5;
logException(store5, e4);
return result;
}
ArgumentException a = (ArgumentException)(object)ex;
ArgumentException ex6 = a;
bool store6 = store;
ArgumentException e5 = ex6;
logException(store6, e5);
return result;
}
</pre>
<p>which discards the results of the <code>isinst</code> instructions, then does an <code>unbox.any</code> for any case that actually matches; which could provide a marginal space improvement, in the case where no clause matches -- i.e. another possible optimization the unhandled exception scenario; which in both cases are the "I don't care, this has just failed completely" route.</p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-76997676706094446602022-04-01T13:33:00.004+01:002022-04-07T14:11:18.341+01:0022Q1 Cycling<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh00062YIwW1PLcSTomibe2vd2ktZIm2GK1dEEJPh5oP-w-kXPNN-eXMobQtrGHtz8P7UobLyFmDzCvIgIh6Qpt8EJd12C7qPp5LraA9LQ3uvZYcxw4gknfPROcZlZPyo8CYog6h3710TNAmfHIXR3oIUEFCCpM2MZ4PFNqcYP8FZfy0WJ_Kg/s604/Miles22q1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="604" data-original-height="340" data-original-width="604" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh00062YIwW1PLcSTomibe2vd2ktZIm2GK1dEEJPh5oP-w-kXPNN-eXMobQtrGHtz8P7UobLyFmDzCvIgIh6Qpt8EJd12C7qPp5LraA9LQ3uvZYcxw4gknfPROcZlZPyo8CYog6h3710TNAmfHIXR3oIUEFCCpM2MZ4PFNqcYP8FZfy0WJ_Kg/s604/Miles22q1.png"/></a></div>
<p>A milder winter than the last, with strong winds being the main feature; so a few longer rides early on, and storm-blown gaps in the record.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2mZkZNR"><img src="https://live.staticflickr.com/65535/51844769769_6aacc708a5.jpg" /></a>
<p>Late January snowdrops</p>
</div>
<p>January ended at 193.9 on the clock, or 116.1 miles for the month; February 314.2, meaning 120.3 miles for the month. March pushed the old bike to 611.1 on the clock (298.9 for the month including 2 off-meter), but the folder went to 78.5 (+11.9), and a new shopping bike clocked up 47.1, plus an unmetered 6.7 miles home for a total of 362.6 miles. Year to date, that's 601 miles, or about the same as last April.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2na7dyb"><img src="https://live.staticflickr.com/65535/51955246042_1518bfdd6a.jpg" /></a>
<p>Horse River Green</p>
</div>
<p>A burst of really warm weather near the end of the month allowed the first real exploration, rather than just pounding familiar nearby loops, this one exploring Cow Lane, from Linton to Great Chesterford, as a way of avoiding having to go as far as Saffron Walden to close the loop. Most of it is perfectly fine; but there's a section in the middle that suddenly went from dry to sodden, threading between ponds, and at times becoming indistinguishable from a river bed. Best for high summer, and from the Linton side, so the steep bit is downhill.</p>Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-1060599349371647572022-01-01T10:18:00.004+00:002022-01-05T18:58:16.329+00:00Anime 2021<p>A generally disappointing year in all.</p>
<p>Spring season had a few "might watch" titles, but Crunchy picked up none of them, so I only picked up <b>Odd Taxi</b>, a <i>noir</i>-ish story of modern social-media driven <i>ennui</i>, which ends up being AOTY (long-form) pretty much by default.</p>
<p>Summer had the global release of <b>Shin Eva</b>, which was as much of a mess as it had seemed from original accounts, the painful and wildly mislabelled <b>Fena, Pirate Princess</b> (dropped after one episode of Fena being a vapid gold-digging whore), and <b>Aquatope</b> which began by looking like it would be cute girls doing cute aquarium things, with a little bit of low-key magic (from a local sprite wandering around in the first couple of episodes, and the occasional trippy underwater sequence), but rapidly turned into family drama and "welcome to the world of work", rather like <i>Hanasaku Iroha</i>, only without the bondage; and got dropped after 5 episodes.</p>
<p>Autumn brought just the tried and dropped <b>Takt Op. Destiny</b>, <b>Sakugan</b> and <b>Digimon Ghost Game</b> -- the latter being an episodic "urban legend kids' horror" series, a world away from <b>Adventure</b>, <b>Adventure 02</b> and <b>Adventure:</b> that were a background to much of the year and now form an indistinguishable melange in my memory.</p>
<p>From the backlog, I went through <b>Berserk</b> in both '97 and '16 flavours, which passed some autumn evenings; but I still don't see what the fuss was about (except for the detailed crafting of the art in the original manga).</p>Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-30130069117998577662022-01-01T09:53:00.009+00:002022-01-01T10:52:30.161+00:002H21 cycling<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2ms3MpD"><img src="https://live.staticflickr.com/65535/51490599775_ca584b6097.jpg" /></a>
<p>Ickneild Way, near Royston</p>
</div>
<p>In the second half of the year, I managed to do more each month than in 2020, reaching 2000 miles 21-Aug vs 29-Sep-20. At the end of November, I also managed to twist the frame on the old bike that had served me since '98, just shy of the 20,000 miles logged on that odo mark; and at the same time had odo problems on the newer bike, which just passed the 10,000 miles from new mark. Time to buy myself a present in the new year, I think.</p>
<div class="separator" style="clear: both;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEjrntxCZW57lSkR25tRsvnxlpVqZezIT0DegadwMx1l0NoNshoCawmMLwS0UC_5IQIWmXW_R1i2e7AobLSC2OpIB0gIYOas4b1XU9sc_j17mxOrMGUCohO2y95xgksI7MhDcQ1bAp48sTL33sNAuCWEngOmdQV2UdEiXPPg8YcN5Engw9XBxg=s605" style="display: block; padding: 1em 0; text-align: center;" /></div>
<p>As before, September was the high point -- monthly totals being July 361.1 (summer bike), August 504.4 (a little of the folding bike), September 609.9 (mostly summer bike) -- probably an all-time record -- October 429.1 (a dry month, this time, but mostly winter bike), November 309 miles (winter mostly, until written off), December 172 miles (including riding to both Christmas lunches I attended this year, much to the amazement of the others in the respective groups), for a total of just over 3700 miles for the year. The summer bike starts the new year with 77.8 miles on the (latest) clock, and the folding bike 66.5</p>
<div class="separator" style="clear: both;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEhHCYBUjvOToHTk-rgATn6axr9QZY_BeyfGtCafF-upVmT3UGVPwk6EbfIHcOMrmjUexc6z8eW9rCtUjS43AntfZj1Z9lZUrD_wGjZlLxahKnppVpwCkzzqk_ALIswb1bPxoktqF32rWWGp0UjzaGjePwlWVQ-xQYLlwIsBS4Qo2NhjXEkj2w=s582" style="display: block; padding: 1em 0; text-align: center;" /></div>
<p>While a lot of the rides were retreading old territory, I did a fair amount of exploration on byways, like taking the Ickneild Way most of the way from Royston to Baldock, even if many byways end up being just dead-ends; and from the ancient to the modern, making a lot of use of the new Girton to Fenstanton multi-use path in preference to the busway -- a very convenient fast route to places like the Golden Ball at Boxworth.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2muktPG"><img src="https://live.staticflickr.com/65535/51516490514_faee87fcf2.jpg" /></a>
<p>Henge, at Carriages, Fenstanton</p>
</div>
<p>The highlight of the year, though, was the opening of the long awaited Abbey Bridge, just before Christmas. Even if the Chisholm Trail itself is on the wrong side of the tracks for convenience (cycling it was only the second time in 40+ years living in the area that I'd taken the path across Coldhams Common), it means that I'll only use the Green Dragon bridge as and when I next visit the Green Dragon, which had been a regular location for pub lunch with former colleagues working on the Science Park, but alas such attendance has suffered under the continuing work-from-home regime.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2mSQQsZ"><img src="https://live.staticflickr.com/65535/51771181117_ffc293043a.jpg" /></a>
<p>Abbey Bridge, Christmas Eve, first full day of operation</p>
</div>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-8235625274726040682021-10-13T23:23:00.009+01:002021-10-14T08:51:12.647+01:00F# and OpenSilver v1.0<p>
An update to the
<a
href="https://stevegilham.blogspot.com/2021/03/f-and-xaml-and-opensilver-ctd.html"
>previous series of posts</a
>
following the first stable release of OpenSilver.
</p>
<p>
While the details of which lines of code in the Browser and Simulator projects
need to be redirected at the F# types have changed since the earlier posts at
alpha-7 release, the principle remains the same -- where the generated code
refers to the C#/XAML <code>App</code> type, replace that with the derived F#
type. The F# (logic) and C# (just the XAML, reified as abstract base types)
are set up exactly as before.
</p>
<p>
If you're porting an old solution, from a pre-release OpenSilver, unless
you've been staying on the bleeding edge, it's simpler to start by creating a
new one, copying the F# project and the XAML project from old to overwrite the
new, and otherwise starting from scratch, remembering to check in all the
as-generated files before making the edits.
</p>
<p>
At this point, provided that all the repointing to the F# project and types is
done correctly, it should all "just work".
</p>
<p>
There is one gotcha, though, that has appeared in the updates for publishing
the Browser WASM since my alpha-7 exploration, in that some potentially very
long file paths can now be invoked that point deep under the project's default
<code>obj</code> subfolder. If your project is already down a few layers from
the drive root it will run foul of the <code>Copy</code> MSBuild task which
appears to still labour under the old DOS <code>MAX_PATH</code> of 255
characters. Copying to an overlong path fails by timing out, so breaking the
build. In that case add
</p>
<pre class="code">
<IntermediateOutputPath>shorter file path here</IntermediateOutputPath>
<BaseIntermediateOutputPath>$(IntermediateOutputPath)</BaseIntermediateOutputPath>
</pre>
<p>
where a suitable up-tree location is specified e.g. starting at the top of the
repo, or in a shallow build output directory outside the repo, rather than as
a child of a project directory. Note that both values need to be set and
aligned, lest defaults be assumed during the process.
</p>
<p>
<a
href="https://github.com/SteveGilham/astroclock/tree/fc2c09c1649d5028fb74af4e314be65401ea4dbb"
>The resulting code can be found here</a
>.
</p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-25444799917970768042021-07-20T16:20:00.007+01:002021-07-25T20:56:12.062+01:00Lemon Cheesecake recipe<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2mcga29"><img src="https://live.staticflickr.com/65535/51323266382_299f8b8651.jpg"/></a>
</div>
<p>Delving through a mass of old paperwork for more mundane things, I found this in passing, dating from 1960s Autralia</p>
<p>Case: 8oz digestive biscuit crumbs + 4oz butter melted and pressed into the pie dish; chill in fridge.</p>
<p>Filling: Mix 2oz whole milk and 4oz cream cheese into a smooth mix, add ½ can condensed milk (about 200g) and ¼ cup fresh lemon juice (about 2 lemons) and 1tsp vanilla essence. Fold in a small can of cream (about 100g), and pour into the case.</p>
<p>Leave in fridge overnight, and sprinkle with freshly grated nutmeg before serving.</p>
<p>I've not made this in ages, but it was always a hit.</p>
Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-30598690104933534832021-07-01T08:28:00.005+01:002021-07-01T13:41:50.649+01:00Q2 Cycling<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-ghoglx8-5Sg/YN1pFxL1NuI/AAAAAAAACQw/pajjvacgRrsFC2VbE_xy-xnN9xnw4ZZZwCNcBGAsYHQ/s0/21Q2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="340" data-original-width="605" src="https://1.bp.blogspot.com/-ghoglx8-5Sg/YN1pFxL1NuI/AAAAAAAACQw/pajjvacgRrsFC2VbE_xy-xnN9xnw4ZZZwCNcBGAsYHQ/s0/21Q2.png"/></a></div>
<p>April was cool but dry -- only one "maybe thinking of spitting" in the whole 30 days event; and concluded with the re-opening of both the Coton footpath bridge and the jetty at Ditton Meadows, both of which I covered for the last ride of the month. At the end milage totals were winter bike 17954.3, summer bike to 3640.4 and then a battery change ending at 136.3 for 288 miles for the month.</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2kT2fXF"><img src="https://live.staticflickr.com/65535/51116857869_bdcaccbde6.jpg"/></a>
<p>May blossom in April</p>
</div>
<p>May was cool but also wet -- the usual rainy season -- though it did end with a burst of hot weather that just beat out March for hottest day of the Spring; concluding with a 48 mile ride through the fens to Wicken and Upware. The totals were 18268.3 and 136.3, for a total of 314.4 miles
</p>
<div class="center" style="min-width:260px;border: 1px solid silver;padding:5px;margin:5px;">
<a href="https://flic.kr/p/2m5ghB7"><img src="https://live.staticflickr.com/65535/51244076428_a447422178.jpg"/></a>
<p>Those wind turbines at close quarters</p>
</div>
<p>June's weather went downhill towards the end -- see the gap -- but that didn't stop me ending the month at 18718.5 and 136.3 for a total of 450.2 miles (just short of June 2015's total, but best month since), and 1319 for the year, after exploring more new cycle routes along the A14 which make for conveniant 20-mile level rides, and also going across the A11 at the Wilbrahams to explore a by-way that runs close by the foot of the wind turbine installation visible for miles around.
</p>Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0tag:blogger.com,1999:blog-5569894.post-36859829551318667572021-05-03T09:59:00.009+01:002021-05-03T10:05:25.327+01:00F# under the covers XVIII -- lambdas and closures<p>Consider this code, using named and anonymous inner functions</p>
<pre class="code">
let F1 l =
let aux i = i + 1
let FI li =
let rec FII lii acc =
match lii with
| [] -> acc
| x :: xs -> FII xs (aux acc)
FII li 0
l |> List.map (fun i -> (string i).Length)
</pre>
<p>The inner functions are compiled as <code>FSharpFunc</code> objects, with values closed over being injected as constructor arguments.</p>
<p>Before .net 5.0.200, this would make function <code>F1</code> look like</p>
<pre class="code">
public static FSharpList<int> F1<a>(FSharpList<a> l)
{
FSharpFunc<int, int> aux = new aux@9();
FSharpTypeFunc FI = (FSharpTypeFunc)(object)new FI@11(aux);
return ListModule.Map<a, int>((FSharpFunc<a, int>)new F1@17<a>(), l);
}
</pre>
<p>With .net 5.0.200, the fact that some of the inner functions -- like <code>aux</code> above -- are pure, closing over nothing, has been taken account of, and needless new object creation is avoided, in the same way that C# lambdas have long been cached after first use.</p>
<pre class="code">
public static FSharpList<int> F1<a>(FSharpList<a> l)
{
FSharpFunc<int, int> aux = aux@9.@_instance;
FSharpTypeFunc FI = (FSharpTypeFunc)(object)new FI@11(aux);
return ListModule.Map<a, int>((FSharpFunc<a, int>)F1@17<a>.@_instance, l);
}
</pre>
<p>where the <code>aux</code> and <code>F1@17</code> functions -- the latter being the anonymous function used by <code>List.map</code> -- are referenced through a class <code>internal static readonly</code> value, rather than having to create a new instance every time.</p>Steve Gilhamhttp://www.blogger.com/profile/03622573187942388226noreply@blogger.com0