DJ Adams

Blog posts tagged "tools"

  1. Balancing context size and callable tool metadata with CAP's MCP adapter

    Some notes on both sides of the per_action_tool setting of CAP's MCP adapter plugin.

  2. Genres, cuids and a bit of AWK

    Using AWK to process the Genres data from the CAP bookshop sample.

  3. Quiet cds test output - two ways

    Reducing CAP server log output during tests, in two different ways, via a profile encapsulated set of log level configurations, or via the new cds test command.

  4. CDS source formatting and readability

    Embracing a modern approach to source code formatting for human-centric modelling in CAP

  5. Auto formatting extensionless Bash scripts in Neovim

    Here's what I did to make the combination of the Bash language server and shfmt work with Editorconfig settings for Bash script files that don't have extensions.

  6. Neovim configuration for file and module navigation in CDS models

    In this post I describe how I extended my Lua-based Neovim configuration for CDS filetypes to improve navigation to referenced files and modules.

  7. Excluding specific diagnostics in Neovim

    Here's what I did to be able to filter out certain diagnostic messages in Neovim.

  8. A reCAP intro to the cds REPL

    Here's a summary of my talk on the cds REPL at this year's reCAP event.

  9. A modern and clean Neovim setup for CAP Node.js - configuration and diagnostics

    In this post I describe my re-worked basic setup for working with CAP Node.js in Neovim, focusing on the configuration and digging into the LSP based diagnostic facilities.

  10. Editing Markdown in a Neovim environment

    Here are some notes I made when digging into my tools for editing Markdown source.

  11. Adjusting the preview width in Telescope's horizontal picker

    Here's how I adjusted the width of the preview window in Telescope's horizontal picker.

  12. How I run executables in containers

    Here's a quick post explaining how I might typically containerise an executable. This is in the context of my aim to not "pollute" my base OS (at the bare metal level) with any installs, as far as I can, as well as to remain platform independent and abstract.

  13. Level up your CAP skills by learning how to use the cds REPL

    These are notes I wrote for my talk at SAP Inside Track Madrid on 20 March 2025. I wrote them partly to think about what I wanted to say, and partly to share the info in written form too. Note that the idea is to introduce the concepts and show some basic examples for cds REPL "initiates". Nothing too exotic.

  14. Migrating GitHub issue based URL bookmarks to wallabag

    In this post I outline how I migrated my collection of reading list bookmarks, stored as issues in a GitHub repo, to wallabag which I'm now self-hosting.

  15. CAP Node.js plugins - part 2 - using the REPL

    This blog post accompanies part 2 of a three part video series where we explore the CDS Plugin mechanism in CAP Node.js. This post is about discovering and exploring service details with introspection.

  16. Immutable layers, file deletion and image size in Docker

    Digging into how the immutability of Docker image layers means you have to think carefully about creating and deleting content when building an image.

  17. Setting up a cache server for apt packages

    Setting up an apt-cacher-ng based cache server for Debian apt packages in my homeops context.

  18. New source for LXD images on Crostini

    Finding a new source for LXD images on ChromeOS Crostini after the default became unavailable.

  19. Using lazydocker with SSH-based remote contexts

    A quick hack to work around the current issue with lazydocker and SSH-based remote Docker context definitions.

  20. Enabling document fragment links for headings in SAP Community blog posts

    Creating a bookmarklet to enable document fragment links for headings in SAP Community blog posts.

  21. Digging into CSN diffs for CDS models

    Building a csndiff script to understand CSN changes as I build up CDS models incrementally.

  22. Using ARG in a Dockerfile - beware the gotcha

    Learning about the subtle gotcha with ARG and FROM instruction ordering in Dockerfile definitions.

  23. Obtaining auth code grant type OAuth 2.0 tokens for Google APIs with a script

    Writing a script to obtain OAuth 2.0 bearer tokens for Google API calls using the auth code grant type.

  24. Controlling automatic HTTP requests in CAP Node.js design time loops

    Controlling automatic HTTP requests during CAP Node.js design time development loops.

  25. Simple script for previewing CDS models in CSN - cdsray

    Building a simple cdsray script for previewing CDS models in their CSN representation.

  26. Easily add an explicit cds.requires.db to your CAP project's package.json

    Using jq to easily add an explicit cds.requires.db entry to a CAP project's package.json.

  27. Improve your CAP dev container shell prompt

    Improving the shell prompt in a CAP dev container for a better development experience.

  28. Avoid design time CAP server restarts when maintaining local data files

    Avoiding unnecessary CAP server restarts when maintaining local CSV data files during design time.

  29. Curating a collection of jq functions

    Curating a personal collection of jq functions and exploring how the jq module system works.

  30. Opening files from the terminal in BAS dev spaces

    Opening files from the terminal in SAP Business Application Studio dev spaces using the code command.

  31. Exploring codespaces as temporary dev containers

    Exploring GitHub Codespaces as ephemeral, temporary dev container environments.

  32. Developing CAP in containers - three ways

    Exploring three different ways of developing CAP applications in containers.

  33. Battlestation 2024

    Sharing a picture of my 2024 desk setup on the narrowboat.

  34. A simple jq REPL with tmux, bash, vim and entr

    Building a simple jq REPL with tmux, Bash, Vim and entr for exploring JSON datasets.

  35. Using the docker CLI in a container on macOS

    Explaining how to use the Docker client CLI from within a container on macOS.

  36. Tmux plugin development with a local repo

    Writing a simple Tmux plugin to learn how plugin development works with a local repo.

  37. TIL - Two Tmux Plugin Manager features

    Discovering two useful Tmux Plugin Manager features while revisiting my working environment setup.

  38. Resources for navigating the canal network

    Sharing resources and tools for navigating the UK canal network.

  39. Improving my interactive jq workflow with ijq, bash and tmux

    Improving my interactive jq workflow by capturing expressions from ijq for command line use.

  40. Working from a narrowboat - Internet connectivity

    Exploring the internet connectivity options for working from a narrowboat.

  41. Managing resources on SAP BTP - what tool do I choose?

    A way to think about the different tools available for managing resources on the SAP Business Technology Platform and when to use each one.

  42. Extracting blog post dates from URLs with jq

    Using jq to extract and sort blog post dates embedded in URLs from a JSON array of GitHub issues.

  43. Some notes on modular JSON Schema definitions

    Jotting down some notes on understanding how a modular JSON Schema definition might be constructed.

  44. More Untappd data explorations with jq - my top ranking beer types (part 3)

    Wrapping up my Untappd data exploration with the final ranking of my favourite beer types.

  45. More Untappd data explorations with jq - my top ranking beer types (part 2)

    Continuing my Untappd data exploration to determine my top ranking beer types.

  46. More Untappd data explorations with jq - my top ranking beer types (part 1)

    Exploring my Untappd data to discover my top ranking beer types, starting with the data preparation.

  47. Untappd data with jq - my top brewery countries

    Exploring my Untappd checkin data with jq to find my top brewery countries.

  48. Exploring JSON with interactive jq

    Using ijq, the interactive jq wrapper, to explore JSON data with immediate visual feedback.

  49. Exploring GitHub repo name distribution with jq

    Exploring the distribution of name prefixes for SAP-samples repositories on GitHub using jq.

  50. A classic example of yak shaving, and some stream editing

    Descending through multiple levels of classic yak shaving and ending up learning some stream editing.

  51. Setting up my own Cloud Foundry

    Describing my journey getting a local Cloud Foundry up and running on Kubernetes.

  52. Exercism and jq

    Exploring what a jq track might look like on the Exercism learning platform.

  53. SAP Tech Bytes: btp CLI - new home for configuration

    Noting the updates to where the btp CLI configuration is stored by default.

  54. Truncation and neat terminal output

    Exploring the psFormat Docker configuration option and striving for neat terminal output.

  55. Controlling Chrome from the CLI

    Using the chrome-cli tool to open URLs in different tabs from the command line.

  56. Setting up hadolint - a Dockerfile linter

    Setting up hadolint as a Dockerfile linter in my development environment.

  57. Getting BTP resource GUIDs with the btp CLI - part 1

    Learning how to use the btp CLI to determine resource GUIDs in a BTP global account.

  58. Exploring fff part 2 - get_ls_colors

    Continuing to read and learn from the fff file manager source code, focusing on the get_ls_colors function.

  59. SAP Tech Bytes: btp CLI - autocompletion

    Setting up command autocompletion for the btp CLI.

  60. SAP Tech Bytes: btp CLI - managing configuration

    Understanding and managing the btp CLI client configuration.

  61. Improving shell fu with practice

    Practising shell commands to improve my skills and expose myself to new knowledge.

  62. SAP Tech Bytes: btp CLI – logging in

    Logging in with the btp CLI and finding a subaccount for subsequent activities.

  63. Exploring fff part 1 - main

    What I learned from starting to read the source code of the fff file manager, focusing on the main function.

  64. SAP Tech Bytes: btp CLI - installation

    Installing the btp CLI to start exploring its features for BTP administration.

  65. Learning by rewriting - bash, jq and fzf details

    One of the ways I learn is by reading and sometimes rewriting other people's scripts. Here I learn more about jq by rewriting a friend's password CLI script.

  66. Today's TIL trio

    Three mini TILs from today on minimum JSON, using tee, and netstat options.

  67. Session switching with the tmux menu

    Here's a way to get a simple session switcher in tmux using a popup menu.

  68. tmux output formatting

    Here's what I learned today about FORMATS in tmux output.

  69. Unix tooling - join, don't extend

    Reading a 1984 paper by Pike and Kernighan helped crystallise an important axiom in Unix tool design about joining programs rather than extending them.

  70. Early thoughts on Warp

    Some very early thoughts on Warp, the pro terminal designed for everyday use.

  71. The APC SMT750IC UPS works with the Synology NAS DS1621+

    Successfully configuring the APC SMT750IC UPS with the Synology NAS DS1621+ via USB for automatic shutdown.

  72. Remote access to Docker on my Synology NAS

    Setting up remote command line access to the Docker install on my Synology NAS in the simplest way possible.

  73. Adding a drive to my Synology NAS

    A brief summary of how things went adding a drive to my Synology DS1621+ NAS.

  74. Notes on Markdown linting - part 2

    More on Markdown linting, this time in the context of GitHub Actions.

  75. Notes on Markdown linting - part 1

    What I found out when I started to look into linting Markdown content.

  76. Solving mysterious unrendered markdown headings

    Getting to the bottom of why some headings in my Markdown content were not being rendered properly.

  77. Unpacking Bash shell tips from a GitHub Actions workflow

    Unpacking Bash shell tips from a GitHub Actions workflow step, focusing on IFS and awk usage for pull request info.

  78. GitHub Actions workflow browser

    A simple workflow browser built with Bash, gh and fzf to help refer to previous workflow definitions while writing new ones.

  79. Producing JSON with jq for appending issue titles

    Learning how to use jq to produce JSON while writing a script to enhance Thinking Aloud journal entry titles.

  80. SAP Tech Bytes: Exploring SAP-samples with gh and fzf

    Discovering SAP-samples repositories by exploring them from the command line with gh and fzf.

  81. New tmux panes and windows in the right directory

    How to be in the right directory when creating a new window or pane in tmux.

  82. Deeper connections to everyday tools

    Wanting to learn more about the everyday tools I use, because with some things ignorance is not bliss.

  83. Two-phase video uploads with YouTube API and curl

    How to use the YouTube API to upload a video with curl using a two-phase approach.

  84. Mass deletion of GitHub Actions workflow runs

    A simple cleanup script for mass-deleting GitHub Actions workflow runs using gh, jq, fzf and the GitHub API.

  85. A new journal experiment - Thinking Aloud

    I'm trying out a new way of sharing thoughts in a GitHub issues based journal style blog called "Thinking Aloud".

  86. fzf - the basics part 2 - search results

    More on the fzf basics, this time focusing on controlling and understanding the search results.

  87. fzf - the basics part 1 - layout

    What I learned from reading the first part of the fzf README about controlling the layout and appearance.

  88. Columnar layout with AWK

    A breakdown of a simple AWK script to format values into neatly aligned columns.

  89. The subtle art of quoting newline characters

    How backslash continuation in the shell is more subtle and more beautifully shell-like than it might first appear.

  90. Improving my shell scripting

    I'm using a style guide along with the shellcheck and shfmt tools to help me improve the quality and consistency of my shell scripts.

  91. curl and multipart/form-data

    Discovering how curl handles multipart/form-data including reading from standard input.

  92. A new learning source for shell scripting

    Discovering Mr Rob's dotfiles and live streams as a new learning source for shell scripting.

  93. Reducing writing friction

    A simple script to reduce writing friction and make it easier to start and publish blog posts.

  94. You can mask sensitive hostnames with wildcards and host aliases

    The HOSTALIASES feature works well when combined with wildcard host definitions in SSH config to mask sensitive hostnames.

  95. git diff can emit different exit codes

    Combining git diff exit codes and the POSIX negation operator to control GitHub Actions job step execution based on git changes.

  96. Terminal Tip: a CF remote monitor script

    Building a script to find and remotely monitor an ongoing Cloud Foundry multi-target app deployment.

  97. Terminal Tip: remotely monitor a CF deployment

    Remotely monitoring an ongoing Cloud Foundry MTA deployment from the terminal.

  98. Terminal Tip: switching CF targets

    Switching between Cloud Foundry targets efficiently from the command line.

  99. Terminal Tip: parsing CF app logs

    Parsing Cloud Foundry application log output with shell tools for better readability.

  100. Terminal Tip: truncating CF output

    Truncating wide Cloud Foundry CLI output to make it more readable in the terminal.

  101. Shell power and simplicity

    Reflecting on the often overlooked power and simplicity of shell programming concepts.

  102. Vim, Markdown and writing

    Rebuilding my writing workflow around Vim and Markdown for a more focused experience.

  103. Housekeeping

    Tidying up my blogging infrastructure and moving to a new domain and platform.

  104. Set up VS Code on Chrome OS for local Application Programming Model development

    In this post I walk through the process I used to set up a development environment for CAP on my Chromebook.

  105. Collaboration tools

    Setting out my preferences for collaboration tools that support realtime multi-user editing.

  106. Balancing features with simplicity

    Considering the balance between features and simplicity, prompted by a ChromeOS forum thread.

  107. Monday morning thoughts: editors and editing

    I look at how the editor environments that we come across in our daily work are different, and, as those differences might grow and expand as we become cloud native, how we bridge the contrast in facilities with core obsessions such as correct indentation and whitespace.

  108. Discovering SCP Workflow - Using Postman

    Using Postman to explore and interact with the SCP Workflow API.

  109. Fix Blink

    Providing a bookmarklet to fix the distracting blinking text in the timesheet system.

  110. YABP - Yet Another Blogging Platform

    Reflecting on my history of blogging platforms and the latest move.

  111. Excluding with vim's wildignore

    Getting the wildignore setting to work properly in vim for excluding directories like node_modules from file searches.

  112. Quick HCP title hack with the Navigation Manager

    Hacking the HCP cockpit title with the Navigation Manager using the Chrome Developer Tools.

  113. The UI5 Support Tool - Help Yourself!

    30 Days of UI5 - day 15 by DJ Adams.

  114. Making Information More Useful

    Explaining my approach to making information more accessible and useful through links and references.

  115. Atom, Snippets, Tabs and CSON parsing

    Debugging a CSON parsing error in my UI5 snippets package for the Atom editor.

  116. Running: 2014 in review, and some Clojure

    Reviewing my 2014 running stats and doing some simple data analysis in Clojure.

  117. Creation & Reload of UI5 UIs in the Chrome Developer Console

    Demonstrating how to create and reload UI5 UIs directly in the Chrome Developer Console.

  118. Scratching an itch - UI5 Icon Finder

    Building a UI5 Icon Finder app to search the vast library of icons available in UI5.

  119. This Week in Fiori (2014-34)

    Covering week 34 of Fiori news including documentation, extensibility, prototyping tools and workflow.

  120. Small steps - OpenUI5 toolkit now in jsbin.com

    Celebrating the addition of the OpenUI5 toolkit to jsbin.com for easy code demos and snippets.

  121. Quick hack: Calendar Inviter

    Building a quick Google Apps Script hack to sync calendar events across multiple organisational calendars.

  122. SheetAsJSON - Google Spreadsheet Data as JSON

    Explaining how to expose Google spreadsheet data as JSON via HTTP using Google Apps Script.

  123. Simple SAPUI5 Chrome icon for lazy developers like me

    Creating a simple Chrome hosted app icon to quickly navigate to the SAPUI5 Developer Center on SCN.

  124. Jump to Shell Workset Item from URL

    Discovering how to jump to specific SAP Shell workset items from a URL.

  125. Serial interest in the Raspberry Pi

    Attending the Manchester Raspberry Jam and connecting a vintage Wyse terminal to a Raspberry Pi.

  126. Two tools for Gateway trial host nplhost

    Recommending two useful tools, multitail and screen, for working with the SAP NetWeaver Gateway trial system.

  127. SAPUI5 Powered SCN Forum Finder

    Building a SAPUI5-powered forum finder to help locate the old SDN forums on the new SCN platform.

  128. Reading List Mark 2 - Part 5

    Wrapping up the reading list app series by putting it all together and using the User Interface services.

  129. Reading List Mark 2 - Part 4

    Continuing the reading list app series, covering synchronisation between the spreadsheet and content sources.

  130. Reading List Mark 2 - Part 3

    Continuing the reading list app series, covering the UrlFetch Services for interacting with external APIs.

  131. Reading List Mark 2 - Part 2

    Continuing the reading list app series, covering the Tasks API for retrieving and inserting tasklists.

  132. Reading List Mark 2 - Part 1

    Introducing a reading list app built with Google Apps Script to demonstrate various API integrations.

  133. Automated email-to-task mechanism with Google Apps Script

    Looking at an example Google Apps Script that automates email-to-task conversion.

  134. Ad-hoc Data Workflows with Google Apps Script

    Presenting on building ad-hoc data workflows with Google Apps Script at the Manchester GTUG.

  135. Gmail Contextual Gadgets - talk at Manchester GTUG

    Giving a talk on Gmail Contextual Gadgets at the Manchester Google Technology User Group.

  136. My browser A-Z

    Listing my browser A-Z, the URLs that appear on a single letter press based on past browsing.

  137. Hacking the Delicious extension for Chrome

    Hacking the Delicious bookmarking extension for Chrome to fix some annoyances after switching from Firefox.

  138. Google Visualization API: Manchester GTUG Talk

    Presenting on the Google Visualization API at the Manchester Google Technology User Group meetup.

  139. Getting started with Gmail Contextual Gadgets

    Getting started with Gmail contextual gadgets and exploring their developer potential.

  140. Scratching an itch - Magic The Gathering card info

    Scratching an itch by building a quick tool to look up Magic The Gathering card information.

  141. Tarpipe REST connector in 5 minutes

    Demonstrating the new Tarpipe REST connector with a quick five-minute example.

  142. Analysing CV searches with Delicious

    Analysing search terms used to find my online CV using Perl and Delicious.

  143. An HTTP connector for Tarpipe: 'tarbridge'

    Building tarbridge, an HTTP connector for Tarpipe that enables POST requests to arbitrary URLs.

  144. tarpipe.com - Programming 2.0?

    Exploring whether tarpipe.com represents an early example of a Programming 2.0 concept.

  145. Old feed URLs fixed with a bit of mod_rewrite voodoo

    Fixing old feed URLs with some Apache mod_rewrite rules to redirect feed bots to the right place.

  146. OssNoteFix script updated for Greasemonkey 0.6.4 and Firefox 1.5

    Updating my OssNoteFix Greasemonkey script to work with newer versions of Greasemonkey and Firefox.

  147. Turnkey MVS 3.8J on Hercules S/370 Screenshot

    Big iron and retrocomputing.

  148. Hacking the SAP service portal to make OSS notes better

    Deploying Greasemonkey to fix a long standing issue with OSS Notes at SAP.

  149. Ubuntu? Thanks. But no thanks.

    Lots of people seem to be very impressed with Ubuntu, the slick new Linux distro based on Debian, running Gnome.

  150. Postcode bookmarklet

    We’ve been spending time recently looking at property in the North West.

  151. Blosxom entries into MT

    After setting up this blog, it was only natural to bring across my earlier blog posts that were previously served with Blosxom.

  152. NW4, OSS1 and logon group selection for OSS

    Digging into logon group selection.

  153. FOSDEM, and small OSS Notes Browser Hack

    Tomorrow morning I'm off to Brussels for FOSDEM - the Free and Open Source Software Developers' Meeting.

  154. Dashboard as extension to R/3 and SAPGUI client

    How do your users work with SAP data? Exclusively through SAPGUI or with other desktop apps too? If it’s the latter, read on.

  155. Improving the OSS note experience

    How can we make this key service less unpleasant to use?

  156. Google Pocket Guide out now

    My new book for O'Reilly is out.

  157. Dashboard, a compelling articulation for realtime contextual information

    Miguel de Icaza and Nat Friedman were keynoting at OSCON this morning.

  158. New Blosxom plugin 'submission'

    A generic blogging mechanism for accepting content POSTed to it.

  159. Tiki parser for MoinMoin

    Embedding the Tiki language into the MoinMoin wiki.

  160. RSS aggregators and user-agent information for Blagg

    Tool reuse a la Unix philosophy, and more on building out the future in tiny steps.

  161. Tinkering with RSS and NNTP

    The beauty of open standards is that they can be adopted, remixed and combined.

  162. The fragility of retro-engineering

    Having to modify my allconsuming scripts because of differences between amazon.co.uk and amazon.com data.

  163. Transferring my Amazon wishlist to AllConsuming.net

    Scripting to the rescue, as always.

  164. Presentations, Wikis, and Site Navigation

    Why build something when there's already a standard to embrace?

  165. Creating the "Entry index"

    More on building out how my blog looks.

  166. RESTifying RT

    Some notes on providing a RESTful API for Request Tracker.

  167. XML Scripting, data manipulation, and RDF

    Can there be native support for XML as a data type?

  168. Moving between Mozilla tabs with the keyboard

    An answer to my question on keyboard controllable Mozilal features.

  169. Mozilla "Bookmark This Group of Tabs"

    Improving the browsing experience one feature at a time.

  170. Cacheing on XSLT service

    More on the Mozilla sidebar experiments.

  171. Sidebars, Mozilla, RSS: old and new

    RSS, RDF, XUL, XSLT and more.

  172. The OS tables are turning...

    The origins of one of my favourite phrases "Does not work on Windows".

  173. Small Blagg mod to enable custom formatting of 'blaggregated' items

    An unofficial modification to Blagg.

  174. Collapse/Expand feature for my Blaggregated display

    Extending Blagg and related features.

  175. Top tip

    On falling down the stairs.

  176. ETag-enabled wget

    Adding ETag awareness to the venerable wget utility.

  177. The Panopticon

    Extending the Panopticon experiment with XML messaging via Jabber.

  178. Amphetadesk Links

    More on feeds, subscriptions and aggregations.

  179. Mr 80-Percent

    Reflecting on the 80-percent approach to work and why working fewer hours can mean getting more done.

  180. YARM: Yet Another Referers Mechanism

    Referers, backlinks, and the Unix command line.

  181. Calendar code

    The calendar script for my sidebar.

  182. Bring on the SSI

    Server Side Includes and Blosxom.

  183. Blosxom vs the world

    The choice and decision to use specific blogging software.

  184. Blog software review

    More on blogging software.

  185. "Blog Locally, Publish Globally"

    On the enduring pattern of local control but global reach.

  186. My bookmarks

    Scripting with bookmarks.

  187. Off with the (relatively) old, on with the new

    More on Blosxom, and a fix to our colocated server.

  188. Hello Blosxom

    A move to the Blosxom blogging software.

See all tags.