Προς το περιεχόμενο

_Gikoskos_

Members
  • ΜΗΝΥΜΑΤΑ FORUM

    54
  • ΜΕΛΟΣ

  • ΤΕΛ. ΕΠΙΣΚΕΨΗ

Οτιδήποτε δημοσιεύεται από _Gikoskos_

  1. Τι είδους εφαρμογή θες να φτιάξεις; Αν πρόκειται για single page app που πχ μπορεί να έχει κομμάτια μέσα στην σελίδα τα οποία ανανεώνονται δυναμικά (websockets, fetch, components κτλ), μπορεί να βοηθηθείς από την επίδοση της react. Προσωπικά έχω βρει πως η react βοηθάει πάρα πολύ στον γρήγορο σχεδιασμό δυναμικών site που έχουν αρκετό όγκο περιεχομένου (πχ news site). Σε πιο απλά site όμως (πχ προσωπικό blog), ακόμα και δυναμικά να είναι, μπορεί να φας χτύπημα απο το overhead της βιβλιοθήκης.
  2. Υλοποίηση δυαδικού σηματοφόρου μόνο με mutex, αναγκαστικά θα είναι με ενεργή αναμονή. Θα χρησιμοποιηθεί μόνο ένα mutex για τον αμοιβαίο αποκλεισμό του μετρητή. Άρα εδώ φαίνεται ότι έχεις λάθος στην υλοποίηση. Δεν χρειάζεσαι ούτε 2 mutex ούτε trylock. Χονδρικά ο ψευδοκώδικας για τα up/down πρέπει να είναι έτσι: struct binsem { int cnt; mutex mtx; }; down(binsem *bsem){ while (1) { lock(bsem->mtx); if (bsem->cnt > 0) { bsem->cnt--; unlock(bsem->mtx); break; } unlock(bsem->mtx); } } up(binsem *bsem){ lock(bsem->mtx); if (bsem->cnt <= 0) { bsem->cnt++; } unlock(bsem->mtx); }
  3. Κοιταξα λιγο το τουτοριαλ να δω τι εστι αλλα και αυτος το ιδιο λεει εδω Περα απο αυτο το resource script σου δεν γινεται compile πουθενα. Να ξυσει τις μασχαλες του ο λινκερ για να το βρει; Τρεξε κατι τετοιο windres resource.rc resource.o gcc menu_one.c resource.o -o menu_one.exe -mwindows αλλα βλεπεις πως αν τα resources γινουν αρκετα, λογω πολυπλοκοτητας δεν συμφερει να το κανεις χειροκινητα. Καλυτερα Makefile απο τωρα (αφου χρησιμοποιεις GCC toolchain) για να το συνηθισεις. Εξαλλου και το βιζουαλ στουδιο εχει δικα του Makefiles βασισμενα στο GNU Μake, απλα ειναι πιο περιορισμενα σε λειτουργικοτητα. στο γιτχαμπ εχω αρκετα winAPI προτζεκτς που εχω στησει με αυτο το toolchain
  4. Δεν εχω χρησιμοποιησει tdm-gcc αλλα για να κανεις compile resource αρχεια (.rc) πρεπει να ειναι παρον ενας resource compiler. Στο mingw-w64 που εχω χρησιμοποιησει πχ υπαρχει το windres (το visual studio αντιστοιχα εχει το RC). Οταν περασεις το .rc απο το windres και σου παραγει ενα αντικειμενικο αρχειο (.ο), το κανεις διασυνδεση με τον υπολοιπο σου κωδικα C/C++ κανονικα με τον gcc. Με αλλα λογια δειξε το Makefile/τις εντολες που χρησιμοποιεις για να κανεις compile το προγραμμα, για να δω τι παιζει wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON)); κατι ακυρο αλλα τα GetModuleHandle(NULL) calls μεσα στην main() ειναι περιττα γτ σου επιστρεφουν στην ουσια το hInstance που το εχεις ηδη ορισμενο wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));
  5. Απ'οτι φαινεται γινεται https://github.com/kristian/system-hook αλλα απαιτει γνωσεις JNI που σημαινει πως παλι πρεπει να γραψεις low-level κωδικα για καθε διαφορετικο λειτουργικο (δηλαδη ο keylogger θα ειναι γραμμενος σε C ή C++) και φανταζομαι πως ετσι χανεται και το κυριο feature της Java που ειναι να εκτελειται σε καθε λειτουργικο συστημα (δεδομενου οτι εχεις εγκατεστημενο το JVM). Σε C/C++ ειναι ευκολο να γραψεις keylogger για Windows, καθως το WinAPI παρεχει ενσωματωμενη ηδη τετοια λειτουργια που σου δινει τη δυνατοτητα να εχεις λειτουργικο keylogger με λιγες γραμμες κωδικα με lowlevel keyboard hook. Σε linux υποθετω πως μπορεις να σκαρφιστεις κατι μεσω του X server/client, αλλα δεν ειμαι σιγουρος για το ποσο λειτουργικο ή ευκολο ειναι να υλοποιησεις ολοκληρωμενο keylogger.
  6. _Gikoskos_

    c pointers

    Είναι κάπως επικίνδυνο να συγκρίνεις δείκτες και πίνακες. Σε πολλές περιπτώσεις ο πίνακας θυμίζει δείκτη (array indexing), και σε κάποιες μετατρέπεται σε δείκτη (όταν περνάει σαν παράμετρος πχ) αλλά είναι διαφορετικοί τύποι δεδομένων, και σημαίνουν διαφορετικά πράματα. Ο δείκτης περιέχει την τιμή μιας θέσης μνήμης, και ο πίνακας είναι απλά μία σειρά από αντικείμενα (στην C ο όρος αντικείμενο δεν έχει την ίδια σημασία με μία OOP γλώσσα). Στην περίπτωσή σου, αν γράψεις κάτι τέτοιο για παράδειγμα: int (*p)[5]; int **z; ..... z = p; ή p = z; δεν θα δουλέψει, γιατί το **z και το (*p)[5] είναι διαφορετικοί τύποι δεδομένων. Όπως επίσης και το "int array[5];" μαζί με το "int *ptr;" είναι διαφορετικοί τύποι δεδομένων. Στο c-faq έχει ολόκληρη κατηγορία μόνο για αυτές τις "παρεξηγήσεις" μεταξύ πινάκων και δεικτών http://c-faq.com/.xx/aryptr/ αξίζει να το ρίξετε μια ματιά.
  7. Αν θες να προσπερασεις τον ελεγχο του UAC για το προγραμμα σου, υπαρχει λυση προγραμματιστικα γιατι οι περισσοτερες εκδοσεις των Windows εχουν ενα πολυ γνωστο backdoor πανω σε αυτο το πραμα. Δες εδω περισσοτερες λεπτομερειες https://github.com/hfiref0x/UACME. Υπαρχουν και εργαλεια που χρησιμοποιουν κωδικα απο το παραπανω, για να σε βοηθησουν να επιλεξεις συγκεκριμενες εφαρμογες στις οποιες θελεις να μην δουλευει το UAC, αλλα δεν μπορεσα να βρω κανενα open-source. Γνωμη μου ειναι, αν δεν βρεις κατι που να ειναι open-source, να μην δοκιμασεις να τρεξεις αλλα εργαλεια που υποστηριζουν οτι κανουν αυτο το πραμα. Περα απ'αυτο, ο πιο στανταρ τροπος για να κανεις το προγραμμα να τρεχει στο startup ειναι να βαλεις entry του path του εκτελεσιμου σου, στο κλειδι "Software\Microsoft\Windows\CurrentVersion\Run" στην registry, για τον συγκεκριμενο χρηστη. Αυτο μπορεις να το κανεις ειτε χειροκινητα, ειτε προγραμματιστικα. Αν το κανεις προγραμματιστικα, δες εδω που εχω γραψει ενα μικρο function γι'αυτο ακριβως το πραμα.
  8. Dr. Memory υποχρεωτικό αν προγραμματίζεις C/C++ σε Windows (υπαρχει και για linux, αλλα εκει ειναι καλυτερο συνδυασμός valgrind + strace κατα την γνωμη μου). Κανει memory checking, και αν εχεις κανει compile με debugging συμβολα παιρνεις και γραμμες κωδικα στις οποιες εντοπιστηκε το σφαλμα. Text mode interface for Git ενα πολυ χρησιμο front-end για το Git στην γραμμη εντολων (χρησιμοποιει ncurses). Ενας ενδιαφερον οδηγος στα C++ templates Γρήγορος αλγοριθμος hashing (μη κρυπτογραφικος) με πολυ καλο ευρος (τον εχω δοκιμασει εκτενως), σε περιπτωση που θελετε να κανετε δικα σας hashtables καπου libuv Ασύγχρονο Ι/Ο με πολλα καλουδια Ενα τελευταιο απο τα αγαπημενα μου, το οποιο μπορει να μην ειναι και τοσο χρησιμο πλεον, αλλα εχει ιστορικη σημασια: Unix history repo Συντηρείται απο τον καθηγητη Διομήδη Σπινέλλη, ο οποιος εχει και αλλα ενδιαφεροντα προτζεκτς στο github του, αν θελει κανεις να κοιταξει.
  9. _Gikoskos_

    Libraries search engine

    Ωραίο αλλα δεν εχει τη δικη μου βιβλιοθηκη :'(
  10. Εχεις απολυτο δικιο, με συγχωρεις, το εγραψα πολυ βιαστικα γτ ειχα διαλεξη. Τα διορθωσα και τα δυο στο original post.
  11. Ετσι ειναι το jump table σε assembly https://godbolt.org/g/JPpnCI Η αντιστοιχη εκδοχη του ημιθεου μαζι με checks (γιατι στην ουσια το switch/case θα μετρησει ολες τις περιπτωσεις, ενω ετσι οπως το εγραψε ο ημιθεος δεν υπολογιζονται ολες οι περιπτωσεις, αρα οι κωδικες που συγκρινες ειναι εντελως διαφορετικοι) θα γινει ετσι https://godbolt.org/g/t6TJFn Γενικα για να πιεσεις τον compiler να κανει fully optimized jump tables, θα πρεπει να γραψεις τις συναρτησεις οπως το εγραψα παραπανω. O optimizer του compiler μια χαρα μπορει να καταλαβει το switch/case και να το μετατρεψει σε jump table. Αν δεις και στο αρχικο μου ποστ τι εγραψα: Αυτο που υλοποιησε ο hmitheos ειναι καθαρα jump table στην C. Οχι σε assembly. Αυτο ειναι optimization μονο σε higher level C και οχι σε assembly. Τα optimizations που κανουμε σε υψηλο επιπεδο, δεν σημαινει πως μεταφραζονται παντα σε optimizations στο χαμηλο. Πολλες φορες ο προγραμματιστης δεν μπορει να καταλαβει πως ακριβως λειτουργει η μηχανη. Τωρα το πιο optimization ειναι πιο γρηγορο ή οχι, ειναι αντικειμενο ακαδημαϊκης μελετης. Κατα την γνωμη μου, και τα δυο ειναι εξισου σωστα. Καποιος μπορει να πει πως το switch/case ειναι πιο ευαναγνωστο και καποιος αλλος μπορει να πει πως το C jump table ειναι πιο γρηγορο να το γραψεις (και επισης το τελικο εκτελεσιμο εχει μονο ενα call instruction, και ως συνεπεια ειναι λιγοτερα bytes απο το switch/case). Εδιτ: ειχα λαθος στους προηγουμενους κωδικες που ποσταρα. Thanks στον defacer που το παρατηρησε
  12. Εχεις δικιο σε αυτο, ειναι καπως αργο το payoff της C. Κατι που σιγουρα θα βοηθησει αρκετα (γενικα βοηθαει αν θες να μαθεις οποιαδηποτε γλωσσα, οχι μονο την C) ειναι να θεσεις εναν συγκεκριμενο στοχο. Μια εφαρμογη που θελεις να φτιαξεις με την γλωσσα, κατι που θες να δημιουργησεις απο το 0 τελος παντων. Δεν χρειαζεται να ειναι κατι περιπλοκο για αρχη. Θα μπορουσε να ειναι sudoku solver, AI για τριλιζα, command line σκακι, chatting μεταξυ δυο διαφορετικων διεργασιων, φιδακι, διερμηνεας (το αγαπημενο μου, προσωπικα), απλος text editor για το command line, pong, tetris κτλ κτλ Γενικα αν εχεις κατι που χρειαζεσαι εσυ να φτιαξεις, κατι που δεν σε αφηνει να κοιμασαι τα βραδια, κατι που θες να κατσεις και να γραψεις για να το βγαλεις απο μεσα σου. Αυτο ειχε βοηθησει τουλαχιστον εμενα οταν τα μαθαινα, αλλα ειμαι σιγουρος πως η ιδια λογικη θα βοηθησει και πολλους αλλους. Το οτι θα εβλεπα εδω jump tables στην C, ποτε δεν θα το περιμενα μπραβο σου Καποιες παρατηρησεις και απο την δικη μου εμπειρια. Αρχικα, κατα πασα πιθανοτητα ο compiler θα μετατρεψει ακομα και το switch/case στον παραπανω κωδικα σε jump table (απο -O2 και πανω συνηθως αλλα αυτο ειναι αναλογως του compiler), δηλαδη δεν χρειαζεται να κατσεις να κανεις hardcode το jump table σου (premature optimization is the root of all evil κτλ κτλ). Επισης δεν ειναι απαραιτητο να εχεις ελεγχους για να μην ξεπερασεις το μεγεθος του πινακα σε περιπτωση που ο χρηστης δωσει κακο input (αγνοωντας τους ελεγχους της scanf εννοειται). Απλα μπορεις να γραψεις αυτο: fpt[(t - 1)%6](w); και ετσι, καθε input που δινει ο χρηστης ειναι εγκυρο. Αν το t ειναι προσημασμενος ακεραιος βεβαια θα πρεπει να λαβεις υποψη και περιπτωσεις οπου το t ειναι αρνητικος. Κατι τετοιο, πιστευω, μπορει να τις πιασει ολες: fpt[( ( (t - 1)%6 ) + 6 ) % 6](w); (σημειωση πως αν θες πχ το index [-3] να σε παει στην θεση [3], τοτε αν δινει εισοδους ο χρηστης απο 1 εως 6 δεν γινεται αυτο με τον παραπανω κωδικα. Θα πρεπει να ειναι ετσι δηλαδη fpt[( ( t % 6 ) + 6 ) % 6](w); οπου το t ειναι απο -5 εως 5, και οποιαδηποτε αλλη τιμη απλα σε βγαζει στην θεση που ειναι t modulo 6) Αυτο βεβαια ειναι αν θες να εκτελεις μια function απο το jump table σου, ειτε δωσει σωστο input ο χρηστης ειτε οχι. Αν θες να μην εκτελεις κανενα function σε περιπτωση bad input μαλλον δεν το γλιτωνεις το if/else (μπορει να γινεται και αν εχεις ενα stub function μεσα στον πινακα, που δεν κανει απολυτως τιποτα και απλα το καλεις οταν δεν θες να γινει κατι, αλλα δεν το εχω πολυσκεφτει)
  13. Μιλάς πολύ αφηρημένα και χωρίς κώδικα είναι πολύ δύσκολο να βγάλω νόημα από αυτά που λες. Ωστόσο κάποια πράματα. Αρχικά, το bubblesort δεν είναι καθόλου καλή επιλογή σαν αλγόριθμος για να το χρησιμοποιήσεις οπουδήποτε. Η μόνη του χρήση είναι στα σχολεία ώστε να καταλαβαίνουν τα παιδιά το πρόβλημα της ταξινόμησης, και στην αλγοριθμική ανάλυση ως παράδειγμα χείριστης περίπτωσης αλγορίθμου ταξινόμησης (μην πει κανείς για bogosort). Αν θες να κάνεις sort λίστα με strings, κατά την γνώμη μου ένας πολύ δυνατός αλγόριθμος είναι το radix sort καθώς έχει σχεδιαστεί για να κάνει sorting ακριβώς τέτοιου τύπου δεδομένα (έχει δύο εκδοχές, την LSD και MSD, αλλά και οι δύο παράγουν το ίδιο αποτέλεσμα στο τέλος). Επίσης εδώ ελπίζω να κάνεις πλάκα γιατί το A&&B με το B&&A (και το C&&D με το D&&C) είναι το ίδιο πράμα.
  14. Σε Windows και σε Linux δοκιμασμενο με GCC βγάζει 3 bytes (7 + 7 + 7 + 1 + 2 για το padding). Εννοειται πως τετοιος κωδικας ειναι φαρσα και δεν εχει κανενα απολυτως νοημα να υπαρχει, απλα ηθελα να δειξω οτι γινεται. Συνηθως ειναι πιο αργη η αναγνωση θεσεων μνημης που δεν εχουν υποστει το καταλληλο alignment, οπως το κανει αυτοματα ο compiler.
  15. MFW #include <stdio.h> struct __attribute__((packed)) __attribute__((gcc_struct)) financial_data_type { unsigned char a : 7; unsigned char b : 7; unsigned char c : 7; unsigned char nul : 1; }; int main(void) { struct financial_data_type economy = {.a = 'o', .b = 'n', .c = 'e', .nul = '\0'}; char str[4]; printf("%u\n", sizeof economy); str[0] = (char)economy.a; str[1] = (char)economy.b; str[2] = (char)economy.c; str[3] = (char)economy.nul; printf("%s\n", str); return 0; } (gcc only) χαχαχ μ' αρεσε αυτο. Petition να αλλαξεις το user σου απο imitheos σε theos
  16. Τα γνωστα Linux terminal emulators υποστηριζουν απο προεπιλογη UTF-8 encoding σε ο,τι ειδους κειμενο δεχονται, και επισης εχουν και καταλληλο φοντο. Δηλαδη χωρις να πειραξεις τιποτα, το παραπανω προγραμμα θα εμφανιζεται κανονικα στα περισσοτερα τερματικα. Η διαφορα με το cmd.exe ειναι πως το cmd.exe απο προεπιλογη υποστηριζει ενα αλλο encoding, και το φοντο που εχει προεγκατεστημενο δεν υποστηριζει χαρακτηρες Unicode.
  17. Σε Windows ο μονος τροπος να παρεις ελληνικα στην κονσολα ειναι αν αλλαξεις το φοντο της κονσολας (υπαρχει μια διαδικασια αν το κανεις google) ή αν χρησιμοποιησεις εναλακτικο console emulator σαν το Cmder το οποιο βασιζεται στο ConEmu. Ειλικρινα αν προγραμματιζεις σε Windows και χρησιμοποιεις πολυ την κονσολα, τοτε το cmd.exe δεν θα σου ειναι και πολυ χρησιμο. Το Cmder προσφερει υποστηριξη Unicode για καθε ειδους εφαρμογη. Οταν το κατεβασεις, γραψε ενα δοκιμαστικο προγραμμα #include <stdio.h> int main(void) { printf("Γεια σου κόσμε\n"); return 0; } Εννοειται πως δεν χρειαζεται να γραφεις καθε χαρακτηρα σε δεκαξαδικη μορφη. Ολες οι συμβολοσειρες ειναι σειρες απο bytes, ανεξαρτητα σε ποιο encoding scheme ανηκουν. Μπορει να κανει και καποια μετατροπη ο compiler αλλα εσυ δεν χρειαζεται να κανεις τιποτα εξτρα, απο το παραπανω. Απλα μην ξεχασεις να το αποθηκευσεις σε UTF-8 encoding. Ανοιξε τον Cmder, καντο compile, τρεξε chcp 65001 (για να αλλαξεις το codepage σε UTF-8) και τρεξε το προγραμμα σου. Απο εκει και περα η κονσολα θα εφαρμοσει τα απαραιτητα encodings, για εσενα, σε οτι κειμενα της λες να εκτυπωσει.
  18. Οταν γραφεις τον χαρακτηρα 'A' στην C εννοεις τον αριθμο της θεσης του στον πινακα ascii. Έτσι η παρακατω προταση int c = 'A'; ισοδυναμεί με αυτήν int c = 65; Αν εκτυπωσεις το c ετσι printf("c = %d\n", c); θα παρεις πισω την ακεραια τιμη του, αλλα αν το εκτυπωσεις ετσι printf("c = %c\n", (char)c); θα παρεις την ερμηνεια αυτης της τιμης, ως χαρακτηρα ASCII. Δηλαδη θα μπορουσες να εκτυπωσεις ολους τους χαρακτηρες ascii κανοντας κατι τετοιο char i; for (i = 0; i < 128; i++) putchar(i); αλλα και κατι τετοιο int i; for (i = 0; i < 128; i++) putchar(i); Ελπιζω αυτο να σε βοηθησε να καταλαβεις τι πρεπει να κανεις. Μην ξεχασεις να βαλεις και ενα δευτερο loop μεσα στο loop που περνας ολα τα στοιχεια του πινακα, για να εκτυπωσεις τα αστερακια για το ραβδογραμμα σου.
  19. Αυτη η ασκηση βασιζεται στην παραδοχη πως μπορεις να χρησιμοποιησεις τους χαρακτηρες ASCII για να κανεις ενα πολυ απλο hash table (στην C τουλαχιστον, οπου οι χαρακτηρες ASCII αντιστοιχουν σε αριθμητικες τιμες). Με αλλα λογια θα κανεις τον πινακα που σου λεει, ο οποιος θα περιεχει εναν μετρητη για καθε χαρακτηρα, θα τον μηδενισεις (ολοι οι μετρητες πρεπει να ξεκινανε απο το 0) και μετα θα loopαρεις στους χαρακτηρες του αρχειου και θα προσθετεις + 1 στην αντιστοιχη θεση του πινακα. Άκολουθωντας τον δικο σου κωδικα αυτο θα γινοταν καπως ετσι δηλαδη: unsigned long int counters[128] = {0}; do { c = getc(fp); counters[c]++; } while (c != EOF); Τελος θα κλεισεις το αρχειο, και θα loopareiς μεσα στον πινακα counters. Σε οποια θεση i του πινακα συναντησεις μη μηδενικο αριθμο (οπου και θα σημαινει πως αυτος ο χαρακτηρας υπηρχε τουλαχιστον μια φορα μεσα στο αρχειο) θα εκτυπωνεις counters φορες τον χαρακτηρα '*'. Ολα τα υπολοιπα ειναι ευκολα να γινουν. Βρισκεις και το max και το min του πινακα, στο ιδιο loop και ξεμπερδεψες.
  20. _Gikoskos_

    για c

    Καταρχήν ο κωδικας που ποσταρες εχει undefined behavior. Στην αρχη αρχη δηλωνεις μια μεταβλητη N χωρις να την αρχικοποιεις και μετα φτιαχνεις δυο VLAs που εχουν διαστασεις ΝxN. Αφου εισαι στην C η N ειναι αυτοματη μεταβλητη και αρα δεν εχει καμια αρχικη τιμη απο μονη της επομενως καταληγεις σε UB. Κατι τετοιο θα ηταν προτιμοτερο #define N 100 ... int BF1[N][N], BF2[N][N]; Απο εκει και περα το μονο προβλημα που μπορει να εχεις παιζει να ειναι στην scanf αν και δεν μου φαινεται να εχεις κανενα λαθος στην χρηση της.
  21. Πως γινεται να γραψεις αυτον τον κωδικα με switch;
  22. Δεν εννοω στην C, αλλα σε javascript json parsing συνήθως βγαίνει πιο γρηγορα, καθως json ειναι συνταξη javascript. Εχει βεβαια και καποια κομματια που δεν υπαρχουν στην javascript, δηλαδη δεν ειναι ακριβως υποσυνολο της js, γι αυτο λεω "συνηθως". Η λύση με την C εννοειται πως δεν ειναι και τοσο απλη. Καλυτερα, και πιο δομημενα, θα εβγαινε σε γλωσσα υψηλοτερου επιπεδου που επικοινωνει πιο ανετα με τεχνολογιες web (python, C#, Java, Javascript κτλ).
  23. Το εχω κανει σε C με libcurl για το http προτοκολο και libxml2 για διαβασμα των xml αρχειων των αποτελεσματων. Η ΟΠΑΠ εχει ενα API με το οποιο μπορεις να κατεβαζεις πολυ ευκολα τα αποτελεσματα σε μορφη xml και για να τα διαβαζεις εξισου ευκολα. Συνηθως αυτα τα API τα βρισκεις αν πας στο τελος τελος της σελιδας, οπως βρηκα και εγω του ΟΠΑΠ. Είναι παρα πολυ ευκολο, απλα διαβασε τις οδηγιες για το API σου και μπορεις να κανεις δουλεια ευκολα. Πχ για το τελευταιο προπο σαββατου που παιχτηκε το URL ειναι αυτο http://applications.opap.gr/DrawsRestServices/proposat/last.xml Εχει και μορφη json η οποια μπορει να ειναι πιο γρηγορη να παρσαρεις, αν ξερεις πως δουλευει. Μια παρατηρηση: επειδη στο προγραμμα μου ηθελα να μπορω να κατεβαζω παρα πολλες κληρωσεις "ταυτοχρονα" (με νηματα δηλαδη), το υλοποιησα ωστε να μπορεις να ρυθμισεις εσυ εναν αριθμο νηματων απο 1-150. Αυτό το έκανα γιατι αν πας να κατεβασεις πολλα αρχεια xml σειριακα οι σερβερς είναι καπως αργοι και θα παρει αρκετη ωρα (φαντασου 100 κληρωσεις). Ωστοσο οταν πηγα να κανω πολλα downloads ταυτοχρονα, παρατηρησα πως οι σερβερς μου εστελναν πισω corrupted αρχεια. Μου εστελναν java exceptions απο το backend του σερβερ τους, απ'οτι καταλαβα (σφαλμα το οποιο μπορει να ειναι και exploitable για οποιον ασχολειται). Γι' αυτο προσπαθω να τα κατεβασω αρκετες φορες μεχρι να κατεβει σωστο xml αρχειο, το οποιο θα σου συνιστουσα να κανεις και εσυ αν υλοποιησεις προγραμμα που χρησιμοποιει το API τους. Εχω και ενα εκτελεσιμο στα releases αν θες να δεις πως δουλευει αυτο (ειναι σε γραφικο περιβαλλον για windows).
  24. Εγω εννουσα πως την μνημη που μεταφερει δεν μπορει να την εκτελεσει ετσι οπως ειναι, γιατι δεν ειναι ειναι εκτελεσιμη μνημη. Ειχα δοκιμασει κατι παρομοιο με αυτο που λες (mmap με PROT_EXEC flag και μεταφορα του PC register με inline asm ωστε να δειχνει στην θεση απο την οποια ξεκινανε τα instructions μου στο runtime) αλλα επαιρνα διαρκως SIGILL. Δεν ξερω μπορει να εκανα και κατι λαθος. Εκτός αν εννοεις κατι διαφορετικο και δεν σε καταλαβα. Επισης, για να πετυχει κατι παρομοιο με τους function pointers που ζηταει ο φιλος, θα χρειαστει ο κωδικας της συνάρτησης που παραγεται να ειναι position independent (-fPic flag στο gcc αν θυμαμαι καλα). Ξεχασα να το αναφερω αυτο προηγουμένως.
  25. Αν θες να στείλεις τον κώδικα της συνάρτησης, απλά γράψτον σε έναν πίνακα σαν αλφαριθμητικό και στείλτο έτσι. Αλλά αυτό που στέλνεις είναι απλά μια ακολουθία bytes. Αν εννοείς πως θες να τρέξεις κιόλας αυτήν την συνάρτηση από την διεργασία που λαμβάνει το μήνυμα, αλλάζουν πολύ τα πράματα. Δεν γίνεται να κατασκευάσεις κώδικα στο runtime μέσα στο ίδιο process (τα bytes που στέλνεις και λαμβάνεις δεν βρίσκονται σε εκτελέσιμη περιοχή μνήμης) παρά μόνο αν κατασκευάσεις μέσα από το πρόγραμμά σου ένα άλλο εκτελέσιμο αρχείο, γράψεις σε αυτό την κατάλληλη γλώσσα μηχανής για αρχικοποίηση και προσθέσεις και τον κώδικα της συνάρτησης (σε γλώσσα μηχανής εννοείται), και τέλος να τρέξεις το καινούργιο εκτελέσιμο σαν παιδί της διεργασίας σου με καμια exec()
  • Δημιουργία νέου...