Développement

memes-python

Accéder à Active Directory avec Python

7

memes python Accéder à Active Directory avec PythonPython-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 icon wink Accéder à Active Directory avec Python . 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)

(Lire la suite…)

[C#] Les méthodes d’extension

7

Les 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)

0

L’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 !!

compat-toggle

[Android] Gérer les écrans larges dans vos applications

0

compat toggle [Android] Gérer les écrans larges dans vos applicationsUn 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é ! icon wink [Android] Gérer les écrans larges dans vos applications

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.

Option

[Visual Studio] Empêcher la pluralisation des tables lors d’un ajout sur un modèle de données dbml

0

Petite 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.

Option [Visual Studio] Empêcher la pluralisation des tables lors dun ajout sur un modèle de données dbml

Voilà c’est tout, pensez à supprimer et recréer ensuite les tables afin de générer des entités non pluralisées !

google-vs-apple

Google Chrome par défaut sous iOS

0

Google Apple 1024x426 Google Chrome par défaut sous iOS

Si ç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 ! icon wink Google Chrome par défaut sous iOS

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

Pondasee : Kit de démarrage prometteur

1

pondasee Pondasee : Kit de démarrage prometteur

Je 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 ! icon wink Pondasee : Kit de démarrage prometteur 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]

icon_generator

[Android] Générateur d’icônes

0

Lorsque vous développez des applications, quelles qu’elles soient, vous aimez les personnaliser et proposer à vos futurs clients des jolies icônes et images. Mais pas toujours facile de générer des images dans les bons formats, avec les bonnes résolutions et surtout rapidement. C’est pourquoi je vous propose un petit site sur lequel je suis tombé pendant le développement d’une application Android. Ce site est made in Google donc vous pouvez être assuré qu’il tiendra bon la distance.

icon generator [Android] Générateur dicônes

L’idée est assez simple, vous fournissez au site l’image de base que vous souhaitez utiliser, vous pouvez sélectionner les couleurs de fond (et d’autres trucs dans le genre) et via un petit clic sur le bouton adéquate, le site se charge de vous sortir l’image dans toutes les résolutions nécessaires (36x36px, 48x48px, 72x72px. etc.). Bon, faut quand même être un peu patient car par moment, ça prend son temps pour faire le traitement.

Pour accéder au site, c’est par ici..

tiananmen_tank_man_google_china

Fini l’anonymat sur le Net Chinois !!

0

tiananmen tank man google china Fini lanonymat sur le Net Chinois !!

On 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_archi_project

[Android #3] Gestion d’une base de données Android

3

Comme 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) :

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 :

android archi project [Android #3] Gestion dune base de données Android

(Lire la suite…)

Haut de page