Siin tuleb nimekiri lahenduskäikudest jaburatele ja võibolla vähem jaburatele tõrgetele, mille otsa olen programmeerimise käigus komistanud.
Aja jooksul on siia lisandunud ka lahendusi vähem jaburatele probleemidele :)
Üldised lingid
C# ja C++ ühendamine:
Üldiselt käib asi nõnda, nagu kirjas siin:
Enda juhtumil lisasin DllImport reale veel CharSet atribuudi a la:
[DllImport("libra.dll", CharSet = CharSet.Unicode)]
Siin paistab olevat aga kasutatud alternatiivset viisi stringide edastamiseks:
Kui tahtsin, et vastus tuleks ka stringina, siis tekitasin deklaratsioonid a la:
typedef char * charptr;
__declspec(dllexport) int c_func3(charptr& result_str); //viimane sisaldab mälu eraldamist
ja
public static extern int c_func([MarshalAs(UnmanagedType.LPStr)] out string result_str);
NB! ref ja out on sarnase kuid erineva tähendusega märksõnad, uuri ise manuaalist... :)
Hiljem tuleb C++ moodulis mälu ka kuidagi vabastada. Selleks ajaks on C# omale juba koopia teinud.
Nagu arvata võis, ilmnes algul mitmeid dokumenteerimata või muidu jaburaid takistusi.
Minul oli neid kaks. Järgnevad kaks leidu aitasid need lahendada.
IE6 ning PNG AlphaImageLoader
Google Analytics
Kui tahad statistikasse lisada infot, mis linkide kaudu inimesed lehelt lahkuvad, siis kasuta infot siin:
Kui Sa seda võtet ei kasuta, siis paljud asjad ei jõua statistikasse ning Time on page võib olla tihti null.
Kui tahad teada, kui tihti külastajad sulgevad browserit ilma klikkimata, kasutan onbeforeunload eventi. Mozilla toetab seda nüüd ka, varemalt võimaldas ainult Internet Explorer seda.
Küsimus:
Me teame, mis on _trackPageview(),
mis funktsioonid on aga _setAllowLinker() ja _trackTrans() - ?
Vastus:
Kuidas saada käsurida enne sisse logimist?
ma ei hakand dll faili muutma, tegin selle registri täienduse, mis oli kommentaarides mainitud: "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\utilman.exe" alla string nimega "Debugger". "utilman.exe" jaotust registris pole, seega tuleb see ise lisada.
"Debugger" stringi väärtuse panin veidi teisiti, kui seal blogis on öeldud, kuna sealne ei töötand minu jaoks, panin:
psexec -accepteula -s -x cmd.exe /c start cmd.exe
kui aga tahad, et käsurida tuleks sisselogitud konto ekraanile, siis pane
psexec -accepteula -s -i cmd.exe /c start cmd.exe
Kui kompunnida, on võimalik asi käivitada ka mõlemal ekraanil näiteks .bat fail oleks lihtne variant nende käskude kokkuühendamiseks.
Võti -accepteula on vajalik, kui ei soovi psexec litsentsi dialoogi esimese käivitamise ajaks jätta, vaid garanteerida, et see üldse ei ilmukski.
psexec.exe pead omale ise hankima, see on veebis vabalt saada.
Kuidas disableda veel süsteemi programme, ilma et peaks neid kustutama või muutma
Näide Sticky Keys. Ilmub lagedale, kui vajutad viis korda shift nuppu. Tüütu.
registrisse:
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\" uus jaotus "sethc.exe"
sinna alla string nimega "Debugger" väärtuseks "dud.exe"
Sarnast asja lubab teha ka
http://www.bernardbelanger.com/computing/NaDa/index.php aga selgub, et selle käivitamiseks on vaja laadida ntvdm.exe, mis kokkuvõttes on ressursikulukam ja näiteks Stiky Keys puhul tooks korraks erkaanile konsooli. dud.exe samas on ehtne windowsi programm ja seda probleemi ei oma.
Jutumärkide kaotamine .bat-failide argumentidelt
Kuupäeva ja kellaaja arvutused .bat-failides
Kuidas kaotada windowsi aknalt sulgemise nupp
Kasuta dokumenteerimata konstanti WS_CLOSEBOX = 0x00080000, analoogselt konstandile WS_MAXIMIZEBOX ja WS_MINIMIZEBOX.
HTML entity'te näitamine dialoogikastides alert() prompt() confirm()
ise kasutan aga järgnevat koodi:
function remove_andamp(str) {
var temp = str;
var re_andamp1 = new RegExp("\\&\\;\\#", "gi"); // is the beginning of html code
temp = temp.replace(re_andamp1, "");
var re_andamp2 = new RegExp("\\&\\;nbsp\\;", "gi");
temp = temp.replace(re_andamp2, " ");
var re_nbsp = new RegExp("\\ \\;", "gi");
temp = temp.replace(re_nbsp, " ");
return temp;
}
function moz_html_decode(str) {
//kuigi funktsiooni nimi on mul moz_html_decode, rakendub see ka IE ja teiste brauserite puhul. Algselt rakendasin seda funktsiooni, et muuta INPUT väljade väärtusi skripti seest, sel juhul IE ei vajanud konvertimist, Mozilla aga vajab ka sel juhul.
var re_htmlcode;
var out;
var pos;
var entrylen;
var entrychars;
var charcode;
var character;
re_htmlcode = new RegExp("[0-9]{1,4};", "i");
out = "";
pos = str.search(re_htmlcode);
while(pos != -1)
{
out = out + str.substr(0, pos);
str = str.substr(pos);
entrylen = str.search(";") + 1;
entrychars = str.substr(2, entrylen - 3);
charcode = entrychars.valueOf();
character = String.fromCharCode(charcode);
out = out + character;
str = str.substr(entrylen);
pos = str.search(re_htmlcode);
};
out = out + str;
re_htmlcode = new RegExp("[0-9a-f]{1,4};", "i");
str = out;
out = "";
pos = str.search(re_htmlcode);
while(pos != -1)
{
out = out + str.substr(0, pos);
str = str.substr(pos);
entrylen = str.search(";") + 1;
entrychars = str.substr(3, entrylen - 4);
charcode = parseInt(entrychars, 16);
character = String.fromCharCode(charcode);
out = out + character;
str = str.substr(entrylen);
pos = str.search(re_htmlcode);
};
out = out + str;
return out;
}
function my_alert(txt) {
var txt2 = moz_html_decode(remove_andamp(txt));
window.alert(txt2);
} |
Pangalingi tegemine
Pankade info:
Passing variables by reference MATLAB-is
Method for calculating precise logarithm of a sum
Disclosed is a method to compute the precise value of the logarithm of a sum.
A number of practical problems can result in having too big or small values in intermediate values of a calculation... In the case: log (p · q) = log p + log q is very easy to compute, but the problem is then to compute (or approximate) the value of log (p1 + p2) from the value of log p1 and log p2.
C++ for-tsüklite optimeerimine
Nii mõnigi kord on ette teada, et for-tsükkel kestab vähemalt ühe tsükli ning seega ei ole vaja tegelikult tsükli alguses kontrollida, et kas tsükli muutuja on vähem kui piirväärtus.
Visual Studio kompilaator võimaldab kirjutada sellist asja:
int var = 0;
__assert(var < end);
for(; var < end; var++)
{
...
} |
selle võtte mugavamaks kasutamiseks kirjutasin järgmise makro:
#define FORA(var, end) var = 0; __assert(var < end); for(; var < end; var++) |
Analoogselt saab luua rohkemate argumentidega makrosid teistsuguste algväärtuste ja sammudega tsüklite loomiseks.
C# LowerBound
võibolla parem alternatiiv: NStl library
Ruby on Rails mitme välja korraga jälgimine
Exceptionite püüdmine Visual Studio debuggerisse nende toimumise ajal
Bit hacks
Bit hacks - Population Count
* see the above links
Bit hacks - Binary GCD
Erinevate Dictionary/Hashmap-ide jõudluse võrdlus .NET/C# keele jaoks:
Kui Visual Studio Step-In või Step-Over korraga käitub nagu Run: