tech
GCastGCast 57: Azure Data Factory GitHub Deployment
- Data Factory assets are code, so they belong in source control. Giard says that although Azure Data Factory work is done mostly in the browser through a graphical interface, the pipelines, data sets, data flows and linked services are stored as JSON configuration. That lets them go into a repository for continuous integration and deployment, syncing with other developers, and rollback.
- The Setup Code Repository button offers Azure DevOps or GitHub. At recording those were the only two options; Giard picks GitHub and enters his account name, which loads a drop-down of his repositories. The target repository cannot be empty, so he creates a new public one with a README file before linking it. The Data Factory itself was set up in advance, in episode 18.
- Linking asks for a branch, a folder and whether to import. He uses the only branch, master, as the collaboration branch and the root folder. A subfolder lets several Data Factory services share one repository, each in its own folder. He chooses to import the existing resources so that a pipeline he had already built is pushed in, and leaves the other settings at their defaults.
- Once linked, later changes are pushed to GitHub automatically. After he renames something in a pipeline and saves and publishes it, the repository shows that pipeline updated 25 seconds earlier, with the change visible in its history.
- Use separate branches to avoid colliding with production or colleagues. Giard suggests committing to your own branch rather than straight to master, then merging later by hand or by some automatic process. This keeps a history of every change and lets you roll back.
Technology and FriendsEpisode 571: Jon Galloway on the .NET Foundation
- The foundation exists to hold copyright for open-source .NET. Galloway, its executive director for two years, says it was set up in 2014 as a nonprofit founded and funded by Microsoft but external to it, so that other companies and individuals could collaborate once .NET was open-sourced. Every commit passes through a contributor license agreement, which he says lets companies trust the pedigree of the code, to the best of the foundation's ability.
- The board was reshaped to be elected by the community. Until March it had three seats, two held by Microsoft employees (Scott Hunter and Miguel de Icaza) and one appointed (Oren Novotny); it now has seven, one Microsoft-appointed (Beth Massi) and six elected from almost 500 members, out of 45 candidates: Jon Skeet, Sara Chipps, Iris Classon, Phil Haack, Oren Novotny and Ben Adams. Galloway says the point is to scale beyond himself, with teams for outreach, meetups, project onboarding and corporate relations writing roadmaps that members can join.
- A Meetup Pro network is meant to take over INETA's role for good. Galloway says .NET meetups were poorly organized next to other ecosystems' Meetup Pro groups; in about a year and a half the foundation's network reached almost 300 groups and over 200,000 members, with the foundation paying their Meetup Pro fees. He argues INETA depended on Microsoft marketing money that changes year to year, while the foundation will always care about .NET, and the long-range plan includes things like speaker grants.
- The foundation wants more projects and more ways to join. It has about 75, such as xUnit, NUnit, Json.NET, IdentityServer, AutoMapper, Orchard and DNN, and Galloway says that is fewer than it wants. The single joining route suits established projects with a full team, so he wants a lightweight tier for small promising projects and a more mature tier with long-term support and checks such as patent scanning that some companies require.
- Corporate sponsors pay but deliberately get no board seat. Since December, Telerik, Insight and Pivotal have joined Microsoft, previously the only financial contributor, to cover legal costs, Meetup Pro fees and infrastructure. Galloway says some software foundations charge sponsors millions for board seats, which can feel like a club for big companies; this one took inspiration from the GNOME Foundation's elections and leaves leadership to the community.
GCastGCast 56: Azure Web App Deployment Slots
- Deploying straight from GitHub to production is risky. Building on the previous episode's GitHub-to-web-app integration, Giard warns that a mistake pushed to the repository reaches users at once. A deployment slot is a staging or test area that testers can see and the public cannot, running on essentially the same hardware, platform and infrastructure as production. In his view that makes it a much more accurate test.
- A slot is added from the web app and gets its own URL. By default the app has only the production slot. He adds one called "staging", and notes you can name it "testing" or create several. The slot has its own overview page and a URL like production's with "-staging" appended to the app name.
- The slot is wired to GitHub through its own deployment center. He repeats the previous episode's steps against the staging slot, choosing his GitHub account, the demo repository and the master branch. The deployment log shows the build steps and the commit message, and ends in success. The staging URL then serves the repository's basic ASP.NET app while production still shows the default page.
- Swap redirects traffic rather than copying files, so it is fast. Giard explains that swap only changes which slot a gateway in front of the app points at as production, with nothing copied back and forth. After the swap the tested code is in production, and the old production code sits in staging as a backup. You can swap back if the release goes wrong.
GCastGCast 55: Web App GitHub Deployment
- The web app's Deployment Center links it to source control. The sources offered were Azure Repos, GitHub, Bitbucket and a local Git repository. Giard picks GitHub for a near-template ASP.NET app.
- Choose between simple push-to-deploy and a fuller build pipeline. The simple option deploys every push straight to the web app, and that is the one Giard uses. He says Azure Pipelines is for when you need more control, such as running unit tests first. He then gives the GitHub account (organization), the repository and the branch to deploy, here master, and clicks Finish.
- Connecting the two triggered the first deployment on its own. About a minute later, with nothing else done, the Deployment Center detected that GitHub held code the web app lacked. It went from pending to running to success, auto-refreshing as it went, and the site then served the repository's code instead of the default Azure page.
- Every later push redeploys without touching Azure. Giard edits a heading, pushes with
git push origin master, and a new deployment starts automatically. Refreshing the live site shows the changed text.
GCastGCast 54: Azure Storage Replication
- Locally redundant storage keeps three synchronous copies in one data center. Giard says every write to an Azure storage account produces three copies, written atomically so no success response returns until all three are on disk; only one is live, and another is promoted transparently if it fails. The copies sit in different fault zones (no shared hardware such as a power supply) and different update domains (so upgrade reboots never hit two at once). He calls it the cheapest option.
- Geo-redundant storage adds three asynchronous copies in another region. The three atomic in-region copies stay, and three more are written asynchronously to a completely different region, so a disaster that destroys the primary data center still leaves a copy that can be promoted to live.
- Read-access geo-redundant storage makes one secondary-region copy readable. Otherwise identical to geo-redundant, it lets users read from a copy in the secondary region as well as the primary; Giard says serving reads from two copies can make reads twice as fast.
- Zone-redundant storage spreads the three in-region copies across data centers. Still three copies in one region, but because most regions have several data centers, a copy may go to a second one that Giard says can be hundreds of miles from the first, guarding against a natural disaster wiping out one site.
- Replication can be changed after creation, despite looking read-only. It is set from a replication drop-down when creating the storage account; on an existing account the Overview tab shows the setting as non-editable, but the Configuration blade lets you change it.
Technology and FriendsEpisode 570: Laurent Bugnion on Migrating Data to Azure
- Moving MongoDB to Cosmos DB needed only a new connection string. Bugnion, a Microsoft cloud advocate, built the demo for Microsoft Ignite the Tour, which he says ran in 17 locations with about 50,000 viewers in total. It used a fictitious Tailwind Traders company, assumed to be all on-premises, with an old SQL Server, a MongoDB, and Node.js and ASP.NET app services. He ran Mongo's own mongodump and mongorestore on the on-premises Linux VM, restoring straight into Cosmos DB through its Mongo API, to show that native tools work against it. He concedes it is still a different database system, so there may be exceptions, and says to try it in a staging environment first.
- Azure's Database Migration Service keeps syncing changes, so downtime stays minimal. Bugnion says the service, released around October of the previous year and now generally available, keeps copying writes from source to target while the old site stays live. You test the target, perhaps from a staging site, then switch the connection string and stop the service. It handles several source and target pairs, Mongo to Cosmos among them. He used it for the SQL migration. His demo database was a few megabytes, and he says larger ones just take longer.
- SQL Database Managed Instance makes old SQL Server databases migratable. Bugnion says it claims "99 point something percent" compatibility back to SQL Server 2005. It adds features plain Azure SQL Database lacked, such as cross-database joins and compiled CLR. He notes that SQL Server 2008 goes out of support this year.
- Managed Instance has no public IP, by design and without exception. Bugnion says it can only be reached over a private virtual network, through VPN or ExpressRoute. In the demo the web service was containerized in the same virtual network, and only the container's port was opened to the public. He argues this answers the many firms that stayed out of the cloud because they would not accept a public port on their database.
GCastGCast 53: Creating a Data Warehouse in Azure
- Creating an Azure data warehouse means creating a SQL server too. Giard says the process resembles creating a SQL Azure database: in portal.azure.com, Create a resource, then Databases, then SQL data warehouse (or search for it), choosing a resource group, a warehouse name and a new SQL server with an admin login, at
<name>.database.windows.net. Deployment takes a few minutes because it builds the server first and the warehouse on top of it; he accepts the defaults for the remaining settings. - Place the warehouse near the people and applications that consume it. Giard's reason for choosing a location is to keep latency from becoming excessive.
- Nothing can connect until a firewall rule admits its IP address. A rule is an IP range that must include the client's address; "Add client IP" creates one covering only your current address, named with today's date. Nothing takes effect until you click Save, and other applications need their own holes opened the same way. Once connected, he says, tools such as SQL Server Management Studio or the Visual Studio data tools can be used to load data and build star schemas.
Technology and FriendsEpisode 569: John Alexander on ML.NET
- ML.NET brings machine learning to C# developers without Python. Alexander, who works on the ML.NET docs at Microsoft, says it was launched in beta at Build 2018 and officially at Build 2019. A model can be trained and used for predictions locally, with no cloud connection. He says it does not yet support ARM, so it does not run on mobile phones.
- Every ML.NET job follows one fixed sequence of steps through an MLContext. Alexander's steps: add the Microsoft.ML NuGet package, create an MLContext, and load the data. Then prepare it, which includes "featurizing" string fields into numeric vectors. Then pick a trainer for the scenario, train, and evaluate using metrics specific to that trainer. The model is saved as a zip file of binary parts, which a web app, API, Azure Function or desktop app loads, either predicting in batches or one item at a time through the prediction engine. His example is a function that classifies incoming tweets and passes the negative ones to customer service.
- Models trained elsewhere can be imported and retrained on little data. Alexander says a model can be trained at scale in Azure, or come from a data science team, and then be used locally in ML.NET. Separate NuGet packages handle ONNX and TensorFlow. With transfer learning, the layer closest to the output is cut off and retrained on a small labelled set, for example so a retailer can sort images into food or appliance.
- ML.NET is about ten years old and in daily use inside Microsoft. Alexander says it began as an internal Microsoft Research library called TLC, and that it is used in Office and Bing. One outside user applies it to regression on the makeup of wine.
- Model Builder and an AutoML CLI generate the C# code for you. Alexander says Model Builder, a Visual Studio extension still in early alpha, tries several trainers on your data set, tunes them, and returns an optimized saved model plus the C# to train, evaluate and run it. The command-line AutoML tool does the same. He says this saves .NET developers from going deep into data science theory. Giard adds the view, from his own use of ML Studio, that such tools also teach the steps of building a model.
Technology and FriendsEpisode 568: Heather Wilde on Anticipatory Design
- Anticipatory design combines user experience and interface with machine learning. Wilde describes it as a relatively new field, usually involving hardware and software together, such as a phone's GPS or Alexa devices that collect data. She separates the user experience, which is multisensory (the matching tables, colours and fry smell of a McDonald's), from the user interface (eating the fry itself).
- Data about the person and the crowd lets a business act first. Wilde's example is the Starbucks app, which suggests her usual drink as she passes a store and alerts the store if she heads towards it. She first says the drink is made in advance, then corrects that it is only suggested. She calls Target's stocking of Pop-Tarts ahead of tornadoes and hurricanes AI in logistics, a step short of anticipatory design.
- Amazon Go removes checkout entirely and shows the idea working. Wilde says the stores have no staff. The Amazon app is detected over Bluetooth or Wi-Fi on entry, cameras track what is taken, and the purchase is charged on the way out with no action by the shopper. She says it works because it meets the wish to shop fast, stocks often-bought items at familiar shelf heights, and cannot really be tricked.
- It suits only products that collect data and have great designers. Wilde's first test is whether the product has, or could have, an online part that gathers data, or could connect to a physical device such as Alexa or Nest. Her second is a designer who can build a consistent, beautiful interface, as with the Amazon store's wood shelving or Apple's unboxing. She says she herself designs experiences, not interfaces.
- Small companies can buy data cheaply, so spend the money on design. Wilde says firms without Target- or Starbucks-scale data can start from US government sets such as the census, or anonymized data sets sold by subscription for a small fee, and build personas from them. She says design is where she would spend the money, and that this is why the field is called anticipatory design and not machine learning.
GCastGCast 52: Using hilite.me to Format Code as HTML
- Code pasted into Open Live Writer loses its colors and line breaks. Giard edits and publishes his blog in Open Live Writer (formerly Live Writer), which used to have a plugin for inserting formatted code; pasting C# directly now looks "awful", and even fixing line breaks in the source view fails because HTML ignores carriage returns.
- hilite.me turns pasted code into color-coded HTML and CSS. You paste the code, pick its language, choose a style and click Highlight, and it returns a preview plus HTML to paste into the post's source. Giard always uses the "colorful" style, leaves other options at default, and omits line numbers because they make it harder for readers to copy the code.
- Inline styles mean the blog needs no added style sheet. The generated HTML carries its styles inline, which Giard says suits his blog because adding a style sheet is hard when each page is its own thing.
- The same approach works across many languages. He demonstrates C#, JavaScript and JSON, noting the tool recognizes each language's keywords, and says it can format HTML as well; he calls it a tool he uses quite a bit for prettier code without much effort.
Technology and FriendsEpisode 567: Elton Stoneman on Docker
- Containers isolate the app process instead of virtualizing an operating system. Stoneman, who has worked at Docker for about two and a half years after a career as a .NET consultant, says a containerized process such as IIS's w3wp.exe runs directly on the host. To itself it seems to have its own IP address, server name, C drive and registry. Containers are light enough that in his DevSum workshop he runs about 15, including Elasticsearch, on a two-core, 7 GB Azure VM. They reach each other by DNS name over a Docker network.
- A Docker image runs the same anywhere, and clusters self-heal. Stoneman says anyone with Docker can run the image and get the same behaviour, on a laptop with Docker Desktop or in Azure or AWS. In production you give a Docker Swarm or Kubernetes cluster a definition of the app, and the cluster places the containers. His example: if 50 web containers are wanted and a server running five of them dies, the cluster starts five more elsewhere, so no one gets a 2 a.m. call.
- Most teams keep state outside the containers, in managed services. Stoneman says state in containers is possible; he has a Pluralsight course on it. The common pattern is to run SQL Server in a container in test but use a managed service such as SQL Azure in production, with only a configuration setting changed.
- He sees almost no reason to deploy without containers. Stoneman says a Dockerfile replaces the Word document of deployment steps, sits in source control, and can even compile the app. Because production runs the same package that was tested, nothing is forgotten when a build is promoted. On a Windows Server 2019 base, a .NET 2 Web Forms app, or just its MSI, runs without code changes. He also says the shared Dockerfile and Compose files give dev and ops the same tools and language. His one exception is hardware peripherals with unusual connections, which a container cannot reach.
- Containerize the whole monolith first, then split out valuable features. Stoneman says rewriting a 2-million-line legacy app as microservices could take two years. Instead, package the whole app in a container, then move the features that gain most from running and updating separately into their own containers. This is the theme of his Pluralsight course "Modernizing .NET Apps with Docker". His suggested learning order: run public images such as Microsoft's IIS image, then write Dockerfiles, then use Docker Compose. He points to his book Docker on Windows (Packt) and his free workshop at dwwx.space, with its code on GitHub.
Technology and FriendsEpisode 566: Hattan Shobokshi on Terraform
- Infrastructure as code turns one engineer's head knowledge into a repeatable script. Shobokshi, a senior software engineer on Microsoft's CSE (commercial software engineering) team, contrasts it with clicking through a wizard: a script documents what was built, lets a colleague rebuild it while the owner is on vacation, and gives the same result every run instead of a human's small variations.
- Infrastructure in source control gets the same tooling as application code. He says a scripted change can be diffed to show exactly what a colleague altered on a VM, and Giard adds that a breaking change can be rolled back to the last working version.
- Terraform declares a desired state rather than execution steps. Shobokshi says you define resources (VNets, VMs) and variables, Terraform downloads the provider for the target,
terraform plancompares the code against what exists in, say, Azure, andterraform applycreates only what is missing. He says it is free with an enterprise version whose features he does not know, he believes it is open source, and its providers cover both cloud and on-prem, including Azure and bare-metal servers. - Terraform competes with ARM templates mainly on readability. He and others find HashiCorp's HCL easier to read than a long ARM JSON file. He qualifies the multi-cloud claim: the same file will not run on Azure, AWS and Google, because resource calls are environment-specific, but knowing the structure makes the code easy to port.
- Under GitOps, checking in a Terraform change is how infrastructure gets deployed. He describes using Terraform to stand up all the infrastructure for a new team's application, with build pipelines that verify and deploy any checked-in change, so adding a VM means editing the script rather than asking anyone; whether to add manual approval is up to each organization. He says he used it in production at earlier jobs and has customers now moving towards it.
GCastGCast 51: Creating an Azure Container Instance
- The Azure CLI creates a container instance straight from a registry image.
Giard describes a container as applications, resources and data packaged
and deployed together, closed to the outside world by default until holes
are punched in it. Working in Cloud Shell, which is already signed in
through the portal, he runs
az container createinto an existing, empty resource group, with--resource-group,--name,--image,--dns-labeland--ports. The image is a simple web-server sample from Microsoft's documentation team at mcr.microsoft.com/azuredocs/aci-helloworld. The command took about 60 seconds and returned JSON describing what it created. az container showgives the public address of the container's web app. Giard queries only the fully qualified domain name and uses--out tableinstead of JSON. That returned an address ending centralus.azurecontainer.io with a provisioning state of succeeded, and browsing to it showed the sample's static page with a picture.az container logsshows the container's request log for troubleshooting. Each GET request to the web app appeared as a log entry, and refreshing the page a few times added more entries.
Crosstalk SolutionsVideo Door Phone Setup
synopsis
The host builds a video door entry system from an Axis A8105-E SIP door station, a hosted FreePBX server and Yealink T58A phones. Pressing the door button rings a ring group, the answering phone shows the camera feed, and dialling 99 unlocks the door for 5 seconds. A call measures roughly 140 kbps to 1.2 Mbps.
Components. The requirements are SIP and H.264 video. He lists Axis and CyberData door stations at $799 to $1,249 MSRP, with Crosstalk offering 10–15% off. Phones range from the T58A (about $245 without camera) to the Grandstream GXV3240 ($215), which he dislikes. The unlock relay should sit away from the door station so it cannot be hot-wired. A hosted PBX lets the door and the phone be in different cities.
FreePBX. Video support is off by default; he enables it under Asterisk SIP Settings with H.264 first. Phones and the door station get ordinary extensions. A ring group rings two phones and fails over to an announcement telling the visitor to use the main entrance or call the on-call number, then hangs up.
Axis configuration. The door station registers as extension 300, with a DTMF sequence of 99 and a recipient pointing at the ring group. Three action rules follow: the button calls the ring group; the code sets the door output active for 5 seconds; and the relay going active plays an audio clip, where a real install would use a buzzer. Rules can run on schedules, for example auto-unlocking in business hours.
Test and bandwidth. Latency is low over the hosted connection. Traffic is about 1 Mbps while ringing, 140–200 kbps with a still picture, and about 1.2 Mbps when the camera moves.
- A SIP door station can ring video phones and unlock remotely. In the host's demo, an Axis A8105-E calls a ring group on his Crosstalk-hosted FreePBX; whoever answers on a Yealink T58A sees the door camera and dials DTMF 99 to trip a relay that unlocks the door for 5 seconds. Because the PBX is hosted, the door and the answering phone can be in different cities.
- Any door phone or desk phone works if it does SIP and H.264. MSRPs he cites: Axis A8105-E $799, Axis A8004 $1,249, CyberData outdoor video units $1,023 with keypad and $920 without; Crosstalk, which sells them, offers 10–15% off MSRP. The T58A is about $245 without camera; the Grandstream GXV3240 ($215) should work, though he dislikes Grandstream and says FreePBX functionality is lost.
- Keep the unlock relay away from the door station itself. Best practice is a separate relay box or central controller, because someone could pull a wall-mounted unit off and hot-wire the two relay wires to open the door; his bench demo wires the relay directly only for simplicity.
- FreePBX has video disabled by default, and needs a no-answer path. In FreePBX 14.0.11 (current as of May 2019) video support must be enabled under Asterisk SIP Settings with H.264 at the top; extensions are ordinary. He sends the ring group's failover to an announcement that tells the visitor where to go, then hangs up, noting rings are 5 seconds each.
- Bandwidth to a hosted PBX is modest but varies with motion. On the FreePBX dashboard a call measured about 1 Mbps while ringing, 140–200 kbps with a static picture, and up to about 1.2 Mbps when the camera moved, since H.264 is variable-bitrate; on a local network the host calls it next to nothing.
GCastGCast 50: Angular pt 9: Incremental Search
- Search is added as a new hero-search component on the dashboard.
This is the final video of Giard's walk-through of the Tour of Heroes
tutorial from angular.io (part two of lesson six). Generating the
component creates an HTML template, a test file, a TypeScript file and a
CSS file, all boilerplate; its selector, app-hero-search, goes into the
dashboard HTML. The template loops over
heroes$and links to each hero ID; Giard explains the$is a naming convention marking an observable rather than an array. - An RxJS Subject throttles keystrokes before the hero service is queried.
The component's
searchmethod pushes the typed string into asearchTermsSubject, with the hero service injected through the constructor. On init it waits 300 milliseconds, checks whether the term has changed, and usesswitchMapto call the service'ssearchHeroes. searchHeroesruns a partial-match name query against the heroes API. It trims the term and returns an empty array if nothing is left; otherwise it does an HTTP GET on api/heroes filtered by name, where the single equals sign gives a partial match. Like the service's other methods it taps into logging and adds error handling. Giard notes the tutorial lists this code above the step that calls for it, and the component's CSS only at the bottom of the page.- The finished search narrows results with each letter typed. In the demo, adding letters cut the list down to one hero, clicking it opened that hero's detail page, and after renaming the hero the old search returned nothing.
Crosstalk SolutionsYealink T58A
- The host rates the Yealink T58A his favourite phone, despite the price. He says it has the best voice quality of any phone he has used, especially on G.722, and recommends it for receptionists, executives and anyone who values video calling, at just over $330 per phone with camera.
- The camera is a separate purchase on the T58A. The T58V has the camera built in; the T58A takes an optional CAM50 USB camera with a privacy shutter. MSRP with camera is $539, but Amazon had the phone at $244.22 plus $88 for the CAM50 ($332.22); the host offers to match Amazon's price if bought through Crosstalk.
- Hardware suits desk use but lacks some basics in the box. It has a 7-inch adjustable touchscreen, 720p/30fps video, Android 5.1.1, dual gigabit ports with VLAN support for the PC port, 802.3af PoE (AC adapter sold separately), Bluetooth, Wi-Fi, 27 DSS/BLF keys and EXP40 sidecar support. The stand has one angle, against the T56A's two; a second USB port drives a photo-slideshow screensaver.
- Video calling works only with H.264 or VP8 endpoints. He tested T58A-to-T58A calls, the Bria softphone, and Zoiper on iPhone after its H.264 add-on (about a dollar), but the free X-Lite softphone failed because it uses H.263. It also displayed an Axis door station's video and passed its DTMF unlock code.
- The FreePBX endpoint manager covers the settings that matter. Options it lacks can be added through a basefile edit, which he says is rarely needed. He recommends hosting a shared Yealink directory on the TFTP provisioning server rather than in each phone, and doubts anyone will use its browser or email apps.
Y CombinatorMonetizing Podcasts and Newsletters - Chris Best of Substack and Jonathan Gill of Backtracks
synopsis
Chris Best, CEO of Substack, and Jonathan Gill, CEO of Backtracks, debate paid versus ad-supported media with a YC host. They end in a blend, but with Best holding the stronger position: culture is badly underfunded, and direct subscriptions to individual creators will unlock far more of it than advertising can. Gill defends sponsorship as the realistic near-term model for US podcasting, so long as it is honestly measured.
Paid versus advertising. Gill says US listeners expect podcasts to be free and the ecosystem is not ready for subscriptions; ads work when they fit the content. Best calls the ad-funded podcast market "small and sad" beside what payment could support, citing China, where low payment friction and a willingness to pay for educational audio make the market more than ten times larger. Both point to Chinese professors who quit teaching to podcast for millions.
Measurement and pricing. Gill compares download counts to early banner impressions. Backtracks measures how long people actually listen and detects fraud, and he concedes clients dislike that their numbers come out lower. Best suspects podcast ads are in an "Emperor's New Clothes" state and expects per-download rates to fall. Gill counters that Backtracks buys podcast ads and finds them worth it; startups can measure ROI through offer codes, or radio-style, by cutting the spend and watching the result.
Subscribing to a person. Best's thesis is that society spends too little on culture, and that as automation spreads it should spend more. What is new is the ability to subscribe directly to one person: a creator with 10,000 devoted fans makes nothing on YouTube but can live at $5 a month each. Gill adds that advertisers pay for audience quality, not just size, but both warn that data-driven, advertiser-led content loses creativity, as YouTube thumbnails and titles show. People pay most readily for things that improve them, which is why education sells.
Platforms and discovery. Podcasting stays decentralised even though Apple is said to account for about 60% of plays; RSS subscribers get every episode, unlike Twitter followers. Newsletters spread more easily than audio because text is easy to forward and link to. Best does not expect newsletters to replace Facebook's network of real-life friends, but he does expect them to replace it as the place where news and culture are consumed.
Growth tactics. Best advises making the best, most accessible essays free and keeping the rawer, wonkier material for subscribers, with clear email calls to action and a referral scheme in which paying subscribers give friends gift months. Gill stresses quality over quantity, good storytelling, and a shareable opening clip, citing research that listeners remember audio 36–39% longer than what they see or read. Substack itself used a podcast to tell its story at scale after finding that only in-person pitches persuaded writers.
Getting started. Gill says start with why you are doing it and what the topics are. Best says just publish. Consistency is the one reliable predictor of success, and any newsletter people regularly open can probably charge.
- Advertising can only fund a small slice of possible audio. Jonathan Gill of Backtracks argues US podcasting is not yet ready for subscriptions, so sponsorship is the practical path, blended with paywalls and Patreon-style support. Chris Best of Substack counters that the ad-supported podcast market is "small and sad" next to what direct payment could fund, pointing to China, where paid audio is said to be more than ten times larger.
- Download counts overstate podcast ad value; measurement will reprice it. Gill likens downloads to early banner-ad impressions and says Backtracks measures actual listening time and strips out fraud, which makes clients' numbers come out lower. Best suspects much podcast advertising is overpriced and predicts the per-download rate will fall sharply. Gill says Backtracks buys podcast ads and finds them worth it, measured through offer codes or by stopping the spend and watching what happens.
- Subscribing to an individual creator is new and undervalued. Best's core thesis is that society spends far too little on culture, a market failure, and that the internet now lets people pay a person directly. A creator with 10,000 devoted fans earns nothing on YouTube but can live on $5 a month each. Gill replies that advertisers also pay for audience quality rather than size.
- Give away your best accessible work; keep the raw material paid. Best advises Substack writers to make focused, shareable essays free so they spread, and send wonkier, less filtered material to subscribers, the Ben Thompson model. Substack is also trialling gift subscriptions that paying readers hand to friends. Gill adds that a quotable intro clip helps sharing, citing research that people remember what they hear 36–39% longer.
- Consistency predicts success; regular readers mean you can charge. Best says most failed newsletters stop after one or two posts, and the one reliable predictor Substack sees is publishing consistently and acting on feedback. In his view, a newsletter people regularly open can be monetized, because getting regular readers is harder than converting some of them to paid.
Technology and FriendsEpiosde 565: Eric Boyd on Microservices
- Microservices are autonomous units isolated by business domain, not small services. Boyd defines them as service-oriented architecture principles plus cloud, DevOps and REST: in an e-commerce system, product catalog, customers, orders and fulfillment each own their tech stack and data, behind a well-defined interface, usually HTTP and REST. He calls it a refinement of SOA, with REST and OpenAPI taking the place of SOAP and WSDL, and Giard recalls the SOA author Thomas Erl telling him HTTP was simply the best way to implement SOA at the time.
- Independent scaling and releases come at the cost of complexity. Boyd says each service can get resources where its load is and ship a feature change without releasing the whole application. He warns against adopting the approach as a buzzword: it pays only when teams and releases align with business domains, and without good DevOps practice for build, release and monitoring it becomes "a mess and a nightmare". Interfaces that must change need versioning, possibly with two versions running at once and an API gateway routing traffic and transforming payloads.
- Split a service when its releases carry too much risk. Boyd says boundaries start from business domains, and a service such as orders may become several (receiving and processing) once it grows unwieldy and each release adds a heavy testing burden. To Giard's complaint that loosely coupled failures are hard to catch at development time, he answers that each service should be unit-tested in isolation as self-contained software.
- Microservices are an architecture, not a hosting platform. Boyd says people conflate them with containers or serverless, but the same design can run on VMs, raw servers, Azure App Service, Azure Functions, Kubernetes or Service Fabric, which he favours. Those platforms help manage the release lifecycle but do not make something a microservice.
- Boyd has built delivery microservices for quick-service restaurant chains. Without naming customers, he describes cloud services, using IoT Hub among other Azure services, that connect chains' legacy point-of-sale systems in stores to delivery partners such as DoorDash, Uber Eats and Grubhub, each with its own interface.
Technology and FriendsEpisode 564: David Makogon on Streaming Data
- Aggregating near-real-time data from a database is expensive. Makogon says writing thousands of rows to SQL Server, or a NoSQL store such as Cosmos DB, MongoDB or Cassandra, and running aggregation queries every minute or ten costs time and compute, and competes with the same database serving a website or API.
- Streaming aggregates data over a time window before it reaches the database. His example is a car emitting speed and heading once a second: the stream buffers each minute, computes the average, and writes one row per minute, partitioned the way the query needs rather than the way the database stores it. Raw data can also be dumped to blob storage, for example a CSV every minute, or passed to a queue such as Azure Event Hubs or Kafka for downstream consumers.
- Spark's watermark handles late events, at a cost in memory. Makogon calls Spark the most popular tool he sees and describes a customer's water sensors under manhole covers that report every 24 hours but can be delayed when a utility vehicle parks on top; a watermark might accept events up to five minutes late, but buffering 24 hours is impractical. Spark is open source and runs locally, on VMs or in containers, or as a managed service through Databricks or HDInsight in Azure, but it has a learning curve because you code in Scala or Python.
- Azure Stream Analytics trades Spark's flexibility for configuration and a SQL query. He says inputs (IoT Hub, Event Hubs) and outputs (Cosmos DB, SQL Database, CSV in blob storage) are picked from a list, and the only thing written is a near-SQL query with windowing extensions; late-arrival tolerance is a setting, for example 10 minutes. His other streaming projects are aircraft location data arriving every couple of seconds and water meters reporting pH, flow and salinity.
Technology and FriendsEpisode 563: J Tower on .NET Standard
- .NET Standard is a specification, not another .NET implementation. Tower says people conflate it with .NET Core because both shipped at the same time. He sets it beside the implementations: .NET Framework, on Windows for 15 years and currently at version 4.8; .NET Core, cross-platform and rewritten from scratch; and Mono, which Xamarin uses on iOS, Android and Mac. Each of these implements versions of the standard.
- Target .NET Standard only in class libraries shared across platforms. He says it lets one library of utility or business-logic code run in a Xamarin iOS app, a .NET Framework WinForms app and an ASP.NET Core app. Executables and web applications must still target a real runtime such as .NET Core or .NET Framework; in Visual Studio the choice is made when creating the class library and in its project properties.
- The version table on GitHub tells you which Standard to target. Tower points to github.com/dotnet/standard, where platforms run down the side and Standard versions across the top: .NET Standard 1.6, for example, is implemented by .NET Core 1.0, .NET Framework 4.6.1 and Mono 4.6. A library meant for .NET Core 1.0 and .NET Framework 4.5 and above should target .NET Standard 1.0. The page also links an interactive table built by a team member.
- Unlike portable class libraries, .NET Standard is a curated API list. Tower says PCLs offered only the intersection of APIs across the platforms you ticked, which ran to well over 300 permutations; Giard recalls that ticking Xbox made about two-thirds of the features disappear. Under .NET Standard, a team chooses which APIs to add to the specification, and each platform moves up to a Standard version as it implements them.
Crosstalk SolutionsSecure IoT Network Configuration
synopsis
The host builds an isolated IoT network on VLAN 107 using an EdgeRouter 4, a UniFi switch and a UniFi access point. It is firewalled so IoT devices reach the internet and a few chosen services but none of his private networks. He ends by using the firewall logs to show what his smart plugs and Roku do.
Design. His secure LAN (VLAN 1) holds management, computers and phones, and guests have their own network. IoT devices go on 192.168.107.0/24, wired through an untagged switch port and wireless through a hidden SSID.
EdgeRouter. He adds VLAN 107 on eth1 with gateway 192.168.107.1/24. Its DHCP server hands out .2 to .254, with the Pi-hole as primary DNS and the router as secondary, and DNS listens on eth1.107. An optional mDNS repeater lets devices such as a Chromecast be found across networks.
UniFi. He creates a VLAN-only network for 107, an untagged port profile for the port feeding his living-room dumb switch, and a hidden WPA-personal SSID tagged 107. A Nintendo Switch joined only once the SSID was briefly broadcast, and some devices may need multicast and broadcast blocking turned off.
Firewall. A group holds the three RFC 1918 ranges. The "in" rule set defaults to accept, allows established/related traffic, DNS to the Pi-hole and Plex on TCP 32400, then drops traffic to the group. The "local" rule set defaults to drop, allowing only DNS to the router and DHCP. He concedes Plex should move into the IoT network, and plans a rule blocking other DNS servers.
Logs. "show log tail" shows an iClever plug broadcasting on UDP 6666 and using MQTT on TCP 1883 to AWS in Boardman, Oregon, and a Roku streaming over HTTPS from Google.
- IoT devices belong on their own VLAN, cut off from private networks. Smart plugs, TVs, consoles, thermostats and voice assistants are hacker targets, so the host isolates them on VLAN 107 (192.168.107.0/24) using an EdgeRouter 4 on firmware 1.10.8, a UniFi Switch 24 and a UAP-AC-Pro. He says any VLAN-aware gear with a strong firewall, such as pfSense with Ruckus, can do the same.
- The firewall blocks all RFC 1918 ranges except specific holes. An address group holds 192.168.0.0/16, 172.16.0.0/12 and 10.0.0.0/8. The VLAN's "in" rule set defaults to accept, then allows established/related traffic, DNS on port 53 to his Pi-hole, and Plex on TCP 32400, then drops everything else to those ranges. The "local" rule set defaults to drop, allowing only DNS to the router and DHCP on UDP 67.
- Hidden SSIDs and multicast blocking can stop some devices connecting. Wired devices reach the VLAN through an untagged switch port feeding a dumb switch; wireless ones use a hidden WPA-personal SSID. His Nintendo Switch would not join the hidden network until he briefly broadcast it, and some devices may need "block LAN to WLAN multicast and broadcast" unchecked. He skips throttling because streaming devices sit there.
- The host concedes his setup has gaps he intends to close. He says Plex should really move into the IoT network rather than be reached through a firewall hole, and plans an "in" rule blocking port 53 to any other DNS server so devices cannot bypass his. Without a Pi-hole he suggests malware-filtering public DNS such as 1.1.1.1 or 9.9.9.9.
- Isolation makes IoT traffic easy to log and inspect. With logging only on the IoT rules, "show log tail" showed an iClever smart plug broadcasting on UDP 6666 every few seconds and talking MQTT on TCP 1883 to an AWS address in Boardman, Oregon, and a Roku sending HTTPS to Google. He suggests a syslog server for easier review.
Technology and FriendsEpisode 562: Mike Benkovich on Visual Studio 2019
- Live Share is the new feature launch audiences cheer loudest. Benkovich says it links two developers' Visual Studio sessions over SignalR-style signalling: each sees the other's cursor and can navigate, open classes and search references as if they owned the project, with files loaded only when opened ("at least that's as I understand it"). It is built into 2019, an extension for 2017, and works with VS Code; he learned VS Code's debugging by sharing into it from Visual Studio. He has heard of up to 30 participants but does not know whether that is a hard limit, and suggests it for teaching a class.
- GitHub and editor changes reduce trips outside the IDE. He describes a
GitHub tool panel for pull requests and history following the GitHub
acquisition, Azure DevOps pipelines for CI/CD on GitHub-hosted code, a
refactoring that fixes the namespace when a class file moves folders, and a
code cleanup command (sorting usings, explicit types instead of
var) driven by your editorconfig. CodeLens, which shows a method's commits and history, is now in the Community Edition rather than Professional and up, and 2019 installs side by side with 2017 and with the 2019 preview. - IntelliCode ranks IntelliSense suggestions by machine learning. Instead of the usual alphabetical list, the extension trains a model on your code base and stars the members you are most likely to want, so two developers on the same class could see different suggestions at the top.
- .NET Core now ships on its own, faster cycle. Benkovich notes .NET Core 2.2 is live and .NET Core 3 is in preview, adding Windows apps and WPF, with a built-in pattern for configuration and dependency injection. Giard recalls .NET, Windows, Office and SQL Server once shipping together about every three years; Benkovich ties the change to Microsoft's pivot to open source, and Giard credits open-source culture for the faster releases.
- Community volunteers, not Microsoft staff, ran the local launches. Finding no listed launch events for Chicago or Minneapolis, Benkovich organised a Minneapolis launch party on 2 April, the day the keynote was livestreamed, then a Chicago one with David Pine; he says he has done launch events for this tool for 14 years.
Technology and FriendsEpisode 561: Adam Hecktman on Civic Tech
- Microsoft's civic role is matching its resources to the city's priorities. Hecktman, Microsoft's Director of Technology and Civic Innovation in Chicago, says those resources include grant money and technology but also thought leadership and introductions to Microsoft's networks and partners (people networks, he clarifies), and that his constituency is the people of Chicago rather than one customer.
- A tech workforce that looks like Chicago has to start early. His example is MakeCS, led by the Museum of Science and Industry with Chicago Public Schools, the Chicago Public Libraries and the YMCA of Chicago: it trains two or three teachers from an under-resourced school to teach computer science in a makerspace, which they then build at the school for students and for parents refreshing skills such as additive manufacturing.
- Students need a map of learning outside their own school. Chicago City of Learning, a partnership with Northwestern University's Digital Youth Network and Chicago Public Schools, shows where a student can learn locally (libraries, Boys and Girls Clubs, YMCAs) and awards digital badges collected in a virtual backpack, which he describes as gamification.
- Adults retraining need pathways shorter and cheaper than college. Hecktman says a large part of the city cannot afford four years without income at 30-plus with a family, so he backs city colleges and boot camps such as i.c.stars, and is working with the Chicago Cook Workforce Partnership on a program to be called Chicago Codes.
- Civic technologists turn open data into accountability tools. He defines them as people with technical skills who devote them to the public good, often beside a full-time job; Chicago publishes about 700 data sets, used for things like beach water quality and aldermen's votes. Microsoft sponsors Chi Hack Night, held every Tuesday in Braintree's offices at the Merchandise Mart with half the night a talk and half hacking, and the Chicago City Data Users Group; he is studying for a master's in data science to take part more directly.
Technology and FriendsEpisode 560: Frank Gill on Azure SQL Database Managed Instances
- Managed Instance fills the gap between Azure VMs and SQL Database. Gill says SQL Server on an Azure VM leaves you patching the OS and SQL and managing storage, while Azure SQL Database was too limited to migrate existing estates: one database only, so no cross-database queries or linked servers, and no SQL Server Agent for jobs or SSIS packages. Managed Instance has, in his words, 99.9% of SQL Server's features, with a few T-SQL differences and gaps being worked on, while backups and Windows and SQL patching are managed, allowing a lift-and-shift migration.
- An old version's end of life is Microsoft's migration lever. With SQL Server 2008 reaching end of life on 9 July "of this year", workloads moved to Azure get three years of extended security support free (also true on SQL Database or a VM, he notes). He was told at last year's Summit to think in compatibility levels rather than versions, because Azure runs the newest code first; an old level (he thinks 105 is 2008 R2) lets you migrate now and raise it as the application is updated.
- The premium tier builds in high availability and a readable secondary. Gill likens the General Purpose tier to Standard Edition and Business Critical to Enterprise; behind Business Critical is a four-node cluster with "availability group like" log shipping and one readable secondary for offloading reporting, all within one region, with a second instance in another region available at extra cost.
- Use Managed Instance for existing multi-database estates, not new apps. He keeps Azure SQL Database for multi-tenant apps (one database per tenant from an ARM template) and new cloud applications. One client runs 16 cores and, he believes, 768 GB of memory at about 5% for most of the year until a year-end process maxes it out, and is considering splitting by client into several managed instances and scaling up only at peak.
- Reused licences and long commitments slash Managed Instance's steep price. Gill calls the higher tiers extremely expensive but says you pay for managed infrastructure; reusing on-prem core licences lowers the hourly rate, and combined with a three-year commitment (one year is also offered) cuts the cost by 80%. His example is the largest size, 64 cores and he thinks 384 GB, at about $40,000 a month by the hour against $8,000 on the three-year hybrid deal; the VNet and subnet setup required in preview is now done by the portal wizard.
Technology and FriendsEpisode 559: Lwin Maung on IoT Hardware Options
- The cheapest IoT devices trade security for a dollar price. Maung's smallest example is an ESP8266-type board with Wi-Fi and a microcontroller, about $1 in bulk with about 4 MB for code, which can authenticate to Azure IoT Hub over MQTT but has only basic built-in security; it is mostly used for switches and lights. A larger board on the same chip takes the inputs and outputs from four or so to 32. IoT Hub, he explains, is the single endpoint that can take millions of devices' data into Microsoft's cloud.
- Azure Sphere moves decisions onto the device when connectivity drops. He prices the Sphere board at about $80 now and about $10 a chip for manufacturers such as Samsung or LG; it runs a Linux kernel that Microsoft builds and updates through Azure, authenticates via Azure AD, and can run small containers for edge processing. Edge computing matters, he argues, because farms, streets and moving vehicles lack constant connection, so the device pre-processes and sends only curated data up.
- Raspberry Pi is for prototyping, never a long-term deployment. At about $35 it is "wonderful" for trying things, but its microSD cards die over time and can be pulled and faked, and it has no TPM security module; a variant with a solid-state hat is more durable. It runs Windows 10 IoT Core, which Maung describes as a stripped-down Windows that is "virtually impenetrable if you do it right".
- Production boards in the Pi's footprint run ordinary Windows code. He cites a Snapdragon 410C board (ARM, as in phones, with Wi-Fi, Bluetooth and solid-state storage, about $80, suited to outdoor billboards) and an Intel Atom quad-core board that runs warm but handles more edge computing; on Windows 10 IoT Core they run x86 executables, UWP, C# and .NET Core apps. Price tracks processor size only "coincidence-ish", he says: an Arduino is $5–10 and its chip about $1.
- His most notable build monitors molten steel quality in real time. Maung describes a gateway sending data at 60 Hz from 20 or 30 devices at a steel mill in Europe, measuring steel quality as it is made, since grade decides whether it becomes high-value industrial steel or cheap rebar. For beginners he points to Microsoft's IoT developer guides, some of which he says he helped write.
GCastGCast 49: Angular pt 8: HTTP
- An in-memory web API stands in for a real REST back end. In the tutorial's last lesson,
HttpClientModuleis imported inapp.module.ts, the in-memory web API is installed with npm, and a CLI-generated in-memory data service holds the hero array; its id generator takes the maximum existing id plus one, or 11 if the list is empty. Giard notes a real app would put a database behind it. - The hero service now fetches through HTTP with piped error handling.
HeroServiceinjectsHttpClientand callshttp.get<Hero[]>onapi/heroes, orapi/heroes/plus an id for one hero, with the web API doing the filtering. RxJStapandcatchErrorare piped in for logging and a generichandleErrorthat logs to the console and the on-screen messages; Giard likens this to aspect-oriented programming. - Fetching per view loses edits, so changes are saved with PUT. Once every view re-queries the web API, a name edited in the detail view no longer shows elsewhere. A save button calls
updateHero, anhttp.puttoapi/heroeswith a content-typeapplication/jsonheader, after which changes persist — until the app recycles, which any saved code change triggers, resetting the in-memory store. - Adding a hero POSTs it and pushes it onto the local list. A name box and add button call
add, which trims the name, stops if empty, and callsaddHero(anhttp.post). Giard says pushing the result onto the local array saves a round trip, at the cost of not seeing other users' changes until a full refresh. - Deleting removes the hero locally and on the server. An "X" button on each list item filters the hero out of the local array and calls
deleteHero, which accepts a hero or just its id and sendshttp.deletetoapi/heroes/plus the id. Giard defers the lesson's remaining search feature to a next video because this one ran long.
Crosstalk SolutionsBudget 10Gbps Networking
- Two servers can share 10 Gbps networking for under $250. The host's build totalled $322.80 shipped using fiber, but with two 1-meter DAC cables instead it comes to $242.24 (switch $141.28, two NICs $68.98, cables $31.98), or about $250 with 3-meter DACs; servers not included. In his iperf3 tests between two Ubuntu 16.04 servers he measured 9.4 Gbps one way and 9.41 Gbps the other.
- The MikroTik CRS305-1G-4S+IN is a cheap, capable switch but backordered. It is a five-port desktop switch with one Gigabit Ethernet port and four 10 Gbps SFP+ ports, plus redundant DC power inputs taking 12–57 V from two separate circuits. As of recording on April 10, Baltic Networks listed it for pre-order at $124.25 for the third week of May; the host waited about eight weeks for his, ordered in late 2018.
- Used Chelsio T320 dual-port cards work, but check the bracket. On Tom Lawrence of Lawrence Systems' recommendation he bought them on eBay at $29.99 each; listed as full-height, they arrived with low-profile brackets, so he removed the bracket and seated them loose. For production servers he would buy a current-generation card (about $166 on Amazon) for longer support.
- DAC cables are much cheaper than SFP+ modules plus fiber. A fiber link needs two SFP+ modules ($20.99 each) and an LC-to-LC multimode cable (about $14), around $56; a 3-meter DAC is $18.99, a 1-meter about $15.99, and 7-meter about $42. His 10Gtek SFP+ modules coded for Ubiquiti worked fine in the MikroTik.
- A factory-reset MikroTik has no gateway or DNS configured. It defaults to 192.168.88.1, user admin, no password, so you must put your own computer on 192.168.88.0/24 to reach it, then use Winbox's Quick Set (bridge mode, static) to set your LAN address, gateway, DNS, identity and an admin password. Ubuntu 16.04 had the Chelsio drivers built in; the card's second port appeared as "rename3".
GCastGCast 48: Angular pt 7: Routing
- Angular routing picks a view from the URL, on the client. Giard compares it to routing in ASP.NET MVC or Ruby on Rails, with the difference that those frameworks route on the server. The episode, which continues his walk through the angular.io tutorial, splits the single page into three routed views: a dashboard of top heroes, the full hero list, and a hero detail.
- A CLI-generated routing module holds the routes and initializes the router. The CLI command generates an app routing module and adds its import to
app.module.ts. Giard drops the component declarations from the module, exports it, and adds a route made of a path (heroes) and the component to load there. He then initializes the router in the module's imports with those routes. A<router-outlet>tag in the app component replaces the hard-coded heroes tag and marks where views load, so/heroesnow shows the heroes component. - A dashboard component becomes the default route. It is generated with
ng generate component dashboardand uses the hero service'sgetHeroes, withheroes.slice(1,5), which Giard says returns the first five heroes. An empty path redirects todashboardwith a full path match, so the barelocalhostaddress opens the dashboard. Router links to both the dashboard and the heroes list go on the main page. - The detail route takes the hero ID as a parameter. The path is
detail/:id, where the colon marksidas a value rather than a literal word. Both the dashboard and the heroes list now use anchor tags with a router link to the detail path plus the hero's ID, which replaces the earlier click-boundonSelectwith what Giard calls something more declarative. The detail component injects ActivatedRoute, the hero service and Location, reads the ID from the route, and subscribes to a newgetHero(id)service method, which logs a "fetched hero id" message and finds the hero in the still hard-coded list. Edits made in the detail view carry across views because of two-way data binding. - A back button returns to whichever view the user came from. A
goBackmethod in the detail component uses the browser's location, which Giard likens to hitting the browser's back button. In the demo it returns to the dashboard or the hero list, depending on where the detail was opened from.
GCastGCast 47: Angular pt 6: Services
- Moving data access into a service prepares it for swapping.
ng generate service herocreates aHeroServicewhosegetHeroesstill returns the hard-coded mock array; Giard says a real one would call a web service backed by a database. Its@Injectabledecorator supports dependency injection, which he says makes it easy to swap the mock for a web call and to supply different dependencies under test. - The component receives the service through its constructor. The heroes component declares
heroeswithout initializing it, injectsheroServicein the constructor, and calls its owngetHeroesfromngOnInit, which in turn calls the service; the app looks unchanged. - Returning an observable makes the call asynchronous. Giard argues web calls should be asynchronous because of latency, so
getHeroesreturns an RxJSObservable<Hero[]>and the component subscribes, settingthis.heroeswhen data arrives; a delayed response then would not lock the UI. - A message service gives the user visible feedback. A new messages component (added to the app component) and a
MessageServiceholding an array of strings with add and clear methods are generated; injecting it intoHeroService— one service using another — logs "fetched heroes". The messages template loops the array with*ngFor, offers a clear button, and sits inside*ngIfon the array's length, since zero is falsy.
GCastGCast 46: Angular pt 5: Master Detail Components
- The selected-hero markup moves into its own detail component. Giard generates it with
ng generate component hero-detail, which creates the folder with CSS, HTML and TS files. The selected-hero section of the heroes component's HTML template moves into the new component's template, for what he calls better separation of concerns. The heroes template now holds an<app-hero-detail>tag matching the new component's selector, with itsheroset to the selected hero. - An
@Inputdecorator lets a parent pass data into a component. The detail component importsInputand the hero class, then declares aheroproperty decorated with@Input, which marks it as settable from an outside component. Giard describes it as essentially a parameter. After the refactor the app behaves as before: highlighting, selection and data binding still work, which is the expected result.
GCastGCast 45: Angular pt 4: Displaying a List
- A repeat directive renders a list whose length is unknown. A hard-coded, exported array of 10 heroes in
mock-heroes.tsis imported into the heroes component as aheroesproperty;*ngFor="let hero of heroes"on anlioutputs one item per element. Giard explains the star as repeating the element itself, not just its contents, and frames it as needed because data from a database could hold ten or a hundred items. - Parentheses around an event name bind it to a component method.
(click)="onSelect(hero)"calls a newonSelectthat sets aselectedHeroproperty, replacing the hard-coded hero in the detail section; the bindings must be renamed toselectedHero.nameandselectedHero.id. - An uninitialized selection breaks the page until hidden with a conditional. The browser console (F12) showed "unable to get property name of undefined or null" because
selectedHerostarts empty. Giard notes one fix is to preselect a hero; the tutorial's is wrapping the section in*ngIf, which keeps a falsy value (false, zero, null or undefined) out of the DOM entirely rather than just hiding it. - A conditional class binding highlights the selected item.
[class.selected]="hero === selectedHero"applies the stylesheet'sselectedclass to whichever item was clicked; the styles, pasted into the empty generatedheroes.component.css, also give a hover effect.
GCastGCast 44: Angular pt 3: The Hero Editor
- The CLI generates a component as four files.
ng generate component heroescreates.html,.spec.ts,.tsand.cssfiles in aheroessubfolder ofsrc/app; the class is exported so other components can use it, and its@Componentdecorator maps theapp-heroesselector to the template and stylesheets. It also implementsOnInit, which Giard says will matter later for dependency injection. - Placing a component's tag nests it inside another. Adding
<app-heroes>toapp.component.htmlrenders the heroes template under the title, showing a hard-coded hero name through one-way{{hero}}binding. - Binding a whole object prints "[object Object]", not its fields. Once
herobecomes an instance of a newHeroclass (anidnumber and anamestring, inhero.ts, imported into the component), the template must bindhero.idandhero.name. A pipe such as| uppercasetransforms a bound value while keeping it bound. - Two-way binding silently does nothing until the forms module is imported.
[(ngModel)]="hero.name"— the syntax "people call a banana in a box" — on a text box updates the property and everything bound to it as the user types. On first save the page showed no output untilFormsModulefrom@angular/formswas imported and added to the imports inapp.module.ts, which Giard calls a kind of global settings file.
GCastGCast 43: Angular pt 2: The Application Shell
- The tutorial app starts as a fresh CLI project. Giard begins the angular.io Tour of Heroes tutorial with
ng new angular-tour-of-heroes, accepting defaults, opens the folder in Visual Studio Code withcode ., and serves it withng serve --openon port 4200. - The shell is the generated app stripped to a title. He sets the component's
titleto "Tour of Heroes", replaces the template's boilerplate links, image and "Welcome to" text with just the bound title in an h1, and adds styles; he also removesrouter-outlet, saying it returns in a later video. - Each lesson ends with the final code to compare against. Giard points to the tutorial's code listing for the changed files as the fallback when an app does not look right, and notes it mislabels the stylesheet as
styles.csswhere, he says, the file isapp.component.css.
Technology and FriendsEpisode 558: Melanie Adcock on TechMonthChicago
- Tech Month Chicago publicises existing events rather than curating new ones. Adcock modelled it on Chicago Artists Month, which ran for 20 years: one October calendar of events already happening, promoted to the general public. She counts 465 tech meetups in the Chicago area on meetup.com, over 100 co-working and innovation spaces, and over 100 STEM events a month in the Chicago Public Library system; the event is in its fourth year.
- Free donated venues let anyone host an event. She says about 14 or 15 venues a year offer their space at no charge for Tech Month events, so someone who cannot afford a room can still give a talk or throw a party; her role is connecting and promoting, not speaking or providing space.
- Community organisers get no coverage, so she broadcasts them herself. For three years she has volunteered a radio show on Lumpen Radio (105.5 FM WLPN, a non-commercial 501(c)(3) station, Fridays at 1 p.m., which she says she does twice a month), interviewing about 100 organisers of STEM, women in tech and other community events rather than CEOs. Outlets, she says, list the "top five" of some 400 monthly events; her examples are Carol Davids's Next Generation 911 conference at IIT and Marge Johnson's class at NEIU teaching senior citizens to write business plans, which Adcock is auditing.
- Her interview archive will become a printed newspaper this October. She plans to transcribe the archives, cut them down with an AI tool and repeated editing, and print them as Tech Voice Chicago with the Lumpen Times, a print publication of about 25 years. Her case is that Chicago, the third-largest city, is on "nobody's radar" as a tech community while coverage chases corruption and money.
- Self-funding has cost her money, so sponsorship starts this year. The radio work is volunteer and Tech Month is an LLC she hopes to turn at least partly into a non-profit foundation; she says she has lost money paying for it herself, and this year adds a sponsorship program with print, digital and experiential tracks and a revamped calendar website. Her day job is Tech Copy Authority, writing white papers and web copy for tech companies.
Technology and FriendsEpisode 557: Brent Stineman on the Evolution of Serverless
- Serverless means handing over code and letting the platform wire triggers. Stineman defines it as a managed sandbox: you publish code and the platform team creates the sandbox and fires it on triggers such as an HTTP request, a file landing in storage, a message on a queue or a schedule. Pricing runs from a dedicated 24x7 environment to paying per execution for the time it runs; Azure Functions is one such technology.
- Each step up the stack trades control for less responsibility. He traces the path from physical servers to virtual machines (you still own the OS and installation), to platform as a service (no OS access but control over your application files), to serverless, where the sandbox allows almost nothing but you no longer wire up the triggers; snippets can run from one to a thousand lines.
- Serverless is one more orchestrator, not an architecture. Stineman says people confuse orchestrators with architectural patterns: the old web server, Kubernetes for containers and Azure Service Fabric for processes all connect requests to code, and PaaS and serverless are further orchestrators offering different controls for building microservices.
- If you care about the OS image, it is not serverless. Asked whether Kubernetes-managed containers count, he calls it an "almost religious war" and gives his own line: serverless means you have stopped caring about the underlying operating system. An application that needs things installed on the server is therefore probably a poor fit.
- Start small instead of mandating serverless from hype. He warns against adopting it "because I read it in a magazine airplane" and suggests a first use such as hosting 20–30 lines of Python called from a data pipeline; Giard adds that it could then serve several pipelines and notes Azure Functions supports Python. Stineman says the platforms let this grow into a REST API composed of dozens of functions behind one interface.
GCastGCast 42: Angular pt 1: Getting Started
- Angular needs Node.js, an editor and the Angular CLI. The angular.io quick start asks for Node.js version 8.x or 10.x. Giard notes that 10.15.3 is current at nodejs.org as of April 2019, and that npm comes with Node rather than as a separate install. He prefers Visual Studio Code, which is free for Windows, Mac and Linux. The CLI is installed globally with
npm install -g @angular/cli. This is the first episode of a series that walks through the angular.io tutorial. ng newscaffolds a working app with default options. Giard runsng new my-app, the name the tutorial uses, and presses Enter to accept every default. The command pulls down the required Angular components and some optional ones, and creates amy-appfolder withsrc/appinside.- An Angular tag in index.html is resolved by a TypeScript component. The
<app-root>tag inindex.htmlmatches the selector inapp.component.ts, and that component loadsapp.component.htmlas its template. Giard explains that TypeScript is strongly typed and transpiles to JavaScript, which the browser needs, but that it is easier to work with because of the typing. - Double curly braces give one-way data binding. The template's
{{title}}displays the component'stitleproperty, which is set to "my app".ng serve --openbuilds the app, listens on localhost 4200 and opens a browser. When Giard changes the title to "My first Angular app" and saves, the page reloads by itself with the new heading. - Component styles come from an array of style sheets. The component's
styleUrlsis an array that holds one file,app.component.css. The CLI creates that file empty. Giard pastes in a rule that changes the H1 font, and the heading picks it up. He says the next video starts building the tutorial's app for maintaining a list of superheroes.
Technology and FriendsEpisode 557: Brent Stineman on the Evolution of Serverless
- Serverless means handing over code; the platform owns the plumbing. Stineman defines it as a managed sandbox that runs a chunk of code when a trigger fires (an HTTP request, a file landing in storage, a message on a queue, or a schedule), with the Azure team responsible for the sandbox and the trigger wiring. Because the platform manages the sandbox, he says pricing can range from a dedicated environment up 24x7 to paying per execution for the time the code runs, chosen up front.
- Each step down the stack trades control for less responsibility. He traces the path from physical servers to virtual machines (you keep the OS and the wiring), to platform as a service (no OS access, but control over your application's files), to serverless, where the sandbox allows almost nothing but you no longer wire up triggers; snippets can run from one to a thousand lines of code.
- Serverless and Kubernetes are just different kinds of orchestrator. Stineman compares the old web server such as IIS, which connected requests to applications, with Kubernetes for containers and Azure Service Fabric for processes; he argues all of these, PaaS and serverless included, are orchestrators enabling microservice architectures, and that people confuse orchestrators with architectural patterns.
- Code tied to its operating system is a poor serverless fit. Asked whether containers under Kubernetes count, he calls the question an "almost religious war" and gives his personal view: what makes serverless distinct is giving up caring about the underlying OS, so an application that needs things installed on the server is probably not right for it.
- Start serverless with small pieces, not a mandate. Stineman warns against going serverless "because I read it in a magazine" and suggests beginning with something like 20–30 lines of Python that is too much to manage inside a data pipeline but needs to run somewhere, or is called from several pipelines; the host suggests Azure Functions, which supports Python. He adds that platforms let you grow into, for example, a REST API composed of dozens of functions behind one interface.
GCastGCast 41: Using the PowerPoint Selection Pane
- The selection pane lists every object on a slide. It sits on the Home ribbon under Select, and selecting an object on the slide highlights its entry in the pane. Giard says it took him years of using PowerPoint to find it because it is "really hidden".
- The eye icon hides an object without removing it. Clicking the eye next to an entry makes that object disappear from view while it stays on the slide; clicking again brings it back. Giard's use is overlapping objects: hide the ones in front, edit the one behind, then unhide them.
- Renaming objects replaces PowerPoint's unhelpful default names. Two triangles he draws come out as "Isosceles Triangle 9" and "Isosceles Triangle 4"; double-clicking the entry or pressing F2 lets him give each a name that means something to him while designing.
- Names plus hiding make crowded animated slides editable. His example is a slide with dozens of objects and animations showing messages flowing from devices into an IoT hub. A naming convention (message 1A comes from device 1, then 1B, and so on) tells him which object is which, so he hides 5A and 5B to work on 5C's animation path alone, reroutes it to the top of the IoT hub, then unhides the rest.
GCastGCast 40: IoT Hubs
- Azure IoT Hub is the two-way gateway between devices and the cloud. Giard describes it as built to collect messages from sensor devices (temperature, location, soil moisture and the like) and to send messages back to them; it is scalable because the traffic is typically many small messages. Once data is in the hub it can be routed onward to databases, code, queues, analytics or a Power BI portal.
- Only registered devices can talk to the hub; others are rejected. Adding a device, which Giard thinks of as registering it, tells the hub in advance which devices to expect, and a rogue device sending a message is refused. Each device also gets a secure key, and the device authenticates with its name and that key.
- A hub is created in the portal like most Azure resources. From portal.azure.com, "Create a resource", under Internet of Things, he picks a subscription, a new resource group, a region and a unique hub name. The optional Size and Scale tab offers a free tier and a standard tier; he takes one instance of standard, which he gives as $25 a month, and notes the hub can be scaled up or out to multiple instances. Deployment took about three minutes in the 2019 recording.
- Devices are added under IoT devices, with keys supplied or generated. The IoT devices blade sits under Explorers; Add asks for a device ID (he uses sequential numbers) and an authentication type, since the hub supports only secure authentication. With a symmetric key you can clear a checkbox and supply your own keys, or let the hub generate them and then send them down to the device; he leaves the other defaults. With many devices, the list can be filtered by a clause such as a device ID match.
Crosstalk SolutionsRaspberry Pi Surveillance Monitor v2
synopsis
The host rebuilds his Raspberry Pi desk monitor so that it shows four cameras from RTSP streams, on two cables, and comes back to the same view by itself after a reboot; the video ends with all four feeds returning untouched after a restart, and with a verdict of a solid, inexpensive monitoring station let down only by the display's acrylic case.
Criteria and hardware. Version 1 showed one camera through UniFi Video in full-screen mode and kept timing out. Version 2 uses RTSP, so it works with UniFi Video, UniFi Protect or any RTSP system. A PoE HAT powers the Pi from the network cable, and the 8-inch 1280x800 IPS display ($75 on Amazon) carries the Pi on its back, though any HDMI screen will do. The monitor flickered on its micro USB cable, so he powers it from a brick. The vendor supplied the units, and one of the two was dead on arrival.
Preparing the Pi. He writes Raspbian Stretch Lite, which has no desktop, to an 8 GB class 10 card and adds an empty ssh file so he can log in without a keyboard. In raspi-config he changes the password and sets wait-for-network at boot, because the display service is useless before the streams can be reached. He also expands the filesystem and raises the GPU split from 64 MB to the 256 MB maximum.
Configuring displaycameras. He installs displaycameras 0.8.3.3, following a Self Hosted Home blog post. Its layout file needs pixel coordinates, and there is no 1280x800 example, so he works out quadrants such as 0,0–639,399. He enables Protect's medium 1024x576 RTSP streams, checks them in VLC and pastes them in. A rotate delay, five seconds by default, swaps between pages of cameras where there are more than four.
- Version 2 uses RTSP streams instead of a full-screen camera app. Version 1 showed a single camera through UniFi Video in full-screen mode and kept timing out; this build shows four cameras, works with UniFi Video, UniFi Protect or any RTSP-capable system, and boots straight to the camera view so nobody has to remember passwords or config months later.
- Two cables suffice when a PoE HAT powers the Pi. One cable powers the monitor and one Ethernet cable feeds the Raspberry Pi; a Pi 3 Model B+ on Wi-Fi would also need just two power cables. Whether the monitor's second micro USB port can pass power through to the Pi is speculation the host had not yet tested.
- The display's picture is good but its build quality is not. The $75 8-inch 1280x800 IPS screen from Amazon is cased in cut acrylic sheet, whose protective film must be peeled off while the screws are out; its micro USB cable made the 5 V 2 A monitor flicker, so the host used a power brick. The vendor offered him the monitors; of the two he asked for, one was dead on arrival, so there is no giveaway.
- Make the Pi wait for the network and maximise GPU memory. The setup is Raspbian Stretch Lite (the 13 November 2018 image) on an 8 GB class 10 card, with an empty
sshfile to enable SSH. In raspi-config, "wait for network at boot" stops the display service starting before the RTSP feeds can be reached, and the GPU split goes from the 64 MB default to the 256 MB maximum. - The displaycameras layout file needs pixel coordinates worked out per screen. Version 0.8.3.3, following a Self Hosted Home blog post, ships no 1280x800 example, so the quadrants run 0,0–639,399, 640,0–1279,399 and so on. The host used Protect's medium 1024x576 stream (high is 1920x1080), noted port 7447 for remote access, and tested URLs in VLC first.
Technology and FriendsEpisode 556: Bret Stateham on IoT Edge
- IoT is an old concept rebranded around cloud platforms. Stateham, a software development engineer in Microsoft's commercial software engineering division, says embedded devices and distributed messaging have existed for decades; what is new is cloud services and an ecosystem of devices, protocols and frameworks that replace "roll your own" with using a platform's services, which he says simplifies and accelerates development.
- IoT Edge is a gateway for devices that cannot reach IoT Hub. He says Azure IoT Hub, the core ingestion, device registry and two-way messaging service, requires TLS/SSL, which low-powered microcontrollers often lack the processing power for; other devices only speak Bluetooth, Zigbee or serial protocols such as CAN bus, Modbus, RS-485 or RS-232, are too remote, or lose connection temporarily, as in a tunnel. An Edge device is a Windows or Linux machine, as small as a Raspberry Pi, running Docker and the Edge runtime, that talks to devices in their own protocols and aggregates, filters or forwards their messages to IoT Hub.
- Processing on the Edge cuts round-trip latency and cloud traffic. Stateham says analytics that would otherwise run in Azure Functions, Stream Analytics or machine learning can run on the Edge device, which matters where a slow response could damage the device or a person; it can also summarize or filter what goes to the cloud. Light, low-latency work stays local and heavier work goes to the cloud, and the hardware need only be as powerful as that processing requires.
- The Edge runtime caches messages when connectivity breaks. Even for devices that could connect directly, he says routing through Edge means the runtime holds messages during an outage without any code being written, whereas a directly connected device leaves the developer to decide whether, how much and when to cache and resend.
- Edge modules are any Docker container, deployed centrally from the cloud. He describes a security daemon (Linux) or service (Windows) plus two system containers, the Edge agent for orchestration and the Edge hub as a local IoT Hub, downloaded on first run so they are current. Your own modules can be in any language, using SDKs for C#, Node.js, Java, Python or C to join Edge messaging, published to a registry such as Azure Container Registry or Docker Hub; a cloud "deployment" then configures every matching Edge device, though the OS, Docker (or Moby) and the device's IoT Hub identity must still be put on it initially.
Crosstalk SolutionsUniFi Protect
synopsis
The host likes UniFi Protect, especially its playback, but concludes that it is not a UniFi Video replacement: it suits homes and small offices with five or six cameras that are not mission-critical, while Ubiquiti's own wording suggests UniFi Video 3 will be the last version.
Hardware and limits. Protect runs only on the $199 Cloud Key Gen2 Plus and only with Ubiquiti cameras. Ubiquiti recommends at most 20 cameras, or 15 alongside the SDN controller. The host has tested four, and he doubts larger systems belong on a single drive with no redundancy.
The interface. Cameras record all the time at 15 fps and a 3,000 kbps variable bitrate, with no motion-only mode. Motion and privacy zones, live views, events and a time-lapse scrubber all work smoothly, including on the mobile app over LTE. He lists missing features: view-only roles, multi-select downloads, view cycling and alert scheduling.
Storage. Three cameras used about 650 GB in 15 days, roughly 600 MB per camera per hour. That matches Ubiquiti's claim of 1,600 hours per terabyte, or about 20 days for three cameras on the stock drive.
Protect versus UniFi Video. On his reading of the FAQ, UniFi Video gets maintenance but no development. Crosstalk stopped selling UniFi Video servers in early 2019. He speculates that the rename and the locked-down hardware point to a wider security platform.
- Keep Protect to about six non-mission-critical cameras. Protect runs only on the $199 Cloud Key Gen2 Plus and only with Ubiquiti cameras. Ubiquiti recommends at most 20 cameras, or 15 alongside the UniFi SDN controller. The host would stop at about half a dozen because the single drive (1 TB, upgradable to 5 TB) has no redundancy; he has tested only four.
- Protect records continuously, with no motion-only option. UniFi Video usually defaulted to motion-only recording to save disk. Protect's cameras default to 15 fps and a variable 3,000 kbps maximum bitrate, which drops when the scene is static. Privacy zones, which black out part of the frame, are new compared with UniFi Video; the host found RTSP output hit-and-miss.
- The host found Ubiquiti's 1,600-hour storage claim accurate. Three cameras at default settings used about 650 GB over 15 days, which works out to roughly 14.4 GB per camera per day, or about 600 MB an hour; 1,600 hours at that rate is about 960 GB. By his rough estimate, the stock 1 TB drive holds about 20 days for three cameras and 10–11 days for six.
- Playback and the mobile app are strong, but admin features are thin. Scrubbing through footage is fast, even over LTE on the app, which connects through Ubiquiti's cloud without open firewall ports. What is missing as of recording: view-only roles (every user is an administrator), multi-select event download, view cycling and alert scheduling. His outdoor camera sent alerts every five minutes in rain.
- The host reads Ubiquiti's FAQ as making UniFi Video 3 final. Ubiquiti promises security updates, bug fixes and new G3 camera support, which he takes to mean no new features and no version 4. Crosstalk stopped selling UniFi Video servers at the start of 2019, over thin margins and that uncertainty. He speculates Protect will reach the UniFi Application Server XG and gain doorbells and sensors.
GCastGCast 39: Azure Search REST API
- Azure Search is queried through a REST API.
Giard says the .NET SDK is just a wrapper for that API, and so is the
portal's Search Explorer, which sends a GET to
https://<service name>.search.windows.net, then the index name and/docs, with the API version andsearch=plus a term in the query string. He calls this GET route not very flexible. His demo index holds 497 documents, one per row of an Azure table listing his past presentations (built in the previous episode). - Give users the query key, not the admin keys. Giard says the primary and secondary admin keys are for using the REST API to make changes, such as creating a service or importing data, which he did through the portal instead. Query keys are what you hand to users: less powerful, so less of a security risk.
- A POST request is more flexible but needs a tool or code.
The portal cannot send it, so Giard uses Postman (free, from
getpostman.com); Fiddler or your own code also work. The URL is
/indexes/<index name>/docs/searchplus the api-version query string, with two headers:api-keyset to the query key, and a Content-Type of application/json. - The JSON body selects, filters and sorts the results.
In his demo, select
*returns every field; a filter on state equal to 'IL' (single-quoted because it is a string) returns only Illinois rows; and ordering by presentation date descending sorts them newest first. Giard says almost any language or platform can make the same HTTP request.
GCastGCast 38: Azure Search
- Azure Search indexes your own private content as a search engine. Giard compares it to how Google and Bing index the public internet: it exposes searchable content from behind your firewall. For the demo he first uses Azure Storage Explorer to import a CSV of about 500 of his past presentations into an Azure Table Storage table.
- The free pricing tier is for learning, not production. The service is created from the portal's green plus button by searching for "Azure search", then setting a name, resource group (he keeps it in the same group as the storage, though that is not required), location (West US) and pricing tier. Giard says the free tier cannot be scaled, while paid tiers scale further the more you pay, and you get only one free Azure Search per Azure account. He would not use the free tier in production.
- Importing data can create the index for you. Rather than using Add index and entering fields by hand, Giard uses Import data. The sources offered are Azure SQL, SQL Server on a VM, Cosmos DB, blob storage and table storage. The wizard infers the fields from the table's columns, and each field can be marked retrievable (returned in results), filterable or sortable, one at a time or all at once from the top checkbox.
- The index stays empty until its indexer runs. The indexer does the actual indexing. It can be scheduled hourly, daily or on a custom schedule ("every 17 minutes starting on a certain time"); Giard runs it once instead, so he doesn't have to wait for the first scheduled run. The index shows zero documents while the indexer runs, then 497, one per row of data.
GCastGCast 37: Managing Blobs with the Azure Storage Explorer
- Storage Explorer opens straight into the account from the portal. The free, lightweight Microsoft tool runs on Windows, Mac and Linux, and the storage account's overview tab carries a download link. With it installed, the open button launches the app if needed and goes directly to that storage account.
- Blob "folders" are really just part of the blob name. Giard creates and renames containers with a right-click, then uploads a folder of pictures into a folder inside one container. He says containers hold no real folders: the slashes in the name only make it look like one, though it is still a useful way to organize. The upload asks for block or page blob; single files can be uploaded too, and the uploads show up in the portal as well.
- Deleting can be hard or soft, and soft can be undone. Blobs open in the application associated with their file type, and can be renamed and multi-selected with Control or Shift, as in Windows Explorer. With soft delete turned on, as in his setup, a deleted blob can be undeleted within the next seven days. Selected blobs can also be downloaded to a local folder.
- A blob URL returns 404 until you allow public access. Giard copies a blob's URL to use, for example, as an image source on a web page. It fails for security reasons until the container's public access level is set to public read for containers and blobs, or for blobs only; either allows anonymous access. He suggests this for images, videos and other assets served to a public web application.
GCastGCast 36: Managing Tables with the Azure Storage Explorer
- Storage Explorer handles table data the portal makes awkward. Giard says some of what the portal does is powerful, but manipulating data in a table from the browser is hard. Storage Explorer is a free Microsoft client for Windows, Mac and Linux, launched from "Open in Explorer" on the storage account's overview page. A new account shows only the tables Azure creates internally to manage itself.
- Table rows need keys, not a shared schema. After creating a table, Giard adds a row by hand with a partition key, a row key and extra typed properties (a string and a double). Not every row has to have the same schema, but every row must have a partition key and a unique row key.
- CSV import reads the headers and guesses each column's type. It previews the first row and lets you change things before Insert. His file of 497 past presentations plus the one hand-added row gave 498 cached items. Rows can then be edited in place.
- Column Options reorders the display, but not by drag-and-drop. Columns can be removed or moved up and down; Giard says drag-and-drop would be nice. The table can also be exported back to a comma-separated file, and statistics generated for it.
- Select all and delete empties a table. Rows can be multi-selected with Control or Shift, and Select All covers either the current page or every item in the table. An activity log records each operation and can be cleared.
Technology and FriendsEpisode 555: Kevin Griffin on What's New in SignalR
- SignalR lagged behind .NET Core, and the stopgap only mostly worked. Griffin, who runs the consultancy SwiftKick, says the library was not ported when .NET Core arrived, so the team wrapped the old SignalR for ASP.NET Core; he deployed that in a client application and found it worked "well enough" but not as well as a native version. He says the full ASP.NET Core release came out "back in September last year" (the episode is recorded in January).
- Azure SignalR Service removes the sticky-session constraint of self-hosting. Griffin says self-hosted SignalR on Azure with WebSockets is supposed to use sticky sessions, so a client behind a load balancer across, say, three nodes always hits one node, which defeats load balancing if that node lags or fails. With the hosted service all WebSocket traffic goes through Azure and is redirected to the application; Giard adds that this also hands a hard load-balancing problem to other engineers.
- Streaming sends results in chunks and lets abandoned calls stop server-side. In Griffin's example of a call returning 100,000 rows, a traditional hub sends everything at once and keeps sending after the client disconnects, then throws; streaming lets the server start returning data before it is all loaded and cancel when the client does. He says SignalR also adapts the batch size to the connection, from one item at a time on a slow link to 10–20 on a fast one.
- SignalR's value is the server pushing state changes to every open client. Griffin says his client work uses it for individual features rather than whole applications: for one client, a background process checks every couple of minutes for new forum private messages and notifies every open instance of the site. He says clients need not be web pages — a .NET console app or a Xamarin mobile app works too — and the server treats each simply as a connection.
- The official documentation is the best place to start. Griffin calls Microsoft's docs the single best source; he has contributed to docs.microsoft.com and says the team reviews pull requests rigorously for accuracy, mostly checking that things are done "the Microsoft way". SignalR needs no separate SDK: he says it ships in the ASP.NET Core meta packages installed with Visual Studio's ASP.NET Core option.
Crosstalk SolutionsUS-24 & US-24-250W Setup w/Fan Replacement
- The two UniFi 24-port switches switch identically; PoE is the difference. Both the US-24 and US-24-250W do 24 Gbps non-blocking throughput and 52 Gbps switching capacity, with 24 gigabit ports and two 1 Gbps SFP (not SFP+) ports. The host says he cannot recall one failing across many installs, though some 48-port PoE models have. Only the US-24 has a 24 V DC input, and its rack ears are detachable.
- The PoE model costs nearly twice the non-PoE switch. On Amazon on the day of recording, the US-24 was about $199, the US-24-250W $379.98 and the 500 W version $528.49. The host notes the PoE model also supports 802.3af, 802.3at PoE+ and per-port 24 V passive, which he uses on one port to power a NanoStation.
- The host says the 500 W model is almost never needed. His arithmetic: a UAP-AC-HD, Ubiquiti's largest access point, draws about 5.5 W, so 24 of them total about 132 W. That leaves roughly 100 W of the 250 W budget, and phones and UVC G3 cameras draw 3–4 W each. His firm rarely sells the 500 W model.
- The US-24-250W proved too loud for a desk. The datasheet gives four fan levels at 9.1, 14.2, 16.8 and 21.2 dB. The host measured 64.9 dB beside its fans against about 42 dB ambient, 55 dB beside the US-24, and 51–52 dB at his desk. After several days it was distracting him and showing up in his video audio.
- Swapping in Noctua fans did not make it quieter. The case held only two 40 mm fans, not the four he expected. The Noctuas arrived as the 5 V version rather than 12 V (about $26 for two), needed their screw holes drilled out to 3/16 inch, and needed their 2-pin adapter. They read 69–71 dB against 65–70 dB for the stock fans; cutting out the side grates (which voids the warranty) brought them back to about stock level. He plans to move the switch under his desk.
Crosstalk SolutionsDomain Name Outlet SCAM!
- Domain Names Outlet offers a domain it does not own. The host received an email at the WhoisGuard address for crosstalkwireless.net offering crosstalkwireless.com for a one-time $99 (the sales page said $99.95), with a year of registration and transfer included. The link was flagged as untrusted, the only contact is a generic email address, and he judges the customer testimonials probably fake.
- The .com was simply available to register for $8.88. A search at Namecheap, his usual registrar, showed crosstalkwireless.com free, and he bought it there for $8.88; he says other registrars are cheaper still. His inference is that the company watches for .com names becoming available and emails owners of the matching .net, claiming to sell a name anyone can buy.
- The host says the real target is non-technical staff. In many organizations domain renewals go to accounting or another department that may not recognize the scam. He advises warning those people so they come to the technical staff before paying for a domain, and notes that a WHOIS search would show the name is free.
Technology and FriendsEpisode 554: Ondrej Balas on 2-Factor Authentication
- Phishing tools now defeat code-based two-factor authentication. Balas says a convincing email (his example: a fake $5 Amazon credit for a late delivery) leads the victim to a lookalike site that relays the real credentials to the real site in the background. The real site then sends a real text code, which the victim types into the fake site, and the attacker logs in as them. He names a recently released tool by a Polish researcher, Modlishka, that automates this against any site it is pointed at.
- Hardware security keys resist this, by Google's account. Balas presents Universal Two-Factor (U2F), a standard developed jointly by Google and Yubico, which makes USB keys, some of which also work over NFC with a phone. He reads a quote from an article saying Google has had "no reported or confirmed account takeovers" since adopting security keys, about a year and a half earlier. In his phone demo on Yubico's demo site, registering and logging in with a YubiKey Neo took a tap against the phone.
- FIDO is the standards body; FIDO2 adds passwordless login. Balas says FIDO (Fast Identity Online) maintains CTAP1 and CTAP2, the client-to-authenticator protocols; CTAP1 is also called U2F, and the keys are loosely called FIDO keys. FIDO2 is newer and not yet widely adopted, and allows a "passwordless single factor" login with the key alone. FIDO says this can be more secure than SMS, and he expects keys with fingerprint readers so a stolen key is useless.
- For a new app, he recommends authenticator-app one-time passwords. Balas says the common step up from SMS is a time-based one-time password from Google or Microsoft Authenticator, with device and server generating the same code every 30 seconds from a shared key. As of ASP.NET Core 2.1, this is built into the templates when you choose individual user accounts, so it runs almost out of the box.
- Supporting keys yourself is more work; identity providers mostly do it already. For U2F/FIDO1 he points to the U2F.core .NET library on NuGet; there is a separate FIDO2 library he has not yet used. Apps that rely on IdentityServer or cloud services such as Auth0 can leave it to them, and he thinks most have implemented it. He recommends Scott Brady's blog, which has a FIDO2 primer and a working proof of concept.
Technology and FriendsEpisode 553: Jennifer Marsman on AI for Earth
synopsis
Marsman presents AI for Earth as more than a grant program: Microsoft funds outside conservation work and also builds shared machine-learning tools, and the grantees' projects show what it pays for.
The program. Brad Smith announced $50 million over five years in December 2017, after a June start at $2 million, for agriculture, water, climate and biodiversity. Anyone may apply, and grants are reviewed quarterly. Marsman, the principal engineer, owns engineering, evangelism and education.
Engineering. With Microsoft Research, whose FarmBeats precision-agriculture work drew her in, the team builds models for needs common to many grantees, such as species classification and land cover mapping, that could become APIs.
Grantee projects. USC is piloting infrared drones that spot people at night and follow anyone who is not a known ranger. Wild Me's Wildbook tells individual animals apart by their markings, and an agent searches YouTube nightly, translates the posts and comments to ask where a sighting was. Marsman recalls a reply rate of at least about 50% and about 80% net-new data, and stresses that Microsoft only funds this work.
Where it is heading. Marsman calls the team "startup-y": two PMs and a PM lead, plus about four technical staff. Grants have moved from credit-card-backed Azure accounts to academic accounts, and now include cash and paid data labeling.
- AI for Earth puts Microsoft's cloud and ML expertise toward conservation. Marsman says Microsoft president Brad Smith announced in Paris in December 2017 a commitment of $50 million over five years for data science and machine learning work on agriculture, water, climate change and biodiversity. The team had started that June with $2 million. Anyone can apply, from nonprofits and academics to large companies and individuals, and grants are reviewed every quarter.
- The team builds generic APIs on top of funding grantees. Marsman, its principal engineer, owns engineering, evangelism and education. The engineering work, with Microsoft Research, spots needs common to many grantees and builds models that might become APIs, perhaps like a Cognitive Service: species classification from an image, and pixel-level land cover mapping from overhead imagery. Education meets grantees where they are, from nonprofits new to ML to ML postdocs who need help training at scale on Azure.
- A University of Southern California grantee uses drones to spot poachers. Drones over large African conservancies send back a real-time infrared feed, because most poaching happens at night and body heat shows up. Any person who is not a known ranger or patroller is treated as a poacher and the drone follows them. Marsman says this is being piloted, with plans to deploy.
- Wild Me identifies individual animals and mines YouTube for sightings. Its Wildbook platform tells individual animals apart by unique markings such as zebra stripes, whale shark spots and giraffe patterns. An agent searches YouTube every night at 10 p.m., translates posts into English with Microsoft Cognitive Services, extracts frames, and asks in a comment for the time and place of a sighting. From memory, Marsman puts the reply rate at "around 50% at least" and the share of net-new data at about 80%; Microsoft funds the work and does not do it.
- Grants have widened beyond Azure credits. Early grants were Azure compute credits on sponsor accounts that needed a credit card, which Marsman disliked for grad students who might leave a machine running, so they moved to academic accounts. There are now also cash grants and data-labeling grants that pay people, including specialists who can recognise leaf blight, to label training data. The team is small: two PMs and a PM lead who run the grant program, plus about four researchers, data scientists and engineers.
Technology and FriendsEpisode 552: Hilary Weaver-Robb on API and Front End Testing
- Testing starts with the requirements, before code exists. Weaver-Robb, a software quality architect at Quicken Loans, says testers often hold the team together by catching vague requirements the business analyst handed off on the assumption that people would ask. A vague requirement can be built one way, tested another and expected a third, so she calls a "Three Amigos" meeting of the developer, the BA and the tester to clear up the assumptions.
- Testers inform the release decision; they are not gatekeepers. She has been the test lead who held a release back, and says QA then gets blamed as the bottleneck while the CTO who releases anyway "gets to be the good guy". Her job is to give stakeholders the issues, concerns and her opinion on go or no-go, and let them decide.
- Test within the sprint, as soon as code exists. She calls testing at the end "water fragile". The team's definition of done should include testing, which can take days to a week, not just finishing the code. With stories sized at about six to eight hours, she expects to start testing a day or two after the engineers start writing.
- Write test automation in the production language and repository. That is her stated practice, and on her Node and React projects it has meant learning JavaScript after .NET. She uses Postman for manual API testing, and SuperTest with the Mocha framework for automated API tests. Knowing the application's overall architecture matters more to her than knowing every serverless implementation detail.
- Automate the stable API before the changing UI. UI automation is slower to write and run, and fragile while the interface keeps changing, so she made the API tests the priority and runs them in the CI/CD pipeline on every merge. Front-end testing is manual for now, in Chrome only because the site is internal, using DevTools to watch how the front end talks to the API.
GCastGCast 35: Customizing Microsoft Teams
- Teams comes with Office 365 licenses. Giard says an organization with Office 365 licenses probably has Teams deployed too, and if not, to ask the IT department "why the heck not". The Teams item on the left-hand menu lists the teams you have favorited.
- Private teams need an owner's approval to join. "Join or create a team" offers templates, building from scratch, or creating from an Office 365 group. Anyone can add themselves to a public team. For a private team, a request emails an owner, who must approve it. Only a name is required; the description is optional. Members can be found in the Active Directory, or added by email address if they are outside it.
- Every channel starts with Conversations, Files and Wiki tabs. A team gets one channel by default (General). More channels are added from the ellipsis next to the team, with an option to automatically favorite the channel for every member. Conversations are threaded and messages can be liked or saved. Files can hold new folders or new Word, Excel or PowerPoint files, which open online and save automatically, or uploads of any file type. The wiki holds shared notes with some formatting.
- Extra tabs can pin a document or embed a website. The plus button offers tab templates for Office documents and third-party tools; Giard gives an important Word file its own tab so people need not hunt for it among the files. A website tab works only if Teams can reach the site and it uses HTTPS. Posting about the new tab to the channel is checked by default, and the embedded site's client-side JavaScript runs.
- Giard sees website tabs' real value in custom team apps. His suggestion is to build a web application specific to the team, for capturing data, sharing information or showing reports, deploy it (to Azure, say) and point a tab at it.