Category Archives: c/c++

PHP Password generator extension

Και το αντίστοιχο password generator σε php extension για να υπάρχει παντού διαθέσιμο χωρίς να χρειάζεται includes και copy/paste, αλλά και να είναι λίγο ή πολύ πιο γρήγορο από την αντίστοιχη function.

Δημιουργούμε ένα νέο φάκελο passwd και εκεί μέσα δημιουργούμε τα εξής αρχεία:

config.m4

PHP_ARG_ENABLE(passwd, whether to enable passwd support, [ --enable-passwd Enable passwd support])

if test "$PHP_PASSWD" = "yes"; then
  AC_DEFINE(HAVE_PASSWD, 1, [Whether you have passwd])
  PHP_NEW_EXTENSION(passwd, passwd.c, $ext_shared)
fi

INC_CHECK_DIRS="/usr /usr/local"

for i in $INC_CHECK_DIRS ; do
  if test -f $i/include/php/ext/standard/php_rand.h; then
    PHP_ADD_INCLUDE($i/include/php/ext/standard)
    break
  fi
done

passwd.h

#ifndef __PASSWD_H__
#define __PASSWD_H__ 1
#ifndef _WIN32
#include
#endif
#include
#ifdef ZTS
#include "TSRM.h"
#endif

#ifndef BOOL
#define BOOL	short
#endif //BOOL
#ifndef FALSE
#define FALSE	(0)
#endif
#ifndef TRUE
#define TRUE	(1)
#endif

#define PHP_PASSWD_WORLD_VERSION "1.0.0"
#define PHP_PASSWD_WORLD_EXTNAME "passwd"

PHP_FUNCTION(passwd_version);
PHP_FUNCTION(passwd_create);

PHP_MINIT_FUNCTION(passwd);
PHP_MINFO_FUNCTION(passwd);

extern zend_module_entry passwd_module_entry;
#define phpext_passwd_ptr &passwd_module_entry

#endif //__PASSWD_H__

passwd.c

#include "php.h"
#include "php_rand.h"

#ifdef _WIN32
#include "ext/standard/info.h"
#endif

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "passwd.h"

#ifndef LONG
typedef long LONG;
#endif

static function_entry passwd_functions[] = {
    PHP_FE(passwd_version, NULL)
    PHP_FE(passwd_create, NULL)
    {NULL, NULL, NULL}
};

zend_module_entry passwd_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
#endif
    PHP_PASSWD_WORLD_EXTNAME,
    passwd_functions,
    PHP_MINIT(passwd),
    NULL,
    NULL,
    NULL,
    PHP_MINFO(passwd),
#if ZEND_MODULE_API_NO >= 20010901
    PHP_PASSWD_WORLD_VERSION,
#endif
    STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_PASSWD  
ZEND_GET_MODULE(passwd)
#endif

char* passwordChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()-_=+[]{}\|,<.>/?~;:";
int passwordCharsLen = 0; 

static void ZEND_MODULE_GLOBALS_CTOR_N(passwd)(void *passwd_globals TSRMLS_DC)
{
    //php_srand( time(NULL) );  
}

PHP_MINIT_FUNCTION(passwd)
{
    passwordCharsLen = strlen(passwordChars);
    return SUCCESS;  
}

PHP_MINFO_FUNCTION(passwd)
{
    php_info_print_table_start();
    php_info_print_table_row(2, "passwd", "passwd Functions");
    php_info_print_table_row(2, "passwd_create", "return a random password string");
    php_info_print_table_end();
}

PHP_FUNCTION(passwd_version)
{
    RETURN_STRING(PHP_PASSWD_WORLD_VERSION, 1);
} 

PHP_FUNCTION(passwd_create)
{
    long i, llen, rnd_idx;
    char* tmp;
    if (ZEND_NUM_ARGS() != 1) {
        WRONG_PARAM_COUNT;
    } 
    llen = 8;
    if ((zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &llen) == FAILURE) ||
        (llen < 4) || (llen > 128))
    {
        RETURN_STRING("len should be an integer between 4 and 128", 1);
    } 

    tmp = emalloc(llen+1);

    for (i=0; i<llen; i++)
    {
        rnd_idx = php_rand(TSRMLS_C);
        RAND_RANGE(rnd_idx, 0, passwordCharsLen-1, PHP_RAND_MAX);
        tmp[i] = passwordChars[rnd_idx];
    }
    tmp[i]=(char)0; 
    RETURN_STRING(tmp, 0);
}

Τώρα o αντίστοιχος κώδικας του σχετικού post θα μπορούσε να γίνει ως εξής:

<?php
header('Content-type: text/plain');
    if (isset($_GET['len'])) $len = (int)$_GET['len'];
    if (($len < 4) || ($len > 128)) $len = 8;
    echo passwd_create($len);
?>

PHP Extension – Ευρώ Ολογράφως

Χρησιμοποιώντας περιστασιακά (ubuntu) linux και php, σε μια στιγμή χαλαρότητας, είπα να δοκιμάσω να δουλέψω λίγο με την php. Να προσπαθήσω να προσθέσω κάποιες συναρτήσεις επιπλέον, όχι όμως σαν php source κώδικα, αλλά σαν extension module. Οι βασικοί λόγοι ήταν 3.
1ον) Δεν έχω κάποιον (αφεντικό ή πελάτη) πάνω από το κεφάλι μου να με πιέζει να παραδώσω χθές.
2ον) php sources γράφει και η κουτσή μαρία. php extensions όμως είναι λίγοι αυτοί που γράφουν, και ήθελα να δω πόσο εύκολο είναι να μην είσαι ένας από τους πολλούς, να ξεχωρίσεις από το μπουλούκι.
3ον) μια function μέσα σε ένα compiled php module τρέχει πιο γρήγορα από μια που γίνεται parse κάθε φορά. Το πόσο πιο γρήγορα θα κάτσω άλλη φορά να ασχοληθώ (αν βρώ χρόνο και κυρίως όρεξη). Continue reading

Ημέρες – Μήνες – Έτη

Όσοι θέλουν τη διαφορά ημερομηνιών σε ημέρες μήνες έτη ας μην ψάξουν παραπέρα. Εγώ τη χρειάστηκα πρόσφατα και φαίνεται να δουλεύει σωστά (όσο μπόρεσα να την τεστάρω με δεδομένα και αποτελέσματα που είχα έτοιμα σε κάποια αρχεία excel.) Continue reading

the Prime Source

Τελικά αυτή η άσκηση με τους πρώτους αριθμούς (primes numbers) πρέπει να είναι all time classic!

Γράψτε ένα πρόγραμμα C το οποίο, για δεδεμένο Ν, να βρίσκει, για κάθε Κ που είναι θετικός περιττός ακέραιος και μικρότερος ή ίσος του Ν, την πρώτη ομάδα από Κ συνεχόμενους σύνθετους αριθμούς…

Με έχει ρωτήσει ένα σωρό κόσμος πως μπορούν να αυξήσουν την ταχύτητα στον αλγόριθμο που έχουν (χμ, ας πούμε) φτιάξει. Παρότι υπήρχε ένα προηγούμενο post που είχα γράψει πριν περίπου ενά-μιση χρόνο και νομίζω είναι αρκετά γρήγορο, δεν αρκεί για να είναι γρήγορη και η συνολική λύση της άσκησης. Continue reading

Στρογγυλοποίηση, επιτέλους

Λοιπόν, δεν υπάρχει πιο εκνευριστικό πράγμα από το να ψάχνεις για κάτι απλό και να μην το βρίσκεις. Αυτή η standard library έχει ένα σωρό συναρτήσεις και κάτι απλό όσο μια στρογγυλοποίηση δεν δέησε κανένας επιτέλους να την ενσωματώσει;

Μα καλά με τα νεύρα μου (μας) παίζουν;

Εντάξει δεν είναι και τόσο δύσκολο να φτιαχτεί, αλλά θα μπορούσε να υπάρχει έτοιμη και ίσως να την πείραζαν λίγο ώστε να είναι και γρήγορη. Continue reading

Ευρώ Ολογράφως

Εψαχνα εδώ και λίγο διάστημα για μια έτοιμη υλοποίηση εμφάνισης ποσών σε ευρώ στην λεκτική τους αναπαράσταση. Είδα αρκετές υλοποιήσεις σε διάφορες γλώσσες (λέμε τώρα, VB κάτι, ήταν όλες, με κάποιες εξαιρέσεις που ήταν μεταφράσεις σε C# των αντίστοιχων VB) με την κάθε μία να έχει τα υπέρ και τα κατά, αναλόγως τις ανάγκες που υπήρχαν.

Αλλη υλοποίηση υποστηρίζει ποσά μέχρι 999.999€ άλλη υποστηρίζει μέχρι 2 δεκαδικά, άλλη υποστηρίζει μεγαλύτερα ποσά, άλλη αρνητικά ποσά. Το να είναι μια υλοποίηση μετάφραση σε άλλη γλώσσα δεν είναι κάτι το μεμπτό, απλώς μου φάνηκε αστείο που όλες οι υλοποιήσεις ήταν VB ή VB.NET, ή VBScript. Ούτε καν COBOL! (Καλά που την θυμήθηκα αυτή τώρα; 🙂 )

Αυτό που έψαχνα να βρώ είναι μια κομψή υλοποίηση σε κάποια γλώσσα που να μην μου είναι εντελώς άγνωστη ώστε να μπορώ να προσαρμόσω τον κώδικα στα γούστα μου. Τον κώδικα που μου άρεσε περισσότερο τον βρήκα σε μια vb.net υλοποίηση του panos_sniper που έχει αναρτήσει στο dotnetzone.gr. Θα προτιμούσα κάτι σε C ή C++ αλλά και η vb.net δεν είναι πρόβλημα. Μπορεί να τρέξει, να δοκιμαστεί ότι δουλεύει σωστά και αν όλα είναι εντάξει το μόνο που μένει είναι να χρησιμοποιηθεί. Continue reading

Υπολογισμός γινομένου

Αν και δεν συνηθίζω να προβάλλω κώδικα που έχει γράψει άλλος, παρά προσπαθώ να δίνω το link στη σελίδα του, ο συγκεκριμένος κώδικας αφορά δημοσίευση του Alice_Cooper που είδα στο τεχνολογικό forum freestuff.gr που είμαι μέλος, οπότε μάλλον είναι προτιμότερο ο σύνδεσμος να δείχνει το συγκεκριμένο θέμα.

Παρότι το ερώτημα είναι αρκετά απλό, η λύση που δώθηκε είναι πολύ πρωτότυπη! Τουλάχιστον εγώ δεν την είχα ξαναδεί και οι σκέψεις μου ακολουθούσαν πιο τετριμένα μονοπάτια.

Μια αρκετά διαφορετική υλοποίηση, για να θυμόμαστε να μην μείνουμε σε αυτά τα πέντε πράγματα που μάθαμε, αλλά να ξεσκουριάζουμε όποτε μπορούμε το μυαλό μας.

Οπως λέει και το slogan της apple λοιπόν:

think different

(Για να προλάβουμε πρίν εμφανιστεί κανένα πονηρό χαμογελάκι, αυτή η δημοσίευση γράφτηκε σε windows pc). 🙂

ISAPI Filters

Είναι λίγος καιρός που έχω αρχίσει να χρησιμοποιώ το wordpress. Εστησα (παραμετροποίησα δηλαδή) αυτό το blog, σε έναν δωρεάν λογαριασμό αλλά είναι κάποια πράγματα που δεν μου αρέσουν. Το πρώτο και βασικότερο είναι ότι δεν σε αφήνει – επαναλαμβάνω στον δωρεάν λογαριασμό – να αλλάξεις την εμφάνιση, και μετά ότι δεν υποστηρίζει ms sql server (βασικά με ενδιαφέρει ο ms sql server 2000). Θα βολευτώ όμως προς το παρόν με ότι δίνει.

Ενα χαρακτηριστικό όμως που μου αρέσει – και φαντάζομαι ότι δεν έχει και τόσο σχέση το WordPress, όσο ο Apache ή ο Lightspeed που χρησιμοποιεί το wordpress.com, είναι η εκτενής χρήση του mod-rewrite, ώστε τα URLs να είναι πιο απλά στο ανθρώπινο μάτι. Ολα τα υπόλοιπα που διαβάζω για τις search engines σε σχέση με τις σελίδες που έχουν παραμέτρους στο URL τους, για μένα είναι “φλούδες” (να μην χρησιμοποιήσω άλλη έκφραση). Αν αυτός που έχει γράψει την μηχανή αναζήτησης είναι “μπακάλης” μη σώσει και αποθηκεύει σωστά τη διεύθυνση της. Τις εποχές που η διεύθυνση μιας σελίδας ήταν μόνο ότι σήμερα θα υπήρχε μέχρι το `?` με μόνο στατικό περιεχόμενο, τα μαμούθ ήταν στο forte τους ακόμα. Τέλος πάντων. Continue reading

code formatting

Το μέγεθος ενός source αρχείου σίγουρα παίζει ρόλο στο πόσο γρήγορα θα γίνει η μεταγλώττιση του προγράμματος και όσο μεγαλύτερο είναι το source αρχείο τόσο περισσότερο θα καθυστερήσει η διαδικασία αυτή. Αν έχεις ένα source αρχείο με 3 γραμμές κώδικα και ένα δεύτερο αρχείο με αυτές τις ίδιες 3 γραμμές και επιπλέον 50 κιλά σχόλια, το δεύτερο αρχείο θα πάρει περισσότερη ώρα για να μεταγλωττιστεί. Continue reading

the Prime Question

Ενα πρόβλημα που θα βασανίσει τα φοιτητικά μυαλά κάποια στιγμή της φοιτητικής τους ζωής αφορά όχι μόνο τον κόσμο της πληροφορικής (με τον οποίο εγώ και μερικοί άλλοι τα πάμε καλά – τουλάχιστον δεν βρισκόμαστε στα μαχαίρια) αλλά και τον κόσμο των μαθηματικών (με τον οποίο εγώ και πολλοί άλλοι δεν έχουμε και τις καλύτερες σχέσεις). Continue reading