Archive for the ‘Computer’ Category

SCA-SDO in PHP

Mercredi, août 1st, 2007

Here are some pointer to do SCA and SDO in PHP.

Those are part of a SOA/WOA development. If you’re not familiar with thoses terms here are some simple definitions:

SOA (Service Oriented Architecture) is basically an evolution of distributed computing. SOA provides a modularity of business logic, which can be presented as service for clients (client as in client-server architecture). These services are loosely coupled in nature, in the sense the ‘User Interface’ can remain completely independent of the service layer.

WOA (Web Oriented Architecture) Essentially, WOA describes a core set of Web protocols like HTTP and plain XML as the most dynamic, scalable, and interoperable Web service approach. The only real difference between traditional SOA and the concept of WOA is that WOA advocates REST, an increasingly popular, powerful, and simple method of leveraging HTTP as a Web service in its own right (and carefully devised by the co-creator of HTTP, Roy Fielding.)*

SCA (Service Component Architecture) is a relatively new initiative advocated by major vendors of Java EE technology. Its proponents claim it is more natively suited for the delivery of applications that conform with the principles of service-oriented architecture. As such, SCA components are supposedly more technologically agnostic.

SDO (Service Data Object) is a technology that allows heterogeneous data to be accessed in a uniform way.

Application of thoses principles is a transitional step in the web world. Migration from web 1.0 to web 3.0 thru web 2.0 technologies. ;) http://en.wikipedia.org/wiki/Web_3.0

Now here is the interesting stuff… http://www.osoa.org/display/PHP/SOA+PHP+Homepage this is the SOA PHP Homepage link. A project offering a base to SOA development in PHP using SCA and SDO component technology.

There is some interesting discussion on ZDNet about web 2.0, soa and woa. You could follow them at http://blogs.zdnet.com/Hinchcliffe/?cat=42

Wikipedia references:
SCA SDO in PHP http://en.wikipedia.org/wiki/SCA_and_SDO_for_PHP
SDO http://en.wikipedia.org/wiki/Service_Data_Objects
SCA http://en.wikipedia.org/wiki/Service_component_architecture

* http://blogs.zdnet.com/Hinchcliffe/?p=27

REST et service Web

Mardi, novembre 14th, 2006

Un framework pour développer des services REST en PHP

Vous connaissez REST? Vous connaissez PHP? Si vous avez répondu OUI aux deux questions, vous serez surement intéressés par le lien suivant: http://tonic.sourceforge.net/docs/faq.htmlnull

Il s’agit d’un framework pour le développement de services web en REST à l’aide de PHP.

xmlrpc client (2) - php

Mercredi, juin 22nd, 2005
#!/usr/local/php4/bin/php
 
include "xmlrpc-1.0.99.2/xmlrpc.inc";
 
//First attempt to use XML_RPC calls
//assert( $c=new xmlrpc_client("/", "sundev02.grafsoft.com", 8888) );
assert( $c=new xmlrpc_client("/~jlcyr/rpc_server.php", "192.168.2.21", 80) );
$c->setDebug(1);//never set it to 1 on an agi script..!!
 
////////////////////
// Envoie d'un fichier binaire
/*
$fn = "01.mp3";
$fich = fopen($fn,"rb");
$select = fread($fich,filesize($fn));
echo "filesize:".filesize($fn)."\n";
fclose($fich);
assert( $f=new xmlrpcmsg('doc.putDoc',array(new xmlrpcval($select,"base64"),new xmlrpcval($fn,"string"))) );
assert( $r=$c->send($f) );
$v=$r->value();
if ($r->faultCode())
  {
    //Insert error flag and message into db
    print "Fault: ";
    print "Code: " . $r->faultCode() . " Reason '" .$r->faultString()."'
";
  }
else
  {
    //Dump received return value
    print $v->scalarval();
  }
*/
 
//////////////////
// Demande des infos du RIS
//assert( $f=new xmlrpcmsg('ris.getCMD',array(new xmlrpcval("9999999","string"),new xmlrpcval("2","string"))) );
assert( $f=new xmlrpcmsg('doc.getDocInfo',array(new xmlrpcval("902","string"),
					    new xmlrpcval("fileset200525","string"),
					    new xmlrpcval("filename1.2.3","string"))));
assert( $r=$c->send($f) );
$v=$r->value();
if ($r->faultCode())
  {
    //Insert error flag and message into db
    print "Fault: ";
    print "Code: " . $r->faultCode() . " Reason '" .$r->faultString()."'
";
  }
else
  {
    //Dump received return value
    while (list($key,$item)=$v->structeach()) {
      print $key."=".$item->scalarval()."\n";
    }
  }
 
?>

Serveur XML RPC (2) - PHP

Mercredi, juin 22nd, 2005

<?php // Title: Example de serveur XML-RPC en php // Version: 0.2 // Author: Jean-Luc Cyr  // Desc: Replacement for python xml-rpc server that handle //       imagem phone dictation system and audio-context calls.  // Exemple avec l'extension disponible // http://phpxmlrpc.sourceforge.net/  include "xmlrpc-1.0.99.2/xmlrpc.inc"; include "xmlrpc-1.0.99.2/xmlrpcs.inc";  // Declare global vars  //Setup parameters //Database user name $duser = "transcription"; //$duser = "DICTWEB"; //Database password //$dpass = "password"; $dpass = "imagemsoft"; //Database tnsname //$dhost = "interweb"; $dhost = "rcorcl"; //Document base path //$base_base = "/export/home/dictedoc/"; $base_path = "/export/home/jlcyr/tmp/";  $db = oci_pconnect($duser,$dpass,$dhost);       // Declare rpc_server possible methods $s=new xmlrpc_server( array("doc.putDoc" => array ("function" => "doc_putDoc"), 			    "doc.getDocInfo" => array ("function" => "doc_getDocInfo"), 			    "doc.createDoc" => array ("function" => "doc_createDoc"), 			    "doc.getUID" => array ("function" => "doc_getUID"), 			    "doc.updateDOC" => array ("function" => "doc_updateDoc"), 			    "doc.help" => array ("function" => "doc_help"), 			    "ris.getBirth" => array("function" => "risCMD_getBirth"), 			    "ris.getCMD" => array("function" => "risCMD_getCMD"), 			    "ris.help" => array("function" => "risCMD_help"), 			    "sql.execSql" => array("function" => "sql_execSql"), 			    "sql.getInst" => array ("function" => "sql_getInst"), 			    "sql.help" => array ("function" => "sql_help") 			    ));  oci_close($db);  // Don't know why, but seen we can't pass class method to xmlrpc_server array of function // so i've declared stand alone functions  ///////////////////////////////////////////////////////////////////////////////////////// // doc_putDoc invoqué via le web sous doc.putDoc // args: 1-Le contenu du document urlencoded //       2-Le path du media file set a concatener avec le root (global $base_path) //       3-Le nom du fichier à créer // retour: 0 function doc_putDoc($params)//($doc, $path, $filename) {   global $base_path;    $doc=$params->getParam(0)->scalarval();   $path=$params->getParam(1)->scalarval();   $filename=$params->getParam(2)->scalarval();    //Est-ce que le répertoir /export/home/dictedoc/$path existe?   if (!file_exists($base_path.$path))     {       //Si non le créer et le mettre chmod 777       mkdir($base_path."/".$path,0777,true);       chmod($base_path."/".$path,0777);     }    //Enregistrer le document $doc sous /export/home/dictedoc/$path/$filename   $f = fopen($base_path."/".$path."/".$filename,"w");   $data = urldecode($doc);   fwrite($f,$data);   fclose($f);   chmod($base_path."/".$path."/".$filename,0777);    return new xmlrpcresp(new xmlrpcval(0,"integer")); }  ///////////////////////////////////////////////////////////////////////////////////////// // doc_getDocInfo invoqué via le web sous doc.getDocInfo // args: le dd_id // retour: toutes les colonnes function doc_getDocInfo($params)//($info) {   global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval("Error connection to db ","string"));    $info =$params->getParam(0)->scalarval();   $select = "select * from dictation_document where dd_id='$info'";   $arr = array();   //Execute select, return result values 1,2,3 in uid, id, fileset   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       if (oci_fetch($stmt)) 	{ 	  $ncols = OCINumCols($stmt); 	  for ($i = 1; $i <= $ncols; $i++) { 	    $column_name  = OCIColumnName($stmt, $i); 	    $column_type  = OCIColumnType($stmt, $i); 	    $column_size  = OCIColumnSize($stmt, $i); 	    $column_data = OCIResult($stmt, $i);     	    $arr = $arr + array($column_name => new xmlrpcval($column_data,"string")); 	  } 	}       else 	{ 	  return new xmlrpcresp(new xmlrpcval("Error fetching result ","string")); 	}     }   else     {       return new xmlrpcresp(new xmlrpcval("Error executing select ".$select,"string"));     }    return new xmlrpcresp(new xmlrpcval($arr, "struct")); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: le select à exécuter // retour: string "Doc Created" function doc_createDoc($params)//($select) {   $select = $params->getParam(0)->scalarval();    global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval("Error connection to db ","string"));    //Execute select, return result values 1,2,3 in uid, id, fileset   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       oci_commit($db);     }    //Executer le select dans $select    return new xmlrpcresp(new xmlrpcval("Doc Created","string")); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: un service id // retour: struct: uid, id et fileset pour créer un nouveau document function doc_getUID($params)//($seruid) {   global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval("Error connection to db ","string"));    $seruid = $params->getParam(0)->scalarval();    $select = "select '2.16.124.10.2.1.3.100.' ".     "||to_char(sysdate,'YYYYMMDD')||'.'".     "||to_char(to_number(to_char(to_date('010203','HH24MISS'),'HH24MISS')))||'.'".     "||(select CE_VALUE from config_env where CE_ITEM_CONF='INSTITUTION')||'.'".     "||SQ_DICTATION_UID.NEXTVAL,".     "to_char(SQ_DICTATION_UID.NEXTVAL), ".     "(select DS_NAME from DICTATION_SERVICE where DS_ID='$seruid')||'/'||to_char(sysdate,'YYYYIW') from dual";    //Execute select, return result values 1,2,3 in uid, id, fileset   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       if (oci_fetch($stmt)) 	{ 	  $uid = oci_result($stmt,1); 	  $id = oci_result($stmt,2); 	  $fileset = oci_result($stmt,3); 	  //oci_commit($this->link); 	}       else 	{ 	  return new xmlrpcresp(new xmlrpcval("Error fetching result ","string")); 	}     }   else     {       return new xmlrpcresp(new xmlrpcval("Error executing select ".$select,"string"));     }    $arr = array( "uid" => new xmlrpcval($uid,"string"), 		"id" => new xmlrpcval($id,"string"), 		"fileset" => new xmlrpcval($fileset,"string") );    return new xmlrpcresp(new xmlrpcval($arr, "struct")); }  ///////////////////////////////////////////////////////////////////////////////////////// // Not done function doc_updateDoc() {   return new xmlrpcresp(new xmlrpcval("Doc Updated","string")); }  ///////////////////////////////////////////////////////////////////////////////////////// // doc_help invoqué via le web sous doc.help // args: aucun // retour: 1-liste des méthodes de l'objet web doc function doc_help() {   return new xmlrpcresp(new xmlrpcval("putDoc, getDocInfo, createDoc, getUID, updateDoc", "string")); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: un patient id // retour: la date de naissance sous forme de string ou 0 si le patient n'existe pas function risCMD_getBirth($params)//($patid) {   $patid =$params->getParam(0)->scalarval();    $select = "select * from WEB.PATIENT where PAT_ID='$patid'";    global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval("Error connection to db ","string"));    $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       if (oci_fetch($stmt)) 	{ 	  $birth = oci_result($stmt,"PAT_BIRTH"); 	}       else 	{ 	  return new xmlrpcresp(new xmlrpcval(0, "integer")); 	  //return new xmlrpcresp(new xmlrpcval("Error fetching result ","string")); 	}     }   else     {       return new xmlrpcresp(new xmlrpcval(0, "integer"));       //return new xmlrpcresp(new xmlrpcval("Error executing select ".$select,"string"));     }    return new xmlrpcresp(new xmlrpcval($birth, "string")); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: le staff id et le délai maximum de validité du click dans le ris // retour: toutes les colonnes de la table RIS_DICTATION_INTERFACE function risCMD_getCMD($params)//($staffid, $gap) {   global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval("Error connection to db ","string"));    $staffid = $params->getParam(0)->scalarval();   $gap = $params->getParam(1)->scalarval();    $select = "select * from RIS_DICTATION_INTERFACE where RDI_STAFF_ID='$staffid' and RDI_DT>(sysdate-$gap/(24*60)) order by RDI_DT desc";    //Execute select, Return all values in the array   $arr = array();   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       if (oci_fetch($stmt)) 	{ 	  $ncols = OCINumCols($stmt); 	  for ($i = 1; $i <= $ncols; $i++) { 	    $column_name  = OCIColumnName($stmt, $i); 	    $column_type  = OCIColumnType($stmt, $i); 	    $column_size  = OCIColumnSize($stmt, $i); 	    $column_data = OCIResult($stmt, $i);     	    $arr = $arr + array($column_name => new xmlrpcval($column_data,"string")); 	  } 	}       else 	{ 	  return new xmlrpcresp(new xmlrpcval(0, "integer")); 	  //return new xmlrpcresp(new xmlrpcval("Error fetching result ","string")); 	}     }   else     {       return new xmlrpcresp(new xmlrpcval(0, "integer"));       //return new xmlrpcresp(new xmlrpcval("Error executing select ".$select,"string"));     }    return new xmlrpcresp(new xmlrpcval($arr, "struct")); }  ///////////////////////////////////////////////////////////////////////////////////////// function risCMD_help() {   return new xmlrpcresp(new xmlrpcval("getBirth, getCMD", "string")); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: l'affirmation sql a exécuter // retour: la string "Sql Done" function sql_execSql($param)//($select) {   global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval("Error connection to db ","string"));    $select = $params->getParam(0)->scalarval();    //Execute select, with commit   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       oci_commit($db);     }    return new xmlrpcresp(new xmlrpcval("Sql Done", "string")); }  ///////////////////////////////////////////////////////////////////////////////////////// // args: N/A // retour: le numéro d'institution défini dans la table config_env sous institution //         ou 0 si non défini. function sql_getInst() {   global $db;   if ($db==false)       return new xmlrpcresp(new xmlrpcval("Error connection to db ","string"));    $select = "select CE_VALUE from config_env where CE_ITEM_CONF='INSTITUTION'";    //Execute select, return result value in $inst as a string   $stmt = oci_parse($db,$select);   if (oci_execute($stmt,OCI_DEFAULT))     {       if (oci_fetch($stmt)) 	{ 	  $inst = oci_result($stmt,"CE_VALUE"); 	}       else 	{ 	  return new xmlrpcresp(new xmlrpcval(0, "integer")); 	  //return new xmlrpcresp(new xmlrpcval("Error fetching result ","string")); 	}     }   else     {       return new xmlrpcresp(new xmlrpcval(0, "integer"));       //return new xmlrpcresp(new xmlrpcval("Error executing select ".$select,"string"));     }    return new xmlrpcresp(new xmlrpcval($inst, "string")); }  ///////////////////////////////////////////////////////////////////////////////////////// function sql_help() {   return new xmlrpcresp(new xmlrpcval("execSql, getInst", "string")); }  //Exemple de retour de message d'erreur //return new xmlrpcresp(0, $xmlrpcerruser+3, "Select return an error"); //return new xmlrpcresp($retVal);//OK 


 

Windows tray application

Lundi, mai 30th, 2005

<h3>Voici un exemple de code pour mettre un programme dans le system tray (à coté de l’heure) dans windows.</h3> <br> Il est basé sur un programme en mode dialog.<br> <br> Pour commencer dans le <b>’initinstance’</b> modifier la création de la dialogue de la manière suivante: <pre style=”background-color: #FFF8ED”> //int nResponse = dlg.DoModal(); dlg.Create(IDD_AUDIOCONTEXT_DIALOG); dlg.ShowWindow(SW_HIDE); int nResponse = dlg.RunModalLoop(); dlg.DestroyWindow(); </pre> Par la suite modifier la classe de la dialog des manières suivantes: Ajouter une définition <pre style=”background-color: #FFF8ED”> #define MYWM_NOTIFYICON (WM_USER+2) </pre> A la fin du <b>OnInitDialog(…)</b> <pre style=”background-color: #FFF8ED”> TrayMessage(NIM_ADD); ShowWindow(SW_HIDE); </pre> A la fin du <b>DestroyWindows(…)</b> <pre style=”background-color: #FFF8ED”> TrayMessage(NIM_DELETE); </pre> Ajouter la fonction suivante: <pre style=”background-color: #FFF8ED”> ///////////////////////////////////////////////////////////////////////////// // Supported message // NIM_ADD, NIM_DELETE, NIM_MODIFY BOOL CAudioContextDlg::TrayMessage( DWORD dwMessage, unsigned int icone/*=IDR_TRAYICON*/) { CString sTip(_T(”AudioContext”)); NOTIFYICONDATA tnd; tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = m_hWnd; tnd.uID = IDR_TRAYICON; tnd.uFlags = NIF_MESSAGE|NIF_ICON; tnd.uCallbackMessage = MYWM_NOTIFYICON; tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; VERIFY( tnd.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE (icone)) ); lstrcpyn(tnd.szTip, (LPCTSTR)sTip, sizeof(tnd.szTip)); return Shell_NotifyIcon(dwMessage, &tnd); } </pre> Créer dans les ressources du projet une icone nommée IDR_TRAYICON vous pouvez aussi créer un menu avec un sous menu qui sera appellé par l’icone avec le bouton de droite, il suffit de créer le menu dans les ressources et d’ajouter ce code <pre style=”background-color: #FFF8ED”> ///////////////////////////////////////////////////////////////////////////// void CAudioContextDlg::TrayMenu(void) { BOOL bResult = FALSE; DWORD SelectionMade; CMenu menu; CString csMessage; int nIndex = 0; long nRecordNumber = 0; long nAbsolutePosition = 0; bResult = menu.LoadMenu(IDR_MENU_POPUP); CMenu* popup = menu.GetSubMenu(0); // menuRtClick.EnableMenuItem(ID_ITEM0, TRUE); // menuRtClick.EnableMenuItem(ID_ITEM1, TRUE); // menuRtClick.EnableMenuItem(ID_ITEM2, TRUE); // call the helper function to setup this as a titled popup menu // AddMenuTitle(popup); POINT pp; GetCursorPos(&pp); SetForegroundWindow(); SelectionMade = popup->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pp.x,pp.y,this); popup->DestroyMenu(); // The value of SelectionMade is the id of the command selected or 0 if no // selection was made switch(SelectionMade) { case ID_POPUP_QUIT: OnOK(); break; case ID_POPUP_SHOW: ShowWindow(SW_NORMAL); SetForegroundWindow(); SetFocus(); break; case ID_POPUP_CONTEXT: OnQuery() ; break; case ID_POPUP_ENVOYER: OnSend(); break; } } </pre> Pour gérer tout ça, il faut égallement ajouter un bout de code dans la fonction DefWinProc(…) <pre style=”background-color: #FFF8ED”> case MYWM_NOTIFYICON: { switch (lParam) { case WM_LBUTTONDOWN: { if (::MessageBox(NULL,”Voulez-vous transmettre cette dictée?”,”Transmettre”,MB_YESNO)==IDYES) { OnSend(); } return TRUE; } case WM_LBUTTONDBLCLK: switch (wParam) { case IDR_TRAYICON_PA: ShowWindow(SW_NORMAL); SetForegroundWindow(); SetFocus(); return TRUE; break; } case WM_RBUTTONDOWN: switch (wParam) { case IDR_TRAYICON_PA: //Beep(1000,100); TrayMenu(); break; } break; } } break; </pre> Le code de ce programme est basé sur la fonction shell_notifyicon dont la documentation est disponible à <a href=”http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shell_notifyicon.asp”>Documentation</a> <br> <br> La majorité du code de cet exemple provient de <a href=”http://www.codeguru.com/Cpp/controls/controls/systemtray/article.php/c5309/”>Code Guru</a> et de <a href=”http://www.codeproject.com/shell/mfcstartup.asp”>Code Project</a>

Update PowerDNS

Vendredi, mai 20th, 2005

Ce script reçoit en paramètre le mot de passe du compte Il se connecte à un serveur web sur lequel est installer PowerDNS et met à jour un enregistrement. <pre> #!/bin/bash ################################################################ # # Author: Jean-Luc Cyr # Copyright 2004 / ADN Informatique # Date: 2004-09-27 # Desc: PowerDNS Administration automatic DNS record update # from a GNET router dynamic IP configuration # ################################################################ #GNET ROUTER INTERNAL IP ROUTER_IP=1.2.3.4 #PowerDNS Administration server url DNS_SERVER= mydomain.com/powerdns DNS_USER=username DNS_PASS=$1 DNS_RECORD=33643 if [ $1 ] ; then echo “” >/dev/null ; else echo “must give password”; exit; fi DNS_LOGIN=”username=$DNS_USER&password=$DNS_PASS&submit=Log%20in” cd /tmp #date if [ -f status.htm ] ; then rm status.htm ; fi if [ -f oldip ] ; then rm oldip ; fi if [ -f currentip ] ; then cp currentip oldip ; fi #echo =======Get router status page======================= wget -q http://$ROUTER_IP/status.htm #echo =======Find out the router ip address=============== if [ -f status.htm ] ; then cat status.htm | grep “IP Address” | cut -b 41- | cut -f1 -d”<” > currentip ; else exit ; fi #date >>/tmp/currentip #echo =======Check if router address has changed========== #if diff -q oldip currentip | grep differ >/dev/null ; then echo “ROUTER IP HAS CHANGED” ; else echo “ROUTER IP HAS NOT CHANGED” ; exit ; fi if diff -q oldip currentip | grep differ >/dev/null ; then echo “ROUTER IP HAS CHANGED” ; else echo “” >/dev/null ; exit ; fi #echo =====================LOGGING IN===================== #Call the login page: http://ns1.lcinter.net/dns2/index.php (user/pass/submit) curl -D headers_and_cookies -d $DNS_LOGIN $DNS_SERVER/login.php 2>/dev/null #echo =====================GETTING RECORD================= #Call the update record page: http://ns1.lcinter.net/dns2/edit_record.php?id=33643 (dns data/submit) curl -b headers_and_cookies $DNS_SERVER/edit_record.php?id=$DNS_RECORD 2>/dev/null | grep content | grep name= | cut -b 74- | cut -f1 -d”<” > /tmp/dnsip #if diff -q dnsip currentip | grep differ >/dev/null ; then echo “DNS DIFFER FROM ROUTER IP” ; else echo “DNS IS UP TO DATE” ; curl -b headers_and_cookies $DNS_SERVER/logout.php ; exit ; fi if diff -q dnsip currentip | grep differ >/dev/null ; then echo “DNS DIFFER FROM ROUTER IP” ; else echo “” >/dev/null ; curl -b headers_and_cookies $DNS_SERVER/logout.php 2>/dev/null ; exit ; fi echo =====================UPDATING RECORD================ date #Call the update record page #Here are en example of the original update page from PowerDNS #<form action=”update_record.php?id=33643″ method=”post”> # <input type=”text” name=”record” size=”15″ maxlength=”200″ value=”home”>.adninformatique.net # <select name=”type”> # <option value=”NS”>NS</option> # <option value=”MX”>MX</option> # <option value=”A” selected>A</option> # <option value=”AAAA”>AAAA</option> # <option value=”PTR”>PTR</option> # <option value=”CNAME”>CNAME</option> # <option value=”TXT”>TXT</option> # </select> # <input type=”text” name=”prio” size=”5″ maxlength=”11″ value=”"> # <input type=”text” name=”content” size=”15″ maxlength=”255″ value=”24.201.6.204″> # <input type=”text” name=”ttl” size=”5″ maxlength=”11″ value=”1″> # <input type=”submit” value=”Update”> #</form> echo update adni.adninformatique.net dns DNS_REQ=”record=home&type=A&prio=&ttl=1&submit=Update&content=`cat /tmp/currentip`” #echo request is $DNS_REQ curl -b headers_and_cookies -d $DNS_REQ $DNS_SERVER/update_record.php?id=$DNS_RECORD >/dev/null 2>/dev/null echo update jlcyr.dyn.grafsoft.com dns curl www.grafsoft.com/~jlcyr/dns_update.php?ip=24.201.6.204 >/dev/null 2>/dev/null #grep “The record was updated” #echo =====================LOGGING OUT==================== #Call the logout page: http://ns1.lcinter.net/dns2/logout.php curl -b headers_and_cookies $DNS_SERVER/logout.php 2>/dev/null rm -f headers_and_cookies echo “dynamic ip updated” </pre> <dtml-var standard_html_header> <h2><dtml-var title_or_id></h2> <p> This is the <dtml-var id> Document. </p> <dtml-var standard_html_footer>

Darwin sur PC

Mercredi, avril 27th, 2005

Darwin, le système d’exploitation d’Apple, la base de Mac OS X sera porté sur PCs.

L’équipe de Darwin (dérivé de BSD) a obtenu le support d’Apple pour porter Darwin pour PC.

Plus de détails

Sur le site d’Apple

Q. I heard that Darwin runs on Intel processor-based PCs. Is that true?
A. Yes, and we’re partnering with the Darwin developer community to enhance support for this platform.

Version Control Software

Jeudi, avril 14th, 2005

Comme toujours, je me pose des questions.. Là je suis retombé sur l’utilisation d’un système de controle de version.

J’utilise déjà courrament CVS (client-serveur), mais il a comme tout système quelques lacunes agaçantes.

Je suis retombé sur SubVersion et son Livre. Il faudrait que j’y jette un coup d’oeil plus approfondi. Et aussi sur TurtoiseSVN un client pour windows.

Selon un “thread” sur la mailing list d’asterisk il y a aussi
Subversion / svk Monotone Arch / Bazaar Darcs cvs

DICOM images downloader and cd burner

Vendredi, avril 8th, 2005

#!/usr/bin/python2.2  # Title: CDs.py # Descr: Retrieve images from IMAGEM PACS (Oracle/FTP) #        build up a dicomdir file # Author: Jean-Luc Cyr # License: (C)2005 Jean-Luc Cyr / Les systèmes médicaux IMAGEM # Created: 2005-04-08 # # Require: DCMTK utilities (dcmdjpeg, dcmconv, dcmgpdir)   # Oracle connection settings db_user = "ris_pacs" db_pass = "password" db_host = "rpdev" # FTP retrieve connection settings ftp_user = "robin" ftp_pass = "blitzkrieg" ftp_host = "192.168.2.70"  # Imports and defs ftp = "ftp://%s:%s@%s" % (ftp_user, ftp_pass, ftp_host) import cx_Oracle as db from urllib import urlretrieve import commands from os import stat  #program start HERE  #Ask for a patient id to fetch study list for patid = raw_input("Enter Pat ID:")  #Connect to db con = db.connect(db_user, db_pass, db_host) cur = con.cursor()  #Fetch study list for this patient cur.execute("select STU_DATE, STU_DESC, STU_INSTANCE_UID from study where stu_pat_id='%s' order by stu_date desc" % patid)  study = cur.fetchall()  for row in range(0,study.__len__()):     (date,desc,stuuid) = study[row]     print "%s - %s - %s" % (row+1,date,desc)  #Ask for studies to burn (index from returned list) studylist = raw_input("Enter Study (comma separated):")  stunolist = studylist.split(",") stulist="" for stuno in stunolist:     #stulist.insert(1,study[int(stuno)][2])     if stulist.__len__()>0:         stulist = "%s,'%s'" % (stulist,study[int(stuno)-1][2])     else:         stulist = "'%s'" % study[int(stuno)-1][2];  #Fetch image list (for all studies) select = "select MFS_MOUNT_POINT,COI_STUDY_INSTANCE_UID,COI_SERIES_INSTANCE_UID,COI_SOP_INSTANCE_UID from composite_object_instance,media_file_set where coi_study_instance_uid in (%s) and coi_sto_media_fset_uid = mfs_uid" % (stulist) cur.execute(select) coi = cur.fetchall()  #clean up last dicomdir and files op = commands.getoutput("rm *dcm") op = commands.getoutput("rm DICOMDIR") op = commands.getoutput("rm image.iso")  #Fetch images, convert them to the good uncompressed format #and build up the DICOMDIR file imlist=[] for row in range(0, coi.__len__()):     print "=== %s de %s ===" % (int(row)+1,coi.__len__())     (mfsuid,stuuid,seruid,coiuid) = coi[row]     url = "%s/%s/%s/%s/%s.dcm" % (ftp,mfsuid,stuuid,seruid,coiuid)     fileName = "%sdcm" % (row)     imlist.insert(1,"%s.dcm" % (coiuid))     print "*Retrieving %s" % coiuid     try:         urlretrieve(url,fileName);     except IOError:         print "Can't retrieve file"     else:         path = "/home/jlcyr/old_home/Devel/CDs";          print '*Uncompressing'             op = commands.getoutput("dcmdjpeg +te %s %s" % (fileName,fileName))         if op!="":             print op          print '*Converting to LittleEndianExplicit'         op = commands.getoutput("dcmconv +te %s %s" % (fileName,fileName))         if op!="":             print op          try:             stat("DICOMDIR")         except OSError:#file doesn't exist             print '*Creating DICOMDIR'             op = commands.getoutput("dcmgpdir +m +D DICOMDIR %s" % (fileName))             if op!="":                 print op                 op = commands.getoutput("rm %s" % (fileName))         else:             print '*Adding to DICOMDIR'                         op = commands.getoutput("dcmgpdir +A +m +D DICOMDIR %s" % (fileName))             if op!="":                 print op                 op = commands.getoutput("rm %s" % (fileName))  #Now burn the CD! print "==== Making ISO image ====" op = commands.getoutput("mkisofs *dcm DICOMDIR >image.iso") print op 


 

wiki blog python

Vendredi, avril 8th, 2005

Mes derniers regards en informatiques sont pointés sur le langage Python, le système ZOPE / PLONE / ZWIKI. Aussi, je suis en train de penser à me faire un Wiki.. pour vous donner des nouvelles plus souvent.

J’ai aussi dernièrement regarder les technologies .NET, XML-RPC, les outils de dessin vectoriel pour linux…

Je suis en train de restaurer un vieux portable.. je vais peut-etre écrire plus et plus souvent.

Il faut aussi que je mette à jour la page personnelle à Éolie. Je vous avise dès que c’est fait.

De plus, je pense à faire un bulletin de nouvelle mensuel (comme mon ami Alexandre) car je trouve ça pas mal cool.

Note: Si vous voulez voir mes derniers tests, vous pouvez toujours essayer Mon ordi à la maison. Je n’y laisse pas grand chose (pour pas me faire pirater, mais j’y en laisse quand même un peu de texte.. ;)