Jan 29

Screenshot of an Entire Page

Captured Using Page SaverPearl Crescent Page Saver is an extension for Mozilla Firefox that lets you capture images of web pages, including Flash content.

These images can be saved in PNG or JPEG format. Using Page Saver, you can capture an entire page or just the visible portion. You can control the image capture process via a wide variety of settings, including the image file name and scale (e.g., save at 50% of original size).

Source: here

Jan 29

HTML Regex Data Extractor

This extension is useful for those who want to test the regular expression on the live HTML content.
They can also use their custom content.

Usage :
- Press Alt-R to test with your custom content
- Press Ctrl-U or right-click and choose “View Page Source” to test with HTML source of current page
- When you are viewing the source code, to show/hide the Regular Expression Bar, on Toolbar, choose View -> RegexHTML

Source : here

Jan 26

How does it work?

Rather than creating a SWFUpload instance and assigning handlers directly, it associates the SWFUpload instance with an element in the DOM, and all events handlers are bound to that DOM element.

Live Examples

Here are some live examples you can pull apart. Although the UI is not pretty, it demonstrates how you listen to events, and from there you can create whatever UI you want.

Download source here

Jan 26

Editing Methods

Editing functionality is applied to selected page content through scripts that apply the document.execCommand() method. Parameters are passed to this method giving the edit command to apply. The general format for the execCommand() method is shown below. It is applied through the document object.

document.execCommand("command" [,0] [,"value"])
<button title="Bold"
  onclick="document.execCommand('Bold')">
  <img src="Bold.gif"/>
</button>

Editing Commands

All of the available editing commands are too numerous to list here. The following table gives a sampling of what types of editing can be applied to selected text a page.

Command Description

document.execCommand(“BackColor“,0,”color“)
Sets the background color of the selected element; color
is a color name or hexadecimal value.

document.execCommand(“Bold“)
Sets the current selection to bold style.

document.execCommand(“Copy“)
Copies the current selection to the clipboard.

document.execCommand(“CreateLink“)
Displays a dialogue box for entering a URL which is applied to the selected text.

document.execCommand(“Cut“)
Cuts the current selection to the clipboard.

document.execCommand(“Delete“)
Deletes the current selection.

document.execCommand(“FontName“,0,”name“)
Sets the font face of the current selection; name
is a font name.

document.execCommand(“FontSize“,0,”size“)
Sets the font size of the current selection; size
is an integer from 1 (smallest) to 7 (largest).

document.execCommand(“ForeColor“,0,”color“)
Sets the text (foreground) color of the selected element; color
is a color name or hexadecimal value.

document.execCommand(“Indent“)
Increases the indent of the selected text by one indentation increment.

document.execCommand(“InsertImage“,1)
Displays a dialogue box for selecting and positioning a graphic image.

document.execCommand(“InsertMarquee“)
Inserts an empty marquee for entering displayed text.

document.execCommand(“InsertOrderedList“)
Formats an ordered list of current selection.

document.execCommand(“InsertUnorderedList“)
Formats an unordered list of current selection.

document.execCommand(“Italic“)
Sets the current selection to italic style.

document.execCommand(“JustifyCenter“)
Centers the text block in which the current selection is located.

document.execCommand(“JustifyFull“)
Justifies the text block in which the current selection is located.

document.execCommand(“JustifyLeft“)
Left justifies the text block in which the current selection is located.

document.execCommand(“JustifyRight“)
Right justifies the text block in which the current selection is located.

document.execCommand(“Outdent“)
Decreases the indent of the selected text by one indentation increment.

document.execCommand(“Paste“)
Pastes the current clipboard contents to current selection.

document.execCommand(“Print“)
Opens the print dialog box so the user can print the current page.

document.execCommand(“RemoveFormat“)
Removes all formatting from current selection.

document.execCommand(“SelectAll“)
Selects the entire document.

document.execCommand(“StrikeThrough“)
Sets the current selection to strike-through style.

document.execCommand(“Subscript“)
Sets the current selection to subscript style.

document.execCommand(“Superscript“)
Sets the current selection to superscript style.

document.execCommand(“Underline“)
Sets the current selection to underline style.

document.execCommand(“Unlink“)
Removes any hyperlink from the current selection.

document.execCommand(“Unselect“)
Clears the current selection.
Jan 26

The line-layering technique uses no images and no javascript, only display: block bold tags layered on top of each other. We simply create lines with decreasing side margins, stick them on top of each other and we have a well-emulated round corner.

.b1f, .b2f, .b3f, .b4f{font-size:1px; overflow:hidden; display:block;}
.b1f {height:1px; background:#ddd; margin:0 5px;}
.b2f {height:1px; background:#ddd; margin:0 3px;}
.b3f {height:1px; background:#ddd; margin:0 2px;}
.b4f {height:2px; background:#ddd; margin:0 1px;}
.contentf {background: #ddd;}
.contentf div {margin-left: 5px;}


<b class="b1f"></b><b class="b2f"></b><b class="b3f"></b><b class="b4f"></b>
    <div class="contentf">

        <div>Round FILL!!</div>
    </div>
<b class="b4f"></b><b class="b3f"></b><b class="b2f"></b><b class="b1f"></b>

Din cauza framework-ului wordpress se injecteaza tag-urile HTML in editor, de acea nu pot sa afisez corect exemple, le puteti vedea [ aici ]

Round Border!!

Jan 13

La un moment dat am avut nevoie de a accesa un serviciu ssl din php folosind cURL. NU intentionam sa folosesc cURL, dar asta folosea PEAR : SOAP. Dupa mai mutle incercari, gaseam eroarea de ssl, de certificat invalid.

Rezolvarea e una simpla : Dezactivam din cURL verificarea PEER (CURLOPT_SSL_VERIFYPEER), insa nu e elegant.
Metoda eleganta presupune insa, salvarea certificatului si trimiterea lui in requestul cURL.

Trimiterea se face astfel :

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, 'fisierul in care se tine certificatul salvat in format PEM');

Fisierul trebuie sa fie salvat in format X.509 Certificate (PEM). Asta se paote face din browser, la view certificate/export.

Ce facem insa cand aplicatia ruleaza si se depaseste expire date ?
Folosind functiile php stream, putem accesa certificatul. Cu ajutorul extensiei openssl il putem salva.


$url = 'url'; //url-ul care necesita certificatul ,fara protocol.
$context = stream_context_create();
$res = stream_context_set_option($context, 'ssl', 'capture_peer_cert', true);
$res = stream_context_set_option($context, 'ssl', 'verify_host', true);
if ($socket = stream_socket_client("tls://$url:443/", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context))
{
    if ($options = stream_context_get_options($context))
    {
      if ( isset ($options['ssl']) && isset ($options['ssl']['peer_certificate']))
      {
        $keyinfo = openssl_x509_export_to_file($options['ssl']['peer_certificate'], 'file to save to');
      }
    }
}

Data de expirare a certificatului curent se poate lua astfel :

$keyinfo = openssl_x509_parse(file_get_contents($filename));
var_dump($keyinfo['validTo']);

Data este in format YYMMDDHHMMSS.

Spor la conectare SSL.

Dec 7

Va propun o metoda de a pune un watermark pe o imagine in PHP. In principiu functia primeste ca parametrii imaginea sursa (locatie), locatia destinatie, watermarkul (locatie imagine), si calitatea jpeg.

Va returna Boolean, iar in cazul TRUE va salva un jpeg cu watermark din imaginea initiala. Functia se foloseste de libraria GD inclusa in php si accepta orice fel de tip de imagine pe care o poate recunoaste aceasta.

Watermarkul este pus in coltul din dreapta jos, dar asta se paote modifica dupa bunul plac.

function set_watermark($source, $dest, $watermark, $quality = 80)
{
  if (func_num_args() < 3)
  {
    $set_watermark_error = "Insufficient parameters supplied!";
  }
  else
  {
    if (file_exists($source))
    {
      if ($src = imagecreatefromstring(file_get_contents($source)))
      {
        $info = getimagesize($source);
        imageantialias($src, true);
        if ($wm = imagecreatefromstring(file_get_contents($watermark)))
        {
          $wm_info = getimagesize($watermark);
          imagealphablending($src, true);
          imagecopy($src, $wm, $info[0]-$wm_info[0]-5, $info[1]-$wm_info[1]-5, 0, 0, $wm_info[0], $wm_info[1]);
          if (imagejpeg($src, $dest, $quality))
          {
            if (file_exists($dest))
            {
              chmod($dest, 0777);
              return true;
            }
            else
            {
              $set_watermark_error = 'Unable tosaveimage! ';
            }
          }
          else
          {
            $set_watermark_error = 'Unable tosaveimage! ';
          }
        }
      }
      else
      {
        $set_watermark_error = 'Unrecognized imageformat! ';
      }
    }
    else
    {
      $set_watermark_error = 'Source filedoesnotexist! ';
    }
  }
  return false;
}

Functia mai poate fi customizata pentru a intoarce si alte tipuri de imagine, dar lasam asta la alegerea fiecaruia.

Dec 3

In multe situatii cand se migreaza o baza de date de pe un server pe altul (in special cand este vorba de o migrare de pe o versiune inferioara de Microsoft SQL cum ar fi SQL 2000 sau SQL 2005) puteti avea surpriza neplacuta ca query-urile si procedurile existente sa va mearga mult mai lent. Este vorba despre o migrare prin backup si restore. De obicei se migreaza pe un server mai nou, mai puternic si mai recent pentru a obtine un spor de performanta. Si, supriza, ajungeti sa descoperiti ca merge mai greu decat serverul vechi. In cazul nostru, erau de exemplu niste proceduri care pe serverul vechi (MS SQL 2000) se executau in aproximativ 11 de secunde si pe serverul nou (MS SQL 2008) ajungeau sa se execute in mai mult de 2 minute. Ce era mai interesant, este ca timpul de executie varia aleator, intre 1:40 minute si 2:30 minute. Aceasta situatie ajungea sa genereze timeout-uri si probleme.

Solutia sau mai bine zis solutiile sunt de fapt optimizarea pentru SQL 2008 prin setarea compatibilitatii, refacerea statisticilor si a index-urilor pe tabele si recompilarea procedurilor. Nu este necesar nici un fel de schimbare de cod, trebuie doar sa umblati la niste optiuni si sa rulati niste comenzi. Prezentat mai in detaliu, trebuie facuti urmatorii pasi:

MS SQL Server 2008

Pasul 1: Setarea AWE pe Server si Minimum respectiv Maximum Server Memory (necesar doar in anumite configuratii, in special cele pe 32 de biti, pentru mai multe detalii vedeti AICI)

Pasul 2: Schimbarea compatibilitatii bazei de date pe SQL 2008.
Pentru a beneficia la maxim de avantajele si imbunatatirile oferite de MS SQL 2008, daca faceti migrarea de pe o versiune mai veche de MS SQL, trebuie setat nivelul comatibilitatii bazei de date pe 2008. Pentru asta dati click dreapta -> Properties in SQL Management Studio pe baza de date noua pe care ati dat restore. Aici schimbati in Options, Compatibility Level pe valoarea “SQL Server 2008 (100)”. Nu trebuie sa va faceti griji caci tot ce ati facut pana acuma va fi compatibil in continuare fiind foarte situatiile cand aceasta setare ar putea cauza probleme.

Pasul 3: Recompilare si actualizarea statisticilor (conform discutiei de AICI)
Acesta mi se pare pasul cel mai important. Refacerea index-ului si a statisticilor pe tabele, reorganizeaza datele pe noul server, le adapteaza conform versiunii mai noi si optimizeaza rularea query-urilor in special in conjunctura cu index-urile pe tabele. Recompilarea procedurilor (care prin comanda de mai jos se va realiza la prima rulare), optimizeaza procedurile si triggerele conform schimbarilor in statistici si in index-uri si astfel le reorganizeaza sa ruleze mai bine. Cel mai bine ar fi sa se ruleze comanda de refacere a index-ului si a statisticilor, respectiv recompilarea, si dupa ceva timp de folosire cand chiar exista niste date relevante, un istoric si dinamism al tabelelor pe baza carora sa genereze niste statistici relevante, sa ajusteze index-ul corespunzator si evident si procedurile care le folosesc. Detalii suplimentare si o explicatie pe exemplu despre index si statistici gasiti AICI, si continuarea AICI.

Practic trebuie facute 3 lucruri ca sa functioneze totul optim:
- trebuie recompilate tabelele, functiile si procedurile folosind comanda sp_recompile (mai multe detalii despre sintaxa comenzii AICI)
- trebuie refacut indexul tabelelor folosind comanda DBCC DBREINDEX (mai multe detalii despre sintaxa comenzii AICI)
- trebuie actualizate statisticile tabelelor folosind comanda UPDATE STATISTICS cu optiunea WITH FULLSCAN (mai multe detalii despre sintaxa comenzii AICI)
Acesti pasi sunt necesari pentru ca, cele 3 operatii actualizeaza toate informatiile legate de index, statistici si cum sunt compilate datele pentru serverul nou. Conform recomandarii unui prieten mai cunoscator in domeniu ar trebui de fapt dat atat CREATE STATISTICS cat si UPDATE STATISTICS.

Dupa ce am trecut prin toti pasii de mai sus am ajuns sa avem o optimizare la executarea unei proceduri de la peste 2 minute la numai 2 secunde.

O alta recomandare ar fi sa studiati Execution Plan-ul pe toate query-urile si procedurile care dureaza mult si sa vedeti unde puteti optimiza. De exemplu, in situatia noastra, am observat ca sub SQL 2008 (comparativ cu SQL 2000) o functie care lua date generale despre o persoana de mai multe ori de-a lungul mai multor pasi imbricati ai unor proceduri, ajunge sa ingreuneaze executia. Cand nu am mai folosit acea functie ci join-uri explicite cu tabelele implicate am ajuns la injumatatirea anumitor timpi de executie.

Sper sa va ajute ce v-am explicat pana acuma si va urez sa aveti exec-uri si select-uri cat mai rapide :)

LATER EDIT:
Operatiile descrise mai sus de refacere a index-ului si statisticilor unui tabel sunt necesare si in situatia in care se sterg toate intrarile dintr-un tabel si se face un insert rezultat dintr-un select pe alt tabel (nu conteaza daca e in cadrul aceeasi baze de date sau din alta baza de date). Acelasi lucru este valabil daca se actualizeaza multe valori, prin update (peste 40% din totalul randurilor din tabelul respectiv) care au un index asociat.
Din pacate Microsoft SQL Server nu isi da seama automat ca s-a schimbat total continutul tabelului si nu isi recalculeaza aceste valori automat rezultand in niste query-uri care dau erori de timeout (cel putin in cazul apelarii din .Net).

Nov 19

Va propun un cod de extragere de date specifice dintr-un CNP (13 cifre). Aceste date ar putea fi sex, an,luna,zi, data nasterii,judet,nr si crc.

function cnp_extract($cnp, $extract_type)
{
  if (strlen($cnp) == 13)
  {
    $sex = $cnp[0];
    $bd = substr($cnp, 1, 6);
    if ($sex == 1 || $sex == 2) { $sy = 19; }
    elseif ($sex == 3 || $sex == 4) { $sy = 18; }
    elseif ($sex == 5 || $sex == 6) { $sy = 20; }
    $year = $sy.$bd[0].$bd[1];
    $month = $bd[2].$bd[3];
    $day = $bd[4].$bd[5];
    $birthday = strtotime("$year-$month-$day");
    $judet = $cnp[7].$cnp[8];
    $nr = $cnp[9].$cnp[10].$cnp[11];
    $crc = $cnp[12];
    if(isset($$extract_type)
    {
      return $$extract_type;
    }
    else
    {
      return false;
    }
  }
  else
  {
    return false;
  }
}

Astfel callul : cnp_extract($cnp, 'birthday') va intoarce data nasterii.

Jul 21

Install the Compatibility Pack

http://office.microsoft.com/en-us/word/HA100444731033.aspx

Direct download link:

http://download.microsoft.com/download/9/2/2/9222d67f-7630-4f49-bd26-476b51517fc1/FileFormatConverters.exe

« Previous Entries Next Entries »

Powered By Wordpress - Theme Provided By Wordpress Theme - Credit Loan