Say Yes: Mel Brooks at 95

Say Yes: Mel Brooks at 95:

I’d learned one very simple trick: say yes. Simply say yes. Like Joseph E. Levine, on “The Producers,” said, “The curly-haired guy—he’s funny looking. Fire him.” He wanted me to fire Gene Wilder. And I said, “Yes, he’s gone. I’m firing him.” I never did. But he forgot. After the screening of “Blazing Saddles,” the head of Warner Bros. threw me into the manager’s office, gave me a legal pad and a pencil, and gave me maybe twenty notes. He would have changed “Blazing Saddles” from a daring, funny, crazy picture to a stultified, dull, dusty old Western. He said, “No farting.” I said, “It’s out”… You say yes, and you never do it.

This seems like quite the win as a life hack…

Piping stdout and stderr to Preview

Piping stdout and stderr to Preview:

A while back, I wrote about how handy it was to redirect a man page into Preview. This allows you to keep the man page open, search it, and generally have a better user experience than struggling with more (or less) to navigate through the information provided there.

man -t apropos | open -fa Preview

Recently, someone asked me about more modern command line interaction, specifically, commands that use --help or similar to provide their documentation. Could that information be opened in Preview as well.

So I put on my thinking hat and set to work.

Git better with fzf and Fish

Git better with fzf and Fish:

You’ve probably heard me mention fzf before. It’s an amazing command line tool created by Junegunn Choi. It takes a list of data and turns it into a command line menu with fuzzy searching, multi-select, and can even preview each item in whatever way is appropriate. I’ve been using it in all kinds of scripts — where I used to have rudimentary numbered menus, I now have much friendlier and more flexible terminal navigation.

fzf is available via Homebrew, just run brew install fzf. See man fzf for very good documentation.

Does Kenny G Make Good Music?

Does Kenny G Make Good Music? | The New Yorker:

Perhaps his most outspoken critic is the jazz guitarist Pat Metheny, who once referred to Gorelick’s work as “lame-ass, jive, pseudo bluesy, out-of-tune, noodling, wimped out, fucked up playing,” and described Gorelick’s version of Louis Armstrong’s “What a Wonderful World” as “a new low point in modern culture—something that we all should be totally embarrassed about—and afraid of.”

Regardless of what you think of Kenny G or Pat Metheny, I greatly appreciate an honest opinion. So much of the interactions I witness have pulled punches and unsaid truths because it won’t do to upset the apple cart. You don’t have to be mean or rude. But once you’ve lost the impact and core what you mean to say, you might as well say nothing…because that’s the end result. All your words wind up being meaningless. The above is not new, it happened years ago. But it was refreshing to run across it in what I thought was going to be a half a puff piece promoting the new film. Nice!

I haven’t taken the time to write lately…

New responsibilities, caring for various family members, working hard at various bits of life.

This is just to say I’m still here, still concerned about music, programming, people, life.

I have more concern about the effects about putting my opinions in public than in the past. I’m sure that’s part of it as well.

Anyway, cheers from deep inside the #covid-19 mess.

FBI repeatedly overstated encryption threat figures to Congress, public

FBI repeatedly overstated encryption threat figures to Congress, public:

Officials now admit none of those statements are true.

[Sigh. They still don’t know the actual number, and are conducting an audit. Further: “Since then, Wray has repeated the claim about 7,800 locked phones, including in a March speech. Those remarks were echoed earlier this month by Attorney General Jeff Sessions.

“Last year, the FBI was unable to access investigation-related content on more than 7,700 devices — even though they had the legal authority to do so. Each of those devices was tied to a threat to the American people,” Sessions said.”]

The Woman Who Gave the Macintosh a Smile | The New Yorker

The Woman Who Gave the Macintosh a Smile | The New Yorker:

The command icon, still right there to the left of your space bar, was based on a Swedish campground sign meaning “interesting feature,” pulled from a book of historical symbols. Kare looked to cross-stitch, to mosaics, to hobo signs for inspiration when she got stuck. “Some icons, like the piece of paper, are no problem; but others defy the visual, like ‘Undo.’ ”

[It doesn’t get any better than the original work done for the Mac. This stuff is so good that despite people not having used a computer before, a GUI, etc. so many people recognized what they should do with it. Astonishing work.]

Source: Daring Fireball

Adding the Kubernetes dashboard to Docker for Mac

A simple way to add the Kubernetes dashboard, which can be helpful to folks new to Kubernetes. Docker for Mac (edge) doesn’t ship with it in place. In your terminal type the following. I am assuming you have Kubernetes running and kubectl installed and on your path.

kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
kubectl get pods --namespace=kube-system

At this point you should see a line with a name that starts with “kubernetes-dashboard-” and some identifier. Modify the line below to match:

kubectl port-forward kubernetes-dashboard-7798c48646-wkgk4 8443:8443 -- namespace=kube-system &

Then your browser should load the dashboard on the port you specified (it will yell at you about the untrusted cert).

Just for clarity, the kubernetes-dashboard.yaml looks like the below as I write this, copied from the link above.

# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Configuration to deploy release version of the Dashboard UI compatible with
# Kubernetes 1.8.
#
# Example usage: kubectl create -f 

# ------------------- Dashboard Secret ------------------- #

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs
  namespace: kube-system
type: Opaque

---
# ------------------- Dashboard Service Account ------------------- #

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system

---
# ------------------- Dashboard Role & Role Binding ------------------- #

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kubernetes-dashboard-minimal
  namespace: kube-system
rules:
  # Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret.
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["create"]
  # Allow Dashboard to create 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
  resources: ["configmaps"]
  verbs: ["create"]
  # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
- apiGroups: [""]
  resources: ["secrets"]
  resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"]
  verbs: ["get", "update", "delete"]
  # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
  resources: ["configmaps"]
  resourceNames: ["kubernetes-dashboard-settings"]
  verbs: ["get", "update"]
  # Allow Dashboard to get metrics from heapster.
- apiGroups: [""]
  resources: ["services"]
  resourceNames: ["heapster"]
  verbs: ["proxy"]
- apiGroups: [""]
  resources: ["services/proxy"]
  resourceNames: ["heapster", "http:heapster:", "https:heapster:"]
  verbs: ["get"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-dashboard-minimal
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard-minimal
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system

---
# ------------------- Dashboard Deployment ------------------- #

kind: Deployment
apiVersion: apps/v1beta2
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      containers:
      - name: kubernetes-dashboard
        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.1
        ports:
        - containerPort: 8443
          protocol: TCP
        args:
          - --auto-generate-certificates
          # Uncomment the following line to manually specify Kubernetes API server Host
          # If not specified, Dashboard will attempt to auto discover the API server and connect
          # to it. Uncomment only if the default does not work.
          # - --apiserver-host=http://my-address:port
        volumeMounts:
        - name: kubernetes-dashboard-certs
          mountPath: /certs
          # Create on-disk volume to store exec logs
        - mountPath: /tmp
          name: tmp-volume
        livenessProbe:
          httpGet:
            scheme: HTTPS
            path: /
            port: 8443
          initialDelaySeconds: 30
          timeoutSeconds: 30
      volumes:
      - name: kubernetes-dashboard-certs
        secret:
          secretName: kubernetes-dashboard-certs
      - name: tmp-volume
        emptyDir: {}
      serviceAccountName: kubernetes-dashboard
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule

---
# ------------------- Dashboard Service ------------------- #

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard