sondage, ping, pubsub, pubsubhub, PubSubHubbub
Dans le cas où vous êtes sceptique, il ya une méthode dans la folie au-dessus, dans le titre du poste. Dans les milieux de haute technologie, il est peu probable que vous n'avez pas entendu parler de PubSubHubbub. Dans rapides quelques mois, il a été l'un des trois premiers parlé de choses. Deux autres étant le chiffrement homomorphique et Google ondes [ 1. ]. Pour en revenir à poste actuel - termes dans le titre indiquer comment vous obtenez le contenu d'autres personnes. Après plus de détails apparaîtront plus clairement, si vous vous imaginez des choses se passe en ce qui concerne les blogs, même si elles sont conceptuellement ne se limite pas aux blogs.
Interrogation fait référence au scénario où les clients continuent à demander au serveur si quelque chose de nouveau a été soulevée. Combien de fois de demander des mises à jour sera toujours un problème avec interrogation trop fréquents ou trop rares, mais comme un lecteur fait remarquer ici que l'on grand chose avec du scrutin, c'est que le serveur ne dispose pas de maintenir l'état.
Ping se réfère au cas où quand publier un article, vous (ou votre logiciel) met également à jour certains services populaires de mise à jour (central). Un peu d'histoire ici .
Suivant est pubsub qui signifie publication / abonnement, l'un des premiers pas car il a été fait ici par Evan Henshaw-Plath et Kellan Elliott-McCrea (72 diapositives, mais la peine d'aller à travers). Exemple convaincant ils ont donné contre était-ce - à une date donnée, Friendfeed rampé Flickr 2,9 millions de fois pour obtenir les dernières photos de 45,754 utilisateurs, dont 6721 avaient visité Flickr dans ces 24 heures et aurait pu «potentiellement» a ajouté une photo. Notez que ce qu'ils proposaient n'était pas une nouvelle technologie, car ils soulignent «nouvelle technologie révolutionnaire de 20 ans». Si vous le faites pour les blogs, puis l'un des problèmes majeurs avec XMPP - la présence de données supplémentaires, ce qui peut être aussi élevé que 60-70% peut être réduit beaucoup.
pubsubhub signifie publier hub abonnez-vous et PubSubHubbub est un protocole, le noyau de ce qui est l'idée de pubsubhub. Éditeurs, dans laquelle (disent les blogueurs) mettre à jour le moyeu qui (peut-être plus d'un concentrateurs, qui parlent les uns aux autres) réside «quelque part dans les nuages», selon le protocole cela peut être pousser ou tirer selon le protocole, mais le lien suivant dans le chaîne, plaque tournante pour le client (par exemple les lecteurs), il est toujours pousser le modèle. Cette page est bon point de départ pour PubSubHubbub, diapositives aperçu sont bons. Toujours éloquent Anil Dash qu'il décrit ici comme bouton-poussoir web.
Deux autres lectures sont liées webhooks qui est essentiellement rappels http. Github utilise elle, le fait paypal pour les notifications asynchrones de paiement en ipn . Donc beaucoup d'autres. Concept connexe est rssCloud qui est nouveau hub pubsub. Suivez ce lien pour plus de détails.
Vous demandez peut-être ce qui est le point d'écrire tout cela ici, il ya deux 1. Ces choses valent la peine sachant, au minimum, à moins et 2. Ce blog est désormais activé PubSubHubbub via le hub appspot utilisant ce wordpress plug-in et d'alimentation est trop PubSubHubbub activé via feedburner, lien ici
-
[ 1 ]. - Bonne introduction lire pour le chiffrement homomorphique est pleinement présent article de Bruce Schneier et ce discours est plus ou moins la seule source de la vague Google.
-MISE À JOUR - Cette après explique comment l'exigence de serveur public pour le rappel peut être travaillé autour pour les clients de bureau en utilisant la passerelle XMPP (pour PubSubHubbub).
Un peu d'assemblage
Après avoir lu cette article sur les tampons de blocage libres et voir l'utilisation de la CSA (comparer et échanger), je me suis senti comme l'affichage du code assembleur pour faire la même chose. Cas d'utilisation là-bas était d'écrire une méthode native et l'appeler à partir de Java (retour à 1,5, lorsque les structures de données simultanés en Java étaient plus ou moins inexistant). Sans plus tarder, je vais libérer le code sur vous
. La première est pour le CAS et le second est pour le calcul GCD en utilisant l'algorithme d'Euclide (celui-ci peut être trouvée dans de nombreux endroits et des tutoriels ainsi).
Compiler et exécuter des instructions gcc file_name.c ; ./a.out
Comparer et Swap
# Include# Include / / Change - newvalue, comperand est vieux / valeur attendue / * * Fonction ne fait la chose suivante - si la valeur au * dest est égale à oldValue puis le remplacer par autre newvalue laisser inchangé: faire toutes ces atomiquement * * Il ya deux options pour la valeur de retour * La valeur initiale de 1.is * dest et laisser le fardeau de la FXN appelant à le comparer avec oldval * 2. le faire ici et retourner 0 ou 1, ce devrait être plus efficace ** / / * Plus tard, il se transformer en macro * / int CAS (int * dest, int oldValue, int newvalue) { printf ("(% d,% d,% d)", * dest, oldValue, newvalue); / * Int CAS (int dest, int oldValue, int newvalue) {* / / * Int CAS (int dest, int newvalue, int oldValue) {* / int résultat = 1 ;/ * 1 montre que les CA ont réussi et 0 montre qu'il a échoué * / / * Btw besoin de mettre en cc pour le drapeau démolir! * / __ volatile__ __asm__ ( "Movl% 2,%% eax \ n \ t" "Movl% 3,%% ebx \ n \ t" "0% movl,%% ecx \ n \ t" "LOCK \ n \ t" "CMPXCHG% ebx%, (%% ecx) \ n \ t" / * doit se verrouiller être sur la même ligne * / "Jz FAIT \ n \ t" "Movl $ 0,% 1 \ n \ t" "FAIT: \ n \ t" : "= M" (dest), "= g" (résultat) : "G" (oldValue), "g" (newvalue), "m" (dest) : "% Eax", "% ebx", "ecx", "cc" ); printf ("(% d,% d,% d)", * dest, oldValue, newvalue); renvoyer le résultat; } / * TODO * Écrire un autre FXN asm qui met au-dessus FXN dans une boucle while et continuer à essayer si elle réussit * / int main () { int a = 5, b = 6; int * c = (int *) malloc (sizeof (int)); * C = 6; / * Int c = 6; * / printf ("% d \ n", CAS (c, b, b)); printf ("% d \ n", CAS (c, b, a)); printf ("% d \ n", CAS (c, a, a)); printf ("% d \ n", CAS (c, b, b)); * C = 6; / C * = 5; * / printf ("valeur changeante des * c à% d \ n", * c); printf ("% d \ n", CAS (c, b, b)); printf ("% d \ n", CAS (c, b, a)); printf ("% d \ n", CAS (c, a, a)); printf ("% d \ n", CAS (c, a, b)); printf ("% d \ n", CAS (c, b, a)); retourner 0; }
Mise en forme des notes - apparaît comme la coloration syntaxique wp est l'ajout à la fin, l'ignorer.
GCD
# Includeint pgcd (int a, int b) { int résultat; / * Calcul Plus Grand Commun Diviseur utilisant l'algorithme d'Euclide * / __ volatile__ __asm__ ("movl% 1,%% eax;" "Movl% 2,%% ebx;" "SUITE: CMPL 0 $,%% ebx;" "Je FAIT;" "Xorl%% edx,%% edx;" "Idivl%% ebx;" "Ebx movl%%,%% eax;" "Movl%% edx,% ebx%;" "Jmp suite;" "FAIT: movl%% eax,% 0;": "= g" (résultat): "g" (a), "g" (b) ); renvoyer le résultat; } int main () { int premier, deuxième; printf ("Entrez deux entiers:"); scanf ("% d% d", & d'abord, et seconde); printf ("% d PGCD de &% d est% d \ n", premier, deuxième, pgcd (premier, deuxième)); retourner 0; }
Mondiale de cricket attend un Nouvel Ordre Mondial
Après une série qui s'étend sur cinq essais et environ deux mois, les cendres récupérées Angleterre.
Parlons de l'équipe gagnante premier - leur ordre du milieu est «moyenne» si vous ne voulez pas critique. Contribution Greame Swann avec la chauve-souris comptera pas moins de contribution avec le ballon. Stuart Broad - meilleure polyvalent était entrée non pour le test 5ème. Andrew Strauss était le batteur seulement conforme et Jimmy Anderson a été le lanceur seulement conforme.
Point ici n'est pas de fustiger les réalisations de l'équipe gagnante, mais à mettre en perspective le fait que, malgré tout cela, l'Australie a perdu. vous aurez à penser pendant quelques secondes, si on lui demande de nommer leur meilleur lanceur. A droite, il était BW Hilfenhaus. Hauritz surpassé les attentes, mais everbody n'était pas encore assez bon pour être sélectionné pour deux des cinq essais. Afrique du Sud n'a jamais été un batteur monde sans une fileuse de classe mondiale, l'Australie ne peut pas espérer rester l'un sans un un assez bon au moins. Magicien a quitté la scène et il ne ressemble pas à l'art plus, oublier la magie. Ponting se dresse fièrement parmi les simples mortels et Michael Clarke se lève très souvent, mais qui en fait une équipe avec de très bons joueurs et non pas une très bonne équipe.
Ashes 2009 restera dans les mémoires pour Ashes dernières Andrew Flintoff, l'arrivée de Stuart Broad en tant que polyvalent (si il ajoute un peu plus du folklore Ashes à son début prometteur), et un du siècle débuts le plus révélateur de tous les temps par Trott, mais il sera également dans les mémoires comme le point où si et les mais sur la suprématie de l'Australie ont finalement été mis au repos, c'est fini. Ne vous méprenez pas, ils peuvent encore dénicher Mike Hussey ou Stuart Clark, mais vous vous sentez la contribution de tous les grands temps quand ils sont portés disparus. Parfois, ils viennent pour vous rappeler d'eux-mêmes dans de l'IPL, mais encore ils ne peuvent pas être remplacés. Disons me sens béni d'avoir vu Warne, McGrath et Gilchrist jouer ensemble et étant supporté par Waughs, Ponting, Hyden, Martin et Langer.
À l'avenir, l'Afrique du Sud restera toujours une très bonne équipe, mais ils ont besoin pour gagner demi-finale et d'être plus cohérente dans le monde entier, le Pakistan restera énigmatique brillante, indiennes canons jeunes trouveront probablement difficile à combler les chaussures de ses prédécesseurs extraordinaires. Sri Lanka devrait continuer de montrer un aperçu de l'art dans l'artisanat. Mais, nous pourrions avoir à attendre pendant un certain temps avant d'avoir une équipe tout à dominante ou avant un capitaine se plaint du manque de concurrence, comme Steve Waugh a fait une fois.
Dans une note relative - nous allons accueillir le retour de Asif, il a un enfer beaucoup de potentiel, espérons de voir certains de cela, et aussi accueillir Fleur Andy dans le awatar nouvelle, à droite, vous ne pouvez pas empêcher les hommes de bonnes bas pour longtemps.
rubis: une ligne pour créer de hachage
Hier en passant par l'un de mes anciens programmes, j'ai trouvé cela par écrit par moi ya un certain temps:
#begin magic
hash=Hash[*CGI.unescape(raw_text).split('&').map{|x| b=x.split("=");b.push(nil) if b.size==1;b}.flatten]
#end magic
Pour tuer le suspense permettez-moi de révéler que raw_text ressemble
, Le droit qu'il a été coupé de la reconnaissance de paiement paypal.
Au-dessus de la ligne si elle est brisée en pièces se lit mieux:
unescaped_array = CGI.unescape (raw_text). split ('&') unescaped_array = {unescaped_array.collect | x | b = x.split ("="); b.push (néant) si b.size == 1;} b flattened_array = unescaped_array.flatten hash = Hash [* flattened_array]
Faisons différentes étapes de la CISR:
irb (main):. 009:0> unescaped_array = CGI.unescape (raw_text) split ('&') => ["SUCCESS", "mc_gross = 10.00", "protection_eligibility = non admissibles», «payer_id = U7PPJJ4TSJ47E", "impôt = 0.00", "payment_date = 09:45:30 10 juillet 2009 PDT", "payment_status = En attente "] irb (main): 013:0> unescaped_array = {unescaped_array.map | x | b = x.split ("="); b.push (néant) si b.size == 1;} b => [["SUCCESS", nil], ["mc_gross", "10.00"], ["protection_eligibility", "inadmissible"], ["payer_id", "U7PPJJ4TSJ47E"], ["impôt", "0.00"] , ["payment_date", "09:45:30 10 juillet 2009 PDT"], ["payment_status", "En attente"]] irb (main): 014:0> flattened_array = unescaped_array.flatten => ["SUCCESS", nil, "mc_gross", "10.00", "protection_eligibility", "inadmissible", "payer_id", "U7PPJJ4TSJ47E", "impôts", "0.00", "payment_date", "09:45: 30 10 juillet 2009 PDT "," payment_status "," En attente "] irb (main): 015:0> hash = Hash [* flattened_array] => {"Impôt" => "0.00", "payment_status" => "En attente", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10.00", "SUCCESS" => nil, "payment_date" = > "09:45:30 10 juillet 2009 PDT", "protection_eligibility" => "Inadmissible"}
BTW, * est appelé opérateur splat en ruby
Une autre façon de créer de hachage à partir «tableau de paires" est d'utiliser l'injection:
hash = [[1,2], [3,4]] injecter ({}). {| résultat, élément | résultat [element.first] = résultat [element.last];} résultat Il ya une façon de plus
Rédiger une boucle, que je vais laisser comme un exercice pour les lecteurs!
Voici un cas d'utilisation sans rapport avec peu de création de hachage à partir des tableaux:
irb (main): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.? : Moindre :: plus} => {: Moins => [1, 2, 3, 4],: une plus grande => [7, 9]}
Vous pouvez faire plus de choses, essentiellement suite du bloc est utilisé comme la clé de cet élément dans la table de hachage qui en résulte.
fix gmail, mutt et msmtp
Si vous utilisez mutt et smtp pour accéder à Gmail. Voici une nouvelles (mauvaise). Refroidir les gars de Google à nouveau changé certificat. Oh, avez-vous demandé - comment il le sait? Mutt Simple commencé à se plaindre mauvais certificat lorsque vous essayez d'utiliser msmpt, tristement célèbre «msmtp: la vérification du certificat TLS a échoué:. Le certificat n'a pas obtenu un émetteur connu" m'a accueilli à l'écran.
Pour traverser le confirmer -
Il suffit de lancer la suite
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
En lieu et place du serveur Thwate vieux maintenant vous êtes à la suite dans le segment émetteur
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
Heureusement solution est simple, voici ce que vous devez faire sur debian
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
Après il suffit de changer cette ligne suivante dans you ~ /. Msmtprc
tls_trust_file /certs/Thawte SSLWeb Server Roots/thawte Premium Server CA/Thawte Premium Server CA.pem
tls_trust_file /certs/Thawte SSLWeb Server Roots/thawte Premium Server CA/Thawte Premium Server CA.pem
à
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
Git et Enquête sur Impressionnant
Voici deux liens pour l'enquête par git (système de contrôle de version) et génial (gestionnaire de fenêtres) de la communauté. Si vous utilisez un de ceux-ci, s'il vous plaît prendre quelque temps pour remplir le questionnaire. Pensez-y comme la façon la plus simple de contribuer en retour au logiciel que vous utilisez.
Voici les liens:
Git - http://www.survs.com/survey?id=2PIMZGU0&channel=Q0EKJ3NF54
Awesome - http://www.survs.com/survey?id=8BVEV3FO&channel=BH07CQ040D
Remarque - (Comme l'a constaté sur ces pages, mais au fond
) -
"Si vous avez activé les cookies, vous pouvez toujours soumettre l'enquête partiellement rempli, et retourner à vos réponses à une date ultérieure, en la complétant plus tard."
Hachages Fusion dans les fichiers de conf yaml
YAML est très pratique pour écrire des fichiers de configuration. Principal avantage est que, il se lit comme fichier texte. Cela fonctionne vraiment bien si votre fichier de configuration est plat (pas de hiérarchie) et n'a pas de répétitions.
Si votre fichier de configuration a répétitions alors il est logique de séparer ces éléments et de les réutiliser. Ce que je veux dire est ceci - disons que vous votre fichier de configuration ressemble à ceci:
le développement: input_location: common_input output_location: dev_location mail: smtp_server: votre_serveur login: votre_login Mot de passe: top_secret la production: input_location: common_input output_location: dev_location mail: smtp_server: votre_serveur login: votre_login Mot de passe: top_secret
En supposant que le code ci-dessus dans / tmp / test.yml voici comment vous pouvez lire en python et ruby
$cat readyml.py
#! / Usr / bin / env python à partir pprint importation pprint que p # Dans le fichier debian besoin d'installer python-yaml de la charge d'importation yaml, load_all, d'un dépotoir hachage charge = (open ('/ tmp / test.yml')) pp (hash ['développement'])
$ cat readyml.rb
#! / Usr / bin / ruby require 'pp' hash = YAML :: load (File.open ('/ tmp / test.yml'). lire) hachage pp [«développement»]
est ici un outil pratique un paquebot pour la version rubis
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' ou vous pouvez essayer la même chose à la CISR ou de la console python.
Notez que dans l'extrait de code ci-dessus, tout est autre que l'emplacement de sortie est la même dans le développement et une partie de la production. C'est là identificateur de noeud yml vient à la rescousse. L'idée est simple, un ensemble de valeurs par défaut et les remplacer au lieu différent.
Vous pouvez le séparer comme suit:
par défaut: par défaut et input_location: common_input output_location: dev_location mail: sender_name: l'expéditeur smtp_server: votre_serveur login: votre_login Mot de passe: top_secret le développement: <<: * Les valeurs par défaut la production: <<: * Les valeurs par défaut output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Grande, il fonctionne (tm)!.
On peut dire que nous avons échangé un peu de clarté pour un peu de magie. Voici une petite explication: &, * et <<: & ce qui est la balise d'ancrage peut être comprise comme identificateur de nœud, * est nœud de référence et <<: synonyme de fusion de hachage.
Pour plus de détails, voir soit spécifications yaml ou wikipedia
Jusqu'ici tout va bien, mais il ya un hic ici, ces fusions de hachage ne sont pas récursives. Qu'est-ce que cela signifie, c'est ceci: disons que vous voulez que le nom d'expéditeur différent pour le courrier dans les deux environnements, vous pouvez être tenté de faire ce qui suit:
par défaut: par défaut et input_location: common_input output_location: dev_location mail: sender_name: l'expéditeur smtp_server: votre_serveur login: votre_login Mot de passe: top_secret le développement: <<: * Les valeurs par défaut mail: sender_name: sender_dev la production: <<: * Les valeurs par défaut output_location: prod_location mail: sender_name: sender_prod
Permet de vérifier
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Oups, quelque chose n'allait pas, le problème tel que mentionné ci-dessus est que la fusion de hachage n'est pas récursive et lors de la fusion a remplacé e-mail de défaut par courrier de la production qui a une seule touche. Solution / travail autour est de dérouler un niveau de plus:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults sender_name: l'expéditeur smtp_server: votre_serveur login: votre_login Mot de passe: top_secret par défaut: par défaut et <<: * Les common_settings mail: <<: * Les mail_defaults le développement: <<: * Les valeurs par défaut la production: <<: * Les valeurs par défaut mail: <<: * Les mail_defaults sender_name: sender_prod
Permet de vérifier à nouveau
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Avez-vous dit que vous avez le niveau un plus de nidification, ainsi vous pouvez certainement dérouler un niveau de plus, mais alors il devient un gâchis. Donc, si vous n'êtes pas d'essayer d'écrire une solution à des tours de Hanoï dans un fichier de conf, il est préférable de restucture fichier de conf que de creuser dans yaml ou autre chose. Mais c'est votre appel de toute façon.
Programmeurs Grands trouver des solutions simples aux problèmes complexes
Après un long moment que j'ai pu trouver la source de la citation suivante-
Programmeurs juniors de créer des solutions simples à des problèmes simples. Programmeurs supérieurs de créer des solutions complexes à des problèmes complexes. Programmeurs Grands trouver des solutions simples aux problèmes complexes.
Il est d'un essai intitulé Software Belle par Charles Connell.
Un autre de mes préférés est The Zen of Python -
Belle est meilleur que laid.
Explicite est meilleur qu'implicite.
Simple est meilleur que complexe.
Complexe est meilleur que compliqué.
Flat est meilleur que imbriqués.
Sparse est meilleur que dense.
Compte de lisibilité.
Les cas particuliers ne sont pas suffisamment spécial pour briser les règles.
Bien que pratique bat la pureté.
Les erreurs doivent jamais passer sous silence.
Sauf mention explicite silence.
Dans le cas d'ambiguïté, refuser la tentation de le deviner.
Il devrait y avoir un et de préférence un seul évidente façon de le faire.
Bien que cette façon peut-être pas évident à première vue, sauf si vous êtes néerlandais.
Maintenant c'est mieux que jamais.
Bien qu'il n'ait jamais est souvent meilleur que les * droit * maintenant.
Si la mise en œuvre est difficile à expliquer, c'est une mauvaise idée.
Si la mise en œuvre est facile à expliquer, il peut être une bonne idée.
Espaces de noms sont une idée klaxonnant grande - nous allons faire plus de ceux-là!
-------------------------
et puis il est classique Tao de la programmation
-
crédits que sur le site lié à des
Traduit par Geoffrey James
Transcrit par le duc Hillard
Transmis par Anupam Trivedi, Sajitha Tampi, et Meghshyam Jagannath
Re-html-isée et édité par Kragen Sittler
-
Livre 1 - Le vide silencieux
Ainsi parla le maître programmeur:
«Quand vous avez appris à arracher le code d'erreur à partir du cadre piège, il
sera temps pour vous de partir. "1.1
Quelque chose de mystérieux est formé, né dans le vide silencieux. En attendant seul et
immobile, il est à la fois immobile et encore en mouvement constant. Il est la source
de tous les programmes. Je ne sais pas son nom, alors je vais l'appeler le Tao de la
Programmation.Si le Tao est grand, alors le système d'exploitation est grande. Si le fonctionnement
système est grande, alors le compilateur est grand. Si le compilateur est grande,
alors l'application est grande. L'utilisateur est heureux et il existe
l'harmonie dans le monde.Le Tao de la programmation des flux loin et revient sur le vent du matin.
1.2
Le Tao a donné naissance à la langue de la machine. Le langage machine a donné naissance à l'
assembleur.L'assembleur a donné naissance au compilateur. Maintenant il ya dix mille
langues.Chaque langue a son but, mais humble. Chaque langue exprime la
Yin et le Yang du logiciel. Chaque langue a sa place dans le Tao.Mais ne pas programmer en COBOL, si vous pouvez l'éviter.
1.3
Au commencement était le Tao. Le Tao a donné naissance à l'espace et du temps.
Par conséquent l'espace et le temps sont le Yin et le Yang de la programmation.Les programmeurs qui ne comprennent pas le Tao sont toujours à court de temps
et l'espace pour les programmes. Les programmeurs qui toujours comprendre les Tao
avoir suffisamment de temps et d'espace pour atteindre leurs objectifs.Comment pourrait-il en être autrement?
1.4
Le programmeur sage est dit au sujet de Tao et le suit. La moyenne
programmeur est dit au sujet de Tao et de recherches pour elle. Le programmeur fou
est dit au sujet de Tao et se moque de lui.Si ce n'était pas pour rire, il n'y aurait pas de Tao.
Les plus fortes sons sont les plus difficiles à entendre.
À l'avenir est un moyen de battre en retraite.
Grand talent se révèle en fin de vie.
Même un programme parfait a toujours des bugs.-------------------------
Livre 2 - Les anciens maîtres
Ainsi parla le maître programmeur:
"Après trois jours sans programmation, la vie devient vide de sens."
2.1
Les programmeurs de la vieille étaient mystérieuse et profonde. Nous ne pouvons pas imaginer
leurs pensées, de sorte que tous nous faisons, c'est de décrire leur apparence.Conscient, comme un renard traverser l'eau. Alert, comme un général sur le
champ de bataille. Genre, comme une hôtesse accueillir ses invités. Simple, comme
blocs de bois non sculptés. Opaque, comme les piscines noires dans les grottes sombres.Qui peut dire les secrets de leurs cœurs et les esprits?
La réponse n'existe que dans le Tao.
2.2
Grand Maître de Turing fois rêvé qu'il était une machine. Quand il se réveilla
s'écria:"Je ne sais pas si je suis Turing rêver que je suis une machine, ou d'un
machine à rêver que je suis de Turing! "2.3
Un programmeur d'une société d'informatique très grande allé à un logiciel
conférence et est ensuite retourné faire rapport à son manager, en disant: «Quel genre
de programmeurs travaillent pour des entreprises d'autres? Ils se sont comportés mal et étaient
indifférents aux apparences. Leur cheveux étaient longs et hirsutes et leur
vêtements étaient ridé et vieux. Ils s'est écrasé notre suite hospitalité et ils
fait des bruits grossiers lors de ma présentation. "Le directeur nous a dit: "Je ne vous ai jamais envoyé à la conférence. Ceux
programmeurs vivre au-delà du monde physique. Ils considèrent la vie absurde, un
coïncidence fortuite. Ils vont et viennent sans savoir limites.
Sans soins, ils ne vivent que pour leurs programmes. Pourquoi devraient-ils pris la peine
avec les conventions sociales?"Ils sont vivants dans le Tao."
2.4
Un novice a demandé au Maître: «Voici un programmeur qui ne dessine jamais,
documents ou des tests de ses programmes. Pourtant, tous ceux qui le connaissent le considèrent comme l'un des
les meilleurs programmeurs dans le monde. Pourquoi est-ce? "Le Maître répond: "Ce programmeur a maîtrisé le Tao. Il est allé
au-delà de la nécessité pour la conception, il ne se mettent en colère lorsque le système
accidents, mais accepte l'univers sans se préoccuper. Il est allé au-delà du
besoin de la documentation, il ne se soucie plus si quelqu'un d'autre voit son code.
Il est allé au-delà de la nécessité pour les essais; chacun de ses programmes sont parfaits
en eux-mêmes, sereine et élégante, leur but évident. En vérité,
il est entré dans le mystère du Tao. "-------------------------
3 Livre - Conception
Ainsi parla le maître programmeur:
"Lorsque le programme est mis à l'essai, il est trop tard pour faire de la conception
changements. "3.1
Il était une fois un homme qui est allé à une foire commerciale ordinateur. Chaque jour, comme il
est entré, l'homme dit à la garde à la porte:«Je suis un grand voleur, connu pour mes exploits de vol à l'étalage. Être
prévenu, pour ce salon ne doit pas échapper à unplundered. "Ce discours perturbé grandement la garde, parce qu'il y avait des millions de
de dollars de matériel informatique à l'intérieur, donc il a regardé l'homme avec précaution. Mais
l'homme simplement erré d'une cabine à, en fredonnant doucement à lui-même.Quand l'homme à gauche, la garde le prit à part et fouillé ses vêtements, mais
rien ne devait être trouvée.Le lendemain du salon, l'homme revint et reproché à la garde
disant: "Je me suis échappé avec un butin immense, hier, mais aujourd'hui, le sera encore
mieux. "Alors le garde le regardait sans cesse plus étroite, mais en vain.Le dernier jour du salon, la garde pourrait limiter sa curiosité
pas plus. "Voleur de Sir," at-il dit, «Je suis tellement perplexe, je ne peux pas vivre dans
la paix. S'il vous plaît m'éclairer. Qu'est-ce qui vous volez? "L'homme sourit. "Je vole des idées", at-il dit.
3.2
Il était une fois un maître programmeur qui a écrit des programmes non structurés. Une
programmeur novice, cherchant à l'imiter, a aussi commencé à écrire
des programmes non structurés. Lorsque le novice a demandé au capitaine d'évaluer sa
progrès, le maître lui reproche d'écrire des programmes non structurés,
disant: «Ce qui est approprié pour le maître n'est pas approprié pour le
novice. Vous devez comprendre le Tao avant transcender la structure. "3.3
Il était une fois un programmeur qui a été attaché à la cour du chef de guerre
de Wu. Le chef de guerre a demandé au programmeur: "Quel est plus facile à concevoir: un
logiciel de comptabilité ou d'un système d'exploitation? ""Un système d'exploitation," a répondu le programmeur.
Le seigneur de la guerre poussa une exclamation d'incrédulité. "Sûrement un comptable
paquet est trivial à côté de la complexité d'un système d'exploitation, »at-il
dit."Non," dit le programmeur, «la conception d'un logiciel de comptabilité,
le programmeur fonctionne comme un médiateur entre les personnes ayant différents
idées: comment il doit fonctionner, la façon dont ses rapports doit apparaître, et comment il doit
se conformer aux lois fiscales. En revanche, un système d'exploitation ne se limite pas
par les apparences extérieures. Lors de la conception d'un système d'exploitation, le programmeur
cherche le plus simple d'harmonie entre la machine et des idées. C'est pourquoi une
système d'exploitation est plus facile à concevoir. "Le seigneur de la guerre de Wu hocha la tête et sourit. "C'est tout bon et bien, mais
qui est plus facile à déboguer? "Le programmeur ne répondit pas.
3.4
Un gestionnaire est allé pour le programmeur principal et lui a montré les exigences
document pour une nouvelle application. Le gestionnaire a demandé au capitaine: «Combien de temps
faut-il pour concevoir ce système, si je cède cinq programmeurs t-il? "«Il faudra un an», dit le maître aussitôt.
"Mais nous avons besoin de ce système immédiatement ou même plus tôt! Combien de temps durera l'
prendre si je cède dix programmeurs t-il? "Le maître programmeur fronça les sourcils. "Dans ce cas, il faudra deux ans."
"Et si je cède une centaine de programmeurs t-il?"
Le maître programmeur haussa les épaules. "Ensuite, la conception ne sera jamais
terminé, "at-il dit.-------------------------
Livre 4 - Codage
Ainsi parla le maître programmeur:
"Un programme bien écrit est son propre ciel, un programme mal écrit est
son propre enfer. "4.1
Un programme doit être légère et agile, ses sous-programmes reliés comme un
collier de perles. L'esprit et l'intention du programme devrait être maintenu
tout au long. Il devrait y avoir ni trop peu ou trop, ni
boucles inutiles, ni les variables inutiles, ni le manque de structure, ni
la rigidité écrasante.Un programme devrait suivre la loi du moindre étonnement `'. Quelle est cette loi?
Il est tout simplement que le programme doit toujours répondre à l'utilisateur de la manière
qui lui au moins étonne.Un programme, peu importe la complexité, devrait agir comme une seule unité. Le programme
doivent être adressées par la logique à l'intérieur plutôt que par les apparences.Si le programme échoue dans ces conditions, il sera dans un état de
désordre et la confusion. La seule façon d'y remédier est de réécrire l'
Programme.4.2
Un novice a demandé au capitaine: «J'ai un programme qui s'exécute un certain temps et
abandonne parfois. J'ai suivi les règles de programmation, mais je suis
totalement déconcerté. Quelle est la raison pour cela? "Le maître répondit: "Vous sont confus parce que vous ne comprenez pas le Tao.
Seul un fou attend un comportement rationnel de ses frères humains. Pourquoi pensez-vous
il attendre d'une machine que les humains ont construit? Ordinateurs de simuler
le déterminisme; que Tao est parfait."Les règles de programmation sont transitoires; seule Tao est éternel. Donc
vous devez envisager de Tao avant de recevoir l'illumination. ""Mais comment vais-je savoir si j'ai reçu l'illumination?" A demandé à la
novice."Votre programme sera alors de fonctionner correctement», répondit le maître.
4.3
Un maître expliquait la nature du Tao de l'un de ses novices. "La
Tao est incorporée dans tous les logiciels - quel que soit le insignifiante ", a déclaré
le maître."Est-du Tao dans une calculatrice de poche?" A demandé le novice.
"Il est," fut la réponse.
"Est-du Tao dans un jeu vidéo?" Reprit le novice.
"Il est encore dans un jeu vidéo," dit le maître.
"Et c'est le Tao dans le DOS pour un ordinateur personnel?"
Le maître toussa et décalé sa position légèrement. "La leçon est terminée
pour aujourd'hui, "at-il dit.4.4
Programmeur-Prince Wang a été de codage logiciel. Ses doigts dansaient sur la
clavier. Le programme compilé sans un message d'erreur, et le programme
a couru comme un vent doux."Excellent!" Le prince s'écria: «Votre technique est irréprochable!"
"Technique?", A déclaré le programmeur tournant de son terminal, "Ce que je
suivre le Tao - au-delà de toutes les techniques! Quand j'ai commencé à programmer, je
serait vois devant moi tout le problème en une seule masse. Après trois ans, j'ai pas
voyait plus cette masse. Au lieu de cela, j'ai utilisé des sous-routines. Mais maintenant, je ne vois rien.
Mon être tout entier existe dans un vide sans forme. Mes sens sont au repos. Mon esprit,
libres de travailler sans plan, suit son instinct. En bref, mon programme
écrit elle-même. Certes, il ya parfois des problèmes difficiles. Je les vois
à venir, je ralentis, je regarde en silence. Puis-je changer une seule ligne de code
et les difficultés s'évanouissent comme des bouffées de fumée ralenti. J'ai ensuite compiler le
Programme. Je suis assis et laissez encore la joie de l'œuvre de remplir mon être. Je ferme mon
d'yeux que pour un moment et puis fermez la session. "Du-Prince a dit Wang, "Est-ce que tous mes programmeurs étaient aussi sage!"
-------------------------
Livre 5 - Entretien
Ainsi parla le maître programmeur:
"Bien, mais un programme à trois lignes de long, un jour il devra être
maintenu. "5.1
Une porte bien utilisé ne nécessite pas d'huile sur ses gonds.
Un flux de courant rapide ne pousse pas stagnante.
Ni bruit ni pensées peuvent voyager à travers le vide.
Logiciel pourrit s'il n'est pas utilisé.Ce sont de grands mystères.
5.2
Un gestionnaire a demandé à un programmeur pendant combien de temps il lui faudrait pour terminer la
programme sur lequel il travaillait. «Il sera terminé demain,« la
programmeur rapidement répondu.«Je crois que vous êtes réaliste," dit le directeur, «A vrai dire, la façon dont
de temps cela prendra? "Le programmeur réfléchit un instant. "J'ai quelques caractéristiques que je souhaite
ajouter. Cela prendra au moins deux semaines », dit-il enfin."Même que c'est trop s'attendre à», a insisté le directeur, «Je serai
satisfait tout simplement si vous me dire quand le programme est terminé. "Le programmeur d'accord à ce sujet.
Plusieurs années plus tard, le gestionnaire a pris sa retraite. Sur le chemin de sa retraite
déjeuner, il a découvert le programmeur endormi à son terminal. Il avait été
programmer toute la nuit.5.3
Un programmeur débutant a été une fois affecté à coder un paquet financier simple.
Le novice a travaillé furieusement pendant plusieurs jours, mais quand son maître examiné
son programme, il a découvert qu'il contenait un éditeur d'écran, un ensemble de
généralisée graphiques routines, une interface d'intelligence artificielle, mais
pas la moindre mention de quoi que ce soit financière.Lorsque le maître a demandé à ce sujet, le novice se sont indignés. "Ne soyez pas
si impatient, "at-il dit," je vais mettre dans l'étoffe financière par la suite. "5.4
T-il un bon fermier négliger une culture, il a planté?
Est-ce qu'un bon enseignant donnent même l'étudiant le plus humble?
Est-ce qu'un bon père de famille permet à un enfant unique pour mourir de faim?
Est-ce qu'un bon programmeur refuser de maintenir son code?-------------------------
Livre 6 - Gestion
Ainsi parla le maître programmeur:
“Let the programmers be many and the managers few – then all will be
productive.”6.1
When managers hold endless meetings, the programmers write games. Quand
accountants talk of quarterly profits, the development budget is about to
be cut. When senior scientists talk blue sky, the clouds are about to roll
in.Truly, this is not the Tao of Programming.
When managers make commitments, game programs are ignored. Quand
accountants make long-range plans, harmony and order are about to be
restored. When senior scientists address the problems at hand, the
problems will soon be solved.Truly, this is the Tao of Programming.
6.2
Why are programmers non-productive?
Because their time is wasted in meetings.Why are programmers rebellious?
Because the management interferes too much.Why are the programmers resigning one by one?
Because they are burnt out.Having worked for poor management, they no longer value their jobs.
6.3
A manager was about to be fired, but a programmer who worked for him
invented a new program that became popular and sold well. As a result, the
manager retained his job.The manager tried to give the programmer a bonus, but the programmer
refused it, saying, “I wrote the program because I thought it was an
interesting concept, and thus I expect no reward.”The manager upon hearing this remarked, “This programmer, though he holds
a position of small esteem, understands well the proper duty of an
employee. Let us promote him to the exalted position of management
consultant!”But when told this, the programmer once more refused, saying, “I exist so
that I can program. If I were promoted, I would do nothing but waste
everyone's time. Can I go now? I have a program that I'm working on.”6.4
A manager went to his programmers and told them: “As regards to your work
hours: you are going to have to come in at nine in the morning and leave
at five in the afternoon.” At this, all of them became angry and several
resigned on the spot.So the manager said: “All right, in that case you may set your own
working hours, as long as you finish your projects on schedule.” The
programmers, now satisfied, began to come in at noon and work to the wee
hours of the morning.————————————————————————–
Book 7 – Corporate Wisdom
Thus spake the master programmer:
“You can demonstrate a program for a corporate executive, but you can't
make him computer literate.”7.1
A novice asked the master: “In the east there is a great tree-structure
that men call `Corporate Headquarters'. It is bloated out of shape with
vice presidents and accountants. It issues a multitude of memos, each
saying `Go, Hence!' or `Go, Hither!' and nobody knows what is meant. Every
year new names are put onto the branches, but all to no avail. How can
such an unnatural entity be?”The master replied: “You perceive this immense structure and are
disturbed that it has no rational purpose. Can you not take amusement from
its endless gyrations? Do you not enjoy the untroubled ease of programming
beneath its sheltering branches? Why are you bothered by its
uselessness?”7.2
In the east there is a shark which is larger than all other fish. It
changes into a bird whose wings are like clouds filling the sky. When this
bird moves across the land, it brings a message from Corporate
Headquarters. This message it drops into the midst of the programmers,
like a seagull making its mark upon the beach. Then the bird mounts on the
wind and, with the blue sky at its back, returns home.The novice programmer stares in wonder at the bird, for he understands it
pas. The average programmer dreads the coming of the bird, for he fears
its message. The master programmer continues to work at his terminal, for
he does not know that the bird has come and gone.7.3
The Magician of the Ivory Tower brought his latest invention for the
master programmer to examine. The magician wheeled a large black box into
the master's office while the master waited in silence.“This is an integrated, distributed, general-purpose workstation,” began
the magician, “ergonomically designed with a proprietary operating
system, sixth generation languages, and multiple state of the art user
interfaces. It took my assistants several hundred man years to construct.
Is it not amazing?”The master raised his eyebrows slightly. “It is indeed amazing,” he
said.“Corporate Headquarters has commanded,” continued the magician, “that
everyone use this workstation as a platform for new programs. Do you agree
to this?”“Certainly,” replied the master, “I will have it transported to the
data center immediately!” And the magician returned to his tower, well
pleased.Several days later, a novice wandered into the office of the master
programmer and said, “I cannot find the listing for my new program. Do
you know where it might be?”“Yes,” replied the master, “the listings are stacked on the platform in
the data center.”7.4
The master programmer moves from program to program without fear. Aucun
change in management can harm him. He will not be fired, even if the
project is cancelled. Why is this? He is filled with Tao.————————————————————————–
Book 8 – Hardware and Software
Thus spake the master programmer:
“Without the wind, the grass does not move. Without software, hardware is
useless.”8.1
A novice asked the master: “I perceive that one computer company is much
larger than all others. It towers above its competition like a giant among
dwarfs. Any one of its divisions could comprise an entire business. Why is
this so?”The master replied, “Why do you ask such foolish questions? That company
is large because it is large. If it only made hardware, nobody would buy
it. If it only made software, nobody would use it. If it only maintained
systems, people would treat it like a servant. But because it combines all
of these things, people think it one of the gods! By not seeking to
strive, it conquers without effort.”8.2
A master programmer passed a novice programmer one day. The master noted
the novice's preoccupation with a hand-held computer game. “Excuse me,”
he said, “may I examine it?”The novice bolted to attention and handed the device to the master. “I
see that the device claims to have three levels of play: Easy, Medium, and
Hard,” said the master. “Yet every such device has another level of
play, where the device seeks not to conquer the human, nor to be conquered
by the human.”“Pray, great master,” implored the novice, “how does one find this
mysterious setting?”The master dropped the device to the ground and crushed it underfoot. Et
suddenly the novice was enlightened.8.3
There was once a programmer who worked upon microprocessors. “Look at how
well off I am here,” he said to a mainframe programmer who came to visit,
“I have my own operating system and file storage device. I do not have to
share my resources with anyone. The software is self- consistent and
easy-to-use. Why do you not quit your present job and join me here?”The mainframe programmer then began to describe his system to his friend,
saying “The mainframe sits like an ancient sage meditating in the midst
of the data center. Its disk drives lie end-to-end like a great ocean of
machinery. The software is as multifaceted as a diamond, and as convoluted
as a primeval jungle. The programs, each unique, move through the system
like a swift-flowing river. That is why I am happy where I am.”The microcomputer programmer, upon hearing this, fell silent. But the two
programmers remained friends until the end of their days.8.4
Hardware met Software on the road to Changtse. Software said: “You are
Yin and I am Yang. If we travel together we will become famous and earn
vast sums of money.” And so the set forth together, thinking to conquer
the world.Presently they met Firmware, who was dressed in tattered rags and hobbled
along propped on a thorny stick. Firmware said to them: “The Tao lies
beyond Yin and Yang. It is silent and still as a pool of water. It does
not seek fame, therefore nobody knows its presence. It does not seek
fortune, for it is complete within itself. It exists beyond space and
time.”Software and Hardware, ashamed, returned to their homes.
————————————————————————–
Book 9 – Epilogue
Thus spake the master programmer:
“It is time for you to leave.”
————————————————————————–
If you liked these, you may also like to read worse is better
A bit of shell redirection
Here is how we normally do shell redirection
$ ./pgm.sh args >out.txt 2>err.txt
I wanted to modify it a bit and run as follows
$ ./pgm.sh args
with the requirement that output and error should go to some filename computed inside pgm.sh based on args. One illustrative case could be when date is part of args. So you would like stdout to go to say /your/directory/pgm_out_YYYYMMDD.txt 1
The problem with standard way of redirecting N>file.txt ie, associating file descriptor N to file.txt , is that it works only for the newly forked process and not for the current process.
si
$ echo hi 1>out.txt ; echo hii will send hi to out.txt but will print hii to stdout. 2
This is where exec comes to our rescue. If we add exec 1>somefile.txt then output from rest of the script will go to somefile.txt
$./test.sh will redirect hi as well as hii to out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Similarly to redirect stdout as well as stderr we'll do something like this
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Now coming back to original point of redirecting to some file from inside the shell, let's say program computed the filename in some variable OUTFILE, we could have just done exec 1>$OUTFILE
That solves the current problem. But you may like to go through following example which achieves 'random access' of file in shell script. Example is from here
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890
With comments, this code is self explanatory.
-
1 It can also be done by $ ./pgm.sh args >pgm_out`date +%Y%m%d` but idea is to generate this file name based on some logic in program itself.
2 1 in 1>out.txt is redundant but it clarifies here that we are redirecting fd 1
Sony VAIO review
A month back I bought a vaio NS25G and have been planning to write this post since then. This post is primarily notes to self and review of the same. Let's get off the mark quickly -
Post has two parts -
I. Review of hardware
II. Installing debian and things to setup
Since I am not a VAIO marketing guy, I'll start other way round -
Why you may not like to buy this laptop :
- No bluetooth : believe me, in 2009 sony sells laptop without bluetooth. Sure you can use usb stuff but …
- Screen size is 15.4 inches : if you travel a lot then this laptop may not be very handy and also 2.9kg laptop is not exactly the lightest around.
- No HDMI output.
- No separate graphics card and the likes.(and no dedicated video memory
Now , why you may like to buy it :
- This laptop is a damn good desktop. What I mean is this if your requirement is like me – mostly writing programs and trying to use it 25 out of 24 hrs, then with a big screen , extremely comfortable keyboard layout with spacious palm rest and good compute power , it makes a very good combination.
- It L2 cache is 2MB and processor/memory system bus are 800MHz. I don't play games so can't say about that but for anything else but a core 2 duo processor with 2GHz freq is good, this is more than enough.
- From my usage, I see processor mostly clocks at 1.2GHz, and memory usage ~500MB. That just reinforces previous point.
- Battery backup is good, ~2 hrs is what I get.
Just one more thing here – being Sony, it will cost you a bit than other laptops with similar configuration, but that is a call u have to make.
II. Configuring linux (to run out of box ! ) :
It came pre installed with Vista( I think home premium or some fancy name like that). Dungara booted once and created another partition of 150 GB. Debian testing is what I always install and then up(down?)grade to 'unstable' sid.
Things which worked without any problem:
- X - unsurprisingly X server had not problem with starting or resolution. After one of the upgrades X refused to start though, but 'X -configure' generated a conf file which worked pretty well.
- Audio - Audio output and external mic work fine. kernel version 2.6.29-1-686 #1 SMP and alsa version 1.0.17. This is what you get from
$ lspci -v |grep Audio 00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Con1.0.17troller (rev 03) - Video cam – just works
- Hibernate to disk and back – no problem
- Wireless - in short – just works.
$ lspci |grep -i wireless
03:13:55 04:00.0 Network controller: Atheros Communications Inc. AR928X Wireless Network Adapter (PCI-Express) (rev 01) .
I think kernel 2.6..27 onwards it works with the stock kernel source. You dont have to install ndiswrapper or things like t
hat. As a note, please say good buy gnome-network-manager and welcome wicd, it is just a gui layer but behind the scene they have fixed lot of config stuff like wpasupplient and more.
What doesn't work -
- Somehow internal mic refuses to work
External mic works fine though. Latest alsa sources did not compile cleanly on debian, so for the time being I bought external Internal mic, will try to dig into it sometime in future though.
Few more misc hints for deiban:
- Package for devnagri font- ttf-indic-fonts
- Package for flash player – flashplugin-nonfree
- Entry in sources.list for mplayer and likes – deb http://www.debian-multimedia.org sid main
- Entry in sources.list for e17 – deb http://debian.alphagemini.org/ unstable main
- Entry in sources.list for skype – http://download.skype.com/linux/repos/debian/ stable non-free
oneliner for increasing and decreasing the brightness -
[root]prashant@vaio09:12 PM$ cat bin/incbrightness.sh
#!/usr/bin/env bash
echo $[1+`cat /sys/class/backlight/acpi_video0/brightness `] >/sys/class/backlight/acpi_video0/brightness
you'll have to put this in sudo though.
and to decrease change + to – and … you get the idea, right !
A bit more, if you use enlightenment(e17) here are few more hints -
[enlightenment key bindidings]
You can use following key code and mapping
mute :
KEY="Keycode-160" ACTION="exec" PARAMS="/usr/bin/amixer -q set Master toggle"
hibernate :
KEY="Keycode-165" ACTION="exec" PARAMS="sudo /usr/sbin/hibernate-disk"
volume decrease :
KEY="Keycode-174" ACTION="exec" PARAMS="/usr/bin/amixer -q set Master 2-"
volume increase:
KEY="Keycode-176" ACTION="exec" PARAMS="/usr/bin/amixer -q set Master 2+"
increase brightness :
KEY="Keycode-212" ACTION="exec" PARAMS="sudo /root/bin/incbrightness.sh"
decrease brightness
KEY="Keycode-101" ACTION="exec" PARAMS="sudo /root/bin/decbrightness.sh"



































