Développement
Accéder à Active Directory avec Python
7
Python-ldap est une API permettant l’accès à votre annuaire LDAP avec un script Python. Rien de nouveau, c’est connu, mais c’est vraiment pratique et très puissant. L’objectif que je m’étais fixé était de pouvoir stocker dans une liste tous les membres d’un groupe de l’AD, sans doublon, et en détaillant les membres des groupes inclus dans groupes … Bref, tout bêtement du récursif. Si ça intéresse quelqu’un, qu’il le demande
. Le script ci-dessous permet simplement d’afficher les informations d’un utilisateur. Une fois que vous avez ceci, vous pouvez tout faire très simplement, ça coule de source. A noter que j’ai utilisé python2.7 et python-ldap2.4.10.
# -*- coding: iso-8859-1 *-* import ldap ldap.set_option(ldap.OPT_REFERRALS, 0) # Nécessaire chez moi pour éviter le INVALID CREDENTIALS lors du binding def search_by_samaccount(samaccount): con = ldap.initialize("ldap://MONDOMAIN:389") # Remplacez par votre domaine... con.simple_bind('MON_ID@MONDOMAIN','MON_PASSWORD') # Username et password base_filter = 'DC=MON,DC=DOMAIN,DC=FR' # Le base filter, ici on cherche à partir de la racine search_filter = 'sAMAccountName='+samaccount # Le filtre de recherche search_attr = None # Le filtre d'attribut à récupérer. Par exemple, search_attr = ['displayName']. None = No filtre search_result = con.search_s(base_filter,ldap.SCOPE_SUBTREE,search_filter,search_attr) i = 0 try: for i in range(len(search_result)-4): # Pour chaque personne trouvée, on affiche quelques infos print " \n *******************************************\n" #print search_result[i] pour afficher tous les attributs print search_result[i][1]['sAMAccountName'] print search_result[i][1]['distinguishedName'] print search_result[i][1]['displayName'] print search_result[i][1]['memberOf'] i = i + 1 except TypeError,error: print error con.unbind() # Unbind de la connexion if __name__ =='__main__': sam_input = raw_input("sAMAccountName please ? ") search_by_samaccount(sam_input) |
[C#] Les méthodes d’extension
7Les méthodes d’extension sont des choses très pratique que j’utilise bien souvent depuis que je les ai découvertes !! Elles permettent en fait de définir des méthodes venant s’ajouter à des types déjà existants (string, double, ou n’importe quel objet) sans avoir à venir modifier les dits objets (qui peuvent parfois être décrit dans le framework, d’où l’intérêt de ces méthodes d’extension).
Comme je trouve que les exemples concrets (pléonasme ?) sont beaucoup plus parlants que de longs discours théoriques barbants, allons-y ! Imaginons une méthode permettant de convertir des kilomètres en miles. Cette méthode statique serait placé dans une classe ici nommé DataTreatement. Voilà la méthode :
public class DataTreatment { public static double KmToMiles(double _value) { //Convertion en Miles // 1 kilommeter = 0.621371192 miles _value *= 0.621371192; return _value; } } |
Pour l’utiliser, il faudrait alors écrire :
static void Main(string[] args) { double _nbKm = 10; Console.WriteLine("Aujourd'hui Dora a parcourue " + _nbKm.ToString() + "Kms, soit " + DataTreatment.KmToMiles(_nbKm) + " Miles pour retrouver sa maison :/"); } |
Rien de bien sorcier, sauf que je ne suis pas trop satisfait car :
DataTreatment.KmToMiles(_nbKm) |
Ça manque un peu de lisibilité à mon gout (je suis un peu maniaque je sais). Ce que je voudrais c’est une méthode un peu semblable à ToString() qui me permette d’afficher mes Kilomètres transformés en Miles, en faisant tout simplement :
static void Main(string[] args) { double _nbKm = 10; Console.WriteLine("Aujourd'hui Dora a parcourue " + _nbKm.ToString() + "Kms, soit " + _nbKm.KmToMiles() + " Miles pour retrouver sa maison :/"); } |
Et bien avec les méthodes d’extension c’est possible (ZOMFG comme de par hazard !) \o/
Alors comment qu’on procède ? Commençons par créer une classe static que l’on nommera “ExtensionMethods”
Dans cette classe on va pouvoir ajouter toutes les méthodes d’extension que l’on souhaite. Ces méthodes pourrons bien sûr agir sur des types différents (string, double…)
Ensuite, on créé notre méthode comme ceci :
2 3 4 5 6 7 8 9 10 11 12 13 14 | /// <summary> /// retourne une chaine contenant la valeur en miles du double kilométre donné, en limitant à deux chiffres après la virgule /// </summary> /// <param name="_value"></param> /// <returns></returns> public static string KmToMiles(this double _value) { //Convertion en Miles // 1 kilommeter = 0.621371192 miles _value *= 0.621371192; return String.Format("{0:00.##}", _value); } |
Vous remarquerez que la seule chose qui change entre mes deux méthodes se situe au niveau des paramètres avec le mot clef important, j’ai nommé le “this” :
public static string KmToMiles(this double _value) |
Le “this” va permettre de préciser que le paramètre ne devra pas être utilisé comme un paramètre normal, mais devra transformer cette méthode en une méthode appartenant au type du paramètre en question (ici la class double). Nous permettant d’écrire :
_nbKm.KmToMiles() |
Vous noterez que le paramètre n’est du coup plus présent lors de l’utilisation de la méthode (à cause du this).
Il faudra quand même penser à ajouter le using correspondant :
using ExtensionMethods; |
Voilà, vous verrez c’est vraiment très pratique, car cela nous permet de “surcharger les classes du framework” très simplement et améliore grandement la lisibilité du code et donc la maintenabilité (pensez à remplir le summary afin que tout le monde puisse facilement utiliser votre méthode) !
[C#] Utilisation de l’opérateur ? (opérateur ternaire/conditionnel)
0L’opérateur ternaire (aussi appelé opérateur conditionnel) vous connaissez ? Il s’utilise avec le point d’interrogation et permet en gros d’écrire des tests sur une seule ligne. Et il peut s’avérer parfois très pratique ! Démonstration :
conditionA ? retourTrue : retourFalse;
Si la conditionA est respectée (test == true) alors c’est retourTrue qui sera retourné, si la conditionA est fausse alors c’est retourFalse qui sera retourné ! On pourrait très bien aussi écrire la même chose à l’aide d’un IF/ELSE plus classique :
if(conditionA) { return retourTrue; } else { return retourFalse; } |
L’intérêt de l’opérateur ternaire est que l’on va pouvoir tout écrire sur la même ligne, et donc insérer des tests directement à des endroits où l’on n’aurait pas pu avec le classique IF/ELSE. La limite de la ternaire se situe dans le fait qu’elle doit nécessairement retourner une valeur, là ou un block IF/ELSE classique pourrait exécuter tout un bout de code ! Notez qu’il est tout à fait possible d’imbriquer plusieurs ternaires les unes dans les autres (TernaireCeption) afin d’obtenir un bout de code à la maintenabilité plus que douteuse !
Comme un exemple est toujours plus parlant :
int[] _productTypeID = GetProductTypeChecked(); var _products = from _product in db.PRODUCTs where (_productTypeID.Count() > 0 ? _productTypeID.Contains(_product.TypeID) : true) select _product; |
Voilà pour ce petit bout de code, imaginons que l’on souhaite retourner tous les produits d’une base tout en ayant la possibilité de filtrer par le type de produit. Si des Types de produit ont été “checkés” alors la clause where contiendra le filtre sur le Type, sinon la clause Where sera tout simplement “where true” et donc sera sans effet.
Et bien ici on réduit quand même grandement le nombre de lignes à produire en insérant le test directement dans la requête LinQ. Voilà ce que l’on aurait eu à coder avec un test normal :
int[] _productTypeID = GetProductTypeChecked(); if (_productTypeID.Count() > 0) { var _products = from _product in db.PRODUCTs where _productTypeID.Contains(_product.TypeID) select _product; } else { var _products = from _product in db.PRODUCTs select _product; } |
C’est pas très violent ici car le code est très basique, mais dans certain cas, c’est tout de même vraiment pratique alors pensez à les utiliser ! A noter que cet opérateur existe aussi en PHP et en Java !!
[Android] Gérer les écrans larges dans vos applications
0
Un petit article pour vous donner une solution pour supprimer un des boutons de la barre des tâches de votre tablette. Ce bouton tout simplement de gérer l’affichage sur les écrans larges de manière automatique, ou presque puisqu’il suffit de sélectionner la bonne option (“Stretch” ou “Zoom“) pour que votre application apparaisse plus ou moins bien sur le grand écran de la tablette.
Pour cela, il faut donc renseigner dans votre fichier Manifest.xml la ligne suivante :
<manifest ... > <supports-screens android:xlargeScreens="true" /> ... </manifest> |
Et voilà, plus qu’à re-builder votre application et vous aurez la joie de voir disparaître le bouton concerné !
Sachez tout de même que si vous rencontrez un soucis au niveau du non support de l’attribut android:xlargeScreens par votre application, il va vous falloir corriger une ou deux petites choses :
- Vérifiez dans les propriétés de votre projet qu’il cible bien l’API Level 11 d’Android au minimum.
- Vérifiez également que dans le fichier Manifest.xml, vous avez l’attribut android:targetSdkVersion à 11.
[Visual Studio] Empêcher la pluralisation des tables lors d’un ajout sur un modèle de données dbml
0Petite galère qui vient de m’arriver alors si je peux éviter à certain de perdre du temps !
Lorsque vous travaillez avec un modèle de données DBML, comme Entity framework, et que vous voulez ajouter des tables à votre modèle, vous faites simplement glisser (en drag and drop) vos tables SQL Server depuis votre ‘server explorer’ jusqu’à votre page DBML. Le problème c’est que par défaut, Visual Studio se permet de pluraliser le nom des entités ainsi générées par le Mapping. Ainsi, si vous ajouter une table CLIENT, Visual Studio génère une entité nommée CLIENTs !
Et c’est bien ce petit “s” qui peut parfois poser problème, car même si la logique semble plutôt bonne (car l’entité générée CLIENTs est en fait une collection de CLIENT) si cette logique n’a pas été implémenter depuis le début dans le projet cela peut très rapidement devenir problématique.
Pour empêcher ça, c’est très simple ! Vous faites Outils(Tools) -> Options -> Database Tools -> O/R Designer et vous passez Pluralization of names à false.
Voilà c’est tout, pensez à supprimer et recréer ensuite les tables afin de générer des entités non pluralisées !
Google Chrome par défaut sous iOS
0Si ça, ce n’est pas se moquer un petit peu des restrictions mises en place par le système ultra fermé d’Apple, je ne sais pas trop ce que s’est !
En effet, je vous en parlais il y a peu dans cet article, Google Chrome est maintenant disponible sur nos iDevices et permet donc d’avoir une alternative à Safari installé par défaut. Mais comme je le précisais également, Chrome ne peut pas devenir le navigateur par défaut de votre iDevice du fait des restrictions de la firme à la pomme.
Et bien ceci n’a pas empêché Google de trouver une solution au problème, et de la proposer à la communauté. Bien entendu, cette solution marche sur les iDevices non jailbreakés (vu que sur ces derniers, d’autres solutions existent). Cependant, elle est plutôt proposée aux développeurs qu’aux utilisateurs eux-mêmes, puisqu’il s’agit tout simplement de vérifier depuis votre application, que celle de Chrome est installée sur le iDevice. Si c’est le cas, alors lors d’un clic sur un lien depuis votre application, ce lien s’ouvrira dans Chrome au lieu de Safari. Dans le cas contraire, et bien vous aurez toujours le même principe de fonctionnement, à savoir le lancement des liens dans Safari directement.
Ainsi, pour vérifier que Google Chrome est bien présent sur l’iDevice, il vous suffit d’ajouter cette ligne dans votre application :
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"googlechrome://"]]; |
Pour le reste, à vous de mettre en place les tests pour vérifier l’état du booléen, et donc pour lancer le bon navigateur. Et si vraiment vous voulez plus d’informations sur le comment faire, faites un petit tour sur la source de cette article.
[Source]
Pondasee : Kit de démarrage prometteur
1Je suis tombé complètement par hasard sur ce petit kit de démarrage pour le développement web front-end : Pondasee !
Personnellement, toujours en galère quand il s’agit de développer un site web, et surtout toujours la flemme de me lancer à fond dedans, la description de ce kit de démarrage me donne plus qu’envie. Pour faire simple, Pondasee est mis à votre disposition afin de vous permettre d’accélérer votre phase de développement, quelque soit votre niveau.
Ce kit se base sur Compass et SCSS (ndlr : Sassy CSS) ce qui implique qu’il va vous être utile un petit moment, du moment que vous l’adoptez !
De plus, pour éviter la perte de temps pour intégrer différentes bibliothèques, quelques unes sont déjà présentes comme HTML5 Boilerplate, Modernizr, jQuery.
Le kit de développement est disponible sur Github, ainsi que sa documentation.
Certains d’entre vous ont déjà eu l’occasion de le tester en profondeur ?
[Source]
Fini l’anonymat sur le Net Chinois !!
0On le sait tous aujourd’hui, Internet, les réseaux sociaux, et les plateformes de micro-blogging ne cessent de se développer partout dans le monde ! L’histoire nous montre que toutes ces ressources et moyens d’expressions permettent de s’exprimer, de rassembler, de débattre comme jamais cela n’a été possible auparavant ! Les révolutions du printemps Arabe nous l’ont montré, et maintenant les gouvernements apprennent à craindre ces nouveaux outils !!
En Chine, ils n’y vont jamais avec le dos de la cuillère et le gouvernement est donc en train d’imposer une loi visant à interdire l’anonymat sur les plateformes de micro-blogging, rien que ça. Les chinois pourront toujours rester anonymes s’ils souhaitent surfer passivement (c’est à dire uniquement pour consulter les blogs) mais désormais, s’ils désirent publier un commentaire ou un article ils devront avant tout avoir créé un compte contenant leur véritable identité ! Du coup cela limite quand même beaucoup les dérapages quand on sait comment le gouvernement chinois peut réagir avec ses opposants !
Comme on dit par chez nous, “Si vous n’avez rien à vous reprocher je vois pas où est le problème ?“.
Je rappel que cette idée avait été énoncée par je sais plus quel député en France (je vous laisse chercher ça ne devrait pas être dur), et je vous annonce aussi que des moyens de censure plus que douteux sont déjà utilisés aujourd’hui en France. Quand un gouvernement censure sans recours à la justice (et sans que les médias en parlent) un site censé lutter contre les violences policières, on a de quoi s’interroger un peu…
Bref inutile de vous rappelez le poème de Martin Niemoller pour vous faire comprendre qu’il ne faudrait pas trop attendre !!
Source : Numérama
[Android #3] Gestion d’une base de données Android
3Comme c’était prévu depuis un moment, je m’attelle donc à la tâche de réaliser un nouveau tuto sur Android. Dans ce billet, je vais vous présenter une méthode d’implémentation d’une base de données sous Android, base de données au format SQLite.
Au niveau de la liste des tutos sur Android qui sont présents sur le site, voici où nous en sommes (les autres viendront bientôt) :
- Installation de l’environnement de développement
- Principes de base pour une application Android
- Gestion d’une base de données Android
- Utilisation des Notifications
- Utilisation du control AlertBox
- Utilisation du control TabHost
Donc comme je le disais, je vais m’attarder ici sur la création d’une base de données, et son utilisation depuis une application basique. Pour cela, on reprend le projet du premier tuto, le HelloWorld, et on va y insérer tout ce qui faut. Pour rappel, l’organisation de ce petit projet est la suivante :

![Option Option [Visual Studio] Empêcher la pluralisation des tables lors dun ajout sur un modèle de données dbml](http://troll-me.fr/wp-content/uploads/2012/07/Option.png)



![android_archi_project android archi project [Android #3] Gestion dune base de données Android](http://troll-me.fr/wp-content/uploads/2012/01/android_archi_project.png)
Commentaires récents