A regular expression defines a search pattern for strings. Replace is possible for text matches, but repeated substring replace in substrings is difficult.
Especially if the text you want to replace is also outside of the initial substrings.
Using cascaded match evaluators, this replacements gets very easy.
For example to replace quoted text withing square brackets.
Please note the middle text "text" in this example which must not be replaced.
["text1"] "text" ["text2"]
Begin[Pre"1txet"Post]End "text" Begin[Pre"2txet"Post]End
First the text is splitted by the primary substrings defined by square brackets.
Then these substrings are recomposed according to the business logic. In this example the string gets enclosed in a "Pre" / "Post" and then reverted. The primary substrings gets enclosed in "Begin" / "End".
string inputText = "[\"text1\"] "text" [\"text2\"]";
string replacedText = Regex.Replace(
inputText,
$"(\\[)(.*?)(\\])",
arrayMatch =>
{
return
$"Begin" +
arrayMatch.Groups[1].Value +
Regex.Replace(
arrayMatch.Groups[2].Value,
$"(\".*?\")+",
contentMatch =>
{
return $"Pre" + new string(contentMatch.Groups[1].Value.Reverse().ToArray()) + "Post";
}) +
arrayMatch.Groups[3].Value +
$"End";
});
Or modify a text section to add a link from a markdown link to the following picture:
from:
[Interactive Panorama title](link.htm)

to:
[Interactive Panorama title](link.htm)
<a href="link.htm"></a>
Using PowerShell:
[string]$content = [System.IO.File]::ReadAllText($FileName)
# using '(?s)', the dot '.' matches the newline and allows for multiline replace
[string]$StringsRegex = "(?s)(?<section>\[Interactive Panorama.*?\]\((?<link>.*?)\).*?)(?<bild>\!\[\]\(.*?\))"
$updatedContent = $content -replace $StringsRegex, {
$match = $_
$section = $match.Groups["section"].Value
$link = $match.Groups["link"].Value
$bild = $match.Groups["bild"].Value
# already replaced?
if(-not $section.Contains("<"))
{
# insert link
# '$section$bild' -> 'section<a href="$link">$bild</a>'
"$section<a href=""$link"">$bild</a>
}
}
if($updated)
{
[string]$outFile = FileName + ".updated"
[IO.File]::WriteAllText($outFile, $updatedContent)
}
For Math126 we were talking about the Taylor series for

It looks difficult at first glance, but it is actually quite simple. Let me explain:
Using this as a base:

The derivative of this term is:

Which gets to:

Now move the nominator in the sum to get the solution:

Time for a small PowerShell script for the Taylor series:
function f([double]$x)
{
[Math]::Pow($x/(1-$x), 2)
}
function T([double]$x, [int]$k)
{
0..$k | % { $sum = 0 } { $sum += $_ * [Math]::Pow($x, $_ + 1) } { $sum }
}
[int]$K = 16
for([int]$xi = -5; $xi -le 5; $xi += 1)
{
[double]$x = $xi / 10
[PSCustomObject]@{
'x' = $x
'f(x)' = f $x
'T(x)' = T $x $K
}
}
x f(x) T(x)
- ---- ----
-0,5 0,111111111111111 0,111068725585938
-0,4 0,0816326530612245 0,0816318326348185
-0,3 0,0532544378698225 0,0532544328723274
-0,2 0,0277777777777778 0,0277777777741005
-0,1 0,00826446280991736 0,00826446280991734
0 0 0
0,1 0,0123456790123457 0,0123456790123457
0,2 0,0625 0,0624999999943475
0,3 0,183673469387755 0,183673459741776
0,4 0,444444444444445 0,444442421037629
0,5 1 0,999862670898438
The convergence is | x | < 1
T15 is used for this test.
k Tk(x)
- -----
0 0
1 0,25
2 0,5
3 0,6875
4 0,8125
5 0,890625
6 0,9375
7 0,96484375
8 0,98046875
9 0,9892578125
10 0,994140625
11 0,996826171875
12 0,998291015625
13 0,99908447265625
14 0,99951171875
15 0,999740600585938
The Altas 7B shaper is a rare metal shaper dating back 70+ years. Even more rare is the optional indexer.
And a perfect new project to replicate this rotary indexer for my Atlas shaper!

While browsing eBay for some suitable round table with t-nuts I could use to get started for the project, I found this:

An original S7-425 rotary indexer table! Arrived a few days later:


With the top of the indexer covered, I needed material for the base. Lots of 3/4" thick 8" round plate available at eBay:

But a few mm to large for the lathe. To get the jaws a good grip and to pass the bed of the lathe, I had to cut out the four sides to make it fit.


Cutting out the hole for the plate:



This setup is for the engraving. With a insert for cutting threads, the degree ticks were done. A simple wood block ensured a constant length of the tick marks. Once done, the 5 and 10 degree marks were done with a slightly larger depth.


First part of the base is finished.

Next to Bellevue Square was the annual Snowflake Lane parade.
With no fisheye but a normal focal length lens, taking the pictures were challenging with the close distance to the parade, but turned out not too bad.





The new Arduino MKR 1010 was released this year and supports wireless connection. It is similar to the M0 Pro, in that it also uses a SAMD21 32bit processor. It is much smaller but has the same amount of I/O pins available as the M0 Pro.
I had to try it out!

The previous setup was using an Ethernet shield that connected the controller by cable with the router.
I moved everything to an experimental board and switched out the Ethernet class and replaced it with the new Wifi class, along with a few other changes to get it working.


The bright spot in the middle of the board is actually a RGB LED of the wireless controller! I use each of the three colors to indicate HTTP requests, update of time and wind data and update of the air pressure, humidity and temperature.
Out of a brightness range from 1..255, 7 seems a good value to match the internal yellow LED.
It is also possible to use a digitalWrite on the LED port to switch it on or off. This is the same as using analogWrite with 255. This is very bright.
const int GREEN_LED = 25;
const int RED_LED = 26;
const int BLUE_LED = 27;
const int LED_Brightness = 7;
// Configure the LED port of the wireless controller.
WiFiDrv::pinMode(GREEN_LED, OUTPUT);
WiFiDrv::pinMode(RED_LED, OUTPUT);
WiFiDrv::pinMode(BLUE_LED, OUTPUT);
// Set the LED.
WiFiDrv::analogWrite(GREEN_LED, bGreenLed ? LED_Brightness : 0);
The webserver on the board provides a full HTML page and the weather data in a json format for the AJAX requests that gets updated every second.

The matching App is using the AJAX data for display

and also provides access to the weather data for wind, temperature and air pressure stored in the 32Kb chip.

October 6th, the NBA is playing in the Seattle KeyArena. Golden State Warriors vs Sacramento Kings in an exciting pre season game!
Five 12mm shots were enough to capture the whole arena, before construction begins on the $700 million renovation.


One the way back, a view on the newly renovated Space Needle in the moon light. This was just one 12mm shot.
