Archive

Archives pour la catégorie ‘Développement’

Mettre une page de maintenance web pour 4D Server Mac

06/01/2014 Comments off
Rating 4.33 out of 5
[?]

Lors de maintenance d’un 4D Server servant des pages web, lorsque l’on doit quitter 4D Server pour maintenance, changer de version par exemple, il est très ennuyeux de ne plus avoir du tout de réponse  du serveur, nous aurions préféré envoyer une page HTML au client pour lui signifier que le serveur est en maintenance et qu’il doit revenir plus tard. Ce n’est à priori pas possible puisque 4D Server étant quitté il n’y a plus de serveur HTTP pour lui répondre.

Sauf que, dans un Mac OS X nous disposont d’un serveur web apache qui n’est pas lancé par défaut et non utilisé puisque c’est notre 4D Server qui est chargé de cette tâche.

Nous allons donc utiliser ce précieux allié pour servir une page HTML de maintenance le temps de faire nos affaires avec 4D Server. 

Le principe est très simple : nous allons démarrer le serveur web de Mac OS X dans les preferences système Partage. c’est donc Apache qui répondra sur le port 80 et enverra une page html située dans le répertoire : mondisque/Bibliotheque/WebServer/Documents/index.html. Cette page index.html contiendra les recommandation en cas de maintenance.

Notre 4D Server va lui utiliser le port 8080 au lieu du 80 standard à paramétrer dans les propriétés de la base, onglet serveur http.  Nous allons à l’aide de la commande du terminal ipfw modifier la redirection du port 80 vers 8080 lorsque le 4D Server est lancé et supprimer cette redirection lorsque 4D Server est quitté.

Pour ce faire, il faut ajouter du code dans les événements de base ‘Sur démarrage serveur’ et ‘Sur Arret serveur’.

Créer une petite méthode générique pour  permettre l’utilisation du mode admin de la machine à partir de 4D car la commande ipfw doit être exécutée en sudo (admin).

ut_Sudo :

C_TEXTE($1;$Sortie;$Erreur;$Admin;$Script)
$Admin:=$1+"\n"
$Script:="sudo -S ls"
LANCER PROCESS EXTERNE($Script;$Admin;$Sortie;$Erreur)

Cette méthode reçoit un paramètre qui est le mot de passe admin de la machine.

Sur démarrage serveur :

C_TEXTE($Sortie;$Erreur;$Admin;$Script)
$Admin:="adminpass"
ut_Sudo ($Admin)
$Script:="sudo ipfw add 8080 fwd 127.0.0.1,8080 tcp from any to any 80 in"
LANCER PROCESS EXTERNE($Script;$Admin;$Sortie;$Erreur)

Au lancement  du serveur, nous demandons au système de rediriger toutes les requêtes qui arrivent sur le port 80 (apache pour le moment) vers le port 8080 (4D)

Sur arrêt serveur :

C_TEXTE($Sortie;$Erreur;$Admin;$Script)
$Admin:="adminpass"
ut_Sudo ($Admin)
$Script:="sudo ipfw del 8080"
LANCER PROCESS EXTERNE($Script;$Admin;$Sortie;$Erreur)

En quittant le 4D Server, nous demandons au système de supprimer la règle ipfw numéro 8080 créée au démarrage du serveur, ce sera donc apache et notre page index.html qui sera servie au client.

Pour terminer, il ne faudra pas oublier de placer dans le code html du header de votre page d’index les commandes pour éviter la mise en cache de la page :


<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

Dans les préférences de Mac OSX vous trouverez dans l’option partage une boite à cocher pour lancer le serveur web Apache intégré. Cette option à disparue dans les versions récentes du système, il faudra alors lancer le serveur web à l’aide du terminal et de la commande ‘sudo apachectl start’.

 

Voilà, amusez-vous bien.

4D iTools

21/06/2012 Comments off
Rating 3.00 out of 5
[?]

SGBD Products viens de sortir une application d’aide au développeur 4D qui contient quelques utilitaires comme :

– Color 4D qui permet de déterminer les paramètres de la commande OBJET FIXER COULEUR RVB
– ASCII Tools qui permet d’analyser le contenu d’une chaine et éventuellement déceler les caractères invisibles ou encore un encodeur/décodeur BASE 64
– Des utilitaires de conversion de mesures ou temps en ticks
– ScreenSize permettant de simuler la résolution  d’un écran
– ErrorFinder recherche un code d’erreur pour la plupart des produits 4D
– La documentation en ligne ou en local de 4D disponible d’un click sans avoir à utiliser le navigateur.

4DiTools est disponible pour Macintosh et est disponible sur le MacAppstore

http://itunes.apple.com/fr/app/4ditools/id531279127?mt=12

Categories: 4D, Développement, Mac OS X Tags:

Executer une commande ‘sudo’ à partir de 4D

14/02/2012 Comments off
Rating 4.00 out of 5
[?]

4D

J’ai souvent eu besoin de pouvoir exécuter une  commande du terminal en mode admin (sudo) depuis 4D. J’ai longtemps cherché sans succès et fini par trouver comment faire. Vous trouverez un exemple de code qui relance le serveur apache sous Mac.

C_TEXTE($Sortie;$Erreur;$Admin;$Script)
$Admin:="mypassword\n"
$Script:="sudo -S ls"
LANCER PROCESS EXTERNE($Script;$Admin;$Sortie;$Erreur)
$Script:="sudo apachectl restart"
LANCER PROCESS EXTERNE($Script;$Admin;$Sortie;$Erreur)

Voilà, j’espère que cette exemple vous sera utile.

Categories: 4D, Apache, Développement, Mac OS X Tags:

Supprimer les ressources locales 4D du Client Mac et Windows

27/09/2011 Comments off
Rating 3.00 out of 5
[?]

 

4D

Pour des raisons techniques et plus précisément lors de l’utilisation de 4D Client en interprété, les ressources locales ne sont pas toujours à jour lors d’une modification de la structure par le développeur.

Pour palier à ce problème récurrent, j’ai réalisé une méthode de suppression du dossier ressources locales de la base situé dans un répertoire cache du système. Cette méthode permet de forcer la mise à jour des ressources locales lors de la connexion suivante par 4D au 4D Server.

Afin de réaliser ce processus, nous avons besoin d’executer un script terminal (.sh) sur Macintosh et d’un script batch (.bat) sous Windows.

La méthode 4D ‘ut_DeleteLocalRessources’:

$in:="" 
$out:="" 
Si (ut_IsMacintosh ) 
   $CacheFolder:=ut_Mac2Posix (ut_ParentFolder (Dossier 4D(Dossier Resources courant))) 
   $ScriptFile:=ut_Mac2Posix (Dossier 4D(Dossier Resources courant))+"DeleteResLocales.sh" 
   $Command:="chmod +x "+$ScriptFile 
   LANCER PROCESS EXTERNE($Command) 
Sinon 
   FIXER VARIABLE ENVIRONNEMENT("_4D_OPTION_BLOCKING_EXTERNAL_PROCESS";"False")
   FIXER VARIABLE ENVIRONNEMENT("_4D_OPTION_HIDE_CONSOLE";"True")
   $CacheFolder:=ut_ParentFolder (Dossier 4D(Dossier Resources courant))
   $ScriptFile:=Dossier 4D(Dossier Resources courant)+"DeleteResLocales.bat" 
Fin de si 
$Command:=$ScriptFile+" "+$CacheFolder
LANCER PROCESS EXTERNE($Command)
QUITTER 4D

Cette méthode exécute donc un script .sh sur Macintosh et un .bat sous Windows, ces deux scripts étant situés dans le répertoire ressources de la base sur le 4D Server et synchronisés au lancement de 4D (Client).

Le script .sh DeleteResLocales.sh pour Macintosh :

#!/bin/bash 

function waitquit() { 
SECS_SLEEP=3 
SECS_TIMEOUT=60 
SECS_ELAPSED=0 
SCRIPT_LOG="4dquitscriptlog.log" 
rm $SCRIPT_LOG 
RUNNING=`ps auxc | grep "4D"` 
echo  |tee -a $SCRIPT_LOG
while [[ "$RUNNING" != "" && $SECS_ELAPSED -lt $SECS_TIMEOUT ]] 
do 
echo "Waiting for 4D to stop"|tee -a $SCRIPT_LOG 
echo "Time taken before sleep: $SECS_ELAPSED"|tee -a $SCRIPT_LOG 
sleep $SECS_SLEEP 
SECS_ELAPSED=$(($SECS_ELAPSED+$SECS_SLEEP)) 
echo "Time taken after sleep: $SECS_ELAPSED"|tee -a $SCRIPT_LOG 
RUNNING=`ps auxc | grep "4D"` 
done 

RUNNING=`ps auxc | grep "4D"` 

if [ "$RUNNING" = "" ]; then 
	echo "4D not running - deleting cache files at directory $CACHE_FOLDER"|tee -a $SCRIPT_LOG 

rm -r "$CACHE_FOLDER" 
else 
	echo "4D is running - can not delete cache files $CACHE_FOLDER"|tee -a $SCRIPT_LOG 
fi 

echo "Script finished"|tee -a $SCRIPT_LOG 
} 

CACHE_FOLDER=$1 
if [ "$CACHE_FOLDER" != "" ]; then 
	waitquit& 
else 
	echo "No cache folder passed to script"|tee -a $SCRIPT_LOG 
fi 

Le script DeleteResLocales.bat pour Windows :

echo off
if not defined index set index=0
:maboucle
set /a index=index+1
tasklist /FI "IMAGENAME eq 4D.exe">c:\proc.txt
find /c "en service ne correspond aux" c:\proc.txt

if ERRORLEVEL=2 goto erreur
if ERRORLEVEL=1 goto Find
if ERRORLEVEL=0 goto noFind

:erreur
echo erreur
goto fin

:noFind
REM 4D pas lancé on peut y aller
goto deletecache

:Find
REM 4D non quitté on boucle.
ping -n 2 localhost
if %index% LSS 30 goto maboucle


:deletecache
REM On supprime le répertoire passé en paramètre et le fichier temporaire
rd %1% /s /q
del c:\proc.txt
:fin

Le principe des ces scripts est assez simple, ils vérifient que le process 4D est bien quitté avant de poursuivre et de supprimer le répertoire des ressources locales.
Il doit être possible de faire plus élégant, j’ai simplement recherché l’efficacité sans trop me soucier de l’élégance.
En attendant que 4D corrige ses bugs,j’espère que cela vous sera utile.

Exécuter du PHP dans du code 4D ?

15/05/2010 Comments off
Rating 2.50 out of 5
[?]

4DLe terminal de Mac OS enferme de nombreux outils vraiment utiles, voir indispensable aux développeurs. Par exemple, il est possible à partir d’une commande du terminal d’exécuter du PHP.
Par exemple, vous avez besoin de calculer un MD5 ou évaluer une expression.

Allez dans le terminal, tapez la ligne qui suit et Ho Miracle votre MD5 s’affiche.

$php -r "echo(md5('password'));"
5f4dcc3b5aa765d61d8327deb882cf99

Hum hum, cela me donne une idée d’utilisation dans 4D. En utilisant la commande LANCER PROCESS EXTERNE, je devrais donc pouvoir utiliser du PHP dans du code 4D ?

Hé bien testons :

$dbquote:=Caractère(34)
$stin:=""
$stout:=""
$err:=""
$password:="password"
LANCER PROCESS EXTERNE("php -r "+$dbquote+"echo(md5('"+$password+"'));"+$dbquote;$stin;$stout;$err)

Alerte($stout)

Euréka, j’ai bien une alerte contenant mon MD5…

Nous pouvons étendre cette utilisation en exécutant un fichier PHP avec l’option php -f … pour cela je vous laisse lire la doc en faisant man php dans le terminal.


Categories: 4D, Développement, Mac OS X, PHP Tags:

Gestion de documents et 4D

Rating 4.00 out of 5
[?]

4DAyant besoin de réaliser une gestion documentaire dans 4D, je me suis penché sur la possibilité de récupérer le contenu de documents afin de stocker les textes dans des champs indexés mots clés.

L’idée était donc de convertir des fichiers .rtf, .doc, .docx, .pdf en texte simple de manière à stocker tout ça dans des champs 4D.

Ceci devant être réalisé sous Mac, le postulat était relativement simple, je vais expliquer la manière dont j’ai abordé la chose.

Il existe dans le terminal de Mac OS X une commande magique ‘textutil’ qui est installée en standard et qui permet de manipuler des fichiers d’origines variées telles que .doc, etc..
Le seul format qu’il ne connait pas étant le PDF, j’ai été contraint d’utiliser un tool unix ‘pdftotext’ que l’on peut télécharger ici.

Dans 4D j’utilise donc la fonction LANCER PROCESS EXTERNE pour exécuter ces deux tools unix afin d’obtenir un fichier texte que je place ensuite dans un champ 4D.

Le code 4D pour les fichiers doc, docx, rtf…
$stin:=""
$stout:=""
$err:=""
$FilePathSource:="mondisk/mondoc.docx"
$FilePathDest:="mondisk/mondoc.txt"
LANCER PROCESS EXTERNE("textutil -convert txt "+$FilePathSource+" "+$FilePathDest;$stin;$stout;$err)

Pour les fichiers PDF j’utilise le tool ‘pdftotext’ qui n’est pas installé en standard dans Mac OS. Il y a juste un petit souci si l’on tente de l’utiliser comme pour textutil à partir de 4D car le tool ne sera pas reconnu pour son exécution. Il faut préciser le chemin complet du tool pour que 4D puisse executer la commande.

Cela donne pour les fichiers PDF :
$stin:=""
$stout:=""
$err:=""
$FilePathSource:="mondisk/mondoc.docx"
$FilePathDest:="mondisk/mondoc.txt"
LANCER PROCESS EXTERNE("/usr/local/bin/pdftotext "+$FilePathSource+" "+$FilePathDest;$stin;$stout;$err)

Pour récupérer ensuite le contenu des fichiers textes, il suffit de l’ouvrir dans 4D avec la commande Ouvrir Document et de lire son contenu.

$montexte:=""
$doc:=Ouvrir Document("mondisk:mondoc.txt")
RECEVOIR PAQUET($doc;$montexte;0;
MAXLONGTEXTEAVANTV11)
[matable]monchamp:=$montexte

Voilà, le tour est joué. J’espère que ces quelques lignes vous seront utiles.


Categories: Développement, Mac OS X Tags:

Envoyer un SMS en AppleScript via Skype

Rating 4.00 out of 5
[?]

Skype

Il est tout à fait possible d’envoyer un SMS à partir de Skype, il est même possible de le faire en AppleScript.

set thePhone to "+33xxxxxxxxx"

set theSMSText to "essai SMS de applescript "

tell application "Skype"
set TheSMS to (word 2 of (send command ("CREATE SMS OUTGOING " & thePhone) script name "Notifier") as text)

send command (("SET SMS " & TheSMS & " BODY " & theSMSText) as string) script name "Notifier"

send command (("ALTER SMS " & TheSMS & " SEND") as string) script name "Notifier"

end tell

Categories: Développement, Mac OS X Tags:

Passer des arguments à un AppleScript depuis une ligne de commande

13/02/2010 Comments off
Rating 3.67 out of 5
[?]

AppleScript

L’idée est de pouvoir passer un argument à une commande AppleScript depuis le terminal:

Utilisez l’Éditeur Applescript situé dans le répertoire Utilitaires et écrivez ce qui suit :

Écriture du script test.scpt:

on run argv
return "Bonjour, " & item 1 of argv & " ?"
end run

Execution dans le terminal :

%osascript test.scpt "tu va bien"

Bonjour, tu va bien ?.

Categories: Développement, Mac OS X Tags:

Obtenir le numéro de série d’un Mac depuis le terminal ou en 4D

Rating 3.50 out of 5
[?]

4DPour obtenir le numéro de série d’un Macintosh depuis le terminal, tapez la commande suivante :

system_profiler SPHardwareDataType | grep “Serial Number“

Dans 4D, si vous avez besoin de cette information, utilisez le code suivant :

`Méthode getSerial

C_TEXTE($Commande;$Resultat;$0)
C_TEXTE($vtentrée;$vtsortie)
$Commande:=“system_profiler SPHardwareDataType“
$vtentrée:=““
LANCER PROCESS EXTERNE($Commande;$vtentrée;$vtsortie)

$pos1:=Position(“Serial Number“;$vtsortie)
$pos2:=Position(“:“;$vtsortie;$pos1)+2
$pos3:=Position(“\n“;$vtsortie;$pos2)
$longueurserial:=$pos3-$pos2

$0:=Sous chaine($vtsortie;$pos2;$longueurserial)

Cette méthode s’utilisera comme suit : LeSerial:=getSerial

Pourquoi ne pas utiliser le grep dans la méthode 4D? me direz-vous, et bien parce que cela ne fonctionne pas, j’ai testé un lancer process externe avec la commande system_profiler SPHardwareDataType | grep \“Serial Number\“ et j’ai obtenu le texte complet et non pas le numéro de série seul. Si quelqu’un à une idée je suis preneur.

C_TEXTE($Commande;$Resultat
C_TEXTE(vtentrée;vtsortie)
$Commande:= »system_profiler SPHardwareDataType »
vtentrée:= » »
LANCER PROCESS EXTERNE($Commande;vtentrée;vtsortie)
$pos1:=Position(« Serial Number »;vtsortie)
$pos2:=Position(« : »;vtsortie;$pos1)+2
$pos3:=Position(« \n »;vtsortie;$pos2)
$longueurserial:=$pos3-$pos2
$Serial:=Sous chaine(vtsortie;$pos2;$longueurserial)
Categories: 4D, Développement, Mac OS X Tags:

Configurer 4D Server v11 en accès 4D Client distant

22/09/2009 Comments off
Rating 3.50 out of 5
[?]

Depuis la v11, 4D à besoin pour un accès distant en 4D Client d’un port supplémentaire. Le port par défaut est 19813 et peut-être changé dans les préférences de 4D. Il faut ouvrir un second port pour la communication 4D Client <-> 4D Server, ce port est le port paramétré dans les préférences plus 1.

Si le port est 19813, il faudra donc ouvrir également le 19814.

Categories: 4D, Développement Tags: