Jag har skrivit en gratis webb-bok om Programmering med C#

Permalänk

Jag har skrivit en gratis webb-bok om Programmering med C#

Jag är gymnasielärare i bl.a. programmering och har skrivit en webb-bok som fungerar som kursbok i gymnasiekursen Programmering 1. Den funkar också bra att använda om man helt enkelt vill lära sig att programmera från grunden. Besök och testa den gärna på www.progsharp.se

Visa signatur

ProgSharp - Gratis webb-bok för att lära sig programmering med C#
www.progsharp.se

Permalänk
Medlem

Ville bara kolla sidan, och råkade hitta ett stavfel
Kapitel 2
"Om du glömmer att lägga till Console.ReadKey(); längst ner i dina program så kommer de att stängas av direkt när programmet när sin sista rad."

Visa signatur

CPU: AMD Ryzen 7 5800X Kylare: Noctua NH-D14 Modermodem: Asus TUF GAMING B550M-PLUS RAM: Kingston Renegade Fury 3600MHz 32GB GPU: PowerColor Radeon RX 6900 XT 16GB Red Devil Ultimate Chassi: Fractal Design Define Mini C PSU: Corsair RM750x SSD: Kingston KC3000 2TB NVMe Skärm: LG 34'' UltraGear 34GN850 Tgb: Keychron Q6 Brown Mus: Logitech MX Master III Högtalare: Audio Pro Addon T14 OS: MS Windows 11 Pro ISP: Bahnhof 500/500Mbit Tillbehör: Staropramen & Noblechairs Hero

Permalänk
Medlem

Tack så mycket.

Visa signatur

Intel NUC8i5BEH - Iris Plus 655, i5 8259U 2,3GHz
MSI GE620DX-291NE - GT 555M, i5 2410M 2,3GHz
iPad Mini 4 & Macbook early 2011

Permalänk

@MadFred: Tack, det ska ju såklart vara "når" istället

Visa signatur

ProgSharp - Gratis webb-bok för att lära sig programmering med C#
www.progsharp.se

Permalänk
Medlem

@Ultimadark:
*ryggdunk* bra jobbat!
Alltid bra om du får någon som kan programmera, att läsa genom den för att justera, optimera och rätta till stavfel

Visa signatur

.

Permalänk
Medlem

Mycket intressant. All beröm till dig!

Har alltid velat lära mig mer om programmering men det har aldrig blivit av. Nu kanske det är dags?

Hade så gärna velat arbeta med detta men jag prioriterade flicksnärtor istället för betyg i högstadiet/ på gymnasiet så det blev aldrig som jag ville.

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av Ultimadark:

Jag är gymnasielärare i bl.a. programmering och har skrivit en webb-bok som fungerar som kursbok i gymnasiekursen Programmering 1. Den funkar också bra att använda om man helt enkelt vill lära sig att programmera från grunden. Besök och testa den gärna på www.progsharp.se

Tänkte skicka ett DM men hittade inte var man kunde göra det.
Blir därför här i tråden.

TACK! För att du gjort den sidan.
Mycket pedagogiskt!
Hoppas du får mycket cred för sidan.
Jag som nybörjare uppskattar den väldigt mycket!

Mvh

Skickades från m.sweclockers.com

Permalänk
Medlem

Grymt!
Tusen tack för detta. Ser fram emot kurs 2

En liten korrigering i kapitel 1:
"Desto fler programtyper som man vill kunna skapa, desto mer plats kommer installationen ta på din hårddisk. Vi kommer att skapa program i C# för Windows och behöver då bara välja alternativet ”.Net desktop development”."

Ju [...] desto, är det korrekta sättet att skriva detta.

Visa signatur

Fractal Design R4 | Ryzen 7 1800x @Stock | GTX 1080 WINDFORCE OC | ASUS ROG B350F GAMING | Vengeance LPX Black 16GB DDR4 @ 2933MHz | BeQuiet! Straight Power 80+ Gold 680W | Samsung 960 EVO 250GB + Seagate Barracuda 1TB @ 7200rpm | Noctua NH-U9B SE2 | ASUS ROG Swift PG278QR GSYNC 1440p @144Hz | Acer 27" K272HLE 1080p @60Hz

Permalänk
Medlem

Jag har bara ögnat igenom boken, så jag har nog missat en hel del detaljer. Jag fokuserar på det stora.

Några iaktagelser som kommer dels från boken, dels från att jag ibland roar mig med att läsa programmeringsfrågor på Sweclockers från elever som går kursen.

Boken är väldigt välskriven. Bra språk. Pedagogiskt för de absoluta grunderna. Lagom detaljnivå.

Jag skulle gärna se rena funktioner (och även metoder) tidigare än kapitel 7, för att öva upp tänket att dela upp koden i mindre, väldefinierade, steg. Redan projektuppgift 1 är ju egentligen för stor för att implementeras i en enda metod. Detta är något frågeställare på Swecklockers har extremt svårt för - och det verkar vara pedagogernas fel.

Det är inte frivilligt att använda debuggern. Det SKA finnas ett kapitel tidigt i boken om det, långt innan kapitel 8. Oavsett vad kursplanen säger. Mitt förslag är att du flyttar felsökningen till 2.5 eller något (typ strax efter att du introducerat funktioner) och behåller resten av kapitel 8 där det är. Kapitel 8 är väldigt bra, bara felplacerat, jag är övertygad om att man undviker en massa problem om man introducerar felsökning tidigare.

Mina fem ören
.

Permalänk
99:e percentilen

Soft!

Har inte läst igenom hela, men vill passa på att inför eventuella framtida upplagor slå ett slag för vikten av att förstå vad en ren (pure) funktion är och varför de (ofta) är bra, och i samma anda hur kraftfulla uttryck kan vara*. Det är väldigt mycket (implicit) fokus på satser och sidoeffekter generellt inom programmering; många verkar endast lära sig att tänka på det sättet, och det tror jag inte är optimalt.

* Ett simpelt exempel för att förtydliga vad jag menar:

if (a) { return b; } else { return c; }

vs

return a ? b : c;

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

Kudos till dig!

Har bara snabbtittat lite, men tycker att det är mycket välskrivet!

MonoGame hade jag för övrigt aldrig hört talas om, så nu blir jag allt lite sugen på att slänga ihop ett litet spel (det var fanken snart 20 år sen jag gjorde det senast).

Visa signatur

5950X, 3090

Permalänk
Skrivet av K0mplext:

En liten korrigering i kapitel 1:

...

Ju [...] desto, är det korrekta sättet att skriva detta.

Tack, ska fixa det! Dyker upp på servern inom några dagar.

Skrivet av KAD:

Jag skulle gärna se rena funktioner (och även metoder) tidigare än kapitel 7, för att öva upp tänket att dela upp koden i mindre, väldefinierade, steg. Redan projektuppgift 1 är ju egentligen för stor för att implementeras i en enda metod. Detta är något frågeställare på Swecklockers har extremt svårt för - och det verkar vara pedagogernas fel.

Det är inte frivilligt att använda debuggern. Det SKA finnas ett kapitel tidigt i boken om det, långt innan kapitel 8. Oavsett vad kursplanen säger. Mitt förslag är att du flyttar felsökningen till 2.5 eller något (typ strax efter att du introducerat funktioner) och behåller resten av kapitel 8 där det är. Kapitel 8 är väldigt bra, bara felplacerat, jag är övertygad om att man undviker en massa problem om man introducerar felsökning tidigare.

Mina fem ören
.

Tack för din feedback! Blir inte funktionerna/metoderna ganska tråkiga om man i alla fall inte lärt sig iteration tycker du? Ett intressant perspektiv att ha funktioner så tidigt.

Projektuppgift 2 är ännu mer komplex än 1:an, där är tanken att man ska möda sig igenom den och sedan känna "Aha! Med hjälp av metoder så blir det som jag gjorde innan inte lika jobbigt". Metoder dyker då upp som en "räddare i nöden" som hjälper till att fixa ett problem som man själv har upplevt.

@Alling Tack för din feedback också! Jag har inte lagt så mycket fokus på sidoeffekter och rena funktioner men fördelen med en onlinebok är att den lätt går att ändra. Hur ställer du dig om man ska jämföra lättlästhet mot kompakta uttryck? Hur tycker du att man ska göra avvägningen där?

Visa signatur

ProgSharp - Gratis webb-bok för att lära sig programmering med C#
www.progsharp.se

Permalänk
99:e percentilen
Skrivet av Ultimadark:

Tack för din feedback! Blir inte funktionerna/metoderna ganska tråkiga om man i alla fall inte lärt sig iteration tycker du? Ett intressant perspektiv att ha funktioner så tidigt.

Behöver de alls inte bli!

// TypeScript function celsiusToFahrenheit(celsius: number): number { return celsius * 9 / 5 + 32; } function genitive(name: string): string { return ( ["s", "x", "z"].some(letter => name.toLowerCase().endsWith(letter)) ? name : name + "s" ); }

Citat:

Projektuppgift 2 är ännu mer komplex än 1:an, där är tanken att man ska möda sig igenom den och sedan känna "Aha! Med hjälp av metoder så blir det som jag gjorde innan inte lika jobbigt". Metoder dyker då upp som en "räddare i nöden" som hjälper till att fixa ett problem som man själv har upplevt.

Förstår hur du tänker; det är möjligt att det är en smart strategi. Dock är min erfarenhet också att kodduplicering tyvärr ofta inte ses som problematiskt – särskilt av nybörjare.

Citat:

@Alling Tack för din feedback också! Jag har inte lagt så mycket fokus på sidoeffekter och rena funktioner men fördelen med en onlinebok är att den lätt går att ändra. Hur ställer du dig om man ska jämföra lättlästhet mot kompakta uttryck? Hur tycker du att man ska göra avvägningen där?

Koden måste förstås gå att läsa och förstå. Men "lättlästhet" vs "kompakta uttryck" är ofta en falsk dikotomi.

// TypeScript // Satser och sidoeffekter: function allTimesFive(xs: number[]): number[] { let ys = []; for (let i = 0; i < xs.length; i++) { ys.push(xs[i] * 5); } return ys; } // Uttryck: function allTimesFive(xs: ReadonlyArray<number>): ReadonlyArray<number> { return xs.map(x => x * 5); }

Jag tycker att det sistnämnda är mer lättläst och uttrycker programmerarens intention tydligare. Och just oförmågan att även tänka i uttryck, inte enbart satser och sidoeffekter, är en av de största bristerna jag ser hos väldigt många programmerare och programmeringsstudenter.

(Som @Teknocide skriver är den första versionen av allTimesFive ovan lika pure som den andra; det är enbart implementationen som står i fokus här.)

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

@Alling Tycker det är värt att tillägga att första funktionen i ditt andra exempel också är ren, även om implementationen inte är det.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Ultimadark:

Tack för din feedback! Blir inte funktionerna/metoderna ganska tråkiga om man i alla fall inte lärt sig iteration tycker du? Ett intressant perspektiv att ha funktioner så tidigt.

Inte alls. Som Alling exemplifierar finns det ju mängder av enkla exempel på rena funktioner som är enkla att förstå. Alla behöver ju inte vara rent matematiska, du har redan exempel och övningar med textmanipulation i boken. Metoder som SkivUtMenyAlternativ() [*] är enkla att beskriva vad de gör (för läraren), förstå (för eleven) och gör koden mer välstrukturerad.

Skrivet av Ultimadark:

"Aha! Med hjälp av metoder så blir det som jag gjorde innan inte lika jobbigt".

Jag har inte läst pedagogik, men jag tycker nog att det är lite elakt att med flit lära ut ett dåligt sätt att göra något när man vet att det finns ett bättre sätt. Priset blir förstås att man måste gå igenom lite mer teori från början (och eventuellt ha fördjupningskapitel längre fram).

Edit: Nu när jag läser mitt förra inlägg så inser jag att jag kanske blandade ihop kapitelnummren. Hur som helst så tycker jag att funktioner/metoder bör introduceras strax efter variabler och typer -- innan man börjar skriva Main()-metoder på 10+ rader.

[*] Högst tveksamt om man ska lära ut namngivning på svenska...men den vanan är ju relativt lätt att ändra.

Permalänk
Medlem

Jag tog en liten snabbkoll också, och det som jag stör mig lite på, och som väldigt många skolor verkar använda sig av är svenska variabelnamn. Ingen kommer någonsin att använda svenska i koden i ett projekt utanför dessa skoluppgifter.

Syntaxen är ju på engelska så man måste ju fortfarande ha en hyfsad bra kunskap i engelska för att förstå vad man håller på med. Bra kod kan man läsa som en vanlig text, och att mixa språk blir inga bra meningar i mitt tycke.

Permalänk

@KAD @wargreymon Det är ett medvetet val att låta alla namn vara på svenska istället för på engelska, jag sammanfattade mina tankar så här i kapitel 3:

Citat:

I vårt exempel så har vi namngivit variablerna till meddelande, namn och yrke istället för message, name och occupation. Man kan även använda de svenska bokstäverna å, ä och ö i sina variabelnamn om man vill.

Det är vanligt att använda enbart engelska namn när man programmerar eftersom detta är en förutsättning om man t.ex. vill be om hjälp på internet av andra programmerare som inte kan svenska.

I denna bok är variabelnamnen alltid på svenska av anledningen att ingen som läser den ska få problem med att förstå något exempel på grund av svåra engelska ord. Om du känner dig säker på engelska så rekommenderas du dock att använda engelska variabelnamn i dina egna program.

Jag är med i några FB-grupper för lärare i IT-ämnen och även där går åsikterna isär ifall man ska använda engelska eller svenska namn. Som @KAD skriver så går det ju snabbt att ändra på den vanan senare.

Visa signatur

ProgSharp - Gratis webb-bok för att lära sig programmering med C#
www.progsharp.se

Permalänk
Medlem
Skrivet av wargreymon:

Jag tog en liten snabbkoll också, och det som jag stör mig lite på, och som väldigt många skolor verkar använda sig av är svenska variabelnamn. Ingen kommer någonsin att använda svenska i koden i ett projekt utanför dessa skoluppgifter.

Syntaxen är ju på engelska så man måste ju fortfarande ha en hyfsad bra kunskap i engelska för att förstå vad man håller på med. Bra kod kan man läsa som en vanlig text, och att mixa språk blir inga bra meningar i mitt tycke.

Fel. Sett många stora projekt där man använder sig av svenska variabelnamn för att det ska vara tydligt och att det helt enkelt blir fel om man försöker översätta ord som är specifika för den branschen eller myndigheten.

Permalänk
Medlem
Skrivet av Bluesky1:

Fel. Sett många stora projekt där man använder sig av svenska variabelnamn för att det ska vara tydligt och att det helt enkelt blir fel om man försöker översätta ord som är specifika för den branschen eller myndigheten.

Menar du att visa specifika variabler/metoder är på svenska eller att de verkligen kör alla variabler på svenska? Lite skillnad på att bespara ett specifikt namn eller term jämfört med att köra allt på svenska av någon anledning.

Permalänk
Medlem
Skrivet av Ultimadark:

@KAD @wargreymon Det är ett medvetet val att låta alla namn vara på svenska istället för på engelska, jag sammanfattade mina tankar så här i kapitel 3:

Jag är med i några FB-grupper för lärare i IT-ämnen och även där går åsikterna isär ifall man ska använda engelska eller svenska namn. Som @KAD skriver så går det ju snabbt att ändra på den vanan senare.

Man kan säkert debattera detta till världens ände. Men tycker man ska lära sig korrekt ifrån början. Har man problem med engelska namn, hur förstår man då vad syntaxen betyder?

Permalänk

Riktigt jävla bra av det jag sett. Kollade igenom projektuppgifterna och kommer att göra dom i Java som träning (läser just nu java1 på universitetet).

Edit: Hittade inget kapitel om objektorienterad programmering/objekt. Är det inte väldigt viktigt att ha med? T.ex innan man börjar med GUI programmering.

Permalänk
Medlem

@Ultimadark: Riktigt trevligt! det skall läsas och övas på

Visa signatur

Glöm inte att gilla bra inlägg!

AMD Ryzen 7 2700X | ASUS ROG STRIX GeForce RTX 2060 6GB OC Gaming |
Fractal Design Meshify S2 (Blackout) | ASUS ROG STRIX X470-F Gaming |
G.Skill Trident Z RGB 3200mhz 16GB | Samsung 970 EVO Series 500 GB M2 | Seasonic Focus Plus 750W

Permalänk
99:e percentilen
Skrivet av wargreymon:

Jag tog en liten snabbkoll också, och det som jag stör mig lite på, och som väldigt många skolor verkar använda sig av är svenska variabelnamn. Ingen kommer någonsin att använda svenska i koden i ett projekt utanför dessa skoluppgifter.

Syntaxen är ju på engelska så man måste ju fortfarande ha en hyfsad bra kunskap i engelska för att förstå vad man håller på med. Bra kod kan man läsa som en vanlig text, och att mixa språk blir inga bra meningar i mitt tycke.

Jag håller generellt med dig om att kod bör skrivas på engelska (även om det absolut finns undantag).

Det finns dock en mycket bra anledning att använda svenska variabelnamn när man lär ut programmering till nybörjare, och du råkar faktiskt lyfta den i ditt inlägg: Nyckelorden och standardbiblioteket är på engelska. När jag visat programmering för nybörjare i min bekantskap har ett återkommande problem varit att de haft svårt att skilja språkets grammatik och standardbibliotek från innehåll påhittat av mig/oss.

Det blir mycket enklare om man håller sig till svenska variabelnamn (och berättar tydligt att man kommer använda svenska för och endast för namn man får välja själv). Enkelt exempel, där jag även färgkodat nyckelord, standardbibliotek och egna variabelnamn.

// TypeScript function skrivUt(detSomSkaSkrivasUt: string): void { console.log(detSomSkaSkrivasUt); } const hälsningFrånAnvändaren = prompt("Skriv något!"); if (hälsningFrånAnvändaren.toLowerCase().includes("hej")) { skrivUt("Hej du!"); } else { skrivUt("Jag förstår inte."); }

(Mycket möjligt att det finns ytterligare förbättringar man kan göra.)

Min erfarenhet är att denna strategi gör det lättare för en nybörjare att förstå vad som är ”en del av språket” – och alltså måste skrivas exakt så – och vad som inte är det. Tycker som sagt man ska vara tydlig gentemot eleven med att det är därför man skriver vissa ord på svenska, och att det inte är rekommenderat att göra så i verkligheten.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem
Skrivet av Alling:

Jag håller generellt med dig om att kod bör skrivas på engelska (även om det absolut finns undantag).

Det finns dock en mycket bra anledning att använda svenska variabelnamn när man lär ut programmering till nybörjare, och du råkar faktiskt lyfta den i ditt inlägg: Nyckelorden och standardbiblioteket är på engelska. När jag visat programmering för nybörjare i min bekantskap har ett återkommande problem varit att de haft svårt att skilja språkets grammatik och standardbibliotek från innehåll påhittat av mig/oss.

Det blir mycket enklare om man håller sig till svenska variabelnamn (och berättar tydligt att man kommer använda svenska för och endast för namn man får välja själv). Enkelt exempel, där jag även färgkodat nyckelord, standardbibliotek och variabelnamn.

// TypeScript function skrivUt(detSomSkaSkrivasUt: string): void { console.log(detSomSkaSkrivasUt); } const hälsningFrånAnvändaren = prompt("Skriv något!"); if (hälsningFrånAnvändaren.toLowerCase().includes("hej")) { skrivUt("Hej du!"); } else { skrivUt("Jag förstår inte."); }

(Mycket möjligt att det finns ytterligare förbättringar man kan göra.)

Min erfarenhet är att denna strategi gör det lättare för en nybörjare att förstå vad som är ”en del av språket” – och alltså måste skrivas exakt så – och vad som inte är det. Tycker som sagt man ska vara tydlig gentemot eleven med att det är därför man skriver vissa ord på svenska, och att det inte är rekommenderat att göra så i verkligheten.

Vore det inte smart att då färgkoda som du gjort och de bra IDE:erna gör då?

Permalänk
Medlem

Tittade som hastigast för några dagar sedan och har något minne av att jag såg rätt märkliga Namespace med en massa - eller om det nu var _ i, varför då?

Typ

Namespace CompanyName_______X.1______Division

Permalänk
99:e percentilen
Skrivet av wargreymon:

Vore det inte smart att då färgkoda som du gjort och de bra IDE:erna gör då?

En nybörjare kan inte uttyda i närheten av lika mycket information från färgkodning som en erfaren programmerare, är min erfarenhet.

IDE:er gör heller inte nödvändigtvis skillnad mellan standardbibliotek och påhittade variabelnamn. Glöm inte heller det faktum att färgschema är en plattforms- och konfigurationsberoende presentationsegenskap, medan variabelnamn är en del av själva koden – en stor fördel i detta sammanhang. Det finns helt enkelt ingen möjlighet att säga att färg x i allmänhet representerar koncept y, för det gäller bara i just den aktuella editorn med just det aktuella färgschemat.

Inte heller finns det någon intuition till vilken färg som hör ihop med vilket koncept, men den intuitionen är mycket enkel att ta till sig med svenska för variabelnamn och engelska för "inbyggda" ord (för varför skulle ett programmeringsspråk "vara på svenska"?).

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Skrivet av lodarletarn:

Edit: Hittade inget kapitel om objektorienterad programmering/objekt. Är det inte väldigt viktigt att ha med? T.ex innan man börjar med GUI programmering.

Det finns inget kapitel om OOP eftersom Skolverket tog bort OOP ur gymnasiekursen Programmering 1 för drygt ett år sedan, allt stoff om OOP kommer först i kursen Programmering 2. I din universitetskurs kommer säkert OOP dyka upp rätt snart eftersom det vanligtvis gör det.

Skrivet av improwise:

Tittade som hastigast för några dagar sedan och har något minne av att jag såg rätt märkliga Namespace med en massa - eller om det nu var _ i, varför då?

Typ

Namespace CompanyName_______X.1______Division

Programmen som jag har gjort som exempel har jag döpt till "Exempel 3.1 - Exemplets namn" där 3.1 skulle innebära det första exemplet i kapitel 3. Visual Studio gör om både mellanslagen och bindestrecken till _ i programmets namespace. Namespacen visas bara i exemplen i kapitel 2 och eftersom vi aldrig gör mer än 1 klass i varje program så innehåller inte heller något program mer än 1 namespace.

Visa signatur

ProgSharp - Gratis webb-bok för att lära sig programmering med C#
www.progsharp.se

Permalänk
Medlem
Skrivet av wargreymon:

Menar du att visa specifika variabler/metoder är på svenska eller att de verkligen kör alla variabler på svenska? Lite skillnad på att bespara ett specifikt namn eller term jämfört med att köra allt på svenska av någon anledning.

Av det jag sett så skulle jag vilja säga att man använder svenska på dom termer som är kopplat med verksamheten. Sen självklart engelska på dom termer som är kopplat till programmering i sig. Ger dig ett påhittat exempel:

GetAnsokanOmVardAvBarnAsync(int diarieNr)
{
var ansokan = await context.Ansokningar.Where(x => x.diarieNr == diarieNr).ToListAsync();
}

Permalänk

Måste tacka för en riktigt bra sida!:)

Men jag stötte på ett problem då jag skulle köra ett utav programmen i boken.
I programmet så finns denna kodrad med:

// Hitta mellanslaget i namnet
int indexFörMellanslag = helaNamnet.IndexOf(” ”);

När jag testkör så får jag upp fel och jag får rekommendationen att köra:
.IndexOfAny(" ");

Provar att byta men får fortfarande fel, söker lite på nätet och hittar detta:

.IndexOfAny(new char[] {' '});

och då fungerar det. Det är inte det att jag söker fel utan tänker att jag har missat något?
Kan vara bra att veta så man kan tänka rätt från början!

MVH Mikael Svensson

Permalänk
Medlem

@Ultimadark:

Nice! Jag har letat efter en sånhär sammanställning!

Visa signatur

3900XT - Dark Rock 4 PRO, 48GB 3600mhz, KFA2 RTX3080ti - Phanteks Evolve - RM850x
LG OLED C9 - Samsung Odyssey G9 - Rival 650 wireless - Xtrfy K4
Bärbart: Macbook Pro 15 - i7 2018 & Huawei Matebook 3K - i5 2020 - EGPU: TUF 3070 RTX
Ljud: focusrite 2i2 - KRK rokit RPG5 - sE 2200a
Klav: Akai MPK249, MPD226 & MPK mini