PHP : méthode récursive pour parcourir et afficher un dossier et son contenu

Cette méthode permet de :

  • Parcourir un dossier sur un serveur web PHP,
  • Afficher son contenu hiérarchisé, par dossiers
  • Afficher les fichiers et le lien pour les télécharger
  • Afficher tout ça dans l’ordre alphabétique

Voici la méthode PHP :

// obtenir l'URL locale (méthode perso)
$localURL = Tools::get_urlLocal();

//=========================================
// Parcourt un dossier et affiche sous forme hiérarchisée
// les dossiers deviennent des titre
// les fichiers deviennent des liens pour télécharger le fichier
//=========================================
function parcourtDossier($chemin, $level) {
	global $localURL;

	if (is_dir($chemin)) {
		// c'est un dossier

		// ouvre le dossier 
		if ($handle = opendir($chemin)) {

			// liste de tout ce qu'on va trouver
			$dirFiles = array();

			// récupère la liste des fichiers/dossiers
			while (false !== ($entry = readdir($handle))) {
				$dirFiles[] = $entry;
			}

			// trie dans l'ordre alpha
			sort($dirFiles, SORT_NATURAL | SORT_FLAG_CASE);

			// affiche la liste triée
			foreach($dirFiles as $entry) {

				if ($entry != "." && $entry != "..") {

					if (is_dir($chemin.'/'.$entry)) {
						
						// affiche le nom du dossier
						if ($level == 0) {
							$b1 = '<div style="width:100%; background-color:#ddd; padding:1px; margin-top:20px;"><h2 style="padding-left:20px; ">';
							$b2 = '</h2></div>';
						}
						if ($level == 1) {
							$b1 = '<div style="width:100%; background-color:#eee; padding:1px; margin-top:15px;"><h4 style="padding-left:20px;">';
							$b2 = '</h3></div>';
						}
						if ($level >= 2) {
							$b1 = '<div style="width:100%; background-color:#f4f4f4; margin-top:10px;"><b style="padding-left:20px;">';
							$b2 = '</b></div>';
						}
						// rajouter des niveaux si besoin

						echo $b1;
						echo '<b>'.$entry.'</b>';
						echo $b2;

						// affiche le contenu du dossier
						echo '<div style="margin-left:60px; margin-top:4px;">';
						parcourtDossier($chemin.'/'.$entry, $level + 1);
						echo '</div>';
					}
					else {
						// $chemin est un un fichier
						// affiche un lien pour le télécharge
						echo '• <a href="'.$localURL.'kp-content/download/'.$chemin.'/'.$entry.'" download>'.$entry.'</a><br/>';
					}

				}
			}
			closedir($handle);
		}

	} else {
		// $chemin est un fichier
		// utilisé seulement dans le cas où on le paramètre est un nom de fichier
		if ($chemin != "." && $chemin != "..") {
			echo '<a href="'.$localURL.'kp-content/download/'.$chemin.'" download>'.$chemin.'</a><br/>';
		}
	}
}

parcourtDossier("chemin/du/dossier", 0);
PHP : Méthode pour parser un dossier et l'afficher

Ecrire dans un textBox depuis un autre thread / appel Thread-safe dans un Windows Form

Lorsqu’on appelle une méthode qui écrit dans un textBox (par exemple) sur une Form, et qu’on l’appelle depuis un autre thread, une autre classe, une erreur est retournée. Ce n’est pas « thread-safe« .

Pour contrer cela, il faut utiliser invoke. Par exemple si dans la class de ma Form, j’ai une méthode qui écrit dans une textBox :

public void log(string value)
    {
    if (InvokeRequired)
        {
            this.Invoke(new Action<string>(log), new object[] { value });
            return;
        }
        Console.WriteLine("LOG : " + value);
        textBox_log.Text += value + "\r\n";
    }

 

 

C# : Socket ou TcpListener / TcpClient ?

Les 2 classes ont un objectif similaire et utilisent les mêmes méthodes : faire communiquer 2 éléments. Voici la différence entre Socket et TcpListener/TcpClient.

TCPListener est une classe dérivée de Socket, qui se concentre uniquement sur le protocole TCP.

Socket permet d’utiliser des protocoles TCP, mais aussi d’autres comme UDP et permet une configuration plus précise.

La différence n’est pas énorme en terme de lignes de codes. Mais si tu ne connais pas trop encore les Socket et les détails des protocoles, utilise TCPListener et TcpClient, qui sont une version épurée et plus simple de Socket.

Si tu sais ce que tu fais et/ou que tu veux un autre protocole que Tcp, utilise les Socket.

Raspberry PI : sortie HDMI, CEA ou DMT ?

Le Raspberry PI offre une sortie physique HDMI. Et un paramétrage très précis. Par exemple sur Raspbian, ouvrez le fichier /boot/config.txt et vous pouvez forcer la résolution et le mode utilisé avec le paramètre hdmi_group.

En HDMI, il y a 2 modes sur le Raspberry PI : CEA ou DMT.

hdmi_group=1   # CEA
hdmi_group=2   # DMT

HDMI CEA – hdmi_group=1

Le mode CEA signifie « Consumer Electronics Association ». Il a été conçu pour les TV et propose plusieurs modes entrelacés et progressifs.

Le mode CEA est habituellement proposé en PAL (25/50/100Hz) ou NTSC (30/60/120Hz) et des résolutions de 288/480/576/720/1080 lignes.

 

Dans ce mode, voici les résolutions possibles

These values are valid if hdmi_group=1 (CEA)
hdmi_mode=1    VGA
hdmi_mode=2    480p   60 Hz
hdmi_mode=3    480p   60 Hz  H
hdmi_mode=4    720p   60 Hz
hdmi_mode=5    1080i  60 Hz
hdmi_mode=6    480i   60 Hz
hdmi_mode=7    480i   60 Hz  H
hdmi_mode=8    240p   60 Hz
hdmi_mode=9    240p   60 Hz  H
hdmi_mode=10   480i   60 Hz  4x
hdmi_mode=11   480i   60 Hz  4x H
hdmi_mode=12   240p   60 Hz  4x
hdmi_mode=13   240p   60 Hz  4x H
hdmi_mode=14   480p   60 Hz  2x
hdmi_mode=15   480p   60 Hz  2x H
hdmi_mode=16   1080p  60 Hz
hdmi_mode=17   576p   50 Hz
hdmi_mode=18   576p   50 Hz  H
hdmi_mode=19   720p   50 Hz
hdmi_mode=20   1080i  50 Hz
hdmi_mode=21   576i   50 Hz
hdmi_mode=22   576i   50 Hz  H
hdmi_mode=23   288p   50 Hz
hdmi_mode=24   288p   50 Hz  H
hdmi_mode=25   576i   50 Hz  4x
hdmi_mode=26   576i   50 Hz  4x H
hdmi_mode=27   288p   50 Hz  4x
hdmi_mode=28   288p   50 Hz  4x H
hdmi_mode=29   576p   50 Hz  2x
hdmi_mode=30   576p   50 Hz  2x H
hdmi_mode=31   1080p  50 Hz
hdmi_mode=32   1080p  24 Hz
hdmi_mode=33   1080p  25 Hz
hdmi_mode=34   1080p  30 Hz
hdmi_mode=35   480p   60 Hz  4x
hdmi_mode=36   480p   60 Hz  4xH
hdmi_mode=37   576p   50 Hz  4x
hdmi_mode=38   576p   50 Hz  4x H
hdmi_mode=39   1080i  50 Hz  reduced blanking
hdmi_mode=40   1080i 100 Hz
hdmi_mode=41   720p  100 Hz
hdmi_mode=42   576p  100 Hz
hdmi_mode=43   576p  100 Hz  H
hdmi_mode=44   576i  100 Hz  
hdmi_mode=45   576i  100 Hz  H
hdmi_mode=46   1080i 120 Hz  
hdmi_mode=47   720p  120 Hz  
hdmi_mode=48   480p  120 Hz  
hdmi_mode=49   480p  120 Hz  H
hdmi_mode=50   480i  120 Hz  
hdmi_mode=51   480i  120 Hz  H
hdmi_mode=52   576p  200 Hz  
hdmi_mode=53   576p  200 Hz  H
hdmi_mode=54   576i  200 Hz  
hdmi_mode=55   576i  200 Hz  H
hdmi_mode=56   480p  240 Hz  
hdmi_mode=57   480p  240 Hz  H
hdmi_mode=58   480i  240 Hz  
hdmi_mode=59   480i  240 Hz  H

HDMI DMT – hdmi_group=2

Le mode DMT est conçu pour les moniteurs, les écrans de PC. Les modes entrelacés ne sont PAS proposés. Les résolutions proposées sont 640/720/800/1024/1280 lignes et des fréquences comme 60/70/75/80/85/120Hz

Le son n’est pas présent sur le mode DMT.

Dans le mode DMT, voici les résolutions possibles

hdmi_mode=1    640x350    85 Hz
hdmi_mode=2    640x400    85 Hz
hdmi_mode=3    720x400    85 Hz
hdmi_mode=4    640x480    60 Hz
hdmi_mode=5    640x480    72 Hz
hdmi_mode=6    640x480    75 Hz
hdmi_mode=7    640x480    85 Hz
hdmi_mode=8    800x600    56 Hz
hdmi_mode=9    800x600    60 Hz
hdmi_mode=10   800x600    72 Hz
hdmi_mode=11   800x600    75 Hz
hdmi_mode=12   800x600    85 Hz
hdmi_mode=13   800x600   120 Hz
hdmi_mode=14   848x480    60 Hz
hdmi_mode=15   1024x768   43 Hz  DO NOT USE
hdmi_mode=16   1024x768   60 Hz
hdmi_mode=17   1024x768   70 Hz
hdmi_mode=18   1024x768   75 Hz
hdmi_mode=19   1024x768   85 Hz
hdmi_mode=20   1024x768  120 Hz
hdmi_mode=21   1152x864   75 Hz
hdmi_mode=22   1280x768          Reduced blanking
hdmi_mode=23   1280x768   60 Hz
hdmi_mode=24   1280x768   75 Hz
hdmi_mode=25   1280x768   85 Hz
hdmi_mode=26   1280x768  120 Hz  Reduced blanking
hdmi_mode=27   1280x800          Reduced blanking
hdmi_mode=28   1280x800   60 Hz  
hdmi_mode=29   1280x800   75 Hz  
hdmi_mode=30   1280x800   85 Hz  
hdmi_mode=31   1280x800  120 Hz  Reduced blanking
hdmi_mode=32   1280x960   60 Hz  
hdmi_mode=33   1280x960   85 Hz  
hdmi_mode=34   1280x960  120 Hz  Reduced blanking
hdmi_mode=35   1280x1024  60 Hz  
hdmi_mode=36   1280x1024  75 Hz  
hdmi_mode=37   1280x1024  85 Hz  
hdmi_mode=38   1280x1024 120 Hz  Reduced blanking
hdmi_mode=39   1360x768   60 Hz  
hdmi_mode=40   1360x768  120 Hz  Reduced blanking
hdmi_mode=41   1400x1050         Reduced blanking
hdmi_mode=42   1400x1050  60 Hz  
hdmi_mode=43   1400x1050  75 Hz  
hdmi_mode=44   1400x1050  85 Hz  
hdmi_mode=45   1400x1050 120 Hz  Reduced blanking
hdmi_mode=46   1440x900          Reduced blanking
hdmi_mode=47   1440x900   60 Hz  
hdmi_mode=48   1440x900   75 Hz  
hdmi_mode=49   1440x900   85 Hz  
hdmi_mode=50   1440x900  120 Hz  Reduced blanking
hdmi_mode=51   1600x1200  60 Hz  
hdmi_mode=52   1600x1200  65 Hz  
hdmi_mode=53   1600x1200  70 Hz  
hdmi_mode=54   1600x1200  75 Hz  
hdmi_mode=55   1600x1200  85 Hz  
hdmi_mode=56   1600x1200 120 Hz  Reduced blanking
hdmi_mode=57   1680x1050         Reduced blanking
hdmi_mode=58   1680x1050  60 Hz  
hdmi_mode=59   1680x1050  75 Hz  
hdmi_mode=60   1680x1050  85 Hz  
hdmi_mode=61   1680x1050 120 Hz  Reduced blanking
hdmi_mode=62   1792x1344  60 Hz  
hdmi_mode=63   1792x1344  75 Hz  
hdmi_mode=64   1792x1344 120 Hz  Reduced blanking
hdmi_mode=65   1856x1392  60 Hz  
hdmi_mode=66   1856x1392  75 Hz  
hdmi_mode=67   1856x1392 120 Hz  Reduced blanking
hdmi_mode=68   1920x1200         Reduced blanking
hdmi_mode=69   1920x1200  60 Hz  
hdmi_mode=70   1920x1200  75 Hz  
hdmi_mode=71   1920x1200  85 Hz  
hdmi_mode=72   1920x1200 120 Hz  Reduced blanking
hdmi_mode=73   1920x1440  60 Hz  
hdmi_mode=74   1920x1440  75 Hz  
hdmi_mode=75   1920x1440 120 Hz  Reduced blanking
hdmi_mode=76   2560x1600         Reduced blanking
hdmi_mode=77   2560x1600  60 Hz  
hdmi_mode=78   2560x1600  75 Hz  
hdmi_mode=79   2560x1600  85 Hz  
hdmi_mode=80   2560x1600 120 Hz  Reduced blanking
hdmi_mode=81   1366x768   60 Hz  
hdmi_mode=82   1080p      60 Hz  
hdmi_mode=83   1600x900          Reduced blanking
hdmi_mode=84   2048x1152         Reduced blanking
hdmi_mode=85   720p       60 Hz  
hdmi_mode=86   1366x768          Reduced blanking

Sources & plus d’infos

http://elinux.org/RPiconfig

http://raspberrypi.stackexchange.com/questions/7332/what-is-the-difference-between-cea-and-dmt

https://www.raspberrypi.org/documentation/configuration/config-txt.md

Lire une clef USB depuis un Raspberry Pi

Etape 1 – Préparer le terrain

Ouvrir le terminal et saisir :

ls -l /dev/disk/by-uuid/

Etape 2 – Brancher la clef USB

Brancher la clef USB sur un des ports USB du Raspberry Pi.

Etape 3 – Identifier la clef

Dans le terminal, saisir à nouveau :

ls -l /dev/disk/by-uuid/

Une ligne a été ajoutée par rapport à l’étape 1. Elle indique l’identifiant de la clef. Généralement /dev/sda1.

Etape 4 – Créer le point de montage (la première fois seulement)

Dans le terminal :

sudo mkdir /media/usb
sudo chown -R pi:pi /media/usb

Etape 5 – Monter manuellement la clef USB

Dans le terminal :

sudo mount /dev/sda1 /media/usb -o uid=pi,gid=pi

Elle est maintenant présente dans le dossier /média de l’explorateur.

Activer IIS sur Windows 10

IIS n’est pas actif sur Windows 10 par défaut, mais il est présent. Voici la procédure pour l’activer.

Tape sur les touches « Windows + R » pour ouvrir la fenêtre « Exécuter »

Saisis « appwiz.cpl »

Clique sur « Activer ou désactiver des fonctionnalités Windows ».

Une fenêtre  « Fonctionnalités de Windows » s’ouvre.

Coche dans la liste « Internet Information Services ».

Si besoin, regarde dans l’arborescence pour cocher des options spécifiques. Puis OK.

Vérification

Ouvre le navigateur et entre « localhost » pour tester.

ANIMATE CC : contrôle des masques via le code

Avec Flash Pro, on pouvait placer un masque sur un calque, pour masquer un objet sur un second calque. Chaque objet avait son label et on pouvait appeler chaque élément directement dans le code de cette façon :

this.rectangle.width = 10;
this.objet_masque.width = 20;

Mais ça, c’était AVANT.

Avec Adobe Animate, on ne peux plus modifier le masque de cette façon.

Pour modifier le masque,

  1. je te recommande de ne placer qu’un seul objet par calque : 1 objet masqué et 1 masque;
  2. on accède au masque via l’objet masqué, de cette façon :
this.rectangle.mask.scaleX = 1.5;

Au passage, tu noteras, que .width n’est plus accessible et qu’il faut utiliser uniquement la propriété .scaleX.

ANIMATE CC : width et height ne sont plus accessibles

Pour tout élément créé dans l’interface d’Adobe Animate CC, il est devenu impossible d’interagir sur ses dimensions via les propriétés .width et .height, comme c’était possible avec Adobe Flash Pro.

Pour cela, seules les propriété .scaleX et .scaleY sont encore accessibles et modifiables dans le code JS.

Sachant que la valeur de départ, celle qui est définie sur scaleX et scaleY au démarrage de votre animation est 1.

Exemple : si tu veux une dimension à 50%, il faut attribuer la valeur .scaleX = 0.5

Attention, le point d’ancrage est au centre de l’objet.

SVN : Mise en place de Tortoise SVN

Tortoise SVN est un outil de gestion SVN client, qui tourne sur Windows, et s’utilise directement dans l’explorer.

Installer Tortoise SVN depuis leur site :

https://tortoisesvn.net/downloads.html

Une bonne pratique, que j’utilise et conseille, est de situer tous tes projets dans un seul dossier, comme par exemple D:/WS/

WS pour Working Space. D car c’est toujours mieux de séparer du disque dédié à l’OS.

CAS PRATIQUE D’EXEMPLE

Dans l’exporer Windows, clic droit sur le dossier D:/WS/MON_PROJET/

Il apparait 2 nouvelles lignes « Checkout » et « Tortoise SVN ».

  • Checkout sert à connecter ce dossier au repository.
  • TortoiseSVN sert à utiliser les commandes de Tortoise.

Cliquer sur « CHECKOUT »

Se connecter au repository svn://IP_SERVEUR/MON_PROJET

Une fois connecté, 2 nouvelles lignes apparaissent dans le menu contextuel du dossier : UPDATE et COMMIT

  • UPDATE permet de mettre à jour ses fichiers locaux du dossier selon la version du serveur
  • COMMIT permet d’envoyer ses fichiers du dossier sur le serveur

D’autres options apparaissent dans le sous-menu TortoiseSVN, comme :

Add to ignore list, qui permet de placer un fichier sur la « ignore list », c’est à dire qu’il ne sera jamais mis à jour. Pratique pour les fichiers de travail propres au PC local, comme les fichiers d’Eclipse par exemple.

UBUNTU / SVN : Créer un dépôt (ou repository)

Pré-requis : Installer un serveur SVN

CREER LE DOSSIER

En ligne de commande, passer en admin.

Créer le dossier :

svnadmin create /var/svn/MON_REPOSITORY

Editer le fichier config du repository

vi /var/svn/MON_REPOSITORY/conf/svnserve.conf

Trouver ces 3 lignes pour les décommenter et changer le paramètre en ceci :

anon-access = none
auth-access = write
password-db = passwd

Cela permet de protéger les accès. ATTENTION : pas d’espace devant !

GERER LES DROITS D’ACCES

Les accès sont gérés par le fichier /var/svn/MON_REPOSITORY/conf/passwd

Editer le fichier :

vi /var/svn/MON_REPOSITORY/conf/passwd

Les utilisateurs sont listés, ainsi que les mots de passe. Pour en ajouter ou enlever, il suffit d’éditer la liste, sur le modèle :

login = password

Exemple :

[users]
lechat = miaoumiaou
lechien = ouafouaf

Sauver, quitter.

UTILISATEUR SVN

Si tu as défini un utilisateur précis pour svn -c’est mieux-, il faut attribuer le dossier à cet utilisateur

chown svn:svn  /var/svn/MON_REPOSITORY/ -R

Voilà, c’est fonctionnel depuis Tortoise ou Eclipse SVN !