A spot where I slipped up in trying to adopt Temporal in an existing Python project and then again in starting a new Python project was in defining a Workflow that invokes an Activity that calls a third party library.
Temporal outputs an error message with a long stacktrace that I vaguely understood but didn’t immediately know the solution to
...
raise RestrictedWorkflowAccessError(f"{self.name}.{name}")
temporalio.worker.workflow_sandbox._restrictions.RestrictedWorkflowAccessError: Cannot access http.server.BaseHTTPRequestHandler.responses from inside a workflow. If this is code from a module not used in a workflow or known to only be used deterministically from a workflow, mark the import as pass through.
The message itself is very informative “mark the import as pass through”, but requires a follow up search to find the right snippet to get right.
I also overlooked the note about importing Activities in Python, mentioned in the Getting Started Guide.
I wanted to stop the Obsidian editor cursor from blinking.
Something like VS Code’s
{
"editor.cursorBlinking": "solid"
}
Some searching turned up an option to solve this problem in Vim mode using CSS, but in insert mode, the cursor still blinks.
Eventually, I came across a macOS-based approach to solve this issue on StackExchange, included here for convenience
defaults write -g NSTextInsertionPointBlinkPeriod -float 10000
defaults write -g NSTextInsertionPointBlinkPeriodOn -float 10000
defaults write -g NSTextInsertionPointBlinkPeriodOff -float 10000
After running, restart Obsidian and the cursor no longer blinks.
These configuration changes also disable cursor blinking in other applications, which for me, is a welcome change.
Cursor is VS Code with Cmd+K that opens a text box that can do text generation based on a prompt.
When I created this post, I first typed
insert hugo yaml markdown frontmatter
In a few seconds, the editor output
---
title: "Cursor Introduction"
date: 2023-08-12T20:00:00-04:00
draft: false
tags:
- cursor
- intro
---
This was almost exactly what I was looking for except the date was not quite right, so I corrected that and accepted the generation.
Since I use VS Code, I felt at home immediately.
The only thing missing is my extensions, but extension installation works exactly the same way.
Cmd+L opens a ChatGPT-style chat in the right sidebar.
You can reference files within the chat interface with @
which seems to load them into the language model prompt as context.
I asked it to describe what this post was about with
The problem with long running code in Next serverless functions
The current design paradigm at the time of this writing is called App Router.
Next.js and Vercel provide a simple mechanism for writing and deploying cloud functions that expose HTTP endpoints for your frontend site to call.
However, sometimes you want to asynchronously do work on the backend in a way that doesn’t block a frontend caller, needs to move on.
You could fire and forget the call from the frontend, but this is often not safe when running in a serverless environment.
The following approach uses two server-side API endpoints to run an asynchronous function from the perspective of the frontend caller.
First attempt
I made an attempt to setup TypeChat to see what’s happening on the Node/TypeScript side of language model prompting.
I’m less familiar with TypeScript than Python, so I expected to learn some things during the setup.
The project provides example projects within the repo, so I tried to pattern off of one of those to get the sentiment classifier example running.
I manage node
with asdf
.
I’d like to do this with nix
one day but I’m not quite comfortable enough with that yet to prevent it from become its own rabbit hole.
I installed TypeScript globally (npm install -g typescript
) to my asdf
managed version of node, then put the version I was using in .tool-version
in my project.
I downloaded Warp today.
I’ve been using iTerm2 for years.
It’s worked well for me but Warp came recommended and so I figured I should be willing to give something different a chance.
Warp looks like a pretty standard terminal except you need to sign-in, as with most things SaaS these days.
It looks like the beta is free but there is a paid version for teams.
Warp puts “workflows” as first class citizens of the editor experience.
These occupy the left sidebar where files typically live in a text editor.
At first past, workflows seem like aliases where the whole “formula” is visible in the terminal window when you invoke them, rather than requiring you to memorize your alias/function and arguments.
Additionally, typing workflows:
or w:
in the prompt, opens a workflow picker with fuzzy search and a preview of what the workflow runs.
It comes with window splitting (like tmux) by default, and somehow using my personal hotkeys.
I’m not sure if this is a lucky coincidence or it they somehow loaded by iTerm2 settings.
By default, the PS1
is
To broaden my knowledge of nix
, I’m working through an Overview of the Nix Language.
Most of the data types and structures are relatively self-explanatory in the context of modern programming languages.
Double single quotes strip leading spaces.
Functions are a bit unexpected visually, but simply enough with an accompanying explanation.
For example, the following is a named function f
with two arguments x
and y
.
To call the function, write f 1 4
.
Calling the function with only a single arg returns a partial.
I started working through the Zero to Nix guide.
This is a light introduction that touch on a few of the command line tools that come with nix
and how they can be used to build local and remote projects and enter developer environments.
While many of the examples are high level concept you’d probably apply when developing with nix
, flake templates are one thing I could imagine returning to often.
Go introduced modules several years ago as part of a dependency management system.
My Hugo site is still using git submodules to manage its theme.
I attempted to migrate to Go’s submodules but eventually ran into a snag when trying to deploy the site.
To start, remove the submodule
git submodule deinit --all
and then remove the themes
folder
To finish the cleanup, remove the theme
key from config.toml
.
The threading macro in Clojure provides a more readable way to compose functions together.
It’s a bit like a Bash pipeline.
The following function takes a string, splits on a :
and trims the whitespace from the result.
The threading macro denoted by ->
passes the threaded value as the first argument to the functions.
(defn my-fn
[s]
(-> s
(str/split #":") ;; split by ":"
second ;; take the second element
(str/trim) ;; remove whitespace from the string
)
)
There is another threading macro denoted by ->>
which passes the threaded value as the last argument to the functions.
For example: