psyphi's web blog

http://psyphi.zeblog.com/

psyphi

psyphi ISTASE, Free Software, Hacking & Coding

Blog

Catégories

Derniers billets

Pages

Compteurs

Liens

Fils RSS

Petits dictons de l'informatique

Par psyphi :: 14/04/2007 à 15:20 :: Programmation
Le monde du développeur:
En train, il admire le scrolling du paysage..
Il rédige ses chèques en héxadécimal..
Sa dernière pensée avant de s'endormir est "shutdown completed"...
10 kind of people...:
There are only 10 types of people in the world: Those who understand binary, and those who don't

The UNIX way of sex:
gunzip-strip-touch-finger-mount-fsck-more-yes-umount-sleep
Les aphorismes de Edsger Wybe Dijkstra:
Tester un programme démontre la présence de bugs, pas leur absence.
Se demander si un ordinateur peut penser, c'est aussi intéressant que de se demander si un sous-marin peut nager.
La programmation par objets est une idée exceptionnellement mauvaise qui ne pouvait naître qu'en Californie.
Les progrès ne seront possibles que si nous pouvons réfléchir sur les programmes sans les imaginer comme des morceaux de code exécutable.
Divers:
" Ce n'est pas un bogue, c'est une fonctionnalité !" (de l'anglais It's not a bug, it's a feature). - Réponse fréquente des développeurs de logiciels à leurs utilisateurs.
" Tout programme non trivial possède au moins un bogue "(de l'anglais Every non-trivial program has at least one bug) - Tiré de la loi de Murphy appliquée à l'informatique.
" L'erreur est humaine, mais un vrai désastre nécessite un ordinateur "



Si vous en avez d'autre je suis preneur


Tutoriaux sur les sockets

Par psyphi :: 15/02/2007 à 12:51 :: Programmation
Vous voulez entrer dans le monde merveilleux des sockets , alors voici quelques liens d'aide:
Je compléterai cette liste au fur et à mesure, si vous connaissez de bon liens poster les en commentaires.

Remarque: les tutoriaux UNIX sont facilements portable sur les plateformes WIN32, il n'y a en général qu'a changer les librairies.

[English]

[UNIX]
http://beej.us/guide/bgnet/ Beej's Guide: LE GUIDE incontournable que chaque programmeur réseau se doit d'avoir lu au moins une fois. Idéal pour débuter.
http://www.lowtek.com/sockets/ Très bon article sur le pourquoi et le comment de la fonction select().
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rzab6/uafinet.htm Le tutoriel d'IBM avec deux bons exemples: un serveur TCP, un client TCP.

[WIN32]
http://tangentsoft.net/wskfaq/ La FAQ des sockets sur les systèmes windows

[Français]

[UNIX]
http://vidalcharles.free.fr/lf/socket.html Le beej's guide en français moins complet que son homologue en Anglais.
http://fr.lang.free.fr/cours/SocketCsyst_v1.0.pdf Implémentation des sockets sur Unix, très complet. (new)

[WIN32]
http://c.developpez.com/WalrusSock/ The Walrus les sockets démistifiés. Petit tutoriel pour commencer avec les sockets sous windows.
http://www.noxistes.org/c_les_sockets_sous_windows_18.php Une introduction sur les sockets windows.
http://www.progzone.free.fr/reseau/socket/socket.html Implémenter une librairie de socket en C avec winsock.
http://www.progzone.free.fr/reseau/socket/sockasync.html Les sockets asynchrones. (new)

[UNIX/WIN32]
http://mapage.noos.fr/emdel/reseaux.htm Tutoriel à l'image du reste du site: propre, simple, précis.

http://sylvainmarechal.chez-alice.fr/prog/unix-win32/socket/tcp/tcp.html Premier pas avec les sockets TCP.

gdb les commandes essentielles

Par psyphi :: 17/12/2006 à 18:01 :: Programmation

Rien de plus énervants qu'un programme en C qui plante. Heureusement pour nous il existe les debuggers. Le plus utilisé sous linux est bien entendu gdb dont voici les commandes les plus courantes:

gcc -g -o nomProgramme nomSource.c // compile votre programme avec l'option debugage (-g)
gdb nomDuProgramme // On lance le debugger
run // lance le programme
where // permet de determiner ou le programme s'est arrêté
list nomSource.c:numéroLigne // permet de lire les lignes suspectes
break numéroDeLigne // met un point d'arrêt à la ligne correspondante
file // permet de corriger le programme
set var nomVariable1=nomVariable2 // remplace variable1 par variable2
cont // continue l'éxcution du programme
next // exécute la ligne suivante dans la même fonction
step // exécute la ligne de code suivante dont les appels de fonctions rencontrés
until numéroDeLigne // exécute le programme jusqu'a numéroDeLigne
print nomVariable // permet de connaître la valeur de la variable
attach PID // lie le deboguer avec un programme courant
bt //backtrace, édite la stack du programme
info program // affiche statut d'éxécution
info locals // donne le nom des variables avec leurs valeurs dans la fonction courante
info variables // donne le nom des variables avec leurs valeurs dans tout le programme
info address // indique ou sont stocké les variables
info frame // informations sur la structure de la pile courante
quit // quitter gdb

[Java]BlogReader ou comment être prévenu de nouveaux commentaires sur zeblog

Par psyphi :: 12/12/2006 à 15:10 :: Programmation
Aujourd'hui je vais vous parler un peu de mon hébergeur: ZeBlog.com
ZeBlog offre quelques avantages:
  1. Gratuité
  2. Pas de pub (c'est rare et agréable il faut le reconnaître)
  3. Simplicité
Par contre tout cela à un prix, voici donc les inconvénients:
  1. Peu de design
  2. Traitement de texte très pauvre (peu de balises phpbb)
  3. Statistiques quasi inexistantes
  4. Mauvaise gestion des commentaires
    Dernièrement je me suis aperçu que certaines personnes m'avaient laissé des commentaires sur de vieux billets. Hélas à chaque fois que je viens sur mon blog je ne me rappelle pas forcément le nombre de commentaires qu'il y avait lors de ma précédente visite, ce qui fait que si les commentaires n'étaient pas postés en première page je ne m'en rendais pas compte.
    Enfin j'ai résolu ce problème, comment allez vous me demander? Mais en "embauchant" quelqu'un pour visiter mon blog à ma place! Cette personne se connecte à mon blog et vérifie toutes les 15 mins si j'ai un nouveau commentaire. Si tel est le cas elle m'avertit et je n'ai alors plus qu'à me connecter pour vous répondre chers visiteurs .

    Ce "quelqu'un" travaille pour moi gratuitement et ne râle jamais . Si vous aussi vous voulez faire sa connaissance  ou bien l'embaucher pour travailler pour vous c'est ici et c'est gratuit.
Have Fun!


[Java/JDBC] Datenbank export

Par psyphi :: 30/11/2006 à 18:53 :: Programmation
Ubung 4 Datenbank
  Datenbankexport mit JDBC
 Schreiben Sie eine Java-Anwendung, mit der man einen einfachen Datenbank-Export
 durchführen kann. Man gibt die Tabellen an, die man exportieren möchte und das
 Programm erzeugt zwei SQL-Skripten: eines, das die DDL-Anweisungen zum Erzeugen
 der Tabellen enthält, und eines, das die Insert-Anweisungen zum Füllen der Tabellen
 enthält.
 Zusatzaufgabe: Es sollen auch Anweisungen, die die referentielle Integrität betreffen,
 erzeugt werden.

import java.sql.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.DatabaseMetaData;
import javax.swing.JOptionPane;


public class ExportJDBC {
    
    // Datenbank
    private static String datenBankName = null;
    private static String treiberArte = null;
    private static String login = null;
    private static String password = null;
   
    // Datei
    private static FileWriter createFile = null;
    private static BufferedWriter outCreate = null;
    private static FileWriter fillFile = null;
    private static BufferedWriter outFill = null;
   

    // main
    public static void main(String[] arg){
        // Informationen ueber Datenquelle
        Connection con = null;
        DatabaseMetaData dbmd = null;
        ResultSet tables = null;
       
        treiberArte = new String("com.mysql.jdbc.Driver");
        datenBankName = new String("studenplan");
        login = new String("root");
        password = new String("");
       
        // Initialieren der Datei
        try{
            // tabellename-create.sql
            createFile = new FileWriter(datenBankName+"-create.sql");
            outCreate = new BufferedWriter(createFile);
            outCreate.write("/* Tabellen neu erzeugen */");
            outCreate.newLine();
            // tabellename-fill.sql
            fillFile = new FileWriter(datenBankName+"-fill.sql");
            outFill = new BufferedWriter(fillFile);
        }catch (IOException ex){
            ex.printStackTrace();
            System.exit(0);
        }
       
       
        try{
            /*** Schritt 1: Treiber registrieren ***/
            Class.forName(treiberArte);
           
            /*** Schritt 2: Connection zur Datenbank herstellen ***/
            con = DriverManager.getConnection("jdbc:mysql:///"+datenBankName, login, password);
            JOptionPane.showMessageDialog(null, "Connection for export OK");
           
           
           
            /*** Schritt 3: Tabelle in die Datenbank  ***/
            dbmd = con.getMetaData();
            System.out.println("Database Productname: "+dbmd.getDatabaseProductName());
            System.out.println("Database Productversion: "+dbmd.getDatabaseProductVersion());
            tables = dbmd.getTables(    con.getCatalog(),     // catalog
                                        null,                // schemaPattern
                                        "%",                // tableNamePattern "%"=irgendein Name
                                        null                // types
                                    );
           
            /*** Schritt 4: Informationen speichern ***/
            while(tables.next()){
                /** Tabellename **/
                int spaltenanzahl = 0;
                String dbName = tables.getString("TABLE_NAME");
                System.out.println("---[ Tabelle: "+dbName+" ]---");
                /* Alle informationen ueber die Tabelle : TABLE_CAT, TABLE_SCHEM ...
                ResultSetMetaData ergebnisMeta = tables.getMetaData();
                spaltenanzahl = ergebnisMeta.getColumnCount();
                for(int i=0; i< spaltenanzahl ; i++){
                    String nomColonne = ergebnisMeta.getColumnName(i+1);
                    System.out.println(nomColonne+" = "+tables.getString(i+1)); 
                }
                */
                outCreate.write("CREATE TABLE "+tables.getString(3));
                outCreate.newLine();
                outCreate.write("(");
                outCreate.newLine();
               
                /** Spalten **/
                ResultSet spalten = dbmd.getColumns(con.getCatalog(), null, dbName, "%");
                ResultSetMetaData spaltenMeta = spalten.getMetaData();
                spaltenanzahl = spaltenMeta.getColumnCount();
                /** Alle Spalten
                for(int i=0; i < spaltenanzahl; i++){
                    System.out.print(spaltenMeta.getColumnName(i+1)+" | ");
                }
                System.out.println();
                **/
               
                /** create.sql **/
                while( spalten.next() ) {
                   
                   
                    String strColumnName    = spalten.getString("COLUMN_NAME");
                    String strTypeName        = spalten.getString("TYPE_NAME");
                   
                    System.out.print(strColumnName+" "+strTypeName);
                    outCreate.write(strColumnName+" "+strTypeName);
                   
                   
                    if(strTypeName.contains("char") || strTypeName.contains("CHAR"))
                    {// Wenn das ein CHAR ist, mussen die Lange kennen.
                        System.out.print("("+spalten.getString("COLUMN_SIZE")+")");
                        outCreate.write("("+spalten.getString("COLUMN_SIZE")+")");
                    }
                    System.out.println();
                    outCreate.append(",");
                    outCreate.newLine();   
                }
                /** Schreiben die Ende des Dateis **/
                outCreate.write(");");
                outCreate.newLine();
                outCreate.newLine();
               
                /* Alle informationen in Spalten
                while(spalten.next()){
                   
                    for(int j = 0; j < spaltenanzahl; j++){
                        System.out.print(spalten.getString(j+1) +"|");
                    }
                    System.out.println();
                }
                */
               
                /** fill.sql **/
               
                /* Kann nicht sein, muss immer eine Tabelle da sein
                PreparedStatement pstmtSelect = con.prepareStatement("SELECT * FROM ?");
                pstmtSelect.setString(1, dbName);
                ResultSet ergebnis = pstmtSelect.executeQuery();
                */
               
                // Tabelle Leeren
                outFill.newLine();
                outFill.write("/* Tabelle leeren */");
                outFill.newLine();
                outFill.write("delete from "+dbName);
                outFill.newLine();
               
                Statement anweisung = con.createStatement();
                ResultSet ergebnis = anweisung.executeQuery("SELECT * FROM "+dbName);
               
                ResultSetMetaData ergebnisMeta = ergebnis.getMetaData();
                spaltenanzahl = ergebnisMeta.getColumnCount();
                String [] spaltenName = new String [spaltenanzahl];
               
               
               
                for(int i = 0; i < spaltenanzahl; i++){
                    spaltenName[i] = ergebnisMeta.getColumnName(i+1);
                    System.out.print(spaltenName[i]+"   |   ");
                }
                System.out.println();
                outFill.write("/* Tabelle "+dbName+" fuellen */");
                outFill.newLine();
               
                while(ergebnis.next()){
                    StringBuffer zeileInhalt = new StringBuffer("INSERT INTO "+dbName+" VALUES(");
                    for(int i = 0; i < spaltenanzahl; i++){       
                        System.out.print(ergebnis.getString(i+1)+" | ");
                        if(i == spaltenanzahl-1)
                            zeileInhalt.append("'"+ergebnis.getString(i+1)+"'");
                        else
                            zeileInhalt.append("'"+ergebnis.getString(i+1)+"', ");
                    }
                    System.out.println();
                    zeileInhalt.append(");");
                    outFill.write(zeileInhalt.toString());
                    outFill.newLine();
                }
           
            }
        }
        catch (ClassNotFoundException ex){
            JOptionPane.showMessageDialog(null, "Class not found! "+ex.getMessage());
        }
        catch (SQLException ex){
            JOptionPane.showMessageDialog(null, "JDBC Fehler: "+ex.getMessage());
        }
        catch (IOException ex){
            ex.printStackTrace();
            System.exit(0);
        }
        /*** Schritt 6: Nicht mehr benoetigte Resourcen freigeben ***/
        finally{
            try{
                if(con != null)
                    con.close();
                outCreate.close();
                outFill.close();
            }
            catch(SQLException ex){
                ex.printStackTrace();
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
           
        }
        System.exit(0);
    }
}

Copyright © psyphi's web blog - Blog créé avec ZeBlog