Compter pages couleurs et noires d’un PDF

Voici une routine qui devrait être utile à tout les développeurs d’applications pré-presse. Le principe peut-être retranscrit dans n’importe quel langage et s’appuie sur l’outil ghostscript.

<?php
/**
 * Created by Dominique FERET.
 * Date: 26/08/2014
 * Time: 09:56
 */
/**
 * Fonction qui analyse la nature des pages d'un pdf.
 * @param $nomfichier   => chemin et nom du fichier.
 * @return $this        => retourne un tableau encodé en JSON contenant la liste des pages de chaque type et leur comptes
 */
function analysepdf($nomfichier)
{
    header('content-type: application/json');
    mb_internal_encoding("UTF-8");

    $o = new stdClass();
    if (file_exists($nomfichier)){
        $commande = 'gs  -o - -q -sDEVICE=inkcov "' . $nomfichier . '"';
        $lignes = array();
        exec($commande, $lignes);
        $noir = 0;
        $couleur = 0;
        $blanche = 0;
        $pagesblanches=array();
        $pagesnoires=array();
        $pagescouleurs=array();
        $numeropage=0;
        foreach ($lignes as $ligne) {

            $cyan = substr($ligne, 1, 7);
            $magenta = substr($ligne, 10, 7);
            $yellow = substr($ligne, 19, 7);
            $black = substr($ligne, 28, 7);
            if (is_numeric($cyan)&& is_numeric($magenta) && is_numeric($yellow) && is_numeric($black)){ // si la ligne contient bien une ligne de valeurs
                $numeropage++; // on ajoute 1 a la ligne en cours
                if((($cyan+$magenta+$yellow)==0)){
                    $noir++;
                    if($black==0) {
                        $pagesblanches[]=$numeropage;
                        $blanche++;
                    }
                    $pagesnoires[]=$numeropage;
                }else{
                    $couleur++;
                    $pagescouleurs[]=$numeropage;
                }
            }

        }
        $o->listepagescouleurs=implode(",",$pagescouleurs);
        $o->listepagesnoires=implode(",",$pagesnoires);
        $o->listepagesblanches=implode(",",$pagesblanches);
        $o->totalpages = $numeropage;
        $o->pagesnoires = $noir;
        $o->pagescouleurs = $couleur;
        $o->pagesblanches = $blanche;
    }
    return json_encode($o);
}

Ubuntu 14.04 se bloque sous hyper-v

prompt

A l’instar de Windows, Ubuntu 14.04 comporte des « fonctionnalités »… appellé « bug » par le commun des mortels. 🙂
Ubuntu 14.04 virtualisé sous hyper-v, au bout d’un certain temps « gèle » aléatoirement. Le noyau 3.13 serait en cause ce qui explique pourquoi ubuntu 12.04LTS n’a pas ce problème.

 

 

La solution en attendant un correctif du noyau  (Edit du 17/10: ce problème est aujourd’hui réglé):

cd /etc/default
sudo vi grub

ajouter "nohz=off elevator=deadline transparent_hugepage=always" dans les paramètres de la ligne "GRUB_CMDLINE_LINUX_DEFAULT"

sauvegardez puis faire:

sudo update-grub

Ensuite dans le fichier /etc/sysctl.conf

Ajouter les lignes suivante

kernel.sched_min_granularity_ns=10000000
kernel.sched_wakeup_granularity_ns=15000000
vm.dirty_ratio=10
vm.dirty_background_ratio=5
vm.swappiness=10

Sauvegardez puis redémarrez

=> le système devrait être plus stable.

 

Modification du 9 Mai 2015:

Dans sa distribution 14.04.2, Ubuntu distribue le noyau 3.16. Celui bénéfie d’une meilleur integration dans un Hyper-v sous windows 2012r2. (Windows ne signale plus l’intégration comme dégradée). Pour en bénéficier, il suffit d’installer ce noyau en utilisant la commande:

sudo apt-get install linux-image-generic-lts-utopic

Trouver les derniers enregistrements dans un groupement sans LAST en MySQL

logo-mysql-110x57Mysql ne comporte pas fonction last et lorsque l’on fait un groupement, on ne peut récupérer les derniers enregistrements sur la base d’un regroupement.

 

Dans un de mes développement, j’avais les coordonnées de destinataire intégrée dans une table nommée commandes. (pour éviter une table supplémentaire dans un schéma déjà complexe)

La difficulté était de récupérer la liste des destinataires avec leurs coordonnées les plus récente. Ces dernières se trouvent dans la dernière commande passée pour chaques destinataires.

Une requête SQL telle que:

select numero_client, nom,prenom,adresse,codepostal, ville from commandes group by numero_client

ne récupère pas le dernier enregistrement.Hors si le destinataire a changé de nom ou d’adresse, cela pose problème.

On peut contourner le problème par une requête en deux temps:

select numero_client, nom,prenom,adresse,codepostal, ville from commandes where id in (select max(id) from commandes group by numero_client)

La 1ere partie de la requête select max(id) from commandes group by numero_client va établir une liste des id de la dernière commande pour chaque client.Ensuite la seconde partie de la requête va sélectionner les lignes correspondantes à la liste d’id précédemment créé.

Cela permet de contourner le problème de l’absence de l’instruction last.

 

 

 

 

 

Recherche des jours ouvrés en PHP

calendrierIl est fréquent d’avoir besoin de calculer J+1 ou J-1 dans un logiciel mais que le résultat soit un jour ouvré.
Voici un listing permettant les calculs nécessaire. Dans ce listing, les jours ouvré sont considérés comme du Lundi au Vendredi. Il est possible de changer cela en ligne 70 sur array(0,6)

 

<?php
/*
Calcules de dates.
Ecrite par Dominique FERET le 17 Juin 2014

fonction paques(annee) => renvoi la date du dimanche de paques basé sur l'algorythme de Gauss.
fonction ferie(annee) => renvoi un tableau de tout les jours férié de l'année
fonction trouvejourouvre(date,decalage) => renvoi le prochain jour ouvré dans le sens du décalage (exprimé en jours)

exemple d'utilisation
echo trouvejourouvre("02-01-2014",-1)."<br>";
=> renverra 31-12-2013

echo trouvejourouvre("15-08-2014",1)."<br>";
=> renverra 18-08-2018 => le prochain jour ouvré après le 15 aout 2014 sera le 18 Aout.

echo trouvejourouvre("17-07-2014",-3)."<br>";
=> renverra 11-07-2014 => le jour ouvré j-3 du 17 juillet sera le 11 car j-3 = 14 (le 12 et 13 étant samedi dimanche)

*/

function paques($annee){
    $a=$annee%19;
    $b=$annee%4;
    $c=$annee%7;
    $d=(19*$a+24)%30;
    $e=(2*$b+4*$c+6*$d+5)%7;
    $j=22+$d+$e;
    $m=3;
    if($j>31){
        $m+=1;
        $j-=31;
    }
    $datepaques=sprintf("%02d-%02d-%04d",$j,$m,$annee);
    return $datepaques;
}
function ferie($annee){
    $listedate=array();
    $listedate[]=date("01-01-".$annee);
    $listedate[]=date("01-05-".$annee);
    $listedate[]=date("08-05-".$annee);
    $listedate[]=date("14-07-".$annee);
    $listedate[]=date("15-08-".$annee);
    $listedate[]=date("01-11-".$annee);
    $listedate[]=date("11-11-".$annee);
    $listedate[]=date("25-12-".$annee);
    $datepaques=strtotime(paques($annee));

    $listedate[]=date('d-m-Y',strtotime('+1 day',$datepaques));
    $listedate[]=date('d-m-Y',strtotime('+39 days',$datepaques));
    $listedate[]=date('d-m-Y',strtotime('+50 days',$datepaques));
    return $listedate;
}

// cette fonction permet de trouver le jour ouvré correspondant a une date + ou - un nombre de jour
function trouvejourouvre($dateactuelle,$decalage)
{
    $datecalculee=strtotime($dateactuelle);
    $datecalculee+=($decalage*86400);
    // a ce stade, $datecalcule contient la date demandée sans tenir compte des jours ouvrés.

    //le décalage ensuite se fera jour par jour en plus ou en moins selon le décalage initiale
    $decalage=($decalage>0)?86400:-86400;
    //boucle
    $x=0;
    do {
        $x++;
        // Si le jour suivant n'est ni un dimanche (0) ou un samedi (6), ni un jour férié, on sort, sinon on ajoute ou on retire un jour
        if (!in_array(date('w', $datecalculee), array(0, 6)) && !in_array(date('d-m-Y',$datecalculee), ferie(date("Y",$datecalculee)))) {
            break;

        } else {
            $datecalculee+=$decalage;
        }
    }  while ($x<10); // petite sécurité,certes inutile mais je déteste les boucles infinies
    return( date('d-m-Y',$datecalculee));

}

?>

Monter un partage Windows de façon permanente

120px-Human-gnome-fs-smb.svgmonter un partage Windows sous linux avec accès écriture complet

 

 

 

premier étape: Installer les utilitaires cifs

sudo apt-get install cifs-utils

deuxième étape: Créer le dossier du point de montage:

sudo mkdir /ftp

ensuite on creer le fichier contenant les identifiant réseau d’acces au partage windows:

sudo vi ~/.smbcredentials

et dedans on met:

username=(login windows de l'utilisateur)
password=(mot de passe windows de l'utilisateur)
domain=(domain de l'utilisateur)
sudo /etc/fstab

dans ce fichier on ajoute la ligne suivante:

//serveur2008/ftp /ftp cifs sec=ntlm,credentials=/home/(nomdel'utilisteur)/.smbcredentials,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0

puis

sudo mount -a

pour tester

il est conseillé de sécuriser ensuite le fichier .smbcredentials avec un chmod 0600

Mise à jour:
Dans Ubuntu 14.04, il est possible d’optimiser la connexion pour utiliser la version de SMB correspondant au montage du système de destination avec le paramètres vers=x.y

avec x.y =
2.0 pour un Windows 2008/vista
2.1 pour un Windows 2008r2/windows 7
ou
3.0 pour un Windows 2012/windows8

donc la dernière version de la ligne dans le fichier fstab serait:

//serveur2008/ftp /ftp cifs sec=ntlmssp,rw,credentials=/home/(nomdel'utilisteur)/.smbcredentials,vers=2.1,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0

 

 

 

#!/usr/bin/php^M : mauvais interpreteur de commande

Lorsque que l’on écrit un script php destiné a être une ligne de commande linux, il faut s’assurer le texte a ses retours de chariot formaté façon linux (LF). Si ce n’est pas le cas on obtient ce message d’erreur.

Pour le changer dans phpstorm il faut cliqué en bas a droite de la fenêtre de phpstorm sur

CR/LF pour le changer en LF

 

Dans ultraedit c’est dans le menu édition=>Convertir les sauts de ligne => Convertir en Format UNIX (LF)

 

Après réenregistrement le script s’exécutera normalement en ligne de commande.

Voir les ordinateurs inactifs dans l’active directory

Sur un active directory ayant plusieurs années, il est courant que nombreux comptes d’ordinateurs ne soit plus utilisé mais reste présent. Il n’y a pas d’option d’affichage de date de derniere connexion dans la console « utilisateur et ordinateurs active directory » mais heureusement il existe une alternative en ligne de commande:

dsquery computer -inactive 52 | sort

=> vous sortira tout les comptes ordinateur ne s’étant pas connecté depuis 1 an (le chiffre indiquant le nombre de semaine d’inactivité).

idem pour les utilisateurs:

dsquery users -inactive 52 | sort

Windows 2012r2 hyper-v

L’édition hyper-v de Windows 2012R2 est gratuite. Seule les machines virtuelles Windows installées dessus nécessitent la licence correspondante. Mais si par exemple vous ne mettez que des Ubuntu, aucune licence n’est alors requise.

Il y’a cependant des contraintes (si vous ne pouvez remplir l’une d’elles, préférez Proxmox ou autres):

  • Elle nécessite cependant la possession d’un second serveur équipée d’une edition Standard de Windows 2012r2 pour pouvoir controler l’hyperviseur
  • de disposer d’un contrôleur de domaine pour que l’authentification entre le 2012 standard et le 2012 hyper-v se fasse correctement (le 2012 standard peut-etre le controleur de domaine).
  • il est en mode core exclusivement ce qui implique pas d’accès au gestionnaire de périphérique si la carte réseau n’est pas reconnue. extrêmement gênant en cas d’usage d’un matériel exotique.

Un fois installer, l’accroche au domaine se fait avec sconfig ou PowerShell.

Sur le 2012 standard il faut l’ajouter dans les serveurs à gérer . Il est alors pilotable depuis ce poste, vous aurez alors la possibilité de le gérer entièrement.

Teaming de carte réseau:
Si vous souhaiter créer un agrégat de carte réseau, il doit être fait avant la création du concentrateur virtuel. Si vous choisissez le teaming LACP, il est impératif que la configuration des ports du switch soit corrélée, c’est a dire également réglé en LACP sous peine de perte de dialogue avec le serveur.

Ensuite il faut créer le concentrateur virtuel. Pensez a activer SR-IOV (accélération matériel) si vous voulez pouvoir l’utiliser ensuite pour les machines virtuelles.

Et la dernière dans l’installation de de machines virtuelles.

attention aux migrations: les machines virtuelles créés sur un hyper-v 2008 ou 2008r2 ne fonctionneront pas sur un 2012r2. Dans ce cas, il faudra reprendre les vhd et recreer une vm avec, mais ceci aura pour effet de faire sauter vos activations de licences.

Monter un partage NFS d’un nas netgear sur Ubuntu

Si, par exemple pour sauvegarder vos données ou avoir un partage commun entre plusieurs machine
Ubuntu vous souhaitez partager un dossier sur un nas NETGEAR voici la méthode.

Un préambule a savoir:
Les nas netgear comporte un dossier parent dans lequel se trouve les partages que vous pouvez créer. Selon la version de Raidiator (nom du firmware) présente, ce dossier ne porte pas le même nom.

Sur la version 4.xxxx de RAIDiator celui-ci s’appelle « c ».
Sur la version 6.xxxx de RAIDiator celui-ci s’appelle « data »
dans cette exemple, on prendra la version 4. donc /c/ comme début de chemin. a remplacer donc par /data/ pour une version 6.

Méthode:
Sur le Nas:
– Il faudra activer le protocole NFS dans les services
– Creer le partage NFS

Sur la version 6, (au design palot pour suivre la mode Microsoft/Apple et comportant multiples bugs non existant dans la version 4):

La même chose sur la version 4:

Notez un point très important:

Pour avoir le droit de faire un CHMOD sur les dossiers, vous devrez Obligatoirement définir l’ip de l’ordinateur Ubuntu ayant l’autorisation d’acces racine (ROOT) sinon vous chercherez un moment pour comprendre pourquoi un CHMOD lancé en root depuis votre ubuntu échoue avec des problèmes de droits.
Sur Ubuntu:
– Il faudra installer NFS
– Creer un dossier pour recevoir le montage
– Puis monter le partage soit pour l’usage unique, soit pour qu’il se recrée à chaque démarrage.
 

sudo apt-get install nfs-common

cd /
sudo mkdir /monpointdemontage
sudo mount -o soft,intr,rsize=8192,wsize=812 ipdemonnas:/c/partagesurmonnas /monpointdemontage
pour l’auto-monter au démarrage:

sudo vi /etc/fstab

et ajouter la ligne

ipdemonnas:/c/monpartage /monpointdemontage nfs soft,intr,rsize=8192,wsize=8192

puis rebooter: sudo shutdown -r 0

après le reboot, voir le resultat avec la commande df -h

Sql server express (2008 ou 2012)

 
sqlIl est aisé d’installer sql server express, l’usage depuis le réseau d’une instance nécessite quelques astuces a connaitre.

 

 

Le service sqlbrowser doit être démarré automatiquement et autorisé sur le pare-feu. Attention l’exécutable de ce service est 32 bits et se trouve dans le répertoire de la version 2005. (version 9.0)

Dans la propriété de l’instance souhaitée, le tcp-ip doit être activé. (a régler a l’outils de gestion des connexions)

le service sqlserver.exe correspondant à l’instance doit être autorisé dans le pare feu.

il est possible de raccrocher une table a une instance avec le sql management studio. Celui-ci ce trouve être proposer sur la même page de téléchargement que sql server 2012 express et fait pour l’instant 630 Mo.
Une autre méthode est de le faire en requête SQL avec Transact-sql en suivant cette méthode

Référence complémentaire:

http://www.windows8facile.fr/installer-sql-server-2008-r2-express/