- Private channels should be coming this week … not my tenant yet, but soon
- Multi-window functionality where chats, calls, and such can pop out into another window
- Live captioning should land later this year — this is an obvious great feature for people with reduced hearing or frequency loss, live “closed captioning” is awesome if you’re working from a noisy location too
- Microsoft Whiteboard moved into general availability — it’s been a preview for quite some time now
- “Attendee” roll will prevent people from inadvertently sharing their screen in the middle of a meeting
- My Staff portal that allows managers to perform password resets (and maybe unlocks) for their employees. This is something I’ve done as custom code in IDM platforms, but it’s nice to see Microsoft incorporating ideas that reduce down-time due to password challenges.
- I’ll be curious to see if the healthcare-specific features move into other verticals — MS rolled out a feature that allows you to designate a contact when you’re in surgery (basically redirect all of my messages to Bob because I’m busy right now) that seemed like it would be quite useful in enterprise or education uses. The “patient coordination” feature they talk about might work as a contact management tool out of the medical realm too.
- URLs in Teams will be protected like the links in other Office 365 programs — if you click on a link and see something about “Advanced Threat Protection” … that’d be why đ
Category: Technology
Reverting a Single File with Git
Git revert is great for resetting the entire project to a particular state â I went down a bad path, really donât want to do this, and resetting to the state I was in this morning is exactly what I want to do. Sometimes, though ⌠thatâs not the case. I added a couple of debugging lines to a file that I donât really need. Or Iâve gone down a bad path here but have good work in a few other files too. In those cases, you can revert a single file to the latest committed version. Run âgit statusâ and âgit diffâ to confirm that it is an uncommited change.

To revert a single file to its latest committed state, use âgit checkout â filenameâ â you can see the added line has disappeared.

Extracting the Transcript from Microsoft Stream Videos
Updated script available at https://www.rushworth.us/lisa/?p=6854
While Microsoft does not provide a way to export the transcript from Stream videos (thus recorded Teams meetings), it is possible to get something a nicer than the select/copy/paste from the transcript box. Click the video settings and select âShow transcriptâ

Display the browser developer tools â In Firefox, select the âWeb Developerâ sub-menu from the browser menu and select âWeb Consoleâ

This console is often used for displaying errors in a website, but it can also be used to send commands to the browser. Thereâs a â>>â prompt â click next to it and youâll have a flashing cursor.

Paste this into the console:
window.angular.element(window.document.querySelectorAll('.transcript-list')).scope().$ctrl.transcriptLines.map((t) => { return t.eventData.text; })
⌠and hit enter. Another line will appear below what youâve entered. Right-click on that new entry and select âCopy Objectâ. Now paste into a text editor or Microsoft Word.

The output could use a little cleanup. Youâll see â\r\nâ anywhere thereâs a newline. This

Becomes âa new tip to make things quicker. So\r\nshare your knowledgeâ ⌠you could replace â\r\nâ with a space (I find the newlines to be superfluous) or use a regex replacement to replace â\\r\\nâ (literal string, the backslash escapes the backslash to retain it) with â\nâ (an actual newline)
Each time-stamped bit of the transcript is in a separate set of quotes â Iâve got a quick replacement that takes
",\n "
And replaces it with a newline ⌠so

Becomes

Depending on the target audience ⌠for me, thatâs where I stop. To send the transcript to someone else, I manually clean up the spaces and quote before the first line and the quote-comma on the last line.
Android 10 Backup Issue
Pixel XL with Android 10 (build QP1A.191005.007.A1). Enabled Backup, selected a backup account (only one account on the device), and found the ‘Back up now’ button was grayed out. There is a strange work around — temporarily removing the security pin. The ‘Back up now’ button is active, and a backup can be performed successfully.
*But* I have to re-register my fingerprints when the pin is disabled / re-enabled. Which means I’ve got to type my long and complex banking password on the little phone keyboard. Not cool. I was able to back up my phone using ADB but needed to input a passphrase on the device to encrypt the backup. Not sure if there’s something about the screen lock security that requires the backup to be encrypted … which then precludes the magic to-the-cloud backup from proceeding?
To back up device from command line:
adb backup -apk -shared -all -f ./backup.ab
< on device, type a passphrase and approve the device backup>
Microsoft Teams: Cross-posting to multiple channels
Click on âPost in multiple channelsâ

To post in additional channels, click âSelect channâŚâ

Check off the channels into which you want the post written â this can be a channel in any Teams space where you are able to post messages. Click âUpdateâ.

When your message is posted, an indicator will appear letting everyone know it was posted in multiple channels. No, there doesnât appear to be a way to see which channels â thatâs probably a permission / information leakage nightmare (post something into the âMass Layoffsâ channel that I shouldnât know exists ⌠I shouldnât be able to see that channel name). But the glif gives you some confirmation if you think youâve seen this info elsewhere.

Note â the posts are not linked to each other. If someone replies in one channel, the post in the other channels will not include the reply. So while this is a quick way to disseminate the same information to various teams ⌠youâre starting multiple conversations too.

Also note — there doesn’t appear to be a way to edit cross-posted messages.
Git Log
Git log can be used to get a quick summary of the differences between two branches. The three dots between the branch names indicates you want a âsymmetric differenceâ. That is the set of commits that are in the branch on the left or the branch on the right but not in both branches.
The –left-right option prefixes each commit with an â<â or â>â indicating which âsideâ has the commit. The –oneline option prints the abbreviated commit ID and the first line of the commit message.
Showing the differences between your local uat branch and the remote uat branch:
D:\git\gittest>git log –left-right –oneline origin/uat…uat
> 961f53a (uat) Merge branch ‘ossa-123’ into uat
> 803096b (origin/ossa-123, ossa-123) Added additional files
> cf9c419 Added initial code to branch
The top line is the most recent commit, the bottom line is the oldest commit that does not exist in both branches. I can see that the uat branch in my local repo is not missing anything from the remote (there are no commits with “<” indicating changes in the remote that do not exist in my local copy) but I have local changes which have not yet been pushed: two code commits plus the merge commit which incorporated the code commits to my local repo’s uat branch. The head of the local and remote ossa-123 branch are at the commit just prior to the merge, so on my local repo that branch has been fully merged into UAT and I just need to push uat up to the remote.
Additional options to enhance output:
–cherry-pick will omit any changes that represent the same changes in both branches (or –cherry-mark to mark those commits with an â=â flag)
–graph uses an ASCII chart to depict branch relationships.
* The three dots mean something different in git diff than in git log. In git diff, mean âwhat are the differences between the right-hand branch and the common ancestor shared by both the right and left-hand branchesâ.

Two dots in git diff mean is the differences that are in the branch on the left or the branch on the right but not in both branches.

In git log, two dots displays only commits unique to the second branch. Since commits and differences are not exactly the same thing, two and three dots donât exactly have the opposite meaning between diff and log. But the meaning is not logically consistent.
Postfix IPv6 Loopback Failure
I needed to send email messages from a PHP form, and the web server at work uses Postfix. So … I’m getting Postfix set up to relay mail for the first time in a decade or two đ I thought I’d just have to edit /etc/postfix/main.cf and add “relayhost = [something.example.com]”.
Nope. The service fails to start with nothing particularly indicative — just a [FAILED] status from the init script. Attempting to start Postfix outside of the init script is far more informative:
[lisa@564240601ac2 init.d]# /usr/sbin/postfix start postfix: fatal: parameter inet_interfaces: no local interface found for ::1
Turns out I’ve got to edit /etc/postfix/main.cf and tell it to use IPv4 only:
# Enable IPv4, and IPv6 if supported inet_protocols = ipv4
Testing Procedural Code with PHPUnit
You can use PHPUnit to test procedural code — in this case, I’m testing the output of a website. I have some Selenium tests for UI components but wanted to use the shell executor for functional testing. In the test code, you can populate the _SERVER and _POST (or _GET) arrays and simulate the web environment.
<?php
namespace phpUnitTests\CircuitSearch;
class CircuitExportTest extends \PHPUnit_Framework_TestCase{
private function _execute(array $paramsPost = array(), array $paramsServer = array() ) {
$_POST = $paramsPost;
$_SERVER = $paramsServer;
ob_start();
include "../../myWebSitePage.php";
return ob_get_clean();
}
public function testUsageLogging(){
$argsPost = array('strInput'=>'SearchValue', 'strReportFormat'=>'JSON');
$argsServer = array("DOCUMENT_ROOT" => '/path/to/website/code/html/', "HOSTNAME" => getHostByName(),
"SERVER_ADDR" => getHostByName(php_uname('n')), "PWD" => '/path/to/website/code/html/subcomponent/path');
$this->assertEquals('{}', $this->_execute($argsPost, $argsServer));
}
}
?>
Running the test, my web output is compared to the static string in assertEquals. In this case, I am searching for a non-existent item, nothing is returned, and I expect to get empty braces. I could use AssertsRegExp or or AssertsStringContainsString to verify the specifics of a real result set.
Deleting Git Branch — Local and Remote
Writing this down so I don’t have to keep looking it up after I merge my branch …
git push --delete <remote_name> <branch_name>
git branch -d <branch_name>
Docker for Windows: Using Built-in k8s
I just started using k8s built into Docker for Windows, but I couldn’t connect because the target machine actively refused the connection.
C:\Users\lisa>kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.6", GitCommit:"96fac5cd13a5dc064f7d9f4f23030a6aeface6cc", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:49Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"windows/amd64"}
Unable to connect to the server: dial tcp [::1]:8080: connectex: No connection could be made because the target machine actively refused it.
No idea — it’s all internal traffic, but I resorted to turning off my firewall anyway just to see what would happen. Nothing. Turns out I need a KUBECONFIG environment variable pointing to the config file
C:\Users\lisa>set | grep KUB KUBECONFIG=C:\Users\lisa.RUSHWORTH.000\.kube\config
Applied the yaml file and started the proxy
C:\Users\lisa>kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml secret/kubernetes-dashboard-certs created serviceaccount/kubernetes-dashboard created role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created deployment.apps/kubernetes-dashboard created service/kubernetes-dashboard created C:\Users\lisa>kubectl proxy Starting to serve on 127.0.0.1:8001
Working! Get the token from
kubectl -n kube-system describe secret default
And access the dashboard.
A reminder for myself — the totally not obvious package name for the kubeadm binary on the CHANGELOG link list is Node. Go figure!
