Archive for the ‘Dév en plusieurs Sauces’ Category

SOAP et Objective-C

jeudi, juillet 18th, 2013

Bonjour,
On utilise tous cet outil wsdl2objc , par contre personnellement je lui reproche de rajouter les suffixes un peu partout , et donc il a fallu que je modifie l’implémentation des structures des donnés en supprimant les suffixes ( soit par un delete de la variable suffixe et la suppression de son %@ , soit en rajoutant une valeur vide ).

L’utilisation est facile et j’aime bien , pour vous aider suivez ce lien et tout ira bien .

[PHP] Sphinx-Mysql : Un vrai moteur d’indexation

jeudi, septembre 23rd, 2010

Sphinx est un moteur de recherche full-text, distribué sous GPL v2. (Une licence commerciale est disponible)

En gros, c’est un moteur de recherche à part entière, crée pour fournir des fonctions de recherches rapides et pertinentes pour d’autres applications. Sphinx a été fait en particulier pour s’intégrer facilement avec des base de données SQL et des languages de scripts (typiquement, le couple PHP/MySQL). Pour l’instant les sources de données peuvent être des bases de donnée MySQL ou PostgreSQL, mais aussi des flux XML.

Base de donnée à indexer

Au début, nous avons donc notre base de donnée, par exemple:

CREATE TABLE items (
    item_id integer NOT NULL,
    item_title character varying(255) NOT NULL,
    item_description text NOT NULL,
    item_date timestamp without time zone NOT NULL,
    item_link character varying(255) NOT NULL,
    cat_id integer NOT NULL,
); 

On peut faire des recherches dans le titre (item_link), dans le contenu (item_description) ou dans l’url (item_link).
 En plus, il faudrais pouvoir trier par date (cat_date) ou par catégorie (cat_id)

La première étape est de créer le fichier de configuration de sphinx

Fichier de conf de base

Voila de quoi créer un sphinx.conf pour notre base de donnée

# nom de l'index : "main"
source main
{
        type            = pgsql

        sql_host        = localhost
        sql_user        = utilisateur
        sql_pass        = motdepasse
# nom de la base de donnée
        sql_db          = database   

         sql_query      = \
               SELECT item_id, cat_id, item_title, item_description, item_date,  \
                      ROUND(EXTRACT( EPOCH FROM ABSTIME(item_date) ))::int4 AS item_ts \
               FROM items                                                                                               

       sql_attr_uint                   = cat_id
       sql_attr_timestamp              = item_ts
}                                                

index main
{
        source                  = main
        path                    = /home/foo/var/lib/sphinx/main
        docinfo                 = extern
        morphology              = none
        # Cette conf de base marche bien en général
        # Pour l'adapter à vos besoins voir l'exemple de fichier de configuration complet
        enable_star             = 0
        min_word_len            = 2
        min_prefix_len          = 0
        min_infix_len           = 3
        charset_type            = utf-8
        html_strip              = 1
}

Pour indexer la base :

il faut taper la commande suivante: indexer -c sphinx.conf main (rajouter –rotate si searchdest en train d’utiliser l’index)

Suivant la taille des données à indexer cela peut prendre un peu de temps. Par exemple :

Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff

using config file '/home/foo/var/sphinx.conf'...
indexing index 'main'...
collected 20786 docs, 6.8 MB
sorted 17.4 Mhits, 100.0% done
total 20786 docs, 6829246 bytes
total 9.729 sec, 701969.94 bytes/sec, 2136.57 docs/sec
rotating indices: succesfully sent SIGHUP to searchd (pid=11367).

A vos claviers ^^ .

[PHP] Propel la magie du Search Engine in one line

samedi, juin 26th, 2010

Bonjour,

Propel, une belle API que facilite la vie de nos données ainsi de nous rendre service pour tout storing or retrieving data :) .

Si on veut chercher (en mode Full-text) les books par nom donc on peut appliquer une simple expression régulière , instruction comme suit :


class BookQuery extends BaseBookQuery
{
public function filterByText($text)
{
$pattern = '%' . $text . '%';
return $this
->where('Book.Title like ?', $pattern)
->orWhere('Book.Summary like ?', $pattern);
}
}

Joli Hein ^^, Perso j’ai tendance à intègrer les match against ainsi le traitement lourd de la recherche dans une tel classe pour avoir plus de rapidité et plus de clarté de code .

Python Codin

jeudi, juin 24th, 2010

Bonjour ,

Je vous présente également un petit script que j’ai codé mais il m a rendu fou :/ !!

Alors le principe est du traiter des documents a la file et faire un traitement bien déterminer sur chaque document .

Bon tout est nickel , parfait sauf qu’au bout de 5 sec de l’exec, hé bin si on inspecte le comportement du CPU on trouve qu’il fait 5x que la normal .

Wala le script’oun et vous pouvez en servir volontairement :)


#!/usr/bin/python
import sys,locale,getopt,string
import re
def usage():
print """Usage: tokenizer.py """
def matchComma1(match1):
return match1.group(1)+ " "+ match1.group(2)+ " " +match1.group(3)

def matchComma2(match2):
return match2.group(1)+ " "+ match2.group(2)+ " " +match2.group(3)

def matchComma3(match3):
return match3.group(1)+ "_"+ match3.group(2)+ "_" +match3.group(3)+ "_" +match3.group(4)+ "_" + match3.group(5)

def matchComma4(match4):
return match4.group(1)+ " "+ match4.group(2)+ " "

def matchComma5(match5):
return match5.group(1)+match5.group(2) + "_" + match5.group(4)

def matchComma6(match6):
return match6.group(1) + match6.group(3)

def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "ho", ["help","option"])
except getopt.GetoptError:
usage()
sys.exit(2)

for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
if o in ("-o","--option"):
optionVariable = a
comma1 = r'(\w)(\?|\+|\#|\!|\;|\:|\"|\(|\)|\/|\&|\%|\$|\*|\[|\]|\{|\})(\w)'
comma2 = r'(\D)(\,)(\D)'
comma3 = r'(\d{2})\.(\d{2})\.(\d{2})\.(\d{2})\.(\d{2})'
comma4 = r'(\w)(\.)'
comma5 = r'(N|Mr|MM|Mme|Mmes|Mle|Mlle|Melle|Mles|Mlles|Melles|Me|Dr|Pr|Prof|Ste|ste)(\.)( )(\w)'
comma6 = r'(\d)( )(\d)'

regComma1 = re.compile(comma1)
regComma2 = re.compile(comma2)
regComma3 = re.compile(comma3)
regComma4 = re.compile(comma4)
regComma5 = re.compile(comma5)
regComma6 = re.compile(comma6)
for line in sys.stdin.readlines():
line1 = regComma1.sub(matchComma1,line)
line2 = regComma2.sub(matchComma2,line1)
line3 = regComma6.sub(matchComma6,line2)
line4 = regComma3.sub(matchComma3,line3)
line5 = regComma5.sub(matchComma5,line4)
line6 = regComma4.sub(matchComma4,line5)
print line6,

if __name__ == "__main__":
main()

Si vous avez des améliorations n’hésitez pas à me les communiquer , comme ça je mes à jour mon demon :)

++

Appli Traducteur Français Basque

jeudi, juin 24th, 2010

Bonjour,

Voilà depis 1 ans j’avais le courage de faire un petit traducteur ( Français <--> Basque | Hé oui moi le tunisien qui le fait *_O ) suite à une demande d’un ami à moi. Donc aujourd’hui je poste une partie du code source pour ceux qui pouvait m’aider à résoudre beaucoup des pbs que j’ai rencontré :/
Le code est en VB6 et voilà le CORE de l’appli


'########----------- VERSION I : TRADUCTION DES MOTS DE POIDS = 1 --------###########################
'######## LAST Update Was : 27 / AVRIL / 2009 AU lit ( Faut penser a Reecrire la fonction de cryptage ) ##########
Option Explicit
Dim t() As String ' Tableau des phrases extraites de la zone de texte
Dim t_t() As String ' Tableau des mots et des combinaisons extraites de chaque ligne de tableau t()
Dim mot As String ' Contenaire des mots extraites ain pour etre traiter
Dim i, j, k, h, s As Integer ' Compteur
Dim code_fr As Integer ' code dans le dico french
Dim ligne_fr, mot_fr As String ' ligne de la dico french
Dim base_code_fr As String ' code Fr de la phrase saisie dans le champ texte
Dim ligne_base, mot_base As String ' ligne dans la base des regles
Dim regle As String ' Regle du mot a traiter : Extraction des codes Bs et les affecter au mot result ( Out)
Dim code_regle As String ' Code de la regle a comparer avec le code de Bs_dico
Dim ligne_bs, mot_bs As String ' Ligne et code de comparaison de dico Bs
Dim final As String
Private Sub Command1_Click()
If Text1.Text <> "" Then
Text2.Text = ""
final = ""

'------------------------- EXTRACTION DES MOTS DE TEXTBOX --------------------------------------
k = 1
h = 1
For i = 1 To Len(Text1.Text)
If Mid(Text1.Text, i, 1) <> "." Or i = Len(Text1.Text) Then
'########################Faut pas oublier le traitement des , ; . : ? ! #################################
mot = mot & Mid(Text1.Text, i, 1)
If i = Len(Text1.Text) Then
ReDim Preserve t(k) As String
t(k) = mot
mot = ""
End If
Else
ReDim Preserve t(i) As String
t(k) = mot: k = k + 1
mot = ""
End If
Next i
'---------- Affichage du tableau des phrases ##### Faut penser au decoupage des phrase en mots ##### --------
For i = 1 To k
MsgBox t(i)
Stop
'------------------ TRAITEMENT DES PHRASES ET DECOUPAGE EN MOT ---------------------------------
For j = 1 To Len(t(i))
If Mid(t(i), j, 1) <> " " Then
mot = mot & Mid(t(i), j, 1)
If j = Len(t(i)) Then
ReDim Preserve t_t(h) As String
t_t(h) = mot
mot = ""
End If
Else
' If j = Len(t(i)) Then
ReDim Preserve t_t(h) As String
t_t(h) = mot: h = h + 1
mot = ""
' End If
End If
Next j
'------------- Quelques part ici faut penser a Retraiter les mots --------------------------------------
'------------------- FIN DE DECOUPAGE -------------------------------------------------------------
ReDim t_t(h) As String
h = 1
Next i
'----------- Fin d'affichage des phrases ------------------------------------------------------------------------
If Dir(App.Path & "\Fr_dico.maj") <> "" And Dir(App.Path & "\Bs_dico.maj ") <> "" And Dir(App.Path & "\base.maj") <> "" Then
'--------------------- BOUCLE GENERAL IN ZE TABLE OF FR3NCH WORDS -------------------------------------------
For i = 1 To k
'---------------------- Recherche du code Fr -------------------------------------------
Open App.Path & "\Fr_dico.maj" For Input As #1
Do While Not EOF(1)
Line Input #1, ligne_fr
mot_fr = ""
For j = 1 To Len(ligne_fr)
If Mid(ligne_fr, j, 1) <> ":" Then
mot_fr = mot_fr & Mid(ligne_fr, j, 1)
Else
Exit For
End If
Next j
'-------------------- Test des codes et l'affection au tableau des codes FR -------------------------
If LCase(Trim(t(i))) = mot_fr Then
base_code_fr = Mid(ligne_fr, Len(mot_fr) + 2, Len(ligne_fr) - Len(mot_fr))
'----------- DÉBUT DU TRAITEMENT DE LA PARTIE POUR EXTRACTION DE LA RÈGLE CORRESPONDANTE ------------
Open App.Path & "\base.maj" For Input As #2
Do While Not EOF(2)
Line Input #2, ligne_base
mot_base = ""
For j = 1 To Len(ligne_base)
If Mid(ligne_base, j, 1) <> ":" Then
mot_base = mot_base & Mid(ligne_base, j, 1)
Else
Exit For
End If
Next j
If mot_base = "fr_" & base_code_fr Then
regle = Replace(ligne_base, "fr_" & base_code_fr & ":", "")
regle = Replace(regle, "bs_", "")
'MsgBox regle
'Stop
'Traitement de la regle : Extraction des codes Bs
For j = 1 To Len(regle)
If Mid(regle, j, 1) <> "|" Then
code_regle = code_regle & Mid(regle, j, 1)
Else
Open App.Path & "\Bs_dico.maj" For Input As #3
Do While Not EOF(3)
Line Input #3, ligne_bs
mot_bs = ""
For s = 1 To Len(ligne_bs)
If Mid(ligne_bs, s, 1) <> ":" Then
mot_bs = mot_bs & Mid(ligne_bs, s, 1)
Else
Exit For
End If
Next s
If code_regle = Mid(ligne_bs, Len(mot_bs) + 2, Len(ligne_bs) - Len(mot_bs)) Then
final = final & Mid(ligne_bs, 1, Len(ligne_bs) - Len(code_regle) - 1) & " "
code_regle = ""
End If
Loop
Close #3
End If
Next j
'Fin de traitement

End If
Loop
Close #2
'------------------------ FIN D'EXTRACTION DE LA RÈGLE -----------------------------------------
Exit Do
End If
'------------------- Fin de test d'affectation -----------------------------------------------
Loop
Close #1
'---------------------- Fin de recherche Fr ----------------------------------------------------
Next i
'----------------- FIN DE BOUCLE ---------------------------------------------------
End If
Text2.Text = final
End If
End Sub

Voilà la partie la plus sensible même si l’algo est pas si compliqué mais y a bcp des choses à revoir :/

API JMX [0_O]

mercredi, juin 23rd, 2010

Bonjour,

Je vais vous présenter une API que j’aime bien, ça donne toujours l’impression que tout est sous  » contrôle  » et que on maitrise la situation …
Sinon JMX permet de superviser et d’administrer des ressources matérielles accessibles depuis une JVM comme des ressources logiciels s’exécutant sur une JVM. L’instrumentation des ressources se fait au moyen de composants appelés MBean (Manageable Bean). La spécification JMX définit l’ensemble des interfaces et classes nécessaires à cette instrumentation.

Pour cela faut activer l’agent JMX ( MBeanServer ) :

java -Dcom.sun.management.jmxremote -jar Application_name.jar

L’utilisation et l’accès aux MBeans enregistrés sur un MBeanServer est si facile à savoir ces fonctions :

Object getAttribute(ObjectName objname, String attrname);
AttributeList getAttributes(ObjectName objname, String[] attrnames);
MBeanInfo getMBeanInfo(ObjectName objname);
Object invoke(ObjectName objname, String method, Object[] params, String[] signature);
void setAttribute(ObjectName objname, Attribute attribute);
AttributeList setAttributes(ObjectName objname, AttributeList attributes);

Oilà une tite introduction et vous pouvez avoir le reste de l’article ici : Article JMX

Merci ^^ .