Sunday, August 7, 2011 3:04:05 AM
So, you have a typical cfm page with a big processing loop in it and it is damn resources consuming. What if the user send another request before the previous one is finished? Well, without some enhancements, both requests will be processed together, concurrently, and here, "concurrently" really means it.
In most cases, you just do not need the previous requests to finish. Only the latest call should count, and as soon as new requests are made, every unfinished business should just be aborded asap, to avoid delays and bad overall performance. Allright, sometimes, you would prefer the first to finish and prevent the user to request a new one before the first is finished. But let's assume you don't. And let's also assume you've got sessions working.
Here is an example of the typical page I'm talking about, it doesn't matter if it is a classic or ajax call:
<cftransaction>
<cfloop query="allrecords">
</cfloop>
</cftransaction>
</p>
All your <cfoutput>#allrecords.recordcount#</cfoutput>
records have been analyzed.
</p>
Now, if this page is called twice, it will just run twice. And maybe, twice is the maximum concurrent requests that your server would accept to process from the same IP, so, if the user hit the refresh a third time, your entire website will stop responding for that user for a while...
But if we just add two new lines...
<cfset OneCallOnly()>
<cftransaction>
<cfloop query="allrecords">
<cfset OneCallOnlyCheck()>
</cfloop>
</cftransaction>
</p>
All your <cfoutput>#allrecords.recordcount#</cfoutput>
records have been analyzed.
</p>
Then no more trouble. Assuming you put these two little functions in your application.cfm file:
<cffunction name="OneCallOnly" output="false">
<cfset var instant=now()>
<cfset "session.OneCallOnly.#listlast(CGI.SCRIPT_NAME,'/')#"=instant>
<cfset variables.OneCallOnly=instant>
</cffunction>
<cffunction name="OneCallOnlyCheck" output="false">
<cfif evaluate("session.OneCallOnly.#listlast(CGI.SCRIPT_NAME,'/')#") NEQ variables.OneCallOnly>
<cfabort>
</cfif>
</cffunction>
The principle is quite easy. When your template is started, he is tamped with a timestamp. And each time the loop cycle, that timestamp is compared with the latest timestamp and if it is not a match, the function aborts, so then the request aborts.
Notice I added <cftransaction> tag around the loop. That allows the old request to rollback. better for your data integrity if you write to a database.
Hope it helps!
Friday, September 17, 2010 3:14:25 PM
oracle materialized view snapshot dblink public li
I'm writing this article because I found it very difficult to create some snapshot of a distant table (and especially from a distant view) with some "universal always working code".
My first attempt to make a copy of a distant "something" (I dont even want to know of it is a distant table or view or else) was to use something like this:
CREATE TABLE "MYCOPY" AS SELECT * FROM MYDISTANTOBJECT@MYDBLINK;
Sometimes it is enough. But not always. Why? First, the distant object may have constraints. Constraints that are automatically created locally when you trigger the above statement. F.e. it could contain a field called "MandatoryName" Who would contain a mandatory string. "What's the problem with that", you might ask?. "If it is mandatory, then it will always be filled in the distant object". Not for sure. What if that field is issued from a view instead of a table? And what if that "MandatoryName" field comes from a left join? Then it might just be empty (null) everywhere. And the above statement wont work any-more.
I then tried to do a workaround on this:
--FIRST GET ONLY THE TABLE STRUCTURE CREATED, USING THE WHERE 1 = 0 TRICK
CREATE TABLE MYCOPY AS (SELECT * FROM MYDISTANTOBJECT@MYDBLINK WHERE 1=0);
--THEN REMOVE THE ANNOYING CONSTRAINTS:
DELETE FROM user_constraints WHERE table_name = 'MYCOPY';
--COMMIT THE CHANGES, OTHERWISE IT MIGHT JUST NOT BE CONSIDERED
COMMIT;
--AND FINALLY, FEED THE TABLE:
INSERT INTO MYCOPY SELECT * FROM MYDISTANTOBJECT@MYDBLINK
It worked only for 80% of the views I had to sync. For the 20% left, I encountered various other annoying exceptions and I decided that the whole method was not so efficient.
This is where I started to read about MATERIALIZED VIEWS (formerly called SNAPSHOTS)
These are special views that also appear in your tables list, simply because it really is a local table. Which is meant to be a perfect copy (or snapshot) of the one object you designated.
By default, they are "just that" but they also come with a set of options, some to let them refresh on a certain schedule.
Don't applause immediately: You need the rights to create these MATERIALIZED VIEWS. And they are not a combination of CREATE TABLE + CREATE VIEW! So you will need to ask your dba for it, and maybe you'll include the link to my blog to defend your case, because starting from here, it is peace of cake!
So. To create an exact copy of an object, the syntax should be :
CREATE MATERIALIZED VIEW MYCOPY AS SELECT * FROM MYDISTANTOBJECT@MYDBLINK
That's where I got very disappointed for a few minutes. because, guess what: it appear it is not working from a DBLINK.
But I tried this:
CREATE VIEW TEMP AS SELECT * FROM MYDISTANTOBJECT@MYDBLINK;
CREATE MATERIALIZED VIEW MYCOPY AS SELECT * FROM TEMP;
And it worked :-)
That was almost perfect to me. But I wanted to get a simple snapshot and not to refresh it automatically, so I added a drop statement to only keep the copy:
CREATE VIEW TEMP AS SELECT * FROM MYDISTANTOBJECT@MYDBLINK;
CREATE MATERIALIZED VIEW MYCOPY AS SELECT * FROM TEMP;
DROP TEMP;
Then I thought it would be useful to have some time stamp of the moment each records where copied:
CREATE VIEW TEMP AS SELECT * FROM MYDISTANTOBJECT@MYDBLINK;
CREATE MATERIALIZED VIEW MYCOPY AS SELECT T1.*,systimestamp as date_sync FROM TEMP T1;
DROP TEMP;
Notice that I had to alias the TEMP table to make it work.
Then I thought it would be useful to put that into a procedure:
CREATE OR REPLACE PROCEDURE CREATE_DBLINK_SNAPSHOT
(
SOURCE_NAME IN VARCHAR2;
COPY_NAME IN VARCHAR2;
) AUTHID CURRENT_USER AS
DECLARE
statement varchar2(255);
BEGIN
statement := 'CREATE VIEW TEMP_'||COPY_NAME||' AS SELECT * FROM '||SOURCE_NAME;
EXECUTE IMMEDIATE statement;
statement := 'CREATE MATERIALIZED VIEW '||COPY_NAME||' AS SELECT * FROM TEMP_'||COPY_NAME;
EXECUTE IMMEDIATE statement;
statement := 'DROP VIEW TEMP_'||COPY_NAME;
EXECUTE IMMEDIATE statement;
END CREATE_DBLINK_SNAPSHOT;
I had to ad the AUTHID CURRENT_USER to ensure that this procedure is being executed under the same role I'm using. I also had to create that procedure out of any package because I could not find a way to make it work in a package.
So then I just need to run:
CREATE_DBLINK_SNAPSHOT('MYCOPY','MYDISTANTOBJECT@MYDBLINK');
Or, if I need to write SQL instead of plsql:
SELECT CREATE_DBLINK_SNAPSHOT('MYCOPY','MYDISTANTOBJECT@MYDBLINK') FROM DUAL
In my case I had to write more consequent sets of CREATE and DROP statements together, so I found EXECUT IMMEDIATE quite annoying when f.e. launching a drop statement on something already dropped and then getting an exception and the execution stopped. Then I wrote my own procedure to ensure code execution continuity on these non-fatal errors:
CREATE OR REPLACE PROCEDURE EXECUTENOERROR
(
TOEXECUTE IN VARCHAR2
) AUTHID CURRENT_USER AS
BEGIN
BEGIN
EXECUTE IMMEDIATE TOEXECUTE;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line ('ERROR: ' || DBMS_UTILITY.FORMAT_ERROR_STACK);
DBMS_OUTPUT.put_line (TOEXECUTE);
NULL; -- Ignore it
END;
END EXECUTENOERROR;
I really had a good day today. I hope these suggestions will brighten others day too :-)
Regards,
Laurent
Monday, January 25, 2010 1:25:05 PM
Belgacom arnaque retards frais remise en service v
Envoyé à Belgacom, presque tel quel:
A Belgacom
A l'attention des personnes responsables
Concerne: "ma boite"
Madame, Monsieur,
En tant que client de Belgacom depuis plus de 10 ans, (je vous écris aujourd'hui en tant que gérant d'entreprise, mais j'étais moi même propriétaire du compte récemment transféré), j'estime qu'il est temps de consigner par écris le sentiment grandissant d'être un moins que rien à vos yeux. 10 ans que je paie chaque mois (avec parfois des retards certes, mais qui sont ridicules comparés à ceux auxquels je suis confronté chaque jour dans mon métier) vos services, sans broncher. Et pourtant, aujourd'hui, je suis traité comme le dernier des escrocs, et votre "système informatique" semble être à chaque instant l'ultime excuse qui justifie vos actes s'apparentant de plus en plus à de la pure malhonnêteté.
A chaque fois que j'ai eu des difficultés de paiement, vous avez enclenché la machine: rappels facturés, menaces immédiates de service minimum et coupure, bref, tout le tsoin tsoin habituel, le tout pour moins de 60 jours de retard. A chaque fois que je pouvais anticiper la situation j'ai contacté vos services, et demandé avec toute la courtoisie nécessaire un plan d'apurement la fois ou ma situation financière était vraiment devenue critique. Bref, je pense avoir réagis à vos menaces de coupure avec objectivité et responsabilité. En échange de cela, au tout début, j'avais droit à un minimum de respect et de confiance. J'annonçais un paiement et je tenais comme toujours ma promesse, souvent même j'appelais après m'être assuré d'avoir fait partir l'argent, et parfois, pas toujours mais parfois, une personne avait la gentillesse de bien vouloir me croire sur parole et mes lignes se remettaient à fonctionner dans les heures ou le jour qui suivait. C'était le "bon vieux temps", en tout cas comparé à aujourd'hui.
Après tout, j'ai toujours été bon client chez vous: Adsl office, plusieurs lignes téléphoniques, si l'on exclue le fait qu'il m'arrivait d'être en retard de paiement, on peut raisonnablement dire que je vous ai rapporté une somme tout à fait rondelette, ridicule certes à votre échelle, mais je suis certain que vos tableurs corroboreront le fait que je dépasse largement le forfait moyen qu'un belge vous rapporte.
Qu'ai-je reçu en échange? A titre personnel, rien d'autre que des ennuis. En tant que client –comme un autre- de votre service: Des temps d'attente toujours plus longs, un site Internet toujours plus enclin à ne pas vous renseigner sur des moyens alternatifs de contact, qui ne consisteraient pas à attendre patiemment la magnanimité d'un de vos collaborateurs, parfois comme aujourd'hui des heures durant, et en ayant à souffrir de l'incroyable inélégance de se faire raccrocher "au nez" avant même d'avoir commencé une conversation.
Heureusement tout n'est pas noir: Car lorsque l'on a la chance d'avoir quelqu'un en ligne, très souvent, l'on tombe effectivement sur une personne très agréable. Et de s'en vouloir alors de n'avoir que des reproches à proférer. "Désolé Madame, si je vous fais partager mon ressenti, vous pensez-bien que j'ai plaisir à parler avec vous mais, comprenez-vous, vous me volez". Voilà, en gros, le genre de pirouettes qu'il nous faut, nous, utilisateurs, ou victimes, accomplir: Rester courtois nous aussi alors qu'après tout, nous n'avons pas demandé à parler à une personne courtoise, nous avons composé ce numéro car vous ne nous laissez pas l'alternative. Nous l'avons fait en dernier recours, et depuis un téléphone qui marche encore et qui n'est donc certainement pas le notre, puisque votre numéro à beau être gratuit, il ne fonctionne évidemment pas depuis le poste coupé. D'ailleurs, depuis peu, inutile, s'il on est vraiment bon client chez vous, d'essayer depuis le GSM. Lui aussi nous enverras sur les roses. Quel synchronisme. Quelle élégance. Ah, si le zèle que vous placez dans l'élaboration de vos routines de dissuasion pouvait se voir également appliqué à d'autres lignes de codes de vos sacro-saintes applications, car à en croire vos collaborateurs, ce sont elles, les ultimes décideuses, et c'est par elles que nous, vils clients, seront jugés.
Mais revenons à nos moutons. Quelques lignes plus haut je vous accuse littéralement de vol. Retenez vos hordes d'avocats, car je vais ici préciser ma pensée et ils ne pourront plus rien contre moi: Voici les faits: Depuis plus de 5 ans, il apparaît que votre application de facturation facture automatiquement 40 € de frais de remise en service pour chaque ligne coupée. Chaque ligne? Non, plutôt chaque numéro. Ce qui, évidemment, rentre en conflit avec les conditions générales, lesquelles parlent de lignes. Dans mon cas, ca fait varier les frais de 120 €. Autant dire que si j'ai plus de 3 mois de vache maigre devant moi, je suis foutu. Car comme aujourd'hui, je me retrouve avec l'impossibilité de vous régler toutes les factures, notamment car vous tentez pour la ixième fois de m'y voler 120€.
Le mot voler vous choque? Moi plus. Je suis moi-même développeur d'applications. Rassurez vous, je commets des erreurs, comme tout le monde. Et de temps en temps, les utilisateurs me renseignent ces erreurs. Et je peux les corriger. Parfois il faut des semaines. Parfois des mois. Jamais des années. Je considère, même si c'est totalement subjectif, qu'au bout de 5 ans du même scénario qui se répète et se répète, il semble que vous soyez à présent plus que conscients de cette erreur. Et elle est toujours là. Vous facturez donc tous les mois à des dizaines (ou des centaines, ou des milliers?) de personnes des frais de réactivation que vous ne pouvez pourtant justifier. Combien d'entre eux ne se rendent pas compte de l'erreur?
Bref. J'appelles donc votre service et encode le paiement effectué (le 22?), pour me ramasser dans la figure un message dont je ne me rappelles plus de l'exact contenu, mais qui semblait signifier, en gros, que, venant de moi, mes promesses ne valent rien. C'est assez fabuleux, par ailleurs. Car s'il y a bien quelqu'un d'honnête dans l'histoire, c'est moi. Jamais ile ne me viendrait à l'idée d'assurer avoir fait un paiement sans l'avoir fait réellement. Agaçant, certes, car un client parfait est certainement un client qui paies toujours à temps, mais honnête. Et pourtant, me voilà considéré comme indigne de confiance. Commercialement, je vous dit bravo.
J'appelles alors aujourd'hui l'une de vos collaboratrices, et malgré toute sa gentillesse elle ne parvient pas à obtenir que ma ligne re-fonctionne. Pas sans payer le solde de la facture suivante. Et tant pis si c'est impossible. Je ne vous cache pas que si le 22 j'avais eu une facture de non pas 352€ mais 232€ j'aurais peut-être été en mesure de tout régler sur le moment.
En passant, figurez-vous qu'il a fallu 3 mois pour migrer mes lignes vers ma sprl, et durant ces 3 mois vous tentiez donc de prélever des domiciliations sur un compte sans provision. Là aussi, je suis celui qui en as payé les frais. Et quels frais.
Je passe sur la légèreté avec laquelle les innombrables problèmes techniques ont plu sur mon nouvel abonnement Belgacom TV. Lequel n'as tout simplement pas fonctionné pendant presque deux mois, sans compensation, sans excuses, sans suivi, et surtout sans nouvelles. Tout comme le mois gratuit pour découvrir tous les bouquets: Là aussi, je l'ai eu dans l'os. Encore fallait t'il que ca fonctionne. Je ne passe pas, par contre, sur les deux dernières locations faites sur la Belgacom TV: Les films n'avaient tout simplement plus de son au bout de quelques minutes. Merci de bien vouloir créditer mon compte en conséquence. Et si vos applications ne me font pas confiance, car elles ne me connaissent que depuis 10 ans, elles peuvent probablement aller fouiner du côté des logs files et constater que je ne peux pas voir un film en 10 minutes.
Bref, la conséquence de tout ceci est que je vais, dans la mesure du possible et compte tenu du monopole technique dont vous disposez, tenter d'avoir le strict minimum chez vous. Il y a 1 ans ou un peu plus j'avais déjà migré ma connexion ADSL chez la concurrence, voyant mon forfait téléchargement exploser chez vous systématiquement. Aujourd'hui je me débarrasse à grands regrets de tous mes numéros et lignes téléphoniques sauf une.
Je souhaite donc:
Que le numéro supplémentaire MSN "X" devienne ma ligne principale (analogique).
Que l'ISDN soit résilié, lui, et tous les numéros qui y sont liés à l'exception du "X" transféré plus haut.
Que l'abonnement adsl over isdn à edpNET soit migré vers adsl over pstn sur une raw copper line.
De la sorte, et cela m'as été confirmé par l'une de vos collaboratrices, il ne me seras plus jamais réclamé de montants malhonnêtes pour réactiver mes lignes, et j'aurai les moyens financiers de payer deux factures d'affilée. Car je ne supporte plus d'alimenter vos caisses pour ne recevoir que du mépris et de l'indifférence en échange, je n'utiliserai plus jamais la déviation d'appel pour transférer tous mes clients sur mon GSM.
Je doute fort que tout ceci puisse ne fût ce que faire broncher le moindre commercial chez vous. Je ne vais pas réécrire l'histoire de David et Goliath. Il n'empêche que cela fait du bien. Je vai aussi publier ca sur un blog, histoire de contribuer modestement à votre réputation, déjà faite mais à entretenir.
Toutes mes félicitations à ceux et celles, chez vous, qui ont contribué à vous conduire où vous êtes aujourd'hui: Loin de nous.
Et à propos, vous direz à vos collègues du marketing que j'ai une petite variante sympa pour eux: "Belgacom vous emmènes, en bateau. Mettez les voiles".
Tuesday, November 24, 2009 9:49:57 AM
QueryToArray QueryToStore ExtJS Store Array serial
Before I decided to write this function, I found a way arround:
Temp=deserializeJSON(serializeJSON(MyQuery));
MyStore=MyQuery.data;
That gives me exactly what I need, But then, the "not so great because it alters your data without asking and it would have been nice to be able to tell him not to" serializeJSON() turn your postal codes and boleans into numbers, and your dates into localized user friendly sentences, which is realy not optimal when you try to send pure data to ExtJS!
That's why I created this function, which I'm using in combination with encode(), the old JSON custom function available arround who don't mess with your data types.
<cffunction name="QueryToStore" access="public" output="false"
hint="This turns a query into an array of arrays, first one with columns, second with arrays of data, suitable for ExtJS Store">
<cfargument name="Data" type="query" required="yes" />
<cfscript>
// Define the local scope.
var LOCAL = StructNew();
// Get the column names as an array.
LOCAL.Columns = ListToArray( ARGUMENTS.Data.ColumnList );
// Create a structure that will hold the Store.
LOCAL.Store.columns = LOCAL.Columns;
// Create a second array for the data
LOCAL.DataArray = ArrayNew(1);
// Loop over the query.
for (LOCAL.RowIndex = 1 ; LOCAL.RowIndex LTE ARGUMENTS.Data.RecordCount ; LOCAL.RowIndex = (LOCAL.RowIndex + 1)){
// Create an array for this row
LOCAL.Row = ArrayNew(1);
// Loop over the columns in this row.
for (LOCAL.ColumnIndex = 1 ; LOCAL.ColumnIndex LTE ArrayLen( LOCAL.Columns ) ; LOCAL.ColumnIndex = (LOCAL.ColumnIndex + 1)){
// Get a reference to the query column.
LOCAL.ColumnName = LOCAL.Columns[ LOCAL.ColumnIndex ];
// Store the query cell value into the array by key.
LOCAL.Row[ LOCAL.ColumnIndex ] = ARGUMENTS.Data[ LOCAL.ColumnName ][ LOCAL.RowIndex ];
}
// Add the row array to the data array.
ArrayAppend( LOCAL.DataArray, LOCAL.Row );
}
// Add the Data array to the query array
LOCAL.Store.data = LOCAL.DataArray ;
// Return the store
return( LOCAL.Store );
</cfscript>
</cffunction>
Sunday, September 20, 2009 7:48:11 PM
Profil profile cupidon définition billy goat pers
Sans oublier de lier à la
source, voici, sans détours, comment cupidon me définit:
The Billy Goat
Deliberate Brutal Sex Dreamer (DBSD)
Horny. Stubborn. Kinda cute. Slightly immature. And often found on rough terrain. You are The Billy Goat.

You’re lusty, but typically monogamous, and all in all you’re a pretty good boyfriend. In fact, you enjoy relationships, if mostly for the sex and physical companionship. You’d do or say almost anything to get together with someone, but that’s not necessarily a bad thing.
You’re sensitive, you have a certain boyish charm, and you’re eager. Therefore you probably attract girls who are serious about romance. But few who get close to you realize how unready for total commitment you are. People fall for you. Meanwhile, you maintain your emotional distance, and there goes another box of tissues.
You’re perfectly capable of a long-haul relationship, but, right now, dating someone primarily means having a consistent, available, preferably not-too-chatty, hookup. You’re a careful, methodical person, and you work hard at making things work. It’s just that the type of woman most likely to find your strengths endearing is also the most likely type to find your shortcomings heartbreaking. Someone with a similarly laid-back approach to dating would be perfect for you.
Friday, September 18, 2009 11:20:42 AM
Impots fiscalité TVA remboursement taxes charges
Il faut rendre à César ce qui appartient à César:
Après 10 ans de gallère,
Avec à peu près 2 années fiscales contrôlées sur trois (!!), et une moyenne de redressement fiscal de plus de 3000 euros /an depuis ces 10 années,
Avec en moyenne annuelle des revenus bruts de 50000 euros sur lesquels j'ai déjà (hors les redressements) à payer en moyenne 17000 euros d'impots et 8000 euros de charges sociales par an, soit au final un très gentillet 55% d'impots moyen,
J'avoue que mon opinion sur la fiscalité dans mon pays était proche de l'incitation à la révolte, pour ne pas dire légèrement au delà.
Mais là, Mon dernier contrôle fiscal payé (plus de 13000 euros), à peine 1 mois après mon dernier paiement, ils m'ont remboursé les quelque 500 euros de trop payé.
Je sais, c'est normal.
Mais venant d'eux, ca me touche. Beaucoup.
Vous comprenez, c'est la première fois.
C'est peut-être l'occasion de faire un geste, moi aussi:
Un petit merci, au passage, à mes différents contrôleurs de ces 10 années, qui, malgré leurs sourires, ont su se montrer, à chaque fois, aussi impittoyables que mauvais. Un clin d'oeil tout particulier à Madame la contrôleuse de la TVA de Nivelles, dont je ne dépends plus, et à qui je remets la palme de la plus grosse salope du monde, professionellement, j'entends.
Tuesday, February 17, 2009 12:20:59 AM
actifry graisse de boeuf frites belges frite belge
Des vraies frites belges c'est à la graisse de boeuf. Tout le monde ne le sait pas mais c'est comme ca. Or, dans le catalogue de l'Actifry, la graisse de boeuf n'est pas proposée, pour une raison évidente: elle n'est pas liquide à température ambiante!
Qu'à celà ne tiennes, je peux vous assurer avoir réussi à faire des "vraies frites belges" carrément délicieuses en utilisant une ou deux astuces:
Pour y parvenir, il faut constater deux choses:
1) Une frite enrobée de graisse cuira plus vite autour qu'au centre.
2) La graisse de boeuf doit être à l'état liquide pour que ca marche bien dans l'actifry.
Fort de celà, voici comment parfaitement réussir 600 grammes de frites belges:
1) Achetez des pommes de terre à frites et éviter de les couper trop finement, les frites de friteries, ca est pas les mêmes qu'au macdo!
2) Nettoyez les bien à l'eau fraiche, qu'il ne reste pas d'amidon, et essorez les correctement. j'utilise un tamis dans lesquelles je les secoue energiquement. Ca va vite et ca suffit.
3) Placez les dans Actifry pour une première ronde de 5 minutes. (Avec l'expérience et en fonction de la quantité de frites et de la taille de coupe, vous pousserez peut-être jusqu'à 8 voir 10). Durant cette étape les frites vont chauffer et commencer à cuire uniformément, et seront prêtes à recevoir la graisse de boeuf sans que celle ci ne se solidifie.
4) Pendant ce temps, faites fondre l'équivalent de 3 cuillers à soupe de graisse de boeuf. N'hésitez pas à porter la graisse fondue à une température décente (pas juste fondue, assez chaude pour ne pas avoir envie d'y laisser son doigt trop longtemps!!!)
5) Ouvrez l'actifry et dispersez y la graisse fondue. C'est reparti pour 18 à 24 minutes, selon votre gout.
6) Facultatif: Si vous aimez les viandes de friterie (fricandelles, ailes de poulet etc) le moment idéal pour les ajouter se situe 5 minutes après le début de l'étape 5.
Avec un peu d'expérience (du 1er coup c'est pas évident: coupe trop fine, mauvaises patates...) vous obtiendrez des frites qui blufferaient un maitre fritier!
Merci actifry au fait! (Car en fin de compte, tous les avantages d'actifry restent, y compris les frites un peu moins grasses!)
Sunday, January 18, 2009 5:21:54 PM
DREAMWEAVER MX CS3 CS4 DEPENDENT FILES BACKGROUND
For a long time now, I've been -very- frustrated about the "background file activity" behaviour in Dreamweaver. When you try to edit some code on a distant server -Cold fusion for instance-, each dependant file is put on the server each time you ctrl-s your work, taking up to minutes for nothing!
Thanks to
Netdrive, I'm now able to fake a local hard drive instead of an ftp connexion. That means Dreamweaver is no more considering there is "local" and "remote" places, thus each time I save takes only one sec!
That also solves the very annoying issue with dreamweaver trying to overwrite (not telling you) newer files with older ones.
Anyway, now, I can be productive, even with BOM 3 signed utf-8 distant over ftp files!
Thanks, Novell, for your great abandonware!