Dépasser les 2To sur un serveur HP Gen8 non équipé uEFI

Les serveurs HP de la gen8, contrairement à leurs équivalents IBM, ne sont pas équipés de rom uEFI.

C’est pourtant le pré-requis indispensable pour pouvoir booter sur un disque au format GPT, seul format Microsoft permettant le partitionnement de plus de 2To, capacité aujourd’hui très courante.

La seule solution est donc de créer deux lecteurs logiques sur le raid. L’un de 300Go par exemple qui restera en mbr pour être compatible avec le bios, et l’autre, qui servira pour les données qui sera converti en GPT depuis Windows après l’installation du système.

La 1ère étape est donc de créer cette configuration dans le raid avant de procéder a l’installation via l’intelligent provisionning:

hp1

Lors de cette étape, au moment de la création de la baie, il faudra refuser la proposition de lecteur logique incluant tout l’espace et lui redéfinir la taille à 300Go.
Une fois appliquée, créez un second lecteur logique avec la capacité restante.

hp2

hp3

Une fois cette configuration réalisée, vous pouvez installer le système d’exploitation, en indiquant a l’intelligent provisionning de ne pas toucher au réglage de la carte raid.

hp4

hp5

Une fois le système d’exploitation installé, vous pouvez alors convertir votre lecteur logique dédié au données en GPT.

hp6

Puis ensuite le formater.

hp7

Et enfin, vous aurez accès a l’ensemble de l’espace de votre RAID.

hp8

Billet d’humeur: Je trouve cependant très dommage que contrairement a IBM dont les serveurs de la série X sont équipé d’uEFI  depuis plus de 5 ans, HP, partenaire étroit de Microsoft, promoteur de l’uEFI depuis 2005, ne fasse que commencer a intégrer ce standard dans la gen9 et obligent ses utilisateurs au bricolage indiqué ci dessus. Standard pourtant intégré dans de simple cartes mères de PC à 99€…

 

Montage permanent d’un dossier ftp

Suivant l’article précédent permettant de monter un partage Windows de façon permanent sous Ubuntu.

Ceci est réaliser grâce a curlftp

apt-get install curlftp

Ensuite on ajoute le point de montage dans fstab:

vi /etc/fstab et ajouter la ligne

curlftpfs#(login):(pass)@(adresse) (dossier de montage) fuse rw,user,allow_other,uid=1000,utf8,_netdev 0 0

Puis

modprobe fuse

Référence:

http://doc.ubuntu-fr.org/curlftpfs

Remerciements à Maxime pour cette information.

Mettre à jour Windows 8.0 en 8.1 sans faire toutes les mises à jours du 8.0

En mettant a rude épreuve la patience de ses utilisateurs et l’écologie, Microsoft est très loin du « Green IT » dans sa démarche de mise à jour des ordinateurs neufs pré-installés en Windows 8.0 vers Windows 8.1.

En effet, il faut d’abord installer toutes les mises a jours (soit parfois 140 Mises à jours (près de 1,5Go) pour ensuite écraser le système par un autre… donc bien inutilement, puisque le système est remplacé.
(Réparer vous votre voiture avant de la mettre à la casse ?)

– Le coût carbone d’une telle démarche est lamentable.
– La perte de temps pour l’utilisateur l’est tout autant (surtout quand on sait que Windows 8.1 lui même dépasse les 3Go à télécharger et installer).
– Cerise sur le gâteau, sur certains ordinateurs neufs, il y a tellement de mise à jour a effectuer que le système se plante en tentant de les installer toutes.

 

Il existe une astuce pour éviter de faire l’ensemble des mises à jour du système que l’on va écraser:

1ère étape: on installe le correctif suivant:
http://support.microsoft.com/kb/2871389

Dans la barre d’adresse d’internet explorer, tapez

ms-windows-store:WindowsUpgrade

=> cela vous emmènera directement sur le store sur le package d’installation de 8.1.

Prévoyez cependant beaucoup de temps pour le téléchargement et l’installation de cette mise à jour très longue, a faire de préférence en branchant un câble réseau plutôt qu’en WIFI car en cas de coupure wifi… dommage.

Dans un monde pour Microsoft Windows n’est plus le système ultra dominant tel qu’il l’était il y a 10 ans, il serait peut-être temps que MICROSOFT prenne exemple sur MacOS qui passe en YOSEMITE sans toutes ces difficultés, idem pour UBUNTU lors d’une dist-upgrade. L’époque de la lourdeur institutionnalisée est révolue.

Bouton upload sans submit ni zone de texte (AJAX)

Après avoir chercher sur différents forums et site pour réaliser cela, voici une synthèse qui fonctionne.

Ce bouton permet de faire un upload de fichier en cliquant sur un seul bouton => dès que le fichier est sélectionnés, il est envoyé en POST en ajax.

Partie Javascript:

 $('.Bimport').click(function(e){
       e.preventDefault();
       $('Input[name="fichiercsv"]').click();
   });

   $('Input[name="fichiercsv"]').change(function (){
       $("#formimportcsv").submit();
   });

   $("body").on('submit','#formimportcsv', function(e) {
       e.preventDefault();
       $.ajax({
           type: 'POST',
           url: "/importcsv",
           data: new FormData(this),
           contentType: false,
           cache: false,    
           processData:false,  
           success: function (retour) {
               alert(retour);
               window.location.reload();
           },
           dataType: "html"
       });
  });

Partie HTML:

<form class="form-inline" action="/importcsv" method="post" role="form" id="formimportcsv" enctype="multipart/form-data">
    <a class='btn btn-primary Bimport' href=''>Import fichier TXT</a>
    <input type="file" style='position:absolute;z-index:2;top:0;left:0;filter: alpha(opacity=0);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0;background-color:transparent;color:transparent;' accept=".txt" name="fichiercsv" size="255">
</form>

 

Partie PHP (Laravel):

définir la route /importcsv » vers la fonction suivante:

public function importcsv(){
    $erreur="";

    if (!isset($_FILES["fichiercsv"])) {
         return "pas de réception de File";
    } else {

        if ($_FILES["fichiercsv"]["error"])
        {
            switch ($_FILES['fichiercsv']['error']){
                case 1: // UPLOAD_ERR_INI_SIZE
                     return "Le fichier dépasse la limite autorisée par le serveur (fichier php.ini) !";
                    break;
                case 2: // UPLOAD_ERR_FORM_SIZE
                     return "Le fichier dépasse la limite autorisée dans le formulaire HTML !";
                    break;
                case 3: // UPLOAD_ERR_PARTIAL
                     return "L'envoi du fichier a été interrompu pendant le transfert !";
                    break;
                case 4: // UPLOAD_ERR_NO_FILE
                     return "Le fichier que vous avez envoyé a une taille nulle !";
                    break;
            }

        }
        else {
            $typeautorises = Array('text/plain');
            if (!in_array($_FILES["fichiercsv"]["type"], $typeautorises)) {
                return 'Format non accepté';
            } else {
                if (!$_FILES["fichiercsv"]["name"]) {
                    return 'Nom de fichier vide';
                } else {
                    if ($_FILES["fichiercsv"]["size"] == 0) {
                        return 'Fichier reçu vide';
                    } else {
                    
                    // votre traitement ici

                    }

                }
            }
        }
    }
    return "Importation OK";
}

 

Explications:

  • Le champ input est invisible et le click du bouton affiché déclenche un click sur le champ caché.
  • Une fois le fichier choisi, l’évènement change déclenche la soumission du formulaire
  • La soumission est interceptée et envoyée en ajax.
  • La fonction PHP analyse la validité du fichier, puis exécute votre traitement.
  • Le texte renvoyé par la fonction PHP est affiché dans une boite d’alerte, puis la fenêtre html est réactualisée.

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.