10 Commits 36b941a90c ... 329d58d379

Author SHA1 Message Date
  windhamdavid 329d58d379 house bath 3 weeks ago
  windhamdavid 5d75c59e70 house bath 3 weeks ago
  windhamdavid 59e6040c83 srh rewrites 1 month ago
  windhamdavid e9159e0faa srh rewrites 1 month ago
  windhamdavid bc76d73e23 srh rewrites 1 month ago
  windhamdavid 83618a4abd srh rewrites 1 month ago
  windhamdavid 70d62cccad gt2 1 month ago
  windhamdavid 3909cb424a gt2 1 month ago
  windhamdavid 2b49c59ba5 srh rewrites 1 month ago
  windhamdavid b26467c3ed srh rewrites 1 month ago
5 changed files with 292 additions and 9 deletions
  1. 219 1
      docs/srh.md
  2. 27 6
      notes/house/bath.md
  3. 4 2
      notes/house/helene.md
  4. 41 0
      posts/2025/2025-06-14-posts.md
  5. 1 0
      src/pages/index.md

+ 219 - 1
docs/srh.md

@@ -1,3 +1,7 @@
+---
+draft: false
+---
+
 # SRH
 
 ## URL Rewrite Setup for MyChart Provider Finder 
@@ -222,7 +226,9 @@ Important Notes:
 
 ---
 
-## CURRENT CONFIG
+<div><br/><br/></div>
+
+## Test Config
 
 **note** the ```underscores_in_header``` directive is required and the ```sub_filter``` module is not available in the current nginx build. 
 
@@ -345,4 +351,216 @@ location ~ ^/(app/providers|/-/providers) {
 		rewrite ^.*(app\/providers|\/-\/providers)(.*)$ https://providers.selfregional.org/providers$2 break;
 	}
 }
+```
+
+---
+
+<div><br/><br/></div>
+
+## Debug Link Error
+
+Epic team found an error where the "bio links from the slots are incorrect" ( the popup window links for each provider above the scheduling time ). The current error is from a redirect loop causing a ```499``` 'Client Closed Request' error. I found that even before the proxy, the url is change and replaces the ```CustomHostID``` with the ```MyChartSiteName``` ( ```MySelfRegional``` -> ```MySRHTST``` ) e.g.:  
+
+https://mychart-np.et1235.epichosted.com/MySelfRegional/app/providers/details?id=WP-24ZbgpnUzW4-2B-2Fz8NuLocNwBA-3D-3D-24sJ0udur53-2FhX6H4Z4O26dH2yxiAz4AP1Nk8QQ7Vkiug-3D  
+👇🏼 ♻️  
+https://mychart-np.et1235.epichosted.com/MySRHTST/app/providers/details?id=WP-24ZbgpnUzW4-2B-2Fz8NuLocNwBA-3D-3D-24sJ0udur53-2FhX6H4Z4O26dH2yxiAz4AP1Nk8QQ7Vkiug-3D
+
+
+I also noticed that even when the link switches out the ```CustomHostID``` with the ```MyChartSiteName``` it still does not function and only functions when the ```CustomHostID``` is completely removed. e.g.:  
+
+https://providers.selfregional.org/MySelfRegional/app/providers/details?id=WP-24ZbgpnUzW4-2B-2Fz8NuLocNwBA-3D-3D-24sJ0udur53-2FhX6H4Z4O26dH2yxiAz4AP1Nk8QQ7Vkiug-3D  
+👇🏼 ❌  
+https://providers.selfregional.org/MySRHTST/app/providers/details?id=WP-24ZbgpnUzW4-2B-2Fz8NuLocNwBA-3D-3D-24sJ0udur53-2FhX6H4Z4O26dH2yxiAz4AP1Nk8QQ7Vkiug-3D  
+👇🏼 ✅  
+https://providers.selfregional.org/app/providers/details?id=WP-24ZbgpnUzW4-2B-2Fz8NuLocNwBA-3D-3D-24sJ0udur53-2FhX6H4Z4O26dH2yxiAz4AP1Nk8QQ7Vkiug-3D
+
+
+So we need to remove ```/MySelfRegional/``` from the 'bio link in slots' ( the ```.providerBioLink``` class ). I suspect the 'Hosted Provider Finder' and 'Canonical URL' translations are the culprit since it's designed to replace the ```CustomHostID``` with the ```MyChartSiteName``` for certain HTML tags. The 'Canonical URL' rule is explicitly set to rewrite links via ```filterByTags="Link"```. Here are the two IIS rules from the documentation:
+
+```xml
+<rule name="Hosted Provider Finder Example" preCondition="Hosted Provider Finder Precondition" enabled="true" patternSyntax="Wildcard">
+  <match filterByTags="Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script, CustomTags" customTags="Hosted Provider Finder Collection" pattern="/MyChartSiteName/*" negate="false" />
+  <action type="Rewrite" value="/CustomHostID/{R:1}" />
+</rule>
+<preCondition name="Hosted Provider Finder Precondition">
+  <add input="{REQUEST_URI}" pattern="/-/providers" />
+  <add input="{QUERY_STRING}" pattern="host=" />
+</preCondition>
+<customTags>
+  <tags name="Hosted Provider Finder Collection">
+      <tag name="meta" attribute="content" />
+      <tag name="use" attribute="xlink:href" />
+  </tags>
+</customTags>
+
+<rule name="Provider Finder Canonical URL Rewrite Example" preCondition="Provider Finder Canonical URL Precondition">
+  <match filterByTags="Link" pattern="^https?:\/\/[^ ]*(app\/providers|\/-\/providers)([^ ]*)/" />
+  <action type="Rewrite" value=" CustomDomain/CustomProviderFinder {R:2}" />
+ </rule>
+<preCondition name="Provider Finder Canonical URL Precondition" logicalGrouping="MatchAny">
+  <add input="{REQUEST_URI}" pattern="(\/app\/providers|\/-\/providers)" />
+  <add input="{QUERY_STRING}" pattern="host=" />
+</preCondition>
+```
+
+As noted in the original translation, these rules depend on a custom nginx module. So I recompiled nginx with the ```--with-http_sub_module``` in order to use the ```sub_filter``` module to test. Here's the build:
+
+```sh
+************@mdev:~ » nginx -V
+nginx version: nginx/1.26.3
+built with OpenSSL 3.0.7 1 Nov 2022 (running with OpenSSL 3.2.2 )
+TLS SNI support enabled
+configure arguments: --prefix=/usr/share --sbin-path=/usr/sbin/nginx 
+--conf-path=/etc/nginx/nginx.conf --modules-path=/usr/share/nginx/modules 
+--error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log 
+--lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body 
+--http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy 
+--http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi 
+--user=nginx --group=nginx --with-file-aio --with-compat 
+--with-ld-opt=-L/var/jenkins/workspace/unix/plesk/packages/brotli/brotli.files/usr/lib64
+--with-http_ssl_module --with-http_realip_module 
+// highlight-next-line
+--with-http_sub_module 
+--with-http_dav_module --with-http_gzip_static_module --with-http_stub_status_module 
+--with-http_v2_module --with-http_v3_module --add-dynamic-module=mod_brotli 
+--add-dynamic-module=mod_passenger/src/nginx_module --add-dynamic-module=mod_pagespeed
+--add-dynamic-module=mod_security --add-dynamic-module=mod_geoip2
+```
+
+
+
+I translated the rule again several times, tested, and discovered:
+
+- Nginx's ```sub_filter``` module cannot target specific HTML tags or attributes like IIS
+- Can NOT wrap the ```sub_filter``` in an ```if``` statement
+- In order to use tag/attribute-specific replacements, we would need Nginx with the Lua module (OpenResty) or a
+a proxy layer that can modify HTML like Node.js
+
+
+
+
+```sh
+location ~ ^/(app/providers|/-/providers)(.*)$ {
+    # Apply to HTML
+    sub_filter_types text/html;
+    # Apply sub_filter for all requests to this location
+    sub_filter '/MySelfRegional/' '/MySRHTST/';
+    # Repeat for all instances
+    sub_filter_once off;
+    proxy_set_header Host $host;
+    proxy_set_header X-Real-IP $remote_addr;
+    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+    proxy_set_header X-Forwarded-Proto $scheme;
+    proxy_pass https://mychart-np.et1235.epichosted.com;
+
+}
+```
+
+In order to use tag/attribute-specific replacements, we would need Nginx with the Lua module (OpenResty) or a
+a proxy layer that can modify HTML (like Node.js middleware) Here's an example rule:
+
+```sh
+# Using OpenResty/Nginx+Lua for more precise filtering
+
+# Define lua function for HTML transformation
+init_by_lua_block {
+    function modify_provider_urls(content)
+        -- Use regex to find and modify only URLs in link tags
+        return string.gsub(content, '<link[^>]+href="(https?://[^"]*)(app/providers|/-/providers)([^"]*)"', 
+                                    '<link href="https://providers.selfregional.org%3"')
+    end
+}
+
+map $request_uri$query_string $provider_finder_condition {
+    "~(\/app\/providers|\/-\/providers)" 1;
+    "~host=" 1;
+    default 0;
+}
+
+location ~ ^/(app/providers|/-/providers) {
+    proxy_pass https://mychart-np.et1235.epichosted.com;
+    
+    header_filter_by_lua_block {
+        if ngx.var.provider_finder_condition == "1" and 
+           ngx.header.content_type and 
+           string.find(ngx.header.content_type, "text/html") then
+            ngx.header.content_length = nil
+        end
+    }
+    
+    body_filter_by_lua_block {
+        if ngx.var.provider_finder_condition == "1" and 
+           ngx.header.content_type and 
+           string.find(ngx.header.content_type, "text/html") then
+            local chunk = ngx.arg[1]
+            local modified_chunk = modify_provider_urls(chunk)
+            ngx.arg[1] = modified_chunk
+        end
+    }
+}
+```
+
+
+## Final Test Config
+
+```sh
+underscores_in_headers on;
+
+location / {
+	rewrite ^/(.*)$ /MySRHTST/-/providers/$1?host=MySelfRegional break;
+	proxy_set_header Host $host;
+	proxy_set_header X-Real-IP $remote_addr;
+	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+	proxy_set_header X-Forwarded-Proto $scheme;
+	proxy_set_header RequestVerificationToken $http_requestverificationtoken;
+	proxy_pass https://mychart-np.et1235.epichosted.com;
+}
+
+location ~ ^/MySelfRegional/(.*)$ {
+	set $subpath $1;
+	if ($http_accept ~* "text/html") {
+    return 302 https://mychart-np.et1235.epichosted.com/MySRHTST/$subpath$is_args$args;
+	}
+	rewrite ^ /MySRHTST/$subpath break;
+	proxy_pass https://mychart-np.et1235.epichosted.com;
+	proxy_set_header Host $host;
+	proxy_set_header X-Real-IP $remote_addr;
+	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+	proxy_set_header X-Forwarded-Proto $scheme;
+}
+```
+
+## Production Config
+
+```sh
+underscores_in_headers on;
+
+location / {
+	rewrite ^/(.*)$ /MySRH/-/providers/$1?host=MySelfRegional break;
+	proxy_set_header Host $host;
+	proxy_set_header X-Real-IP $remote_addr;
+	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+	proxy_set_header X-Forwarded-Proto $scheme;
+	proxy_set_header RequestVerificationToken $http_requestverificationtoken;
+	proxy_pass https://mychart.et1235.epichosted.com;
+}
+
+location ~ ^/MySelfRegional/(.*)$ {
+	set $subpath $1;
+	if ($http_accept ~* "text/html") {
+		return 302 https://mychart.et1235.epichosted.com/MySRH/$subpath$is_args$args;
+	}
+	rewrite ^ /MySRH/$subpath break;
+	proxy_pass https://mychart.et1235.epichosted.com;
+	proxy_set_header Host $host;
+	proxy_set_header X-Real-IP $remote_addr;
+	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+	proxy_set_header X-Forwarded-Proto $scheme;
+}
+
+location ~ ^/\ MySelfRegional/(.*)$ {
+	if ($http_accept ~* "text/html") {
+		return 302 https://mychart.selfregional.org/mysrh/$1;
+	}
+}
 ```

+ 27 - 6
notes/house/bath.md

@@ -1,12 +1,15 @@
-# Master Bath Remodel
+# Master Bath
 
 **24/11/01** - Master bath remodel project involves combining two bathrooms, adding double doors, removing two closets, and converting a bedroom to a dressing room walk in. The secondary vanity in the master was a previous addition which will be removed. Ginny will be taking the upstairs office and I will be moving mine into the [den studio](/notes/house/studio). 
 
 
 ## Log
 
-- **25/06/03** - Quarle's / Snead's supply shopping
-  - picked out tile, carpet, and hardware
+- **25/06/26** - Electrician/GC on site
+- **25/06/24** - Framer finishing out layout ( 1 day )
+- **25/06/17** - Plumbers on site reworking layout ( 3 days )
+- **25/06/11** - Demolition ( [photos](https://davidawindham.com/wha/glenridge/#bath) )
+- **25/06/03** - Quarle's / Snead's supply shopping - tile, carpet, and hardware
 - **25/06/02** - Demolition begun
 - **25/03/18** - meeting with plumber re: adding gas tankless water heater - put in a CPW request for gas lines since contractor recommended over electric
 - **25/02/28** - contractor has us on the schedule starting in a couple weeks. Got at final mockup of the remodel. 
@@ -18,18 +21,36 @@
 ![glenridge-bathrooms](/img/glenridge-bathrooms.jpg)
 <div style={{display: 'flex',  justifyContent:'center', alignItems:'center', marginBottom:'20px'}}>👈🏻 before & after 👉🏻</div>
 
-
-![glenridge-bathrooms](/img/glenridge-bathroom-remodel-mockup.jpg)
-![glenridge-bathrooms](https://davidawindham.com/wha/glenridge/img/master-2.jpg)
+![glenridge-bathrooms](/img/glenridge-master.jpg)
 
 
 ## Design
 
 We want to stay 'true' to the original house. The style is a contemporary craftsman built in 1979. The current bathrooms use hexagonal tiles, bulb makeup style vanity lighting, and contemporary hardware. Both showers/tubs are fiberglass insets but we'd like to move to a lipless tiled glassed shower and a freestanding tub. A second vanity/sink addition was made sometime during the 80s which we'd like to remove. 
 
+## Dressing Room
+
+Leaning more into the custom walk in cabinetry instead of framing in additional closets but would like the majority of them them to have doors - e.g.
+
+<div style={{maxWidth:600}}>
+![glenridge-bathrooms](/img/glenridge-bath-dressing.jpg)
+</div>
+
 
 ## Materials
 
+Selected the cabinetry color and tiles ( note the wall tiles are hexagon and not square )
+
+<div class="responsive-image-right" style={{maxWidth:370}}>
+![glenridge-bathrooms](/img/glenridge-bath-counter.jpg)
+</div>
+
+<div style={{maxWidth:400}}>
+![glenridge-bathrooms](/img/glenridge-bath-materials.jpg)
+</div>
+
+
+
 We've decided to switch over to Moen hardware after hearing some feedback from others especially regarding their warranty and replacement policies. We've also decided to go with chrome over brushed nickel because it's easier to match up other hardware and vary between brands. **MOEN - Voss line**
 
 - **Bath** - ~American Standard - Aspirations 68” Freestanding ( brushed nickel  )[specs]

+ 4 - 2
notes/house/helene.md

@@ -9,13 +9,15 @@ image: https://davidawindham.com/wha/helene-1.jpg
 
 
 
-**24/10/05** - Hurricane Helene rolled through last week and did some damage mainly from the three and a half ton oak tree that fell on the house. I'm taking photos and making notes here to keep up with the details. I wrote up a post @ [/posts/hurricane-helene](/posts/hurricane-helene) and published additional damage and construction photos 📷 @ [/wha/glenridge/#helene](https://davidawindham.com/wha/glenridge/#helene)
+**24/10/05** - Hurricane Helene rolled through last week and did some damage mainly from the three and a half ton oak tree that fell on the house. I'm taking photos and making notes here to keep up with the details. I wrote up a post @ [/posts/hurricane-helene](/posts/hurricane-helene) and published additional damage and construction photos 📷 @ [/wha/glenridge/#helene](https://davidawindham.com/wha/glenridge/#helene) 
 
 
 
 ## Log
 
-- 6/02 - **Demolition** ( 4.5 days 2,3,4,10,11 )
+- 6/18 - Upstairs plumbing
+- 6/17 - Sewer Main Repair
+- 6/02 - **Master** Demo ( 4.5 days 2,3,4,10,11 )
 - 4/16 - **Gas** lines installed
 - 4/10 - **Roof** replaced - 7am -> 6pm - finished 
 - 4/10 - **Roof** replaced - 7am -> 6pm - finished 

+ 41 - 0
posts/2025/2025-06-14-posts.md

@@ -0,0 +1,41 @@
+---
+title: GT2 RS
+slug: gt2-rs
+description: Today I learned that there are cars too fast to drive
+<!--- authors:
+  - name: David Windham
+    title: Something Else
+    url: https://davidawindham.com
+    image_url: https://davidawindham.com/til/img/gt2.jpg -->
+tags: [journal, cars]
+image: https://davidawindham.com/til/img/gt2.jpg
+hide_table_of_contents: true
+---
+
+Today I learned that there **are** cars that are just too fast for me. 
+
+<!-- truncate -->
+
+
+
+A buddy of mine invited us to drive some cars to a show. His father collects and races of Porsches. He's got some other exotic sports cars like Ferraris, Lamborghinis, and MacLaurens as well, but it's mostly Porsches. His garage was lined with racing photos and trophies. He's German and told me that he started racing at age 52 with a Porsche 914. Twenty years ago he won the Sebring Enduro in a 930 at age 62. 
+
+He currently has nine Porsches in his collection now including a Carrera GT and a three other GTs. There's nothing slack about any of em. He put the better half in a LE Turbo S Cabriolet and asked me which one I wanted to drive. I responded with 'the fastest' which I had thought would be the GT3 Weissach, but they put me in the GT2 RS. Handed me the key, showed me how to crank it and gave me a somewhat stern "you gotta watch this one, it'll get away from you" before we got rolling. 
+
+![](/img/gt2.jpg)
+
+I'm not exactly timid when it comes to driving, but I was a bit concerned knowing it's a half a million dollar car that I'm pretty sure my insurance wasn't going to cover. I know em well enough but not that well. I felt it out for a bit and then hit it about ten minutes in and quickly realized this wasn't the type of model to just grab the wheel and put your foot down. It's absolutely insane that it's on the road and should require a different license. 
+
+So yes, there is a car that is too fast for me. There's some sorta magic keeping the rear wheels on the ground and the transmission not ripping the gears apart. I actually asked to take a slower car home. I took the Dakar because I was courious and knew it would give me all wheel drive. I raced it alongside the Speedster and to be honest, several seconds to 100mph is still a race car. 
+
+![](/img/gt2-rs.jpg)
+
+There are so few of these cars that I was just glad for the opportunity and hopefully I made the drivers list for the next show. I later learned that this particular model[^1] is holding down a vast majority of the track records including the Nürburgring[^2]. After I mentioned that my first car was a Porsche and that I'm currently the age he started racing, I asked him if he'd coach me.
+
+
+<div><br/><br/></div>
+
+---
+
+[^1]: Porsche GT2 - https://en.wikipedia.org/wiki/Porsche_911_GT2
+[^2]: Nürburgring - https://en.wikipedia.org/wiki/Nürburgring

+ 1 - 0
src/pages/index.md

@@ -6,6 +6,7 @@ description: A place to keep notes and documentation
 # Today I Learned
 
 - **2025**
+  - 25/06/14 - [GT2 RS](/posts/gt2-rs)
   - 25/04/25 - [Arturia](/posts/arturia)
   - 25/04/07 - [Stu](/docs/computers/stu)
   - 25/04/01 - [Studio Desk](/notes/house/studio)