<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Yusuf Imaad Khan</title>
<link>https://www.yusufimaadkhan.com/blog.html</link>
<atom:link href="https://www.yusufimaadkhan.com/blog.xml" rel="self" type="application/rss+xml"/>
<description>Rogue Analysis - Yusuf Imaad Khan&#39;s blog</description>
<generator>quarto-1.10.18</generator>
<lastBuildDate>Sun, 29 Mar 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>The Last European</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <dc:creator>Richard Paul-Astley</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/the-last-european/</link>
  <description><![CDATA[ Liberal democracies are coming apart. Not from without, as their Cold War architects feared, but from within: a slow structural failure of the normative foundations on which the entire post-war order was built.<sup>1</sup> The institutions constructed after 1945 to ensure that the worst could never recur are collapsing. The public sphere (<em>Öffentlichkeit</em>), that great mediating structure through which citizens were supposed to reach rational consensus, has been gutted and repurposed as an apparatus of manipulation, spectacle, and algorithmic rage.<sup>2</sup> We are living through a crisis of democratic legitimacy so severe that it has become difficult even to articulate what has been lost, because the very capacity for rational articulation is threatened. ]]></description>
  <guid>https://www.yusufimaadkhan.com/posts/the-last-european/</guid>
  <pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Freedom &amp; Proscription</title>
  <link>https://www.yusufimaadkhan.com/posts/freedom-and-proscription/</link>
  <description><![CDATA[ 
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.9.0/p5.js"></script>

<script src="OPTIBuffer-Bold.otf"></script>

<script>
let font; // Font variable
let particles = []; // Array to store particles
let particleText = "WE ARE ALL PALESTINE ACTION!"; // Text to be displayed
let fontSize; // Font size
let maxWidth; // Maximum width for text
let textHeight; // Height of the text
let particlePool = []; // Particle pool for reusing particles - method from game dev

let lastInteractionTime = 0;
let isInteracting = false;
const SETTLE_DELAY = 500; // ms before starting to settle
const SETTLE_DURATION = 2000; // ms to fully settle

// Preload function to load font
function preload() {
    font = loadFont('OPTIBuffer-Bold.otf')//  'Atkinson-Hyperlegible-Regular-102.otf'); // Replace with your font
}

// Setup function to initialize canvas and text setup
function setup() {
    let sketchContainer = document.getElementById('sketch-container');
    let divWidth = sketchContainer.offsetWidth;

    textFont(font);
    fontSize = Math.sqrt(divWidth * 0.9) * 2.8; // Set font size to square root of div width (yeah this is stupid but I was tinkering)
    textSize(fontSize);
    maxWidth = divWidth * 0.9; // Set maximum text width to 90% of div width

    setupText(); // This will calculate textHeight

    let canvas = createCanvas(divWidth, textHeight); // Set canvas height to textHeight
    canvas.parent('sketch-container');
    canvas.style('touch-action', 'none'); 
    //pixelDensity(1);
    
      // Attach touch handlers to *just* this canvas
canvas.touchStarted(() => { isInteracting = true; lastInteractionTime = millis(); return false; });
  canvas.touchMoved(()  => { isInteracting = true; lastInteractionTime = millis(); return false; });
  canvas.touchEnded(()  => { isInteracting = false; lastInteractionTime = millis(); return false; });
}

// Function to handle window resize event
function windowResized() {
    let sketchContainer = document.getElementById('sketch-container');
    let divWidth = sketchContainer.offsetWidth;

    fontSize = Math.sqrt(divWidth * 0.9) * 2.8; // Recalculate font size
    textSize(fontSize);
    maxWidth = divWidth * 0.9; // Recalculate maximum text width
    setupText(); // Recalculate textHeight

    resizeCanvas(divWidth, textHeight); // Adjust canvas size
}

// Function to setup text particles
function setupText() {
    particles = [];
    particlePool = [];
    let x = 10;
    let y = fontSize;
    textHeight = 0; // Reset text height

    let words = particleText.split(' ');
    for (let i = 0; i < words.length; i++) {
        let wordWidth = textWidth(words[i] + ' ');
        if (x + wordWidth > maxWidth) {
            x = 10;
            y += fontSize;
        }

        let points = font.textToPoints(words[i], x, y, fontSize, {
            sampleFactor: 0.3
        });

        for (let j = 0; j < points.length; j++) {
            let particle;
            if (particlePool.length > 0) {
                particle = particlePool.pop(); // Reuse particle from the pool
                particle.reset(points[j].x, points[j].y);
            } else {
                particle = new Particle(points[j].x, points[j].y); // Create new particle
            }
            particles.push(particle);
        }

        x += wordWidth;
        textHeight = Math.max(textHeight, y); // Update text height
    }
    textHeight += 5; // Add 5px padding below the last word
}

let colors = [
              '#e4312b' //, left out additional colours - just red
              //'#000000', 
              //'#149954'
              ]; // Color array

// Particle class
class Particle {
    constructor(x, y) {
        this.pos = createVector(random(width), random(height)); // Initialize position randomly
        this.target = createVector(x, y); // Target vector
        this.vel = p5.Vector.random2D(); // Velocity vector
        this.acc = createVector(); // Acceleration vector
        this.maxspeed = 6; //10; // Maximum speed
        this.maxforce = 1; // Maximum steering force
        let c = color(random(colors)); // Choose a random color
        this.color = [red(c), green(c), blue(c)]; // Set particle color
    }

    // Reset particle position and target
    reset(x, y) {
        this.pos.set(random(width), random(height));
        this.target.set(x, y);
    }



// slightly improved for touchscreen and timeout so particles settle

behaviors() {
    let arrive = this.arrive(this.target);
    
    let pointer;
    if (touches.length > 0) {
        pointer = createVector(touches[0].x, touches[0].y);
    } else {
        pointer = createVector(mouseX, mouseY);
    }
    
    // Check if we should be interacting RIGHT NOW
    let shouldInteract = false;
    
    // Desktop: mouse is over canvas
    if (mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height) {
        shouldInteract = true;
    }
    
    // Mobile: touching
    if (touches.length > 0) {
        shouldInteract = true;
    }
    
    // Update last interaction time if currently interacting
    if (shouldInteract) {
        lastInteractionTime = millis();
    }
    
    // Calculate settle factor
    let timeSinceInteraction = millis() - lastInteractionTime;
    let settleFactor = 1;
    
    if (timeSinceInteraction < SETTLE_DELAY) {
        settleFactor = 0;
    } else if (timeSinceInteraction < SETTLE_DELAY + SETTLE_DURATION) {
        let settleProgress = (timeSinceInteraction - SETTLE_DELAY) / SETTLE_DURATION;
        settleFactor = settleProgress;
    }
    
    let flee = this.flee(pointer);
    
    arrive.mult(1);
    flee.mult(5 * (1 - settleFactor));
    
    this.applyForce(arrive);
    this.applyForce(flee);
}


    // Apply force to particle
    applyForce(f) {
        this.acc.add(f); // Add force to acceleration
    }

    // Update particle position and velocity
    update() {
        this.pos.add(this.vel); // Update position
        this.vel.add(this.acc); // Update velocity
        this.acc.mult(0); // Reset acceleration
    }

    // Display particle
    show() {
        fill(this.color[0], this.color[1], this.color[2]);
        noStroke();
        ellipse(this.pos.x, this.pos.y, 4, 4); // Draw particle as ellipse - will render faster apparently
    }

    // Arrive behavior
    arrive(target) {
        let desired = p5.Vector.sub(target, this.pos); // Calculate desired vector
        let d = desired.mag(); // Calculate distance to target
        let speed = this.maxspeed; // Set speed to maximum speed
        if (d < 100) { // If distance is less than 100, adjust speed
            speed = map(d, 0, 100, 0, this.maxspeed);
        }
        desired.setMag(speed); // Set desired vector magnitude
        let steer = p5.Vector.sub(desired, this.vel); // Calculate steering force
        steer.limit(this.maxforce); // Limit steering force
        return steer; // Return steering force
    }

    // Flee behavior
    flee(target) {
        let desired = p5.Vector.sub(target, this.pos); // Calculate desired vector
        let d = desired.mag(); // Calculate distance to target
        if (d < 50) { // If distance is less than 50, flee from target
            desired.setMag(this.maxspeed); // Set desired vector magnitude
            desired.mult(-1); // Reverse desired vector
            let steer = p5.Vector.sub(desired, this.vel); // Calculate steering force
            steer.limit(this.maxforce); // Limit steering force
            return steer; // Return steering force
        } else {
            return createVector(0, 0); // Return zero vector if not fleeing
        }
    }
}



// Draw function to update and display particles
function draw() {
    background(255); // Set background color
    particles.forEach(particle => {
        particle.behaviors(); // Apply behaviors to particle
        particle.update(); // Update particle position and velocity
        particle.show(); // Display particle
    });
}

// Function to return particles to the pool
function returnParticlesToPool() {
    particles.forEach(particle => {
        particlePool.push(particle);
    });
    particles = [];
}

function resetAnimation() {
    clear(); // Clears the canvas
    returnParticlesToPool(); // Returns current particles to the pool
    setupText(); // Recreates particles for the text
    draw(); // Draws the new state of the particles
}

function mouseClicked() {
    // Check if the click is inside the canvas or a specific div
    if (mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height) {
        resetAnimation();
    }
}
</script>
 ]]></description>
  <category>Palestine</category>
  <category>Generative Art</category>
  <guid>https://www.yusufimaadkhan.com/posts/freedom-and-proscription/</guid>
  <pubDate>Wed, 25 Jun 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>The Gramsci of Life</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/gramsci-of-life/</link>
  <description><![CDATA[ <img src="https://www.yusufimaadkhan.com/posts/gramsci-of-life/Gramsci.svg" class="img-fluid quarto-figure quarto-figure-left figure-img" width="100"> ]]></description>
  <category>Historical Materialism</category>
  <category>Social Epistemology</category>
  <guid>https://www.yusufimaadkhan.com/posts/gramsci-of-life/</guid>
  <pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Consensus at COP29? (Bitch Better Have My Money)</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/cop-consensus/</link>
  <description><![CDATA[ <a href="https://en.wikipedia.org/wiki/2024_United_Nations_Climate_Change_Conference">COP29</a> has kicked off this week in Baku. As jaded as some may be about <a href="https://www.phenomenalworld.org/interviews/governing-the-climate/">climate diplomacy</a>, <a href="https://www.versobooks.com/en-gb/products/2649-how-to-blow-up-a-pipeline">all options</a> <a href="https://portwatch.imf.org/">must</a> <a href="https://www.versobooks.com/en-gb/products/606-sinews-of-war-and-trade">be</a> <a href="https://global.oup.com/academic/product/reconsidering-reparations-9780197508893">considered, pursued, and exhausted</a> to make a desperately needed dent in the degree of warming. ]]></description>
  <category>Climate</category>
  <guid>https://www.yusufimaadkhan.com/posts/cop-consensus/</guid>
  <pubDate>Wed, 13 Nov 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Everybody was inflation fighting…those hikes were fast as lightning</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/everybody-was-inflation-fighting/</link>
  <description><![CDATA[ The US <a href="https://www.ft.com/content/a6e5cafe-01fa-4291-a7ba-f2b132ef6879">Federal Reserve is set to reduce interest rates for the first time in four years</a>. Rates were hiked up globally to kill off the <a href="https://www.ft.com/content/2ee6364e-3d48-447c-9b37-659d0f36d656">Great Inflation</a> born of the <a href="https://conference.nber.org/conf_papers/f197647.pdf">pandemic and Russia-Ukraine war</a>. Hiking rates was a blunt and painful way to deal with inflation - it increased the cost of borrowing, tightened financial conditions, and squeezed economies. Countries the world over increased rates to tackle inflation and to also maintain dollar exchange rates. Worse, the rate hikes increased debt servicing costs for developing countries, precipitating <a href="https://jacobin.com/2022/06/developing-world-dollar-debt-crisis-inflation">debt crises</a>. And to really pile things on, the higher rates have likely impeded the speed and scale of <a href="https://jacobin.com/2024/08/federal-reserve-rates-climate-inflation">investment for the green transition</a>. Given the Federal Reserve’s <a href="https://www.phenomenalworld.org/analysis/the-imperial-fed/">primacy in the global financial system</a>, this forthcoming rate cut is huge - <a href="https://jacobin.com/2024/08/federal-reserve-rates-climate-inflation">even if overdue</a>. ]]></description>
  <category>Economics</category>
  <guid>https://www.yusufimaadkhan.com/posts/everybody-was-inflation-fighting/</guid>
  <pubDate>Sat, 14 Sep 2024 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Warmer, wetter, hotter, drier, harder, better, faster, stronger</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/DaFT-Punk/</link>
  <description><![CDATA[ <em>Out of curiosity, I decided to roughly remake/build on an FT Climate Graphic</em> from early <em>March using <a href="https://ggplot2.tidyverse.org/">ggplot2</a>, <a href="https://observablehq.com/plot/">Observable Plot</a>, and <a href="https://d3js.org/">D3</a>.</em> ]]></description>
  <category>Climate</category>
  <guid>https://www.yusufimaadkhan.com/posts/DaFT-Punk/</guid>
  <pubDate>Sat, 13 Apr 2024 23:00:00 GMT</pubDate>
</item>
<item>
  <title>In our thousands, in our millions…🇵🇸</title>
  <link>https://www.yusufimaadkhan.com/posts/in-our-thousands/</link>
  <description><![CDATA[ 
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.9.0/p5.js"></script>

<script src="OPTIBuffer-Bold.otf"></script>

<script>
let font; // Font variable
let particles = []; // Array to store particles
let particleText = "IN OUR THOUSANDS, IN OUR MILLIONS, WE ARE ALL PALESTINIANS!"; // Text to be displayed
let fontSize; // Font size
let maxWidth; // Maximum width for text
let textHeight; // Height of the text
let particlePool = []; // Particle pool for reusing particles - method from game dev

// Preload function to load font
function preload() {
    font = loadFont('OPTIBuffer-Bold.otf')//  'Atkinson-Hyperlegible-Regular-102.otf'); // Replace with your font
}

// Setup function to initialize canvas and text setup
function setup() {
    let sketchContainer = document.getElementById('sketch-container');
    let divWidth = sketchContainer.offsetWidth;

    textFont(font);
    fontSize = Math.sqrt(divWidth * 0.9) * 2.8; // Set font size to square root of div width
    textSize(fontSize);
    maxWidth = divWidth * 0.9; // Set maximum text width to 95% of div width

    setupText(); // This will calculate textHeight

    let canvas = createCanvas(divWidth, textHeight); // Set canvas height to textHeight
    canvas.parent('sketch-container');
    //pixelDensity(1);
}

// Function to handle window resize event
function windowResized() {
    let sketchContainer = document.getElementById('sketch-container');
    let divWidth = sketchContainer.offsetWidth;

    fontSize = Math.sqrt(divWidth * 0.9) * 2.8; // Recalculate font size
    textSize(fontSize);
    maxWidth = divWidth * 0.9; // Recalculate maximum text width
    setupText(); // Recalculate textHeight

    resizeCanvas(divWidth, textHeight); // Adjust canvas size
}

// Function to setup text particles
function setupText() {
    particles = [];
    particlePool = [];
    let x = 10;
    let y = fontSize;
    textHeight = 0; // Reset text height

    let words = particleText.split(' ');
    for (let i = 0; i < words.length; i++) {
        let wordWidth = textWidth(words[i] + ' ');
        if (x + wordWidth > maxWidth) {
            x = 10;
            y += fontSize;
        }

        let points = font.textToPoints(words[i], x, y, fontSize, {
            sampleFactor: 0.3
        });

        for (let j = 0; j < points.length; j++) {
            let particle;
            if (particlePool.length > 0) {
                particle = particlePool.pop(); // Reuse particle from the pool
                particle.reset(points[j].x, points[j].y);
            } else {
                particle = new Particle(points[j].x, points[j].y); // Create new particle
            }
            particles.push(particle);
        }

        x += wordWidth;
        textHeight = Math.max(textHeight, y); // Update text height
    }
    textHeight += 5; // Add 5px padding below the last word
}

let colors = ['#e4312b', '#000000', '#149954']; // Color array

// Particle class
class Particle {
    constructor(x, y) {
        this.pos = createVector(random(width), random(height)); // Initialize position randomly
        this.target = createVector(x, y); // Target vector
        this.vel = p5.Vector.random2D(); // Velocity vector
        this.acc = createVector(); // Acceleration vector
        this.maxspeed = 6; //10; // Maximum speed
        this.maxforce = 1; // Maximum steering force
        let c = color(random(colors)); // Choose a random color
        this.color = [red(c), green(c), blue(c)]; // Set particle color
    }

    // Reset particle position and target
    reset(x, y) {
        this.pos.set(random(width), random(height));
        this.target.set(x, y);
    }

    // Apply behaviors to particle
    behaviors() {
        let arrive = this.arrive(this.target); // Apply arrive behavior
        let mouse = createVector(mouseX, mouseY); // Get mouse position
        let flee = this.flee(mouse); // Apply flee behavior

        arrive.mult(1); // Adjust arrive behavior weight
        flee.mult(5); // Adjust flee behavior weight

        this.applyForce(arrive); // Apply arrive force
        this.applyForce(flee); // Apply flee force
    }

    // Apply force to particle
    applyForce(f) {
        this.acc.add(f); // Add force to acceleration
    }

    // Update particle position and velocity
    update() {
        this.pos.add(this.vel); // Update position
        this.vel.add(this.acc); // Update velocity
        this.acc.mult(0); // Reset acceleration
    }

    // Display particle
    show() {
        fill(this.color[0], this.color[1], this.color[2]);
        noStroke();
        ellipse(this.pos.x, this.pos.y, 4, 4); // Draw particle as ellipse - will render faster apparently
    }

    // Arrive behavior
    arrive(target) {
        let desired = p5.Vector.sub(target, this.pos); // Calculate desired vector
        let d = desired.mag(); // Calculate distance to target
        let speed = this.maxspeed; // Set speed to maximum speed
        if (d < 100) { // If distance is less than 100, adjust speed
            speed = map(d, 0, 100, 0, this.maxspeed);
        }
        desired.setMag(speed); // Set desired vector magnitude
        let steer = p5.Vector.sub(desired, this.vel); // Calculate steering force
        steer.limit(this.maxforce); // Limit steering force
        return steer; // Return steering force
    }

    // Flee behavior
    flee(target) {
        let desired = p5.Vector.sub(target, this.pos); // Calculate desired vector
        let d = desired.mag(); // Calculate distance to target
        if (d < 50) { // If distance is less than 50, flee from target
            desired.setMag(this.maxspeed); // Set desired vector magnitude
            desired.mult(-1); // Reverse desired vector
            let steer = p5.Vector.sub(desired, this.vel); // Calculate steering force
            steer.limit(this.maxforce); // Limit steering force
            return steer; // Return steering force
        } else {
            return createVector(0, 0); // Return zero vector if not fleeing
        }
    }
}

// Draw function to update and display particles
function draw() {
    background(255); // Set background color
    particles.forEach(particle => {
        particle.behaviors(); // Apply behaviors to particle
        particle.update(); // Update particle position and velocity
        particle.show(); // Display particle
    });
}

// Function to return particles to the pool
function returnParticlesToPool() {
    particles.forEach(particle => {
        particlePool.push(particle);
    });
    particles = [];
}

function resetAnimation() {
    clear(); // Clears the canvas
    returnParticlesToPool(); // Returns current particles to the pool
    setupText(); // Recreates particles for the text
    draw(); // Draws the new state of the particles
}

function mouseClicked() {
    // Check if the click is inside the canvas or a specific div
    if (mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height) {
        resetAnimation();
    }
}
</script>
 ]]></description>
  <category>Palestine</category>
  <category>Generative Art</category>
  <guid>https://www.yusufimaadkhan.com/posts/in-our-thousands/</guid>
  <pubDate>Tue, 02 Jan 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>The sycophantic stooge of US imperialism</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/uk-sycophantic-stooge-us-imperialism/</link>
  <description><![CDATA[ <em>In light of the UK’s recent abstentions at the UN on a ceasefire in Gaza, I do some simple analysis on UK/US voting patterns at the UN General Assembly.</em> ]]></description>
  <category>Palestine</category>
  <category>UK</category>
  <category>US</category>
  <category>UN</category>
  <guid>https://www.yusufimaadkhan.com/posts/uk-sycophantic-stooge-us-imperialism/</guid>
  <pubDate>Thu, 14 Dec 2023 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Mills, Race, and Rawls</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/Mills-Race-Rawls/</link>
  <description><![CDATA[ <em>28/08/2024 - This blog post is based on some charts I made for my Contemporary Political Theory students while we were covering critics of Rawls, including Mills. I was trying to keep it interesting for them. I’m retrospectively posting it here, tagged with the original date, because why not…</em> ]]></description>
  <category>Political Philosophy</category>
  <guid>https://www.yusufimaadkhan.com/posts/Mills-Race-Rawls/</guid>
  <pubDate>Tue, 14 Nov 2023 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Making the Hockey Sticks of Prosperity and Doom 🏒</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/hockey-sticks-of-prosperity-and-doom/</link>
  <description><![CDATA[ <em>The other day I made some charts for <a href="https://www.phenomenalworld.org/series/the-polycrisis/">The Polycrisis newsletter</a>. They were for <a href="https://www.phenomenalworld.org/analysis/hockey-sticks-and-crosses/">a piece on the globalisation debate</a>, written by Anthea Roberts and Nicolas Lamp. In this post, I offer some general reflections, and run through the steps to make one of the trickier charts that appeared in it.</em> ]]></description>
  <category>Climate</category>
  <category>Globalisation</category>
  <guid>https://www.yusufimaadkhan.com/posts/hockey-sticks-of-prosperity-and-doom/</guid>
  <pubDate>Sat, 02 Sep 2023 23:00:00 GMT</pubDate>
</item>
<item>
  <title>The Vices of the Vice-Chancellors</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/paycuts/</link>
  <description><![CDATA[ <img src="https://www.yusufimaadkhan.com/posts/paycuts/scarred_meme.jpg" class="img-fluid quarto-figure quarto-figure-center figure-img" width="526"> ]]></description>
  <category>LSE</category>
  <category>Unions</category>
  <category>Strikes</category>
  <category>Employment</category>
  <guid>https://www.yusufimaadkhan.com/posts/paycuts/</guid>
  <pubDate>Wed, 26 Apr 2023 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Academic casualisation across the UK</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/LSEUCU_Casualisation_YIK/</link>
  <description><![CDATA[ Last week LSE UCU published a report called <a href="https://lseucu.com/wp-content/uploads/2023/03/The-Crisis-of-Academic-Casualisation-at-LSE_-2023-LSE-UCU-Report.pdf">“The Crisis of Academic Casualisation at LSE”</a>. I would recommend taking a look. They summarise their main findings in a <a href="https://twitter.com/LSE_UCU/status/1641027157630623746">twitter thread</a> too. It is a damning indictment of LSE and its purported aims as a so called higher education institution. Take a look at one of the highlights: ]]></description>
  <category>LSE</category>
  <category>Unions</category>
  <category>Strikes</category>
  <category>Employment</category>
  <category>Politics</category>
  <category>Economics</category>
  <guid>https://www.yusufimaadkhan.com/posts/LSEUCU_Casualisation_YIK/</guid>
  <pubDate>Wed, 05 Apr 2023 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Make your very own fiscal black hole! 🧑‍🍳</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/blackhole/</link>
  <description><![CDATA[ Today at <strong><em>Rogue Analysis</em></strong> we’ll be looking at how to make your very own fiscal black hole! Usually this is a bit tricky to make at home because not everybody has access to a machine capable of spinning economic matters into incredibly dense journalism that no amount of nuance can escape from. Lets get to it! 🧑‍🍳 ]]></description>
  <category>Cooking</category>
  <category>Politics</category>
  <category>Economics</category>
  <category>Money</category>
  <category>Budget</category>
  <category>Satire</category>
  <guid>https://www.yusufimaadkhan.com/posts/blackhole/</guid>
  <pubDate>Fri, 18 Nov 2022 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Visualising Truss’s Dodgy Donor Network (and a Brief Look at UK Political Donations)</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/TrussDodgyNetwork/</link>
  <description><![CDATA[ The recent £45bn “mini-budget”<sup>1</sup> was a disaster in both <a href="https://mainlymacro.blogspot.com/2022/09/a-budget-that-harms-everyone-except.html">content</a> and <a href="https://www.ft.com/content/1ace8d42-f3ee-4fdd-a103-5cd4234e8c42">consequence</a>. This is <a href="https://yougov.co.uk/topics/politics/articles-reports/2022/09/27/mini-budget-gets-worst-reception-any-financial-sta">widely understood</a>. To believe it was about growth is beyond a joke. The government claimed that <strong>tax cuts for the rich</strong> will somehow lead to growth that will boost wages and support public services. This is either <a href="https://academic.oup.com/ser/article/20/2/539/6500315">unsupported by the evidence</a>, or the <a href="https://www.opendemocracy.net/en/truss-kwarteng-tax-cuts-rich-growth/">opposite is true.</a> <em>Shockingly</em>, it turns out that tax cuts for the rich (who spend less and save more as a proportion of their income) will just benefit the rich. ]]></description>
  <category>Networks</category>
  <category>Corruption</category>
  <category>Politics</category>
  <category>Money</category>
  <category>Budget</category>
  <guid>https://www.yusufimaadkhan.com/posts/TrussDodgyNetwork/</guid>
  <pubDate>Sat, 08 Oct 2022 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Welcome to Rogue Analysis</title>
  <dc:creator>Yusuf Imaad Khan</dc:creator>
  <link>https://www.yusufimaadkhan.com/posts/welcome/</link>
  <description><![CDATA[ Hi. I’m Yusuf and this is my blog - <u><strong><em>“Rogue Analysis”</em></strong></u>. I’d like to join the community of philosophy blogs, practice my writing, and clarify a few thoughts. ]]></description>
  <category>Introductions</category>
  <guid>https://www.yusufimaadkhan.com/posts/welcome/</guid>
  <pubDate>Sat, 27 Aug 2022 23:00:00 GMT</pubDate>
</item>
</channel>
</rss>
