Homebrew has outsourced its gatekeeping to Apple

Most of the casks that disappeared from Homebrew in the last couple of years didn’t go because the software was bad. They went because the author hadn’t paid Apple. That’s not how it’s phrased, anyway. The PR says the cask failed brew audit. The audit flags the binary as unsigned, or signed but not notarised, or signed by a Developer ID that doesn’t match the bundle. The deprecation policy gives the cask a sunset date. From the outside it looks like quality control. From the maintainer’s side, it’s a $99-a-year invoice from Cupertino. ...

Hiding YouTube Shorts on a self-hosted Invidious

I run Invidious on a TrueNAS SCALE box at home. Ads, tracking, the algorithm’s mood swings – none of that gets through. But Shorts still wrecked the subscriptions feed. Half the page was a wall of clips I had no intention of watching. I assumed there’d be a setting. There isn’t. Upstream has three feature requests asking for one (#3920, #4457, #3541) – all closed as “not planned”. The TrueNAS app wraps stock Invidious, so the GUI offers nothing either. ...

Running your own Mastodon instance with Docker Compose

I’ve been running a Mastodon instance for a while now, and every time I set one up from scratch I end up digging through documentation that’s either outdated or assumes you already know what you’re doing. This is the guide I wish I’d had. What you need A server with Docker and Docker Compose installed A domain name that points to your server’s IP address Somewhere to send email (Mailgun, SendGrid, or your own SMTP server) That’s it. No Kubernetes, no systemd fiddling, no compiling from source. ...

What people in their 40s wish they'd known at 25

I was reading through some Reddit threads the other day — you know the ones, where people ask “what do you wish you’d known at 25?” — and I found myself nodding along to a lot of it. There’s something oddly comforting about reading advice from people who actually lived through the decade you’re currently in. Not theorists, not podcasters, just regular folks who figured some stuff out the hard way. ...

WHPH vs Super Productivity

I’ve been trying to figure out which productivity app actually fits my workflow. Both WHPH (Work Hard Play Hard) and Super Productivity keep coming up, so I thought it was worth comparing them properly. WHPH (Work Hard Play Hard) WHPH is a general-purpose productivity app. It does several things: tracks your tasks, monitors which apps you use and for how long, helps you build habits, and gives you a basic sense of where your time goes. The sync between desktop and mobile happens over your local network – no cloud, no account, just devices talking to each other. ...

How to test AA and AAA batteries using a multimeter

I have a drawer full of spare AA and AAA batteries. Some are fresh, some are from remote controls that died last winter, some I found in a toy. Before tossing them or putting them to use, I check the voltage with a multimeter. It takes thirty seconds and saves you from guessing. What you need A cheap multimeter is all you need. Any digital one will do — I’ve used the same £8 model from Amazon for years. The probes should be intact and the battery in the multimeter itself should have charge (if it beeps when you turn it on, you’re good). ...

Iceraven and Ironfox browser comparison

Both are Firefox forks for Android. Both strip out telemetry. They diverge on what to do after that. Iceraven is built around customisation. It exposes about:config, supports a wider range of add-ons than stock Firefox for Android, and tries to replicate the desktop Firefox experience on mobile. Updates come through GitHub releases. It’s aimed at people who want to tweak their browser. IronFox comes from Mull, which itself is a privacy-hardened Firefox fork. It removes more telemetry than Iceraven, disables features that leak data by default (WebGL, for example), and keeps the interface stripped down. It’s on F-Droid and Accrescent as well as GitHub. The trade-off is that some websites break because of the aggressive defaults. ...

Implementing TOGAF using SCRUM methodology

TOGAF is documentation-heavy and linear. Scrum is iterative and lightweight. Running them together means breaking the Architecture Development Method into sprint-sized chunks instead of treating it as a single pass from Phase A to Phase H. Mapping ADM phases to sprints The ADM doesn’t have to run in one direction. You can treat each phase as a backlog item and pull work through in sprints. TOGAF Phase Scrum equivalent Preliminary Sprint 0 — governance, tools, team setup Phase A: Vision Product backlog epics for the EA vision Phases B-D: Business, Data, Application, Technology One domain per sprint Phase E: Opportunities & Solutions Backlog refinement for implementation Phase F: Migration Planning Roadmap prioritisation Phase G: Implementation Delivery sprints Phase H: Change Management Sprint retrospectives Roles The Enterprise Architect maps closest to Product Owner — they prioritise the architecture backlog. The Architecture Board shows up at sprint reviews. The Scrum Master facilitates the process and removes blockers. ...

Starting a new contract — what I wish I'd asked sooner

I’ve been on enough contracts now that I’ve started noticing patterns. Some good, some not so good. This is a collection of the things I check before signing, and the things I wish someone had told me about earlier. Before you sign There are three administrative questions that can catch you out if you don’t sort them early. The first two are about checks — whether the client needs a BPSS or DBS check done, and whether they’re going to organise it. The third is about timing. Some start dates are real, others depend on the client actually getting you a laptop and sorting your access. If their setup process is slow, your start date slides whether they realise it or not. ...

When a Problem Is Worth Solving

I used to take on any project that came my way. That was a mistake. Not every problem deserves your time, and not every client is worth working with. Over the years I’ve learned to filter opportunities through a simple set of questions before committing to anything. Can they fix it themselves? If the answer is yes – or if a decent blog post could solve it – then it’s not a consulting engagement. It’s a homework assignment. The value of consulting lies in the gap between what the client knows and what they need to know. Close that gap and you’ve got nothing to sell. ...

Book Binding

Bookbinding is a hobby I picked up during lockdown. It’s tactile, it’s slow, and the finished object is something you can hold. Here’s what I use. Equipment and materials Glue strips — 50-piece packs of hot melt glue strips (285mm). I’ve ordered these from eBay and AliExpress. They’re cheap and work fine for pamphlet stitching. PVA glue — Artway Strong PVA, 1 litre. White, works on fabric and paper. From Amazon UK. ...

Notes on Personal Finance

I’ve been slowly getting my head around personal finance over the last few years. Nothing dramatic — just trying to understand where money goes, how to save it, and what to do with it once you’ve saved some. Here’s a collection of frameworks, tools, and resources that have helped. Budgeting The first step is knowing what you actually spend. Most people guess and are wrong. Monarch Money – A budgeting app that connects to your accounts and categorises spending automatically. I’ve found it useful for seeing where money leaks out each month. YNAB (You Need A Budget) – The most aggressive budgeting method I’ve tried. Every pound gets assigned a job before you spend it. Steep learning curve but changes how you think about money. PocketGuard – Simpler than YNAB. Tells you how much “spendable” cash you have after bills and savings are accounted for. Google Sheets budget templates – If you prefer manual control, a spreadsheet gives you full visibility without linking bank accounts. Tracking and the Quantified Self Once you’re budgeting, tracking specific metrics helps you see progress. ...

Resources for International Trade in the UK

I’ve been looking into international trade for the UK and collected a few useful resources along the way. Nothing original, just links that might help someone starting out. Training and courses Think Sandwell – International Trade – A Typeform questionnaire from the Think Sandwell programme. Seems aimed at businesses in the West Midlands looking to get into export. Black Country Chamber – International Trade Training – Structured courses on the mechanics of trading internationally. Covers things like documentation, shipping, and compliance. ...

Self-Promotion at Work

Self-promotion gets a bad reputation because people confuse it with boasting. Done well, it’s just making sure the right people know what you’ve done. Use “I” when it’s your work If you led the project, say “I led the project.” Saving “we” for genuinely collaborative work means your individual contributions stand out when they matter. Performance reviews are your moment If your organisation does annual reviews, prepare a list of accomplishments before the meeting. Don’t rely on your manager to remember everything you did over twelve months. ...

Book Publishing Process

The stages of publishing a book, in rough order: Writing — research, drafting, revising until you have a complete manuscript. Editing — developmental editing for structure and narrative, then line editing for prose, then copyediting for grammar and consistency. Proofreading — final pass for typos and formatting errors before anything goes to print. Design — cover design and interior layout (fonts, margins, page breaks). Production — printing or e-book formatting. Offset lithography for large runs, digital printing for shorter ones. Marketing — promotional materials, advertising, media outreach, social media. Distribution — getting the book to readers via publishers, online retailers, bookshops, or direct sales. Writing Start with a concept, do the research, outline the structure, then draft. The first draft doesn’t need to be good — it needs to exist. Revision comes after. Get feedback from beta readers or a critique group before you consider the manuscript finished. ...

'How To Get BIOS Serial Numbers On Linux'

The quickest way to get a BIOS serial number on Linux: sudo dmidecode -s system-serial-number That’s usually all you need. dmidecode reads the DMI/SMBIOS table and prints the serial number directly. Other options If dmidecode isn’t available or doesn’t return what you need: # lshw sudo lshw -C bios | grep serial # /sys class interface (no sudo needed) cat /sys/class/dmi/id/product_serial The /sys/class/dmi/id/ path is the cleanest option if you want to avoid sudo. It exposes several DMI fields: ...

Bathukamma

Bathukamma is a flower festival from Telangana. Women stack seasonal flowers into tiered arrangements, sing songs while dancing around them, and at the end of each day float them in water. It runs for about ten days in the autumn, usually September or October, and coincides with the end of the monsoon when flowers are at their peak. The name comes from “Bathuku Amba” — may she live long — and is directed at Goddess Gauri. It’s not a festival with a single grand ceremony. It’s something that happens in neighbourhoods, courtyards, and public squares across Telangana, with each group making their own arrangement and singing their own songs. ...

The House That Bends

Introduction to Maison Horta Maison Horta is one of those buildings that makes you stop and stare. It’s on a quiet street in Brussels, tucked away behind what looks like an ordinary façade, but step inside and the whole thing opens up into something that feels almost impossible — a house made of curves, light, and ironwork that looks like it’s growing out of the walls. Victor Horta built it in 1893, right at the tail end of what we now call Art Nouveau. The style is easy to recognise: flowing lines, organic shapes, a deliberate break from the stiff, symmetrical architecture that came before it. Horta didn’t just adopt the style — he helped invent it. Maison Horta is his first major work, and it’s still one of the best examples of what Art Nouveau could be. ...

Building a Second Brain

I’ve been reading Tiago Forte’s Building a Second Brain, and it’s one of those books that makes you immediately want to reorganise your entire digital life. The central idea is straightforward enough: your brain is for having ideas, not storing them. Everything else – notes, articles, voice memos, half-finished projects – should live somewhere external that you can trust and search. The framework he proposes is called CODE: Capture, Organise, Distill, Express. It’s simple, and that’s the point. Most people I know (myself included) are terrible at the first two steps. We capture everything – screenshots, highlights, random thoughts – and then we never look at it again because there’s no system for getting it out. ...

Happy fish swimming in a pond with water lilies

Colouring book pictures for toddlers

I spent last weekend trying to find decent colouring pages for my toddler and ended up making my own. The ones you download from the internet are either too fiddly — tiny intricate patterns designed for adults who want to unwind — or they look like they were drawn by someone who has never actually seen a lion. So I generated ten simple pictures. Big outlines, thick lines, nothing that requires a magnifying glass and a steady hand. The idea was that a two-year-old could pick them up, scribble inside the lines if they felt like it, or colour the whole page blue and call it done. Both are valid approaches. ...

Self-hosted services worth running on your homelab

I’ve been running a small homelab for a few years now, mostly just to tinker and escape the subscription treadmill. Over time I’ve collected a bunch of services that actually earn their keep, and this is a running list of the ones I’d recommend to someone starting out or looking to fill gaps in their setup. Nothing fancy. Just stuff that works, runs quietly, and gives you back control of your own data. ...

Shrinking PDFs with Ghostscript on the command line

I needed to shrink a PDF last week — something I don’t do often enough to remember the flags. Ghostscript is the tool, and it’s already on most Linux machines or a quick apt install ghostscript away. The command is: gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \ -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf The bit that actually matters is -dPDFSETTINGS=/screen. That’s the quality dial. /screen gives you the smallest file — fine for emailing or uploading, rubbish if you need to print anything. ...

What I wish someone told me before I started picking stocks to day trade

I spent a few months watching the markets before I actually put money in, and even longer figuring out how to pick stocks without losing my shirt. The internet is full of guides that read like they were written by someone who has never actually placed a trade, so here is what I learned from doing it wrong first. Start by understanding what kind of market you are in This sounds obvious but most people skip it. A stock that works in a bull market will destroy you in a bear one, and the same goes for sideways chop. I used to pick stocks based on their individual merits without checking whether the overall market was even cooperating with me. That changed when I started paying attention to whether the major indices were trending up, down, or just wandering around like they had no idea what to do. ...

The ten ways people try to make money from moving prices

I’ve spent enough time watching people trade to notice that everyone has a style, and most of them picked it without really thinking about why. Trading styles aren’t just technical classifications — they’re reflections of personality, patience, and how much time someone is willing to sacrifice to a screen. Here are the ones I’ve actually seen people use, with a bit of context about what each one demands. Scalping This is the closest thing to gambling with better record-keeping. Scalpers hold positions for seconds, sometimes milliseconds, chasing tiny price movements that add up if you catch enough of them. The math is brutal: one bad trade can wipe out an hour of small wins, and the commission costs eat into margins before you’ve even started. ...

The UK property auction landscape, 2024

I’ve been looking into property auctions in the UK recently, and one thing that struck me is how fragmented the market is. You’ve got the big national names, then regional specialists, and somewhere in between a whole bunch of firms that have been doing this for decades without much publicity. Here’s a list of companies I came across. Some are household names, others you’d only know if you’ve actually sat in an auction room or bid online at 11pm on a Tuesday. ...

The one thing that changed how I negotiate

I used to think negotiation was about persuasion. About having the right words, the right tone, the right strategy. Turns out I was missing the whole point. There’s a concept from negotiation theory called BATNA — Best Alternative to a Negotiated Agreement. It sounds academic, but it’s actually the single most practical thing you can know before walking into any discussion where two people want different things. Your BATNA is what you’d actually do if the talks fall apart. Not what you hope for. Not what sounds good in your head. What you’d realistically do tomorrow morning when nothing has been agreed. ...

Affirmations that actually helped me

I started doing affirmations roughly two years ago, after a particularly rough patch left me convinced I was fundamentally broken. Not in the dramatic sense – just that quiet, persistent voice in the back of my head telling me I wasn’t quite enough. You know the one. The first time I tried it, I felt like an absolute idiot. Standing in front of the mirror, saying “I am worthy” out loud, while my brain screamed bullshit. I lasted about forty-five seconds before giving up. ...

The assets I wish someone had told me about

I spent years thinking about money the wrong way. Not because I was bad with it – I just never had anyone sit me down and explain the actual mechanisms. School taught us about compound interest in the abstract, but never about the vehicles. The things you can actually own that pay you back. This is the list I wish I’d had when I was twenty. Some of these are obvious. Some I only discovered recently and immediately wondered how I’d missed them. A few are borderline absurd but technically valid, which is why they’re here too. ...

How I stopped participating in gossip

I used to gossip. Not the dramatic, scheming kind — just the everyday variety. The “can you believe what so-and-so did” chatter that happens in offices, group chats, and among friends. It felt harmless enough. Social bonding, right? Then I realised something uncomfortable: the people who gossip the most are usually the same people who will gossip about you the moment you leave the room. Once I noticed that pattern, I couldn’t unsee it. And honestly, it made me tired. ...

Reducing negativity in personal and professional life

Some things that help keep negativity at bay: Notice when you’re spiralling. Naming the pattern breaks it. Set boundaries with people who consistently drain you. Limit social media. Curate your feeds so they’re not just outrage and comparison. Take walks. Physical movement changes mental state. Keep a gratitude list. Three things a day is enough. Learn to say no without over-explaining. Don’t participate in gossip. Change the subject or leave the room. Forgive yourself for mistakes. You’ll make more of them. Get enough sleep. Everything feels worse when you’re tired. Do one thing well each day instead of doing ten things poorly. Journal when your head is noisy. Getting thoughts out of your head and onto paper helps. Surround yourself with people who challenge you constructively, not ones who just agree with everything. Accept that some things are out of your control. Focus on what you can influence. Take breaks. Regular ones, not just when you’re burning out. Declutter your workspace. Physical mess feeds mental mess.

How I set up a data pipeline that actually works

I spent three months building a data pipeline last year and another two months fixing the things I got wrong. What follows is the architecture I ended up with, and more importantly the decisions that shaped it. Where the data comes from We pull from three kinds of sources. Internal databases, mostly PostgreSQL instances running on our own infrastructure. Third-party APIs for things we don’t control, like payment providers and analytics platforms. And CSV files that land in an S3 bucket whenever someone exports a report from a legacy system that nobody knows how to update. ...

Shutdown Proxmox VM using CLI

SSH into the Proxmox host and run: qm shutdown <VMID> This sends an ACPI shutdown signal to the guest OS for a graceful shutdown. To find the VM ID: qm list If the VM doesn’t respond to the shutdown signal, force it: qm stop <VMID> qm stop is equivalent to pulling the power cable. Use it only when qm shutdown hangs.

Learn Ansible

Ansible manages remote machines over SSH. No agents needed. You write playbooks in YAML that describe what the target state should be, and Ansible makes it happen. SSH setup Generate a key pair on the control node and copy it to your targets: ssh-keygen -t rsa ssh-copy-id username@target_host Inventory An inventory file lists your hosts and groups them: # my_inventory.ini [web] 192.168.1.2 [db] 192.168.1.3 You can also use dynamic inventory scripts that output JSON. ...

Books that actually helped me with the people side of project management

I spent a chunk of last year reading my way through the soft-skills section of the bookshop. Not because I’d suddenly become interested in personal development — more because I was struggling with a project where the technical bits were fine but everything around it kept falling apart. Miscommunications. Teams that wouldn’t align. Stakeholders who seemed to be operating in a different reality. So I started reading. Not the textbook stuff, but the books people actually recommend when they’re being honest. Here’s what stuck. ...

How to count words in a PDF from the Linux command line

The simplest approach: pdftotext input.pdf - | wc -w pdftotext is in the poppler-utils package (sudo apt install poppler-utils or sudo yum install poppler-utils). The - sends output to stdout instead of a file. Other options pdfminer: pdf2txt.py input.pdf | wc -w Install with pip install pdfminer.six. Python with PyPDF2: import PyPDF2 with open("input.pdf", "rb") as f: reader = PyPDF2.PdfReader(f) total = sum(len(page.extract_text().split()) for page in reader.pages) print(total) Note: PyPDF2’s PdfFileReader and getPage() are deprecated in newer versions — use PdfReader and index into reader.pages instead. ...

Install psql on macOS with Homebrew

brew install libpq brew link --force libpq psql --version libpq includes psql and other PostgreSQL client utilities. The brew link --force step symlinks the binaries into your PATH so psql is available from any terminal. If you don’t have Homebrew installed yet: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

How to avoid other pods from being scheduled on your node in Kubernetes

Taints on nodes repel pods. Tolerations on pods let them ignore specific taints. Together they give you control over scheduling. Taint effects NoSchedule — pods without a matching toleration won’t be scheduled on the node. PreferNoSchedule — the scheduler avoids the node but will use it if there’s nowhere else. NoExecute — pods without a matching toleration are evicted and won’t be rescheduled there. Applying a taint kubectl taint nodes node1 type=db:NoSchedule This prevents any pod from being scheduled on node1 unless it has a toleration for type=db. ...

Security Clearance Vetting for Access to Cloud Production Environments

Access to cloud production environments should require security clearance vetting. Production systems hold live data and applications, and the consequences of compromise are direct. UK clearance levels Level What it covers Checks included BPSS Pre-employment screening for government asset access Identity, employment history, immigration status, unspent criminal record AC Unescorted access to UK airport security areas Identity, employment history, criminal record, government agency records CTC / Level 1B UK OFFICIAL assets, occasional SECRET access Identity, employment, criminal record, financial situation, personal circumstances SC Substantial unsupervised SECRET access Everything in CTC plus credit reference and MI5 record checks DV Substantial unsupervised TOP SECRET access Everything in SC plus detailed interview and referee enquiries The process You need a sponsor — usually HR or a company security controller. They confirm your role requires vetting and that BPSS checks are complete (unless you’re doing AC). You then fill out a security questionnaire online covering personal details, employment history, finances, criminal record, foreign travel, and contacts. ...

Kubernetes Tolerations

Taints and tolerations work together to control which pods land on which nodes. Taints go on nodes and repel pods. Tolerations go on pods and let them ignore specific taints. Taint effects There are three effects: NoSchedule — pods without a matching toleration won’t be scheduled on the node. Existing pods are unaffected. PreferNoSchedule — the scheduler avoids the node but will use it if there’s nowhere else. NoExecute — pods without a matching toleration are evicted from the node and won’t be rescheduled there. Applying taints # Add a taint kubectl taint nodes node1 example-key=example-value:NoSchedule # Remove a taint kubectl taint nodes node1 example-key=example-value:NoSchedule- # Multiple taints at once kubectl taint nodes node1 key1=value1:NoSchedule key2=value2:PreferNoSchedule View taints on a node: ...

A list of emotions I keep coming back to

I started keeping a list of emotions because I realised I didn’t have names for half the things I was feeling. Not clinical names — just everyday words that would let me say “I’m feeling X” instead of “I don’t know what’s wrong but something is.” It sounds simple, but most people never build that vocabulary. We grow up with maybe twenty or thirty emotion words and then we just reuse them forever. Happy, sad, angry, stressed. That’s it. When something more specific comes up — like the particular flavour of disappointment you get when someone forgets your birthday but you pretend it didn’t matter — you don’t have a word for it. So you just sit with it, unnamed, and it gets heavier. ...

How to make a vision board (that you'll actually use)

I’ve tried vision boards before. Like most people, I made a nice collage, pinned it somewhere visible, and then promptly forgot it existed. The problem wasn’t the board — it was that I never actually sat down and thought about what I wanted. I just pasted random pictures of beaches and sports cars and called it a day. This time I wanted to do it properly. Not the Pinterest aesthetic kind, but the kind where you actually force yourself to decide what matters across different areas of your life. So I built a markdown template instead. It’s simpler, it lives in my notes, and it forces structure onto the chaos. ...

What is a vision board

A vision board is a collage of images and words that represent what you want to achieve. The idea is that seeing your goals visually keeps them in focus and motivates action. You can make one physically with printed images and a pinboard, or digitally with tools like Canva or Pinterest. It works for short-term targets as well as longer aspirations. Sources: Oxford Dictionaries: http://www.oxforddictionaries.com/definition/vision_board Psychology Today: https://www.psychologytoday.com/us/blog/click-here-happiness/202103/what-is-vision-board-and-why-make-one

Inner child therapy

Inner child therapy works from the idea that parts of us retain the emotions, memories, and needs from childhood. If those needs went unmet, they can shape how we think and behave as adults. The therapy aims to identify those old wounds, give them space to be expressed, and respond to them with the compassion they didn’t receive originally. Techniques include guided imagery, journaling, letter writing to your younger self, and dialogue exercises. ...

Remove lines matching a pattern from files recursively in Linux

find . -name "*.md" -type f -exec sed -i '/pattern/d' {} \; This one-liner walks the directory tree, finds every .md file, and strips out any line that matches the given pattern. The sed -i edits each file in place, and the {} gets swapped out for whatever path find hands it. Breaking it down find . -name "*.md" -type f does the walking. The -type f bit is important – without it, find would also match directories and pass them to sed, which would error out. The -exec ... \; at the end runs the command for each file individually. ...

Installing PhantomJS on Ubuntu 22.10

PhantomJS is a headless browser, which means it runs without a graphical interface and lets you automate web page interactions through scripting. I needed it for some automated testing at work and ran into a few things worth writing down, mostly because half the guides out there are either outdated or assume you already know what you’re doing. The version we’re installing is 2.1.1, which is the last release. The project has been unmaintained since 2017, but it still does what it needs to do for basic scraping and screenshot tasks. ...

Deleting files by content match in Linux

There are two ways to interpret this question, and the answer changes completely depending on which one you mean. Deleting files by filename If you want to nuke every file whose name contains a particular string: find . -type f -name '*string*' -delete The -type f keeps it from touching directories. The -delete flag removes whatever find matches. Simple enough. A word of caution: test without -delete first. Run the same command and replace it with -print to see what would actually get deleted. I’ve lost files to typos in wildcard patterns more times than I care to admit. ...

What DevOps Collaboration Actually Looks Like

I spent years watching development and operations teams sit on opposite sides of every incident. Developers pushed code over the wall. Operations inherited the fires. DevOps was supposed to fix that, but most teams just gave it a new name and kept doing the same thing. Real collaboration isn’t a poster on the breakroom wall. It’s the unglamorous daily work of making sure two groups who think differently about problems end up solving them together. ...

Memento Mori

Memento Mori – remember you must die. The oldest trick in the Stoic toolbox, and still the one that cuts deepest when you actually let it land. It’s not meant to be morbid. The point isn’t to sit around thinking about corpses, it’s to use the fact of your mortality as a filter for what actually matters. You could leave life right now – not today necessarily, but at some point, and probably sooner than you think. Knowing that changes the weight of things. Most of the stuff you’re worrying about right now will not matter in a year, let alone at the end. That’s not depressing, it’s liberating. ...

Amor Fati

Amor fati – love of one’s fate. Nietzsche’s phrase for the attitude that everything that happens to you, including the awful bits, is not just bearable but necessary, and ideally something you can welcome rather than merely endure. I keep coming back to it because it’s the harder half of the Stoic pair. Memento Mori tells you to remember you will die, which is useful for cutting through nonsense. Amor Fati tells you to love what happens to you, which is useful for not going mad while it’s happening. One without the other feels incomplete – mortality without fate is just anxiety, and fate without mortality is just fatalism. ...

A bit of madness goes a long way

You don’t have to be crazy to live on Earth. But to some it helps to be. I saw this somewhere and it stuck because it is quietly true in a way that has nothing to do with clinical anything and everything to do with the simple fact that normal is a setting on a washing machine, not a lifestyle. The people who get anywhere – not necessarily successfully, just somewhere worth being – are the ones who are slightly unhinged about something. Obsessed in a way that makes other people uncomfortable. Willing to look foolish because the alternative is looking exactly like everyone else and going exactly where everyone else is going. ...

How to Resolve "Cannot Unregister the Machine While It Is Locked" Error in Vagrant

Running vagrant destroy sometimes fails with: VBoxManage: error: Cannot unregister the machine 'CnC_default_1643660523119_45689' while it is locked The VM is locked because a VirtualBox process is still holding onto it. Kill the headless process and try again: killall -9 VBoxHeadless && vagrant destroy killall -9 VBoxHeadless force-kills any running VirtualBox headless instances. The && runs vagrant destroy only if that succeeds.

Grabbing an SSL certificate from a remote server

There are moments when you need to inspect the certificate a remote server is presenting – maybe it’s expired and you’re trying to work out why things are breaking, or maybe you need the raw certificate data for some other reason and don’t have access to the server’s configuration. The quickest way is with openssl s_client: openssl s_client -connect {HOSTNAME}:{PORT} -showcerts Replace {HOSTNAME} with the server address and {PORT} with the port (usually 443 for HTTPS). The -showcerts flag dumps the full certificate chain rather than just the leaf certificate. ...

No good deed ever goes unpunished

“No good deed ever goes unpunished.” I’ve said this more times than I care to admit, usually in the aftermath of trying to help someone and ending up with more problems than I started with. It’s a peculiar thing – the people you’d expect to be grateful are often the ones who punish you most for trying. I think about my parents sometimes, how every time I offer to sort something out or take on a burden, it somehow spirals into getting used. The intention is never in doubt but the outcome always ends up feeling used. ...

The advantages you've had

“Whenever you feel like criticizing any one, just remember that all the people in this world haven’t had the advantages that you’ve had.” – F. Scott Fitzgerald, The Great Gatsby I read this somewhere and it stuck with me because it’s true in a way that feels obvious until you actually try to live by it, and even then it’s hard. We all have advantages we never asked for and rarely notice – the kind of things that just make life slightly easier, like being born into a family that didn’t struggle to put food on the table, or having parents who went to university and could help you with homework without feeling lost themselves, or arriving in a country where you speak the language and look like most of the people around you. None of these things were earned. They just happened. And they add up in ways that are impossible to quantify but impossible to ignore. ...

Replace all dots in filenames except the extension on Linux

Had a directory full of files with dots in the names and needed them all cleaned up. Something like my.report.final.pdf should become my_report_final.pdf, not my_report_final..pdf or worse. This one-liner does the job: for f in *; do pre="${f%.*}"; suf="${f##*.}"; mv -i -- "$f" "${pre//./_}.${suf}"; done Here’s what each part does. ${f%.*} strips everything from the last dot onwards, giving you the filename without its extension. ${f##*.} grabs just the extension by stripping everything up to and including the final dot. Then ${pre//./_} replaces every dot in the base name with an underscore. ...

Count directories in the current folder with a one-liner

A common question that comes up when you’re first getting comfortable with the command line: how do you count just the directories in your current folder? The quick answer is: ls -1 | wc -l This pipes a one-per-line listing of everything in the current directory into wc -l, which counts lines. Simple enough. But there’s a catch. This counts everything – files, symlinks, hidden items, the lot. If you only want directories, you need to be a bit more selective. ...

Count files in a directory with a one-liner

Another quick command line question: how do you count just the files in a directory, excluding subdirectories and other stuff? The classic answer: ls -l . | egrep -c '^-' This lists everything in long format (ls -l), then counts lines that start with a hyphen – which is how ls marks regular files. Directories show up as d, symlinks as l, and so on, so the regex filters them out. It works, but it’s a bit of a trick and relies on understanding ls output format. A more straightforward approach uses find: ...

'Installing Multiple PHP Versions on Debian 9'

Sometimes you need more than one PHP version on the same server. Maybe an old project still runs on 5.6, another one needs 7.2, and you want to test something on 7.4 before committing. Debian’s default repositories only ship one version, so you need a third-party source. The Sury repository is the standard way to get multiple PHP versions on Debian. Ondrej Surý has maintained it for years and it’s trusted by most people running PHP on Debian. ...

Fix casks with `depends_on` that reference pre-Mavericks

If you get an error like Error: Cask 'hex-fiend-beta' definition is invalid: invalid 'depends_on macos' value: ":lion", where hex-fiend-beta can be any cask name and :lion any macOS release name, run the following command: /usr/bin/find "$(brew --prefix)/Caskroom/"*'/.metadata' -type f -name '*.rb' -print0 | /usr/bin/xargs -0 /usr/bin/perl -i -pe 's/depends_on macos: \[.*?\]//gsm;s/depends_on macos: .*//g' This strips out all depends_on macos references from installed casks. It’s a blunt instrument – you’re editing Homebrew’s metadata files directly – but it gets things working again. ...

How to run VLC player as root user

I ran into this a while back when I needed VLC running as root on a headless server, and the usual --no-sandbox flag didn’t cut it. VLC refuses to start as root by default, which makes sense from a security standpoint but is annoying when you actually need it. The fix is brutal and hacky, but it works: sed -i 's/geteuid/getppid/' /usr/bin/vlc What’s actually happening here? VLC’s startup script checks whether the effective user ID is zero (root). If it is, it bails out. By swapping geteuid with getppid, we’re telling the script to check the parent process ID instead of the effective UID. Since getppid() returns a number way bigger than zero, the check passes and VLC starts. ...

A lawyer's Christmas greeting

Please accept with no obligation, implied or implicit, my best wishes for an environmentally conscious, socially responsible, low-stress, non-addictive, gender-neutral celebration of the winter solstice holiday, practiced within the most enjoyable traditions of the religious persuasion of your choice, or secular practices of your choice, with respect for the religious/secular persuasions and/or traditions of others, or their choice not to practice religious or secular traditions at all… and a fiscally successful, personally fulfilling, and medically uncomplicated recognition of the onset of the generally accepted calendar year 2019, but not without due respect for the calendars of choice of other cultures whose contributions to society have helped make the United Kingdom great (not to imply that the United Kingdom is necessarily greater than any other country or is the only “United Kingdom” in the Northern hemisphere), and without regard to the race, creed, colour, age, physical ability, religious faith, or sexual orientation of the wishee. ...

List all Azure VM extensions

az vm extension image list [ { "name": "AcronisBackup", "publisher": "Acronis.Backup", "version": "1.0.33" }, { "name": "AcronisBackupLinux", "publisher": "Acronis.Backup", "version": "1.0.33" }, { "name": "AlertLogicLM", "publisher": "alertlogic", "version": "1.3.0.1" }, { "name": "AlertLogicLM", "publisher": "AlertLogic.Extension", "version": "1.3.0.0" }, { "name": "AlertLogicLM", "publisher": "AlertLogic.Extension", "version": "1.4.0.0" }, { "name": "AlertLogicLM", "publisher": "AlertLogic.Extension", "version": "1.9.0.0" }, { "name": "AlertLogicLM", "publisher": "AlertLogic.Extension", "version": "1.9.1.0" }, { "name": "AgentWinExt", "publisher": "bmc.ctm", "version": "9.0.0.1" }, { "name": "ChefClient", "publisher": "Chef.Bootstrap.WindowsAzure", "version": "11.18.6.2" }, { "name": "ChefClient", "publisher": "Chef.Bootstrap.WindowsAzure", "version": "1207.12.3.0" }, { "name": "ChefClient", "publisher": "Chef.Bootstrap.WindowsAzure", "version": "1210.12.109.1004" }, { "name": "ChefClient", "publisher": "Chef.Bootstrap.WindowsAzure", "version": "1210.12.109.1005" }, { "name": "ChefClient", "publisher": "Chef.Bootstrap.WindowsAzure", "version": "1210.12.110.1000" }, { "name": "ChefClient", "publisher": "Chef.Bootstrap.WindowsAzure", "version": "1210.12.110.1001" }, { "name": "LinuxChefClient", "publisher": "Chef.Bootstrap.WindowsAzure", "version": "11.18.6.2" }, { "name": "LinuxChefClient", "publisher": "Chef.Bootstrap.WindowsAzure", "version": "1207.12.3.0" }, { "name": "LinuxChefClient", "publisher": "Chef.Bootstrap.WindowsAzure", "version": "1210.12.109.1004" }, { "name": "LinuxChefClient", "publisher": "Chef.Bootstrap.WindowsAzure", "version": "1210.12.110.1000" }, { "name": "LinuxChefClient", "publisher": "Chef.Bootstrap.WindowsAzure", "version": "1210.12.110.1001" }, { "name": "CloudLinkSecureVMLinuxAgent", "publisher": "CloudLinkEMC.SecureVM", "version": "5.0.22503.21808" }, { "name": "CloudLinkSecureVMLinuxAgent", "publisher": "CloudLinkEMC.SecureVM", "version": "5.5.23389.23430" }, { "name": "CloudLinkSecureVMLinuxAgent", "publisher": "CloudLinkEMC.SecureVM", "version": "6.0.62.0" }, { "name": "CloudLinkSecureVMWindowsAgent", "publisher": "CloudLinkEMC.SecureVM", "version": "5.5.6.23416" }, { "name": "CloudLinkSecureVMWindowsAgent", "publisher": "CloudLinkEMC.SecureVM", "version": "6.0.66.0" }, { "name": "CloudLinkSecureVMWindowsAgent", "publisher": "CloudLinkEMC.SecureVM", "version": "6.5.69.0" }, { "name": "ConferForAzure", "publisher": "Confer", "version": "1.0.5.38" }, { "name": "ConferForAzure", "publisher": "Confer", "version": "1.0.5.39" }, { "name": "ConferForAzure", "publisher": "Confer", "version": "1.0.5.40" }, { "name": "BmcCtmAgentLinux", "publisher": "ctm.bmc.com", "version": "9.0.0.1" }, { "name": "DatadogLinuxAgent", "publisher": "Datadog.Agent", "version": "0.4" }, { "name": "DatadogLinuxAgent", "publisher": "Datadog.Agent", "version": "0.6.1" }, { "name": "DatadogLinuxAgent", "publisher": "Datadog.Agent", "version": "0.6.2" }, { "name": "DatadogWindowsAgent", "publisher": "Datadog.Agent", "version": "0.4.1" }, { "name": "DatadogWindowsAgent", "publisher": "Datadog.Agent", "version": "0.5" }, { "name": "DatadogWindowsAgent", "publisher": "Datadog.Agent", "version": "0.5.2" }, { "name": "DatadogWindowsAgent", "publisher": "Datadog.Agent", "version": "0.6.0" }, { "name": "dtmanaged", "publisher": "dynatrace.ruxit", "version": "1.4.0.11" }, { "name": "dtmanaged", "publisher": "dynatrace.ruxit", "version": "1.4.0.13" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "1.150.0.0" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "1.151.0.1" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "1.151.0.2" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "1.99.1.2" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "1.99.2.0" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "1.99.2.1" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "2.2.0.0" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "2.2.0.1" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "2.2.0.2" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "2.3.0.0" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "2.3.0.1" }, { "name": "oneAgentLinux", "publisher": "dynatrace.ruxit", "version": "2.3.0.2" }, { "name": "oneAgentManagedWindows", "publisher": "dynatrace.ruxit", "version": "1.0.0.4" }, { "name": "oneAgentWindows", "publisher": "dynatrace.ruxit", "version": "1.150.0.0" }, { "name": "oneAgentWindows", "publisher": "dynatrace.ruxit", "version": "1.150.0.1" }, { "name": "oneAgentWindows", "publisher": "dynatrace.ruxit", "version": "1.151.0.2" }, { "name": "oneAgentWindows", "publisher": "dynatrace.ruxit", "version": "1.99.1.1" }, { "name": "oneAgentWindows", "publisher": "dynatrace.ruxit", "version": "1.99.1.2" }, { "name": "oneAgentWindows", "publisher": "dynatrace.ruxit", "version": "1.99.1.3" }, { "name": "oneAgentWindows", "publisher": "dynatrace.ruxit", "version": "2.2.0.0" }, { "name": "oneAgentWindows", "publisher": "dynatrace.ruxit", "version": "2.2.0.1" }, { "name": "oneAgentWindows", "publisher": "dynatrace.ruxit", "version": "2.2.0.2" }, { "name": "oneAgentWindows", "publisher": "dynatrace.ruxit", "version": "2.3.0.2" }, { "name": "FileSecurity", "publisher": "ESET", "version": "6.5.12010.1000" }, { "name": "FileSecurity", "publisher": "ESET", "version": "6.5.12014.1002" }, { "name": "FileSecurity", "publisher": "ESET", "version": "7.0.12014.1002" }, { "name": "ProtectVClientLinuxExtension", "publisher": "Gemalto.SafeNet.ProtectV", "version": "3.0.0.205" }, { "name": "ProtectVClientWindowsExtension", "publisher": "Gemalto.SafeNet.ProtectV", "version": "3.0.0.318" }, { "name": "DotnetAgent", "publisher": "HPE.Security.ApplicationDefender", "version": "1.0.0.2" }, { "name": "DotnetAgent", "publisher": "HPE.Security.ApplicationDefender", "version": "1.0.0.4" }, { "name": "DotnetAgent", "publisher": "HPE.Security.ApplicationDefender", "version": "1.6.13.0" }, { "name": "DotnetAgent", "publisher": "HPE.Security.ApplicationDefender", "version": "1.6.14.0" }, { "name": "DotnetAgent", "publisher": "HPE.Security.ApplicationDefender", "version": "1.6.9.0" }, { "name": "KESL", "publisher": "KasperskyLab.SecurityAgent", "version": "1.0.0.0" }, { "name": "KSWS", "publisher": "KasperskyLab.SecurityAgent", "version": "1.0.0.0" }, { "name": "McAfeeEndpointSecurity", "publisher": "McAfee.EndpointSecurity", "version": "6.0" }, { "name": "Compute.AKS-Engine.Linux.Billing", "publisher": "Microsoft.AKS", "version": "1.0.0" }, { "name": "AADLoginForWindows", "publisher": "Microsoft.Azure.ActiveDirectory", "version": "0.3.0.0" }, { "name": "AADLoginForWindows", "publisher": "Microsoft.Azure.ActiveDirectory", "version": "0.3.1.0" }, { "name": "AADLoginForLinux", "publisher": "Microsoft.Azure.ActiveDirectory.LinuxSSH", "version": "1.0.4870001" }, { "name": "AADLoginForLinux", "publisher": "Microsoft.Azure.ActiveDirectory.LinuxSSH", "version": "1.0.4890001" }, { "name": "AADLoginForLinux", "publisher": "Microsoft.Azure.ActiveDirectory.LinuxSSH", "version": "1.0.5160001" }, { "name": "AADLoginForLinux", "publisher": "Microsoft.Azure.ActiveDirectory.LinuxSSH", "version": "1.0.5920001" }, { "name": "AADLoginForLinux", "publisher": "Microsoft.Azure.ActiveDirectory.LinuxSSH", "version": "1.0.6350001" }, { "name": "AADLoginForLinux", "publisher": "Microsoft.Azure.ActiveDirectory.LinuxSSH", "version": "1.0.6430001" }, { "name": "IaaS47C6E03DTest", "publisher": "Microsoft.Azure.Applications", "version": "1.0.0.3" }, { "name": "MyBackupTest", "publisher": "Microsoft.Azure.Backup.Test", "version": "1.0.116.0" }, { "name": "MyBackupTest", "publisher": "Microsoft.Azure.Backup.Test", "version": "1.0.117.0" }, { "name": "MyBackupTest", "publisher": "Microsoft.Azure.Backup.Test", "version": "1.0.118.0" }, { "name": "MyBackupTest", "publisher": "Microsoft.Azure.Backup.Test", "version": "1.0.121.0" }, { "name": "MyBackupTest", "publisher": "Microsoft.Azure.Backup.Test", "version": "1.0.124.0" }, { "name": "MyBackupTest", "publisher": "Microsoft.Azure.Backup.Test", "version": "1.0.125.0" }, { "name": "Compute.AKS-Engine.Windows.Billing", "publisher": "Microsoft.AKS", "version": "1.0.0" }, { "name": "MyBackupTestLinuxInt", "publisher": "Microsoft.Azure.Backup.Test", "version": "1.0.9142.0" }, { "name": "MyBackupTestLinuxInt", "publisher": "Microsoft.Azure.Backup.Test", "version": "1.0.9143.0" }, { "name": "MyBackupTestLinuxInt", "publisher": "Microsoft.Azure.Backup.Test", "version": "1.0.9144.0" }, { "name": "MyBackupTestLinuxInt", "publisher": "Microsoft.Azure.Backup.Test", "version": "1.0.9147.0" }, { "name": "Compute.AKS.Linux.Billing", "publisher": "Microsoft.AKS", "version": "1.0.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.1.0.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.10.0.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.10.0.1" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.10.1.1" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.11.0.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.11.1.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.11.2.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.11.3.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.11.3.1" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.11.3.10" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.11.3.12" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.11.3.5" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.11.3.7" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.11.3.9" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.12.0.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.12.1.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.2.0.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.3.1.6" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.4.2.1" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.5.9.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.6.2.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.6.3.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.6.4.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.7.1.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.7.3.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.7.4.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.8.0.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.8.1.0" }, { "name": "IaaSDiagnostics", "publisher": "Microsoft.Azure.Diagnostics", "version": "1.9.0.0" }, { "name": "Compute.AKS.Windows.Billing", "publisher": "Microsoft.AKS", "version": "1.0.0" }, { "name": "CustomScript", "publisher": "Microsoft.Azure.Extensions", "version": "2.0.0" }, { "name": "CustomScript", "publisher": "Microsoft.Azure.Extensions", "version": "2.0.1" }, { "name": "CustomScript", "publisher": "Microsoft.Azure.Extensions", "version": "2.0.2" }, { "name": "CustomScript", "publisher": "Microsoft.Azure.Extensions", "version": "2.0.3" }, { "name": "CustomScript", "publisher": "Microsoft.Azure.Extensions", "version": "2.0.4" }, { "name": "CustomScript", "publisher": "Microsoft.Azure.Extensions", "version": "2.0.5" }, { "name": "CustomScript", "publisher": "Microsoft.Azure.Extensions", "version": "2.0.6" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.Azure.Diagnostics", "version": "3.0.101" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.Azure.Diagnostics", "version": "3.0.103" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.Azure.Diagnostics", "version": "3.0.107" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.Azure.Diagnostics", "version": "3.0.109" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.Azure.Diagnostics", "version": "3.0.111" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.Azure.Diagnostics", "version": "3.0.113" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.Azure.Diagnostics", "version": "3.0.115" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.Azure.Diagnostics", "version": "3.0.117" }, { "name": "GenevaMonitoring", "publisher": "Microsoft.Azure.Geneva", "version": "1.0.0.3" }, { "name": "GenevaMonitoring", "publisher": "Microsoft.Azure.Geneva", "version": "1.0.0.6" }, { "name": "GenevaMonitoring", "publisher": "Microsoft.Azure.Geneva", "version": "1.0.0.8" }, { "name": "GenevaMonitoring", "publisher": "Microsoft.Azure.Geneva", "version": "1.8.0.2" }, { "name": "GenevaMonitoring", "publisher": "Microsoft.Azure.Geneva", "version": "1.8.0.3" }, { "name": "KeyVaultForWindows", "publisher": "Microsoft.Azure.KeyVault", "version": "0.1.0.717" }, { "name": "KeyVaultForWindows", "publisher": "Microsoft.Azure.KeyVault", "version": "0.2.0.898" }, { "name": "DockerExtension", "publisher": "Microsoft.Azure.Extensions", "version": "1.0.1512030601" }, { "name": "DockerExtension", "publisher": "Microsoft.Azure.Extensions", "version": "1.1.1512090359" }, { "name": "DockerExtension", "publisher": "Microsoft.Azure.Extensions", "version": "1.1.1512180541" }, { "name": "DockerExtension", "publisher": "Microsoft.Azure.Extensions", "version": "1.1.1601070410" }, { "name": "DockerExtension", "publisher": "Microsoft.Azure.Extensions", "version": "1.1.1601140348" }, { "name": "DockerExtension", "publisher": "Microsoft.Azure.Extensions", "version": "1.1.1602270800" }, { "name": "DockerExtension", "publisher": "Microsoft.Azure.Extensions", "version": "1.1.1604142300" }, { "name": "DockerExtension", "publisher": "Microsoft.Azure.Extensions", "version": "1.1.1606092330" }, { "name": "DockerExtension", "publisher": "Microsoft.Azure.Extensions", "version": "1.2.0" }, { "name": "DockerExtension", "publisher": "Microsoft.Azure.Extensions", "version": "1.2.2" }, { "name": "KeyVaultForWindows", "publisher": "Microsoft.Azure.KeyVault.Edp", "version": "0.0.0.705" }, { "name": "KeyVaultForWindows", "publisher": "Microsoft.Azure.KeyVault.Edp", "version": "0.0.0.867" }, { "name": "KeyVaultForWindows", "publisher": "Microsoft.Azure.KeyVault.Edp", "version": "0.0.0.887" }, { "name": "FixEmulatedIO", "publisher": "Microsoft.Azure.Extensions", "version": "1.0.0" }, { "name": "AquariusLinux", "publisher": "Microsoft.Azure.Networking.SDN", "version": "1.4.0.0" }, { "name": "AquariusLinux", "publisher": "Microsoft.Azure.Networking.SDN", "version": "1.5.0.0" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.1.0.886" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.2.0.1001" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.2.1.1014" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.3.0.1058" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.4.0.1112" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.4.1.1134" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.4.2.1150" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.5.0.1174" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.5.1.1204" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.6.2.1366" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.7.1.1416" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.7.3.1475" }, { "name": "DependencyAgentLinux", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.7.4.3150" }, { "name": "NetworkWatcherAgentLinux", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.105.0" }, { "name": "NetworkWatcherAgentLinux", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.306.5" }, { "name": "NetworkWatcherAgentLinux", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.411.1" }, { "name": "NetworkWatcherAgentLinux", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.466.1" }, { "name": "NetworkWatcherAgentLinux", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.493.1" }, { "name": "NetworkWatcherAgentLinux", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.518.1" }, { "name": "NetworkWatcherAgentLinux", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.526.2" }, { "name": "NetworkWatcherAgentLinux", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.585.2" }, { "name": "NetworkWatcherAgentLinux", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.861.1" }, { "name": "NetworkWatcherAgentLinux", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.861.2" }, { "name": "FixLinuxDiagnostic", "publisher": "Microsoft.Azure.Extensions", "version": "1.0.0" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.1.0.886" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.2.0.1001" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.2.1.1014" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.3.0.1058" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.4.0.1112" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.4.1.1134" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.5.0.1174" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.6.2.1366" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.7.1.1416" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.7.3.1475" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.7.4.3150" }, { "name": "DependencyAgentWindows", "publisher": "Microsoft.Azure.Monitoring.DependencyAgent", "version": "9.7.5.3590" }, { "name": "NetworkWatcherAgentWindows", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.104.0" }, { "name": "NetworkWatcherAgentWindows", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.306.5" }, { "name": "NetworkWatcherAgentWindows", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.411.1" }, { "name": "NetworkWatcherAgentWindows", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.466.1" }, { "name": "NetworkWatcherAgentWindows", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.493.1" }, { "name": "NetworkWatcherAgentWindows", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.518.1" }, { "name": "NetworkWatcherAgentWindows", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.526.2" }, { "name": "NetworkWatcherAgentWindows", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.585.2" }, { "name": "NetworkWatcherAgentWindows", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.861.1" }, { "name": "NetworkWatcherAgentWindows", "publisher": "Microsoft.Azure.NetworkWatcher", "version": "1.4.861.2" }, { "name": "AzurePerformanceDiagnostics", "publisher": "Microsoft.Azure.Performance.Diagnostics", "version": "1.0.1" }, { "name": "AzurePerformanceDiagnostics", "publisher": "Microsoft.Azure.Performance.Diagnostics", "version": "1.0.10" }, { "name": "AzurePerformanceDiagnostics", "publisher": "Microsoft.Azure.Performance.Diagnostics", "version": "1.0.11" }, { "name": "AzurePerformanceDiagnostics", "publisher": "Microsoft.Azure.Performance.Diagnostics", "version": "1.0.12" }, { "name": "AzurePerformanceDiagnostics", "publisher": "Microsoft.Azure.Performance.Diagnostics", "version": "1.0.2" }, { "name": "AzurePerformanceDiagnostics", "publisher": "Microsoft.Azure.Performance.Diagnostics", "version": "1.0.5" }, { "name": "AzurePerformanceDiagnostics", "publisher": "Microsoft.Azure.Performance.Diagnostics", "version": "1.0.6" }, { "name": "AzurePerformanceDiagnostics", "publisher": "Microsoft.Azure.Performance.Diagnostics", "version": "1.0.7" }, { "name": "AzurePerformanceDiagnostics", "publisher": "Microsoft.Azure.Performance.Diagnostics", "version": "1.0.8" }, { "name": "AzurePerformanceDiagnostics", "publisher": "Microsoft.Azure.Performance.Diagnostics", "version": "1.0.9" }, { "name": "LinuxAsm", "publisher": "Microsoft.Azure.Extensions", "version": "2.0.1" }, { "name": "LinuxAsm", "publisher": "Microsoft.Azure.Extensions", "version": "2.1.0" }, { "name": "LinuxAsm", "publisher": "Microsoft.Azure.Extensions", "version": "2.1.1" }, { "name": "LinuxAsm", "publisher": "Microsoft.Azure.Extensions", "version": "2.2.0" }, { "name": "LinuxAsm", "publisher": "Microsoft.Azure.Extensions", "version": "2.2.1" }, { "name": "LinuxAsm", "publisher": "Microsoft.Azure.Extensions", "version": "2.2.2" }, { "name": "LinuxAsm", "publisher": "Microsoft.Azure.Extensions", "version": "2.2.3" }, { "name": "LinuxAsm", "publisher": "Microsoft.Azure.Extensions", "version": "2.2.4" }, { "name": "LinuxAsm", "publisher": "Microsoft.Azure.Extensions", "version": "2.2.5" }, { "name": "VMSnapshot", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.40.0" }, { "name": "VMSnapshot", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.42.0" }, { "name": "VMSnapshot", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.43.0" }, { "name": "VMSnapshot", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.46.0" }, { "name": "VMSnapshot", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.47.0" }, { "name": "VMSnapshot", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.49.0" }, { "name": "VMSnapshot", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.53.0" }, { "name": "VMSnapshot", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.54.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9124.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9125.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9126.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9127.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9128.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9131.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9133.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9134.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9135.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9136.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9137.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9140.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9141.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9142.0" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices", "version": "1.0.9143.0" }, { "name": "VMSnapshot", "publisher": "Microsoft.Azure.RecoveryServices.Edp", "version": "1.0.39.0" }, { "name": "Linux", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9102" }, { "name": "Linux", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9103" }, { "name": "Linux", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9104" }, { "name": "Linux", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9106" }, { "name": "Linux", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9107" }, { "name": "LinuxDEBIAN7", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9102" }, { "name": "LinuxDEBIAN7", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9103" }, { "name": "LinuxDEBIAN7", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9104" }, { "name": "LinuxDEBIAN7", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9106" }, { "name": "AzureBackupLinuxWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.0.0.1" }, { "name": "AzureBackupLinuxWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.0.0.10" }, { "name": "AzureBackupLinuxWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.0.0.12" }, { "name": "AzureBackupLinuxWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.0.0.4" }, { "name": "AzureBackupLinuxWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.0.0.5" }, { "name": "AzureBackupLinuxWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.0.0.6" }, { "name": "AzureBackupLinuxWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.0.0.9" }, { "name": "VMSnapshotLinux", "publisher": "Microsoft.Azure.RecoveryServices.Edp", "version": "1.0.9125.0" }, { "name": "LinuxOL6", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9101" }, { "name": "LinuxOL6", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9103" }, { "name": "LinuxOL6", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9104" }, { "name": "LinuxOL6", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9106" }, { "name": "LinuxDEBIAN8", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9102" }, { "name": "LinuxDEBIAN8", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9103" }, { "name": "LinuxDEBIAN8", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9104" }, { "name": "LinuxDEBIAN8", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9106" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.0.0.0" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.0.0.2" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.0.0.4" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.0.0.5" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.1.0.1" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.1.0.2" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.1.0.3" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.1.0.4" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.1.0.5" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.1.0.6" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.1.0.7" }, { "name": "AzureBackupWindowsWorkload", "publisher": "Microsoft.Azure.RecoveryServices.WorkloadBackup", "version": "1.1.0.8" }, { "name": "ADETest", "publisher": "Microsoft.Azure.Security", "version": "1.4.0.8" }, { "name": "ADETest", "publisher": "Microsoft.Azure.Security", "version": "2.0.0.4" }, { "name": "ADETest", "publisher": "Microsoft.Azure.Security", "version": "2.2.0.4" }, { "name": "LinuxOL7", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9106" }, { "name": "LinuxSLES12", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9103" }, { "name": "LinuxSLES12", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9104" }, { "name": "LinuxSLES12", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9105" }, { "name": "LinuxSLES12", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9106" }, { "name": "LinuxSLES12", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery2", "version": "1.0.0.9107" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "1.0.0.0" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.0" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.1" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.2" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.4" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "2.0.0.0" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "2.1.0.0" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "2.2.0.1" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "2.2.0.2" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "2.2.0.3" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "2.2.0.4" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security", "version": "2.2.0.5" }, { "name": "DSMSForWindows", "publisher": "Microsoft.Azure.Security.Dsms", "version": "2.15.794.0" }, { "name": "DSMSForWindows", "publisher": "Microsoft.Azure.Security.Dsms", "version": "2.17.869.0" }, { "name": "LinuxRHEL6", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9102" }, { "name": "LinuxRHEL6", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9103" }, { "name": "LinuxRHEL6", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9104" }, { "name": "LinuxRHEL6", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9106" }, { "name": "ADETest", "publisher": "Microsoft.Azure.Security.Edp", "version": "2.2.0.4" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999302" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999304" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999305" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999306" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999307" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999308" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999309" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999313" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999315" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999316" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999319" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999321" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999322" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999326" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.999327" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "1.0.0.0" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.0" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.14" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.15" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.17" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.20" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.21" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.5" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.6" }, { "name": "LinuxRHEL7", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9101" }, { "name": "LinuxRHEL7", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9102" }, { "name": "LinuxRHEL7", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9103" }, { "name": "LinuxRHEL7", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9104" }, { "name": "LinuxRHEL7", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9106" }, { "name": "LinuxRHEL7", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9107" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security.Test", "version": "1.5.2.0" }, { "name": "AzureDiskEncryption", "publisher": "Microsoft.Azure.Security.Edp", "version": "2.2.0.4" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.0.0.0" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.1.0.0" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.2.0.0" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.3.0.2" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.3.0.3" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.4.0.0" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.4.0.1" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.5.0.0" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.5.2.0" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.5.4.2" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.5.4.3" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.5.4.4" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.5.5.0" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.5.5.1" }, { "name": "IaaSAntimalware", "publisher": "Microsoft.Azure.Security", "version": "1.5.5.9" }, { "name": "Linux", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.2.0.250" }, { "name": "Linux", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.2.0.252" }, { "name": "LinuxSLES11SP3", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9101" }, { "name": "LinuxSLES11SP3", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9103" }, { "name": "LinuxSLES11SP3", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9104" }, { "name": "LinuxSLES11SP3", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9106" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security.Edp", "version": "0.1.0.999327" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.Azure.Security.Edp", "version": "1.1.0.20" }, { "name": "TestGenevaMonitoringExtension", "publisher": "Microsoft.Azure.Security", "version": "1.7.0.6" }, { "name": "LinuxOL6", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.3.0.339" }, { "name": "LinuxOL6", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.3.0.341" }, { "name": "LinuxSLES11SP4", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9101" }, { "name": "LinuxSLES11SP4", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9102" }, { "name": "LinuxSLES11SP4", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9103" }, { "name": "LinuxSLES11SP4", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9104" }, { "name": "LinuxSLES11SP4", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9106" }, { "name": "LinuxDEBIAN7", "publisher": "Microsoft.Azure.SiteRecovery2.Test", "version": "1.0.0.247" }, { "name": "LinuxDEBIAN7", "publisher": "Microsoft.Azure.SiteRecovery2.Test", "version": "1.0.0.249" }, { "name": "VMBackupForLinuxExtension", "publisher": "Microsoft.Azure.Security", "version": "0.1.0.995" }, { "name": "LinuxOL7", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.0.0.63" }, { "name": "LinuxOL7", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.0.0.65" }, { "name": "LinuxUBUNTU1404", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9101" }, { "name": "LinuxUBUNTU1404", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9102" }, { "name": "LinuxUBUNTU1404", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9103" }, { "name": "LinuxUBUNTU1404", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9104" }, { "name": "LinuxUBUNTU1404", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9106" }, { "name": "LinuxUBUNTU1404", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9107" }, { "name": "LinuxDEBIAN8", "publisher": "Microsoft.Azure.SiteRecovery2.Test", "version": "1.0.0.247" }, { "name": "LinuxDEBIAN8", "publisher": "Microsoft.Azure.SiteRecovery2.Test", "version": "1.0.0.249" }, { "name": "TestMSILinuxExtension", "publisher": "Microsoft.Azure.Test.Identity", "version": "1.0.0.7" }, { "name": "LinuxRHEL6", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.5.0.342" }, { "name": "LinuxRHEL6", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.5.0.344" }, { "name": "LinuxUBUNTU1604", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9" }, { "name": "LinuxUBUNTU1604", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9101" }, { "name": "LinuxUBUNTU1604", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9102" }, { "name": "LinuxUBUNTU1604", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9103" }, { "name": "LinuxUBUNTU1604", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9104" }, { "name": "LinuxUBUNTU1604", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9106" }, { "name": "LinuxUBUNTU1604", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9107" }, { "name": "LinuxOL7", "publisher": "Microsoft.Azure.SiteRecovery2.Test", "version": "1.0.0.28" }, { "name": "LinuxOL7", "publisher": "Microsoft.Azure.SiteRecovery2.Test", "version": "1.0.0.29" }, { "name": "TestMSIWindowsExtension", "publisher": "Microsoft.Azure.Test.Identity", "version": "1.0.0.11" }, { "name": "LinuxRHEL7", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.3.0.339" }, { "name": "LinuxRHEL7", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.3.0.341" }, { "name": "SiteRecovery", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "0.0.0.0" }, { "name": "AzureCATExtensionHandler", "publisher": "Microsoft.AzureCAT.AzureEnhancedMonitoring", "version": "2.2.0.48" }, { "name": "AzureCATExtensionHandler", "publisher": "Microsoft.AzureCAT.AzureEnhancedMonitoring", "version": "2.2.0.68" }, { "name": "LinuxSLES11SP3", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.3.0.335" }, { "name": "LinuxSLES11SP3", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.3.0.337" }, { "name": "SiteRecoveryLinux", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "0.0.0.1" }, { "name": "VMJITAccessExtension", "publisher": "Microsoft.AzureSecurity.JITAccess", "version": "1.0.0.0" }, { "name": "VMJITAccessExtension", "publisher": "Microsoft.AzureSecurity.JITAccess", "version": "1.0.1.0" }, { "name": "LinuxSLES11SP4", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.3.0.335" }, { "name": "LinuxSLES11SP4", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.3.0.337" }, { "name": "Windows", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9102" }, { "name": "Windows", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9103" }, { "name": "Windows", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9104" }, { "name": "Windows", "publisher": "Microsoft.Azure.RecoveryServices.SiteRecovery", "version": "1.0.0.9106" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.1338.47" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.1338.48" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.1.0.0" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.1.0.2" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.1.0.3" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.1.0.4" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.1.0.5" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.1.0.6" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.1.0.7" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.1.0.8" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension.Edp", "version": "1.0.1338.47" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension.Edp", "version": "1.0.1338.48" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension.Edp", "version": "1.0.1338.49" }, { "name": "WorkloadBackup", "publisher": "Microsoft.CloudBackup.Workload.Extension.Edp", "version": "1.0.1338.50" }, { "name": "LinuxUBUNTU1404", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.0.0.340" }, { "name": "LinuxUBUNTU1404", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.0.0.342" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.1" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.11" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.12" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.14" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.15" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.16" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.17" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.18" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.19" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.2" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.3" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.5" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.6" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.7" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.8" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension", "version": "1.0.0.9" }, { "name": "BGInfo", "publisher": "Microsoft.Compute", "version": "2.1" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension.Edp", "version": "1.0.0.14" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension.Edp", "version": "1.0.0.15" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension.Edp", "version": "1.0.0.16" }, { "name": "WorkloadBackupLinux", "publisher": "Microsoft.CloudBackup.Workload.Extension.Edp", "version": "1.0.0.17" }, { "name": "LinuxUBUNTU1604", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.0.0.253" }, { "name": "LinuxUBUNTU1604", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.0.0.255" }, { "name": "NullLinux", "publisher": "Microsoft.CPlat.Core", "version": "2.0.1" }, { "name": "NullLinux", "publisher": "Microsoft.CPlat.Core", "version": "2.0.2" }, { "name": "NullLinux", "publisher": "Microsoft.CPlat.Core", "version": "2.0.3" }, { "name": "NullLinux", "publisher": "Microsoft.CPlat.Core", "version": "2.1.0" }, { "name": "NullLinux", "publisher": "Microsoft.CPlat.Core", "version": "2.2.0" }, { "name": "NullLinux", "publisher": "Microsoft.CPlat.Core", "version": "2.3.0" }, { "name": "NullLinux", "publisher": "Microsoft.CPlat.Core", "version": "3.0.0" }, { "name": "NullLinux", "publisher": "Microsoft.CPlat.Core", "version": "3.1.0" }, { "name": "NullLinux", "publisher": "Microsoft.CPlat.Core", "version": "3.3.0" }, { "name": "NullLinux", "publisher": "Microsoft.CPlat.Core", "version": "4.0.1" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.0.1" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.0.3" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.1" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.2" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.3" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.4" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.7" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.8" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.9" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.9.1" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.9.2" }, { "name": "CustomScriptExtension", "publisher": "Microsoft.Compute", "version": "1.9.3" }, { "name": "WindowsTest", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.4.0.257" }, { "name": "WindowsTest", "publisher": "Microsoft.Azure.SiteRecovery.Test", "version": "1.4.0.261" }, { "name": "NullSeqA", "publisher": "Microsoft.CPlat.Core", "version": "2.0.1" }, { "name": "MicrosoftMonitoringAgent", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.0.11049.5" }, { "name": "MicrosoftMonitoringAgent", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.0.11049.7" }, { "name": "MicrosoftMonitoringAgent", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.0.11072.0" }, { "name": "MicrosoftMonitoringAgent", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.0.11072.1" }, { "name": "MicrosoftMonitoringAgent", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.0.11081.1" }, { "name": "MicrosoftMonitoringAgent", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.0.11081.2" }, { "name": "MicrosoftMonitoringAgent", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.0.11081.4" }, { "name": "MicrosoftMonitoringAgent", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.0.11081.5" }, { "name": "JsonADDomainExtension", "publisher": "Microsoft.Compute", "version": "1.0" }, { "name": "JsonADDomainExtension", "publisher": "Microsoft.Compute", "version": "1.3" }, { "name": "JsonADDomainExtension", "publisher": "Microsoft.Compute", "version": "1.3.2" }, { "name": "NullSeqB", "publisher": "Microsoft.CPlat.Core", "version": "2.0.1" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.0.217.0" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.2.148.0" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.3.127.5" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.3.127.7" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.3.18.7" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.4.45.2" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.4.45.3" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.4.55.4" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.4.56.5" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.4.58.7" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.4.59.1" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.4.60.2" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.6.42.0" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.7.3" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.7.7" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.7.9" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.8.11" }, { "name": "OmsAgentForLinux", "publisher": "Microsoft.EnterpriseCloud.Monitoring", "version": "1.8.9" }, { "name": "VMAccessAgent", "publisher": "Microsoft.Compute", "version": "2.0" }, { "name": "VMAccessAgent", "publisher": "Microsoft.Compute", "version": "2.0.1" }, { "name": "VMAccessAgent", "publisher": "Microsoft.Compute", "version": "2.0.2" }, { "name": "VMAccessAgent", "publisher": "Microsoft.Compute", "version": "2.3" }, { "name": "VMAccessAgent", "publisher": "Microsoft.Compute", "version": "2.4" }, { "name": "VMAccessAgent", "publisher": "Microsoft.Compute", "version": "2.4.1" }, { "name": "VMAccessAgent", "publisher": "Microsoft.Compute", "version": "2.4.2" }, { "name": "VMAccessAgent", "publisher": "Microsoft.Compute", "version": "2.4.3" }, { "name": "VMAccessAgent", "publisher": "Microsoft.Compute", "version": "2.4.4" }, { "name": "NullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.0.1" }, { "name": "NullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.0.2" }, { "name": "NullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.0.3" }, { "name": "NullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.1.0" }, { "name": "NullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.2.0" }, { "name": "NullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.3.0" }, { "name": "NullWindows", "publisher": "Microsoft.CPlat.Core", "version": "3.0.0" }, { "name": "NullWindows", "publisher": "Microsoft.CPlat.Core", "version": "3.1.0" }, { "name": "NullWindows", "publisher": "Microsoft.CPlat.Core", "version": "3.2.0" }, { "name": "NullWindows", "publisher": "Microsoft.CPlat.Core", "version": "3.4.0" }, { "name": "NullWindows", "publisher": "Microsoft.CPlat.Core", "version": "4.0.0" }, { "name": "MicrosoftMonitoringAgent", "publisher": "Microsoft.EnterpriseCloud.Monitoring.Test", "version": "1.0.11030.0" }, { "name": "MicrosoftMonitoringAgent", "publisher": "Microsoft.EnterpriseCloud.Monitoring.Test", "version": "1.0.11049.0" }, { "name": "MicrosoftMonitoringAgent", "publisher": "Microsoft.EnterpriseCloud.Monitoring.Test", "version": "1.0.11049.1" }, { "name": "OtherNullLinux", "publisher": "Microsoft.CPlat.Core", "version": "3.0.1" }, { "name": "DSC", "publisher": "Microsoft.GuestConfig.Test", "version": "2.2.0.0" }, { "name": "ConfigurationforWindows", "publisher": "Microsoft.GuestConfiguration.Test", "version": "1.0.0.0" }, { "name": "ConfigurationforWindows", "publisher": "Microsoft.GuestConfiguration.Test", "version": "1.1.0.0" }, { "name": "ConfigurationforWindows", "publisher": "Microsoft.GuestConfiguration.Test", "version": "1.2.0.0" }, { "name": "ConfigurationForLinux", "publisher": "Microsoft.GuestConfiguration", "version": "0.2.0" }, { "name": "ConfigurationForLinux", "publisher": "Microsoft.GuestConfiguration", "version": "1.0.0" }, { "name": "ConfigurationForLinux", "publisher": "Microsoft.GuestConfiguration", "version": "1.1.0" }, { "name": "ConfigurationForLinux", "publisher": "Microsoft.GuestConfiguration", "version": "1.2.1" }, { "name": "OtherNullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.0.1" }, { "name": "OtherNullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.0.2" }, { "name": "OtherNullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.0.3" }, { "name": "OtherNullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.1.0" }, { "name": "OtherNullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.2.0" }, { "name": "OtherNullWindows", "publisher": "Microsoft.CPlat.Core", "version": "2.3.0" }, { "name": "OtherNullWindows", "publisher": "Microsoft.CPlat.Core", "version": "3.0.0" }, { "name": "OtherNullWindows", "publisher": "Microsoft.CPlat.Core", "version": "3.2.0" }, { "name": "OtherNullWindows", "publisher": "Microsoft.CPlat.Core", "version": "4.0.0" }, { "name": "HpcVmDrivers", "publisher": "Microsoft.HpcCompute", "version": "1.1.0.0" }, { "name": "HpcVmDrivers", "publisher": "Microsoft.HpcCompute", "version": "1.1.1.1" }, { "name": "HpcVmDrivers", "publisher": "Microsoft.HpcCompute", "version": "1.1.2.0" }, { "name": "HpcVmDrivers", "publisher": "Microsoft.HpcCompute", "version": "1.1.3.0" }, { "name": "ConfigurationforWindows", "publisher": "Microsoft.GuestConfiguration", "version": "1.2.0.0" }, { "name": "ConfigurationforWindows", "publisher": "Microsoft.GuestConfiguration", "version": "1.3.0.0" }, { "name": "ConfigurationforWindows", "publisher": "Microsoft.GuestConfiguration", "version": "1.4.0.0" }, { "name": "ConfigurationforWindows", "publisher": "Microsoft.GuestConfiguration", "version": "1.5.1.0" }, { "name": "RunCommandLinux", "publisher": "Microsoft.CPlat.Core", "version": "1.0.0" }, { "name": "NvidiaGpuDriverLinux", "publisher": "Microsoft.HpcCompute", "version": "1.0.0.0" }, { "name": "NvidiaGpuDriverLinux", "publisher": "Microsoft.HpcCompute", "version": "1.1.0.0" }, { "name": "NvidiaGpuDriverLinux", "publisher": "Microsoft.HpcCompute", "version": "1.1.1.0" }, { "name": "NvidiaGpuDriverLinux", "publisher": "Microsoft.HpcCompute", "version": "1.1.2.0" }, { "name": "NvidiaGpuDriverLinux", "publisher": "Microsoft.HpcCompute", "version": "1.1.3.0" }, { "name": "NvidiaGpuDriverLinux", "publisher": "Microsoft.HpcCompute", "version": "1.2.0.0" }, { "name": "HPCAcmAgent", "publisher": "Microsoft.HpcPack", "version": "1.0.30.0" }, { "name": "HPCAcmAgent", "publisher": "Microsoft.HpcPack", "version": "1.0.31.0" }, { "name": "ManagedIdentityExtensionForLinux", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.1" }, { "name": "ManagedIdentityExtensionForLinux", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.10" }, { "name": "ManagedIdentityExtensionForLinux", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.11" }, { "name": "ManagedIdentityExtensionForLinux", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.12" }, { "name": "ManagedIdentityExtensionForLinux", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.13" }, { "name": "ManagedIdentityExtensionForLinux", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.3" }, { "name": "ManagedIdentityExtensionForLinux", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.8" }, { "name": "RunCommandWindows", "publisher": "Microsoft.CPlat.Core", "version": "1.0.0" }, { "name": "RunCommandWindows", "publisher": "Microsoft.CPlat.Core", "version": "1.0.1" }, { "name": "RunCommandWindows", "publisher": "Microsoft.CPlat.Core", "version": "1.1.0" }, { "name": "NvidiaGpuDriverWindows", "publisher": "Microsoft.HpcCompute", "version": "1.0.0.0" }, { "name": "NvidiaGpuDriverWindows", "publisher": "Microsoft.HpcCompute", "version": "1.1.0.0" }, { "name": "NvidiaGpuDriverWindows", "publisher": "Microsoft.HpcCompute", "version": "1.2.0.0" }, { "name": "LinuxNodeAgent", "publisher": "Microsoft.HpcPack", "version": "1.5.1.0" }, { "name": "LinuxNodeAgent", "publisher": "Microsoft.HpcPack", "version": "1.6.18.3" }, { "name": "LinuxNodeAgent", "publisher": "Microsoft.HpcPack", "version": "1.7.11.2" }, { "name": "LinuxNodeAgent", "publisher": "Microsoft.HpcPack", "version": "2.1.5.0" }, { "name": "ManagedIdentityExtensionForWindows", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.1" }, { "name": "ManagedIdentityExtensionForWindows", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.10" }, { "name": "ManagedIdentityExtensionForWindows", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.11" }, { "name": "ManagedIdentityExtensionForWindows", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.12" }, { "name": "ManagedIdentityExtensionForWindows", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.13" }, { "name": "ManagedIdentityExtensionForWindows", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.3" }, { "name": "ManagedIdentityExtensionForWindows", "publisher": "Microsoft.ManagedIdentity", "version": "1.0.0.8" }, { "name": "ApplicationHealthLinux", "publisher": "Microsoft.ManagedServices", "version": "1.0.0" }, { "name": "LinuxNodeAgent2016", "publisher": "Microsoft.HpcPack", "version": "2.1.6.0" }, { "name": "ApplicationHealthWindows", "publisher": "Microsoft.ManagedServices", "version": "1.0.4" }, { "name": "AzureDiskEncryptionForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "0.1.0.999105" }, { "name": "LinuxNodeAgent2016U1", "publisher": "Microsoft.HpcPack", "version": "2.3.4.0" }, { "name": "LinuxNodeAgent2016U1", "publisher": "Microsoft.HpcPack", "version": "2.3.4.1" }, { "name": "LinuxNodeAgent2016U1", "publisher": "Microsoft.HpcPack", "version": "2.3.6.0" }, { "name": "AzureDiagnosticsLinuxExtIaaS7.Test", "publisher": "Microsoft.OSTCExtensions.Test", "version": "1.0.0.0" }, { "name": "AzureEnhancedMonitorForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.0.0.2" }, { "name": "AzureEnhancedMonitorForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "3.0.0.1" }, { "name": "AzureEnhancedMonitorForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "3.0.0.5" }, { "name": "AzureEnhancedMonitorForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "3.0.0.97" }, { "name": "AzureEnhancedMonitorForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "3.0.0.98" }, { "name": "AzureEnhancedMonitorForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "3.0.0.99" }, { "name": "AzureEnhancedMonitorForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "3.0.1.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.10.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.13.2.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.14.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.15.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.16.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.17.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.18.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.19.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.20.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.21.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.22.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.23.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.24.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.25.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.26.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.26.1.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.4.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.5.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.6.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.7.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.70.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.71.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.71.1.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.72.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.73.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.74.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.75.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.76.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.77.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.8.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell", "version": "2.9.1.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell.Test", "version": "2.76.0.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell.Test", "version": "2.76.1.0" }, { "name": "DSC", "publisher": "Microsoft.Powershell.Test", "version": "2.76.2.0" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.0" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.0.1" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.1" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.1.1" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.2.2.0" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.3.0.0" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.3.0.1" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.3.0.2" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.4.0.0" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.4.1.0" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.5.2.0" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.5.2.1" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.5.2.2" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.5.3" }, { "name": "CustomScriptForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.5.4" }, { "name": "DSC", "publisher": "Microsoft.Powershell.Test01", "version": "1.0.0.0" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.0.0.0" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.0.0.0" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.1.0.0" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.2.0.0" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.3.0.0" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.4.0.0" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.5.0.0" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.6.0.0" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.70.0.10" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.70.0.2" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.70.0.3" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.70.0.4" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.70.0.7" }, { "name": "DSCForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.70.0.8" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.10.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.11.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.12.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.13.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.14.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.15.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.16.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.17.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.18.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.19.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.20.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.22.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.24.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.29.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.30.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "1.2.9.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "2.0.1.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "2.0.3.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "2.0.4.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "2.0.5.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "2.0.6.0" }, { "name": "SqlIaaSAgent", "publisher": "Microsoft.SqlServer.Management", "version": "2.0.7.0" }, { "name": "MSEnterpriseApplication", "publisher": "Microsoft.SystemCenter", "version": "1.0.5.0" }, { "name": "TestSqlIaaSAgent", "publisher": "Microsoft.TestSqlServer.Edp", "version": "1.4.0.0" }, { "name": "TestSqlIaaSAgent", "publisher": "Microsoft.TestSqlServer.Edp", "version": "2.0.0.1" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.OSTCExtensions", "version": "2.0.9023" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.OSTCExtensions", "version": "2.1.9023" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.OSTCExtensions", "version": "2.2.9023" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.OSTCExtensions", "version": "2.3.9023" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.OSTCExtensions", "version": "2.3.9025" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.OSTCExtensions", "version": "2.3.9027" }, { "name": "LinuxDiagnostic", "publisher": "Microsoft.OSTCExtensions", "version": "2.3.9029" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.1.0.0" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.1.0.1" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.2.0.0" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.3.0.0" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.4.0.0" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.5.0.0" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.6.0.0" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.7.0.0" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.7.1.0" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.7.2.0" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.7.3.0" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "0.8.0.0" }, { "name": "VSETWTraceListenerService", "publisher": "Microsoft.VisualStudio.Azure.ETWTraceListenerService", "version": "1.0.0.0" }, { "name": "TestSqlIaaSAgentLinux", "publisher": "Microsoft.TestSqlServer.Edp", "version": "1.0.16" }, { "name": "Null", "publisher": "Microsoft.OSTCExtensions", "version": "1.0.0.0" }, { "name": "Null", "publisher": "Microsoft.OSTCExtensions", "version": "1.0.0.3" }, { "name": "Null", "publisher": "Microsoft.OSTCExtensions", "version": "1.0.1.0" }, { "name": "Null", "publisher": "Microsoft.OSTCExtensions", "version": "1.0.2.0" }, { "name": "Null", "publisher": "Microsoft.OSTCExtensions", "version": "1.0.3.0" }, { "name": "Null", "publisher": "Microsoft.OSTCExtensions", "version": "1.1.0.0" }, { "name": "Null", "publisher": "Microsoft.OSTCExtensions", "version": "1.2.0.0" }, { "name": "Null", "publisher": "Microsoft.OSTCExtensions", "version": "1.3.0.0" }, { "name": "Null", "publisher": "Microsoft.OSTCExtensions", "version": "2.0.0.0" }, { "name": "Null", "publisher": "Microsoft.OSTCExtensions", "version": "2.1.0.0" }, { "name": "VSRemoteDebugger", "publisher": "Microsoft.VisualStudio.Azure.RemoteDebug", "version": "1.1.1.0" }, { "name": "VSRemoteDebugger", "publisher": "Microsoft.VisualStudio.Azure.RemoteDebug", "version": "1.1.2.0" }, { "name": "VSRemoteDebugger", "publisher": "Microsoft.VisualStudio.Azure.RemoteDebug", "version": "1.1.3.0" }, { "name": "SqlIaaSAgentLinux", "publisher": "Microsoft.SqlServer.Management", "version": "1.0.0.0" }, { "name": "OSPatchingForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.0" }, { "name": "OSPatchingForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.0.1.1" }, { "name": "OSPatchingForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.0.0.0" }, { "name": "OSPatchingForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.0.0.1" }, { "name": "OSPatchingForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.0.0.2" }, { "name": "OSPatchingForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.0.0.5" }, { "name": "OSPatchingForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.1.0.0" }, { "name": "OSPatchingForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.2.0.0" }, { "name": "OSPatchingForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "2.3.0.1" }, { "name": "ServiceProfilerAgent", "publisher": "Microsoft.VisualStudio.ServiceProfiler", "version": "0.1.0.24" }, { "name": "ServiceProfilerAgent", "publisher": "Microsoft.VisualStudio.ServiceProfiler", "version": "0.1.0.25" }, { "name": "RDMAUpdateForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "0.1.0.9" }, { "name": "TeamServicesAgent", "publisher": "Microsoft.VisualStudio.Services", "version": "1.20.0.0" }, { "name": "TeamServicesAgent", "publisher": "Microsoft.VisualStudio.Services", "version": "1.21.0.0" }, { "name": "TeamServicesAgent", "publisher": "Microsoft.VisualStudio.Services", "version": "1.22.0.0" }, { "name": "TeamServicesAgent", "publisher": "Microsoft.VisualStudio.Services", "version": "1.23.0.0" }, { "name": "AzureRemoteAppTestAgentV2", "publisher": "Microsoft.Windows.AzureRemoteApp.Test", "version": "1.0" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.0" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.1" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.2" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.3.0.1" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.4.0.0" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.4.1.0" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.4.2.0" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.4.3.0" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.4.4.0" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.4.5.0" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.4.6.0" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.4.7.0" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.4.7.1" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.5.0" }, { "name": "VMAccessForLinux", "publisher": "Microsoft.OSTCExtensions", "version": "1.5.1" }, { "name": "TeamServicesAgentLinux", "publisher": "Microsoft.VisualStudio.Services", "version": "1.15.0.0" }, { "name": "TeamServicesAgentLinux", "publisher": "Microsoft.VisualStudio.Services", "version": "1.16.0.0" }, { "name": "TeamServicesAgentLinux", "publisher": "Microsoft.VisualStudio.Services", "version": "1.17.0.0" }, { "name": "TeamServicesAgentLinux", "publisher": "Microsoft.VisualStudio.Services", "version": "1.18.0.0" }, { "name": "TeamServicesAgentLinux", "publisher": "Microsoft.VisualStudio.Services", "version": "1.19.0.0" }, { "name": "AzureLogCollector", "publisher": "Microsoft.WindowsAzure.Compute", "version": "1.0.0.7" }, { "name": "AzureLogCollector", "publisher": "Microsoft.WindowsAzure.Compute", "version": "1.0.0.8" }, { "name": "AzureLogCollector", "publisher": "Microsoft.WindowsAzure.Compute", "version": "1.0.0.9" }, { "name": "VMBackupForLinuxExtension", "publisher": "Microsoft.OSTCExtensions", "version": "0.1.0.993" }, { "name": "OctopusDeployWindowsTentacle", "publisher": "OctopusDeploy.Tentacle", "version": "2.0.104" }, { "name": "OctopusDeployWindowsTentacle", "publisher": "OctopusDeploy.Tentacle", "version": "2.0.108" }, { "name": "OctopusDeployWindowsTentacle", "publisher": "OctopusDeploy.Tentacle", "version": "2.0.113" }, { "name": "OctopusDeployWindowsTentacle", "publisher": "OctopusDeploy.Tentacle", "version": "2.0.135" }, { "name": "OctopusDeployWindowsTentacle", "publisher": "OctopusDeploy.Tentacle", "version": "2.0.156" }, { "name": "OctopusDeployWindowsTentacle", "publisher": "OctopusDeploy.Tentacle", "version": "2.0.164" }, { "name": "PuppetAgent", "publisher": "puppet", "version": "1.4.2" }, { "name": "PuppetAgent", "publisher": "puppet", "version": "1.5.2" }, { "name": "PuppetEnterpriseAgent", "publisher": "PuppetLabs", "version": "2015.2.3" }, { "name": "PuppetEnterpriseAgent", "publisher": "PuppetLabs", "version": "2015.3.3" }, { "name": "PuppetEnterpriseAgent", "publisher": "PuppetLabs", "version": "3.2.1" }, { "name": "PuppetEnterpriseAgent", "publisher": "PuppetLabs", "version": "3.2.2" }, { "name": "PuppetEnterpriseAgent", "publisher": "PuppetLabs", "version": "3.2.3" }, { "name": "PuppetEnterpriseAgent", "publisher": "PuppetLabs", "version": "3.7.2" }, { "name": "PuppetEnterpriseAgent", "publisher": "PuppetLabs", "version": "3.8.4" }, { "name": "PuppetEnterpriseAgent", "publisher": "PuppetLabs.Test", "version": "3.8.4" }, { "name": "QualysAgent", "publisher": "Qualys", "version": "0.0.0.1" }, { "name": "QualysAgent", "publisher": "Qualys", "version": "0.0.0.3" }, { "name": "QualysAgent", "publisher": "Qualys", "version": "0.0.0.4" }, { "name": "QualysAgent", "publisher": "Qualys", "version": "0.0.0.5" }, { "name": "QualysAgent", "publisher": "Qualys", "version": "0.0.0.7" }, { "name": "QualysAgent", "publisher": "Qualys", "version": "0.0.0.8" }, { "name": "QualysAgent", "publisher": "Qualys", "version": "0.0.0.9" }, { "name": "QualysAgent", "publisher": "Qualys", "version": "1.6.4.9" }, { "name": "QualysAgentLinux", "publisher": "Qualys", "version": "1.5.0.72" }, { "name": "QualysAgentLinux", "publisher": "Qualys", "version": "1.5.0.73" }, { "name": "QualysAgentLinux", "publisher": "Qualys", "version": "1.5.0.82" }, { "name": "QualysAgentLinux", "publisher": "Qualys", "version": "1.6.0.1" }, { "name": "QualysAgentLinux", "publisher": "Qualys", "version": "1.6.0.100" }, { "name": "QualysAgentLinux", "publisher": "Qualys", "version": "1.6.0.3" }, { "name": "QualysAgentLinux", "publisher": "Qualys", "version": "1.6.0.90" }, { "name": "QualysAgentLinux", "publisher": "Qualys", "version": "1.6.0.91" }, { "name": "QualysAgentLinux", "publisher": "Qualys", "version": "1.6.0.93" }, { "name": "QualysAgentLinux", "publisher": "Qualys", "version": "1.6.0.96" }, { "name": "InsightAgentLinux", "publisher": "Rapid7.InsightPlatform", "version": "2.0.0.2" }, { "name": "InsightAgentWindows", "publisher": "Rapid7.InsightPlatform", "version": "2.0.0.2" }, { "name": "Site24x7ApmInsightExtn", "publisher": "Site24x7", "version": "1.9.0.0" }, { "name": "Site24x7LinuxServerExtn", "publisher": "Site24x7", "version": "1.5.0.0" }, { "name": "Site24x7LinuxServerExtn", "publisher": "Site24x7", "version": "1.6.0.0" }, { "name": "Site24x7WindowsServerExtn", "publisher": "Site24x7", "version": "1.6.0.0" }, { "name": "Site24x7WindowsServerExtn", "publisher": "Site24x7", "version": "1.8.0.0" }, { "name": "StackifyLinuxAgentExtension", "publisher": "Stackify.LinuxAgent.Extension", "version": "1.0.0.21" }, { "name": "IaaSDiagnostics", "publisher": "StatusReport.Diagnostics.Test", "version": "0.27.0.0" }, { "name": "SymantecEndpointProtection", "publisher": "Symantec", "version": "12.1.4100.2" }, { "name": "SymantecEndpointProtection", "publisher": "Symantec", "version": "12.1.7007.6505" }, { "name": "SCWPAgentForLinux", "publisher": "Symantec.CloudWorkloadProtection", "version": "1.7.0.0" }, { "name": "SCWPAgentForLinux", "publisher": "Symantec.CloudWorkloadProtection", "version": "1.8.0.0" }, { "name": "SCWPAgentForLinux", "publisher": "Symantec.CloudWorkloadProtection", "version": "1.9.0.0" }, { "name": "SCWPAgentForLinux", "publisher": "Symantec.CloudWorkloadProtection", "version": "2.0.0.0" }, { "name": "SCWPAgentForLinux", "publisher": "Symantec.CloudWorkloadProtection", "version": "2.1.0.0" }, { "name": "SCWPAgentForLinux", "publisher": "Symantec.CloudWorkloadProtection", "version": "2.2.0.0" }, { "name": "SCWPAgentForLinuxTest", "publisher": "Symantec.CloudWorkloadProtection.Test", "version": "2.0.0.0" }, { "name": "SCWPAgentForLinuxTest", "publisher": "Symantec.CloudWorkloadProtection.Test", "version": "2.1.0.0" }, { "name": "SCWPAgentForLinuxTest", "publisher": "Symantec.CloudWorkloadProtection.Test", "version": "2.2.0.0" }, { "name": "SCWPAgentForLinuxTestOnStage", "publisher": "Symantec.CloudWorkloadProtection.TestOnStage", "version": "1.5.0.0" }, { "name": "SCWPAgentForLinuxTestOnStage", "publisher": "Symantec.CloudWorkloadProtection.TestOnStage", "version": "1.6.0.0" }, { "name": "SCWPAgentForLinuxTestOnStage", "publisher": "Symantec.CloudWorkloadProtection.TestOnStage", "version": "1.8.0.0" }, { "name": "SCWPAgentForLinuxTestOnStage", "publisher": "Symantec.CloudWorkloadProtection.TestOnStage", "version": "1.9.0.0" }, { "name": "SCWPAgentForWindows", "publisher": "Symantec.CloudWorkloadProtection", "version": "1.4.0.0" }, { "name": "SCWPAgentForWindows", "publisher": "Symantec.CloudWorkloadProtection", "version": "1.5.0.0" }, { "name": "SCWPAgentForWindows", "publisher": "Symantec.CloudWorkloadProtection", "version": "1.6.0.0" }, { "name": "SCWPAgentForWindows", "publisher": "Symantec.CloudWorkloadProtection", "version": "1.7.0.0" }, { "name": "SCWPAgentForWindows", "publisher": "Symantec.CloudWorkloadProtection", "version": "1.8.0.0" }, { "name": "SCWPAgentForWindows", "publisher": "Symantec.CloudWorkloadProtection", "version": "1.9.0.0" }, { "name": "SCWPAgentForWindowsTest", "publisher": "Symantec.CloudWorkloadProtection.Test", "version": "1.8.0.0" }, { "name": "SCWPAgentForWindowsTest", "publisher": "Symantec.CloudWorkloadProtection.Test", "version": "1.9.0.0" }, { "name": "TrendMicroDSA", "publisher": "Test.TrendMicro.DeepSecurity", "version": "10.0.0.10705" }, { "name": "TrendMicroDSA", "publisher": "Test.TrendMicro.DeepSecurity", "version": "9.6.2.11301" }, { "name": "TrendMicroDSALinux", "publisher": "Test.TrendMicro.DeepSecurity", "version": "10.0.0.10601" }, { "name": "TrendMicroDSALinux", "publisher": "Test.TrendMicro.DeepSecurity", "version": "9.6.2.11401" }, { "name": "TrendMicroDSA", "publisher": "TrendMicro.DeepSecurity", "version": "10.0.0.107" }, { "name": "TrendMicroDSA", "publisher": "TrendMicro.DeepSecurity", "version": "9.6.2.113" }, { "name": "TrendMicroDSALinux", "publisher": "TrendMicro.DeepSecurity", "version": "10.0.0.106" }, { "name": "TrendMicroDSALinux", "publisher": "TrendMicro.DeepSecurity", "version": "9.6.2.114" }, { "name": "PortalProtectExtension", "publisher": "TrendMicro.PortalProtect", "version": "2.1" }, { "name": "VormetricTransparentEncryptionAgent", "publisher": "Vormetric", "version": "5.2.339.0" }, { "name": "IaaSDiagnostics", "publisher": "WAD2AI.Diagnostics.Test", "version": "0.23.0.0" }, { "name": "IaaSDiagnostics", "publisher": "WAD2EventHub.Diagnostics.Test", "version": "0.1.0.0" } ]

Update all globally installed npm packages at once

I keep meaning to run this but always forget the flag. There’s no npm update-all or anything – it’s just: npm update -g The -g tells npm to operate on the global package registry instead of the local node_modules. Without it, npm update only touches packages listed in your project’s package.json, which is the default behaviour and what you want most of the time. One thing to bear in mind: npm update won’t bump you to a new major version, even if one’s available. It respects the semver range in whatever pinned your package – so if you installed commander@2.x and 4.x is out, you’ll stay on 2.x. If you actually want to upgrade majors, you need to be explicit: ...

'Decoding the Error: StatusCode=0 "ReferencedResourceNotProvisioned" in Azure'

Introduction If you’re working with Azure, you might have seen an error like this: “Failure sending request: StatusCode=0 — Original Error: Code=‘ReferencedResourceNotProvisioned’ Message=‘Cannot proceed with operation because resource used by resource is not in Succeeded state. Resource is in Updating state and the last operation that updated/is updating the resource is PutSubnetOperation.’” It looks worse than it is. Here’s what it means and how to fix it. Why Does This Error Occur? A related resource is stuck in an ‘Updating’ state, so Azure won’t let the operation proceed. This usually means another operation is still running on that resource or one it depends on. ...

Import a Resource to a Terraform Module

Importing an existing AWS instance into a Terraform module is straightforward, but the syntax trips people up because you need to specify the full module path. terraform import module.foo.aws_instance.bar i-abcd1234 The format is module.<module_name>.<resource_type>.<resource_name>, followed by the resource ID. In this case, foo is the module name, aws_instance is the resource type, bar is the resource name inside that module, and i-abcd1234 is the AWS instance ID. Once imported, Terraform will manage the instance and track any configuration drift going forward.

Terraform Modules in Subdirectories

Terraform modules are usually at the root of a repository. Sometimes they’re nested in a subdirectory, and you need to point Terraform at the right one. Terraform handles this with a double-slash (//) in the source path. Everything after the // is treated as a subdirectory within the package. How It Works The syntax is straightforward: module "consul" { source = "hashicorp/consul/aws//modules/consul-cluster" } The hashicorp/consul/aws part is the module registry path. The //modules/consul-cluster tells Terraform to look inside that package for the actual module. ...

Fixing "RPC failed; HTTP 413 curl 22" in Nginx

You get this when you try to push a large commit over HTTP and Nginx decides your request is too big: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large The fix is adding one line to your Nginx config. Open /etc/nginx/nginx.conf and find the http, server, or location block you want to change, then add: client_max_body_size 50m; The 50m is 50 megabytes. Change it if you need more or less. Then reload Nginx: ...

Installing gems from local files

Picked up a server that needed gems but had no internet access. Copied the .gem files across and ran this to install them all in one go: gem install --force --local *.gem The --force flag is what does the trick here. Without it, gem will skip any files that are already installed, even if they’re older versions. With --local, it looks only in the current directory instead of trying to reach out to rubygems.org.

Stop buying tools, start solving problems

I’ve been watching a pattern repeat itself for years, and it’s starting to grate. Someone at a conference hears about a new tool — some Kubernetes operator, or service mesh, or GitOps platform that’s supposedly going to fix everything — and they come back convinced their team needs it yesterday. Not because there’s a problem that needs solving. Because the tool exists. This isn’t about being anti-technology. I love good tools. But somewhere along the line, DevOps culture got it backwards. We’re picking solutions first and frantically searching for problems they might address, instead of looking at what’s actually broken and finding the simplest thing that fixes it. ...

Enterprise Architecture Resources

I’ve been collecting these over the years. Some are worth more than others, and a few have gone stale, but they’re the ones I keep coming back to. Agile Architect Andrew Johnston’s blog is one of the few places that actually talks about agile in enterprise architecture without treating the two as separate worlds. agilearchitect.org Application Development Trends ADT Magazine has an enterprise section that covers the news and trends. It’s not EA-specific but it’s useful for keeping an eye on what’s moving. adtmag.com ...

'scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: No such file or directory'

sudo apt-get install -y libssl-dev

'/bin/sh: 1: bison: not found'

sudo apt-get install bison

'[solved] xcrun: error: active developer path ("/Applications/Xcode.app/Contents/Developer") does not exist'

Error: xcrun: error: active developer path ("/Applications/Xcode.app/Contents/Developer") does not exist Use sudo xcode-select --switch path/to/Xcode.app to specify the Xcode that you wish to use for command line developer tools, or use xcode-select --install to install the standalone command line developer tools. See man xcode-select for more details. xcrun: error: active developer path ("/Applications/Xcode.app/Contents/Developer") does not exist Use sudo xcode-select --switch path/to/Xcode.app to specify the Xcode that you wish to use for command line developer tools, or use xcode-select --install to install the standalone command line developer tools. See man xcode-select for more details. ...

Merging Unrelated Git Histories

You’ve got two repositories with completely separate histories, and you need to bring them together. Maybe it’s an old project you’re absorbing into a new one, or a submodule that started life as its own thing. You try a standard git merge and Git immediately shuts you down: fatal: refusing to merge unrelated histories This isn’t a bug – it’s Git being cautious. When two branches share no common ancestor, Git assumes you’ve made a mistake and refuses to play along. But sometimes you genuinely want this merge, and there’s a flag for that. ...

Using Ansible with Packer

Packer builds machine images. Ansible configures servers. Together, they let you bake your configuration straight into the image – no manual setup required after deployment. The Ansible provisioner in Packer runs your playbooks during the image build process. You write a normal Ansible playbook, point Packer at it, and when the image is ready, your software is already installed and configured. Note: If you specify a remote_user in your Ansible tasks, Packer will ignore it. The provisioner connects using the username from Packer’s own configuration. ...

Installing SSHPass on Ubuntu and macOS

SSHPass is a small command-line utility that lets you pass a password directly to an SSH connection, which means no interactive password prompt. Useful when you’re writing scripts that need to connect to remote machines without manual intervention. A word of warning before you go ahead: SSHPass is not secure. The password gets passed as a command-line argument, which means it can show up in process listings and shell history. It’s fine for personal automation on your own machines, but don’t use it in shared environments or anything that touches production systems. ...

Installing Docker CE on Ubuntu

What You Need Before You Begin Docker CE runs on a handful of 64-bit Ubuntu releases, so check you’re on one of these before carrying on: Ubuntu 18.04 (Bionic) - LTS Ubuntu 17.10 (Artful) Ubuntu 16.04 (Xenial) - LTS Ubuntu 14.04 (Trusty) - LTS The supported architectures are x86_64, armhf, s390x (IBM Z), and ppc64le (IBM Power). If you’re on IBM Z or Power, you’ll need at least Ubuntu 16.04 (Xenial). ...

Project architecture is not product architecture

I spent a good chunk of last week designing the architecture for a new service. On paper it was clean — well separated concerns, sensible boundaries, tests covering the happy paths. I felt good about it. Then someone asked what this service was going to become in two years time, and I realised I had no idea. Not because the design was bad, but because I had never really thought about it beyond the project itself. I had optimised for getting something built, not for where it was going. ...

Perfection is subtraction

It seems that perfection would be attained not when there is no longer anything to add, but when there is no longer anything to take away. —Antoine de St. Exupery, Terre des Hommes, 1939 I keep coming back to this one. Not because it is particularly deep — we have all heard the version about a masterpiece being complete when there is nothing left to add — but because it got me thinking about the opposite direction, which is the one I actually find harder. ...

Ultimately DevOps is an organisational transformation

Ultimately DevOps is an organisational transformation.

Being an architect of the future

“We are called to be architects of the future, not its victims.” I came across this quote from Buckminster Fuller a few days ago and it has been sitting with me ever since. Not because it is profound in some new way — I have heard variations of it before — but because it feels increasingly urgent to actually live by it rather than just nod along. The way I read it now, trying to figure out what to do with my life, is less about grand architectural visions and more about the small daily choices that add up to whatever kind of future I end up with. It is easy to drift. It is easy to let other people’s plans for you, or the general momentum of things, carry you somewhere you did not choose. And then one day you look up and you are somewhere you never intended to be and you wonder how that happened. ...

Enterprise architecture

Enterprise architecture is the practice that tries to describe and control an organisation’s structure, processes, applications, systems, and technology in an integrated way. The word “tries” does a lot of work in that sentence. Most organisations never actually achieve integration. They accumulate systems, outgrow their documentation, and hire someone to draw boxes and arrows.

Enterprise Architecture Model

An architecture model is not just useful to provide insight into the current or future situation; it can also be used to evaluate the transition from ‘as is’ to ’to be’. The hard part is mapping the gap between where you are and where you want to be, and being honest about which parts of the journey are actually feasible.

Stakeholders and EA

Most stakeholders of a system are not interested in its architecture, but only in the impact of this on their concerns. Which is fair enough. The CFO doesn’t care about your service mesh. The marketing lead doesn’t care about your data model. They care about cost, risk, speed, and whether the thing they asked for actually works. The mistake architects make is trying to sell the architecture itself. You don’t lead with diagrams. You lead with outcomes: this change reduces downtime, this pattern cuts deployment time in half, this split lets your team ship independently.

Architecture is helpful in guarding the essentials of the business, while still allowing for maximal flexibility and adaptability

Architecture is helpful in guarding the essentials of the business, while still allowing for maximal flexibility and adaptability.

Enterprise Architecture is the structure and the operational blueprint of a company

Enterprise Architecture is the structure and the operational blueprint of a company. It’s the difference between a building that holds things together and one that collapses the first time the wind picks up. You don’t notice it when it’s done well. You notice it the moment it’s missing.

Archimate

Archimate is an open and independent enterprise architecture modelling language that enables organisations to communicate, design, analyse and manage their enterprise architecture in a visual way. It provides a comprehensive and consistent modelling language to describe, visualise, analyse and validate the architecture of an enterprise. The language is developed and maintained by The Open Group, the same body behind TOGAF. The key idea is that enterprise architecture isn’t just about IT systems. It spans business processes, applications, technology infrastructure, and the people and motivations that drive it all. Archimate gives you a common vocabulary across all of those layers so that a business architect, an application architect, and a technology architect can all be talking about the same thing. ...

Project Initiation Documentation RACI Chart

Project Initiation Documentation RACI Chart

This is a RACI chart specifically for project initiation documentation — who’s responsible for producing each piece of the paperwork that kicks a project off. It’s based on the chart from Project Management for Dummies (Wiley, 2011), which is one of those books people laugh at but actually contains useful reference material. This particular chart maps out who does what during the initiation phase: the business case, the project brief, the risk register, the stakeholder analysis, and so on. ...

Stakeholder RACI Matrix Spreadsheet

A RACI matrix stops the “I thought you were doing that” conversation before it starts. It’s a grid. Down the left side, you list the tasks or decisions. Across the top, you list the people or roles. Where they cross, you mark what each person’s relationship is to that item: R — Responsible. The person doing the work. A — Accountable. The person who owns the outcome and gets to say it’s done. C — Consulted. The person whose opinion matters before a decision is made. I — Informed. The person who needs to know after the decision is made. Why it matters The most common failure mode on a project isn’t that nobody does the work. It’s that two people think they’re both responsible, or nobody thinks they’re responsible at all. ...

Break stakeholders into smaller groups according to roles or goals

Once you’ve got your stakeholder list — the one from the stakeholder list document, filled in with names, titles, and notes — the next step is to stop looking at it as a flat list and start grouping them. A flat list of twenty names is hard to work with. You can’t send the same email to everyone. You can’t run the same meeting with everyone. You can’t make the same promises to everyone. So you split them up. ...

Stakeholder List Document

Every project has people who care about it, whether they’ve signed up for it or not. The trick is figuring out who they are before they start caring loudly. I keep a simple stakeholder list document open from day one. It’s not fancy — six columns, thirty-six rows, nothing more. But it stops you from being surprised when someone you never considered shows up at a steering group demanding answers. ...

Thinking Before the Move

Reinhard Selten, the Nobel prize-winning game theorist, noticed something about how we think: we spend most of our mental energy being rational after the fact. We replay conversations, revisit decisions, trace back through the chain of events and ask ourselves what we should have done differently. This is rationality ex post – looking backwards, reconstructing the path we ought to have taken. But game theory is concerned with something else entirely. It asks you to build a strategy before the game begins, to arrive at a good outcome a priori, without the luxury of hindsight. The gap between these two modes of thinking is where most of our failures live. We are brilliant historians of our own mistakes and terrible architects of our own choices.

Some notes on people skills and emotional intelligence

I’ve been reading up on emotional intelligence lately and collecting the bits that felt useful. Not the textbook definitions — the ones that actually change how you show up in a room. The five things that matter There’s a framework that keeps coming up, and it boils down to five skills: rapport building, curiosity, communication, ambition, and conflict resolution. They’re not glamorous. They’re not the sort of things you put on a CV under “technical expertise”. But they’re the difference between being someone people want to work with and someone they tolerate. ...

Start with yourself

I came across this parable recently and it stuck with me. The attribution is disputed – some say it was the German theologian Dietrich Bonhoeffer on his deathbed, others point to an Anglican bishop, and some claim it’s simply anonymous folklore that’s been circulating for decades. The origin doesn’t matter much. What matters is the shape of the thing. When I was young, free, and my imagination had no limits, I dreamed of changing the world. ...

On leverage

Political intelligence requires a thorough understanding of the dynamics of leverage — which simply means your ability to get others to do what you want.

How to develop your political IQ

Most people treat office politics as something to avoid. They’d rather focus on their work and hope it speaks for itself. But the truth is, everyone is already playing the game — whether they admit it or not. The difference is between people who understand how it works and people who get surprised by it. Here’s what I’ve learned about developing political awareness at work. Know where you’re going You can’t navigate an office if you don’t know what you’re looking for. What do you actually want? A promotion? A transfer to a different team? More influence over decisions? Be honest with yourself about it. ...

Some notes on digital content strategy

I came across a set of notes on digital content strategy and thought I’d share the bits that stuck with me. Nothing earth-shattering, but useful if you’re trying to think more clearly about how content actually works across platforms. QR codes They’re everywhere now. Easy enough to scan, instant redirect to a page or product. Fine as a bridge between the physical and digital world, though I’m not convinced they’ve earned their place in most campaigns yet. ...

The big data life cycle

I keep coming back to the same problem: everyone talks about big data as if it’s a thing you have, when really it’s a process you go through. There’s no single tool or platform that solves it. What you end up with is a series of messy stages, each with its own set of headaches, and most organisations I’ve spoken to are stuck somewhere in the middle without a clear picture of what comes next. ...

One resolution for 2014

It’s the last day of 2013 and I’ve been sitting with the question of what I actually want to do differently in 2014. Not what I should do, not what sounds good on a vision board, but what I genuinely want to change about how I spend my time. I’ve made lists before. Five resolutions, ten resolutions, the whole lot. Write more, exercise more, read more, save more, learn a language, cut out social media, meditate every morning. By February I’d abandoned at least eight of them, and the ones I kept were half-hearted at best. The problem was never discipline. It was that I was trying to change everything at once, which is just a fancy way of saying I wasn’t going to change anything at all. ...

Applicable values for AddItemRequest.Item.Country

Applicable values for AddItemRequest.Item.Country When listing an item via the eBay Trading API, the Item.Country field expects a two-letter ISO 3166-1 alpha-2 country code. The table below lists every value eBay accepts, along with the country name. All codes are valid for both incoming (selling) and outgoing (shipping) directions unless noted otherwise. Country codes Code Country Notes AA — APO/FPO. Not in ISO 3166; retained for backward compatibility. AD Andorra AE United Arab Emirates AF Afghanistan AG Antigua and Barbuda AI Anguilla AL Albania AM Armenia AN Netherlands Antilles AO Angola AQ Antarctica AR Argentina AS American Samoa AT Austria AU Australia AW Aruba AZ Azerbaijan BA Bosnia and Herzegovina BB Barbados BD Bangladesh BE Belgium BF Burkina Faso BG Bulgaria BH Bahrain BI Burundi BJ Benin BM Bermuda BN Brunei Darussalam BO Bolivia BR Brazil BS Bahamas BT Bhutan BV Bouvet Island BW Botswana BY Belarus BZ Belize CA Canada CC Cocos (Keeling) Islands CD Congo, The Democratic Republic of the CF Central African Republic CG Congo CH Switzerland CI Cote d’Ivoire CK Cook Islands CL Chile CM Cameroon CN China CO Colombia CR Costa Rica CU Cuba CustomCode — Reserved for internal or future use. CV Cape Verde CX Christmas Island CY Cyprus CZ Czech Republic DE Germany DJ Djibouti DK Denmark DM Dominica DO Dominican Republic DZ Algeria EC Ecuador EE Estonia EG Egypt EH Western Sahara ER Eritrea ES Spain ET Ethiopia FI Finland FJ Fiji FK Falkland Islands (Malvinas) FM Micronesia, Federated States of FO Faroe Islands FR France GA Gabon GB United Kingdom GD Grenada GE Georgia GF French Guiana GG Guernsey GH Ghana GI Gibraltar GL Greenland GM Gambia GN Guinea GP Guadeloupe GQ Equatorial Guinea GR Greece GS South Georgia and the South Sandwich Islands GT Guatemala GU Guam GW Guinea-Bissau GY Guyana HK Hong Kong HM Heard Island and McDonald Islands HN Honduras HR Croatia HT Haiti HU Hungary ID Indonesia IE Ireland IL Israel IN India IO British Indian Ocean Territory IQ Iraq IR Iran, Islamic Republic of IS Iceland IT Italy JE Jersey JM Jamaica JO Jordan JP Japan KE Kenya KG Kyrgyzstan KH Cambodia KI Kiribati KM Comoros KN Saint Kitts and Nevis KP Korea, Democratic People’s Republic of KR Korea, Republic of KW Kuwait KY Cayman Islands KZ Kazakhstan LA Lao People’s Democratic Republic LB Lebanon LC Saint Lucia LI Liechtenstein LK Sri Lanka LR Liberia LS Lesotho LT Lithuania LU Luxembourg LV Latvia LY Libyan Arab Jamahiriya MA Morocco MC Monaco MD Moldova, Republic of ME Montenegro MG Madagascar MH Marshall Islands MK Macedonia, the Former Yugoslav Republic of ML Mali MM Myanmar MN Mongolia MO Macao MP Northern Mariana Islands MQ Martinique MR Mauritania MS Montserrat MT Malta MU Mauritius MV Maldives MW Malawi MX Mexico MY Malaysia MZ Mozambique NA Namibia NC New Caledonia NE Niger NF Norfolk Island NG Nigeria NI Nicaragua NL Netherlands NO Norway NP Nepal NR Nauru NU Niue NZ New Zealand OM Oman PA Panama PE Peru PF French Polynesia Includes Tahiti. PG Papua New Guinea PH Philippines PK Pakistan PL Poland PM Saint Pierre and Miquelon PN Pitcairn PR Puerto Rico PS Palestinian territory, Occupied PT Portugal PW Palau PY Paraguay QA Qatar QM — Former eBay code for Guernsey (pre-ISO). Retained for backward compatibility. QN — Former eBay code for Jan Mayen (pre-ISO). Retained for backward compatibility. QO — Former eBay code for Jersey (pre-ISO). Retained for backward compatibility. RE Reunion RO Romania RS Serbia RU Russian Federation RW Rwanda SA Saudi Arabia SB Solomon Islands SC Seychelles SD Sudan SE Sweden SG Singapore SH Saint Helena SI Slovenia SJ Svalbard and Jan Mayen SK Slovakia SL Sierra Leone SM San Marino SN Senegal SO Somalia SR Suriname ST Sao Tome and Principe SV El Salvador SY Syrian Arab Republic SZ Swaziland TC Turks and Caicos Islands TD Chad TF French Southern Territories TG Togo TH Thailand TJ Tajikistan TK Tokelau TM Turkmenistan TN Tunisia TO Tonga TP — No longer in use. TR Turkey TT Trinidad and Tobago TV Tuvalu TW Taiwan, Province of China TZ Tanzania, United Republic of UA Ukraine UG Uganda UM — No longer viable. Use US instead. Retained for backward compatibility. US United States UY Uruguay UZ Uzbekistan VA Holy See (Vatican City state) VC Saint Vincent and the Grenadines VE Venezuela VG Virgin Islands, British VI Virgin Islands, U.S. VN Viet Nam VU Vanuatu WF Wallis and Futuna WS Samoa YE Yemen YT Mayotte YU — No longer in use. See RS for Serbia and ME for Montenegro. ZA South Africa ZM Zambia ZW Zimbabwe ZZ — Unknown country.

'First Look: The Artical Trailer for Kichidi'

Saahith Mothkuri’s Kichidi finally has a trailer, and it’s worth the wait. The Artical trailer drops a mood before it drops a plot. You get flashes of humour, a romance that doesn’t explain itself, and enough suspense to make you wonder what happens after the screen cuts to black. That’s how a trailer should work – it sells the feeling, not the summary. Mothkuri has been building a reputation for stories that sit somewhere between the familiar and the unexpected. Kichidi keeps that thread but pushes it further. The characters in these first glimpses feel like people you’d actually recognise, not the polished archetypes that fill most of the screen time these days. And the camera work has a quiet confidence to it – it trusts you to pick up on the atmosphere without spelling everything out. ...

Dumping a node field as an array in Drupal 6

There are times in Drupal 6 when you need to see what’s actually sitting inside a node’s field – the raw structure, the keys, the values. The UI won’t show you that, and dpm() from Devel can be overkill if you just want a quick dump. The content_fields() function returns the field data as an array, and wrapping it in var_export() gives you a readable output you can paste into a debugger or log file. ...

Drupal 7 Mobile Boilerplate Theme

Mobile web development in 2013 is a mess of browser quirks, viewport headaches, and CSS bugs that multiply with every platform you touch. I built the Mobile Boilerplate theme for Drupal 7 to stop reinventing the wheel every time I needed a mobile-ready starting point. It’s a collection of fixes, polyfills, and sensible defaults that handle the boring stuff so you can focus on building something that works. What’s in it The theme ships with a bunch of things you’d otherwise spend an afternoon Googling: ...

Building an Online Temperature Monitoring System

I built this as a final year project — an embedded system that reads temperature from sensors, stores the data, and makes it available over a serial connection. Nothing fancy, but it was a useful exercise in getting hardware and software to talk to each other. You can download the project report. What it does The system reads temperature from external sensors, converts the analog signal to digital, logs the readings with timestamps, and exposes the data over a serial link so a PC can pull it. A 16x2 LCD shows the current state locally. ...

Hiding a DataTables column without removing it from the DOM

Sometimes you want to hide a column in a DataTable but keep its data in the DOM – maybe you need it for export, for a tooltip, or for some other operation that happens after the table renders. Removing the column entirely means losing that data, which isn’t always an option. The fix is embarrassingly simple: CSS. The setup Add a class to the column you want to hide using the sClass option in your DataTables initialisation: ...

eBay UK shipping services — a complete list from the API

<?xml version="1.0&#8243; encoding="UTF-8&#8243;?> <GeteBayDetailsResponse xmlns="urn:ebay:apis:eBLBaseComponents"> <Timestamp>2013-04-13T07:54:20.770Z</Timestamp> <Ack>Success</Ack> <Version>813</Version> <Build>E813\_INTL\_BUNDLED\_15816370\_R1</Build> <ShippingServiceDetails> <Description>Standard Int'l Postage</Description> <InternationalService>true</InternationalService> <ShippingService>UK_SellersStandardInternationalRate</ShippingService> <ShippingServiceID>50301</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>STANDARD</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Collect+ Tracked: drop at store-delivery to door</Description> <ShippingService>UK_CollectPlusTrakedDeliveryToDoor</ShippingService> <ShippingServiceID>330</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail Airmail (Small Packets)</Description> <InternationalService>true</InternationalService> <ShippingService>UK_RoyalMailAirmailInternational</ShippingService> <ShippingServiceID>50302</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Hermes Tracked</Description> <ShippingService>UK_myHermesDoorToDoorService</ShippingService> <ShippingServiceID>322</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail 1st Class</Description> <ShippingService>UK_RoyalMailFirstClassStandard</ShippingService> <ShippingServiceID>301</ShippingServiceID> <ShippingTimeMax>2</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>STANDARD</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail 1st Class Standard Medium Parcel</Description> <ShippingService>UK_RoyalMailFirstClassStandardMediumParcel</ShippingService> <ShippingServiceID>332</ShippingServiceID> <ShippingTimeMax>2</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>STANDARD</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail Airsure</Description> <InternationalService>true</InternationalService> <ShippingService>UK_RoyalMailAirsureInternational</ShippingService> <ShippingServiceID>50303</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail 2nd Class</Description> <ShippingService>UK_RoyalMailSecondClassStandard</ShippingService> <ShippingServiceID>302</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail Surface Mail</Description> <InternationalService>true</InternationalService> <ShippingService>UK_RoyalMailSurfaceMailInternational</ShippingService> <ShippingServiceID>50304</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail 1st Class Signed For</Description> <ShippingService>UK_RoyalMailFirstClassRecorded</ShippingService> <ShippingServiceID>303</ShippingServiceID> <ShippingTimeMax>2</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>STANDARD</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail 1st Class Recorded Medium Parcel</Description> <ShippingService>UK_RoyalMailFirstClassRecordedMediumParcel</ShippingService> <ShippingServiceID>333</ShippingServiceID> <ShippingTimeMax>2</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>STANDARD</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail 2nd Class Signed For</Description> <ShippingService>UK_RoyalMailSecondClassRecorded</ShippingService> <ShippingServiceID>304</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail International Signed-for</Description> <InternationalService>true</InternationalService> <ShippingService>UK_RoyalMailInternationalSignedFor</ShippingService> <ShippingServiceID>50305</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail HM Forces Mail</Description> <InternationalService>true</InternationalService> <ShippingService>UK_RoyalMailHMForcesMailInternational</ShippingService> <ShippingServiceID>50306</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail Special Delivery</Description> <ExpeditedService>true</ExpeditedService> <ShippingService>UK_RoyalMailSpecialDelivery</ShippingService> <ShippingServiceID>305</ShippingServiceID> <ShippingTimeMax>1</ShippingTimeMax> <ShippingTimeMin>0</ShippingTimeMin> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ONE_DAY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail Tracked 48</Description> <ShippingService>UK_RoyalMailTracked</ShippingService> <ShippingServiceID>327</ShippingServiceID> <ShippingTimeMax>3</ShippingTimeMax> <ShippingTimeMin>2</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>STANDARD</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail Special Delivery (TM) 1:00 pm</Description> <ExpeditedService>true</ExpeditedService> <ShippingService>UK_RoyalMailSpecialDeliveryNextDay</ShippingService> <ShippingServiceID>312</ShippingServiceID> <ShippingTimeMax>1</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ONE_DAY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail Special Delivery (TM) 9:00 am</Description> <ExpeditedService>true</ExpeditedService> <ShippingService>UK_RoyalMailSpecialDelivery9am</ShippingService> <ShippingServiceID>313</ShippingServiceID> <ShippingTimeMax>1</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ONE_DAY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail Tracked 24</Description> <ExpeditedService>true</ExpeditedService> <ShippingService>UK_RoyalMailNextDay</ShippingService> <ShippingServiceID>328</ShippingServiceID> <ShippingTimeMax>1</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ONE_DAY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Parcelforce International Datapost</Description> <InternationalService>true</InternationalService> <ShippingService>UK_ParcelForceInternationalDatapost</ShippingService> <ShippingServiceID>50307</ShippingServiceID> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Royal Mail Standard Parcels</Description> <ShippingService>UK_RoyalMailStandardParcel</ShippingService> <ShippingServiceID>306</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Parcelforce 24</Description> <ExpeditedService>true</ExpeditedService> <ShippingService>UK_Parcelforce24</ShippingService> <ShippingServiceID>307</ShippingServiceID> <ShippingTimeMax>1</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ONE_DAY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Parcelforce Ireland 24</Description> <InternationalService>true</InternationalService> <ShippingService>UK_ParcelForceIreland24International</ShippingService> <ShippingServiceID>50308</ShippingServiceID> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Collect+ Tracked (Jiffy Bag up to 2Kg): drop at store – deliver to door</Description> <ShippingService>UK_CollectPlusTrackJiffyBag</ShippingService> <ShippingServiceID>324</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Collect+ : drop at store-delivery to door</Description> <ShippingService>UK_CollectDropAtStoreDeliveryToDoor</ShippingService> <ShippingServiceID>323</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Collect+ Tracked (Standard up to 5kg): drop at store – deliver to door</Description> <ShippingService>UK_CollectPlusTrackStandard</ShippingService> <ShippingServiceID>325</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Collect+ Tracked (Heavy up to 10kg): drop at store – deliver to door</Description> <ShippingService>UK_CollectPlusTrackHeavy</ShippingService> <ShippingServiceID>326</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Parcelforce 48</Description> <ShippingService>UK_Parcelforce48</ShippingService> <ShippingServiceID>308</ShippingServiceID> <ShippingTimeMax>2</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>STANDARD</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Parcelforce Euro 48</Description> <InternationalService>true</InternationalService> <ShippingService>UK_ParcelForceEuro48International</ShippingService> <ShippingServiceID>50309</ShippingServiceID> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Parcelforce Global Express</Description> <InternationalService>true</InternationalService> <ShippingService>UK_ParcelForceIntlExpress</ShippingService> <ShippingServiceID>50316</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Other 24 Hour Courier</Description> <ExpeditedService>true</ExpeditedService> <ShippingService>UK_OtherCourier24</ShippingService> <ShippingServiceID>314</ShippingServiceID> <ShippingTimeMax>1</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ONE_DAY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Parcelforce Global Priority</Description> <InternationalService>true</InternationalService> <ShippingService>UK_ParcelForceInternationalScheduled</ShippingService> <ShippingServiceID>50310</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Parcelforce Global Value</Description> <InternationalService>true</InternationalService> <ShippingService>UK_ParcelForceIntlValue</ShippingService> <ShippingServiceID>50317</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Parcelforce Global Economy (Not available for destinations in Europe)</Description> <InternationalService>true</InternationalService> <ShippingService>UK_ParcelForceIntlEconomy</ShippingService> <ShippingServiceID>50318</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Economy Int'l Postage</Description> <InternationalService>true</InternationalService> <ShippingService>UK_OtherCourierOrDeliveryInternational</ShippingService> <ShippingServiceID>50311</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Other 48 Hour Courier</Description> <ShippingService>UK_OtherCourier48</ShippingService> <ShippingServiceID>315</ShippingServiceID> <ShippingTimeMax>2</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>STANDARD</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Other Courier 3 days</Description> <ShippingService>UK_OtherCourier3Days</ShippingService> <ShippingServiceID>317</ShippingServiceID> <ShippingTimeMax>3</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <DimensionsRequired>true</DimensionsRequired> <ValidForSellingFlow>true</ValidForSellingFlow> <ShippingCarrier>Other</ShippingCarrier> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Other Courier 5 days</Description> <ShippingService>UK_OtherCourier5Days</ShippingService> <ShippingServiceID>318</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>0</ShippingTimeMin> <ServiceType>Flat</ServiceType> <DimensionsRequired>true</DimensionsRequired> <ValidForSellingFlow>true</ValidForSellingFlow> <ShippingCarrier>Other</ShippingCarrier> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Other Courier</Description> <ShippingService>UK_OtherCourier</ShippingService> <ShippingServiceID>309</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Express Int'l Postage</Description> <InternationalService>true</InternationalService> <ShippingService>UK_CollectInPersonInternational</ShippingService> <ShippingServiceID>50312</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>EXPEDITED</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Other Courier 3-5 days</Description> <ShippingService>UK_SellersStandardRate</ShippingService> <ShippingServiceID>310</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>ECONOMY</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Collection in Person</Description> <ShippingService>UK_CollectInPerson</ShippingService> <ShippingServiceID>311</ShippingServiceID> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>PICKUP</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>International Tracked Postage</Description> <InternationalService>true</InternationalService> <ShippingService>UK_IntlTrackedPostage</ShippingService> <ShippingServiceID>50319</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>2</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>EXPEDITED</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Economy Delivery from outside UK</Description> <ShippingService>UK_EconomyShippingFromOutside</ShippingService> <ShippingServiceID>319</ShippingServiceID> <ShippingTimeMax>22</ShippingTimeMax> <ShippingTimeMin>10</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>OTHER</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Standard Delivery from outside UK with Royal Mail</Description> <ShippingService>StandardDeliveryfromOutsideUKwithRoyalMail</ShippingService> <ShippingServiceID>329</ShippingServiceID> <ShippingTimeMax>13</ShippingTimeMax> <ShippingTimeMin>7</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>OTHER</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Standard Delivery from outside UK</Description> <ShippingService>UK_StandardShippingFromOutside</ShippingService> <ShippingServiceID>320</ShippingServiceID> <ShippingTimeMax>10</ShippingTimeMax> <ShippingTimeMin>4</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>OTHER</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Express Delivery from outside UK</Description> <ShippingService>UK_ExpeditedShippingFromOutside</ShippingService> <ShippingServiceID>321</ShippingServiceID> <ShippingTimeMax>3</ShippingTimeMax> <ShippingTimeMin>1</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>OTHER</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>FedEx International Economy</Description> <ShippingService>UK_FedExIntlEconomy</ShippingService> <ShippingServiceID>168</ShippingServiceID> <ShippingTimeMax>4</ShippingTimeMax> <ShippingTimeMin>3</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <SurchargeApplicable>true</SurchargeApplicable> <ShippingCarrier>FedEx</ShippingCarrier> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>OTHER</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>TNT International Express</Description> <ShippingService>UK_TntIntlExp</ShippingService> <ShippingServiceID>170</ShippingServiceID> <ShippingTimeMax>3</ShippingTimeMax> <ShippingTimeMin>2</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <ShippingCarrier>Other</ShippingCarrier> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>OTHER</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Tracked delivery from outside UK</Description> <ShippingService>UK_TrackedDeliveryFromAbroad</ShippingService> <ShippingServiceID>331</ShippingServiceID> <ShippingTimeMax>5</ShippingTimeMax> <ShippingTimeMin>2</ShippingTimeMin> <ServiceType>Flat</ServiceType> <ValidForSellingFlow>true</ValidForSellingFlow> <ShippingCarrier>Other</ShippingCarrier> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>OTHER</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Promotional Postage Service</Description> <ShippingService>PromotionalShippingMethod</ShippingService> <ShippingServiceID>399</ShippingServiceID> <ServiceType>Flat</ServiceType> <ServiceType>Calculated</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>PROMOTIONAL</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Freight</Description> <ShippingService>Courier</ShippingService> <ShippingServiceID>316</ShippingServiceID> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>NONE</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Other Int'l Postage (see description)</Description> <InternationalService>true</InternationalService> <ShippingService>UK_OtherInternationalPostage</ShippingService> <ShippingServiceID>50315</ShippingServiceID> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>OTHER</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Standard Int'l Flat Rate Postage</Description> <InternationalService>true</InternationalService> <ShippingService>UK_StandardInternationalFlatRatePostage</ShippingService> <ShippingServiceID>50313</ShippingServiceID> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>STANDARD</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Expedited Int'l Flat Rate Postage</Description> <InternationalService>true</InternationalService> <ShippingService>UK_ExpeditedInternationalFlatRatePostage</ShippingService> <ShippingServiceID>50314</ShippingServiceID> <ServiceType>Flat</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>EXPEDITED</ShippingCategory> </ShippingServiceDetails> <ShippingServiceDetails> <Description>Promotional Postage Service</Description> <InternationalService>true</InternationalService> <ShippingService>PromotionalShippingMethod</ShippingService> <ShippingServiceID>50399</ShippingServiceID> <ServiceType>Flat</ServiceType> <ServiceType>Calculated</ServiceType> <DetailVersion>74</DetailVersion> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> <ShippingCategory>PROMOTIONAL</ShippingCategory> </ShippingServiceDetails> <UpdateTime>2013-04-08T14:42:28.000Z</UpdateTime> </GeteBayDetailsResponse>

BottomToolBar - a scrolling ticker for your website

I’ve been working on something called BottomToolBar. It’s a small piece of JavaScript that drops a scrolling bar into the bottom of your browser window – the kind you see on news channels, the one that runs along the bottom of the screen with headlines and images. I thought it might be useful for websites. How it works The bar sits at the bottom of the viewport, fixed in place, always on top of everything else. Content scrolls through it from right to left (or left to right, your call), separated by images – usually a logo or icon. It pulls text and images from a server, so you can update what it shows without touching the page itself. ...

Generic Hardening - A Reference Guide

I put together this document as a reference for system hardening. It covers the basics – what hardening actually means, the formula for building a hardened system, and how virtualisation changes the picture. You can download the full guide as a Word document. What is System Hardening? Hardening is just the practice of making a system more resistant to attack. The guiding idea is least privilege: only what’s needed runs, only what’s needed is exposed. ...

Goa's FRRO got OCI powers in October 2012

On October 12, 2012, the Ministry of Home Affairs delegated powers to the Foreigners Regional Registration Office in Goa to accept and process Overseas Citizen of India card applications. A day later, in a follow-up letter, the same ministry qualified the delegation by noting that the Goa FRRO lacked adequate infrastructure and manpower, and that OCI applications would continue to be dealt with by FRRO Mumbai “till further orders.” That contradiction has defined the situation ever since. ...

'A Passage to Goa: A Generation and More Later'

This is a translation of an article “Passagem para a Índia” published in the magazine section of O Expresso on December 8, 2001. Translated by Gabriel Figueiredo, reproduced here with his permission. It tells the story of the 1961 Indian annexation of Goa from a Portuguese perspective, through the eyes of Carlos Azaredo. At 0:00 hours on December 18, 1961, the invasion of Goa, Damão and Diu began. It lasted 36 hours. The disproportion was obscene: Indian forces were 13 times larger than the Portuguese garrison. The “total sacrifice” Salazar demanded would have been a tragedy. General Vassalo e Silva, the last governor of 451 years of Portuguese India, understood this when he surrendered. ...

Juniper Hardening Procedure

DOWNLOAD - Juniper device hardening Introduction Rationale An out-of-box firewall implementation is not fully secure and needs to be hardened. This document details the various aspects of Juniper firewall security and standards implemented for securing Juniper firewalls. Purpose This document is to define a baseline security standard for the Juniper Firewall implementations by firewall administrators. Scope These security standards cover the Juniper Firewall Screen OS implementation. However, for some setups, this minimum requirement and some features of these standards may not be practical for implementation. For exceptions, the system administrators must document the reasons for not complying fully with these standards and request an exemption from the Security department. ...

Hardening Solaris Systems in Production

Hardening Solaris Systems in Production When you’re running enterprise workloads on Solaris — databases, application servers, web fronts — the gap between “it works” and “it’s secure” is a lot wider than most people expect. I spent a good chunk of time working through hardening procedures for a fleet of Solaris boxes, and what follows is the procedure we landed on. The scope covered four server types: database, web, application, and utility. Every one of them got the same four security layers, regardless of role. ...

Third party assessment document

Vendor Assessment Type: Vendor Assessment Project Information Field Description Value Name Enter the name TPA: Project Name Whirlpool project name requesting third party or service provider connection TPA: Project Owner Whirlpool project owner requesting third party or service provider connection TPA: Business Area Whirlpool business area or process supported by the third party or service provider TPA: Service Provider Name Service provider company name TPA: Service Provider Contact Service provider or third party contact TPA: Target Implementation Date Target implementation date TPA: CISO Vendor Chief Information Security Officer (CISO) or equivalent TPA: User Directory Choose the user directory used to manage security and provisioning of access on your internal network TPA: OS and database List the operating system and database used to manage Whirlpool data TPA: Datacenter location List the location of the datacenter that hosts Whirlpool data OS/Database options: Mainframe, Unix, AS400, Windows, Oracle, DB2/UDB, MS SQL, Other ...

Firefox OS Clock app running on Ubuntu with Firefox Marketplace in the background

Running Firefox OS apps on Ubuntu Linux

Mozilla announced Firefox OS back in 2011 under the codename Boot2Gecko, and since then the project has gone from a concept to something you can actually run on your desktop. I’ve been following it closely and finally got around to setting it up on my Ubuntu machine. Here’s how. What is Firefox OS? Firefox OS is Mozilla’s attempt at building a mobile operating system entirely from web standards. There’s no Java, no native SDK, no proprietary frameworks. The entire user interface – called Gaia – is built in HTML, CSS, and JavaScript. The rendering engine underneath is Gecko, the same one that powers Firefox. And at the bottom, it runs on a Linux kernel. ...

iOS-inspired WordPress Theme

I made a WordPress theme that looks like iOS

I’ve been staring at my iPhone all day and I got tired of how every WordPress blog looks the same – flat headers, generic sidebars, the whole deal. So I spent the evening building a theme that actually looks like iOS, and I’m putting it up for anyone who wants it. The whole thing is built around that familiar iOS table view look. Striped background, rounded white cells with the little chevron arrows, a search bar at the top that matches the system aesthetic. It’s not trying to be a 1:1 copy of the iPhone – it’s just borrowing enough of the visual language that people who spend their days in iOS will feel at home. ...

Release Engineering

Release Engineering I’ve been thinking about how we get changes from a laptop into production without someone having to SSH in and type things by hand. The answer, as it turns out, is a pipeline. Nothing fancy. Just a chain of steps that each do one thing and pass the result to the next. Here’s what we’re building. Git Everything starts in a Git repository. Puppet manifests, config files, deployment scripts — all of it. If it’s not in Git, it doesn’t exist. This is the part that matters most and the part people resist the most, because Git means your changes are visible. ...

A Risk Assessment Checklist for Software Projects

I picked this up a while back and it’s been sitting in my notes ever since. It’s a risk assessment checklist for software projects — the kind of thing you’d run through before committing to a contract or kicking off a big engagement. The original is a ten-page Word document with checkboxes. I’ve reorganised it here so it’s easier to scan. The categories are roughly in order of how you’d work through them: start with requirements, move through design and implementation, then look at process, people, and external pressures. ...

Perl Expect Bindings - A Simple Example

I ran into a situation recently where I needed a Perl script to launch another program, wait for it to finish, and move on. Nothing fancy. A simple spawn-and-wait. But doing it the naive way — backticks, pipe reads, polling — felt like overkill for what should be a two-liner. That’s where the Expect module comes in. It’s been around since the 90s, originally ported from the Tcl expect tool, and it does exactly what you’d expect: it spawns a process, talks to its stdin, reads its stdout, and waits for specific patterns. For simple cases it’s overkill. For anything that involves an interactive prompt or a non-trivial exit condition, it saves you from writing your own state machine. ...

Some of my favourite cell phones

There was a period, roughly 2004 to 2008, when phone manufacturers decided that phones could be fashion accessories. Not phones that looked like fashion accessories. Actual fashion accessories that happened to make phone calls. I collected a few of them, or at least got close enough to handle them, and I still think some of the best phones I’ve ever held had nothing to do with specs or benchmarks. Nokia 8800 Sirocco This was the one that started it for me. Stainless steel body, a sliding mechanism that felt like opening a luxury watch case, and a weight to it that told you it was built from something real. The Nokia 8800 Sirocco wasn’t trying to be a smartphone. It was trying to be a thing you pulled out of your pocket and knew, immediately, was expensive. It worked. ...

My email to Datawind, the company behind the Aakash Ubislate tablet

I prebooked an Aakash Ubislate tablet on its first day of availability. Two months later, I’m still waiting, and the email chain with Datawind’s support team tells the whole story. The booking confirmation Dear Shafiq, Your Booking ID is : xxxxxxxxx Someone from our sales team would get in touch with you and provide you with the payment and delivery options. The commercial version of the UbiSlate would be launched in early weeks of December. ...

Continuous Delivery

I’ve been thinking about continuous delivery a lot lately, and the thing that keeps coming back to me is how much of a pain it is when someone logs into a server and makes a change by hand. You know the type. Production is down, someone jumps in, tweaks a config file, restarts a service, and everything works again. Great. Except now that server has a configuration that exists in no repository, no documentation, and no one else’s head. Next time something breaks, you’ll spend hours chasing a difference that nobody bothered to record. ...

'How much memory is actually free?'

I keep forgetting this one, so here it is. vmstat -s -SM | grep "free memory" | awk -F" " '{print$1}' It pipes vmstat output through grep and awk to pull just the number – no units, no labels, just the gigabytes sitting there doing nothing.

Effective human-computer interaction through cognitive biometrics

This is a paper I wrote exploring how brain-machine interfaces could change the way we interact with computers. The core idea was simple: most interfaces still demand motor work — hands on a keyboard, fingers on a mouse. What if you could skip that entirely? The problem Human-computer interaction has come a long way. Touchscreens let you bypass the mouse. But you still need hands. For some people — those with motor impairments, for example — that’s a real barrier. Even for everyone else, there’s something inherently slower about translating a thought into a hand movement, then into a keystroke or click. ...

Applications of Neural Networks

This is a collection of research projects and applications I worked on using neural networks. Most of the video demos linked below are no longer available — the servers they lived on have been dead for years. I’m keeping the descriptions because they capture what the work was about. What is a Neural Network? An artificial neural network (ANN) is an information processing system inspired by biological nervous systems. It’s made up of a large number of interconnected processing elements — neurons — that work together to solve problems. Like people, ANNs learn by example. You configure them for a task, whether that’s pattern recognition or data classification, and they figure out the solution through a learning process. In biological systems, learning means adjusting synaptic connections between neurons. Neural networks do the same thing. ...

Walking Through OTC in SAP

Download Full Guide: OTC Flow Document Sales Order T-Code: VA01 Setting Value Company Code 4700 Sales Document Type ZOR Sales Area 4700/10/10 Header level: Sold-to-party: 1000991 Ship-to-party: 1000991 PO Number: ‘Test’ Payment term: 0001 Item level: Material code: 1000309 Order Quantity: 1 Plant: 4702 Press Enter Item billing: INCOTerms: CFR (Cost and Freight) Save Delivery T-Code: VL01N Setting Value Delivery Document Type ZLF Shipping Point 4702 Enter the Sales Document number from the previous step. Make sure the Delivery Date is set — it should pull through from the Schedule Lines in the Sales Order. ...

Order to Cash — What It Actually Means

I spent a fair amount of time working on SAP implementations back in the day, and one of the modules that came up again and again was Order to Cash. People throw the term around in meetings like it means something obvious, but if you ask five people what OTC actually covers, you will get five different answers. So here is my take on it — not a textbook definition, but what it looks like from the inside. ...

Status Quo — A Review of Some Testing Practices

I spent a fair amount of time on SAP implementations, and testing was always one of those areas that people talked about in the project plan but never really thought through until something broke. So here is a review of some testing practices I encountered — what worked, what did not, and what I wish someone had told me earlier. Methodology Matters (Even If You Think It Does Not) Every SAP project has a methodology. Sometimes it is a proper one — Deloitte’s Thread Manager, IBM’s Ascendant, SAP’s own Roadmap through Solution Manager. Sometimes it is “we did something similar last time, let’s do that again.” Sometimes it is nothing at all, and the project is winging it. ...

Staying Online

Back in the ’80s the Bee Gees crooned “Staying Alive.” In today’s parlance, that would be “Staying Online.” Corny reference aside, the point is: building a web presence is one of the most important things you can do for your personal and professional life. But what does that actually mean? Is it just getting an email address? Putting up a website? Something about your online conduct? It’s all of those things and more. It’s closer to creating an identity — the online version of who you are. ...

A Sample Scrum Template

I needed a simple way to track a scrum project without investing in a tool, so I built a spreadsheet template. It’s not meant to replace anything serious – just something to get the structure down on paper before things get messy. You can grab it here: scrum-tmpl-100212 It’s got three sheets. The first is basic project info – organisation, project name, scrum master, product owner, start date. The second is the product backlog, laid out by sprint with room to track effort against each release. The third is an impediments log, so when something blocks the team you write it down with a category, date, and who raised it instead of letting it get lost in a standup conversation. ...

A project proposal template I keep coming back to

I’ve written enough project proposals over the years to know that the hardest part is usually the first page. You sit down with a blank document, a client’s RFP, and a deadline that’s already too tight, and you wonder where to start. So I made a template. Not because it’s brilliant, but because it stops me from spinning my wheels every time. You can grab the Word file here: proposal-template.doc ...

How we handle proposals and contracts

I’ve seen too many teams treat proposals and contracts as paperwork – something you rush through on the way to the “real work”. That attitude costs money. I’ve watched deals fall apart because someone skipped a step, or signed something they didn’t understand, or assumed the other side was on the same page. So we wrote a procedure. Not because we’re a big company with a compliance department, but because we kept making the same mistakes. ...

A Sample Issue Tracker Spreadsheet

I put together a simple issue tracker spreadsheet for a project I was working on. Nothing fancy – just something to keep track of bugs, tasks, and sub-tasks without the overhead of setting up a full issue tracking system. The idea was to have something lightweight that anyone on the team could open and update without needing special software. You can grab it here: sample issue tracker spreadsheet It’s got the basics: issue type, status, priority, resolution, assignee, reporter, dates, and an SLA column. The sample data shows what it looks like with a mix of open, verified, and closed issues at different priority levels. ...

Iomega Customer Service in India

A few months back I picked up a Prestige portable hard drive from IT dot COM, a shop in Margao, Goa. It worked fine for a while, then one day the indicator light started blinking and wouldn’t stop. The drive wouldn’t show up on any of the computers I plugged it into. I was in Hyderabad at the time. I looked up authorised Iomega service centres nearby and found none. None in Hyderabad, none in Secunderabad. So I waited till I was back in Goa and took the drive to the store. ...

Replacing an IP address with sed

Sometimes you need to swap an IP address out of a file. Maybe you are moving a server to a new host, updating a config, or just tired of grepping through logs to find the old address. Whatever the reason, sed makes it trivial. The trick is matching the dotted-decimal pattern. An IP address is four groups of numbers separated by dots, so the regex needs to capture that structure. Here is the one-liner: ...

Zap v3 v2344

Black & Blue — a free PSD template

This is a template I designed for Zap Web Online — a web solutions company that wanted a dark, techy look. The brief was fairly open: make it look fast, modern, and a bit futuristic. Hence the name. The layout is a fixed-width centre column on a textured metallic background. The header has the Zap Web logo on the left, a four-item navigation bar (Home, About Us, Portfolio, Contact) with blue highlight on the active tab, and a “Chat Live” button tucked into the top right of the banner. The banner itself is a glowing blue waveform against a black gradient with the tagline “Lightning Fast Web Solutions”. ...

How I Built My First Website for My College

Hello everyone! Today I want to share with you the first project I ever did: the college website! This was a very old project that I did with the help of Subhash Dasyam. It was a great learning experience for me and I’m excited to tell you more about it. The Project The college website was a simple static website that showcased the information and achievements of our college, ASTRA. It had pages for the departments, faculty, students, events, gallery, and contact. It also had a login system for the admin and the students. ...

Disable services in Solaris 10

Managing services on Solaris 10 is nothing like Linux. There are no /etc/init.d/ scripts, no service command, no chkconfig. Instead, Solaris uses SMF — the Service Management Facility — and everything goes through svcadm. If you are new to Solaris, this can feel unnecessarily complicated. It is not, once you learn the pattern. Disabling a service You need root privileges or sudo access. The command is: svcadm disable network/cswpuppetd:default The argument is the service FMRI (Fault Management Resource Identifier). For Puppet installed from OpenCSW, the FMRI is network/cswpuppetd:default. The :default part refers to the default instance of the service. Some services have multiple instances, but most only have one. ...

Puppet logs on Solaris 10

Puppet on Solaris 10 stores its logs in the SMF log directory, which is different from the /var/log location you might be used to on Linux. If you are looking for the usual log files and cannot find them, this is probably why. Agent logs The Puppet agent (puppetd) runs as an SMF service, and its log is at: /var/svc/log/network-cswpuppetd:default.log To watch it in real time: tail -f /var/svc/log/network-cswpuppetd:default.log Master logs The Puppet master (puppetmasterd) follows the same pattern: ...

Release Engineering 101 — Using Version Control System (Subversion)

The build script from the last post turns your source code into something runnable. But it does not tell you which version of the source code you are building. That is where version control comes in. I am going to use Subversion for this post because that is what most of the projects I have worked on have used, and it is still the most common version control system in enterprise Java development. Git is fine for other kinds of projects, but the concepts here apply regardless of which system you choose. ...

Notes on Build Scripts — What I Learned the Hard Way

I wrote my first build script in my second year of college. It was a shell script that compiled a few Java files and copied the output into a folder. It worked. For that project, at least. Three years later, working on a team project with five other developers, I realised that script was useless. It assumed a specific directory layout. It assumed a specific version of the JDK. It assumed nobody had moved the source files. It assumed the build machine had the same libraries installed as my laptop. It assumed a lot of things, and every assumption was a potential failure point. ...

Release Engineering 101 — Build Scripts

Every project I have worked on, from small college assignments to larger team efforts, has eventually hit the same wall: someone runs the build, something breaks, and nobody knows why. The code was fine five minutes ago. The build server is down. The classpath is wrong. The compiled output is three versions behind. It is frustrating, it is wasteful, and it is entirely preventable. The fix is a build script. ...

The line that separates a developer from an administrator

You learn more from your mistakes than anything else, and I have made my fair share. The trick is to actually learn from them rather than just suffer through the consequences and call it experience. I have watched developers push code to production on a Friday afternoon because the business was breathing down their necks. The deadline was immovable, the pressure was real, and the production environment was treated as an afterthought. I have seen it happen more times than I care to count, and each time the same thing goes wrong: someone breaks something, and nobody wants to own it. ...

OpenSUSE installer boot menu

'OpenSUSE 11.4 -- first look'

I grabbed the openSUSE 11.4 64-bit ISO last night and spent the afternoon installing it in a VM. Here’s the full walkthrough, screenshots and all. Boot menu. Standard options – Installation, Rescue System, media check. Nothing fancy, but it gets the job done. Welcome screen. The green chameleon is back, and so is the striped wallpaper that’s become the distro’s signature look. ...

running firefox 4 and firefox 3 side by side on ubuntu

Firefox 4 just dropped and you want to try it without losing your current setup? You can run both versions at the same time. Add the Mozilla Daily PPA, update, then install: sudo add-apt-repository ppa:ubuntu-mozilla-daily/ppa sudo apt-get update sudo apt-get install firefox-4.0 Firefox 3 stays as firefox. Firefox 4 runs as firefox-4.0. Both show up in your applications menu, or you can launch them from the terminal whichever you need.

puppet "could not find class in namespace" — it's probably a missing brace

Got this from Puppet? err: Could not retrieve catalogue: Could not find class php in namespaces standardbuild at /etc/puppet/manifests/templates.pp:15 on domain.internal.com The error points at a missing class, but the real culprit is often a missing closing brace somewhere above that line. Puppet’s parser gets confused and reports the wrong thing. Check your manifests for unmatched { and }. A syntax highlighter helps — or just count your braces.

phpize failed? install the dev files

Hit phpize and got a “not found” error? You’re missing the PHP development package. sh: phpize: not found ERROR: `phpize' failed On Ubuntu or Debian, grab it with: sudo apt-get install php5-dev That’s it. phpize should work after that.

Make it free or fail

The freemium model has become all the rage in software circles. Offer a basic version of your product for free, then charge for the good stuff – premium features, extra storage, advanced functionality. It sounds like a clever way to build a user base, and for a handful of companies it has worked. But as someone who has watched this approach play out across the industry, I have my doubts about whether it is the right strategy for most startups. ...

Ubuntu 11.04 Alpha 1, VMware Image for x64

A friend sent me a VMware image of Ubuntu 11.04 Alpha 1, so I’m sharing it here in case anyone wants to try the new release without installing it. The image is a fresh install with GNOME on a 64-bit system. VMware Tools are included, and it was built on VMware Workstation 7.1.2 (build 301548) under Windows. No software updates have been applied, so it’s a clean snapshot of the alpha as it shipped. ...

An Email from Weebly

Got this email from Weebly after a week of inactivity. It’s genuinely good writing – playful without being annoying: It’s been 7 days, 4 hours, 13 minutes and 2 seconds since you last logged in, and we’re starting to get really worried. We were just getting to know each other. You created 1 site, 1 page, dragged on 1 element, and then… nothing. We were really excited for your new website, it had so much potential! ...

bug on google chrome extension labs website

Bug on the Chrome Extension Labs Website

Spotted this broken link on the Chrome Extension Labs page. Looks like the Google developers forgot to update the path. Archived link: https://web.archive.org/web/2014/http://code.google.com/chrome/extensions/apps.html

Stop Deploying by Hand

The idea that you could push code to production without anyone touching a server, running a script, or holding their breath still sounds a bit mad to most developers. Most teams deploy like this: someone merges code, someone else pulls it down on a staging server, runs the tests manually, fixes whatever broke, then schedules a deployment window. Someone SSHs into production, runs a script or types commands by hand, crosses their fingers, and hopes nothing catches fire. If something does go wrong, you roll back by remembering what the last working version was and praying your backups are current. ...

Disabling Google Analytics

Google offers a browser plugin to opt out of Analytics tracking. Grab it from http://tools.google.com/dlpage/gaoptout

Getting the Current Unix Timestamp

Perl: time PHP: time() Ruby: Time.now.to_i Python: import time int(time.time()) Java: long epoch = System.currentTimeMillis() / 1000; C#: epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; VBScript: DateDiff("s", "01/01/1970 00:00:00", Now()) Erlang: calendar:datetime_to_gregorian_seconds(calendar:now_to_universal_time(now())) - 719528*24*3600. MySQL: SELECT unix_timestamp(now()) PostgreSQL: SELECT extract(epoch FROM now()); Oracle: SELECT (SYSDATE - TO_DATE('01-01-1970', 'DD-MM-YYYY')) * 24 * 60 * 60 FROM DUAL SQL Server: SELECT DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE()) JavaScript: Math.round(new Date().getTime() / 1000) Bash: date +%s PowerShell: Get-Date -UFormat "%s"

Database Integration -- Points to Keep in Mind

Have a single authoritative source for your schema. Everyone should know where the official schema lives. You should be able to walk up to a fresh machine, pull from source control, build, and run a simple tool to set up the database. Ideally the build process handles it automatically. Version your database. The goal is to propagate changes from development to test to production in a controlled way. You should also be able to recreate the database at any point in time. If someone reports a bug in build 20100612.1, you need to reproduce the exact database state from that build.

Never Use a Shared Database for Development

A shared database server is a convenience that turns into a trap. Developers overwrite each other’s changes. My changes on the server break your code on your machine. Remote development is slow. Avoid shared databases. The time you save setting up individual databases is nothing compared to the time you’ll waste debugging conflicts.

Deployable Software Is the Only Metric That Matters

We talk endlessly about improved software quality and reduced risks. But for clients and users, the only tangible asset is deployable software. Everything else – process documents, test reports, velocity charts – is noise without working code to back it up.

Note to Self -- Project Management

You can manage scope, time, cost, and quality much more effectively by basing decisions on working software with actual feedback and metrics, not just task items on a project schedule.

Getting System Load in Perl

Use qx() to capture the output of uptime and parse the load averages: # 1-minute load average my $load1 = qx(uptime | awk -F "load average: " '{ print $2 }' | cut -d, -f1); # 5-minute load average my $load5 = qx(uptime | awk -F "load average: " '{ print $2 }' | cut -d, -f2); # 15-minute load average my $load15 = qx(uptime | awk -F "load average: " '{ print $2 }' | cut -d, -f3); Note: use qx() not exec() – exec replaces the current process and doesn’t return.

Gearman Perl "syswrite on an undefined value" Error

If you get this error when running Gearman client code: Can't call method "syswrite" on an undefined value at /usr/local/share/perl/5.10.1/Gearman/Taskset.pm line 202. The fix is to specify the port explicitly. Change: $client->job_servers('127.0.0.1'); To: $client->job_servers('127.0.0.1:4730');

Distributing Work with Gearman and Perl

I’ve been playing with Gearman over the past few weeks and I’m impressed by how little friction there is between the idea of distributing work across machines and actually making it happen. The Perl module, Gearman::Client and Gearman::Worker, is straightforward enough that you can have a client and a worker talking to each other through a job server in under an hour. The basic model is simple. You have a client that submits jobs, a worker that performs them, and a job server sitting in the middle dispatching work to whichever worker is free. The client and worker can be written in different languages, run on different machines, and you don’t need to worry about the networking yourself — Gearman handles all of that through TCP sockets to the job server. ...

Completeness of the Requirements Set

A set of requirements is complete when it describes all significant concerns of the user – functionality, performance, design constraints, attributes, and external interfaces. If any of these are missing, the requirements are incomplete.

Requirements Gathering

There’s no single right way to develop detailed specifications, just as there’s no single right programming language for every application. Different projects demand different techniques. Requirements managers need a mix of skills to adapt to whatever circumstances they’re working in.

Software Development Process

The team’s development process defines who does what, when, and how. Waterfall – activities proceed through a fixed sequence, each step depending on the previous one. Spiral – starts with risk-driven prototypes, then follows a structured waterfall-like process. Iterative – a hybrid that decouples lifecycle phases from the activities within each phase. Whichever model you choose, build at least one early prototype to get customer feedback before committing to a full implementation.

Detailed Estimates Are Often a Waste

Some people believe the best way to estimate a project is to produce detailed requirements and design documents for every feature before writing a line of code. It sounds professional. It sounds thorough. In practice, it usually turns out to be wrong. Requirements change. Priorities shift. The detailed estimate you spent weeks producing becomes irrelevant halfway through the project. That effort becomes wasted inventory – time and resources that could have been spent building something useful instead. ...

Project Scope and Success

In many projects, in order to provide a reasonable probability of success, it will be necessary to reduce the scope by as much as a factor of two. I’ve learned this the hard way. Every project starts with an ambitious list of features and an optimistic timeline. Reality intervenes quickly – resources are tighter than expected, technical problems emerge, and deadlines don’t move. Cutting scope feels like failure. It’s the difference between shipping something that works and shipping nothing at all.

The "Yes, But" Syndrome

Every piece of software I’ve developed elicits the same two reactions when users see it for the first time: First: “Wow, this is cool. We can really use this.” Then, immediately: “Yes, but… now that I see it, what about this? Wouldn’t it be nice if…? Whatever happened to…?” The “Yes, But” syndrome is universal. It comes from the nature of software as something intangible – until users see it, they can’t fully articulate what they need. Seeing the implementation triggers new ideas, new concerns, new requirements that weren’t visible before. ...

Productivity of all Individuals vs. Team Productivity

Software development is a complex and collaborative process that requires effective teamwork and communication. However, many software teams struggle with productivity issues and fail to deliver high-quality products on time and within budget. In this post, I will discuss why team productivity is more important than individual productivity, and how you can improve your software team’s performance by applying some proven strategies and best practices. The Importance of Team Productivity According to Boehm, the COCOMO cost estimation model shows that the capability of the team has the greatest impact on software production. This means that the quality and efficiency of the software product depend largely on how well the team works together. Davis agrees with this conclusion and states that “optimising the productivity of all individuals does not necessarily result in optimising the productivity of the team”. In other words, having a team of highly skilled and productive individuals does not guarantee a successful software project. There are other factors that affect team productivity, such as communication, coordination, collaboration, motivation, and trust. ...

Ipad is a ... ?

What Is the iPad?

Steve Jobs unveiled the iPad yesterday. A tablet. Bigger than a phone, smaller than a laptop. No keyboard, no trackpad, no USB ports worth mentioning. The internet is already divided. Some call it a giant iPhone. Others call it a toy. A few are excited. I don’t have one yet, but the idea of a device that’s comfortable to hold for reading, browsing, and watching videos while on the couch appeals to me. It fills a gap that neither phones nor laptops really cover. ...

Problems and Opportunities

Every problem contains a hidden opportunity. In IT especially – one person’s challenge is another person’s chance to build something better.

Preserving File Permissions When Copying in Linux

Use the -p flag with cp to preserve file permissions: cp -p /aaa/bbb /ccc/ddd

Ajax Tabbed Google Search screenshot

Ajax Tabbed Google Search for Typo3

My first Typo3 extension. It’s a front-end plugin that displays a customised Google search engine on your site, using Ajax with tabs for different result types – no page reload needed. You can download it from the Typo3 Forge (link no longer available). The SVN repository was at svn.typo3.org/TYPO3v4/Extensions/ajax_google_search.

Slash vs Backslash

A thread on Hacker News about the eternal confusion between / and : jordanlund: Confession time… I always get confused about which one is the slash and which one is the backslash. I end up calling them “the one on the question mark” and “the one not on the question mark”. zem: Here’s a simple trick: \ leans back, / leans forward. grantrules: _ is a slash that got tired and lay down. ...

GNUSL3S LINUX OS

GNUSL3S Linux

GNUSL3S Linux is a distribution built in Goa. It bundles a wide range of pre-installed software spanning bioinformatics (EMBOSS, Primer3), security tools for penetration testing, system administration utilities, and development editors. Boot from the DVD for a graphical interface with KDE, XFce, Fluxbox, or IceWM. Based on: Slackware, SLAX, Alixe, Davix Version: 10.05.xx Architecture: i486 (32-bit) Origin: Goa, India Status: Discontinued

Typo3 Reference Manuals as a Chrome Extension

My first Google Chrome extension. It’s a collection of Typo3 reference manuals compiled from typo3.org. Useful if you have a slow or unreliable internet connection (looking at you, India), or if you prefer to stay in the browser while searching the Typo3 swx reference manuals. I wanted to publish it on the Chrome Extension Directory, but the file is 19.86 MB and Google has a 10 MB limit. If anyone knows a workaround, let me know. ...

Identifying Your Linux Distribution

Not sure which Linux distribution you’re running? Open a terminal and type: cat /etc/issue On Debian 4.0, for example, this outputs: Debian GNU/Linux 4.0 \n \l The \n and \l are escape sequences for the hostname and terminal device – they’re not part of the distribution name. This works on most distributions. Some also have /etc/os-release with more detail: cat /etc/os-release

SVN revision control – slides

I put together a presentation on Subversion for a class this semester. The slides cover the basics of revision control and why you should be using it for any project with more than one developer. The problem is simple: how do you coordinate code between multiple people without everything falling apart? You could work on the same machine and take turns. You could email files back and forth. You could dump everything on a shared drive. None of these approaches scale past two people, and even then they’re fragile. ...

Scrum in 8 Steps

Scrum breaks a product into small pieces (backlog items) and works on them in short iterations (sprints). Here’s how it works in practice: 1. Prepare the product backlog. List the features and requirements. Involve stakeholders to prioritise. The product owner is responsible for the vision and goals. 2. Estimate the backlog. As a team, give a rough estimate for each item. Planning poker or t-shirt sizes work well here. 3. Plan the sprint. A sprint is a fixed period – usually one or two weeks. In the sprint planning meeting, decide the duration, goal, which backlog items to tackle, the tasks for each item, and the hours per task. The result is the sprint backlog. ...

Show Your Learning on Your Resume

A degree gets you noticed. What you’ve done since then gets you hired. Here are some ways to show continuous learning on your resume: Professional certifications. They demonstrate you’ve met industry standards and can help you stand out from candidates with similar qualifications. Publications and articles. Writing shows you have something to say and can communicate it clearly. Use them as portfolio samples. Presentations. Speaking at universities, schools, or conferences demonstrates communication skills. Record them and post them online. Volunteer work in your field. Shows genuine interest in your work beyond paid employment. Technical courses and training. List them alongside formal education. IT certifications. Microsoft, Cisco, and similar credentials prove specific technical competence. Many employers look for them. Foreign languages. Learning another language opens doors and shows cultural awareness. Rosetta Stone and subtitled DVDs are good starting points.

Installing PHP 5.3.1 on Ubuntu

Two lines. That’s all it takes. Ubuntu x64: sudo su cd /tmp && mkdir php53 && cd php53 && wget http://php53.dotdeb.org/dotdeb_all.deb && wget http://php53.dotdeb.org/dotdeb.2004.02.25.key && apt-key add dotdeb.2004.02.25.key && dpkg -i dotdeb_all.deb && aptitude update && aptitude install php5 Ubuntu 32-bit (i386): Same command. The dotdeb repository handles both architectures.

Reading a File into a Variable in Perl

For large files, consider File::Slurp. It’s faster than the conventional approaches: # Slurp the whole file { local $/ = undef; open my $fh, '<', 'myfile' or die "Couldn't open file: $!"; binmode $fh; my $string = <$fh>; close $fh; } Without binmode: { local $/ = undef; open my $fh, '<', 'myfile' or die "Couldn't open file: $!"; my $string = <$fh>; close $fh; } Join the lines: open my $fh, '<', 'myfile' or die "Couldn't open file: $!"; my $string = join('', <$fh>); close $fh; Append in a loop: open my $fh, '<', 'myfile' or die "Couldn't open file: $!"; my $string; while (<$fh>) { $string .= $_; } close $fh; Read a fixed number of bytes: open my $fh, '<', 'sample.txt' or die "Error: $!\n"; read($fh, my $data, 2000); close $fh; The read function takes a filehandle, a destination variable, and the number of bytes to read. The example above reads 2000 bytes into $data. ...

Restarting a Project from Scratch

Every programmer knows the urge: scrap everything and rewrite it from scratch. It’s not that the existing code is bad. It’s that it’s hard to understand. Reading code is harder than writing it – you wrote the new code in your head, but the old code belongs to someone else (or to past you, who might as well be someone else). This is why every developer on your team has their own favourite way of splitting strings into arrays. Writing a new function is simpler and more enjoyable than learning how the existing one works. ...

Road Construction in Goa

I commute from Margao to Bambolim every day. Normally a 30-minute drive. Today it took me an hour and forty minutes. There’s road construction near Verna that started four days ago. Four days of digging with no visible progress. And they’ve decided the best time to work is during peak hours – 9:30 am to late evening. Exactly when everyone is trying to get to or from work. I was late for an important meeting today. Had to apologise to my boss and to clients. All because someone thought it was a good idea to block a major route during rush hour. ...

There Is No Such Thing as Hack-Proof Encryption

The goal of encryption isn’t to create something uncrackable. The only truly unhackable computer is one that’s turned off, unplugged, and locked in a vault – and even then, someone could just carry the vault away. Encryption is about making it difficult enough that attackers give up and move on to easier targets. It’s a cost calculation, not a guarantee.

What Is Education? Is College Worth It?

Everyone tells you to go to college. It’s the default path. Finish school, get a degree, find a job. But is it actually worth it? The tuition costs are rising, graduates are struggling to find work in their field, and student debt is becoming a genuine burden. For some people, college is absolutely the right choice. The networking, the structured learning, the credential – it all adds up. For others, it’s four years and a mountain of debt for a piece of paper that doesn’t open any doors. ...

Lemonlaw

Sat at CCD today with friends and we ended up looking up people on Lemonlaw. It only took five minutes. I know that’s not the point of the thing, but it felt wrong how easy it was.

Too Much Change?

A friend mentioned recently that we’re going through too many changes. I didn’t really know what to make of it at the time, but it stuck with me. Later that day I did something daft — I reverted my Facebook profile picture to an old one. I knew it was pointless as soon as I did it. Changing a profile picture doesn’t anchor anything. But I think I was reaching for something familiar, something that hadn’t changed, even if it was just an image on a screen. ...

Go Programming Language - What's the Deal?

Google announced a new programming language called Go on November 10th. It’s from Robert Griesemer, Rob Pike, and Ken Thompson. That last name should tell you something — Ken Thompson co-designed Unix and invented the C programming language. The pitch was simple: a compiled language that feels as quick to write as a scripting language, with built-in concurrency and garbage collection. It’s aimed at the kind of problems that C was always used for, but without the pain of manual memory management and with better support for multi-core processors. ...

Lessons Learned – from a CMS developer

After building and maintaining CMS sites for a while, here are the things I’ve learned the hard way. Don’t run your site from the root directory. Put the CMS in a subdirectory and forward requests there with .htaccess or whatever your server supports. It keeps the CMS files out of the way and makes it harder for someone to guess where things are. A small thing, but it helps. Be careful about advertising what CMS you’re running. ...

The launch of Mandriva Linux 2010

Mandriva Linux 2010 is launching on November 3rd. Highlights from the announcement: KDE 4.3.1, GNOME 2.28, kernel 2.6.31.1, and Xorg 1.6.4 RC 1 with updated Intel graphics drivers. There’s also a Moblin 2 spin for netbooks. I’ve used Mandriva off and on over the years. The Control Centre has always been one of the better configuration tools in the Linux world. Worth keeping an eye on to see how this release shapes up.

Basic Software Development Process – Points

This is the process I follow on projects. It’s not fancy, but it works for me. Defining the requirements. Write down what needs to be built. Be specific. Ambiguous requirements are the root cause of most problems later on. Approval. Get sign-off on the requirements before anything else. If the requirements change later, that’s fine, but do it deliberately, not by accident. Template designs. Work out the structure and layout before writing code. For web projects this means mockups and wireframes. For other projects it means architecture diagrams and data models. Template approval. Get the designs signed off too. It’s cheaper to change a design than to change code. Coding. Build it. Internal release. Get it in front of the team first. Internal testing catches the obvious stuff before anyone external sees it. Testing. Proper testing, not just “I clicked through it once.” Automated tests where possible, manual where necessary. Alpha release. Early access for a small group. Expect bugs. The goal is to find them in a controlled environment. Beta release. Wider release. More users, more edge cases. This is where you learn what people actually do with the software versus what you thought they’d do. Project goes live. Production. The real world. The key thing is not to skip steps. I’ve seen projects that jump straight from requirements to coding and then spend three times as long fixing problems that a proper design phase would have caught.

Arsin Systems — Organisation Profile

I spent some time at Arsin Corporation, a company based in Hyderabad, India that specialises in enterprise software testing. Here’s a summary of what they do, mostly for my own reference. What they do Arsin provides automated testing services for large companies, with a particular focus on SAP. They’ve been around since 1995 and their clients are mostly Fortune 500 companies in pharmaceuticals, finance, healthcare, and technology. The idea is that when you’re running enterprise software, you can’t afford for it to break. Arsin builds the testing infrastructure that catches problems before they reach production. ...

Sales and Distribution module (SAP)

Notes on the SAP SD (Sales and Distribution) module from an implementation project. Mostly for my own reference. What SD does SD covers the sales process from order to cash. It handles customer master data, pricing, orders, deliveries, shipping, and billing. It’s integrated with other SAP modules — MM for materials, FI for finance, PP for production — so changes in SD ripple through the rest of the system. Organisational structure ...

Final Year Project Abstract — Test Automation in ERP Applications

This was my final year project for the B.Tech in Computer Science and Engineering (2008–09), done with K. Nishant. Test Automation in ERP Applications: Optimisation and Enhancement Most large organisations run their business on packaged ERP systems like SAP, Oracle, or PeopleSoft. These get heavily customised to fit each company’s processes, and testing those customisations is expensive and time-consuming. The goal of this project was to build a test automation framework that could run hundreds of test scenarios from a single script. ...

Designer Blue Page Website Template

Designer Blue Page Website Template

A clean, blue-themed website template. Simple layout with plenty of white space.

Some Questions to Ask Before You Join a Startup

I’ve been thinking about what to ask when someone offers you a job at a startup. The usual questions about salary and benefits matter, but there are deeper ones that tell you whether the place is actually going to survive long enough for you to care about that stock option package. Here are some questions I’d ask. How much cash do you have in the bank? Not how much you’re hoping to raise. Not how much you could borrow if things get tight. Actual cash, right now, in an account. ...

9 skills developers will need in the next five years

I was reading through some job listings recently and noticed a pattern. The same skills keep appearing, and the ones that were important five years ago are shifting. Not disappearing entirely, but moving around. Here’s what I think developers should be focusing on right now if they want to stay employable over the next few years. This isn’t exhaustive. There are plenty of specialisms and niches I’m ignoring deliberately. I’m thinking about mainstream development work, the kind most people do. ...

Flash z-order — always on top?

I had a JavaScript pull-down menu that overlapped with a Flash movie. No matter what z-index I set, the menu always rendered behind the Flash content. Classic problem. The fix is to set wmode to transparent on both the <object> and <embed> tags: <object ...> <param name="wmode" value="transparent"> <embed ... wmode="transparent"></embed> </object> This tells the Flash player to respect the browser’s stacking context instead of rendering in its own window layer. The menu displays correctly over the Flash movie after that.

Choose your titles wisely for better URLs

If your CMS generates URLs from page titles, choose those titles carefully. The slug becomes part of the URL and search engines use it as a ranking signal. Use hyphens to separate words, not underscores. Google treats my-page-title as three distinct words but reads my_page_title as one mangled string. Good: /blog/choose-your-titles-wisely-for-better-urls Bad: /blog/choose_your_titles_wisely_for_better_urls Keep titles short and descriptive. Avoid stop words where you can — “the”, “and”, “of” take up space in a URL without adding meaning. And watch out for special characters; they get mangled into ugly encoded strings.

CSS Browser Compatibility Improvement Tip

Different browsers apply different default padding and margin to the <html> and <body> elements. If you don’t reset them, you’ll get unexpected whitespace that varies from one browser to another. The fix is to simply zero them out at the top of your stylesheet: html { padding: 0; margin: 0; } body { padding: 0; margin: 0; } This is the first rule I add to any new project.

CSS fail

Never do this: position: absolute; left: 99px; It feels like a handy quick fix to shove an element where you want it, but it never actually works. The layout breaks as soon as the content changes, the screen resizes, or anyone else touches the code. I learned this the hard way more times than I’d like to admit.

Udbhav 2010 stage backdrop

Backdrop for Udbhav 2010

Udbhav is an annual cultural festival that brings together students through music, dance, and creative expression. For the 2010 edition, I designed another stage backdrop – this time with a slightly different approach to the visual language. The backdrop needed to function as the stage’s focal point while leaving room for the performances. It had to read clearly from the back of the venue, carry energy without overwhelming the stage, and fit the overall visual identity I was building for Udbhav that year. ...

Udbhav 2009 souvenir book cover

Book Cover for Udbhav 2009 Souvenir

Along with the posters, flyers, and backdrop for Udbhav 2009, I designed the cover for the event souvenir book. The brief was straightforward: something that felt cohesive with the rest of the visual identity while standing on its own as a keepsake. This was part of a larger design effort for Udbhav 2009 that also included posters, flyers, stickers, mini banners, and the stage backdrop.

Udbhav 2009 stage backdrop

Backdrop for Udbhav 2009

Udbhav is an annual cultural festival that brings together students through music, dance, and creative expression. For the 2009 edition, I was asked to design a backdrop – a large-scale visual piece that would serve as the stage’s focal point. The challenge was to create something that felt both festive and contemporary. The design needed to work from a distance, communicate energy, and complement the performances happening in front of it without competing for attention. ...

Udbhav 2009 poster, red colour way

Posters for Udbhav 2009

A set of posters for Udbhav 2009. The goal was to build a visual identity that felt fresh and energetic, something that would stand out on notice boards and social media alike. Each poster uses a different colour way but shares the same typography and layout so they read as a family. ...

Udbhav 2009 sticker, brown design

Udbhav 2009 Stickers

Stickers for Udbhav 2009. Small format, but they need to carry the same visual identity as everything else. Designing at this scale means every detail has to earn its place — there’s no room for clutter. This was part of a larger design effort for Udbhav 2009 that also included posters, flyers, mini banners, the souvenir book cover, the participation certificate, and the stage backdrop.

Udbhav 2009 participation certificate

Participation Certificate for Udbhav 2009

A participation certificate for Udbhav 2009. Same design problem as the Respograph one — make it feel official without looking like a template. This one had to sit within the wider Udbhav visual identity, so the palette and typography carried through from the posters and banners. This was part of a larger design effort for Udbhav 2009 that also included posters, flyers, stickers, mini banners, the souvenir book cover, and the stage backdrop.

Sound of Music event mini banner

Mini Banners for Udbhav 2009 Events

Small banners for the individual events at Udbhav 2009. Each one needed to be instantly readable from a distance while staying consistent with the overall visual identity. This was part of a larger design effort for Udbhav 2009 that also included posters, flyers, stickers, the souvenir book cover, and the stage backdrop.

Respograph 2009 participation certificate

Participation Certificate for Respograph 2009

A participation certificate design for Respograph 2009. The challenge with certificates is balancing formality with visual interest — they need to feel official without looking like every other template.

Udbhav 2009 flyer

Udbhav 2009 Flyers

Flyers for Udbhav 2009. These were the pieces you’d hand out at events or pin up around campus — small format, quick to read, carrying the same visual language as the posters. This was part of a larger design effort for Udbhav 2009 that also included posters, stickers, mini banners, the souvenir book cover, the participation certificate, and the stage backdrop.

We The Migrants logo concept 1

Logo Samples for "We The Migrants"

A few logo concepts for “We The Migrants”. The brief was to capture the idea of movement and identity without resorting to cliches.

C.S.E. Association logo with 'WE OFICIALLY ROCK' around the border and A.S.T.R.A. at the bottom

Logos for Computer Science and Engineering Association

The Computer Science and Engineering Association at Aurora University needed a new logo, so they put out a call for designs. I submitted some entries. What follows is the full range of my “talent” on display, from “I can see the vision” to “what were you thinking”. I really wanted them to know that the C.S.E. Association rocks. I also couldn’t spell “officially”. The logo reads “WE OFICIALLY ROCK” around a circle with “C.S.E.” in the middle and “A.S.T.R.A.” at the bottom. The typo does most of the work here. ...

Welcome Freshers banner

Welcome Banner For Freshers

A welcome banner for the fresher’s induction. Big, bold, and impossible to miss — the kind of thing that needs to read clearly from across a hall.

black on wood website template preview

A modern black on wood website template for any business or personal portfolio

I put together a simple website template that uses a dark color scheme over a wood texture background. It is meant to be flexible enough for any kind of business site or personal portfolio. The design is straightforward. A navigation bar sits at the top, followed by a main content area and a sidebar on the right. The wood texture gives it warmth without being distracting, and the white text on it reads fine on most screens.

ASTRA magazine cover design

Cover Design for ASTRA College Magazine

I was asked to put together a cover for ASTRA, the college magazine. The brief was loose enough that I could experiment with typography and layout without worrying too much about brand guidelines or committee sign-off. The main challenge was making the masthead work at different scales. College magazines tend to be printed cheaply on decent paper, so the design needed to hold up even when the press wasn’t perfect. I kept the palette simple and let the type carry the weight. ...