Author: Lisa

Creamy Tomato Sauce for Pasta

I needed a quick meal last night — so I made a carrot-y, creamy tomato sauce for pasta.

Ingredients

  • 1/4 cup olive oil
  • 2 carrots, diced into small pieces
  • 1/2 large onion, diced into small pieces
  • 3-4 cloves of garlic, diced
  • 3 oz tomato paste
  • 1/3 cup plain Greek yogurt
  • salt, pepper, Italian herbs

Method

  • Heat olive oil in a pan. Add diced carrots and cook for a few minutes. Add garlic and onions and cook for a few more minutes until the onions become translucent.
  • Add salt, pepper, and herbs. Then add tomato paste and stir to incorporate oil. Cook for a few minutes.
  • Add pasta cooking water to thin to a reasonable consistency.
  • Remove from heat and stir in yogurt. Add salt/pepper/herbs to taste.

Turkey Hatchlings v/s Turkeys in the Mail

The first time we bought baby poultry, we picked them up from a local(ish) hatchery. The chicks hatched overnight, were sorted in the morning, and we picked them up in the afternoon. Happy, healthy chicks. The second time, the hatchery was halfway across the country but offered overnight shipping. That’s not a cheap option, but the birds were still happy and healthy when they arrived. Then we wanted to raise turkeys.

We ordered from a well known hatchery, and the only option was “shipping”. They shipped once a week. And USPS shipping was amazingly slow. So very slow. The USPS employee at the local central depot rang us on Saturday morning to see if we could come pick the birds up because he didn’t think they would survive until they were delivered on what would probably be Tuesday. We did, but only one of the birds survived even though we spent the weekend nursing sick birds.

Last year, we tried again — ordered from another well known hatchery. I couldn’t find a hatchery that offered overnight or two-day shipping. But I was able to find one willing to let me pay a little extra to have additional food added to the shipping box. The chicks arrived, but they were still not super spry.

This year, we hatched our first turkey poults. It’s amazing how much easier it is to get them eating and drinking when you start at day zero! The little guys spent about 12 hours in the incubator drying off, then they spent another 12+ hours sleeping under the heater. Then they were hopping around, investigating everything, and being birds. After sprinkling moistened food on the floor and adding tiny bits of plants (clover and dandelion greens) to the top of the water, the little guys were eating and drinking. And, when would find food or water … all of the other poults rush over to investigate.

Tableau Query — Data Sources and the Workbooks Where They Are Used

I have found Tableau’s views of data sources to be … lacking. To provide a report of data sources, the database type, and where it is being used, I put together a query that locates all data sources (or filters by database type — specifically, I was trying to see who was using Snowflake) and lists the site, project, and workbook using the data source.

-- Data sources and what workbook they are used in
SELECT system_users.email , datasources.id, datasources.name, datasources.created_at,  datasources.updated_at, datasources.db_class, datasources.db_name
, datasources.site_id, sites.name AS SiteName, projects.name AS ProjectName, workbooks.name AS WorkbookName
FROM datasources 
LEFT OUTER JOIN users ON users.id = datasources.owner_id
LEFT OUTER JOIN system_users ON users.system_user_id = system_users.id
LEFT OUTER JOIN sites ON datasources.site_id = sites.id
LEFT OUTER JOIN projects ON datasources.project_id = projects.id
LEFT OUTER JOIN workbooks ON datasources.parent_workbook_id = workbooks.id
-- WHERE datasources.db_class = 'snowflake' 
ORDER BY datasources.created_at;


Tractor

It’s been an adventure, but the tractor is finally home! We went out yesterday to drive it home, but a leaky hydraulic system squashed that idea. Today, we got a trailer (had to run home and get the right plug for the back of the pickup), drove out, and trailered the tractor home. That was quite an adventure — I couldn’t imagine trying to drive a tractor that distance!

Postgresql SPLIT_PART and TRANSLATE

We have a database where there’s a single field, args, into which the vendor has glommed quite a few different things. Unfortunately, I need one of those numbers.

"---
- Workbook
- 4477
- Sample Report
- 18116
- null
"

You can use split_part to break a column into elements and only use one of those elements split_part(column_to_split, delimiter, ColumnToKeep)

As an example:
SPLIT_PART(b.args, E'\n', 3)AS task_workbook_id

In this case, I subsequently needed to eliminate the dash and space that prefixed the line. Using TRANSLATE, I am removing the ‘- ‘ with ”:
TRANSLATE ( SPLIT_PART(b.args, E'\n', 3), '- ','') AS task_workbook_id

And now I’ve just got 4477

Web Redirection Based on Typed URL

I have no idea why I am so pleased with this simple HTML code, but I am! My current project is to move all of our Tableau servers to different servers running a newer version of Windows. When I first got involved with the project, it seemed rather difficult (there was talk of manually recreating all of the permissions on each item!!) … but, some review of the vendors documentation let me to believe one could build a same-version server elsewhere (newer Windows, out in magic cloudy land, but the same Tableau version), back up the data from the old server, restore it to the new one, and be done. It’s not quite that simple — I had to clear out the SAML config & manually reconfigure it so the right elements get added into the Java keystore, access to the local Postgresql database needed to be manually configured, a whole bunch of database drivers needed to be installed, and the Windows registry of ODBC connections needed to be exported/imported. But the whole process was a lot easier than what I was first presented.

Upgrading the first production server was mostly seamless — except users appear to have had the server’s actual name. Instead of accessing https://tableau.example.com, they were typing abcwxy129.example.com. And passing that link around as “the link” to their dashboard. And, upon stopping the Tableau services on the old server … those links started to fail. Now, I could have just CNAMED abcwxy129 over to tableau and left it at that. But letting users continue to do the wrong thing always seems to come back and haunt you (if nothing else, the OS folks own the namespace of servers & are allowed to re-use or delete those hostnames at will). So I wanted something that would take whatever https://tableau.example.com/#/site/DepartMent/workbooks/3851/Views kind of URL a user provided and give them the right address. And, since this was Windows, to do so with IIS without the hassle of integrating PHP or building a C# project. Basically, I wanted to do it within basic HTML. Which meant JavaScript.

And I did it — using such a basic IIS installation that the file is named something like iisstart.htm so I didn’t have to change the default page name. I also redirected 404 to / so any path under the old server’s name will return the redirection landing page.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<title>This Tableau server has moved</title>
		
		<style type="text/css">
			<!--
			body {
				color:#000000;
				background-color:#eeeeee;
				margin:0;
			}
			-->
		</style>
	</head>
	<body>
		<P><ul>
		<h2>The Tableau server has moved. </h2>
		<P>The location you accessed, <span style="white-space: nowrap" id="oldurl"></span>, is no longer available.<br><br> Please update your link to use <span style="white-space: nowrap"  id="newurl"></span></p>
		</ul></P>
	
		<script>
			let strOldURL = window.location.href;

			let strNewURL = strOldURL.replace(/hostname.example.com/i,"tableau.example.com");
			strNewURL = strNewURL.replace(/otherhostname.example.com/i,"tableau.example.com");

			document.getElementById("oldurl").innerHTML = window.location.href;
			document.getElementById("newurl").innerHTML = "<a href=" + strNewURL + ">" + strNewURL + "</a>";
		</script>
	
	</body>
</html>

Clearing the Farm

Before deciding to buy (or not buy) a tractor, we decided to take the mower and brush cutter down to the farm property and see how much work it is to clear. We got a large swath cleared and raked into piles … but, yeah, it’s a lot of work!