Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#2101 Le 05/01/2012, à 15:07

Jules Petibidon

Re : /* Topic des codeurs [6] */

Oui, c'est l'OS qui garde les librairies chargées en mémoire, tant que l'espace mémoire n'est pas nécessaire pour autre chose. À priori tu n'as pas à le gérer toi même.

Hors ligne

#2102 Le 05/01/2012, à 15:17

:!pakman

Re : /* Topic des codeurs [6] */

Merci smile

Cela implique en revanche d'utiliser des librairies dynamiques, non ?

Dernière modification par :!pakman (Le 05/01/2012, à 15:18)


...

Hors ligne

#2104 Le 05/01/2012, à 18:32

valAa

Re : /* Topic des codeurs [6] */

svn a écrit :

factorisation du code doublonné un peu partout
Removed 1006 lines
Added 396 lines

gas.png

Hors ligne

#2105 Le 05/01/2012, à 19:37

The Uploader

Re : /* Topic des codeurs [6] */

Ca doit faire du bien. big_smile


- Oldies PC : Intel Pentium 3 @ 800 Mhz sur CM ASUS P2B-F, GeForce 4 Ti4800 SE, Disque Dur Hitachi 160 Go, 512 Mo de RAM, 3DFX Voodoo 2, Sound Blaster 16 ISA PnP, Windows 98 SE / XP)
- Desktop : Intel Core i7 6700K @ 4 GHz sur CM ASUS Z170-P, GeForce GTX 1070, SSD Samsung 850 EVO 1 To, 16 Go de RAM, Disque Dur Seagate Barracuda 3 To, Windows 10

Hors ligne

#2106 Le 05/01/2012, à 19:47

tshirtman

Re : /* Topic des codeurs [6] */

J'ai vu aujourd'hui que "time" pouvait remonter des infos sur la consommation mémoire, j'ai pas réussis a utiliser le flag format, mais en utilisant la variable d'environnement TIME, ça marche

TIME="%M %K" time ls

(par exemple, y'a pleins d'autres valeurs dispo)

pour ceux qui utilisent zsh, il faut appeler /usr/bin/time, car zsh utilise son time builtin, qui ne fait pas ça…

Hors ligne

#2107 Le 06/01/2012, à 00:34

The Uploader

Re : /* Topic des codeurs [6] */

diff --git a/src/com/Antubis/AntubisBot.as b/src/com/Antubis/AntubisBot.as
index 7600aca..c1c0c24 100644
--- a/src/com/Antubis/AntubisBot.as
+++ b/src/com/Antubis/AntubisBot.as
@@ -34,19 +34,20 @@
 
     public class AntubisBot extends Bot {
         
-        private static const EDGE_LIMIT:Number = 6;
-        private var lastSeenResource:Point;
+        private static const EDGE_LIMIT:Number             = 6;
+        public static const MAX_LIVING_PHEROS:Number     = 80; //Ideally, the number of bots in the team * 2
+        public static var livingPheros:Number             = 0;
+        public  var lastSeenResource:Point;
         private var lastDropedPhero:Phero;
         private var seenPhero:Phero;
-        private var chatted:Boolean;
         
         public override function AntubisBot(_type:AgentType) {
             super(_type);
         }
         
         public override function Update() : void {
+            CorrectLastSeenResource();
             super.Update();
-            chatted = false;
             seenPhero = null;
         }
         
@@ -64,7 +65,13 @@
                                                                                     AgentFacts.SEE_RESOURCE,
                                                                                     AgentFacts.BIGGER_RESOURCE)));
                                                                                     
-            expertSystem.AddRule(new Rule(CustomBotFacts.DROP_PHERO,    new Array(    CustomBotFacts.NO_PHERO_SEEN)));
+            expertSystem.AddRule(new Rule(CustomBotFacts.GO_TO_PHERO,    new Array(     CustomBotFacts.SEEN_PHERO,
+                                                                                    AgentFacts.NO_RESOURCE,
+                                                                                    AgentFacts.NOTHING_SEEN)));
+                                                                                    
+            expertSystem.AddRule(new Rule(CustomBotFacts.DROP_PHERO,    new Array(    CustomBotFacts.NO_PHERO_SEEN,
+                                                                                    CustomBotFacts.DROP_ALLOWED,
+                                                                                    CustomBotFacts.SEEN_RESOURCE)));
                                                                                     
             expertSystem.AddRule(new Rule(AgentFacts.TAKE_RESOURCE,     new Array(    AgentFacts.NO_RESOURCE,
                                                                                     AgentFacts.REACHED_RESOURCE)));
@@ -79,10 +86,14 @@
         }
         
         protected override function UpdateFacts() : void {
-            if (!seenPhero  ||
-                seenPhero && Point.distance(new Point(seenPhero.x, seenPhero.y), new Point(x, y)) == perceptionRadius ||
-                seenPhero && seenPhero.GetPheroType() == "Resource" && homePosition) {
+            if (!seenPhero) {
                 expertSystem.SetFactValue(CustomBotFacts.NO_PHERO_SEEN, true);
+            } else if (seenPhero != lastDropedPhero) {
+                expertSystem.SetFactValue(CustomBotFacts.SEEN_PHERO, true);
+            }
+            
+            if (livingPheros < MAX_LIVING_PHEROS) {
+                expertSystem.SetFactValue(CustomBotFacts.DROP_ALLOWED, true);    
             }
             
             if (IsNearEdges()) {
@@ -96,16 +107,16 @@
                 expertSystem.SetFactValue(AgentFacts.NO_RESOURCE, true);
             }
             
-            if(GetLastSeenResource()) {
+            if (lastSeenResource) {
                 expertSystem.SetFactValue(CustomBotFacts.SEEN_RESOURCE, true);
             }
                 
             if (seenResource) {
                 expertSystem.SetFactValue(AgentFacts.SEE_RESOURCE, true);
-                if (Point.distance(new Point(direction.x, direction.y), new Point(x, y)) > 
-                    Point.distance(new Point(seenResource.x, seenResource.y), new Point(x, y))) {
+                if (IsCloser(seenResource)) {
                     expertSystem.SetFactValue(CustomBotFacts.CLOSER_RESOURCE, true);
-                } else if (takenResource && seenResource.GetLife() > takenResource.GetLife()) {
+                } 
+                if (takenResource && seenResource.GetLife() > takenResource.GetLife()) {
                     expertSystem.SetFactValue(AgentFacts.BIGGER_RESOURCE, true);                            
                 }
             }
@@ -114,7 +125,7 @@
                 expertSystem.SetFactValue(AgentFacts.REACHED_RESOURCE, true);
             }
             
-            if(homePosition) {
+            if (homePosition) {
                 expertSystem.SetFactValue(AgentFacts.SEEING_HOME, true);
             }
             
@@ -127,87 +138,67 @@
             }
         }
         
-        protected override function Act() : void {
-            for (var i:int = 0; i < expertSystem.GetInferedFacts().length; i++) {
-                switch(expertSystem.GetInferedFacts()[i] as Fact) {    
-                    case CustomBotFacts.DROP_PHERO:
-                    DropPhero();
-                    break;
-                }
-            }
-            super.Act();
+        public override function GoToResource() : void {
+            direction = lastSeenResource.subtract(targetPoint);
+            direction.normalize(1);
+            lastSeenResource = null;
+            seenResource = null;
+            takenResource = null;
+            lastReachedResource = null;
+        }
+        
+        public function GoToPhero() : void {
+            direction = seenPhero.GetCurrentPoint().subtract(targetPoint);
+            seenPhero = null;
         }
         
         public override function onAgentCollide(_event:AgentCollideEvent) : void  {
             var collidedAgent:Agent = _event.GetAgent();
             super.onAgentCollide(_event);
             
-            if (seenResource) {
-                if(Main.world.IsOut(seenResource.GetTargetPoint())) {
-                    lastSeenResource = seenResource.GetCurrentPoint();
-                } else {
-                    lastSeenResource = seenResource.GetTargetPoint();
-                }
+            if (collidedAgent as Resource) {
+                lastSeenResource = GetCurrentOrTargetPoint(collidedAgent as Resource);
+            }
+            
+            if (collidedAgent as Phero) {
+                seenPhero = (collidedAgent as Phero);
             }
             
             if (collidedAgent as Bot) {
                 if ((collidedAgent  as Bot).GetTeamId() == teamId) {
-                    if(!chatted) {
-                        Chat(collidedAgent as AntubisBot);
-                        chatted = true;
-                    }
+                    Chat(collidedAgent as AntubisBot);
                 } else if ((collidedAgent as Bot).HasResource() && !hasResource) {
                     StealResource(collidedAgent as Bot);
                 }
             }
-            
-            if (collidedAgent as Phero) {
-                seenPhero = (collidedAgent as Phero);
-                if(!chatted) {
-                    GetPheroInfos(seenPhero);
-                    chatted = true;
+        }
+        
+        protected override function Act() : void {
+            for (var i:int = 0; i < expertSystem.GetInferedFacts().length; i++) {
+                switch(expertSystem.GetInferedFacts()[i] as Fact) {    
+                    case CustomBotFacts.DROP_PHERO:
+                    DropPhero();
+                    break;
+                    
+                    case CustomBotFacts.GO_TO_PHERO:
+                    GoToPhero();
+                    break;
                 }
             }
-            
+            super.Act();
         }
         
         protected function Chat(seenBot:AntubisBot) : void {
             if (!lastSeenResource) {
-                lastSeenResource = seenBot.GetLastSeenResource();
+                lastSeenResource = seenBot.lastSeenResource;
             }
             if (!homePosition) {
                 homePosition = seenBot.GetHomePosition();
             }
         }
         
-        protected function GetPheroInfos(phero:Phero) : void {
-            if (phero != lastDropedPhero || !lastDropedPhero) {
-                if (!homePosition) {
-                    homePosition = phero.GetHomePosition();
-                }
-                if (!lastSeenResource) {
-                    lastSeenResource = phero.GetResourcePos();
-                    CheckLastSeenResource();
-                }
-            }
-        }
-        
-        public override function GoToResource() : void {
-            direction = lastSeenResource.subtract(targetPoint);
-            direction.normalize(1);
-            lastSeenResource = null;
-            seenResource = null;
-            takenResource = null;
-            lastReachedResource = null;
-        }
-        
         protected function DropPhero() : void {
-            var dropedPhero:Phero;
-            
-            if(homePosition && !World.BOT_START_FROM_HOME || seenResource) {
-                Drop(dropedPhero = new Phero(CustomAgentType.PHERO, homePosition, seenResource.GetTargetPoint()));
-            }
-            lastDropedPhero = dropedPhero;
+            Drop(lastDropedPhero = new Phero(CustomAgentType.PHERO));
         }
         
         protected function IsAtHome() : Boolean {
@@ -223,14 +214,22 @@
                     y <= EDGE_LIMIT || y >= World.WORLD_HEIGHT - EDGE_LIMIT);
         }
         
-        public function GetLastSeenResource() : Point {
-            CheckLastSeenResource();
-            return lastSeenResource;
+        protected function IsCloser(_agent:Agent) : Boolean {
+            return (Point.distance(new Point(_agent.x, _agent.y), new Point(x, y)) > 
+                    Point.distance(new Point(direction.x, direction.y), new Point(x, y)));
+        }
+        
+        protected function GetCurrentOrTargetPoint(_agent:Agent):Point {
+            if (Main.world.IsOut(_agent.GetTargetPoint())) {
+                return _agent.GetCurrentPoint();
+            } else {
+                return _agent.GetTargetPoint();
+            }
         }
         
-        private function CheckLastSeenResource() : void {
+        protected function CorrectLastSeenResource() : void {
             if(lastSeenResource) {
-                if (Point.distance(new Point(x, y), lastSeenResource) <= perceptionRadius && !seenResource) {
+                if (Point.distance(new Point(lastSeenResource.x, lastSeenResource.y), new Point(x, y)) <= perceptionRadius && !seenResource) {
                     lastSeenResource = null;
                 }
             }
diff --git a/src/com/Antubis/CustomBotFacts.as b/src/com/Antubis/CustomBotFacts.as
index 75f9fc3..ba67103 100644
--- a/src/com/Antubis/CustomBotFacts.as
+++ b/src/com/Antubis/CustomBotFacts.as
@@ -22,9 +22,15 @@
         
         public static const CLOSER_RESOURCE:Fact= new Fact("Another resource is closer.");
         
+        public static const SEEN_PHERO:Fact        = new Fact("Seen a phero.");
+        
         public static const NO_PHERO_SEEN:Fact    = new Fact("Can see no phero.");
         
         public static const DROP_PHERO:Fact        = new Fact("Will drop a phero.");
+        
+        public static const GO_TO_PHERO:Fact    = new Fact("Go to Phero action.");
+        
+        public static const DROP_ALLOWED:Fact    = new Fact("Can drop a phero.");
     }
 
 }
\ No newline at end of file
diff --git a/src/com/Antubis/Phero.as b/src/com/Antubis/Phero.as
index c6bc163..21b40e9 100644
--- a/src/com/Antubis/Phero.as
+++ b/src/com/Antubis/Phero.as
@@ -1,8 +1,10 @@
 package com.Antubis 
 {
     import com.novabox.MASwithTwoNests.Agent;
+    import com.Antubis.AntubisBot;
     import com.novabox.MASwithTwoNests.AgentType;
     import com.novabox.MASwithTwoNests.Resource;
+    import com.novabox.MASwithTwoNests.TimeManager;
     import flash.geom.Point;
     
     /**
@@ -12,32 +14,25 @@ package com.Antubis
     public class Phero extends Agent 
     {
         protected var color:int;
-        protected var homePosition:Point;
-        protected var resourcePosition:Point;
         protected var lifetime:Number;
-        protected var phero_type:String;
-        public static const MAX_LIFETIME:Number = 300;
+        public static const MAX_LIFETIME:Number = 9000;
         
-        public function Phero(_type:AgentType, _home:Point, _resource:Point) 
-        {
+        public function Phero(_type:AgentType) {
             super(_type);
-            homePosition = _home;
-            resourcePosition = _resource;
+            AntubisBot.livingPheros++;
+            if (AntubisBot.livingPheros > AntubisBot.MAX_LIVING_PHEROS) {
+                dead = true;
+            }
             color = 0X6F2020;
             lifetime = MAX_LIFETIME;
             graphics.beginFill(0XAAAAAA, 0);
             graphics.endFill();
-            if (resourcePosition) {
-                phero_type = "Resource";
-            }
-            if (homePosition) {
-                phero_type = "Home";
-            }
         }
         
         public override function Update() : void {
-            lifetime--;
-            if (lifetime == 0) {
+            lifetime += TimeManager.timeManager.GetFrameDeltaTime();
+            if (lifetime <= 0) {
+                AntubisBot.livingPheros--;
                 dead = true;
             }
             graphics.clear();
@@ -45,19 +40,6 @@ package com.Antubis
             graphics.drawCircle(0, 0, 2);
             graphics.endFill();
         }
-        
-        public function GetResourcePos() : Point {
-            return resourcePosition;
-        }
-        
-        public function GetHomePosition() : Point {
-            return homePosition;
-        }
-        
-        public function GetPheroType() : String {
-            return phero_type;
-        }
-        
     }
 
 }
\ No newline at end of file

neutral


- Oldies PC : Intel Pentium 3 @ 800 Mhz sur CM ASUS P2B-F, GeForce 4 Ti4800 SE, Disque Dur Hitachi 160 Go, 512 Mo de RAM, 3DFX Voodoo 2, Sound Blaster 16 ISA PnP, Windows 98 SE / XP)
- Desktop : Intel Core i7 6700K @ 4 GHz sur CM ASUS Z170-P, GeForce GTX 1070, SSD Samsung 850 EVO 1 To, 16 Go de RAM, Disque Dur Seagate Barracuda 3 To, Windows 10

Hors ligne

#2108 Le 06/01/2012, à 07:42

grim7reaper

Re : /* Topic des codeurs [6] */

Hello World!

Bon le fait que Πυλάδης publie la dernière version de son interpréteur BF m’a rappelé que ce n’était pas moi qui avait le plus performant. Hier j’ai donc décidé de remédier à cela et j’ai donc aussi écrit mon interpréteur en C big_smile.
Résultat (compilation en -02 -march=native pour tout le monde bien sûr) :
Πυλάδης

time (echo 200 | ./bf primes.bf)
Primes up to: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 
( echo 200 | ./bf bug; )  28,50s user 0,00s system 99% cpu 28,520 total

Moi

time (echo 200 | ./cbfi $primes)
Primes up to: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 ( echo 200 | ./cbfi $primes; )  12,38s user 0,00s system 99% cpu 12,381 total

cool

Je publierai mon code quand je l’aurai un peu propré et corrigé un bug qui traîne.

Hors ligne

#2109 Le 06/01/2012, à 13:03

grim7reaper

Re : /* Topic des codeurs [6] */

Tiens, du coup pour le fun j’ai retesté mon implémentation en C++.Et là… surprise !!!
Je suis plus rapide que Πυλάδης (~22 s pour mon C++, ~28 s pour le C de Πυλάδης). C’est bizarre car j’ai souvenir que Πυλάδης était plus rapide que moi.

Du coup, jme suis dit « soit il a merdé en améliorant son interpréteur, soit les gus de GCC se sont arrachés pour l’optimisation du code généré à partir du C++ ». Pour trancher j’ai testé la version 1.2 de l’interpréteur et il est bien plus rapide que mon C++ (~18 s pour la version 1.2).
Mais il reste plus lent que mon C cool
Bon du coup, je ne sais pas ce que Πυλάδης a bidouillé pour améliorer son interpréteur, mais en tout cas il a pourri les perf’ hmm

En parlant de mon C, en corrigeant le bug j’ai encore augmenté les perf’ (bon, pas de beaucoup mais suffisamment pour passer en dessous de 12 s).

time (echo 200 | ./cbfi $primes)
Primes up to: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 ( echo 200 | ./cbfi $prime; )  11,89s user 0,00s system 99% cpu 11,900 total

Bon sinon comme c’est un peu con de tester qu’un seul prog’, j’ai aussi benché sur les tours de Hanoï :
Πυλάδης (version 1.2, la meilleure donc) :

./bf hanoi.bf  20,54s user 0,00s system 99% cpu 20,546 total

Moi :

./cbfi $hanoi  2,18s user 0,00s system 99% cpu 2,186 total

~10 fois plus rapide ^^


Bon, comme pour mon générateur de code BF, j’ai carrément changé d’algo’ (c’est encore comme ça qu’on fait les meilleures optimisations : en trouvant un meilleur algo’). Maintenant je procède en 4 passes :
- nettoyage du code (on vire tout ce qui n’est pas du code) ;
- preprocessing (recherche/substitution de macros, bon ici je n’en fait qu’une) ;
- compilation en ILC (Intermediate Level Code), code de plus haut niveau de mon invention ;
- interprétation de l’ILC généré.
En fait, c’est un algo que j’avais commencé à mettre en œuvre dans mon implémentation Haskell.
Je ne fais que faire, à un moindre niveau, ce que fait n’importe quel interpréteur (comme Perl et sûrement Python et Ruby) : je traduit le source en représentation intermédiaire et j’interprète cette représentation.

Vu comme ça, ça semble complexe mais en fait pas tant que ça : mon interpréteur fait 290 lignes, celui de Πυλάδης 316 lignes (306 pour la version 1.2).
Mais bon, Πυλάδης gère la mémoire « infinie ».

Place au code :
cbfi.h

#ifndef H_CBFI_LS_20120105194707
#define H_CBFI_LS_20120105194707

typedef enum { ADD, MOVE, JZ, JNZ, READ, WRITE, RAZ } ILOp_type;

typedef struct
{
    ILOp_type type;
    int n;
} Add;

typedef struct
{
    ILOp_type type;
    int n;
} Move;

typedef struct
{
    ILOp_type type;
    void* addr;
} Jz;

typedef struct
{
    ILOp_type type;
    void* addr;
} Jnz;

typedef struct
{
    ILOp_type type;
} Read;

typedef struct
{
    ILOp_type type;
} Write;

typedef struct
{
    ILOp_type type;
} Raz;


typedef union
{
    ILOp_type type;
    Add add_op;
    Move move_op;
    Jz jz_op;
    Jnz jnz_op;
    Write write_op;
    Read read_op;
    Raz raz_op;
} ILOp;

size_t purify(const char* input, char* bf_code);

size_t replace_macro(char* bf_code, size_t sz);

size_t compile(const char* bf_code, ILOp* il_code);

void interpret(ILOp* code, size_t code_len);

ILOp* find_matching(ILOp* base, ILOp* current);

#endif /* H_CBFI_LS_20120105194707 */

cbfi.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "cbfi.h"

int main(int argc, char* argv[])
{
    ILOp* il_code = NULL;
    char* bf_code = NULL;
    size_t nb_op   = 0;
    size_t code_sz = 0;

    if(argc != 2)
    {
        fputs("This program takes the BF code as argument\n", stderr);
        return EXIT_FAILURE;
    }

    bf_code = malloc(strlen(argv[1]) + 1);
    if(!bf_code)
    {
        fputs("Memory allocation failure\n", stderr);
        return EXIT_FAILURE;
    }

    code_sz = purify(argv[1], bf_code);
    code_sz = replace_macro(bf_code, code_sz);

    il_code = malloc(code_sz * sizeof *il_code);
    if(!il_code)
    {
        free(bf_code);
        fputs("Memory allocation failure\n", stderr);
        return EXIT_FAILURE;
    }

    nb_op = compile(bf_code, il_code);
    if(nb_op)
        interpret(il_code, nb_op);

    free(bf_code);
    free(il_code);

    return EXIT_SUCCESS;
}

size_t purify(const char* input, char* bf_code)
{
    char* p = bf_code;

    while(*input)
    {
        if(strchr("+-<>.,[]", *input))
            *p++ = *input;
        ++input;
    }
    *p = '\0';

    return (size_t)(p - bf_code);
}

size_t replace_macro(char* bf_code, size_t sz)
{
    char* p = bf_code;

    p = strstr(p, "[-]");

    while(p)
    {
        sz -= 2;
        strncpy(p, "raz", 3);
        p += 2;
        p = strstr(p, "[-]");
    }

    return sz;
}

size_t compile(const char* bfm_code, ILOp* il_code)
{
    const char* p = bfm_code;
    ILOp* op = il_code;
    ILOp* addr = NULL;
    size_t nb_op = 0;
    int n = 0;

    while(*p)
    {
        switch(*p)
        {
            case '-':
            case '+':
                op->type = ADD;
                n = 0;
                while(*p == '+' || *p == '-')
                {
                    n = (*p == '+') ? n + 1 : n - 1;
                    ++p;
                }
                --p;
                op->add_op.n = n;
                break;
            case '<':
            case '>':
                op->type = MOVE;
                n = 0;
                while(*p == '>' || *p == '<')
                {
                    n = (*p == '>') ? n + 1 : n - 1;
                    ++p;
                }
                --p;
                op->add_op.n = n;
                break;
            case '[':
                op->type = JZ;
                op->jz_op.addr = NULL;
                break;
            case ']':
                addr = find_matching(il_code, op);
                if(!addr)
                {
                    fputs("Unmatched ]\n", stderr);
                    goto out;
                }
                op->type = JNZ;
                op->jnz_op.addr = addr;
                break;
            case '.':
                op->type = WRITE;
                break;
            case ',':
                op->type = READ;
                break;
            case 'r': /* "raz". */
                op->type = RAZ;
                p += 2; /* skip "az". */
                break;
            default:
                break;
        }
        ++op;
        ++p;
        ++nb_op;
    }

    op = il_code;
    while(op < il_code + nb_op)
    {
        if(op->type == JZ && op->jz_op.addr == NULL)
        {
            fputs("Unmatched [\n", stderr);
            goto out;
        }
        ++op;
    }

    return nb_op;
out:
    return 0;
}

void interpret(ILOp* code, size_t code_len)
{
    char mem[30000] = { 0 };
    char* dp = mem;
    ILOp* ip = code;

    for(ip = code; ip < code + code_len; ++ip)
    {
        switch(ip->type)
        {
            case ADD:
                *dp += ip->add_op.n;
                break;
            case MOVE:
                dp += ip->move_op.n;
                if(dp < mem || dp > mem + sizeof mem / sizeof mem[0])
                {
                    fputs("Segmentation fault in BF code.\n", stderr);
                    ip = ip + code_len; /* to break the loop. */
                }
                break;
            case JZ:
                ip = (*dp == 0) ? ip->jz_op.addr : ip;
                break;
            case JNZ:
                ip = (*dp != 0) ? ip->jnz_op.addr : ip;
                break;
            case READ:
                *dp = (char) getchar();
                break;
            case WRITE:
                putchar(*dp);
                break;
            case RAZ:
                *dp = 0;
                break;
        }
    }
}

ILOp* find_matching(ILOp* base, ILOp* current)
{
    ILOp* addr = current;
    int found = 0;

    --current;
    while(current >= base && !found)
    {
        if(current->type == JZ && current->jz_op.addr == NULL)
        {
            current->jz_op.addr = addr;
            addr = current;
            found = 1;
        }
        --current;
    }

    return found ? addr : NULL;
}

Hors ligne

#2110 Le 06/01/2012, à 13:39

Pylades

Re : /* Topic des codeurs [6] */

Ouais, c’est la mémoire infinie, qui est coûteuse, aussi. Et puis je n’ai pas encore fait les optimisations que j’avais en tête. tongue


Au passage, est-ce qu’un realloc qui diminue la taille de la mémoire allouée peut échouer ? Je pense que oui, mais ça m’arrangerais si ce n’était pas le cas. ^^


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#2111 Le 06/01/2012, à 15:54

grim7reaper

Re : /* Topic des codeurs [6] */

Πυλάδης a écrit :

Ouais, c’est la mémoire infinie, qui est coûteuse, aussi.

Ouais, un truc coûteux qui ne vaut pas son prix (j’ai même envie de dire inutile vu que je n’ai jamais rencontré de programme BF qui fasse un SIGSEGV avec mon implémentation). Je ne comprends vraiment pas pourquoi tu t’accroches à ça hmm

Πυλάδης a écrit :

Et puis je n’ai pas encore fait les optimisations que j’avais en tête. tongue

Quel genre d’optimisations ?

Πυλάδης a écrit :

Au passage, est-ce qu’un realloc qui diminue la taille de la mémoire allouée peut échouer ? Je pense que oui, mais ça m’arrangerais si ce n’était pas le cas. ^^

Oui, dans l’absolu ça dépend de l’implémentation de realloc. Après, je pense pas que ça soit fréquent, mais ça peut échouer.

Hors ligne

#2113 Le 06/01/2012, à 17:23

Elzen

Re : /* Topic des codeurs [6] */

ArkSeth 1 - 0 Git big_smile

J'ai eu un peu du mal avec hier, mais ce matin c'est passé nickel. Les gens de ma promo sont en train de faire des tests depuis tout-à-l'heure, et apparemment, ça tourne ^^

En fait, c'était tout simple : il suffisait que je n'suive PAS les tutos ou les explications des autres gens, mais que j'y aille à l'impro ^^

D'ailleurs, j'en ai profité pour regarder comment faire des dépôts public en http sur mon site pour diffuser Touhy et mes romans/nouvelles. Test en cours, ça a l'air tourner aussi, j'mettrai de vrais trucs en ligne d'ici pas trop longtemps (j'ferai aussi un vrai dépôt en lecture/écriture pour Arpège. D'ailleurs, les gens d'Arpège, hésitez pas à vous manifester wink)

Dernière modification par ArkSeth (Le 06/01/2012, à 17:24)

Hors ligne

#2114 Le 06/01/2012, à 18:49

Pylades

Re : /* Topic des codeurs [6] */

grim7reaper a écrit :

Ouais, un truc coûteux qui ne vaut pas son prix (j’ai même envie de dire inutile vu que je n’ai jamais rencontré de programme BF qui fasse un SIGSEGV avec mon implémentation). Je ne comprends vraiment pas pourquoi tu t’accroches à ça hmm

C’est pour le fun, pour le plaisir de faire une fonctionnalité classe.
Et pour avoir une excuse pour avoir de moins bonne perfs que toi. tongue

grim7reaper a écrit :

Quel genre d’optimisations ?

La compilation du code en un code intermédiaire plus rapide à l’exécution : je regroupe les incrémentations, les mouvements de pointeur, et effectue les remise à zéro immédiatement.

Au fait, j’ai parcouru les révisions de mon interpréteur et je n’ai pas noté de régression de performances. J’ai aussi comparé les deux tarballs que j’ai mises en ligne et c’est à peu près identique. T’es sûr de toi ?

Sinon, tu n’aurais pas de la doc qui répertorie les différents flags de warning de Clang/LLVM ? Je n’en ai pas trouvé…


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#2115 Le 06/01/2012, à 20:10

grim7reaper

Re : /* Topic des codeurs [6] */

Πυλάδης a écrit :
grim7reaper a écrit :

Quel genre d’optimisations ?

La compilation du code en un code intermédiaire plus rapide à l’exécution : je regroupe les incrémentations, les mouvements de pointeur, et effectue les remise à zéro immédiatement.

Mon code quoi tongue

Πυλάδης a écrit :

Au fait, j’ai parcouru les révisions de mon interpréteur et je n’ai pas noté de régression de performances. J’ai aussi comparé les deux tarballs que j’ai mises en ligne et c’est à peu près identique. T’es sûr de toi ?

Certain.

grim7reaper@smile brainfuck_interpreter]$wget http://pyl.alwaysdata.net/brainfuck/bf-last.tar.gz
--2012-01-06 20:02:41--  http://pyl.alwaysdata.net/brainfuck/bf-last.tar.gz
Résolution de pyl.alwaysdata.net... 178.32.28.117
Connexion vers pyl.alwaysdata.net|178.32.28.117|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 14186 (14K) [application/x-tar]
Sauvegarde en : «bf-last.tar.gz»

100%[======================================================================================================================================================>] 14 186      --.-K/s   ds 0,03s   

2012-01-06 20:02:41 (503 KB/s) - «bf-last.tar.gz» sauvegardé [14186/14186]

grim7reaper@smile brainfuck_interpreter]$wget http://pyl.alwaysdata.net/brainfuck/bf-1.2.tar.gz 
--2012-01-06 20:03:00--  http://pyl.alwaysdata.net/brainfuck/bf-1.2.tar.gz
Résolution de pyl.alwaysdata.net... 178.32.28.117
Connexion vers pyl.alwaysdata.net|178.32.28.117|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 13984 (14K) [application/x-tar]
Sauvegarde en : «bf-1.2.tar.gz»

100%[======================================================================================================================================================>] 13 984      --.-K/s   ds 0,06s   

2012-01-06 20:03:01 (230 KB/s) - «bf-1.2.tar.gz» sauvegardé [13984/13984]

grim7reaper@smile brainfuck_interpreter]$./bf-1.2.tar.gz 
bf-1.2/
bf-1.2/99bf.bf
bf-1.2/bf.c
bf-1.2/hanoi.bf
bf-1.2/life.bf
bf-1.2/bf.h
bf-1.2/Makefile
bf-1.2/primes.bf
bf-1.2/config.mk
bf-1.2/Doxyfile
bf-1.2/COPYING
grim7reaper@smile brainfuck_interpreter]$./bf-last.tar.gz 
bf-1.2.1/
bf-1.2.1/99bf.bf
bf-1.2.1/bf.c
bf-1.2.1/hanoi.bf
bf-1.2.1/life.bf
bf-1.2.1/bf.h
bf-1.2.1/Makefile
bf-1.2.1/primes.bf
bf-1.2.1/config.mk
bf-1.2.1/Doxyfile
bf-1.2.1/COPYING
grim7reaper@smile brainfuck_interpreter]$bf-1.2 
grim7reaper@smile bf-1.2]$make
cc -O2 -std=c90 -pedantic -Wall -Wextra -Winit-self -Wfloat-equal -Wstrict-prototypes -Wold-style-definition -Wredundant-decls -Wwrite-strings -Wcast-qual -Wconversion -Wformat=2   -c -o bf.o bf.c
bf.c: In function ‘main’:
bf.c:103:9: attention : ‘match’ may be used uninitialized in this function [-Wuninitialized]
cc -s   bf.o   -o bf
grim7reaper@smile bf-1.2]$time (echo 200 | ./bf primes.bf)                                       
Primes up to: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 
( echo 200 | ./bf primes.bf; )  18,07s user 0,00s system 99% cpu 18,080 total
grim7reaper@smile bf-1.2]$../bf-1.2.1 
grim7reaper@smile bf-1.2.1]$make                            
cc -std=c90 -pedantic -Wall -Wextra -Winit-self -Wfloat-equal -Wstrict-prototypes -Wold-style-definition -Wredundant-decls -Wwrite-strings -Wcast-qual -Wconversion -Wbad-function-cast -Wformat=2 -march=native -O2   -c -o bf.o bf.c
bf.c: In function ‘main’:
bf.c:105:9: attention : ‘match’ may be used uninitialized in this function [-Wuninitialized]
cc  -s  bf.o   -o bf
grim7reaper@smile bf-1.2.1]$time (echo 200 | ./bf primes.bf)
Primes up to: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 
( echo 200 | ./bf primes.bf; )  28,50s user 0,00s system 99% cpu 28,512 total
grim7reaper@smile bf-1.2.1]$

18,080 s pour la 1.2
28,512 s pour la 1.2.1

Πυλάδης a écrit :

Sinon, tu n’aurais pas de la doc qui répertorie les différents flags de warning de Clang/LLVM ? Je n’en ai pas trouvé…

Non je n’en ai pas, faudrait que je cherche. J’ai juste copier-coller ma ligne de gcc et viré les deux warnings qui étaient incompatible avec clang.

Hors ligne

#2116 Le 06/01/2012, à 21:38

Pylades

Re : /* Topic des codeurs [6] */

Bon, on a un problème, alors :

paul@PC-PAUL – 21:29:36
 ~$ mkdir bftests
paul@PC-PAUL – 21:29:45
 ~$ cd bftests/
paul@PC-PAUL – 21:29:50
 ~/bftests$ wget http://typocondriaque.fr/brainfuck/bf-1.2.tar.gz
--2012-01-06 21:30:35--  http://typocondriaque.fr/brainfuck/bf-1.2.tar.gz
Résolution de typocondriaque.fr... 178.32.28.117
Connexion vers typocondriaque.fr|178.32.28.117|:80... connecté.
requête HTTP transmise, en attente de la réponse... 200 OK
Longueur: 13984 (14K) [application/x-tar]
Sauvegarde en : «bf-1.2.tar.gz»

100%[======================================>] 13 984      --.-K/s   ds 0,04s   

2012-01-06 21:30:49 (344 KB/s) - «bf-1.2.tar.gz» sauvegardé [13984/13984]

paul@PC-PAUL – 21:30:49
 ~/bftests$ wget http://typocondriaque.fr/brainfuck/bf-1.2.1.tar.gz
--2012-01-06 21:30:59--  http://typocondriaque.fr/brainfuck/bf-1.2.1.tar.gz
Résolution de typocondriaque.fr... 178.32.28.117
Connexion vers typocondriaque.fr|178.32.28.117|:80... connecté.
requête HTTP transmise, en attente de la réponse... 200 OK
Longueur: 14186 (14K) [application/x-tar]
Sauvegarde en : «bf-1.2.1.tar.gz»

100%[======================================>] 14 186      --.-K/s   ds 0,04s   

2012-01-06 21:31:09 (347 KB/s) - «bf-1.2.1.tar.gz» sauvegardé [14186/14186]

paul@PC-PAUL – 21:31:09
 ~/bftests$ tar xvzf bf-1.2.tar.gz 
bf-1.2/
bf-1.2/99bf.bf
bf-1.2/bf.c
bf-1.2/hanoi.bf
bf-1.2/life.bf
bf-1.2/bf.h
bf-1.2/Makefile
bf-1.2/primes.bf
bf-1.2/config.mk
bf-1.2/Doxyfile
bf-1.2/COPYING
paul@PC-PAUL – 21:31:23
 ~/bftests$ tar xvzf bf-1.2.1.tar.gz 
bf-1.2.1/
bf-1.2.1/99bf.bf
bf-1.2.1/bf.c
bf-1.2.1/hanoi.bf
bf-1.2.1/life.bf
bf-1.2.1/bf.h
bf-1.2.1/Makefile
bf-1.2.1/primes.bf
bf-1.2.1/config.mk
bf-1.2.1/Doxyfile
bf-1.2.1/COPYING
paul@PC-PAUL – 21:31:29
 ~/bftests$ cd bf-1.2/
paul@PC-PAUL – 21:31:36
 ~/bftests/bf-1.2$ make
clang -O2 -std=c90 -pedantic -Wall -Wextra -Winit-self -Wfloat-equal -Wstrict-prototypes -Wold-style-definition -Wredundant-decls -Wwrite-strings -Wcast-qual -Wconversion -Wformat=2   -c -o bf.o bf.c
clang -s   bf.o   -o bf
paul@PC-PAUL – 21:32:56
 ~/bftests/bf-1.2$ time (./primes.bf <<< 150)
Primes up to: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 

real    0m14.454s
user    0m14.433s
sys    0m0.008s
paul@PC-PAUL – 21:33:20
 ~/bftests/bf-1.2$ time (./primes.bf <<< 150)
Primes up to: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 

real    0m14.575s
user    0m14.469s
sys    0m0.012s
paul@PC-PAUL – 21:33:43
 ~/bftests/bf-1.2$ cd ../bf-1.2.1/
paul@PC-PAUL – 21:33:53
 ~/bftests/bf-1.2.1$ make
clang -std=c90 -pedantic -Wall -Wextra -Winit-self -Wfloat-equal -Wstrict-prototypes -Wold-style-definition -Wredundant-decls -Wwrite-strings -Wcast-qual -Wconversion -Wbad-function-cast -Wformat=2 -march=native -O2   -c -o bf.o bf.c
clang  -s  bf.o   -o bf
paul@PC-PAUL – 21:33:55
 ~/bftests/bf-1.2.1$ time (./primes.bf <<< 150)
Primes up to: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 

real    0m14.444s
user    0m14.425s
sys    0m0.008s
paul@PC-PAUL – 21:34:21
 ~/bftests/bf-1.2.1$ time (./primes.bf <<< 150)
Primes up to: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 

real    0m14.575s
user    0m14.453s
sys    0m0.028s
paul@PC-PAUL – 21:34:38
 ~/bftests/bf-1.2.1$ 

“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#2117 Le 06/01/2012, à 21:57

grim7reaper

Re : /* Topic des codeurs [6] */

En effet…
Je ne sais pas ce que tu as modifié mais ça n’a pas l’air de plaire à mon archi’ et/ou à ma version de GCC

Hors ligne

#2118 Le 06/01/2012, à 23:04

grim7reaper

Re : /* Topic des codeurs [6] */

Hé ! Je viens de trouver un Ouroboros encore meilleur que celui d’Endoh Yusuke (11 langages), celui de Kirill A. Korinskiy (13 langages, ajout du Bash et d’Erlang) :

# ruby
l=92.chr;eval s="s=s.dump[r=1..-2].gsub(/("+l*4+"){4,}(?!\")/){|t|'\"+l*%d+\"'%(t.size/2)};6.times{s=s.dump[r]};puts\"# python\\nprint(\\\"% erlng\\\\n-export([main/1]).\\\\nmain(_) ->\\\\n\\\\tio:format(\\\\\\\"# perl"+l*4+"nprint("+l*7+"\"# lua"+l*8+"nprint("+l*15+"\"(* ocaml *)"+l*16+"nprint_endline"+l*31+"\"-- haskell"+l*32+"nimport Data.List;import Data.Bits;import Data.Char;main=putStrLn("+l*63+"\"/* C */"+l*64+"n#include<stdio.h>"+l*64+"nint main(void){char*s[501]={"+l*63+"\"++intercalate"+l*63+"\","+l*63+"\"(c(tail(init(show("+l*63+"\"/* Java */"+l*64+"npublic class QR{public static void main(String[]a){String[]s={"+l*63+"\"++intercalate"+l*63+"\","+l*63+"\"(c("+l*63+"\"brainfuck"+l*128+"n++++++++[>++[>++>+++>++++++>+++++++<<<<-]<-]>>+++.>>++.-.>+++.<+++++++.<<<++++++++++.>>>---.--.+++++.>----.<<<---.>---.>>-.<<<.>------.>>>++++++++[>++++<-]+++++++++>>++++++++++"+l*63+"\"++(concat(snd(mapAccumL h 2("+l*63+"\"110"+l*63+"\"++g(length s)++"+l*63+"\"22111211100111112021111102011112120012"+l*63+"\"++concatMap("+l*64+"c->let d=ord c in if d<11then"+l*63+"\"21002"+l*63+"\"else"+l*63+"\"111"+l*63+"\"++g d++"+l*63+"\"22102"+l*63+"\")s++"+l*63+"\"21002111010120211222211211101000120211021120221102111000110120211202"+l*63+"\"))))++"+l*63+"\"<<<<<."+l*63+"\"))++"+l*63+"\","+l*127+"\""+l*128+"n"+l*127+"\"};int i=0;for(;i<s.length;i++)System.out.print(s[i]);}}"+l*63+"\")))))++"+l*63+"\",0};int i=0;for(;s[i];i++)printf("+l*127+"\"%s"+l*127+"\",s[i]);puts("+l*127+"\""+l*127+"\");return 0;}"+l*63+"\");c s=map("+l*64+"s->"+l*63+"\""+l*127+"\""+l*63+"\"++s++"+l*63+"\""+l*127+"\""+l*63+"\")(unfoldr t s);t[]=Nothing;t s=Just(splitAt(if length s>w&&s!!w=='"+l*63+"\"'then 501else w)s);w=500;f 0=Nothing;f x=Just((if x"+l*16+"`mod"+l*16+"`2>0then '0'else '1'),x"+l*16+"`div"+l*16+"`2);g x= reverse (unfoldr f x);h p c=let d=ord c-48in(d,replicate(abs(p-d))(if d< p then '<'else '>')++"+l*63+"\"."+l*63+"\");s="+l*63+"\"# ruby"+l*64+"n"+l*63+"\"++"+l*63+"\"l=92.chr;eval s=\"+(z=l*63)+\"\\\"\"+s+z+\"\\\""+l*63+"\"++"+l*63+"\""+l*64+"n"+l*63+"\""+l*31+"\""+l*15+"\")"+l*8+"n"+l*7+"\")\\\\\\\",[]).\\\")\"# (c) Kirill A. Korinskiy, 2009, based on Yusuke Endoh #\n"

Oui, c’est bien du Ruby ^^

Procédure :

ruby QuineRelay.rb > QuineRelay.py
python QuineRelay.py > QuineRelay.erl
escript QuineRelay.erl > QuineRelay.pl
perl QuineRelay.pl > QuineRelay.lua
lua QuineRelay.lua > QuineRelay.ml
ocaml QuineRelay.ml > QuineRelay.hs
runghc QuineRelay.hs > QuineRelay.c
gcc -Wall -o QuineRelay QuineRelay.c && ./QuineRelay > QuineRelay.java
javac QuineRelay.java && java QuineRelay > QuineRelay.bf
beef QuineRelay.bf > QuineRelay.sh
sh QuineRelay.sh > QuineRelay.ws
wspace QuineRelay.ws > QuineRelay.unl
unlambda QuineRelay.unl > QuineRelay2.rb
diff QuineRelay.rb QuineRelay2.rb

Source.

Hors ligne

#2119 Le 06/01/2012, à 23:31

Pylades

Re : /* Topic des codeurs [6] */

Wow !
Impressionnant…

C’est le post de nesthib sur le TdCT qui t’a fait tomber dessus ?

Ah bah voui, je viens de voir que c’est dans les notes de l’article lié par nesthib. tongue

Dernière modification par Πυλάδης (Le 06/01/2012, à 23:46)


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#2120 Le 06/01/2012, à 23:48

grim7reaper

Re : /* Topic des codeurs [6] */

Nope, pure coïncidence.
Je suis retombé sur ces histoire de quine et d’Ouroboros au gré de mes recherches sur Internet.

Πυλάδης a écrit :

Ah bah voui, je viens de voir que c’est dans les notes de l’article lié par nesthib. tongue

Non, je connaissais bien avant. J’en avais d’ailleurs déjà parlé ici.

Dernière modification par grim7reaper (Le 06/01/2012, à 23:50)

Hors ligne

#2121 Le 06/01/2012, à 23:59

Pylades

Re : /* Topic des codeurs [6] */

Pas faux. Bon, à ma décharge, ils se ressemblent beaucoup. tongue


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#2122 Le 07/01/2012, à 00:09

nesthib

Re : /* Topic des codeurs [6] */

smile


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#2123 Le 07/01/2012, à 02:06

tshirtman

Re : /* Topic des codeurs [6] */

https://github.com/tshirtman/.vim/commi … 9d3#L0R106

bon, je me suis enfin motivé a trouver une solution pour un problème con dans vim, quand il charge un fichier et qu'il y a un fichier swp plus vieux que la dernière sauvegarde, il demande quoi faire, pour moi, c'est toujours "delete" donc je lui dis de delete automatiquement dans ce cas là. ça fait moins de choses à répondre, et donc moins de conneries potentielles…

Hors ligne

#2124 Le 07/01/2012, à 14:59

HP

Re : /* Topic des codeurs [6] */

require 'spec_helper'

describe HomeController, :type => :controller do
  subject { controller }
  before(:each) { get :index }

  it { root_path == '/' }
  it { response.should redirect_to(root_path) }
  it { assert_redirected_to root_path { should respond_with(:success) } }
end

# basically testing Sitealizer (reset then 3 iterations)
describe HomeController, :type => :controller do
  subject { controller }
  before(:all) { Sitealizer::visits = nil }
  before(:each) { get :index }

  it { (Sitealizer::visits.class == Array).should == true }
  3.times {|i| it { (Sitealizer::visits.size).should == i + 2 } }
end

Quelques tests unitaires (Ruby on Rails 3)…

Dernière modification par HP (Le 07/01/2012, à 15:05)


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#2125 Le 07/01/2012, à 17:50

Rolinh

Re : /* Topic des codeurs [6] */

Pour les archers du coin wink
http://repo.rolinh.ch/

Je l'ai surtout mis en place pour les packages i686 parce que compiler avec le netbook c'est un peu pénible... Donc maintenant que j'ai vu que ça marchait bien, je vais voir pour cross-compiler et ajouter quelques paquets 32bits.

Si l'un de vous désire un paquet ici qui ne soit pas dans un autre dépôt, il faut juste me demander.

Hors ligne