domingo, agosto 19, 2007

Ruby no deja de sorprenderme

Ahora estoy aprendiendo a programar en Ruby para luego continuar con Ruby on Rails y me voy sorprendiendo a cada paso que voy dando. Esta última vez ha sido esta:

En Ruby los enteros pueden ser de cualquier longitud. (Hasta un máximo determinado por el tamaño de memoria libre de tu sistema.)

Se mantienen internamente en forma binaria los enteros de un cierto rango:

−2^30 to 2^30 −1
o
−2^62 to 2^62 −1

Los enteros fuera de esos rangos se guardan en la clase Bignum. (Todo este tratamiento es transparente.)

Total, que quería comprobarlo. Me defino una variable "a" que contiene el número:

irb(main):026:0> a
=> 20327559594432854331254052723909682292005331737126435064738121343587036093786
27423812975230103252846469772799331470407120242377620874399567479729421589841103
31213874275400623796008717829066516047407076701903070913085974795383311915774641
39255621856436509320501160089885568502926826048971306658044409437692251012451203
06419416409966329022361482433788653341407847422934357137165570931908095279130228
98571038697576799251507000410403196433817928034235456379758331457931426505675919
84118751789786265508757136909817715620976747011705178988900540768654278555714881
21419565878914241540588595782727302441400523516204959575201159071522952492176801
39631707865631366706156140047330126398144192916449092459065019011132716396777126
26719596728714034144647592366978601793607921574501743517812383034829913646760427
24181115878171063698142954185310436339750730779951735801739364341145285977955675
38222987974279275181244454706760869390896593865860007766276430134270941140886637
75507447357204112881669519047077272157402580431529492360090382066151894560481406
19871565619379624972594735067481331339898865496710265670784668524056186898379796
44080904141907624797328313813882084310944047738555311714454529152207182670273757
59595775400686722210931801029038976798840170780504930214168373158334649690680761
37633009384553206478541694047475896159926891571006153061878891566309460463529231
25989354060758065865986616546849126520200031388693249231762570499938403958538943
77131041673460090314242407578915027126663045926127960470474659948099100269042963
88717098639659009549627337667511021489591778606195444739749855549121667804581882
75062972287384024158262053722965635497484571942903640734278470342745727864776543
28392372788998804590072624284297425087746224544521361851196045349519679688039128
40397393956986732578851525955033452020901937486418801517286068936992215901449655
95809518118244647129447310662216503015769448974186319731719411758667264697043722
44785315401213819099189214792696786423334395321512144332102503663320814750991441
49262600239182275800408688226236325574070487060041488491724246817358680598723243
09274968702970719968970184385057512248389900018471968738404909858417545356027419
55358121986861442885500728389154952265568324295177547183388191737305413959984251
43941695447073216528896604578010373479241731472093947556862050691434704921460621
87770400243965557272485323318537859495220113390482963099762517107614267063207010
41384149497097251610361471072246895924876169646693056171415198780361603087179065
59792992558904591380426651654168376016073623096996431898897883326525081880273493
75472690621084896623288277911107880750363399658027947038523597710598774455967872
70182112381773344489891306394357110579790778779995824877221484472053671212937901
37845597388829289860934486272805228510320500991923969166079184646434005762044046
56500023375731002451697154446582390942995028545333827229186931609240697254539592
35804278788186401328458312763689932703986927979182879181474520226632280355862551
44495069990749245582019901311052853132221828237135985326274525542399960584198263
35006507139228356061122163487288336447651292493510383878210485841679355397138801
24642099121575679989495298222306510104819412346819269468585229974893978894850649
57555631958770281813372635130943401909358076936443964117428747368313008815994881
62570052178683236462899272537830569585568254601983499808846464625275930341302447
30919451427363205663812226029121879734480625974002741857723967721447871600280616
78440467959763846208904893206875416237546889045503825085601404596641568870453820
24347565680991020374303798501138562435351228280745140487595219654488172783070431
02365792552347138504320787549374926896099811823350027232088663941525987750764374
34113911291701113563973906180949100729561663385826279363991160275584140787349813
74545758319938609710118050664691614573807449656160778667981382359366510911233642
09468006251169866144958974654656631786913756931409352251757855874089445861545925
57869980269346126660339602661879813381043682119158650487203779855637063389110737
31433443641084221434902350027616735128676306268750341387914815538405794104259470
74640233371709569066035312729051314698049410587145712636178513996503901692711777
53582154185064821261808861373118716659534166551884963110574333173688817891817464
73442398393085112829959643900662517580981034789802516902017288300532635969443664
97572809236092190288576272723067092790146518123975133936045602108276285674710615
67199711268019473709735001500835043151709806280204719512225349496657298776143395
65653228136221597044002571327475085772166028419812414607422090407970059291763233
71982464326844489762721667185550190470501791320776376445664952962787380427514987
93100650909299740870613954274055815205995469022519513008215378970616342850871724
36515944103301775850854353741229951878934343073134842553968130771538968909114371
46018733166608936849200410752952854172059429241731997580932148708146787206203220
90623415073268399537431468556353970023087457711407614675399010797244977486510378
94158831799216604440179235998206835215930483405624178405335152526264112025531852
72673560040240520492554292790475397034222367281097739276447792028380276850981331
00255117625317621571967140217945407611543443312804953237456127982808292767005983
69319678656706833266766579282158043564121625543092938394778794633758775132013131
28202508607207512885935134966628135197773491011658204107456610104198701460804474
18776241626480612831328149845782292822624162511193690695468477720541791765588758
90259837167112015542335863371831402615689654466578060525441760037490841188506872
09814092642203824694606445060133566653994861818953340616471508978557988203403168
70475472792103006712229208483441005606538434602360832764184180768027009627977279
00838656271750336205802792195458183260319625918146586833684435248735615844605812
65956020553014877059871393211693173491517456952242399535459776767427646340023126
59840598726052980678944445569273534644515889511147123102233963483568121537781863
45596819342415109569412460880463219247378571293170796919965693591203857450215937
31955204504311281097382914149338086865113304583652295229661241668238545796956890
53457008085035018979494331272646104655100952688806617152775151758971501336011556
23155499540557818006383076676653803981964462723903160070491453307892831554440832
98662670733914921621746845907983595267388914311031324569450992824976178473739346
96796779910995196707081607268149229344886659800814029640435903710032617581810136
39870851721450060647577425124043162499311050222578057196608270978916779373647531
62484149493919780042683110915868342298521834259188482704409763152131718861115710
30929277726108749530291869510769273822157194903199092884561407410563008043914654
62755080979416400054289217654405233307528237494350910537895127868111821190372187
21461758519864140928872997250609857289524833545236710995242586122267122788447799
43199578221131432841421857715758330548184619839626892298041322333261415618061030
27177332393663214661743960953952086475840615956142564955276219690580288803097030
76283763434832923957174521398074087815236549255558452693631098069464425595711849
65056769934090339019149023057563245759406341925511215096433657738684662952192023
06350888533464089406140080784668412634881689058448014183564735603243052701106507
02955018079902842539298554835874765641739244758851466010836140827988152999367142
06024768198730920578576051698579080620619773633272381511064901622921590907603608
65565122615189338563257326724380828765717771843954324469583928837434127019776713
30147250883211956068521116148172443293790549502645205249666415215825507910391560
36357642223990376393851610479563425639483402640725959916471939324459216869887972
78133704628930118190286814231722084064044707367515558692793388115877326620166591
99163020776151661910637426631325758935233481318390611241726176761816411710331426
134496021125403283918928304946611814337610504772097185216004096


¿Petará esto cuando haga la operación a = a * a? ¿Cuanto tardará? Veamos...

irb(main):027:0> a *= a
=> 41320967906521918926436290987066958413344763055673726047400987424452062993794
71649797828768195607082345662695709146188234000707432730044892004549858744595151
78902428380380577877556679727098343544382949154119214761426904868240688304573356
28471520966308185562006042259203812960408072884928860219485694635084250252491624
83635930820993572902432767602406964466549330103389740243282129893551703991418510
66668584696797416594591006765821071806810894462945369498559358201907505129643625
59616715213319869330992691721663683219790481329530397137205564688243776616067344
21316340368115369477071332310385400956166677326904645982891895468528945433498753
32265046189240168450066119608741065183143040545858353998123995950760658680895099
06444178351580177505673834016517445546660452989221548616773926695384794143509657
50851179108423706156851823048598776598217758645387991513331779857719553304104026
87824943487171541045898406440560163481426793880932659156103694501408909827896928
72020719927331063947668910296547474887938273749578255774172513041893970005491495
76843841351350330959451797378379811732784572167945209555317744658444452264151948
14727628023675834055626800912696372786061073108295585950838034296868397340311093
85490101982246108088057989355188477000050136508780253495085420270519755825677140
85809249556587314540219061307131415510240884838768481816064417142562893017037794
57507904801010214413782995898348586434035069386263346961584067626262228848714709
13109137883297600269730598025859732455306139324617438181497748352548492750124807
48689077205693791091677216613404237579137239585320732764449831252713021188588637
50760405639269457585891038651644064633131921885272661227651052877763615730062856
52229256985626462480236983170180350748347856627016489410674632178062007274053915
23912187636742218265562600513095551807039848362523309650275342226372091098374202
67580155993956509993854699380389386485585517807708128492095982084177674777863736
83412338769469240060368003132969919745176620457808514289921808554804806663263889
24253129418090263695572671352798896782779456753644854963815574373097366131166461
36546913586826246796909589313157179724562948034839826695003180949574714014696590
06516981381634594153415817229653016928871218664428477553110811922746879347704931
61453744662786375557178699224411540633469609469277318626860202714910122333110151
43469267427254382627242762364069695168546951047517555859238687942549499807254843
68379664921703439094122262597783934489774795268236614826723561169073456451634242
22481901992021247181215694039282902710866826355607772273409662424524183260808412
32459694398099987501726109325066033709832823010571571814895836355000883626106894
90722933759274051026170624456531340678851774062357956518998794558795253005955666
85477617258071568912518967383048133103968869136960532163741419601233255713932566
18909700001353027699426037379442189955968874627413400484654046336068907767203043
30724403766746220609216847722559536967770775563133394031652144313348488702676851
41379733733425329793746598148070912484292689283151961551495642454990932380065239
74930311232435473574527355810432226014675849150080480498421483584937282359270209
09027008855036731554533029943675013997277799073396486799449647865127855944109725
14315189164858869378610610502177833491173260465926506574810085701444838892144042
10469290931008523294446773022317707324254179594622375090949853165958224689654454
71964436138300712726501046500952062071413946338404611427995310357394643064021644
75958680491089744978179342492349312675747045616842134427889756020812146987220807
84153897542203742793768039206689499520100068609367890014451296909184375401032008
17688492531724530476658565606135533155980990920625906192676377962650659599820554
55162984551260444900007938154254706123219026455433572566581049952310361775140163
12547853046760706537406774086208681151212211884941672316822733226076174667546132
74518983417603006457260359475987634549788790310691620381285641966962615253005977
91374007099084005923970485084704473704822925166532641894785547011978800089426043
75626535150825649281037067101743040097915367544656297893000218754092265442237174
28354232961245050024681899483248049835983797392395340030349278361850125127789680
70821770610099361785823964450759579402265233674899530739603646496740315324084094
40868074671099740916134837009414427505155991029887590018613726894270118873317719
44104845492573422039452927433338298080040936814830316000109988523275304350975869
54279715341457753041866510677344049060717999443795305109422965078660237893628647
30966035683357954956120010535535451836723885927415728211466225199555881478775245
95861434296341991099176327075709798936816178158901255692025358626464746939741037
92225662938566995572697788336508506307369285181130525777549796289288672631341890
20355324703252986238899549590822555735692718325921979516252604820910270862003591
24942120703911393236902001682288725608653149108030726814875255288835892173707247
93735614349154589133859611790820090657179275529137123262326755795922115756882658
90745950031448234134138420611437193979127763567715959375673133861116913570396122
61337756218726564398443861598464425152639005124662299370211179946476424931626726
81835711951980266891273753571667938068737406816174913675941790729030376033076214
41912471482847626635909142888574762400144453747414010649282413253219097227381856
05734735007118107306432372975304644570928388977577554683353543716234209411429200
39874331570094102748139780700307725606398093215407758786517367792663121611514195
64707794886354048713189115360545618566436691450144139832171408540102702843056837
11222549004949397033768383859789424347398770773953929925896139135403565653893776
29309933343945688931082437500533748787995981701303150471862831582074170380045486
78085956991011236771333194303095124641829122025688473427186394044623213637996237
80879428025287573352179663469354914556237401102862495500436612144784259622953319
18230317710136278638438920216278719196733192054565140836288221612541955667787478
62458554921594204633450785515957108581233044442811914616088573712315846058602783
26859244987845641990072565716196072511062235295285712757261390266899067775152778
21884762954419925246861869898947778688175459646419399536543645917776419347867076
81226614375796454924585790872969491129151032488477579942238823175328584900105963
24007277204564466954012989358079637829289761246876095800747414954242167465393096
19145744983057540902592540686273417197755672414349996445650486616767887999005690
27802374739644122607828345764307492473929316441111920146434011214036177236869940
60417774697859768879886041122346623796292957278599562707062783934764516299499716
00070986019852695343625118316948231573518625446976388663437521505662457499677755
58140267498391254674842651521138063490159455717590296304067477105309127730378385
84352426131788263616797316050584221169753580471262004826891279780490675834825141
77824161177615590187540649791097687790234868645488526701610066333051196167643483
58911207617170635066310506704826919546377291042517482948922107108999273674675774
89014994736123990530895233852534277898430882933311598041332110865008235725076530
24031708680871662664229561437182402439104891258018976744423105482115164100614493
62209217304678069673880709652104536474008178278695250501933286945418310014950438
86202406852469775012854609934005777463086513563626701913274107632000814858867604
07250558637224236588438140840069432874126494721082508688818150860884060813357054
68002676268715901903113175608603921358066225157507635524280780637285734659468320
78820091293635354949395688295928660525219575503426050932008086026618907248097420
49499277023354598466899950956598013911368655306487880729467191368561549408958112
42266281891484113661865569930358676779434147647013120706938271416264451970801394
86480627697887338124465795373795736261891057600797189054694915540486012306377941
17001764614145280132982840431482578334372432143176956189423722835602826793294484
64467975092040368459322748630449337113006645458978706185785953913695201344428020
97286740833668520125778328931156808728115731671568726733058247834675321481195344
12435251210562593773964773713296173002287633880966560185360926988173600129622058
63354661555738104335660074740578534347891163042292571298345390003748580667737433
36932066544238144214523458944833934138545338415881274854979328824193782564189934
00398020292209623478349241570425790137219964880589954811681960096509968633764783
45960187012879626642135604953732142241873997800488821110241893672892327284354856
30621326551776567040331604829094622546117205129969002729175288781193491988162521
92114972696775826966293858638718633467585462800539719866010475466370485353418527
19911141194420156841824357474230857287057964100392362812543448533446202220015594
08106185941856917373930887412474491787959739366011101840110669440445863437028032
91195062584287598729859810921024683311986834587449262173758446672054649157058406
44458541177337436304428220576879220383430378057677795980870950841852480094836799
29232255206948906286746655955578474053566523253019207039208715181073124208787421
13290077933504874010646188514819420974041760681709275997139807708781898977748049
86651696374443179186471868602258637604946957661483860454834148169146415152892782
93780110210580285437730498172926675978705986246572622263960644520075492133936939
99611664996408048257779433758339874471995923737886419786010730976103382491499406
95243958520731014965934549499130594537135954798217117429647712150063827674780493
14324696680977924302654256133638638601756621190244916990598696159257611923144281
88006531142403669540107530775172683828214468011122879041915017004574695400968816
95915731207223360066526904208326435808411959728440535032351504145320305972904345
67684605058718425555255395498669428002179048908320104266759913538532577542928974
45678114129871470261662643497974070480294196905724394543627092429050966224358483
22788044308199350291557300775064677749855524420559037624574315762600371454027762
57742034366382814953731706083711528090764490404983639023746309362091271469350774
98885702361470127248285276518228216670717061294793458449777019425637646880347425
29936047411747587334697246945346187072008514252681107705867826486379355813880281
34796783920230410538472794805419985458043748902029534548622903091830671661646332
93975149390311829318105833491404146054261142577137062028981113104207939687419243
25175958141141470593595952052685650918745770555163257889229452292888869827241404
20645738119019943015401633436159515848085827439337227430969211387443688182695041
91438685002024185064352282869607059716969508294673701689055985117255723696083111
83647257178990928001940783061719578582990133150009387868287165894111448188187030
35400580878636499245729042061410546770815633832878684564131785577848481247698798
94394245822045138698112463646530588860657237240440255700600405778856588867078088
72404356421099525218216168876717790387830733831387983266850044142375018457719244
44514150411224080733814956743473950378497773415855149976637997496992683447333169
06508760534566126750698364088855224044653875018904128038678826475645281523332282
09381116511862769411857371168572330797100730218055937748226175232438710507391844
21479648061666186010614760466287172660338434753788558398867578881609796800171734
46680905296509698175617221928034359461462879050107984400999473710143220569734895
84053032948849971908657373776371984961185972202057071126782056206803311248795275
88991939000439200548203269195223229654911389748195087208301335817774671060371059
81826816495909473595245884658874104375373108258351180966770480983658869966685329
04502103835752648156494010067067339596501042521835627449418075478514263081180698
10343429045700079147158409834123493540933548574072309531001034320001615203928547
11132937398349787636760120625674048237057244894150860063729317445062566476045514
44136639009102432102379943734496854047628942249883263718519745706751323503819664
67103704969634274784704044303569961292022954118893878117344167109114529194003898
26757561415363712731235680173669360347048152354993018660458421873624054634361700
91130294849176020710666118789227534893675055650926728596641066679362903764554112
26815559807406843936711459758527618478548873623624553634999653149143090130758750
22809544555762924644276104567444527869896522673054340747600173702505496269883434
47408691240889404687344274193210172221471312878407560969390689728691153822353562
08776305051416823283503800310560381535768865155060222148645071762165205826542987
81495543743680435559198849881333160194305059243137565060001931689860657056170394
96838550425365374379272114672299782371129369664660070196414090613587036925368927
60000063396067373365172907357593924165623654526021705090146702751025008611326632
60693560472656512831527151006963375118222227663946254343115214380064062765823710
90683042934856045980717861596717302929804641406911911707236412280105027299514723
84130331757762818575699372039227071647381041070946481944162921835386360685735446
37009690927674642070377106621909342530500370208894962056895706305465936769582906
32056590325966078240186899762460191799782021467770280530241870594995836581148627
29371774553669753535451106572956591941002157422926350261517245764484899104231403
32390338491012841302452547157177640111116285375144714530987890356191119979802775
87393219532052866612022027448026533352274090989445226659945969544741988046476530
34308068855413638607633023214219495572524687436454722728848562921501164479207112
64108725913612562015315989618131313597535251965694202964713828446406416880371950
49313712689117003154653877187476138246627320719950927224127060407482882161605914
18686670588630791691652105521713826704887921958004876175843665635740893275653628
17167134892956847925678676200024649142643804342301797907101691223809741540479613
30545156515336642454273693726486314862163219522143042215915971459682486820097348
97167965535839305328385085992067305960941342691703082351759699544820437704195163
95850825144492131297632354518864410504634839216527858014629053182690670414430598
07153553390588106089826022885822507206472184301228736629843761030588778979854186
20976849098474580628943414783480254498924533100452910699071807317390949227415323
40012844704568347305998886963850460306975341146559121371543039240475692826482751
72700078234559090232389707647760238142180530499389602395092000782435563685245098
32749053147001935807911878674210059791950235157704867811981358538466412517007526
83566738090543280081436427423598761598013616608014089424291011043367619555352154
80324148511504234747834395317226819305028497757967079418939880102085835452633466
61753746710340905396510142452783033865304194874618153647866685908561246847637342
77094458141847782655766355689922855870967058401560783654576368717490336038943075
15238453245857955339798194326116709637790792437588248408880921324897513326745041
07517381708896738943701135937429281449959094420115870058766548525314041777855610
55878200743809050513878359499310948433033995171891761853788510996340432759659923
23206511334600845634188907192928426303998902815262037972747144840054622130791713
24606441533940526730015145537283600494502681437720184516889538685795988038502641
03012432112660342133228564297062553276402770267799676359119312570399739076155261
07139718984729664923970233176020317949264752591336434819047043779491264305646502
14111244398625531600551185469833480189736776735298848704010086839911840447798719
21035709408721716827796700789241391073688114907635286958907975750411316436577926
45938829599344535910684892389377248782896105898840851141161385936720651631778311
82108221753901710412476678463030583607032151605028021953651392739800511130981694
93628802833045410074409424037778193247775299344597043390200853353714284520491640
39540700136095858578455206500407324726468722575543975483788674853114236649370284
367862563627334851725301986797289488777216

¡¡¡¡Ni se ha dado cuenta de la operación que le he metido!!!!!
Resultado instantáneo... (Estoy casi seguro de que esto tiene que tener tecnología extraterrestre por algún sitio... Siempre se puede echar un vistazo al código fuente...)

Otras cosas útiles que voy viendo... Por ejemplo, para acceder a los vectores desde su último elemento se hace utilizando un valor entero negativo como índice. De esta forma accederíamos al último elemento del vector:

a[-1]

Y de esta al penúltimo:

a[-2]

Iré informando de todo esto... Que por cierto, cada vez me va gustando más...

Aquí dejo un enlace de un manual de Ruby en español

Existen otros proyectos que intentan "copiar", unos con mayor acierto que otros, el framework de rails y la forma de desarrollar la aplicación utilzando MVC. Por ejemplo:

· En PHP tienes, por ejemplo, PHP on trax, o Cake PHP.
· En .NET tienes Castle.

Una de las características que más me gusta de Ruby on Rails es que tienes el ActiveRecord. He estado mirando cómo lo hacen esto de ActiveRecord con Castle y es más el trabajo definiendo las clases para cada tabla de la base de datos, que las ventajas que aporta.

2 comentarios:

  1. Anónimo10:30 p. m.

    Pues si te gusta ruby ya puedes ir viendo Jruby 1.0 que es compatible con Ruby 1.8.5 y en un futuro cercano compatible con ruby 2. La mayoria de aplicaciones de Ruby funcionan bien en el entorno de ejecucion de ruby y ademas esta disponible la version 0.5 de Activerecord-JDBC que permite usar cualquier base de datos a cualquier libreria java.
    Es posible acceder a cualquier libreria java desde jruby y su rendimiento es superior a Ruby seran motivos para emplear Jruby en vez de Ruby.

    ResponderEliminar
  2. Pues tendré que informarme... :-)

    ResponderEliminar