une balle, un imp (Newstuff #491, Edge, Duke it out in Doom, John Romero, DoomeD again)
Canard zizique : q 4, c, d, c, g, n , t-s, l, d, s, r, t, d, s, c, jv, c, g, b, p, b, m, c, 8 b, a, a-g, b, BOF, BOJV, c, c, c, c, e, e 80, e b, é, e, f, f, f, h r, i, J, j, m-u, m, m s, n, o, p, p-r, p, r, r r, r, r p, s, s d, t, t
Canard lecture
J'ai une grosse base de données Oracle et je voudrais pouvoir générer des diagrammes Entités/Relationnel à partir du schéma en sélectionnant les tables qui m'intéresse.
Je voudrais une fois la génération terminée pouvoir modifier le diagramme facilement à la main:
- il n'y a pas forcément les contraintes de foreign key, donc je voudrais manuellement faire un lien
- certaines tables ont des dizaines, voir centaines, de colonnes inintéressante pour la structure, donc je voudrais bien n'en garder que quelques une.
Je pourrais le faire à la main, mais je suis pour en faire le moins possible, donc il me faut un outil.
J'ai joué avec SQL Developer, mais le data-modeler:
- produit des vues vraiment moche
- est compliqué à utilisé
- ne permet pas de bricolage à la main
- peut affecter le vrai schéma de base, et j'ai peur de défoncer la table en bricolant mon diagramme.
J'ai vu sur Google plein de trucs payant.
Vous connaissez un outil gratuit qui permettent de faire ce genre de diagramme ?
Concours Pwn2Own : Edge percé cinq fois, VMware deux fois, Chrome résiste
Ca rassure...(...)Le concours prévoyait donc 100 000 dollars à toute équipe qui parviendrait à s’échapper d’une machine virtuelle créée par VMware Workstation ou Hyper-V de Microsoft. Deux équipes chinoises se sont lancées dans l’aventure, Team Sniper et 360 Security. Les deux ont réussi à sortir d’une machine virtuelle VMware et à exécuter du code sur le système hôte. Elles ont donc empoché la récompense. Personne ne s’est attaqué à Hyper-V.(...)
Bon avec 10 jours de retard, je me permet de répondre quand même.
DbVisualizer
J'ai installé récemment une version 9.2.13 gratos. Il me semble que certaines versions supérieures sont payantes ou truffées de publicités louches...
"Tout est vrai, tout existe, il suffit d'y croire."
Dieu. (enfin… je crois)
tu fais bien de te permettre j'avais mis tout ça de côté !
Je suis en train de dl la version 9.2 pour tester tout ça. Merci du tuyau
En plus c'est marqué que RockStar l'utilise
Je vais avoir une bonne excuse pour procrastiner un peu aujourd'hui: "regarde chef j'apprend un nouveau soft pour faire cette doc qui aurait dû être faite depuis 20 ans"
Pour la peine, voici le WTF du jour de mon projet en C "papy inside":
Donc EXEC SQL ... ; c'est un pre-processeur Oracle qui permet de faire des requête en base et de mapper les résultat dans des variables ou des structures. Cool./* plein de C au dessus */
EXEC SQL SELECT lower(:variable) INTO :variable FROM dual;
/* plein de C en dessous */
Sauf quand c'est utilisé pour mettre une string en minuscule
Dernière modification par William Vaurien ; 23/03/2017 à 14h48.
Oui vraiment... et ensuite le code faisait une recherche simple, mais implémenté 'à la main' à coup de boucles imbriquées et de comparaisons caractère par caractère.
Donc une centaine de lignes pour vérifier si le nom de domaine d'un email faisait partie d'une liste interdite en base.
Non, il n'y a quasiment aucune procédure stockée.
En fait c'est plus des mecs qui sont bon en C, mais en C Kernighan and Ritchie.
Le soft est passé par plusieurs archis: Unix HP en mode mainframe, puis unix HP en mode web (avec un obscure middle-ware qui fait aussi de l'UI X11, windows et web), puis Unix Solaris, puis maintenant Linux.
Toute l'architecture est basé sur un paradigme monocouche à base de copié-collé ().
En gros c'est un cgi-bin, la requête rentre par un apache et est transféré au middleware propriétaire qui gère une espèce de session web, appel un bout de code en C qui peut récupérer les paramètres de la requête fait son business (logique et persistance) et va ensuite écrire dans des formulaires.
C'est ultra KISS (surtout pour la partie Stupid en fait...)
Les devs viennent d'une époque ou les lib n'étaient pas trop standards et ou c'était habituel d'avoir une grosse méthode qui fait tout, très linéaire (et simple à débugguer).
Il y a bien deux / trois fichier Util*** pour les dates par exemple, mais ils n'ont jamais vraiment été intéressé par intégrer des librairies pour se faciliter la vie, ni par avoir des structures de données avancées (hein, hashmap ). En gros ils n'ont pas fait de veille techno de leur vie...
Pour éviter les fuites mémoires, il n'y a quasiment aucune allocation de mémoire dynamique: les tableaux de char sont alloué en dur au doigt levé...
La gestion des erreurs lors des appels à la base sont géré par les mêmes 5 lignes, avec juste un message différent. Donc c'est 5 * 1000* n lignes inutilement copié/collées (je ne connais pas exactement n, mais c'est haut!)
Bref, c'est avec ce genre de projet que l'on comprend d'où vient Java
Ouputain tu lances un refactoring, et comme métriques pour l'efficacité de ce refactoring, tu demandes à ce qu'on prenne en compte le nombre de ligne supprimées
Ce qu'il faut savoir, c'est qu'on ment beaucoup aux minmatars, surtout lorsqu'ils posent des questions du style: "t'es sûr que ça vole, ce truc ?" Cooking Momo, le 30/08/09
Le gros danger pratique c'est que cette usine à gaz a probablement des bugs, ou au moins des comportements spécifiques.
Et qu'en réécrivant ce code comme une black box avec une sémantique haut niveau, et poteniellement en enlevant ces "features", on peut péter complètement le système, s'ils sont compensés ailleurs d'une façon ou d'une autre.
Bref, t'es dans la merde, tu marches sur des œufs, et il faut strive pour être à comportement constant sous peine que ce te soit reproché :-/
Sleeping all day, sitting up all night
Poncing fags that's all right
We're on the dole and we're proud of it
We're ready for 5 More Years
L'application va bientôt fêter ses 30 ans pour ses parties les plus anciennes.
Les bugs ont finit par être éradiqués avec le temps, et c'est une appli de gestion, donc il n'y a pas non plus une complexité folle (ni dans le business, ni dans la charge).
Pas de refactoring, pas à ce niveau.
Le plan c'est de figer la bête et de déplacer des parties au fur et à mesure vers d'autres plateformes (soit in-house soit avec un progiciel).
Mais c'est un plan sur 5-10ans... Donc je déprime un peu et je vais devoir maintenir ce soft faisandé encore quelques temps.
Je sur du rust,
J'ai un dép pour un client irc, une dep pour un client http. Les deux ont besoin d'une version différente de la lib openssl et paf, chocapic, ça ne build plus :
J'ai beau tourner le truc dans tout les sens, impossible de m'en sortir. Si quelqu'un à une idée...Code:error: native library `openssl` is being linked to by more than one version of the same package, but it can only be linked once; try updating or pinning your dependencies to ensure that this package only shows up once
"Nobody exists on purpose. Nobody belongs anywhere. We're all going to die. Come watch TV." - Morty Smith
Ouais, la solution temporaire c'est désactiver ssl pour la dépendance ou je peux m'en passer un peu plus facilement :
Code:[dependencies] regex = "0.2" [dependencies.select] git = "https://github.com/utkarshkukreti/select.rs.git" [dependencies.hyper-openssl] git = "https://github.com/sfackler/hyper-openssl.git" [dependencies.irc] git = "https://github.com/aatxe/irc" default-features = false features = ["encode", "ctcp"]
"Nobody exists on purpose. Nobody belongs anywhere. We're all going to die. Come watch TV." - Morty Smith
Ce n'est pas deux applis, mais une qui utilise deux deps (irc + client http). Ces deux deps ont dans leur Cargo.toml, une version différente de openssl-sys.
"Nobody exists on purpose. Nobody belongs anywhere. We're all going to die. Come watch TV." - Morty Smith
"Nobody exists on purpose. Nobody belongs anywhere. We're all going to die. Come watch TV." - Morty Smith
@William : je dis peut-être une connerie, mais tu ne pourrais pas mettre en place des webservices pour ton nouveau code ?
En gros, tout ce que tu reprends en propre est foutu à un autre endroit, et tu y accèdes en WS via l'apache déjà en place.
Non, c'est pas une connerie du tout, c'est la voie que nous essayons de mettre en place. Par contre le vieux code est pas trop fait pour ce genre de refonte. Comme tous les aspects (UI, DB, business, plomberie) sont mélangés dans de grandes méthodes...
Les nouveaux trucs sont développés sous forme de services extérieurs également.
Dernière modification par William Vaurien ; 03/04/2017 à 14h00.
Question pour les experts C et système Unix/Linux:
Pourquoi "If copying takes place between objects that overlap, the behavior is undefined." ? Qu'est-ce qui provoque ce comportement indéfini ???
dans string.h (version apple https://opensource.apple.com/source/...bproj/strcpy.c)
Dans notre vieux code pourri strcpy est parfois utilisé avec des 'overlapping pointers'. Sur Solaris et HP UX il n'y jamais eu de problèmes. Sur Linux le code se mange du comportement de merde.Code:/* ANSI sez: * The `strcpy' function copies the string pointed to by `s2' (including * the terminating null character) into the array pointed to by `s1'. * If copying takes place between objects that overlap, the behavior * is undefined. * The `strcpy' function returns the value of `s1'. [4.11.2.3] */ char * strcpy(char *s1, const char *s2) { char *s = s1; while ((*s++ = *s2++) != 0) ; return (s1); }
Sinon dans une autre version de string.h il y a ces macros (version linux http://lxr.free-electrons.com/source/lib/string.c)
C'est quoi __HAVE_ARCH_STRCPY ??? Est-ce que c'est ça qui pourrait activer un comportement de merde sur Linux ? Une version optimisée pour l'OS ???Code:#ifndef __HAVE_ARCH_STRCPY 81 /** 82 * strcpy - Copy a %NUL terminated string 83 * @dest: Where to copy the string to 84 * @src: Where to copy the string from 85 */ 86 #undef strcpy 87 char *strcpy(char *dest, const char *src) 88 { 89 char *tmp = dest; 90 91 while ((*dest++ = *src++) != '\0') 92 /* nothing */; 93 return tmp; 94 } 95 EXPORT_SYMBOL(strcpy); 96 #endif
En gros j'ai compris qu'il ne fallait pas utiliser strcpy. Mais je ne sais pas pourquoi, et je déteste obéir sans comprendre
Merci d'avance aux experts CPC
Y a pas de "pourquoi?" dans ce genre de normes. C'est comme ça.
Et ça permet d'éviter un test.
Par contre, je ne vois pas dans quel scénario fou tu peux faire un strcpy qui overlappe.
Des memcpy, on pourrait à la limite en débattre
Sleeping all day, sitting up all night
Poncing fags that's all right
We're on the dole and we're proud of it
We're ready for 5 More Years
Tu peux voir facilement que c'est la merde si tu veux écrire une fonction de copie efficace qui fonctionne quelle que soit source et destination : il faut regarder si tu dois faire la copie en partant du début ou de la fin (sachant qu'ici tu sais pas où est la fin), et quelle taille de mot tu peux utiliser... Du coup la fonction ne gère que le cas sans recouvrement.
Pour le cas où tu connais la taille tu peux utiliser memmove qui gère les recouvrements à la place de memcpy. Si ça peut te rassurer, en pratique, il y a encore pas mal de code dans la nature qui a ce bug d'appeler memcpy sur des zones avec recouvrement. À une époque Intel avait fourni une version de memcpy optimisée pour Atom qui copiait en partant de la fin : ils l'ont retiré, ça faisait segfaulter Skype.
Ben par exemple si s1 pointe sur s2+1, avec cette implémentation, tu vas te retrouver avec n fois s2[0] dans s1, au lieu de copier s2 dans s1.
Pour la seconde question, c'est probablement pour les architectures qui ont une version spécialisé, et optimisée. Genre en assembleur pour copier plus rapidement des strings alignées.
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
C'est utilisé dans une méthode qui supprime des caractères dans une string. Dans ce cas les chars sont déplacé vers le début de la chaine via un strcpy.
strcpy (str, str + n);
Un memmove aurait été clairement adapté dans ce cas, mais mes collègues ont choisi à l'époque de le faire via une copie.
Et sérieusement, qu'est-ce qui peut faire que
while ((*dest++ = *src++) != '\0')
fasse parfois de la merde ?
J'ai bricolé un test-case et c'est assez étrange:
le bug arrive toujours sur les mêmes strings, donc c'est d'une certaine manière reproductible. Mais je ne vois pas de logique qui fait que pour une chaine ça marche et pas pour l'autre.
Et clairement "Y a pas de "pourquoi?" dans ce genre de normes. C'est comme ça." C'est du même niveau que "Ta gueule c'est magique", et moi ça ne me va pas...
J'ai fais trop de Java pendant des année et je me suis éloigné de l'archi et du langage machine. Je ne suis pas forcément à l'aise avec ce qui se passe vraiment au niveau du proc.
Mais je voudrais bien comprendre pourquoi ça ce passe comme ça, et aussi pourquoi ça marche sur d'autres OS...
Les résultats de mon petits test:
Code:remove '/' in '/1234/' with strcpy --> expected result '1234', obtained result: '1244' ? ERROR remove '/' in '12/34' with strcpy --> expected result '1234', obtained result: '1234' ? OK remove '/' in '123/4' with strcpy --> expected result '1234', obtained result: '1234' ? OK remove '/' in '/1234/' with strcpy --> expected result '1234', obtained result: '1244' ? ERROR remove '/' in '/12/34/' with strcpy --> expected result '1234', obtained result: '1234' ? OK remove '/' in '12/34/56' with strcpy --> expected result '123456', obtained result: '1234556' ? ERROR remove '/' in '12/34/56/78' with strcpy --> expected result '12345678', obtained result: '123456888' ? ERROR remove '/' in '///////////' with strcpy --> expected result '', obtained result: '' ? OK remove '/' in '' with strcpy --> expected result '', obtained result: '' ? OK remove '/' in '///1///' with strcpy --> expected result '1', obtained result: '1' ? OK remove '/' in '2///1///2' with strcpy --> expected result '212', obtained result: '212' ? OK remove '/' in '1/2/3' with strcpy --> expected result '123', obtained result: '123' ? OK remove '/' in '/12/34/56/' with strcpy --> expected result '123456', obtained result: '123466' ? ERROR remove '/' in '/12/34/56/' with strcpy --> expected result '123456', obtained result: '123466' ? ERROR remove '/' in '/12/34/56/' with strcpy --> expected result '123456', obtained result: '123466' ? ERROR