Sunday, November 8, 2009

__autoload l'include killer de php

Php dans sa version 5 a une fonctionnalité tres intérressante __autoLoad.

Voici une description de cette fonctionnalité :
Vous pouvez définir la fonction __autoload() qui va automatiquement être appelée si une classe n'est pas encore définie au moment de son utilisation. Grâce à elle, vous avez une dernière chance pour inclure une définition de classe, avant que PHP ne déclare une erreur.

L'idée est de faire un seul fichier php qui va gérer le lien entre nom de classe et aussi fichier ou cette classe est déclarée.
Apres dans toute votre application vous n'aurez besoin de d'appeller que ce meme et seul fichier.
Ainsi vous optimiserez le chargement de classe php dynamiquement.

Vous le code permettant de génerer le fameux fichier ici class/autoload, en imaginant que vos classes sont dans le repertoire class:

$phpFile = scandir("class");

$result ="foreach($phpFile as $filename)
{
if ($filename != ".." && $filename != ".")
{
$content = file_get_contents("class/".$filename);
while(true)
{
if(eregi("class ([a-z_A-Z0-9]+)([ \n\t]+){",$content,$regs))
{
$result .= "\$";
$result .= "arrayClassFilename[\"".$regs[1]."\"] = \"".$filename."\";\n";
$content = substr(stristr($content,"class "),5);
}
else
{
if(eregi("class ([a-z_A-Z0-9]+)([ \n\t]*) extend",$content,$regs))
{
$result .= "\$";
$result .= "arrayClassFilename[\"".$regs[1]."\"] = \"".$filename."\";\n";
$content = substr(stristr($content,"class "),5);
}
else
{
break;
}
}
}
}


}
$result.="\nfunction __autoload(\$class_name) {
global \$arrayClassFilename;
if (isset(\$arrayClassFilename[\$class_name]))
{
require_once \"class/\".\$arrayClassFilename[\$class_name];
}
}
?>";
file_put_contents("class/autoload.php",$result);
?>

Friday, June 19, 2009

Fonction pour convertir IplImage en grayscale sans passer par cvCvtColor

Un petit article sur OpenCV.
Apres avoir rechercher comment convertir une IPLImage en grayscale et si possible sans passer par cvCvtColor, j'ai reussi à le faire et je le partage avec vous.

Fonction pour convertir IplImage en grayscale sans passer par cvCvtColor/
Dans cette fonction, il y a aussi comment accéder au pixel d'une IplImage.


IplImage *GrayscaleConvert(IplImage* cimg)
{
int x,y;
int nbChannel = cimg->nChannels;
int iwd =cimg->widthStep;
IplImage* result=cvCloneImage(cimg);
char *idtS =cimg->imageData;
char *idtD =result->imageData;
uchar* pixelS_ptr;
uchar* pixelD_ptr;


for(x=0;xwidth;x++)
{
for(y=0;yheight;y++)
{
pixelD_ptr = &((uchar*)(idtD + iwd*y))[x*nbChannel];
pixelS_ptr = &((uchar*)(idtS + iwd*y))[x*nbChannel];

uchar grey = ((float)pixelS_ptr[0])*0.114 + ((float)pixelS_ptr[1])*0.587 +((float)pixelS_ptr[2])*0.299;

pixelD_ptr[0] = grey;
pixelD_ptr[1] = grey;
pixelD_ptr[2] = grey;
}
}
return result;
}

Wednesday, June 17, 2009

Premier Article sur Prado...

Voici un petit article sur Prado.
Prado est un framework PHP qui me semble interressant, car il change un peu d'autre
qui sont abscons, parfois frustrant, car interressant mais dur a exploité.

J'ai tout d'abords essayé avec Symphony,Zend, et finalement CakePhp.
je suis arrivé a faire des choses , puis a un moment je me suis retrouvé bloqué betement
par manque du connaissance du Framework.Et la .... j'ai galeré...

J'espere que Prado repondra plus a mes espérences, et surtout qu'il y a des formulaires
avec des validations javascripts simple et des concepts de callbacks tres interressant et
qui se rapproche plus a des applications classiques.( genre WinForm C# ).

Bon Prado utilise un systeme de template associé a une classe Php ( TPage ).
Ce qui est interressant, c'est que il y a un grand nombre de classe encapsulant les concepts HTML.

Voici une vue sur le frameWork
http://www.pradosoft.com/docs/manual/

Je configure mon appli avec dans application.xml :
service id="page" class="TPageService" DefaultPage="Home">

Bon, je fais un petit test:
Home.php:

class Home extends TPage
{
public function onPreInit($param)
{
parent::onPreInit($param);
echo "onPreInit";
}

public function onInit($param)
{
parent::onInit($param);
echo "onInit";
}
}


Home.page

title>Welcome to PRADO/title>


h1>Welcome to PRADO!/h1>


/span>

Et la j'ai effectivement afficher en premier :

onPreInitonInit

Welcome to PRADO!

...
L'interet aussi c'est que l'on n'a pas besoin de passer par le framework pour acceder a la base de donnée .

http://www.pradosoft.com/wiki/index.php/Simplified_Database_Authentication_Tutorial

On peut utiliser uniquement le systeme de template.

Le systeme de template semble etre semblable a ASP enfin je crois :

< %# donnée ou membre % >
< %= function, ou methode % >

Suite au prochain numéro.

Sunday, February 8, 2009

HtmlDocument Introspection in Treeview article

J'ai publié aujourd'hui un nouvel article sur codeproject qui s'appelle
HtmlDocument introspection in TreeView.

Article traitant du composant webbrowser et de sa propriété Document.
Ainsi on connait facilement l'ensemble des tag, des elements de formulaire, les liens, les images et aussi les css referant a la page web.

Wednesday, February 4, 2009

Parsing de float avec localisation US, la maudite virgule francaise.

Un post pour partager un soucis que j'ai souvent rencontré, c'est de parser un float anglais, alors que je suis francais.
Effectivement en france, un nombre décimal s'écris avec une virgule exemple : 92,65
alors que les anglais et les américains l'écrivent 92.65
De nombreux logiciels ne prennent pas en compte ce détail culturel. Un détail peut être , mais en informatique souvent un bug possible.

je voulais extraire les nombres des chaines :
"Selector 21 | Property 61
Input size: 1.609KiB Output size: 1.26KiB Compression ratio: 21.72%"

Pas de soucis ,j'utilise le FrameWork dotnet avec les expressions régulieres, sachant que le format est toujours le même, pour ce faire, mais lorsque je veux convertir
1.609 en float j'ai une exception soulevé car windows veux 1,609 pour que la conversion soit effective.

Il faut utiliser :

using System.Globalization

Donc j'ai du faire de la sorte :

Regex regex = new Regex("([0-9]+)");
MatchCollection m = regex.Matches(lstStr[1]);
if (m.Count >= 2)
{
// Selector 21 | Property 61
selector = Int32.Parse(m[0].Groups[0].Value);
property = Int32.Parse(m[1].Groups[0].Value);
}

regex = new Regex("([0-9]+).([0-9]+)");
//"Input size: 1.609KiB Output size: 1.26KiB Compression ratio: 21.72%\r"
m = regex.Matches(lstStr[2]);
if (m.Count >= 3)
{
// Gets a NumberFormatInfo associated with the en-US culture.
NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;

inputSize = float.Parse(m[0].Groups[0].Value,nfi);
outputSize = float.Parse(m[1].Groups[0].Value, nfi);
radio = float.Parse(m[2].Groups[0].Value, nfi);
}


Voila j'ai utilisé
// Gets a NumberFormatInfo associated with the en-US culture.
NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;

pour forcer le Framework a parser les floats au format US.

Reference MSDN

Tuesday, February 3, 2009

Process usage en C# avec redirection.

Les unixiens connaissent bien le concept de redirection de la sortie resultant d'un processus.
Ceci est lié à des processus en mode console.
Un processus en mode console a une entrée standart , une sortie standart et une sortie erreur standart ( suivé le lien pour plus d'explication ).

Ainsi les processus Windows peuvent caché aussi ce concept , mais cependant dans l'api DotNet, on retrouve ce concept.

Voici le code, ici pour csstidy :

Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = "csstidy.exe";
process.StartInfo.Arguments = cssFilemane + " outputtidy.css";
process.Start();

result = process.StandardOutput.ReadToEnd();
error = process.StandardError.ReadToEnd();


Vous aurez ainsi dans result le texte de sortie du processus.
Si l'on veux scruter ce qu'il se passe dans le processus et par exemple ce dernier montre
son avancement avec la sortie de # par exemple.
On lira la sortie du processus :

while
((str = process.StandardOutput.ReadLine()) != null)
{
}
Regardez cette article pour plus de détail
http://www.codeproject.com/KB/threads/launchprocess.aspx

Monday, December 1, 2008

Lecture des fichiers SWF en C#

J'ai publié sur codeproject.com un article pour lire l'entête d'un fichier SWF.

J'ai trouvé un article permettant de faire plus de chose :

http://blogs.msdn.com/mswanson/archive/2006/10/15/example-c-code-for-reading-flash-swf-files.aspx

Bravo a son auteur.