varför handlar så mycket om webbprogrammering om Ruby nu?

Permalänk
Avstängd

varför handlar så mycket om webbprogrammering om Ruby nu?

Om man kollar på Lyndas kurser och nya böcker som släpps om webbdesign så har det kommit allt fler och fler titlar om Ruby. Varför? Vad kan man göra med Ruby som man inte kan göra med JS/PHP/HTML5/CSS3?

Permalänk
Medlem
Skrivet av pigge_85:

Om man kollar på Lyndas kurser och nya böcker som släpps om webbdesign så har det kommit allt fler och fler titlar om Ruby. Varför? Vad kan man göra med Ruby som man inte kan göra med JS/PHP/HTML5/CSS3?

JS, HTML5 och CSS3 har inget med Ruby att göra det du behöver jämföra mot är PHP i din lista.

Samt om man kan göra mer saker en vad man kan göra i PHP? Nej varken mer eller mindre, det handlar helt om olika utvecklingstekniker. T.ex. i Ruby världen så är scaffolding ett riktigt populärt begrepp något som saknas i PHP som standard dock finns det ramverk som underlättar men som sagt va i sin grund har PHP det inte.

http://en.wikipedia.org/wiki/Scaffold_(programming)

Detta är bland annat en av skillnaderna och varför Ruby blivit populärt, Nu är Ruby inte enda språket som stödjer detta du har bland annat C# ASP.NET MVC samt de har de flesta språk något liknande bibliotek som underlättar men inget i sin grund.

Notera att detta inte är de enda skillnaderna men det är en av de stora, en annan stor puck är ORM http://en.wikipedia.org/wiki/Object-relational_mapping

Fixade länken
Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 5090
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck, Rog Ally + de fiesta konsoler.

Permalänk
Datavetare

En stor förklaring är nog att Ruby är ett riktigt trevligt språk, på många sätt bättre designat än JS och PHP. Ramverket Ruby On Rails är nog ändå den största orsaken.

Är inte lite att man undrar hur länge det ska ta och hur många saker likt JSON man måste "uppfinna" innan man inser att Lisp redan har allt det man idag "uppfinner" för client/server programvara, LINQ är en annan sak som C#-programmerare gillar att framhäva som också bara är en Lisp-finess man "uppfunnit".

Lisp har haft allt detta sedan 50-talet... Hoppas ClojureScript blir nästa heta sak för webben. Men är man realist så lär det knappast hända, vet inte varför folk inte kan upptäcka Lisp.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

En stor förklaring är nog att Ruby är ett riktigt trevligt språk, på många sätt bättre designat än JS och PHP. Ramverket Ruby On Rails är nog ändå den största orsaken.

Är inte lite att man undrar hur länge det ska ta och hur många saker likt JSON man måste "uppfinna" innan man inser att Lisp redan har allt det man idag "uppfinner" för client/server programvara, LINQ är en annan sak som C#-programmerare gillar att framhäva som också bara är en Lisp-finess man "uppfunnit".

Lisp har haft allt detta sedan 50-talet... Hoppas ClojureScript blir nästa heta sak för webben. Men är man realist så lär det knappast hända, vet inte varför folk inte kan upptäcka Lisp.

LINQ är guds gåva till folket. Hade dock inte en aning att det hade något med Lisp att göra.
Bara därför tänker jag ta mig en titt på Lisp.

Tack för tipset!

Visa signatur

^^

Permalänk
Medlem
Skrivet av Brandt3n:

LINQ är guds gåva till folket. Hade dock inte en aning att det hade något med Lisp att göra.
Bara därför tänker jag ta mig en titt på Lisp.

Tack för tipset!

http://lispers.org/

Alla bra idéer kommer från Lisp.

Permalänk
Medlem
Skrivet av Brandt3n:

LINQ är guds gåva till folket. Hade dock inte en aning att det hade något med Lisp att göra.
Bara därför tänker jag ta mig en titt på Lisp.

Tack för tipset!

Det som de flesta tänker på när de hör LINQ, hela "lista.Where(x => x == y).Select(z => z.Profit);"-biten, är bara en biblioteksfunktion. På den fronten har C# inget nytt alls utan är snarare ganska underutvecklat. Det som faktiskt gör LINQ intressant är LINQ-providers som arbetar med själva frågan mot datamängden istället för datamängden i sig. På den punkten är det glesare med plattformsstödet. Lisp har, som sagts, haft stöd för detta sedan tidernas begynnelse då ett Lisp-program har den tämligen unika förmågan att betrakta sig själv som en lista av funktionsanrop, detta på grund av att ett Lisp-program är en lista av funktionsanrop, vare sig mer eller mindre.

Om du är intresserad rekommenderar jag att du tittar närmare på Clojure som är en modern Lisp-dialekt med fokus på flertrådade applikationer.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Jag skulle säga att Clojures fokus är på "simplicity", som förklarat här: http://www.infoq.com/presentations/Simple-Made-Easy

Permalänk
Datavetare
Skrivet av tufflax:

http://lispers.org/

Alla bra idéer kommer från Lisp.

Finns en riktigt bra idé som faktiskt inte kommer från Lisp och tyvärr inte ens är speciellt bekvämt/enkelt att hålla på med i Clojure (eller Ruby, Python, Java, C# m.fl.): concurrent programming enligt CSP.

Är lite besviken på detta då jag började lära mig Clojure i hopp om att det skulle vara ett bra språk och en bra plattform för concurrent programming. Clojure är bra till väldigt mycket, men tyvärr inte concurrent programming. De språk/plattformar som gjort detta rätt (av de jag känner till) är Erlang och Go.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Beroende på vilken social domän du befinner dig i kommer en eller annan framework vara poppis för web (för ruby är det ruby on rails). På Reddit gillar de PHP, på StackOverflow gillar de C# (med ASP.NET).

Ruby är hett och edgy nu bland nystartade företag som vill vara först med nya tekniker. Och nästan enbart därför. Skulle dock bli väldigt glad om folk övergav PHP för det.

Permalänk
Medlem

[QUOTE=Yoshman;13430909]Finns en riktigt bra idé som faktiskt inte kommer från Lisp och tyvärr inte ens är speciellt bekvämt/enkelt att hålla på med i Clojure (eller Ruby, Python, Java, C# m.fl.): concurrent programming enligt CSP.

Är lite besviken på detta då jag började lära mig Clojure i hopp om att det skulle vara ett bra språk och en bra plattform för concurrent programming. Clojure är bra till väldigt mycket, men tyvärr inte concurrent programming. De språk/plattformar som gjort detta rätt (av de jag känner till) är Erlang och Go.[/QUOTE]

Att underlätta utvecklandet av multitrådade applikationer är ett av fyra designmål i Clojure.
De andra tre är:

  • Funktionellt

  • Lisp-dialekt

  • designat för att hostas i bredare plattformar som Java och .NET.

(Källor: http://clojure.org/rationale, http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Ri...)

De kanske har en annan approach till concurrency än vad som är konventionell eller ni är vana vid?

edit: hittade en liten presentation som tar upp de olika angreppsvinklarna: http://kachayev.github.io/talks/kharkivpy%230/index.html

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Datavetare
Skrivet av Teknocide:

Att underlätta utvecklandet av multitrådade applikationer är ett av fyra designmål i Clojure.
De andra tre är:

  • Funktionellt

  • Lisp-dialekt

  • designat för att hostas i bredare plattformar som Java och .NET.

(Källor: http://clojure.org/rationale, http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Ri...)

De kanske har en annan approach till concurrency än vad som är konventionell eller ni är vana vid?

edit: hittade en liten presentation som tar upp de olika angreppsvinklarna: http://kachayev.github.io/talks/kharkivpy%230/index.html

Channel9 videon hade jag redan sett, den är verkligen värd att ses. Har också bra koll på hur Clojure implementerat saker som agents ner på detaljnivå och anledningen är att jag hoppades att Clojure var en av de språk/plattformar som kan erbjuda en rättfram lösning på det man kallar C10k (fast 10k klienter är kanske i lägsta laget, denna term myntades för rätt många år sedan).

Clojure är tyvärr inte en sådan plattform och problemet kommer ner till hur I/O hanteras. En sak som Erlang och Go låter dig göra extremt effektivt är hantera I/O men även CPU-bunda problem hanteras effektivt. Clojure (och även Scala) hanterar det senare problemet med bravur men fallerar på det senare i lägen där vi talar om massiva mängder I/O på en server.

Säg att jag vill skriva en server som ska hantera 10k samtida klienter, varje anrop ska kolla vad klienten vill, hämta lite tillstånd/information från en databas (relativt långsamt), göra någon beräkning och presentera ett svar. Hur hanterar du det i Clojure på ett enkelt sätt (eller i Scala, Java, C#, C++ m.fl.)?

I Erlang & Go är det extremt billigt att skapa kontext med egen stack som kan körs oberoende av varandra. Dessa kontext är sedan multiplexade ovanpå en eller flera OS-trådar, typiskt har man en tråd per CPU-kärna i systemet. Programmet blir då

spawn clientHandler(args) func clientHandler(request, response, args...) { läst in vad klient vill från 'req'. Detta kan potentiellt blocka om klienten skickar mycket data. kontakta databas, detta kommer typiskt alltid blocka! gör beräkning. Detta är typiskt CPU-intensivt svara klient, detta kan blocka om det är mycket data }

Att saker blockar eller använder mycket CPU-kraft är inget problem i Erlang/Go då varje sådant kontext kan avbrytas när som helst och blockar man på I/O återanvänds den underliggande tråden.

I Clojure så är det enkelt att lösa den CPU-intensiva biten, rekommendationen om man använder agents är att använda send-off om funktionen man skickar med kan blocka. Det fungerar OK om det handlar om <1000 trådar, men det skalar inte till 10k klienter då ingen idag existerande OS-kärna fixar att effektivt schemalägga 10.000-tals samtidigt körande trådar. Det jag sett av Scala så har man samma problem där + att Scala har inte en lösning på hur man uppdaterar delade saker. Att saker är "immutable" löser läsning, men det löser inte uppdatering av delade strukturer (om två trådar uppdaterar samma struktur samtidigt så är det väldigt sannolikt att de förändringar en tråd gör försvinner om man inte har explicita lås) något Clojure löser väldigt elegant med STM (Software Transaction Memory).

Andra ramverk som node.js, Ruby on Rails, EventMachine (Ruby-ramverk), m.fl. löser alla I/O-delen av C10k problemet med hjälp av att allt är asynkront, men de har ingen bra lösning på hur man kan hantera beräkningsintensiva delar, sådan blockar de "workers" man har, typiskt en per CPU-kärna, så när antal tunga beräkningar överstiger antal kärnor så blockas systemet en stund.

.NET har (nästan) en lösning men den är relativt svår att använda korrekt. Om man kombinerar async/await med TPL som båda bygger på Task<T> så går det (nästan) att lösa C10k problem relativt enkelt där. Problemet är att async/await inte riktigt är designat för denna typ av last p.g.a hur man implementerat möjligheten att återanvända underliggande tråd, det blir allt för mycket "skräp" då varje "await" typiskt kommer blocka och man har tiotusentals eller kanske hundratusentals sådan anrop per sekund i ett system som ska klara C10k problemet, GCn kommer gå på högvarv och då dyker skalbarheten/effektiviteten. Vidare måste utvecklaren förstå vad som är I/O-bundet (ska använda async/await) och CPU-bundet (ska använda TPL), något som ofta kan vara svårt att avgöra och kan även ändras beroende på underliggande HW (ett system med 10Gbit/s länk till ett ARM system kommer vara CPU-bundet till största del, medan en Xeon server med 1Gbit/s länk med stor sannolikhet är I/O-bunden).

Så vitt jag vet är därför Go och Erlang de enda plattformar som löser alla dessa problem på ett väldigt enkelt sätt: man skriver sitt program rakt upp och ner med blockande anrop (vilket är mycket enklare att resonera kring jämfört med asynkrona anrop) och plattformen tar hand om schemaläggning av potentiellt 100.000-tals samtidigt körandes kontext och multiplexar dessa på en rimligt mängd OS-trådar på ett väldigt effektivt sätt när det handlar om I/O (epoll på Linux, I/O-completion ports på Windows).

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Hedersmedlem
Skrivet av pigge_85:

Om man kollar på Lyndas kurser och nya böcker som släpps om webbdesign så har det kommit allt fler och fler titlar om Ruby. Varför? Vad kan man göra med Ruby som man inte kan göra med JS/PHP/HTML5/CSS3?

Jag har inga mätvärden på detta, men Ruby och specifikt Ruby on Rails (ROR) började bli poppis på bred front runt ~2007, kanske lite tidigare, från att ha varit ganska marginaliserat men hyllat bland en mindre skara.

Jämförelsen bland begreppen ovan är bara vettig vad gäller PHP kontra ROR. Vad ROR erbjöd till skillnad från PHP var ett bra ramverk med vettiga antaganden för de allra flesta, vilket gjorde att det gick att slå upp funktionella och snabba webbplatser på väldigt kort tid, samtidigt som man hade ett i de flestas ögon bättre upplagt språk att interagera med. PHP har ett rätt bedrövligt rykte iom dess förmåga att generera horribel och osäker kod i mångas händer, vilket är en diskussion i sig, men att det inte är helt optimalt upplagt för vad det idag används till är rätt lätt att samsas om. ROR hjälpte även rena nybörjare med att undvika stora fällor (även om ROR i sig har haft en del större säkerhetsluckor genom åren).

Idag skulle min återigen ovetenskapliga undersökning säga att Django — Pythons idag mest använda liknande ramverk — är ett "hetare buzzword" än ROR och har många fördelar just iom dess Pythonbas, men det beror nog mycket på att Django fortfarande har stor plats att växa på samtidigt som ROR varit etablerat längre som ett reellt alternativ.

För en hemmakodare med en personlig hemsida med enklare funktionalitet så märks skillnaderna säkert inte av speciellt mycket, och snarare tycks nog ROR/Django/etc vara överdrivet krångliga jämfört med att bara skriva "<?php" och köra, men har man kodat ett par projekt så börjar man uppskatta MVC-strukturen i ROR och Django och dess modularitet. Säkerhet och bra designmönster får man "på köpet", så att säga. Ska man göra något större fel i dessa ramverk så kräver det ofta att man aktivt frångår de enklaste och mest uppenbara lösningarna, till skillnad från PHP där det ofta är tvärtom — de mest uppenbara lösningarna genererar ofta luckor för SQL-injektion, CSRF, XSS, session forging, headerinjektion i email, etc. och inte sällan väldigt (väldigt) svårunderhållen kod.

Vid webbprogrammering så löser man mer eller mindre exakt samma problem i varje projekt man startar — databaslayout, inloggningssystem, templates, databasfrågor i form av t ex nyhetsuppdateringar, artikelpublicering, ett administrationsgränssnitt för allt detta och användarsystemet och RSS och mailformulär och hej och hå. I stället för att behöva lösa dessa problem på nytt hela tiden (vilket programmerare vanligen inte gillar att göra: don't repeat yourself) och behöva tänka på alla hundratals fällor varje gång så löser man i stället, gemensamt med andra programmerare, problemen ordentligt en gång för alla. Det är grundtanken med ett ramverk.

Det är nog just liknande insikter som branschen och webbutvecklare, och i synnerhet PHP-utvecklare då det var så dominant ett längre tag, mer och mer kommer till ju mer båda delar mognar, och därmed börjar lösningar som Django och ROR få mer och mer uppmärksamhet.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Bra och riktigt intressant förklaring, tack!

On topic: Ruby [on Rails] är lättillgängligt och säljer, det är nog den bästa förklaringen på varför det finns så mycket literatur om det. Personligen tycker jag inte om språket, men det är bara jag.

Visa signatur

Kom-pa-TI-bilitet