614 shaares
121 results
tagged
programming
If you wanna make custom editors in Unity, be wary of the headaches.
That being said, you could always check the "newly" released Unity C# reference code on how they tackle their own Editors.
For instance, you see some fancy thing they did in their SpriteRenderer editor OnInspectorGUI, go look up the code and get inspired by their magic!
That being said, you could always check the "newly" released Unity C# reference code on how they tackle their own Editors.
For instance, you see some fancy thing they did in their SpriteRenderer editor OnInspectorGUI, go look up the code and get inspired by their magic!
Basically replacing this
class A:
def __init__(self, b, c, d, e):
self.b = b
self.c = c
self.d = d
self.e = e
by
class A:
def __init__(self, b, c, d, e):
# You can edit parameters' value here before they are being stored
for k, v in vars().items():
setattr(self, k, v)
By me.
class A:
def __init__(self, b, c, d, e):
self.b = b
self.c = c
self.d = d
self.e = e
by
class A:
def __init__(self, b, c, d, e):
# You can edit parameters' value here before they are being stored
for k, v in vars().items():
setattr(self, k, v)
By me.
[path_to_script]\python-no-autoclose.py "$(FULL_CURRENT_PATH)"
In the menu Run > Run, put this in the text field and hit Save, give it a name and a key combination. Personally I used Shift+F5. Be wary than all key combinations might not work, try it to make sure or change it.
The script:
import sys
import traceback
import subprocess
import os
import pathlib
if sys.argv[1:]: # Failsafe
try:
os.chdir(str(pathlib.Path(sys.argv[1]).parent))
except Exception as e:
traceback.print_exc()
try:
subprocess.call(['python', sys.argv[1]])
except Exception as e:
traceback.print_exc()
else:
print('I\'m very confused...')
print()
input('Press Enter to exit.')
In the menu Run > Run, put this in the text field and hit Save, give it a name and a key combination. Personally I used Shift+F5. Be wary than all key combinations might not work, try it to make sure or change it.
The script:
import sys
import traceback
import subprocess
import os
import pathlib
if sys.argv[1:]: # Failsafe
try:
os.chdir(str(pathlib.Path(sys.argv[1]).parent))
except Exception as e:
traceback.print_exc()
try:
subprocess.call(['python', sys.argv[1]])
except Exception as e:
traceback.print_exc()
else:
print('I\'m very confused...')
print()
input('Press Enter to exit.')
I don't have any experience with compiling Java so I'm just leaving this here for future me.
1) Download Java JDK (Any version should be fine)
2) If you're lucky to have a .gradle file in your app directory, download Gradle. (You can then add gradle to your PATH, but that's optional)
3) Go in the directory where your .gradle file is situated and run
PATH_TO_YOUR_GRADLE/bin/gradle build
4) The compiled .jar will be situated in build/libs
That's it!
1) Download Java JDK (Any version should be fine)
2) If you're lucky to have a .gradle file in your app directory, download Gradle. (You can then add gradle to your PATH, but that's optional)
3) Go in the directory where your .gradle file is situated and run
PATH_TO_YOUR_GRADLE/bin/gradle build
4) The compiled .jar will be situated in build/libs
That's it!
Sauvegarder les métadonnées EXIF avec PIL.
Quick and simple backdoor to control your computers/turtles (from ComputerCraft) from outside Minecraft. Here featuring with Python.
Ils sont sympas sur le tchat PHP de SO.
Quelques amis m'ont donné des exemples de codes à propos des exceptions en PHP, que j'ai, un peu trop souvent rechigné.
C'est *bô*. Jugez-en par vous même:
http://3v4l.org/NJJjO
function (╯°□°)╯︵┻━┻(){throw new ┻━┻;}
class ┻━┻ extends Exception {public function __construct() {parent::__construct("Please respect tables! ┬─┬ノ(ಠ_ಠノ)");} public function __toString(){return "┬─┬";}}
// try/catch
try { (╯°□°)╯︵┻━┻ (); } catch ( ┻━┻ $niceguy) {echo $niceguy->getMessage();}
// ok now lets see an uncaught one
(╯°□°)╯︵┻━┻
();
// Output:
Please respect tables! ┬─┬ノ(ಠ_ಠノ)
Fatal error: Uncaught ┬─┬
Et http://3v4l.org/TkNpc
class JeromeException extends Exception
{
protected $boobies = [];
function __construct($message = null, $code = 0, Exception $previous = null, $arrayOfBoobies = [])
{
$this->boobies = $arrayOfBoobies;
}
function getTraceEx()
{
return $this->getTrace() + ['boobies' => $this->boobies];
}
}
function jeromeIsExceptional()
{
try {
throw new JeromeException('herro', 0, null, ['34B', '32C', '36D']);
}
catch (JeromeException $e) {
var_dump($e->getTraceEx());
}
}
jeromeIsExceptional();
Quelques amis m'ont donné des exemples de codes à propos des exceptions en PHP, que j'ai, un peu trop souvent rechigné.
C'est *bô*. Jugez-en par vous même:
http://3v4l.org/NJJjO
function (╯°□°)╯︵┻━┻(){throw new ┻━┻;}
class ┻━┻ extends Exception {public function __construct() {parent::__construct("Please respect tables! ┬─┬ノ(ಠ_ಠノ)");} public function __toString(){return "┬─┬";}}
// try/catch
try { (╯°□°)╯︵┻━┻ (); } catch ( ┻━┻ $niceguy) {echo $niceguy->getMessage();}
// ok now lets see an uncaught one
(╯°□°)╯︵┻━┻
();
// Output:
Please respect tables! ┬─┬ノ(ಠ_ಠノ)
Fatal error: Uncaught ┬─┬
Et http://3v4l.org/TkNpc
class JeromeException extends Exception
{
protected $boobies = [];
function __construct($message = null, $code = 0, Exception $previous = null, $arrayOfBoobies = [])
{
$this->boobies = $arrayOfBoobies;
}
function getTraceEx()
{
return $this->getTrace() + ['boobies' => $this->boobies];
}
}
function jeromeIsExceptional()
{
try {
throw new JeromeException('herro', 0, null, ['34B', '32C', '36D']);
}
catch (JeromeException $e) {
var_dump($e->getTraceEx());
}
}
jeromeIsExceptional();
Nice!
Bon, sachant que sebsauvage lit rarement ses mails, je vais tenter de le contacter par ici. :)
Ton implémentation est non sécurisée. C'est mal car d'autres personnes risquent de s'en inspirer sans savoir les problèmes liés à cette implémentation.
1) " Warning - When comparing the output of hexdigest() to an externally-supplied digest during a verification routine, it is recommended to use the compare_digest() function instead of the == operator to reduce the vulnerability to timing attacks." https://docs.python.org/3.4/library/hmac.html#hmac.HMAC.hexdigest
2) "The digestmod argument to the hmac.new() function may now be any hash digest name recognized by hashlib. In addition, the current behavior in which the value of digestmod defaults to MD5 is deprecated: in a future version of Python there will be no default value. (Contributed by Christian Heimes in issue 17276.)" https://docs.python.org/3/whatsnew/3.4.html#hmac
Donc il faudrait mieux commencer à spécifier une valeur pour digestmod.
Comme suggéré par l'issue (1) et cette réponse sur SO (2), je proposerais d'utiliser SHA-256 ou SHA-512 comme suit :
hmac.compare_digest(hmac.new(key, name, digestmod=hashlib.sha256).hexdigest(), signature)
(+ remplacer partout où il faut bien sure et ne pas oublier import hashlib)
(1) https://bugs.python.org/issue17276
"As of now the hash algorithm for HMAC defaults to MD5. However MD5 is considered broken. HMAC-MD5 is still ok but shall not be used in new code. Applications should slowly migrate away from HMAC-MD5 and use a more modern algorithm like HMAC-SHA256.
Therefore I propose that default digestmod should be deprecated in Python 3.4 and removed in 3.5. Starting with Python 3.5 developer are forced to choose a hash algorithm like SHA256. Our documentation shall suggest it, too."
(2) http://crypto.stackexchange.com/a/9340/18518
"Yes, there are currently no known attacks on HMAC-MD5.
[…]
However, this does not mean you should use HMAC-MD5 in new cryptosystem designs. To paraphrase Bruce Schneier, "attacks only get better, never worse." We already have practical collision attacks for MD5, showing that it does not meet its original security goals; it's possible that, any day now, someone might figure out a way to turn those into a preimage attack, which would compromise the security of HMAC-MD5. A much better choice would be to use HMAC with a hash function having no known attacks, such as SHA-2 or SHA-3."
Ton implémentation est non sécurisée. C'est mal car d'autres personnes risquent de s'en inspirer sans savoir les problèmes liés à cette implémentation.
1) " Warning - When comparing the output of hexdigest() to an externally-supplied digest during a verification routine, it is recommended to use the compare_digest() function instead of the == operator to reduce the vulnerability to timing attacks." https://docs.python.org/3.4/library/hmac.html#hmac.HMAC.hexdigest
2) "The digestmod argument to the hmac.new() function may now be any hash digest name recognized by hashlib. In addition, the current behavior in which the value of digestmod defaults to MD5 is deprecated: in a future version of Python there will be no default value. (Contributed by Christian Heimes in issue 17276.)" https://docs.python.org/3/whatsnew/3.4.html#hmac
Donc il faudrait mieux commencer à spécifier une valeur pour digestmod.
Comme suggéré par l'issue (1) et cette réponse sur SO (2), je proposerais d'utiliser SHA-256 ou SHA-512 comme suit :
hmac.compare_digest(hmac.new(key, name, digestmod=hashlib.sha256).hexdigest(), signature)
(+ remplacer partout où il faut bien sure et ne pas oublier import hashlib)
(1) https://bugs.python.org/issue17276
"As of now the hash algorithm for HMAC defaults to MD5. However MD5 is considered broken. HMAC-MD5 is still ok but shall not be used in new code. Applications should slowly migrate away from HMAC-MD5 and use a more modern algorithm like HMAC-SHA256.
Therefore I propose that default digestmod should be deprecated in Python 3.4 and removed in 3.5. Starting with Python 3.5 developer are forced to choose a hash algorithm like SHA256. Our documentation shall suggest it, too."
(2) http://crypto.stackexchange.com/a/9340/18518
"Yes, there are currently no known attacks on HMAC-MD5.
[…]
However, this does not mean you should use HMAC-MD5 in new cryptosystem designs. To paraphrase Bruce Schneier, "attacks only get better, never worse." We already have practical collision attacks for MD5, showing that it does not meet its original security goals; it's possible that, any day now, someone might figure out a way to turn those into a preimage attack, which would compromise the security of HMAC-MD5. A much better choice would be to use HMAC with a hash function having no known attacks, such as SHA-2 or SHA-3."
Woaaah, PHP ne cessera jamais de m'impressioner, dans le mauvais sens du terme.
>.<"
(Source: http://stackoverflow.com/a/2950046/1524913 )
>.<"
(Source: http://stackoverflow.com/a/2950046/1524913 )
Quelques conseils issus de mon expérience personnelle avec GreaseMonkey…
J'en ai chié quelques fois, donc si ça peut en aider quelques un… Sait-on jamais ! :D
J'en ai chié quelques fois, donc si ça peut en aider quelques un… Sait-on jamais ! :D
So, except few exceptions, almost all passwords shouldn't have "any" limit on the size of them upward (= no maximum length). Riiiight? :)
(Since they aren't supposed to be stored in raw form anyway and most (if not all?) hashing algorithm accept any size of password and always return unique constant length string)
So why HTML doesnt prevent bad ideas to be working? Like setting a maximum length on a password input… The way I see it, that would just not work and be reported in the console for debbugging purpose.
For the things I, so called "exceptions", I was thinking about PIN codes for instance. I could imagine letting HTML implements a new tag (or a new type of input tag) allowing a max length, but surely it would surely be abused though… Maybe those "PIN code" input should allow one fixed-length of password (as expected from a PIN code anyway and that would induce way less abuse too):
Finally, my browser (maybe some others too, mine is currently Palemoon, a implementation of Firefox) only prevent me to type more characters when I reach the maximum allowed by max-length, …, it doesnt warn me, it does nothing but preventing… The problem is that, if it was plain text, I could notice it easily, but as it is a password input and that my password is longer than the visible length of the field, then I have no fucking clue that what I'm currently typing is thrown away as I type it… -_-
So, some fucking warning would be appreciated at least!
(Since they aren't supposed to be stored in raw form anyway and most (if not all?) hashing algorithm accept any size of password and always return unique constant length string)
So why HTML doesnt prevent bad ideas to be working? Like setting a maximum length on a password input… The way I see it, that would just not work and be reported in the console for debbugging purpose.
For the things I, so called "exceptions", I was thinking about PIN codes for instance. I could imagine letting HTML implements a new tag (or a new type of input tag) allowing a max length, but surely it would surely be abused though… Maybe those "PIN code" input should allow one fixed-length of password (as expected from a PIN code anyway and that would induce way less abuse too):
Finally, my browser (maybe some others too, mine is currently Palemoon, a implementation of Firefox) only prevent me to type more characters when I reach the maximum allowed by max-length, …, it doesnt warn me, it does nothing but preventing… The problem is that, if it was plain text, I could notice it easily, but as it is a password input and that my password is longer than the visible length of the field, then I have no fucking clue that what I'm currently typing is thrown away as I type it… -_-
So, some fucking warning would be appreciated at least!
Bonne question … (Good question)
Peu de réponses … (Few answers)
Peu de réponses … (Few answers)
Ouuh, de chouettes infos que nous avons là. :o
Hop je pause ça là pour plus tard
[22:00:13] Lunatick: En gros Kineticjs => control du canva en génial, fonction avancées, events de tout types (click, touch) géré nativement
[22:00:13] Lunatick: et Tweenmax ça permet d'animer n'importe quel valeur numérique sur le temps, un peu comme une transition CSS mais sur ce qu'on veut
[22:00:28] Lunatick: donc la Combinaison de Kineticjs + GSAP Tweenmax = des animation/jeu en js fluides et simple à écrire
[22:00:28] Lunatick: L'avantage de Tweenmax c'est aussi que n'importe quoi peut etre animé, exemple ça peut etre la largeur d'un élément du DOM, un nombre lambda ou les prop de n'importe quel objet
[22:03:41] Lunatick: avec en prime une la possibilité d'appeler une fonction en callback au début, à la fin, et à chaque mise a jour de l'item que tu "animes"
Hop je pause ça là pour plus tard
[22:00:13] Lunatick: En gros Kineticjs => control du canva en génial, fonction avancées, events de tout types (click, touch) géré nativement
[22:00:13] Lunatick: et Tweenmax ça permet d'animer n'importe quel valeur numérique sur le temps, un peu comme une transition CSS mais sur ce qu'on veut
[22:00:28] Lunatick: donc la Combinaison de Kineticjs + GSAP Tweenmax = des animation/jeu en js fluides et simple à écrire
[22:00:28] Lunatick: L'avantage de Tweenmax c'est aussi que n'importe quoi peut etre animé, exemple ça peut etre la largeur d'un élément du DOM, un nombre lambda ou les prop de n'importe quel objet
[22:03:41] Lunatick: avec en prime une la possibilité d'appeler une fonction en callback au début, à la fin, et à chaque mise a jour de l'item que tu "animes"
J'avais commencé par faire le tout avec GreaseMonkey mais j'ai eu des probs avec le setTimeout tué par GreaseMonkey.
Du coup, j'ai fais un code très rapide en PHP; Il est fonctionnel (c'était le but).
Mais pour MEGA, le téléchargement coince à la fin, sûrement un prob de compatibilité du au domaine différent (127.0.0.1 dans mon cas).
Du coup Oros m'a aidé à résoudre le problème GreaseMonkey - je n'ai toujours pas compris pourquoi son code fonctionne et pas le mien, … mais au moins son code fonctionne! :
window.setTimeout('function wait() {if(document.getElementsByClassName("new-download-red-button").length==0){setTimeout("wait()",1000);}else{document.getElementsByClassName("new-download-red-button")[0].click();}}wait();', 1000);
Source: https://www.ecirtam.net/links/?XoFKOQ
Ça pourrait sûrement très facilement être entièrement porté à GreaseMonkey du coup …
Pour finir, dans mon cas, pour que ça reste quand même "pratique" (car au moins avec greaseMonkey, aucun clic requis), j'ai, personnellement, tout plein de pages bourrées de ces liens, donc j'ai un quick snippet pour changer tous les liens de la page pour qu'ils passent tous via mon script, et lorsqu'un cas n'est pas géré, mon script redirige vers la page normal.
javascript:var%20links=document.getElementsByTagName('a');for(var%20i%20=%200;%20i%20<%20links.length;%20i++){void(links[i].href%20=%20'http://127.0.0.1/test.php?url='+links[i].href);}
Du coup, j'ai fais un code très rapide en PHP; Il est fonctionnel (c'était le but).
Mais pour MEGA, le téléchargement coince à la fin, sûrement un prob de compatibilité du au domaine différent (127.0.0.1 dans mon cas).
Du coup Oros m'a aidé à résoudre le problème GreaseMonkey - je n'ai toujours pas compris pourquoi son code fonctionne et pas le mien, … mais au moins son code fonctionne! :
window.setTimeout('function wait() {if(document.getElementsByClassName("new-download-red-button").length==0){setTimeout("wait()",1000);}else{document.getElementsByClassName("new-download-red-button")[0].click();}}wait();', 1000);
Source: https://www.ecirtam.net/links/?XoFKOQ
Ça pourrait sûrement très facilement être entièrement porté à GreaseMonkey du coup …
Pour finir, dans mon cas, pour que ça reste quand même "pratique" (car au moins avec greaseMonkey, aucun clic requis), j'ai, personnellement, tout plein de pages bourrées de ces liens, donc j'ai un quick snippet pour changer tous les liens de la page pour qu'ils passent tous via mon script, et lorsqu'un cas n'est pas géré, mon script redirige vers la page normal.
javascript:var%20links=document.getElementsByTagName('a');for(var%20i%20=%200;%20i%20<%20links.length;%20i++){void(links[i].href%20=%20'http://127.0.0.1/test.php?url='+links[i].href);}
Quoi ?! Relayer le problème en utilisant la connexion via Google/FB & co? C'est une blague ?
J'ai pas encore regardé le reste de la vidéo. :)
J'ai pas encore regardé le reste de la vidéo. :)
Ouais, c'est chiant ça…
Ceci dit, non merci, je ne veux pas utilise les touches directionnelles personnellement.
Étant droitier, ce n'est pas pour rien que ces touches là sont devenues célèbres comme secondes touches de direction.
Je me vois mal avec ma main gauche à droite de mon clavier avec ma main droite pas loin. Enfin c'est ptet une question de préférence habitude. Mais je suis beaucoup plus confortable (habitué ?) lorsque j'ai un main de chaque côté. (Puis ça réduit les mouvements nécessaires. L'air de rien c'est super important. Voir clavier BÉPO & co)
Ce que je trouve par contre que les développeurs auraient du faire depuis longtemps serait de :
1) Normaliser ça.
2) Les assigner à un nom (Les touches gauche, droite, haut et bas sont "souvent" référencables par leur nom non? Sinon évidemment, si c'est uniquement par leur code c'est "too bad"), tel que ALTERNATIVE_LEFT ou quelques chose ainsi, qui varieraient donc dynamiquement d'un clavier AZERTY à un clavier QWERTY. Etc.
Ou alors faut tenter de se venger et sortir plein de jeux avec les touches QZSD par défaut. Lulz. (#rire_jaune)
Ceci dit, non merci, je ne veux pas utilise les touches directionnelles personnellement.
Étant droitier, ce n'est pas pour rien que ces touches là sont devenues célèbres comme secondes touches de direction.
Je me vois mal avec ma main gauche à droite de mon clavier avec ma main droite pas loin. Enfin c'est ptet une question de préférence habitude. Mais je suis beaucoup plus confortable (habitué ?) lorsque j'ai un main de chaque côté. (Puis ça réduit les mouvements nécessaires. L'air de rien c'est super important. Voir clavier BÉPO & co)
Ce que je trouve par contre que les développeurs auraient du faire depuis longtemps serait de :
1) Normaliser ça.
2) Les assigner à un nom (Les touches gauche, droite, haut et bas sont "souvent" référencables par leur nom non? Sinon évidemment, si c'est uniquement par leur code c'est "too bad"), tel que ALTERNATIVE_LEFT ou quelques chose ainsi, qui varieraient donc dynamiquement d'un clavier AZERTY à un clavier QWERTY. Etc.
Ou alors faut tenter de se venger et sortir plein de jeux avec les touches QZSD par défaut. Lulz. (#rire_jaune)
Et toc!
Oooouh, je connaissais pas inspect.getsource, c'est génial. ^-^
Petit guide d'optimisation en Python.
Nice reading.
Nice reading.
AttributeError: 'itertools.count' object has no attribute 'next'
Arf …
Le code suivant ne fonctionne donc plus en Python 3 :
>>> import itertools, collections
>>> value_to_numeric_map = collections.defaultdict(itertools.count().next)
>>> value_to_numeric_map['a']
0
>>> value_to_numeric_map['b']
1
>>> value_to_numeric_map['c']
2
>>> value_to_numeric_map['a']
0
>>> value_to_numeric_map['b']
1
La première solution venant à l'esprit serait d'avoir à instancier une variable :
>>> c = itertools.count()
>>> value_to_numeric_map = collections.defaultdict(lambda a: next(c))
Et ça fonctionne très bien.
Mais personnellement, je préfère lorsque ça reste one-line, donc voici une alternative one-line :
J'utilise lambda pour créer une encapsulation (closure).
value_to_numeric_map = collections.defaultdict((lambda c: (lambda: next(c)))(itertools.count()))
Arf …
Le code suivant ne fonctionne donc plus en Python 3 :
>>> import itertools, collections
>>> value_to_numeric_map = collections.defaultdict(itertools.count().next)
>>> value_to_numeric_map['a']
0
>>> value_to_numeric_map['b']
1
>>> value_to_numeric_map['c']
2
>>> value_to_numeric_map['a']
0
>>> value_to_numeric_map['b']
1
La première solution venant à l'esprit serait d'avoir à instancier une variable :
>>> c = itertools.count()
>>> value_to_numeric_map = collections.defaultdict(lambda a: next(c))
Et ça fonctionne très bien.
Mais personnellement, je préfère lorsque ça reste one-line, donc voici une alternative one-line :
J'utilise lambda pour créer une encapsulation (closure).
value_to_numeric_map = collections.defaultdict((lambda c: (lambda: next(c)))(itertools.count()))
Ouuuuuh, y a des trucs vachement chouettes !
Comme "1.14 Grouping adjacent list items using zip", c'est brillant, utilisé plusieurs instances du même objet iter pour regrouper les éléments ensemble. <3 (Même si j'avoue que la deuxième méthode est ptet plus lisible :D )
Ou "1.30 Using default dictionaries to represent simple trees" : Miam !
Etc.
(via http://sebsauvage.net/links/?3ASd0g )
Comme "1.14 Grouping adjacent list items using zip", c'est brillant, utilisé plusieurs instances du même objet iter pour regrouper les éléments ensemble. <3 (Même si j'avoue que la deuxième méthode est ptet plus lisible :D )
Ou "1.30 Using default dictionaries to represent simple trees" : Miam !
Etc.
(via http://sebsauvage.net/links/?3ASd0g )
Lien précédent : http://www.olissea.com/mb/links/1/?ibR8_g
EDIT: J'ai trouvé ce problème ceci dit: https://bugs.php.net/bug.php?id=65045
Mais j'ignore si je suis vraiment concerné : ça dépend en effet si mon script capture ces séquences à problèmes mais il me semble qu'il ne capture que les séquences valides de 4 bytes, donc pas de problème normalement.
Également, j'ai pas trop compris comment ça se fait, mais lorsque j'applique htmlspecialchars sur les séquences données sur la page, l'output n'est pas vide. Ne devrait-il pas l'être (vu que htmlspecialchars renvoie stupidement une chaîne vide lorsqu'il reçoit de l'UTF-8 invalide normalement ?).
Mmmmmh.
</EDIT>
"Plop.
Après mainte péripéties et échecs, je pense avoir trouver quelque chose de "potable".
Voir le code avec coloration syntaxique (un peu différent, manque une source) : http://sebsauvage.net/paste/?e249576d75ee9946#jBpv2UCufTQ4UC2WnTtM11gfolfGkQi61brf11pFORU=
<?php
# "😒" est codé sur 4 bytes
$body = 'lol😒a☺';
echo 'before: ',$body,'<br />'; # Output: lol😒a☺
echo 'length: ',strlen($body),'<br />'; # Output: 11 (😒 = 4, ☺ = 3)
# Le but est de remplacer uniquement les caractères de plus de 3 bytes par leur entité HTML.
# Afin d'obtenir ce code dans le cas de notre exemple
echo '😒','<br />'; # Fourni par https://duckduckgo.com/?q=html+%F0%9F%98%92
# Récupération des caractères de plus de 3 bytes uniquement
# Source: http://stackoverflow.com/a/1401716/1524913
# $body = preg_replace('/[\xF0-\xF7][\x80-\xBF]{3}/', '�', $body); # Yeah! It works!
# Ne fonctionne pas. htmlentities ne connaît pas tous les caractères unicode ( http://stackoverflow.com/a/13942507/1524913 )
# $body = preg_replace_callback('/[\xF0-\xF7][\x80-\xBF]{3}/', function($m){return htmlentities($m[0], ENT_COMPAT, 'UTF-8');}, $body); # Ignore complètement 😒
# La solution proposée au lien précédemment cité : Ne fonctionne pas non plus
# $body = preg_replace_callback('/[\xF0-\xF7][\x80-\xBF]{3}/', function($m){return str_replace('\\u','&#x',trim(json_encode($m[0]),'"')).';';}, $body);
# Output: lol��a☺ car json_encode considère ça comme deux caractères de deux bytes et renvoie "\ud83d\ude12"
# Ne fonctionne pas ( http://php.net/manual/en/function.htmlentities.php#107985 )
# $body = preg_replace_callback('/[\xF0-\xF7][\x80-\xBF]{3}/', function($m){return mb_encode_numericentity($m[0], array(0x0, 0xffff, 0, 0xffff), 'UTF-8');}, $body); # Ignore complètement 😒
# Fonctionne !!! Mais renvoie 😒 au lieu de 😒 (Pas vraiment un problème en soit)
# $body = preg_replace_callback('/[\xF0-\xF7][\x80-\xBF]{3}/', function($m){return mb_convert_encoding($m[0], 'HTML-ENTITIES', 'UTF-8');}, $body);
# Si on veut vraiment la version hexadécimal
$body = preg_replace_callback('/[\xF0-\xF7][\x80-\xBF]{3}/', function($m){return '&#x'.dechex(substr(mb_convert_encoding($m[0], 'HTML-ENTITIES', 'UTF-8'), 2)).';';}, $body);
echo 'after: ',$body,'<br />'; # Output: lol😒a☺
?> "
EDIT: J'ai trouvé ce problème ceci dit: https://bugs.php.net/bug.php?id=65045
Mais j'ignore si je suis vraiment concerné : ça dépend en effet si mon script capture ces séquences à problèmes mais il me semble qu'il ne capture que les séquences valides de 4 bytes, donc pas de problème normalement.
Également, j'ai pas trop compris comment ça se fait, mais lorsque j'applique htmlspecialchars sur les séquences données sur la page, l'output n'est pas vide. Ne devrait-il pas l'être (vu que htmlspecialchars renvoie stupidement une chaîne vide lorsqu'il reçoit de l'UTF-8 invalide normalement ?).
Mmmmmh.
</EDIT>
"Plop.
Après mainte péripéties et échecs, je pense avoir trouver quelque chose de "potable".
Voir le code avec coloration syntaxique (un peu différent, manque une source) : http://sebsauvage.net/paste/?e249576d75ee9946#jBpv2UCufTQ4UC2WnTtM11gfolfGkQi61brf11pFORU=
<?php
# "😒" est codé sur 4 bytes
$body = 'lol😒a☺';
echo 'before: ',$body,'<br />'; # Output: lol😒a☺
echo 'length: ',strlen($body),'<br />'; # Output: 11 (😒 = 4, ☺ = 3)
# Le but est de remplacer uniquement les caractères de plus de 3 bytes par leur entité HTML.
# Afin d'obtenir ce code dans le cas de notre exemple
echo '😒','<br />'; # Fourni par https://duckduckgo.com/?q=html+%F0%9F%98%92
# Récupération des caractères de plus de 3 bytes uniquement
# Source: http://stackoverflow.com/a/1401716/1524913
# $body = preg_replace('/[\xF0-\xF7][\x80-\xBF]{3}/', '�', $body); # Yeah! It works!
# Ne fonctionne pas. htmlentities ne connaît pas tous les caractères unicode ( http://stackoverflow.com/a/13942507/1524913 )
# $body = preg_replace_callback('/[\xF0-\xF7][\x80-\xBF]{3}/', function($m){return htmlentities($m[0], ENT_COMPAT, 'UTF-8');}, $body); # Ignore complètement 😒
# La solution proposée au lien précédemment cité : Ne fonctionne pas non plus
# $body = preg_replace_callback('/[\xF0-\xF7][\x80-\xBF]{3}/', function($m){return str_replace('\\u','&#x',trim(json_encode($m[0]),'"')).';';}, $body);
# Output: lol��a☺ car json_encode considère ça comme deux caractères de deux bytes et renvoie "\ud83d\ude12"
# Ne fonctionne pas ( http://php.net/manual/en/function.htmlentities.php#107985 )
# $body = preg_replace_callback('/[\xF0-\xF7][\x80-\xBF]{3}/', function($m){return mb_encode_numericentity($m[0], array(0x0, 0xffff, 0, 0xffff), 'UTF-8');}, $body); # Ignore complètement 😒
# Fonctionne !!! Mais renvoie 😒 au lieu de 😒 (Pas vraiment un problème en soit)
# $body = preg_replace_callback('/[\xF0-\xF7][\x80-\xBF]{3}/', function($m){return mb_convert_encoding($m[0], 'HTML-ENTITIES', 'UTF-8');}, $body);
# Si on veut vraiment la version hexadécimal
$body = preg_replace_callback('/[\xF0-\xF7][\x80-\xBF]{3}/', function($m){return '&#x'.dechex(substr(mb_convert_encoding($m[0], 'HTML-ENTITIES', 'UTF-8'), 2)).';';}, $body);
echo 'after: ',$body,'<br />'; # Output: lol😒a☺
?> "
Any idea anyone? (Thanks in advance :))
EDIT: Solution: http://www.olissea.com/mb/links/1/?_F3x0g
EDIT: J'ai trouvé ça mais ça ne fonctionne pas chez moi malheureusement . :( J'ignore pourquoi. http://webcollab.sourceforge.net/unicode.html ( Character Validation )
"Helloooo
Quelqu'un aurait-il une idée afin de stocker de l'UTF-8 façon correcte avec MySQL d'une version antérieur à MySQL 5.5 ?
Background: Avant MySQL5.5, il n'y a que l'option utf8 et non l'option utf8mb4 permettant (enfin!) de stocker des caractères codés sur 4 bytes ("I wish I was kidding" - Source ).
What I've tried so far / Ce que j'ai déjà essayé :
J'avais pensé à peut-être utilisé un champ de type BINARY (ou BLOB), ce qui me permettrait d'y stocker ce que j'y veux (le problème serait donc résolu) mais cela apporte aussi son lot d'inconvénients…
- Memory overhead pour accéder à des champs de type TEXT ou BLOB. (Boarf, pas très grave, j'utilise déjà un champ TEXT)
- Impossibilité d'utiliser ses champs dans une clause WHERE et donc, je suppose, également dans un LIKE afin de faire une recherche dans la base de données. Right?
(J'aurais du garder les sources parlant de ces dits inconvénients… sorry)
Côté PHP je pourrais essayer de détecter les caractères sur 4 bytes (ça serait lourd par contre) mais j'ignore même ce que j'en ferais… Les convertir en entité HTML ?
Je refuse de me mettre à utiliser htmlentities au lieu d'htmlspecialchars :( (fin, ça serait trop triste quoi)"
EDIT: Solution: http://www.olissea.com/mb/links/1/?_F3x0g
EDIT: J'ai trouvé ça mais ça ne fonctionne pas chez moi malheureusement . :( J'ignore pourquoi. http://webcollab.sourceforge.net/unicode.html ( Character Validation )
"Helloooo
Quelqu'un aurait-il une idée afin de stocker de l'UTF-8 façon correcte avec MySQL d'une version antérieur à MySQL 5.5 ?
Background: Avant MySQL5.5, il n'y a que l'option utf8 et non l'option utf8mb4 permettant (enfin!) de stocker des caractères codés sur 4 bytes ("I wish I was kidding" - Source ).
What I've tried so far / Ce que j'ai déjà essayé :
J'avais pensé à peut-être utilisé un champ de type BINARY (ou BLOB), ce qui me permettrait d'y stocker ce que j'y veux (le problème serait donc résolu) mais cela apporte aussi son lot d'inconvénients…
- Memory overhead pour accéder à des champs de type TEXT ou BLOB. (Boarf, pas très grave, j'utilise déjà un champ TEXT)
- Impossibilité d'utiliser ses champs dans une clause WHERE et donc, je suppose, également dans un LIKE afin de faire une recherche dans la base de données. Right?
(J'aurais du garder les sources parlant de ces dits inconvénients… sorry)
Côté PHP je pourrais essayer de détecter les caractères sur 4 bytes (ça serait lourd par contre) mais j'ignore même ce que j'en ferais… Les convertir en entité HTML ?
Je refuse de me mettre à utiliser htmlentities au lieu d'htmlspecialchars :( (fin, ça serait trop triste quoi)"
Bronco: "Une petite idée d'amélioration possible pour pickypaste: serait-il possible d'étendre la durée de validité du message pour le user ? (ou de cocher une case "permettre au destinataire de prolonger la durée de validité")
ça permettrait de ne pas perdre direct le message si on n'a pas le temps d'y répondre dès la lecture ^^"
J'aime beaucoup l'idée (si je l'ai bien comprise), mais je ne vois pas trop (pas encore ?) comment on pourrait implémenter ça par contre…
(Le fait que PickyPaste utilise un zerobin externe au lieu d'être un fork de zerobin limite quelques possibilités ou rend les choses plus complexes...)
ça permettrait de ne pas perdre direct le message si on n'a pas le temps d'y répondre dès la lecture ^^"
J'aime beaucoup l'idée (si je l'ai bien comprise), mais je ne vois pas trop (pas encore ?) comment on pourrait implémenter ça par contre…
(Le fait que PickyPaste utilise un zerobin externe au lieu d'être un fork de zerobin limite quelques possibilités ou rend les choses plus complexes...)
Juste avoir une fonction correcte, facile à utiliser, qui ne me renvoie pas une chaîne de caractère vide si l'input contient de l'utf-8 invalide.
Et, dût ma contrainte technique, la seule alternative que j'ai (ENT_IGNORE) est déconseillée … Doh.
( EDIT: [Je raconte ma vie]
Pis PHP ne cesse de m'épater dans le mauvais sens et plus j'investigue plus j'suis aberré.
M'enfin … ça n'a pas que du mauvais, ça m'aide à me forcer à faire plus de Python et moins de PHP.
Pour ceux qui continuent à me demander pourquoi je fais encore du PHP je répondrais que les vieilles habitudes ont la vie dure, qu'il faudrait que je transcrive tout mes scripts PHP vers Python, c'est beaucoup de boulot … tellement qu'on préfère souvent la simplicité de continuer les vieilles habitudes et/ou quand on a pas le choix / temps et qu'on a besoin que qu'une appli ou autre soit fonctionnelle dans les temps. Et malheureusement, j'ai encore trop de setup à faire pour que je puisse le faire via Python, mais ça vient ptit à ptit. ☺
)
EDIT 2:
Je pense que le plus simple/efficace serait, comme je l'avais fait une fois sans vraiment avoir étudier la question en profondeur, serait de juste réimplémenter la fonction via str_replace qui lui est apparemment 100% utf-8 safe.
À vérifier.
Et, dût ma contrainte technique, la seule alternative que j'ai (ENT_IGNORE) est déconseillée … Doh.
( EDIT: [Je raconte ma vie]
Pis PHP ne cesse de m'épater dans le mauvais sens et plus j'investigue plus j'suis aberré.
M'enfin … ça n'a pas que du mauvais, ça m'aide à me forcer à faire plus de Python et moins de PHP.
Pour ceux qui continuent à me demander pourquoi je fais encore du PHP je répondrais que les vieilles habitudes ont la vie dure, qu'il faudrait que je transcrive tout mes scripts PHP vers Python, c'est beaucoup de boulot … tellement qu'on préfère souvent la simplicité de continuer les vieilles habitudes et/ou quand on a pas le choix / temps et qu'on a besoin que qu'une appli ou autre soit fonctionnelle dans les temps. Et malheureusement, j'ai encore trop de setup à faire pour que je puisse le faire via Python, mais ça vient ptit à ptit. ☺
)
EDIT 2:
Je pense que le plus simple/efficace serait, comme je l'avais fait une fois sans vraiment avoir étudier la question en profondeur, serait de juste réimplémenter la fonction via str_replace qui lui est apparemment 100% utf-8 safe.
À vérifier.
J'essaie de trouver quelle serait la meilleure utilisation de htmlspecialchars si on ne possède pas encore PHP 5.4 (contraintes techniques).
D'une part, par défaut, si vous passez une chaîne contenant de l'UTF-8 invalide, htmlspecialchars vous retournera une chaîne complètement vide. ("Pratique")
Pour remédier à ça, il vous faut utiliser ENT_IGNORE ou ENT_SUBSTITUTE. ........ MAIS la doc déconseille l'utilisation de ENT_IGNORE pour des raisons de sécurité. ( http://unicode.org/reports/tr36/#Deletion_of_Noncharacters )
(Source: http://stackoverflow.com/q/11088953/1524913 )
Seulement voilà, ENT_SUBSTITUE est uniquement disponible à partir de PHP 5.4.0. (Donc je fais quoi… ?)
Notez égaaaaaaalement qu'il est impossible de spécifier les paramètres par défaut de htmlspecialchars et qu'il vaudrait mieux donc que vous créez votre propre wrapper.
Puis j'ai également trouvé cette perle … jugez par vous-même. ._."
"Error handling in htmlspecialchars before PHP 5.4 was … uhm, let’s call it “unintuitive”:
If you passed a string containing an “invalid code unit sequence” (which is Unicode slang for “not encoded correctly”) htmlspecialchars would return an empty string. Well, okay, so far so good. The funny thing was that it additionally would throw an error, but only if error display was disabled. So it would only error if errors are hidden. Nice, innit?"
(Source: http://nikic.github.io/2012/01/28/htmlspecialchars-improvements-in-PHP-5-4.html)
Cette page-ci n'est pas mal non plus: http://stackoverflow.com/q/13745353/1524913
D'une part, par défaut, si vous passez une chaîne contenant de l'UTF-8 invalide, htmlspecialchars vous retournera une chaîne complètement vide. ("Pratique")
Pour remédier à ça, il vous faut utiliser ENT_IGNORE ou ENT_SUBSTITUTE. ........ MAIS la doc déconseille l'utilisation de ENT_IGNORE pour des raisons de sécurité. ( http://unicode.org/reports/tr36/#Deletion_of_Noncharacters )
(Source: http://stackoverflow.com/q/11088953/1524913 )
Seulement voilà, ENT_SUBSTITUE est uniquement disponible à partir de PHP 5.4.0. (Donc je fais quoi… ?)
Notez égaaaaaaalement qu'il est impossible de spécifier les paramètres par défaut de htmlspecialchars et qu'il vaudrait mieux donc que vous créez votre propre wrapper.
Puis j'ai également trouvé cette perle … jugez par vous-même. ._."
"Error handling in htmlspecialchars before PHP 5.4 was … uhm, let’s call it “unintuitive”:
If you passed a string containing an “invalid code unit sequence” (which is Unicode slang for “not encoded correctly”) htmlspecialchars would return an empty string. Well, okay, so far so good. The funny thing was that it additionally would throw an error, but only if error display was disabled. So it would only error if errors are hidden. Nice, innit?"
(Source: http://nikic.github.io/2012/01/28/htmlspecialchars-improvements-in-PHP-5-4.html)
Cette page-ci n'est pas mal non plus: http://stackoverflow.com/q/13745353/1524913
Petite mise à jour de PickyPaste.
La version indev (le lien que je viens de passer), renvoie le lien vers la version indev, c'est mieux.
À la proposition de Bronco, j'ai rajouté un chtit lien "Répondre via PickyPaste" si l'utilisateur a spécifié son adresse email.
Voilà, c'tout.
La version indev (le lien que je viens de passer), renvoie le lien vers la version indev, c'est mieux.
À la proposition de Bronco, j'ai rajouté un chtit lien "Répondre via PickyPaste" si l'utilisateur a spécifié son adresse email.
Voilà, c'tout.
Un petit Minecraft codé en 500 lignes Python.
Depuis le projet a grossit et contient + de 8000 lignes.
Depuis le projet a grossit et contient + de 8000 lignes.
Ok, so there's no fucking way to sanitize filenames out there?
I've been mainly looking for Python solutions but still it feels like there is none.
I mean, I'm talking about solutions that would be offered by the system itself, so that you don't have to code a sanitizer yourself for each existing os possible.
Doh!
EDIT: This is a nice solution if you don't care both about loosing completely (but reversible) the original filename and readability for humans.
http://stackoverflow.com/a/295150/1524913
I've been mainly looking for Python solutions but still it feels like there is none.
I mean, I'm talking about solutions that would be offered by the system itself, so that you don't have to code a sanitizer yourself for each existing os possible.
Doh!
EDIT: This is a nice solution if you don't care both about loosing completely (but reversible) the original filename and readability for humans.
http://stackoverflow.com/a/295150/1524913
Je trouve que les opérations SQL s’effectuant sur l’ensemble d’une table et qui affecte celle-ci, on devrait être obligé de l’indiquer explicitement et non implicitement comme c’est le cas pour le moment …
Je parle de faire une DELETE ou un UPDATE sans spécifier de clause WHERE (et donc affecter toute la table) par inadvertance.
En effet, l’erreur/l’oubli étant humain, il est beaucoup plus simple de commencer à écrire sa requête puis oublier de spécifier la clause WHERE.
Alors que si on était obligé de spécifier, par exemple, un simple ALL, l'erreur se produirait bien moins souvent et l'oubli ne ferait rien de critique.
C'est peu contraignant et ça sauverait des vies.
Je trouve que c'est vraiment un cas de bad design. Ça serait facile à implémenter en plus.
Je parle de faire une DELETE ou un UPDATE sans spécifier de clause WHERE (et donc affecter toute la table) par inadvertance.
En effet, l’erreur/l’oubli étant humain, il est beaucoup plus simple de commencer à écrire sa requête puis oublier de spécifier la clause WHERE.
Alors que si on était obligé de spécifier, par exemple, un simple ALL, l'erreur se produirait bien moins souvent et l'oubli ne ferait rien de critique.
C'est peu contraignant et ça sauverait des vies.
Je trouve que c'est vraiment un cas de bad design. Ça serait facile à implémenter en plus.
Tiens, … fonctionnalité intéressante.
Permet de scan du code PHP et le décomposer.
[Caca PHP, oui je sais …]
Permet de scan du code PHP et le décomposer.
[Caca PHP, oui je sais …]
C'est sérieux en plus ._.'
via eijebong
via eijebong
Bouh, c'est mal !
" Hello,
Just noticed that the default HTML errors (like 404 Not Found) are:
1) Not using HTML5 yet.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
2) Don't indicate their encoding, which raises a message in the Fiefox console:
" The character encoding of the HTML document was not declared. The document will render with garbled text in some browser configurations if the document contains characters from outside the US-ASCII range. The character encoding of the page must be declared in the document or in the transfer protocol. "
Cordially. "
" Hello,
Just noticed that the default HTML errors (like 404 Not Found) are:
1) Not using HTML5 yet.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
2) Don't indicate their encoding, which raises a message in the Fiefox console:
" The character encoding of the HTML document was not declared. The document will render with garbled text in some browser configurations if the document contains characters from outside the US-ASCII range. The character encoding of the page must be declared in the document or in the transfer protocol. "
Cordially. "
Flask ne semble pas supporter la possibilité de retourner des générateurs comme WSGI peut le faire et je ne suis pas sûr qu'ils prévoient que ça soit le cas un jour … ( voir https://github.com/mitsuhiko/flask/pull/684 )
Mais bon perso je trouve ça super sympa de pouvoir yield du contenu lorsqu'on veut dans son code. Un peu comme je pouvais le faire avec cgi ou en PHPouet.
De plus je suis entrain de migrer d'un code pur WSGI à Flask (sous les conseils de Link Mauve si je ne me méprend pas) - pour l'instant j'en suis toujours à l'étape "c'est relou". Pourvu que ça ne dure pas -, du coup c'est plus sympa pour moi de pouvoir conserver cette façon là.
(Note: J'avais également pas envie de devoir spécifier un décorateur @generator pour toutes mes fonctions contenant un yield, j'ai donc décidé de décorer app.route directement (mais ce fut un peu plus compliqué à mettre en place))
from functools import wraps
from flask import Flask, Response, stream_with_context
app = Flask(__name__)
# Decorator to make Flask accept generators
@wraps(app.route)
def route_accept_generators(*args, **kwargs):
route = route_accept_generators.app_route(*args, **kwargs) # Getting our route decorator.
# Decorating it.
@wraps(route)
def decorated(f):
# Make so that the function that will be called return a valid Flask answer in case of returning a generator.
@wraps(f)
def function_accept_generators(*args, **kwargs):
r = f(*args, **kwargs)
if isinstance(r, types.GeneratorType):
# return Response(r, direct_passthrough=True) # Solution proposed here: http://flask.pocoo.org/mailinglist/archive/2010/11/3/using-yield/#478b0c1829b5263700da1db7d2d22c79
return Response(stream_with_context(r)) # Solution found here: http://stackoverflow.com/q/13386681/1524913
return r
return route(function_accept_generators)
return decorated
# Store the function so that it doesn't make an infinite recursion call
# Because accessing from app.route rather than directly)
# And storing it in itself instead of creating another standalone variable
route_accept_generators.app_route = app.route
app.route = route_accept_generators
Mais bon perso je trouve ça super sympa de pouvoir yield du contenu lorsqu'on veut dans son code. Un peu comme je pouvais le faire avec cgi ou en PHPouet.
De plus je suis entrain de migrer d'un code pur WSGI à Flask (sous les conseils de Link Mauve si je ne me méprend pas) - pour l'instant j'en suis toujours à l'étape "c'est relou". Pourvu que ça ne dure pas -, du coup c'est plus sympa pour moi de pouvoir conserver cette façon là.
(Note: J'avais également pas envie de devoir spécifier un décorateur @generator pour toutes mes fonctions contenant un yield, j'ai donc décidé de décorer app.route directement (mais ce fut un peu plus compliqué à mettre en place))
from functools import wraps
from flask import Flask, Response, stream_with_context
app = Flask(__name__)
# Decorator to make Flask accept generators
@wraps(app.route)
def route_accept_generators(*args, **kwargs):
route = route_accept_generators.app_route(*args, **kwargs) # Getting our route decorator.
# Decorating it.
@wraps(route)
def decorated(f):
# Make so that the function that will be called return a valid Flask answer in case of returning a generator.
@wraps(f)
def function_accept_generators(*args, **kwargs):
r = f(*args, **kwargs)
if isinstance(r, types.GeneratorType):
# return Response(r, direct_passthrough=True) # Solution proposed here: http://flask.pocoo.org/mailinglist/archive/2010/11/3/using-yield/#478b0c1829b5263700da1db7d2d22c79
return Response(stream_with_context(r)) # Solution found here: http://stackoverflow.com/q/13386681/1524913
return r
return route(function_accept_generators)
return decorated
# Store the function so that it doesn't make an infinite recursion call
# Because accessing from app.route rather than directly)
# And storing it in itself instead of creating another standalone variable
route_accept_generators.app_route = app.route
app.route = route_accept_generators
Intéressant !
Ne vous faites pas avoir !
Ne vous faites pas avoir !
x))))
Quelques trucs avancés Python.
Savoir ça pourrait bien vous sauvez quelques heures de votre vie.
"For custom classes, implicit invocations of special methods are only guaranteed to work correctly if defined on an object’s type, not in the object’s instance dictionary." → You cannot modify magic method directly from an instance, for instance, doing that wont work:
>>> class C:
... pass
...
>>> c = C()
>>> c.__len__ = lambda: 5
>>> len(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'C' has no len()
"In addition to bypassing any instance attributes in the interest of correctness, implicit special method lookup generally also bypasses the __getattribute__() method even of the object’s metaclass:" → When a magic method is used and not called explicitely, then all special methods like __getattribute__ are also bypassed.
For instance:
>>> class Meta(type):
... def __getattribute__(*args):
... print("Metaclass getattribute invoked")
... return type.__getattribute__(*args)
...
>>> class C(object, metaclass=Meta):
... def __len__(self):
... return 10
... def __getattribute__(*args):
... print("Class getattribute invoked")
... return object.__getattribute__(*args)
...
>>> c = C()
>>> c.__len__() # Explicit lookup via instance
Class getattribute invoked
10
>>> type(c).__len__(c) # Explicit lookup via type
Metaclass getattribute invoked
10
>>> len(c) # Implicit lookup
10
Savoir ça pourrait bien vous sauvez quelques heures de votre vie.
"For custom classes, implicit invocations of special methods are only guaranteed to work correctly if defined on an object’s type, not in the object’s instance dictionary." → You cannot modify magic method directly from an instance, for instance, doing that wont work:
>>> class C:
... pass
...
>>> c = C()
>>> c.__len__ = lambda: 5
>>> len(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'C' has no len()
"In addition to bypassing any instance attributes in the interest of correctness, implicit special method lookup generally also bypasses the __getattribute__() method even of the object’s metaclass:" → When a magic method is used and not called explicitely, then all special methods like __getattribute__ are also bypassed.
For instance:
>>> class Meta(type):
... def __getattribute__(*args):
... print("Metaclass getattribute invoked")
... return type.__getattribute__(*args)
...
>>> class C(object, metaclass=Meta):
... def __len__(self):
... return 10
... def __getattribute__(*args):
... print("Class getattribute invoked")
... return object.__getattribute__(*args)
...
>>> c = C()
>>> c.__len__() # Explicit lookup via instance
Class getattribute invoked
10
>>> type(c).__len__(c) # Explicit lookup via type
Metaclass getattribute invoked
10
>>> len(c) # Implicit lookup
10
Infos intéressantes pour l'utilisation d'sqlite3 avec Python.
Je garde ça sous la main.
EDIT:
" > - Are there any peculiarities with using curs.executemany(...) vs. multiple
> curs.execute(...) ? I read a notice, sqlite3 does internally some caching,
> hence both should be similarly fast, but in my case executemany(...) is
> quite a bit faster
How many times are you calling execute vs a single executemany? The
python call overhead will add up for thousands of calls.
The relevant source code is here if you're interested:
http://svn.python.org/projects/python/trunk/Modules/_sqlite/cursor.c
> Further, I am not quite sure about the standard usage of the cursor object
> and also the proper commiting the transactions and closing the connection.
Standard usage is here:
http://docs.python.org/lib/module-sqlite3.html
If the database supports transactions then cursors automatically use
transactions. Your changes only get committed when you call .commit().
Otherwise your changes are lost.
In the specific case of sqllite, some statements (like CREATE TABLE,
ALTER TABLE, etc) also cause a commit. This is probably where your
confusion comes from. Since this isn't part of the python DB API spec
(http://www.python.org/dev/peps/pep-0249/) I wouldn't rely on it.
Otherwise you will have problems with other databases.
Also, in your specific case you're using an 'in memory' sqllite db. So
there are less concerns with losing data between db sessions, etc. But
with most databases (on disk, running across the network on a server)
this becomes important.
> Should one create a cursor of a connection and call the execute ... methods
> of the cursor -
> or is it better to call the shortcut execute etc. methods of the Connection
> object directly (as suggested in the docs:
> http://docs.python.org/lib/node351.html (or are there specific use cases for
> both approaches)?
I suggest that you use the standard cursor methods instead, so you can
run your code against non-sqllite databases. The performance etc
should be the same as using the direct method. Like the page says,
it's main benefit is consiseness.
>
> When the transactions should be commited? (creating, altering a table, or
> also selecting the results ?)
> There seem to be some implicit handling of the transactions (
> http://docs.python.org/lib/sqlite3-Controlling-Transactions.html#sqlite3-Controlling-Transactions
> ); hence I am not sure about the standard usage of these methods; the same
> is true of connection.close() - or are these calls eventually unnecessary?
As a general rule, always use .commit() and .close(). Otherwise:
- No .commit() - you will lose db changes since the last commit or
"non-DML, non-query statement" (in the case of sqllite)
- No .close() - Your database connection will only close when your db
objects are garbage collected.
> conn_tags_DB = sqlite3.connect(':memory:')
> curs = self.conn_tags_DB.cursor()
> curs.execute('CREATE TABLE IF NOT EXISTS "%s" ("%s", UNIQUE("%s"))' %
> (self.text_name, index_col_name, index_col_name))
> curs.execute(u'INSERT OR REPLACE INTO "%s"("%s") VALUES (?)' %
> (self.text_name, index_col_name), (0,))
> for new_col in act_db_columns[1:]: # adds the needed columns (except of the
> first one: index_col_name)
> curs.execute('ALTER TABLE "%s" ADD "%s" TEXT' % (self.text_name,
> new_col))
> curs.executemany('INSERT OR REPLACE INTO "%s" VALUES (%s)' %
> (self.text_name, question_marks), tags_seq)
> self.conn_tags_DB.commit()
>
> Are there maybe any comments or hints on a more elegant/efficient solution?
>
I think that dynamically creating schema (tables, based on text file
structure is a bad idea. A few reasons:
- This forces you to dynamically generate all your queries dynamically
- Not all strings are valid table/column names
- This forces the app to run as database administrator (maybe not
important for sqllite, but definitely an issue if you change to
another dbm).
- Potentially huge stability/security problems - text files can
potentially break system tables, overwrite users, etc, etc.
You're violating several rules on db design/usage.
I strongly recommend that you use a better database logic. ie, create
tables and records in advance (setup script, as db admin user if
applicable), then only use delete/insert/update/select statements (as
restricted user, if applicable).
If this is too much trouble, then I suggest storing your database in
regular Python structures instead, and use pickle/yaml/etc to write to
disk. Your current version uses a 'in memory' database, so the end
result is the same. You'll get a large performance boost also.
> Now, what's the usual way to access the database? Is it
> possible/wise/standard ... to leave the connection open for the subsequent
> queries during the whole run of the app; could even the cursor eventually be
> present as a class method, or should it rather be created repeatedly with
> each call? (After populating, the db shouldn't be modified, but only read.)
It depends. If your app is simple, single threaded, then a single
connection (global or passed through args) should be fine. Only use
multiple cursors if you need them (multiple threads, multiple
databases, multiple transaction/db isolation levels, etc).
David.
"
Je garde ça sous la main.
EDIT:
" > - Are there any peculiarities with using curs.executemany(...) vs. multiple
> curs.execute(...) ? I read a notice, sqlite3 does internally some caching,
> hence both should be similarly fast, but in my case executemany(...) is
> quite a bit faster
How many times are you calling execute vs a single executemany? The
python call overhead will add up for thousands of calls.
The relevant source code is here if you're interested:
http://svn.python.org/projects/python/trunk/Modules/_sqlite/cursor.c
> Further, I am not quite sure about the standard usage of the cursor object
> and also the proper commiting the transactions and closing the connection.
Standard usage is here:
http://docs.python.org/lib/module-sqlite3.html
If the database supports transactions then cursors automatically use
transactions. Your changes only get committed when you call .commit().
Otherwise your changes are lost.
In the specific case of sqllite, some statements (like CREATE TABLE,
ALTER TABLE, etc) also cause a commit. This is probably where your
confusion comes from. Since this isn't part of the python DB API spec
(http://www.python.org/dev/peps/pep-0249/) I wouldn't rely on it.
Otherwise you will have problems with other databases.
Also, in your specific case you're using an 'in memory' sqllite db. So
there are less concerns with losing data between db sessions, etc. But
with most databases (on disk, running across the network on a server)
this becomes important.
> Should one create a cursor of a connection and call the execute ... methods
> of the cursor -
> or is it better to call the shortcut execute etc. methods of the Connection
> object directly (as suggested in the docs:
> http://docs.python.org/lib/node351.html (or are there specific use cases for
> both approaches)?
I suggest that you use the standard cursor methods instead, so you can
run your code against non-sqllite databases. The performance etc
should be the same as using the direct method. Like the page says,
it's main benefit is consiseness.
>
> When the transactions should be commited? (creating, altering a table, or
> also selecting the results ?)
> There seem to be some implicit handling of the transactions (
> http://docs.python.org/lib/sqlite3-Controlling-Transactions.html#sqlite3-Controlling-Transactions
> ); hence I am not sure about the standard usage of these methods; the same
> is true of connection.close() - or are these calls eventually unnecessary?
As a general rule, always use .commit() and .close(). Otherwise:
- No .commit() - you will lose db changes since the last commit or
"non-DML, non-query statement" (in the case of sqllite)
- No .close() - Your database connection will only close when your db
objects are garbage collected.
> conn_tags_DB = sqlite3.connect(':memory:')
> curs = self.conn_tags_DB.cursor()
> curs.execute('CREATE TABLE IF NOT EXISTS "%s" ("%s", UNIQUE("%s"))' %
> (self.text_name, index_col_name, index_col_name))
> curs.execute(u'INSERT OR REPLACE INTO "%s"("%s") VALUES (?)' %
> (self.text_name, index_col_name), (0,))
> for new_col in act_db_columns[1:]: # adds the needed columns (except of the
> first one: index_col_name)
> curs.execute('ALTER TABLE "%s" ADD "%s" TEXT' % (self.text_name,
> new_col))
> curs.executemany('INSERT OR REPLACE INTO "%s" VALUES (%s)' %
> (self.text_name, question_marks), tags_seq)
> self.conn_tags_DB.commit()
>
> Are there maybe any comments or hints on a more elegant/efficient solution?
>
I think that dynamically creating schema (tables, based on text file
structure is a bad idea. A few reasons:
- This forces you to dynamically generate all your queries dynamically
- Not all strings are valid table/column names
- This forces the app to run as database administrator (maybe not
important for sqllite, but definitely an issue if you change to
another dbm).
- Potentially huge stability/security problems - text files can
potentially break system tables, overwrite users, etc, etc.
You're violating several rules on db design/usage.
I strongly recommend that you use a better database logic. ie, create
tables and records in advance (setup script, as db admin user if
applicable), then only use delete/insert/update/select statements (as
restricted user, if applicable).
If this is too much trouble, then I suggest storing your database in
regular Python structures instead, and use pickle/yaml/etc to write to
disk. Your current version uses a 'in memory' database, so the end
result is the same. You'll get a large performance boost also.
> Now, what's the usual way to access the database? Is it
> possible/wise/standard ... to leave the connection open for the subsequent
> queries during the whole run of the app; could even the cursor eventually be
> present as a class method, or should it rather be created repeatedly with
> each call? (After populating, the db shouldn't be modified, but only read.)
It depends. If your app is simple, single threaded, then a single
connection (global or passed through args) should be fine. Only use
multiple cursors if you need them (multiple threads, multiple
databases, multiple transaction/db isolation levels, etc).
David.
"
J'aime bien ce talk :)
Je l'ai vu il y a longtemps mais je suis retombé dessus récemment ^^
Je l'ai vu il y a longtemps mais je suis retombé dessus récemment ^^
Je sens que je vais oublier ça …
"Python looks up special methods only on the class, ignoring anything defined on the instance."
"Python looks up special methods only on the class, ignoring anything defined on the instance."
Interesdasting
Ça y est, je me sers de mon shaarli pour envoyer des messages aux personnes offlines maintenant …
Désolé buddy j'avais pas vu ton message j'étais en mode veille.
Du coup, si tu (ou d'autres) sont intéressés par un projet Python, n'hésite pas à check :
https://github.com/JeromeJ/Devutopia
http://devutopia.net/
Je préviens que le design est pas encore fait :p
(Et pour la licence on va sûrement passer en CopyLeft)
(Wink, wink, les tags ;) à ta demande expresse :D)
Désolé buddy j'avais pas vu ton message j'étais en mode veille.
Du coup, si tu (ou d'autres) sont intéressés par un projet Python, n'hésite pas à check :
https://github.com/JeromeJ/Devutopia
http://devutopia.net/
Je préviens que le design est pas encore fait :p
(Et pour la licence on va sûrement passer en CopyLeft)
(Wink, wink, les tags ;) à ta demande expresse :D)
Commen j'ai pas moyen de te mailer ou autres, je poste ça ici et ptet qu'ainsi tu verras mon message.
J'ai plus simple que ce que la solution que je t'avais proposé.
À savoir, ça : [k for k in myDict if k in myOtherDict] mais avec des .keys() en plus inutile.
En fait c'était tout con, on peut faire ça :
>>> {"a":22, "b":33, "c":24}.keys() & {"a":33, "b":57, "d":78}
{'a', 'b'}
.keys() renvoit une view qui se comporte comme un set, d'où la possibilité d'utiliser l'opérateur "&" normalement propre aux sets. ( http://www.python.org/dev/peps/pep-3106/ )
Et pas vraiment besoin d'utiliser .keys sur le dico de droite (je pense pas que ça impacte les performances), le "set-like" returner par .keys() sait effectuer l'opération "&" sur un dict (car par défaut quand tu itères un dict, ça itère sur les clés, faut utiliser .items() ou .values() sinon).
(Wink, wink, les tags ;) )
J'ai plus simple que ce que la solution que je t'avais proposé.
À savoir, ça : [k for k in myDict if k in myOtherDict] mais avec des .keys() en plus inutile.
En fait c'était tout con, on peut faire ça :
>>> {"a":22, "b":33, "c":24}.keys() & {"a":33, "b":57, "d":78}
{'a', 'b'}
.keys() renvoit une view qui se comporte comme un set, d'où la possibilité d'utiliser l'opérateur "&" normalement propre aux sets. ( http://www.python.org/dev/peps/pep-3106/ )
Et pas vraiment besoin d'utiliser .keys sur le dico de droite (je pense pas que ça impacte les performances), le "set-like" returner par .keys() sait effectuer l'opération "&" sur un dict (car par défaut quand tu itères un dict, ça itère sur les clés, faut utiliser .items() ou .values() sinon).
(Wink, wink, les tags ;) )
So, what do you think? ;)
(I'd also like to bring those advantages to everybody, not only programmers and nerd ;D aha)
(I'd also like to bring those advantages to everybody, not only programmers and nerd ;D aha)
DO WANT ;D
Je veux coder en Piet !
Je veux coder en Piet !
Hop ! Je garde sous le coude !
Source: http://lehollandaisvolant.net/index.php?d=2013/09/20/22/09/18-quelques-rapides-codes-php-js-ou-html#id5ce348
Source: http://lehollandaisvolant.net/index.php?d=2013/09/20/22/09/18-quelques-rapides-codes-php-js-ou-html#id5ce348
Intéressant. Surtout lorsqu'on sait que 3/4 des flux (chiffre arbitraire) base leur Atom ID sur le permalink. Shaarli lui même fait ça.
J'avais au début penser à une simple info à rajouter dans le lien après l'ancre (avec la clé de déchiffrement) mais je pense qu'on peut mieux faire.
* En effet, voyez-vous, ça induit un problème :
Si j'envoie un lien "Burn After Reading" sur un réseau non fiable, disons par exemple Skype, mais que l'information sur quand il expire serait elle-même contenue dans l'URL.
Alors, le méchant réseau (ça pourrait très bien être chez vous, à votre boulot, etc. = tout ce qui n'est pas chiffré bout-à-bout) pourrait éventuellement récupérer cette date d'expiration et tenter de l'ouvrir juste avant expiration.
De cette manière si vous avez oublié de l'ouvrir, il peut aisément savoir le moment le plus propice pour l'ouvrir sans risquer de se faire chopper.
En effet il est très peu probable que vous parveniez à l'ouvrir entre le moment où il l'a ouvert et le moment où il a expiré, tout au plus, cela vous laisserait seulement avec un doute qu'il se peut qu'il y ait eu un lag ou que les horloges entre vous et le serveur soient un peu décalées mais qu'au final, dans tous les cas, vous êtes peut-être arrivé un peu trop tard (Fin bref ça reste quand même extrême).
* SOLUTION:
La solution serait, je pense, et afin de ne pas être obligé de garder la métadonnée (quand ce paste était censé expiré) même après suppression du contenu des pastes expiré (pour clean up) d'avoir une clée privée côté serveur et d'avoir l'information de quand le paste devait expiré chiffré dans l'URL du paste et envoyé au serveur lors de la tentative de récupération du paste. Alors, si le serveur ne peut pas servir ce paste, il déchiffre l'information stockée dans l'URL (seul lui le peut, car elle aura été chiffré par sa clé publique) et il affichera l'information.
De cette manière on garde la fonctionnalité sans donner un moyen facile pour un réseau espion d'exploiter une faille potentielle.
(Seule faiblesse que je vois c'est que la clé privée privée du serveur est unique, y aurait-il moyen de, plutôt, la lier à l'id du paste ?
Genre peut-on créer une paire de clé à partir de "salt du serveur (privé, unique) + id du past" qui servirait à chiffrer l'info de façon unique pour chaque paste ?)
* En effet, voyez-vous, ça induit un problème :
Si j'envoie un lien "Burn After Reading" sur un réseau non fiable, disons par exemple Skype, mais que l'information sur quand il expire serait elle-même contenue dans l'URL.
Alors, le méchant réseau (ça pourrait très bien être chez vous, à votre boulot, etc. = tout ce qui n'est pas chiffré bout-à-bout) pourrait éventuellement récupérer cette date d'expiration et tenter de l'ouvrir juste avant expiration.
De cette manière si vous avez oublié de l'ouvrir, il peut aisément savoir le moment le plus propice pour l'ouvrir sans risquer de se faire chopper.
En effet il est très peu probable que vous parveniez à l'ouvrir entre le moment où il l'a ouvert et le moment où il a expiré, tout au plus, cela vous laisserait seulement avec un doute qu'il se peut qu'il y ait eu un lag ou que les horloges entre vous et le serveur soient un peu décalées mais qu'au final, dans tous les cas, vous êtes peut-être arrivé un peu trop tard (Fin bref ça reste quand même extrême).
* SOLUTION:
La solution serait, je pense, et afin de ne pas être obligé de garder la métadonnée (quand ce paste était censé expiré) même après suppression du contenu des pastes expiré (pour clean up) d'avoir une clée privée côté serveur et d'avoir l'information de quand le paste devait expiré chiffré dans l'URL du paste et envoyé au serveur lors de la tentative de récupération du paste. Alors, si le serveur ne peut pas servir ce paste, il déchiffre l'information stockée dans l'URL (seul lui le peut, car elle aura été chiffré par sa clé publique) et il affichera l'information.
De cette manière on garde la fonctionnalité sans donner un moyen facile pour un réseau espion d'exploiter une faille potentielle.
(Seule faiblesse que je vois c'est que la clé privée privée du serveur est unique, y aurait-il moyen de, plutôt, la lier à l'id du paste ?
Genre peut-on créer une paire de clé à partir de "salt du serveur (privé, unique) + id du past" qui servirait à chiffrer l'info de façon unique pour chaque paste ?)
Lolilol PHP !
Ah tiens bizarre … Chez moi ça s'exécute ! T'as essayé de me hacker ? :p lol
Bizarre, bizarre. Tu as quelle version de PHP ? Un gestionnaire d'erreur personnalisé ?
Moi j'ai 5.5 …
EDIT: À moins que là tu l'aies fait sur une donnée sanitized ?
EDIT: Apparemment Bronco aurait un ptit plugin en local qui le protège :p ahaha
Bizarre, bizarre. Tu as quelle version de PHP ? Un gestionnaire d'erreur personnalisé ?
Moi j'ai 5.5 …
EDIT: À moins que là tu l'aies fait sur une donnée sanitized ?
EDIT: Apparemment Bronco aurait un ptit plugin en local qui le protège :p ahaha
Allez ! On continue dans notre série "PHP c'est vraiment n'importe quoi !".
#poop, une faille XSS built-in. Une !
Afficher les erreurs en prod, c'est mal ? Non, c'est bien pire que ça ! C'est exposer son site à des failles XSS. Enjoy cette merde.
Pfff
https://bugs.php.net/bug.php?id=55139
Et évidemment, le plus beau c'est qu'ils ne veulent pas réparer ça, c'est pas un bug selon eux.
Si tu affiches les erreurs, alors tu renonces à la sécurité, selon eux.
(Ça leur fendrait trop le cul d'ajouter un htmlspeacialchars ? Genre …)
Bon, ok, on peut log les erreurs même en dev, mais de là à être obligé (faut-il encore le savoir que c'est dangereux à ce point)…
Même en dev, je pourrais extraire des données utilisateur d'un site externe et me faire piéger par un beau script JavaScript.
Bande de cons. -.-
#poop, une faille XSS built-in. Une !
Afficher les erreurs en prod, c'est mal ? Non, c'est bien pire que ça ! C'est exposer son site à des failles XSS. Enjoy cette merde.
Pfff
https://bugs.php.net/bug.php?id=55139
Et évidemment, le plus beau c'est qu'ils ne veulent pas réparer ça, c'est pas un bug selon eux.
Si tu affiches les erreurs, alors tu renonces à la sécurité, selon eux.
(Ça leur fendrait trop le cul d'ajouter un htmlspeacialchars ? Genre …)
Bon, ok, on peut log les erreurs même en dev, mais de là à être obligé (faut-il encore le savoir que c'est dangereux à ce point)…
Même en dev, je pourrais extraire des données utilisateur d'un site externe et me faire piéger par un beau script JavaScript.
Bande de cons. -.-
Au delà de la thématique de WSGI et, d'ici, l'introduction de WSGI Lite, il y a de chouettes information pour ceux, qui comme moi ignorait ces choses là, dans cet article.
Il parle notamment de The Game Theory, il évoque l'expression bikeshedding et le point de Schelling. Je vous invite à lire l'article et/ou aller sur Wikipédia pour vous renseigner sur ces termes que j'ai personnellement trouvés enrichissants.
"something to collaborate on, instead of something to compete over."
Il parle notamment de The Game Theory, il évoque l'expression bikeshedding et le point de Schelling. Je vous invite à lire l'article et/ou aller sur Wikipédia pour vous renseigner sur ces termes que j'ai personnellement trouvés enrichissants.
"something to collaborate on, instead of something to compete over."
Ce n'est pas où je veux en venir mais, c'est de ma faute, j'ai volontairement peu dit dans mon message initiale pour voir si des gens seraient intéressés par l'idée dans un premier temps :) puis j'ai discuté avec eux.
Mon cher ami,
Le Web le sera. Il se doit de l'être, de franchir le cap.
Tu n'as hélas sûrement pas vu ces _success stories_ similaires mais pas aussi ambitieuses. Il y a beaucoup d'espoir.
Ça pourrait changer le monde.
Le Web passera par là, avec ou sans moi, il n'a plus le choix.
Alors, tâchons juste d'aider son accomplissement comme il se doit, faisons en sorte que ça soit beau, et ooh ça le sera.
Merci pour les liens. (J'viens de finir de re-re-regarder Cyrano de Bergerac - cela explique peut-être ma plume)
Le Web le sera. Il se doit de l'être, de franchir le cap.
Tu n'as hélas sûrement pas vu ces _success stories_ similaires mais pas aussi ambitieuses. Il y a beaucoup d'espoir.
Ça pourrait changer le monde.
Le Web passera par là, avec ou sans moi, il n'a plus le choix.
Alors, tâchons juste d'aider son accomplissement comme il se doit, faisons en sorte que ça soit beau, et ooh ça le sera.
Merci pour les liens. (J'viens de finir de re-re-regarder Cyrano de Bergerac - cela explique peut-être ma plume)
Mais ils se foutent de la gueule du monde ou quoi ? Des décisions comme ça, ça me fait vraiment vraiment peur :(
J'peux plus juste désactiver l'anti-clic droit (et on peut uniquement désactiver tout le javascript via la console et si on a au moins la version 24, perso j'ai l'a 23 et il me dit que je suis à jour), pourquoi est-ce que ces options de bases ne sont plus disponibles à tout le monde ? C'est vrai quoi merde ! Une fonctionnalité aussi nulle, chiante et stupide ne devrait même pas exister.
(EDIT: on peut faire ça pour désactiver le JS manuellement dans Firefox 23 http://www.computertechtips.net/32/re-enable-firefoxs-aboutconfig-warning-message/)
Où est-ce qu'on se plaint ?
Faut être nombreux à se plaindre, sinon ils vont laisser passer ça … raaaah!
J'peux plus juste désactiver l'anti-clic droit (et on peut uniquement désactiver tout le javascript via la console et si on a au moins la version 24, perso j'ai l'a 23 et il me dit que je suis à jour), pourquoi est-ce que ces options de bases ne sont plus disponibles à tout le monde ? C'est vrai quoi merde ! Une fonctionnalité aussi nulle, chiante et stupide ne devrait même pas exister.
(EDIT: on peut faire ça pour désactiver le JS manuellement dans Firefox 23 http://www.computertechtips.net/32/re-enable-firefoxs-aboutconfig-warning-message/)
Où est-ce qu'on se plaint ?
Faut être nombreux à se plaindre, sinon ils vont laisser passer ça … raaaah!
Personnes intéressées pour rendre les avantages des systèmes décentralisés en informatique accessibles à tout le monde ? :D
Anyone interested to give to everyone the advantages of decentralized systems (especially in the programming world, for instance like git, …)?
Contact-me ^-^
Anyone interested to give to everyone the advantages of decentralized systems (especially in the programming world, for instance like git, …)?
Contact-me ^-^
Mais c'est génial :DDDD
Je me demandais pourquoi mon tableau ne voulait pas remplir l'espace qui lui était réservé et ce malgré le fait que j'ai bien préciser que sa hauteur soit de 100% à lui et tous ses parents.
Ce que j'ignorais c'est que dans ce cas-ci, vu que je ne voulais pas qu'il remplisse un conteneur mais bien body lui même (c'est son conteneur), je devais alors également préciser que body a une taille de 100% AINSI que la balise html. Et ça je l'ignorais. Et ça sauve ma journée. Génial.
Je me demandais pourquoi mon tableau ne voulait pas remplir l'espace qui lui était réservé et ce malgré le fait que j'ai bien préciser que sa hauteur soit de 100% à lui et tous ses parents.
Ce que j'ignorais c'est que dans ce cas-ci, vu que je ne voulais pas qu'il remplisse un conteneur mais bien body lui même (c'est son conteneur), je devais alors également préciser que body a une taille de 100% AINSI que la balise html. Et ça je l'ignorais. Et ça sauve ma journée. Génial.
Plein de chouettes conseils ☺
Notamment, le debug mode pour les REGEX que j'ignorais. Really neat. (J'espère ne pas l'oublier celui là :p)
Dommage que la question soit fermées, certaines réponses auraient, je trouve, méritées des commentaires ou éditions.
EDIT: Woah, y a carrément 7 pages Oo
Je n'avais jamais vu ça, c'est excellent : http://stackoverflow.com/a/4602518/1524913
>>> first,second,*rest = (1,2,3,4,5,6,7,8)
>>> first
1
>>> second
2
>>> rest
[3, 4, 5, 6, 7, 8]
Et
>>> first,*rest,last = (1,2,3,4,5,6,7,8)
>>> first
1
>>> rest
[2, 3, 4, 5, 6, 7]
>>> last
8
Notamment, le debug mode pour les REGEX que j'ignorais. Really neat. (J'espère ne pas l'oublier celui là :p)
Dommage que la question soit fermées, certaines réponses auraient, je trouve, méritées des commentaires ou éditions.
EDIT: Woah, y a carrément 7 pages Oo
Je n'avais jamais vu ça, c'est excellent : http://stackoverflow.com/a/4602518/1524913
>>> first,second,*rest = (1,2,3,4,5,6,7,8)
>>> first
1
>>> second
2
>>> rest
[3, 4, 5, 6, 7, 8]
Et
>>> first,*rest,last = (1,2,3,4,5,6,7,8)
>>> first
1
>>> rest
[2, 3, 4, 5, 6, 7]
>>> last
8
Lors d'une conversation avec un amis, on s'est fait la remarque qu'il n'était toujours pas évident (et parfois pas possible du tout) de jouer ses propres musiques dans un jeu vidéo.
J'ai alors rétorquer que, si possible, il suffisait de désactiver la musique du jeu et laisser tourner VLC en fond.
Problème : Parfois, il n'est pas toujours le bienvenu d'avoir la musique qui tourne tous le temps, lors d'une cinématique par exemple.
Du coup, ça serait sympa une API universelle (ou au moins une convention d'échanges d'informations) genre que le jeu ou n'importe quelle autre appli censée contrôler 'à distance' (avec ou sans votre intervention manuelle) votre lecteur de musique enverrait des événements (à la manière de JavaScript ou l'ActionScript) qu'une autre appli pourrait "écouter" et qu'on pourrait programmer à répondre de façon différente en fonction de l’événement lu (genre on pourrait même juste diminuer le son automatiquement :p etc)
Et pourquoi pas, côté jeu, rajouter des raccourcis claviers pour envoyer des événements à l'environnement, il pourrait y avoir plusieurs applis écoutant et réagissant différemment etc.
Un peu à la manière de Dwarf Fortress qui écrit bcp de choses dans ces logs et dont certains programmes (genre SoundSense) s'en servent pour réagir en fonction (par exemple jouer un son correspondant à l'action) (même si je trouve que le principe est un peu différent, n'est-ce pas un peu plus lourd si une app externe doit parser les logs elle même (ceci dit ça peut permettre d'apporter plus d'infos/précisions quand voulu/nécessaire :)) Ce que je peux regretter pour le coup c'est que ça ne soit pas plus répandu / ouvert et user friendly.
J'ai alors rétorquer que, si possible, il suffisait de désactiver la musique du jeu et laisser tourner VLC en fond.
Problème : Parfois, il n'est pas toujours le bienvenu d'avoir la musique qui tourne tous le temps, lors d'une cinématique par exemple.
Du coup, ça serait sympa une API universelle (ou au moins une convention d'échanges d'informations) genre que le jeu ou n'importe quelle autre appli censée contrôler 'à distance' (avec ou sans votre intervention manuelle) votre lecteur de musique enverrait des événements (à la manière de JavaScript ou l'ActionScript) qu'une autre appli pourrait "écouter" et qu'on pourrait programmer à répondre de façon différente en fonction de l’événement lu (genre on pourrait même juste diminuer le son automatiquement :p etc)
Et pourquoi pas, côté jeu, rajouter des raccourcis claviers pour envoyer des événements à l'environnement, il pourrait y avoir plusieurs applis écoutant et réagissant différemment etc.
Un peu à la manière de Dwarf Fortress qui écrit bcp de choses dans ces logs et dont certains programmes (genre SoundSense) s'en servent pour réagir en fonction (par exemple jouer un son correspondant à l'action) (même si je trouve que le principe est un peu différent, n'est-ce pas un peu plus lourd si une app externe doit parser les logs elle même (ceci dit ça peut permettre d'apporter plus d'infos/précisions quand voulu/nécessaire :)) Ce que je peux regretter pour le coup c'est que ça ne soit pas plus répandu / ouvert et user friendly.
À la question de youpla sur la possibilité d'implémenter une validation par JavaScript pour les pastes de type "Burn After Reading":
" Salut, ce “problème” comme tu l'appelles est normal.
Il serait possible d'implémenter une confirmation par JavaScript mais ça serait fortement déconseillé. En effet, quelqu'un (un bot par exemple) pourrait très bien récupérer le message chiffré et tenter de le déchiffrer lui-même plus tard sans que personne ne remarque que cela a été fait : C'est contre le principe du “Burn after reading”, si quelqu'un l'a ouvert avant toi, tu dois le savoir !
Ceci dit, en y réfléchissant on pourrait implémenter un hack / une solution, qui consisterait à ne pas se rendre directement sur la page permettant de récupérer le message mais sur une page intermédiaire qui, elle, ferait une redirection JavaScript vers la bonne page. Cela permettrait que, si on a JavaScript désactivé (car on utilise NoScript par exemple) cela nous prévienne sans pour autant que cela invalide le paste.
On conserverait ainsi le but premier de “Burn after reading”, si quelqu'un se rend bel et bien sur la page du paste, c'est sûrement grâce au JavaScript (donc on ne risque plus de l'invalider accidentellement) mais si un bot s'y rend manuellement (sur la page donnant le paste, pas l'intermédiaire, celle là on s'en fout que le bot y passe limite), tu le saura.
(De plus, je trouve que de manière générale, à part le fait que ça rajoute une étape (lourde ?) ça permettrait de pouvoir partager des liens ZeroBin même sur les services connu pour aller zieuter la page automatiquement (comme Facebook ou un mauvais service qui s'amuserait à vérifier tout vos liens automatiquement)(sauf si évidemment, ils exécutent le JavaScript et vont voir où il ne devrait pas; c'est rarement le cas donc)) "
" Salut, ce “problème” comme tu l'appelles est normal.
Il serait possible d'implémenter une confirmation par JavaScript mais ça serait fortement déconseillé. En effet, quelqu'un (un bot par exemple) pourrait très bien récupérer le message chiffré et tenter de le déchiffrer lui-même plus tard sans que personne ne remarque que cela a été fait : C'est contre le principe du “Burn after reading”, si quelqu'un l'a ouvert avant toi, tu dois le savoir !
Ceci dit, en y réfléchissant on pourrait implémenter un hack / une solution, qui consisterait à ne pas se rendre directement sur la page permettant de récupérer le message mais sur une page intermédiaire qui, elle, ferait une redirection JavaScript vers la bonne page. Cela permettrait que, si on a JavaScript désactivé (car on utilise NoScript par exemple) cela nous prévienne sans pour autant que cela invalide le paste.
On conserverait ainsi le but premier de “Burn after reading”, si quelqu'un se rend bel et bien sur la page du paste, c'est sûrement grâce au JavaScript (donc on ne risque plus de l'invalider accidentellement) mais si un bot s'y rend manuellement (sur la page donnant le paste, pas l'intermédiaire, celle là on s'en fout que le bot y passe limite), tu le saura.
(De plus, je trouve que de manière générale, à part le fait que ça rajoute une étape (lourde ?) ça permettrait de pouvoir partager des liens ZeroBin même sur les services connu pour aller zieuter la page automatiquement (comme Facebook ou un mauvais service qui s'amuserait à vérifier tout vos liens automatiquement)(sauf si évidemment, ils exécutent le JavaScript et vont voir où il ne devrait pas; c'est rarement le cas donc)) "
Tu sais, à un moment où tu parles de programmation et que tu n'avais pas été capable de faire un Hello World, ça va beaucoup dépendre du langage hein ;)
Si c'était un vieux langage moisi très proche de la machine (ce qu'on appelle un langage bas niveau), ça me semble "normal" que tu aies eu des difficultés.
Tandis que de nos jours, la programmation n'a pas à être difficile: En python un Hello World se résume à ça:
print("Hello World")
J'ai vu pire je dois dire :)
C'est bien simple, un programme python peut être pratiquement compris par n'importe qui juste à la lecture (sans rien connaître du python; juste un peu d'anglais) (ce qu'on appelle un langage haut niveau, proche de la langue parlée).
Quant à installer Ubuntu soit même, je ne sais si tu es néophyte ou non mais ce n'est pas forcément le plus simple. Très personnellement, je ne qualifierais pas ça de compliqué (mais c'est sûrement très relatif) mais il faut aussi prendre en compte le fait que, ça aussi, ça a pas mal évolué (en bien ... puis plus récemment en mal; selon moi).
Moi aussi j'ai galéré à installer Linux moi même au début. Vachement. Alors qu'à un autre moment, plus tard, lorsque c'était devenu plus "user-friendly", c'était alors à la portée de quasi tout le monde ! (Et ça c'était cool !)
+1 en ce qui concerne la vie en communauté même si ce n'est pas toujours le plus simple :) (ça dépend de l'entourage etc)
+1 aussi qu'il ne faut pas faire les choses à la place des autres tandis que, dans l'autre main, les aider à le faire, c'est pas pareil. Non, on a pas forcément à faire toutes ces choses pas-toujours-si-simples seules (ouf !): Il ne reste plus qu'à trouver les bonnes personnes / les bons endroits / les bonnes méthodes d'apprentissage, de recherche.
Pour finir, paradoxalement, non, on ne doit pas tous apprendre tout (même s'il y a des choses plus importantes que les autres qui sont majoritairement délaissées de côté alors qu'elles sont d'une importance capitale / dont internet, la politique et d'autres choses, qu'on ne s'y méprenne pas, gaies), c'est pas vraiment possible, c'est chronophage et nous sommes tous différents, dans nos goûts / nos passions, nos modes de vies, etc. (donc ce n'est pas que l’apanage des mateurs de pornos qui refusent d'apprendre) (Enfin est-ce peut-être d'(auto-)éducation ? Ou simplement de masse / un problème de société)
Et c'est loin d'être un point négatifs: in fine, nous sommes tous riches de quelque chose que d'autres n'ont pas, et, bien fort heureusement pour nous du coup, les êtres humains sont des êtres grégaires: Quoi de plus magnifique que le partage des savoirs / des cultures / des opinions. … Tant qu'on garde l'esprit ouvert et qu'on s'en sert pour évoluer soit-même et s'entraider ☺
On peut pas s'entendre avec tous le monde, non plus, ni espérer que tout le monde change de la façon qu'on espérerait (si encore notre façon de voir les choses est *vraiment* "une bonne chose"). Le mal est exacerbé mais pourtant souvent minoritaire, mais voilà il est beaucoup plus bruyant que le bien qui lui passe souvent inaperçu, il ne se revendique pas ou rarement, il est humble (alors qu'on expose le mal dès qu'il s'est produit, on le vend, il fait la une des journaux et nous relayons "joyeusement", "macabrement", frénétiquement, inconsciemment (car c'est du sensationnalisme) etc.). Donc je te rejoins sur l'espoir.
Tout dépend de notre vision des choses, si nous sommes défaitistes alors on abandonne collectivement avant même d'essayer. À l'opposé, si on parvient à changer sa vision des choses et réussir à voir le positif, même lorsqu'il est minime, s'y accrocher, le maximiser, l'aimer, y contribuer, rayonner, alors les choses peuvent de l'avant.
Nous sommes influencés par notre entourage et donc les autres aussi le sont. Par conséquent, nous influons aussi notre entourage. Si on vit dans un milieu à tendance pessimistes, vous laisserez vous influencé et dicté ce que vous devez pensez et/ou la façon dont vous devez voir les choses, être un pantin ou plutôt vous forger vos propres opinions, voir les choses différemment et, à votre tour, influencé positivement, passivement ou activement, votre entourage (et/ou plutôt parfois/plus souvent surtout ceux ouverts et demandeurs de ces bonnes ondes :) car nombreux sont ceux qui recherchent aussi la "bonne vibe").
Comme d'habitude mes romans sont flous, oups! Suis pas un grand écrivain :)
Bonne journée. Paix et amour.
Si c'était un vieux langage moisi très proche de la machine (ce qu'on appelle un langage bas niveau), ça me semble "normal" que tu aies eu des difficultés.
Tandis que de nos jours, la programmation n'a pas à être difficile: En python un Hello World se résume à ça:
print("Hello World")
J'ai vu pire je dois dire :)
C'est bien simple, un programme python peut être pratiquement compris par n'importe qui juste à la lecture (sans rien connaître du python; juste un peu d'anglais) (ce qu'on appelle un langage haut niveau, proche de la langue parlée).
Quant à installer Ubuntu soit même, je ne sais si tu es néophyte ou non mais ce n'est pas forcément le plus simple. Très personnellement, je ne qualifierais pas ça de compliqué (mais c'est sûrement très relatif) mais il faut aussi prendre en compte le fait que, ça aussi, ça a pas mal évolué (en bien ... puis plus récemment en mal; selon moi).
Moi aussi j'ai galéré à installer Linux moi même au début. Vachement. Alors qu'à un autre moment, plus tard, lorsque c'était devenu plus "user-friendly", c'était alors à la portée de quasi tout le monde ! (Et ça c'était cool !)
+1 en ce qui concerne la vie en communauté même si ce n'est pas toujours le plus simple :) (ça dépend de l'entourage etc)
+1 aussi qu'il ne faut pas faire les choses à la place des autres tandis que, dans l'autre main, les aider à le faire, c'est pas pareil. Non, on a pas forcément à faire toutes ces choses pas-toujours-si-simples seules (ouf !): Il ne reste plus qu'à trouver les bonnes personnes / les bons endroits / les bonnes méthodes d'apprentissage, de recherche.
Pour finir, paradoxalement, non, on ne doit pas tous apprendre tout (même s'il y a des choses plus importantes que les autres qui sont majoritairement délaissées de côté alors qu'elles sont d'une importance capitale / dont internet, la politique et d'autres choses, qu'on ne s'y méprenne pas, gaies), c'est pas vraiment possible, c'est chronophage et nous sommes tous différents, dans nos goûts / nos passions, nos modes de vies, etc. (donc ce n'est pas que l’apanage des mateurs de pornos qui refusent d'apprendre) (Enfin est-ce peut-être d'(auto-)éducation ? Ou simplement de masse / un problème de société)
Et c'est loin d'être un point négatifs: in fine, nous sommes tous riches de quelque chose que d'autres n'ont pas, et, bien fort heureusement pour nous du coup, les êtres humains sont des êtres grégaires: Quoi de plus magnifique que le partage des savoirs / des cultures / des opinions. … Tant qu'on garde l'esprit ouvert et qu'on s'en sert pour évoluer soit-même et s'entraider ☺
On peut pas s'entendre avec tous le monde, non plus, ni espérer que tout le monde change de la façon qu'on espérerait (si encore notre façon de voir les choses est *vraiment* "une bonne chose"). Le mal est exacerbé mais pourtant souvent minoritaire, mais voilà il est beaucoup plus bruyant que le bien qui lui passe souvent inaperçu, il ne se revendique pas ou rarement, il est humble (alors qu'on expose le mal dès qu'il s'est produit, on le vend, il fait la une des journaux et nous relayons "joyeusement", "macabrement", frénétiquement, inconsciemment (car c'est du sensationnalisme) etc.). Donc je te rejoins sur l'espoir.
Tout dépend de notre vision des choses, si nous sommes défaitistes alors on abandonne collectivement avant même d'essayer. À l'opposé, si on parvient à changer sa vision des choses et réussir à voir le positif, même lorsqu'il est minime, s'y accrocher, le maximiser, l'aimer, y contribuer, rayonner, alors les choses peuvent de l'avant.
Nous sommes influencés par notre entourage et donc les autres aussi le sont. Par conséquent, nous influons aussi notre entourage. Si on vit dans un milieu à tendance pessimistes, vous laisserez vous influencé et dicté ce que vous devez pensez et/ou la façon dont vous devez voir les choses, être un pantin ou plutôt vous forger vos propres opinions, voir les choses différemment et, à votre tour, influencé positivement, passivement ou activement, votre entourage (et/ou plutôt parfois/plus souvent surtout ceux ouverts et demandeurs de ces bonnes ondes :) car nombreux sont ceux qui recherchent aussi la "bonne vibe").
Comme d'habitude mes romans sont flous, oups! Suis pas un grand écrivain :)
Bonne journée. Paix et amour.
Je sais que shaarli n'a pas de problème pour le stocker car il stocke tout dans des fichiers il me semble.
Par contre, si mysql est mal configuré (trop souvent le cas), le message se voit tronqué :p
On va donc tester vos agrégateur de flux rss en espérant pour vous (c'est plus mon problème après si le logiciel est mal conçu :/) que ça ne fera que tronquer la fin de mon shaarlien (ou pas du tout si votre agrégateur est bien configuré :)).
Voici donc une phrase, sur la ligne suivante je vais y mettre le caractère maudit et à la ligne suivante je conclurai. Si vous n'avez pas de conclusion, vous savez qu'il y a un problème ;) (la solution est expliquée ici en partie dans mon brouillon très moche sur l'unicode et l'utf-8: http://www.olissea.com/doc/?artId=23 )
😒
Voilà, j'espère que tout s'est bien passé pour vous :D
Bonne journée à vous !
Par contre, si mysql est mal configuré (trop souvent le cas), le message se voit tronqué :p
On va donc tester vos agrégateur de flux rss en espérant pour vous (c'est plus mon problème après si le logiciel est mal conçu :/) que ça ne fera que tronquer la fin de mon shaarlien (ou pas du tout si votre agrégateur est bien configuré :)).
Voici donc une phrase, sur la ligne suivante je vais y mettre le caractère maudit et à la ligne suivante je conclurai. Si vous n'avez pas de conclusion, vous savez qu'il y a un problème ;) (la solution est expliquée ici en partie dans mon brouillon très moche sur l'unicode et l'utf-8: http://www.olissea.com/doc/?artId=23 )
😒
Voilà, j'espère que tout s'est bien passé pour vous :D
Bonne journée à vous !
Ahaha x'D Courage ^^
Je me suis tappé la tête contre le mur pendant plusieurs jours avec l'encodage en PHP et même un peu en Python (surtout le 2 qui me casse les noises :o)
Mon site se convertit en UTF-8, yeay !! :DD
Au fait, j'crois que tu n'utilises pas de BDD genre MySQL toi, mais sachez que, en plus de tous les autres trucs qui font chier en PHP vis-à-vis de l'UTF-8 mal géré nativement, MySQL utilise également un encodage à la con de base pour ces communications :/ donc rien à voir avec la façon dont vous stockez vos chaines dans la BDD. Quand vous les récup, il convertit en ISO quelque chose ce con :o (lol) sauf si vous faites la requête SET NAMES utf-8.
Rappel: Utilisez toujours et partout UTF-8. Les problèmes viennent des autres encodages !! Si vous ne prenez pas la bonne habitude de mettre de l'utf-8 partout, vous "risquez" d'en chier lorsque vous voudrez reconvertir en UTF-8 (car c'est un milliard de fois mieux).
Je me suis tappé la tête contre le mur pendant plusieurs jours avec l'encodage en PHP et même un peu en Python (surtout le 2 qui me casse les noises :o)
Mon site se convertit en UTF-8, yeay !! :DD
Au fait, j'crois que tu n'utilises pas de BDD genre MySQL toi, mais sachez que, en plus de tous les autres trucs qui font chier en PHP vis-à-vis de l'UTF-8 mal géré nativement, MySQL utilise également un encodage à la con de base pour ces communications :/ donc rien à voir avec la façon dont vous stockez vos chaines dans la BDD. Quand vous les récup, il convertit en ISO quelque chose ce con :o (lol) sauf si vous faites la requête SET NAMES utf-8.
Rappel: Utilisez toujours et partout UTF-8. Les problèmes viennent des autres encodages !! Si vous ne prenez pas la bonne habitude de mettre de l'utf-8 partout, vous "risquez" d'en chier lorsque vous voudrez reconvertir en UTF-8 (car c'est un milliard de fois mieux).
Légère modification du snippet pour qu'il demande dynamiquement en quelle config clavier on veut l'activer :
javascript:s=document.createElement('script');s.id='r6109_vkbsgp';s.type='text/javascript';s.src='http://lehollandaisvolant.net/tout/dl/virtual-kb/keyboard.js?'+prompt('Lang?')+',true';document.head.appendChild(s);void(null);
Pour rappel, la liste des dispositions claviers disponibles : albanian, arabic, armenian-e, armenian-w, assamese, azebaijani-cyr, azebaijani-lat, belarusian, bengali, bosnian, bulgarian-ph, burmese, canadian-fr, chinese-bapomofo-ime, chinese-cangjie-ime, czech, danish, dari, devanagari, dingbats, divehi, dutch, dvorak, esperanto, estonian, farsi, faeroese, finnish, french, georgian, german, greek, gujurati, hebrew, hindi, hungarian, icelandic, irish-gaelic, italian, japanese-kana, kazakh, kannada, khmer, korean, kurdish, kyrgyz, latvian, lithuanian, macedonian-cyr, malayalam, maltese48, marathi, misc-symbols, mongolian-cyr, norwegian, pashto, pinyin, polish, polish-prog, portuguese-br, portuguese, punjabi, romanian, russian, serbian, slovak, spanish, swedish, swiss-fr, swiss-de, syriac, tamil, tatar, telugu, thai-kedmanee, thai-pattachote, turkish-f, turkish-q, ukrainian, uk, urdu, urdu-phonetic, us-int, us-std, uzbek-cyr, vietnamese, yiddish
Ça peut être plus pratique que d'en avoir plusieurs si jamais vous switcher régulièrement entre plusieurs dispositions (mais que vous n'êtes pas à domicile et/ou vous n'avez pas accès à la "barre des langues") mais que vous voulez quand même économiser de la place et/ou si vous voulez par exemple vous faire une liste "tel disposition puis une autre puis 'dynamique'".
NOTE à moi même: faudrait que j'héberge un ptit miroir du code :) (je suppose que c'est ok :o)
PS: J'ignorais qu'il existait une disposition de clavier japonaise :o c'est cool !
Perso sous windows, jusqu'à présent, pour écrire les divers kana tel que « ne » (ね) ou « no » (の) par exemple, je devais taper ces n + e (et n + o respectivement) sur un clavier qwerty par défaut.
javascript:s=document.createElement('script');s.id='r6109_vkbsgp';s.type='text/javascript';s.src='http://lehollandaisvolant.net/tout/dl/virtual-kb/keyboard.js?'+prompt('Lang?')+',true';document.head.appendChild(s);void(null);
Pour rappel, la liste des dispositions claviers disponibles : albanian, arabic, armenian-e, armenian-w, assamese, azebaijani-cyr, azebaijani-lat, belarusian, bengali, bosnian, bulgarian-ph, burmese, canadian-fr, chinese-bapomofo-ime, chinese-cangjie-ime, czech, danish, dari, devanagari, dingbats, divehi, dutch, dvorak, esperanto, estonian, farsi, faeroese, finnish, french, georgian, german, greek, gujurati, hebrew, hindi, hungarian, icelandic, irish-gaelic, italian, japanese-kana, kazakh, kannada, khmer, korean, kurdish, kyrgyz, latvian, lithuanian, macedonian-cyr, malayalam, maltese48, marathi, misc-symbols, mongolian-cyr, norwegian, pashto, pinyin, polish, polish-prog, portuguese-br, portuguese, punjabi, romanian, russian, serbian, slovak, spanish, swedish, swiss-fr, swiss-de, syriac, tamil, tatar, telugu, thai-kedmanee, thai-pattachote, turkish-f, turkish-q, ukrainian, uk, urdu, urdu-phonetic, us-int, us-std, uzbek-cyr, vietnamese, yiddish
Ça peut être plus pratique que d'en avoir plusieurs si jamais vous switcher régulièrement entre plusieurs dispositions (mais que vous n'êtes pas à domicile et/ou vous n'avez pas accès à la "barre des langues") mais que vous voulez quand même économiser de la place et/ou si vous voulez par exemple vous faire une liste "tel disposition puis une autre puis 'dynamique'".
NOTE à moi même: faudrait que j'héberge un ptit miroir du code :) (je suppose que c'est ok :o)
PS: J'ignorais qu'il existait une disposition de clavier japonaise :o c'est cool !
Perso sous windows, jusqu'à présent, pour écrire les divers kana tel que « ne » (ね) ou « no » (の) par exemple, je devais taper ces n + e (et n + o respectivement) sur un clavier qwerty par défaut.
Juste génial et WTF la moitié des langages featured dans cette page *___*
Le plus impressionnant c'est quand même ces langages interprèter directement en se déplaçant dans le code.
L'interpréteur lit de gauche à droite (normal), s'il rencontre un "v" il va lire de cette endroit là de haut en bas, s'il rencontre un "<" il va lire de droite à gauche, etc, l'interpréteur suit le chemin qu'on lui trace x) c'est juste "wow".
Le plus impressionnant c'est quand même ces langages interprèter directement en se déplaçant dans le code.
L'interpréteur lit de gauche à droite (normal), s'il rencontre un "v" il va lire de cette endroit là de haut en bas, s'il rencontre un "<" il va lire de droite à gauche, etc, l'interpréteur suit le chemin qu'on lui trace x) c'est juste "wow".
Merci à Timo d'avoir repartagé le lien récemment.
Contrairement à beaucoup d'autres, je trouve que c'est là une très bonne idée (j'utilise toujours le ftp intégré à l'OS lorsque je suis sous linux).
Ceci dit, j'ai un problème à la création de celui-ci : Il dit mon adresse incorrect alors qu'elle ne l'est pas. Boarf.
Donc, pour les autres critiques du genre que c'est un système assez lent … beuh j'ai pas pu tester en fait.
FileZilla fait quelque chose de très mal : J'crois qu'il stocke les mot de passes en clair quelque part :/ En tout cas, il les retient par défaut déjà, c'est mal.
Souvent, quand je dois pas transférer des dossiers entiers, j'utilise le plugin FTP intégré à mon éditeur de texte (Notepad++ ou SublimeText2) ce qui a le gros avantage, d'en plus de pouvoir le faire manuellement, de se faire automatiquement lorsque je sauve mon fichier, hop, il l'upload.
Contrairement à beaucoup d'autres, je trouve que c'est là une très bonne idée (j'utilise toujours le ftp intégré à l'OS lorsque je suis sous linux).
Ceci dit, j'ai un problème à la création de celui-ci : Il dit mon adresse incorrect alors qu'elle ne l'est pas. Boarf.
Donc, pour les autres critiques du genre que c'est un système assez lent … beuh j'ai pas pu tester en fait.
FileZilla fait quelque chose de très mal : J'crois qu'il stocke les mot de passes en clair quelque part :/ En tout cas, il les retient par défaut déjà, c'est mal.
Souvent, quand je dois pas transférer des dossiers entiers, j'utilise le plugin FTP intégré à mon éditeur de texte (Notepad++ ou SublimeText2) ce qui a le gros avantage, d'en plus de pouvoir le faire manuellement, de se faire automatiquement lorsque je sauve mon fichier, hop, il l'upload.
Je trouve que les miniatures dans Shaarli devrait être mise en cache sur le serveur hébergeant ledit Shaarli plutôt que d'être systématiquement récupérée sur Youtube (ou autre) :/
En effet, ne s'agit-il pas là d'un mini-traqueur sûrement involontaire de ta part pour Youtube (ou autre) ? Les visiteurs de shaarli, informent donc, une fois de plus et sans vraiment s'en rendre compte, les informations qu'ils lisent et où ils sont sur le net et ce même sans ouvrir ledit lien vers une vidéo Youtube par exemple.
Suis pas fan du tout :/
EDIT: Apparemment il s'agirait du fait que certains sites sont rapides pour obtenir les thumbnails, d'autres pas. Ceux qui sont lents à obtenir sont mis en cache.
Perso je troque bien le temps pour stocker en cache + l'espace requis pour les thumbnails supplémentaires contre le respect de la vie privée supplémentaire que ça apporte.
Definitely.
EDIT: Success: http://shaarli.fr/index.php?q=les%20miniatures%20dans%20Shaarli
EDIT: Plus de réponses ici: http://shaarli.fr/index.php?q=Shaarli%20et%20ses%20dr%C3%B4les%20de%20miniatures%20?
Perso, je serais pour l'intégration de Respawn avec une ptite case à cochée lorsqu'on rajoute un lien et contre l'utilisation d'un service tiers pour la génération de webshot (sauf via une option ptet).
Par contre, quel liens serait affiché alors ? L'authentique ou la version stockée Respawn ? S'il ne s'agit "que" d'une page web, Respawn peut parfois être plus intéressant, même s'il ne s'adapte pas dynamiquement - de toutes façons les pages sont souvent statiques, au cas où la page disparaîtrait du net. Alors que pour certains types de fichiers volumineux il vaut peut-être mieux donner le lien authentique pour éviter de tuer la bande passante si on a pas un gros site (mais ça serait quand même chouette de pouvoir l'enregistrer au choix via une case à cocher, comme ça si le lien est mort, donner le lien local vaut ptet mieux.
J'sais pas ... à voir. Sûrement une question de juste milieux.
En effet, ne s'agit-il pas là d'un mini-traqueur sûrement involontaire de ta part pour Youtube (ou autre) ? Les visiteurs de shaarli, informent donc, une fois de plus et sans vraiment s'en rendre compte, les informations qu'ils lisent et où ils sont sur le net et ce même sans ouvrir ledit lien vers une vidéo Youtube par exemple.
Suis pas fan du tout :/
EDIT: Apparemment il s'agirait du fait que certains sites sont rapides pour obtenir les thumbnails, d'autres pas. Ceux qui sont lents à obtenir sont mis en cache.
Perso je troque bien le temps pour stocker en cache + l'espace requis pour les thumbnails supplémentaires contre le respect de la vie privée supplémentaire que ça apporte.
Definitely.
EDIT: Success: http://shaarli.fr/index.php?q=les%20miniatures%20dans%20Shaarli
EDIT: Plus de réponses ici: http://shaarli.fr/index.php?q=Shaarli%20et%20ses%20dr%C3%B4les%20de%20miniatures%20?
Perso, je serais pour l'intégration de Respawn avec une ptite case à cochée lorsqu'on rajoute un lien et contre l'utilisation d'un service tiers pour la génération de webshot (sauf via une option ptet).
Par contre, quel liens serait affiché alors ? L'authentique ou la version stockée Respawn ? S'il ne s'agit "que" d'une page web, Respawn peut parfois être plus intéressant, même s'il ne s'adapte pas dynamiquement - de toutes façons les pages sont souvent statiques, au cas où la page disparaîtrait du net. Alors que pour certains types de fichiers volumineux il vaut peut-être mieux donner le lien authentique pour éviter de tuer la bande passante si on a pas un gros site (mais ça serait quand même chouette de pouvoir l'enregistrer au choix via une case à cocher, comme ça si le lien est mort, donner le lien local vaut ptet mieux.
J'sais pas ... à voir. Sûrement une question de juste milieux.
Voilà ma version, j'en suis plutôt satisfait :
As PHP doesn't really have a proper alternative to str.format in Python, I decided to implement my very simple own which as most of the basic functionnalitites of the Python's one.
function format($msg, $vars)
{
$vars = (array)$vars;
$msg = preg_replace_callback('#\{\}#', function($r){
static $i = 0;
return '{'.($i++).'}';
}, $msg);
return str_replace(
array_map(function($k) {
return '{'.$k.'}';
}, array_keys($vars)),
array_values($vars),
$msg
);
}
# Samples:
# Hello foo and bar
echo format('Hello {} and {}.', array('foo', 'bar'));
# Hello Mom
echo format('Hello {}', 'Mom');
# Hello foo, bar and foo
echo format('Hello {}, {1} and {0}', array('foo', 'bar'));
# I'm not a fool nor a bar
echo format('I\'m not a {foo} nor a {}', array('foo' => 'fool', 'bar'));
1. The order doesn't matter,
2. You can omit the name/number if you want it to simply increment (the first {} matched will be transformed into {0}, etc),
3. You can name your parameters,
4. You can mix the three other points.
As PHP doesn't really have a proper alternative to str.format in Python, I decided to implement my very simple own which as most of the basic functionnalitites of the Python's one.
function format($msg, $vars)
{
$vars = (array)$vars;
$msg = preg_replace_callback('#\{\}#', function($r){
static $i = 0;
return '{'.($i++).'}';
}, $msg);
return str_replace(
array_map(function($k) {
return '{'.$k.'}';
}, array_keys($vars)),
array_values($vars),
$msg
);
}
# Samples:
# Hello foo and bar
echo format('Hello {} and {}.', array('foo', 'bar'));
# Hello Mom
echo format('Hello {}', 'Mom');
# Hello foo, bar and foo
echo format('Hello {}, {1} and {0}', array('foo', 'bar'));
# I'm not a fool nor a bar
echo format('I\'m not a {foo} nor a {}', array('foo' => 'fool', 'bar'));
1. The order doesn't matter,
2. You can omit the name/number if you want it to simply increment (the first {} matched will be transformed into {0}, etc),
3. You can name your parameters,
4. You can mix the three other points.
Moi j'y vois surtout, comme tu dis, la consistance entre le travail du dev et celui du designer.
Même si cette personne est là même, le design ne devrait pas faire partie du HTML et vice-versa.
J'ai souvent fait l'erreur et c'est pourquoi elle apparaît encore à beaucoup d'endroit sur mon site :p j'ai trop de code pour tout retaper alors je fais surtout attention à mes nouveaux codes et je retape le reste au fur et à mesure ^.^
J'crois qu'il y a certaines bases de programmation (et/ou webmastering) qui ne sont pas assez bien enseignées (ou alors leur but est mal expliqué, donc ça revient au même, on drop vite ces habitudes lourdes sans en savoir les conséquences et quel était l'intérêt de faire ça en premier lieu). Tout ça principalement je crois car on apprend trop souvent le "tant que ça marche" et on enseigne pas forcément les meilleurs façons de faire, pourquoi, etc (que ça soit pour l'ergonomie, la sécurité, l'inter-portabilité (n'en parlons même pas de celui là, avec la complicité des lobbys), etc)
Même si cette personne est là même, le design ne devrait pas faire partie du HTML et vice-versa.
J'ai souvent fait l'erreur et c'est pourquoi elle apparaît encore à beaucoup d'endroit sur mon site :p j'ai trop de code pour tout retaper alors je fais surtout attention à mes nouveaux codes et je retape le reste au fur et à mesure ^.^
J'crois qu'il y a certaines bases de programmation (et/ou webmastering) qui ne sont pas assez bien enseignées (ou alors leur but est mal expliqué, donc ça revient au même, on drop vite ces habitudes lourdes sans en savoir les conséquences et quel était l'intérêt de faire ça en premier lieu). Tout ça principalement je crois car on apprend trop souvent le "tant que ça marche" et on enseigne pas forcément les meilleurs façons de faire, pourquoi, etc (que ça soit pour l'ergonomie, la sécurité, l'inter-portabilité (n'en parlons même pas de celui là, avec la complicité des lobbys), etc)
Tu aimes peu les médias alternatifs on dirait … Certes tous ne sont pas géniaux, certains sont vaseux, etc.
Mais il y en a bien plus qu'on ne le croit et ce serait un tord de les mettre tous dans le même sac trop vite.
Souvent car ça gène, car c'est trop "marginal", car ça choque trop. Faut pas oublier que c'est irrationnel de refuser certaines infos sur base de ces émotions (je ne dis pas que c'est ton cas, je parle en général) mais beaucoup d'entre nous le font plutôt inconsciemment.
Moi j'dirais plutôt 2 choses, si ça nous dérange, c'est qu'il y a une raison. Et ce n'est pas car c'est complètement off-stream que c'est faux; ni que c'est vrai d'ailleurs ! mais comptez se forger un esprit critique et sa propre opinion en évitant certaines sources d'informations … j'ai des doutes. (Comme j'ai dis tout à l'heure, certains sont vraiment nuls, je ne parle pas d'eux qui ternissent l'image de ceux plus sérieux)
On finit enfin par accepter certaines idées qui ne l'auraient jamais été il y a 10 ans (preuve que nos réflexes sont parfois irrationnels) et nos idées (sur la société, etc) sont encore peu répandues, beaucoup (trop) de gens pensent encore que nous vivons dans le joyeux monde de Mickey, que les gouvernements, banques et lobbies n'ont rien à se reprocher, la crise, c'est de notre faute :/
Mais il y en a bien plus qu'on ne le croit et ce serait un tord de les mettre tous dans le même sac trop vite.
Souvent car ça gène, car c'est trop "marginal", car ça choque trop. Faut pas oublier que c'est irrationnel de refuser certaines infos sur base de ces émotions (je ne dis pas que c'est ton cas, je parle en général) mais beaucoup d'entre nous le font plutôt inconsciemment.
Moi j'dirais plutôt 2 choses, si ça nous dérange, c'est qu'il y a une raison. Et ce n'est pas car c'est complètement off-stream que c'est faux; ni que c'est vrai d'ailleurs ! mais comptez se forger un esprit critique et sa propre opinion en évitant certaines sources d'informations … j'ai des doutes. (Comme j'ai dis tout à l'heure, certains sont vraiment nuls, je ne parle pas d'eux qui ternissent l'image de ceux plus sérieux)
On finit enfin par accepter certaines idées qui ne l'auraient jamais été il y a 10 ans (preuve que nos réflexes sont parfois irrationnels) et nos idées (sur la société, etc) sont encore peu répandues, beaucoup (trop) de gens pensent encore que nous vivons dans le joyeux monde de Mickey, que les gouvernements, banques et lobbies n'ont rien à se reprocher, la crise, c'est de notre faute :/
Not bad!
Je me demande si cette technique et/ou tout simplement le système de discussion pourrait être utilisé dans PickyPaste d'une façon ou d'une autre … Mmmh.
Les possibilités sont très certainement nombreuses et variées mais si on voudrait faire des discussions chiffrés très facilement, en étant directement informé par mail (plus simpatoche et accessible non ?) ce qui serait à limite le plus simple serait ptet de patcher un zérobin pour que chaque réponse envoyée envoie un mail associé … Mmmmh (<- Bruit d'intense réflexion)
(via http://ithake.eu/shaarli/?iq64Fw )
Je me demande si cette technique et/ou tout simplement le système de discussion pourrait être utilisé dans PickyPaste d'une façon ou d'une autre … Mmmh.
Les possibilités sont très certainement nombreuses et variées mais si on voudrait faire des discussions chiffrés très facilement, en étant directement informé par mail (plus simpatoche et accessible non ?) ce qui serait à limite le plus simple serait ptet de patcher un zérobin pour que chaque réponse envoyée envoie un mail associé … Mmmmh (<- Bruit d'intense réflexion)
(via http://ithake.eu/shaarli/?iq64Fw )
J'ai rajouté l'infame http_build_request à ma liste des raisons pourquoi je n'aime pas PHP. >:(
Ça y est, enfin du RSS sur mon site ! (Merci Bronco pour le coup de pouce ;))
Vous pouvez également rajouter les filtres, tags, … que vous voulez. Quelqu'un a-t-il dit "Vive les RSS paramétrable" (ou quelque chose dans le genre) ? :)
Et vous n'avez pas besoin de le faire manuellement.
Si vous vous rendez sur http://www.olissea.com/gallery/ et rentrez manuellement le tag fond d'écran par exemple ( http://www.olissea.com/gallery/?tags=fond+d%27%E9cran ), alors 2 flux RSS vous sont automatiquement proposés, celui par défaut + celui personnalisé.
(EDIT: Bon ok, je viens de spotter un bogue avec mon exemple :p je crois qu'il y a un double parsing avec les caractères spéciaux, ou quelque chose dans le genre (je pense avoir ma ptite idée), sinon ça fonctionne très bien ^^)
(EDIT2: Ok il semblerait que ce CRETIN de http_build_request agisse un peu comme magic_quote puis il urlencode une partie donc on peut pas juste urldecode le tout, stripslashes, puis de nouveau urlencode, il faut donc faire une atrocité du genre: str_replace('%5C%27', '%27', http_build_request([…])) (Note: %5C%27 correspond à \'))
Bon, un bémol ? Car il en faut un (Mais on s'en fout :D car un prob = une solution avec moi :'D *redescend du piédestal*), j'ignore un peu quels flux RSS les gens pourraient avoir envie / besoin.
Alors plutôt que de dire "tant pis" ^^, je pense que je vais créer un "fake rss" qui sera nommé 'Envie d'un RSS en particulier ?' avec comme seul item un lien vers le formulaire pour faire la demande; car autrement s'il n'y a pas un RSS, on se dit tant pis :/ (on contacte rarement le webmaster pour si peu sauf si c'est vraiment quelque chose dont on a envie) alors que je suis sûr que la présence de ce petit formulaire permettrait de passer à côté de beaucoup de potentiels manqués / services rendus aux visiteurs.
C'est ptet rien mais en attendant je n'ai, personnellement, jamais vu encore la liste des flux RSS utilisées pour proposer des services (et non pas juste des RSS, if you see what I mean)
Je pense que le flux RSS est valide vu que basé sur le code de Bronco (encore merci :D), faudra que je vérif car j'y ai apporté quelques modifs.
(EDIT3: Évidemment que mon feed n'est pas valide si je ne retire pas le flag WIP qui empêche d'accéder à la page à part avec mon compte -.- :D donc, si jms certains d'entre vous sont passés récemment, ils ont aussi dût se prendre ce mur ^^)
Un jour - j'dis bien un jour - mes codes seront open-sources :)
EDIT4 (le dernier j'espère): J'ai rajouté la source de l'image au flux RSS. Je pense que je vais rajouter des infos supplémentaires comme … la taille, le poids, les tags, … (je ne sais pas encore lesquels mettre et lesquels ne pas mettre, si vous avez des avis, je suis preneur).
EDIT5: Màj également notifiée ici: http://www.olissea.com/maj.php
Vous pouvez également rajouter les filtres, tags, … que vous voulez. Quelqu'un a-t-il dit "Vive les RSS paramétrable" (ou quelque chose dans le genre) ? :)
Et vous n'avez pas besoin de le faire manuellement.
Si vous vous rendez sur http://www.olissea.com/gallery/ et rentrez manuellement le tag fond d'écran par exemple ( http://www.olissea.com/gallery/?tags=fond+d%27%E9cran ), alors 2 flux RSS vous sont automatiquement proposés, celui par défaut + celui personnalisé.
(EDIT: Bon ok, je viens de spotter un bogue avec mon exemple :p je crois qu'il y a un double parsing avec les caractères spéciaux, ou quelque chose dans le genre (je pense avoir ma ptite idée), sinon ça fonctionne très bien ^^)
(EDIT2: Ok il semblerait que ce CRETIN de http_build_request agisse un peu comme magic_quote puis il urlencode une partie donc on peut pas juste urldecode le tout, stripslashes, puis de nouveau urlencode, il faut donc faire une atrocité du genre: str_replace('%5C%27', '%27', http_build_request([…])) (Note: %5C%27 correspond à \'))
Bon, un bémol ? Car il en faut un (Mais on s'en fout :D car un prob = une solution avec moi :'D *redescend du piédestal*), j'ignore un peu quels flux RSS les gens pourraient avoir envie / besoin.
Alors plutôt que de dire "tant pis" ^^, je pense que je vais créer un "fake rss" qui sera nommé 'Envie d'un RSS en particulier ?' avec comme seul item un lien vers le formulaire pour faire la demande; car autrement s'il n'y a pas un RSS, on se dit tant pis :/ (on contacte rarement le webmaster pour si peu sauf si c'est vraiment quelque chose dont on a envie) alors que je suis sûr que la présence de ce petit formulaire permettrait de passer à côté de beaucoup de potentiels manqués / services rendus aux visiteurs.
C'est ptet rien mais en attendant je n'ai, personnellement, jamais vu encore la liste des flux RSS utilisées pour proposer des services (et non pas juste des RSS, if you see what I mean)
Je pense que le flux RSS est valide vu que basé sur le code de Bronco (encore merci :D), faudra que je vérif car j'y ai apporté quelques modifs.
(EDIT3: Évidemment que mon feed n'est pas valide si je ne retire pas le flag WIP qui empêche d'accéder à la page à part avec mon compte -.- :D donc, si jms certains d'entre vous sont passés récemment, ils ont aussi dût se prendre ce mur ^^)
Un jour - j'dis bien un jour - mes codes seront open-sources :)
EDIT4 (le dernier j'espère): J'ai rajouté la source de l'image au flux RSS. Je pense que je vais rajouter des infos supplémentaires comme … la taille, le poids, les tags, … (je ne sais pas encore lesquels mettre et lesquels ne pas mettre, si vous avez des avis, je suis preneur).
EDIT5: Màj également notifiée ici: http://www.olissea.com/maj.php
Pratique !
pierreghz m'avait passé le lien http://www.mypersonnaldata.eu/downloads/ récemment et je trouve ton projet fortement intéressant :D
Les messages envoyés ne se trouvent pas vraiment sur PickyPaste (mais sur un Zerobin cible).
PP et ton projet (et OpenPGP JS) ont des buts sensiblement différents mais PP a encore beaucoup de fonctionnalités à prévoir ;)
Le plus important étant toujours de garder la maximum d'accessibilité alors que j'ai l'impression qu'OpenPGP JS n'est pas vraiment accessible à tous le monde mais il contient de très bonnes idées/pistes ;) Peut-être que faire quelque chose à mi-chemin entre les deux mais tout en restant le plus one-click que possible pourrait être vraiment cool !
Je continue aussi à vous tenir au courant si j'ai des avancées/idées/questions.
Amicalement.
(shaarlink trouvé via http://shaarli.warriordudimanche.net/?hiz-vw )
Les messages envoyés ne se trouvent pas vraiment sur PickyPaste (mais sur un Zerobin cible).
PP et ton projet (et OpenPGP JS) ont des buts sensiblement différents mais PP a encore beaucoup de fonctionnalités à prévoir ;)
Le plus important étant toujours de garder la maximum d'accessibilité alors que j'ai l'impression qu'OpenPGP JS n'est pas vraiment accessible à tous le monde mais il contient de très bonnes idées/pistes ;) Peut-être que faire quelque chose à mi-chemin entre les deux mais tout en restant le plus one-click que possible pourrait être vraiment cool !
Je continue aussi à vous tenir au courant si j'ai des avancées/idées/questions.
Amicalement.
(shaarlink trouvé via http://shaarli.warriordudimanche.net/?hiz-vw )
Ahaha, we need volunteers :D We need that to happen ^^
(23:21:28) getty@duckduckgo.com: if you make it perl, then i run it on dukgo.com
(23:22:55) getty@duckduckgo.com: it must be on CPAN as module which i can easily integrate
(23:23:01) getty@duckduckgo.com: if someone wants support i am there and help him
(23:23:06) getty@duckduckgo.com: (I'm part of the perl marketing committee)
(23:23:57) getty@duckduckgo.com: http://www.perlfoundation.org/marketing_committee
(23:24:43) getty@duckduckgo.com: and you can also quote me that everyone who thinks PHP is just another language is a pure retard and shouldnt do software development ;)
(23:25:12) getty@duckduckgo.com: And if they say i have no fucking clue what i say, show them this: https://github.com/Getty/historical-php-rapidev
[…]
(23:29:54) getty@duckduckgo.com: btw: i totally accept Python, Java and all other languages (NDLA: Everything but PHP)
And he doesn't like PHP ♥
PS: He said that if it do happens, he *will* keep his word. https://www.youtube.com/watch?v=Wi_lfdby58o#t=60
EDIT: You can join the freenode #duckduckgo to chat about it.
EDIT:
(23:32:49) getty@duckduckgo.com: i would like to see THAT in perl
(23:32:52) getty@duckduckgo.com: then i can easily integrate it
(23:32:54) getty@duckduckgo.com: into our platform right now
(23:32:59) getty@duckduckgo.com: if its NOT perl
(23:33:01) getty@duckduckgo.com: then the process is harder
(23:33:06) getty@duckduckgo.com: (and php as said, denied totally)
(23:33:21) getty@duckduckgo.com: if you guys wanna make me happy
(23:33:22) getty@duckduckgo.com: make it in perl
(23:33:26) getty@duckduckgo.com: and as said: i help
(23:33:27) getty@duckduckgo.com: i guide you
(23:33:30) getty@duckduckgo.com: i give you whatever you need
(23:33:38) getty@duckduckgo.com: its hard but you will love perl :)
EDIT3: There's http://0bin.net/ coded in Python. It has some more features but lacks some too (like Burn After Reading is still not a checkbox).
(23:21:28) getty@duckduckgo.com: if you make it perl, then i run it on dukgo.com
(23:22:55) getty@duckduckgo.com: it must be on CPAN as module which i can easily integrate
(23:23:01) getty@duckduckgo.com: if someone wants support i am there and help him
(23:23:06) getty@duckduckgo.com: (I'm part of the perl marketing committee)
(23:23:57) getty@duckduckgo.com: http://www.perlfoundation.org/marketing_committee
(23:24:43) getty@duckduckgo.com: and you can also quote me that everyone who thinks PHP is just another language is a pure retard and shouldnt do software development ;)
(23:25:12) getty@duckduckgo.com: And if they say i have no fucking clue what i say, show them this: https://github.com/Getty/historical-php-rapidev
[…]
(23:29:54) getty@duckduckgo.com: btw: i totally accept Python, Java and all other languages (NDLA: Everything but PHP)
And he doesn't like PHP ♥
PS: He said that if it do happens, he *will* keep his word. https://www.youtube.com/watch?v=Wi_lfdby58o#t=60
EDIT: You can join the freenode #duckduckgo to chat about it.
EDIT:
(23:32:49) getty@duckduckgo.com: i would like to see THAT in perl
(23:32:52) getty@duckduckgo.com: then i can easily integrate it
(23:32:54) getty@duckduckgo.com: into our platform right now
(23:32:59) getty@duckduckgo.com: if its NOT perl
(23:33:01) getty@duckduckgo.com: then the process is harder
(23:33:06) getty@duckduckgo.com: (and php as said, denied totally)
(23:33:21) getty@duckduckgo.com: if you guys wanna make me happy
(23:33:22) getty@duckduckgo.com: make it in perl
(23:33:26) getty@duckduckgo.com: and as said: i help
(23:33:27) getty@duckduckgo.com: i guide you
(23:33:30) getty@duckduckgo.com: i give you whatever you need
(23:33:38) getty@duckduckgo.com: its hard but you will love perl :)
EDIT3: There's http://0bin.net/ coded in Python. It has some more features but lacks some too (like Burn After Reading is still not a checkbox).
*siffle*
J'ai rajouté la date d'expiration au titre du mail.
Je reçois beaucoup de mail PickyPaste et n'ayant pas forcément le temps de les ouvrir tous (surtout qu'étant majoritairement tous en lecture unique, si je les ouvre je dois absolument le sauvegarder quelque part si je veux pouvoir le lire plus tard), j'attends parfois d'avoir plus le temps, mais il faudrait pas que j'attende trop longtemps et que le message expire non plus :/ Auparavant je devais ouvrir les mails régulièrement pour m'assurer qu'il n'était pas encore prêt à bientôt expirer (ce qui était également une perte de temps pour moi), voilà une chose réglée.
Je vais taff sur l'internatiolisation de l'application, faciliter son portage et rajouter beaucoup de fonctionnalités visant à ENCORE faciliter son utilisation.
PS: Je suis très mauvais à garder trace des versions (en général je n'en utilise pas, mais j'essaie de faire l'effort).
Je reçois beaucoup de mail PickyPaste et n'ayant pas forcément le temps de les ouvrir tous (surtout qu'étant majoritairement tous en lecture unique, si je les ouvre je dois absolument le sauvegarder quelque part si je veux pouvoir le lire plus tard), j'attends parfois d'avoir plus le temps, mais il faudrait pas que j'attende trop longtemps et que le message expire non plus :/ Auparavant je devais ouvrir les mails régulièrement pour m'assurer qu'il n'était pas encore prêt à bientôt expirer (ce qui était également une perte de temps pour moi), voilà une chose réglée.
Je vais taff sur l'internatiolisation de l'application, faciliter son portage et rajouter beaucoup de fonctionnalités visant à ENCORE faciliter son utilisation.
PS: Je suis très mauvais à garder trace des versions (en général je n'en utilise pas, mais j'essaie de faire l'effort).
Coder de façon anonyme ? C'est triste ça !
Rien de mieux que le full libre pour ça :D le domaine public, toussa, toussa.
Autant ne pas trop s'attacher à ses codes de toutes façons. Idéalement faut coder pour soit d'abord puis ensuite faut se dire que c'est pour aider la communauté (ça va dépendre de quoi aussi mais bon), donc que la communauté en fasse ce qu'elle veut, on devrait se satisfaire de l'avoir fait pour soit même et pour ceux que ça intéresse :)
C'est aussi un peu ça la philosophie libre et si en plus ça nous permet d'éviter ce genre d'histoires honteuses et tristes :/
Rien de mieux que le full libre pour ça :D le domaine public, toussa, toussa.
Autant ne pas trop s'attacher à ses codes de toutes façons. Idéalement faut coder pour soit d'abord puis ensuite faut se dire que c'est pour aider la communauté (ça va dépendre de quoi aussi mais bon), donc que la communauté en fasse ce qu'elle veut, on devrait se satisfaire de l'avoir fait pour soit même et pour ceux que ça intéresse :)
C'est aussi un peu ça la philosophie libre et si en plus ça nous permet d'éviter ce genre d'histoires honteuses et tristes :/
C'est vrai que c'est très visuel. Ça peut très pratique du coup, question ergonomie.
EDIT: Apparemment ça serait une syntaxe LESS (source: http://stackoverflow.com/q/13608855/1524913 ). Je suppose donc que c'est juste jsFiddle qui l'intègre par défaut. Ok ok, fair enough.
Tiens, j'avais jamais vu cette syntaxe CSS O.o
#box{
width: 200px;
height: 200px;
left: 100px;
top: 100px;
background:blue;
position: absolute;
-moz-transform: rotate(10deg); -webkit-transform: rotate(10deg); transform: rotate(10deg);
z-index: 10!important;
&:after{
content: "";
width: 100px;
background: orange;
height: 100px;
position: absolute;
left: 120px;
top: 120px;
z-index: -2!important;
}
}
Le &:after mais je suppose que ça ne se limite pas à ça :o
En faite, je suis entrain de chercher comment retourner un background, j'ai trouvé, mais ça perturbe z-index apparemment :/
(via http://stackoverflow.com/q/11962301/1524913 )
Tiens, j'avais jamais vu cette syntaxe CSS O.o
#box{
width: 200px;
height: 200px;
left: 100px;
top: 100px;
background:blue;
position: absolute;
-moz-transform: rotate(10deg); -webkit-transform: rotate(10deg); transform: rotate(10deg);
z-index: 10!important;
&:after{
content: "";
width: 100px;
background: orange;
height: 100px;
position: absolute;
left: 120px;
top: 120px;
z-index: -2!important;
}
}
Le &:after mais je suppose que ça ne se limite pas à ça :o
En faite, je suis entrain de chercher comment retourner un background, j'ai trouvé, mais ça perturbe z-index apparemment :/
(via http://stackoverflow.com/q/11962301/1524913 )
Voilà à quoi ressemble certains liens sur FB :
J'ai remplacé le vrai lien par ***VRAI LIEN*** pour qu'on le voit mieux au milieu de tout ce charabia.
<a a1958aae="true" class="external _8o _8t lfloat" aria-hidden="true" href="http://www.facebook.com/l.php?u=***VRAI LIEN***&h=WAQF0ENAfAQHnHqJTEs1KuOlxnhlm-NUYyV9VyjK7YENHoQ&s=1" rel="nofollow" target="_blank" data-ft="{"type":41,"tn":"E"}" tabindex="-1" onmouseover="LinkshimAsyncLink.swap(this, "***VRAI LIEN***");" onclick="LinkshimAsyncLink.swap(this, "http:\/\/www.facebook.com\/l.php?u=***VRAI LIEN***&h=WAQF0ENAfAQHnHqJTEs1KuOlxnhlm-NUYyV9VyjK7YENHoQ&s=1");">
Donc les salauds changent le lien en le bon lien au survol de celui-ci pour qu'on ne remarque pas qu'il s'agit d'un fake lien je présume mais aussitôt qu'on clique sur ce lien, hop, ça redevient un tracker. Bande d'enfoirés … (Pardon hein)
Reste plus qu'à me trouver cette fichue fonction LinkshimAsyncLink.swap pour voir ce qu'elle fait (si elle ne fait que swap le link ou pas, elle pourrait très bien envoyer l'info sans qu'on ait besoin de cliquer, réussissant ainsi à aussi choper ceux qui veulent contourner 'facilement' lol).
J'ai remplacé le vrai lien par ***VRAI LIEN*** pour qu'on le voit mieux au milieu de tout ce charabia.
<a a1958aae="true" class="external _8o _8t lfloat" aria-hidden="true" href="http://www.facebook.com/l.php?u=***VRAI LIEN***&h=WAQF0ENAfAQHnHqJTEs1KuOlxnhlm-NUYyV9VyjK7YENHoQ&s=1" rel="nofollow" target="_blank" data-ft="{"type":41,"tn":"E"}" tabindex="-1" onmouseover="LinkshimAsyncLink.swap(this, "***VRAI LIEN***");" onclick="LinkshimAsyncLink.swap(this, "http:\/\/www.facebook.com\/l.php?u=***VRAI LIEN***&h=WAQF0ENAfAQHnHqJTEs1KuOlxnhlm-NUYyV9VyjK7YENHoQ&s=1");">
Donc les salauds changent le lien en le bon lien au survol de celui-ci pour qu'on ne remarque pas qu'il s'agit d'un fake lien je présume mais aussitôt qu'on clique sur ce lien, hop, ça redevient un tracker. Bande d'enfoirés … (Pardon hein)
Reste plus qu'à me trouver cette fichue fonction LinkshimAsyncLink.swap pour voir ce qu'elle fait (si elle ne fait que swap le link ou pas, elle pourrait très bien envoyer l'info sans qu'on ait besoin de cliquer, réussissant ainsi à aussi choper ceux qui veulent contourner 'facilement' lol).
EDIT: Y parait que c'est HYPER simple en fait: http://www.warriordudimanche.net/article159/google-vous-ment-googol-vous-prend-pas-pour-un-hon#c1369242188-1
Tiens, ça me fait penser que ça serait sympa (et surement pas compliqué à implémenter soit-même) que je me fasse un mini-plugin maison pour marquer les liens extérieurs sur mon forum. D'ailleurs WOT prévoit peut-être déjà cet éventualité.
(via http://links.kevinvuilleumier.net/?lqQeAA )
Tiens, ça me fait penser que ça serait sympa (et surement pas compliqué à implémenter soit-même) que je me fasse un mini-plugin maison pour marquer les liens extérieurs sur mon forum. D'ailleurs WOT prévoit peut-être déjà cet éventualité.
(via http://links.kevinvuilleumier.net/?lqQeAA )
Ouep, j'y ai réfléchi aussi pour essayer de briser la bulle de Youtube (on pourrait dire de Google en général, mais perso, j'évite Google autant que je peux (DDG et lorsque ça va pas, startpage si j'oublie pas)), mais je pense que j'en ai déjà parlé ici :)
(+ dans un sujet privé sur mon forum je crois ^^ héhé)
(+ dans un sujet privé sur mon forum je crois ^^ héhé)
Au fait, lorsque le lien n'est pas tronqué à l'affichage, la façon la plus "simple" de bypasser le changement d'URL (comme Google et Youtube le font) reste encore de sélectionner le texte, le copier, ouvrir soit même un nouvel onglet, coller le texte représentant l'adresse (ainsi en plus on voit si on s'est pas planté) puis Enter.
(Sur Google, vous avez l'adresse qui est affichée en clair en dessous de la description du lien, c'est plus facile à sélectionner sans risquer de cliquer sur le lien en essayant de le sélectionner)
Car, un simple clic gauche ou droit modifie l'adresse, donc même l'astuce Clic Droit + Copy Link ne fonctionne pas.
Lorsque le texte affiché est tronqué, car trop long, il vous reste également la solution Firebug si vous l'avez installé, pour extraire soit même la valeur href.
Sinon, y a Grease Monkey.
(Sur Google, vous avez l'adresse qui est affichée en clair en dessous de la description du lien, c'est plus facile à sélectionner sans risquer de cliquer sur le lien en essayant de le sélectionner)
Car, un simple clic gauche ou droit modifie l'adresse, donc même l'astuce Clic Droit + Copy Link ne fonctionne pas.
Lorsque le texte affiché est tronqué, car trop long, il vous reste également la solution Firebug si vous l'avez installé, pour extraire soit même la valeur href.
Sinon, y a Grease Monkey.
Ouh, j'ai hâte perso, elle a l'air vraiment chouette à utiliser cette classe.
(via http://stackoverflow.com/a/1695250/1524913 )
(via http://stackoverflow.com/a/1695250/1524913 )
Tiens, c'est marrant mais moi j'suis plutôt contre l'idée …
Elle apporte des positifs mais pas que (d'où ma réticence).
Je n'aime pas le tracking (surtout celui exercé par Google-Youtube par exemple) et tout est bon pour eux pour faire des études de marchés. (mais pas que pour eux)
Au lieu de vous servir simplement la page, ils peuvent s'ils le désir savoir beaucoup de choses sur votre lecture de la page qu'ils ne sont pas forcément censés savoir. Vu que le chargement de certaines images sont différées (par exemple les miniatures des vidéos sur le côté dans le cas de Youtube), ainsi ils peuvent savoir quand j'ai scrollé, étudier statistiquement quand les gens accrochent ou décrochent plus etc etc.
J'aime pas le neuromarketing et la surveillance, j'aime ce qui est franc et spontané, pas ce qui est calculé de façon à ce que notre cerveau puissent être influencés inconsciemment. (Voir le génie des pubs des grandes marques).
Ok ça prend un peu plus de temps et de bande passante peut-être pour rien mais selon moi c'est un prix à payer (pour éviter d'être catalogué, pour sortir des bulles, etc)
(Par exemple, personnellement je pense qu'un moyen efficace de sortir de la bulle de Youtube (en continuant d'utiliser Yt) serait de télécharger de gros échantillons de vidéos non représentatives (donc y compris des vidéos de Justin Bieber et d'autres trucs dont vous n'avez rien à foutre) puis vous regarder que ce qui vous intéresse en local. Yt n'a pas à savoir ce genre de chose, surtout quand on sait ce qu'il en fait (comme nous renfermer dans notre bulle))
Et j'ai une question, est-ce que c'est Ctrl+S compatible ? (Est-ce que si je sauvegarde la page localement, je récupère toutes les images ou seulement celles qui étaient chargées à ce moment là ?)
Bon, c'est mon coup de gueule, z'êtes pas obligé d'être d'accord avec moi ^^ (encore bien).
Elle apporte des positifs mais pas que (d'où ma réticence).
Je n'aime pas le tracking (surtout celui exercé par Google-Youtube par exemple) et tout est bon pour eux pour faire des études de marchés. (mais pas que pour eux)
Au lieu de vous servir simplement la page, ils peuvent s'ils le désir savoir beaucoup de choses sur votre lecture de la page qu'ils ne sont pas forcément censés savoir. Vu que le chargement de certaines images sont différées (par exemple les miniatures des vidéos sur le côté dans le cas de Youtube), ainsi ils peuvent savoir quand j'ai scrollé, étudier statistiquement quand les gens accrochent ou décrochent plus etc etc.
J'aime pas le neuromarketing et la surveillance, j'aime ce qui est franc et spontané, pas ce qui est calculé de façon à ce que notre cerveau puissent être influencés inconsciemment. (Voir le génie des pubs des grandes marques).
Ok ça prend un peu plus de temps et de bande passante peut-être pour rien mais selon moi c'est un prix à payer (pour éviter d'être catalogué, pour sortir des bulles, etc)
(Par exemple, personnellement je pense qu'un moyen efficace de sortir de la bulle de Youtube (en continuant d'utiliser Yt) serait de télécharger de gros échantillons de vidéos non représentatives (donc y compris des vidéos de Justin Bieber et d'autres trucs dont vous n'avez rien à foutre) puis vous regarder que ce qui vous intéresse en local. Yt n'a pas à savoir ce genre de chose, surtout quand on sait ce qu'il en fait (comme nous renfermer dans notre bulle))
Et j'ai une question, est-ce que c'est Ctrl+S compatible ? (Est-ce que si je sauvegarde la page localement, je récupère toutes les images ou seulement celles qui étaient chargées à ce moment là ?)
Bon, c'est mon coup de gueule, z'êtes pas obligé d'être d'accord avec moi ^^ (encore bien).
J'adore le LOLCODE :DD
(Site trouvé via http://sametmax.com/le-choix-dun-langage-influence-le-fun-de-votre-carriere/ )
(Site trouvé via http://sametmax.com/le-choix-dun-langage-influence-le-fun-de-votre-carriere/ )
Cool ça :o
Ce que j'avais beaucoup aimé aussi c'est la possibilité de faire du Java depuis Python (en faite il s'agissait de coder en Python puis compiler en bytecode Java. J'aimerais bien faire un mod pour Minecraft ainsi :p)
Ce que j'avais beaucoup aimé aussi c'est la possibilité de faire du Java depuis Python (en faite il s'agissait de coder en Python puis compiler en bytecode Java. J'aimerais bien faire un mod pour Minecraft ainsi :p)
J'ai pas encore tout lu mais c'est bigre intéressant. Je crois que je vais peut-être me mettre à Git.
C'est quoi votre solution contre les failles qu'un webmaster (par exemple) refuse de corriger et/ou ne répond jamais à votre email les prévenant ?
Devenir un white hat ? (Mais c'est illégal …) S'introduire dans le système, réparer, et refermer derrière soit ?
Car c'est quand même triste de devoir assisté presque impuissant à une faille potentiellement très dangereuse pour vous et le reste du monde qui passerait sur ce site (toujours dans l'exemple) :/
Devenir un white hat ? (Mais c'est illégal …) S'introduire dans le système, réparer, et refermer derrière soit ?
Car c'est quand même triste de devoir assisté presque impuissant à une faille potentiellement très dangereuse pour vous et le reste du monde qui passerait sur ce site (toujours dans l'exemple) :/
En voilà une bonne idée ! Organiser des Bug Hunting Weekends :)
En plus, leur page de résultat est plutôt sympa aussi : http://www.splitbrain.org/blog/2008-10/13-bug_squashing_weekend_stats
En plus, leur page de résultat est plutôt sympa aussi : http://www.splitbrain.org/blog/2008-10/13-bug_squashing_weekend_stats
Ça y est !!!! :D
Enfin ! Au final, j'ai eu bien plus de difficultés que prévu, d'où mes cris de joies :'D #seulLesCodeursPeuventComprendre
Zerobin ? Facile à utiliser ? FOOL!! Fin moi aussi je le pensais … Jusqu'à ce que ma route croise quelques néophytes du web :/ … J'ai encore mal !
Il fallait encore plus simple ! Un no-brainer, clique clique, pesé c'est envoyé !
(En gardant toujours le tout highly paramétrable tant qu'on a une option par défaut c'est ce qui compte ET libre (open source, toussa, etc))
Boum: PickyPaste, based on Zerobin's core, that's for PickyPeople who wants robustness (yeay Zerobin) AND super-easy-to-use. DONE!
Le but de l'appli est surtout de pouvoir l'utiliser via le snippet: Une page intéressante que j'aimerais partager ? Alors faut quelque chose d'aussi simple que le traditionnel bouton Partager, sinon les gens ne verront aucune raison à ce qu'ils se cassent le cul à devoir faire des trucs en plus compliqués.
Alors on leur donne juste un favoris à cliquer dessus, hop, ça ouvre un nouvel onglet avec le message préremplis avec l'adresse de la page où on se trouvait.
On rentre l'email du destinataire (pourra y avoir une liste par défaut plus tard, genre se faire une liste de contact et tout, mais tout en restant KISS) (et ça sera aussi facilement modulable, donc le choix de l'email n'est pas forcé) ainsi que le sien si on veut pouvoir être répondu,
Les autres options ont toutes une valeur par défaut (avec une ptite explication quand au fonctionnement du "BurnAfterReading" activé par défaut), les options classiques de Zerobin sont toutes là, mais on peut également préciser un serveur Zerobin alternatif ou un serveur mail alternatif (car plus tard, il est prévu de pouvoir avoir le client sur son pc, en .html pour éviter contre une prise de domaine).
Le mail envoyé comporte une petite explication sommaire du pourquoi et du comment et utilise l'entête Reply-To si l'adresse email fournie est valide.
Le code source de l'app est disponible en bas de la page :)
Next to come: The English version (and a lot of other stuff)
PS: Bon, ne faites pas trop attention au design hein :p c'pas mon fort :3
Sujet lié: http://www.olissea.com/bbs/?tid=962
Enfin ! Au final, j'ai eu bien plus de difficultés que prévu, d'où mes cris de joies :'D #seulLesCodeursPeuventComprendre
Zerobin ? Facile à utiliser ? FOOL!! Fin moi aussi je le pensais … Jusqu'à ce que ma route croise quelques néophytes du web :/ … J'ai encore mal !
Il fallait encore plus simple ! Un no-brainer, clique clique, pesé c'est envoyé !
(En gardant toujours le tout highly paramétrable tant qu'on a une option par défaut c'est ce qui compte ET libre (open source, toussa, etc))
Boum: PickyPaste, based on Zerobin's core, that's for PickyPeople who wants robustness (yeay Zerobin) AND super-easy-to-use. DONE!
Le but de l'appli est surtout de pouvoir l'utiliser via le snippet: Une page intéressante que j'aimerais partager ? Alors faut quelque chose d'aussi simple que le traditionnel bouton Partager, sinon les gens ne verront aucune raison à ce qu'ils se cassent le cul à devoir faire des trucs en plus compliqués.
Alors on leur donne juste un favoris à cliquer dessus, hop, ça ouvre un nouvel onglet avec le message préremplis avec l'adresse de la page où on se trouvait.
On rentre l'email du destinataire (pourra y avoir une liste par défaut plus tard, genre se faire une liste de contact et tout, mais tout en restant KISS) (et ça sera aussi facilement modulable, donc le choix de l'email n'est pas forcé) ainsi que le sien si on veut pouvoir être répondu,
Les autres options ont toutes une valeur par défaut (avec une ptite explication quand au fonctionnement du "BurnAfterReading" activé par défaut), les options classiques de Zerobin sont toutes là, mais on peut également préciser un serveur Zerobin alternatif ou un serveur mail alternatif (car plus tard, il est prévu de pouvoir avoir le client sur son pc, en .html pour éviter contre une prise de domaine).
Le mail envoyé comporte une petite explication sommaire du pourquoi et du comment et utilise l'entête Reply-To si l'adresse email fournie est valide.
Le code source de l'app est disponible en bas de la page :)
Next to come: The English version (and a lot of other stuff)
PS: Bon, ne faites pas trop attention au design hein :p c'pas mon fort :3
Sujet lié: http://www.olissea.com/bbs/?tid=962
Studying(new transmittingInformation.method)
{
'reason': new Cause(transmittingInformation.classicalWay == getRawInfo().encodeWith(complicatedLangage).deliver())
.implies(getSomeInfo.classicWay == getEncodedInfo().decode(from=complicatedLangage).read()),
'solution': ((transmittingInformation.newMethod = getRawInfo().encodeWith(easyLangage).deliver()),
(getSomeInfo.newMethod = getEncodedInfo().decode(from=easyLangage).read())),
'comparison': {'CPU_Efficient': Probability(HIGH, that=Range(min=+100%))},
'version': BETA,
'note': {'classicalWay': 'Hopefully, this will be understandable enough', 'newMethod': Estimation(HIGH_SUCCESS, about=UNDERSTANDING, what=this)},
'sample': {'classicalWay': 'Nouvelle tendance sur les sites web: Les vidéos YouTube embeded qui ne démarrent pas quand AdBlock est activé. VOUS ME FAITES CHIER. - Sebsauvage (http://sebsauvage.net/links/?XUqxlQ)',
'newMethod': Info('websites.trends.filter(new) == (videos.type(Yt).start.disable() if 'AdBlock' in browser.addons); # THIS IS BULLSHIT', by=Sebsauvage, src=http://sebsauvage.net/links/?XUqxlQ)}
}
{
'reason': new Cause(transmittingInformation.classicalWay == getRawInfo().encodeWith(complicatedLangage).deliver())
.implies(getSomeInfo.classicWay == getEncodedInfo().decode(from=complicatedLangage).read()),
'solution': ((transmittingInformation.newMethod = getRawInfo().encodeWith(easyLangage).deliver()),
(getSomeInfo.newMethod = getEncodedInfo().decode(from=easyLangage).read())),
'comparison': {'CPU_Efficient': Probability(HIGH, that=Range(min=+100%))},
'version': BETA,
'note': {'classicalWay': 'Hopefully, this will be understandable enough', 'newMethod': Estimation(HIGH_SUCCESS, about=UNDERSTANDING, what=this)},
'sample': {'classicalWay': 'Nouvelle tendance sur les sites web: Les vidéos YouTube embeded qui ne démarrent pas quand AdBlock est activé. VOUS ME FAITES CHIER. - Sebsauvage (http://sebsauvage.net/links/?XUqxlQ)',
'newMethod': Info('websites.trends.filter(new) == (videos.type(Yt).start.disable() if 'AdBlock' in browser.addons); # THIS IS BULLSHIT', by=Sebsauvage, src=http://sebsauvage.net/links/?XUqxlQ)}
}
There might be some easier ways to do that but that's the easiest I found so far…
As usual, not surprisingly, Python is better (IMO).
Python:
try:
foo()
except ValueError:
bar()
PHP:
It's actually pretty easy when you implement your own errors (throw new Exception then catch it with a try…catch) but how to catch errors this easily and being able to handle them that easily? Well, turn them into exceptions!
set_error_handler(function($errno, $errstr){throw new Exception($errno);});
try
{
file_get_contents('lol');
}
catch(Exception $e)
{
echo 'Error n°',$e->getMessage();
}
restore_error_handler();
I still prefer Python… I think I'll always do. </PHPTROLL> </PYTHONFAN>
As usual, not surprisingly, Python is better (IMO).
Python:
try:
foo()
except ValueError:
bar()
PHP:
It's actually pretty easy when you implement your own errors (throw new Exception then catch it with a try…catch) but how to catch errors this easily and being able to handle them that easily? Well, turn them into exceptions!
set_error_handler(function($errno, $errstr){throw new Exception($errno);});
try
{
file_get_contents('lol');
}
catch(Exception $e)
{
echo 'Error n°',$e->getMessage();
}
restore_error_handler();
I still prefer Python… I think I'll always do. </PHPTROLL> </PYTHONFAN>
>.< Je HAIS lorsqu'une fonction fail silencieusement et que vous passez des heures à épluchez le code, en vain, pour seulement trouver une réponse, presque par hasard, des heures après et c'est juste une connerie …
Si seulement elle ne plantait pas silencieusement -_-"
Réponse à mon problème : " By default, you can't make XHR requests across different domains. " Grr … Y savait pas me le dire plutôt que de m'afficher la ligne en rouge sans rien m'expliquer ?? (Firebug) (En plus, il m'affichait toujours bien Code 200)
PS: J'adore programmer, heureusement que ces conneries restent les exceptions. Mais faut pas oublier qu'on fait beauciyo plus de bruit lorsqu'on râle que lorsqu'on est satisfait ^^ Alors pour tous ceux n'ayant encore jamais programmé de leur vie, malgré nos cris et nos pleurs, je peux vous dire que programmer c'est cool :D Essayez !!
EDIT: Apparemment, les requêtes Ajax cross-domain *seraient* possible (même si déconseillées) et elle demande une modification du code source du serveur cible.
http://stackoverflow.com/questions/11736431/make-cross-domain-ajax-jsonp-request-with-jquery/11736771#11736771
http://stackoverflow.com/questions/3506208/jquery-ajax-cross-domain
Si seulement elle ne plantait pas silencieusement -_-"
Réponse à mon problème : " By default, you can't make XHR requests across different domains. " Grr … Y savait pas me le dire plutôt que de m'afficher la ligne en rouge sans rien m'expliquer ?? (Firebug) (En plus, il m'affichait toujours bien Code 200)
PS: J'adore programmer, heureusement que ces conneries restent les exceptions. Mais faut pas oublier qu'on fait beauciyo plus de bruit lorsqu'on râle que lorsqu'on est satisfait ^^ Alors pour tous ceux n'ayant encore jamais programmé de leur vie, malgré nos cris et nos pleurs, je peux vous dire que programmer c'est cool :D Essayez !!
EDIT: Apparemment, les requêtes Ajax cross-domain *seraient* possible (même si déconseillées) et elle demande une modification du code source du serveur cible.
http://stackoverflow.com/questions/11736431/make-cross-domain-ajax-jsonp-request-with-jquery/11736771#11736771
http://stackoverflow.com/questions/3506208/jquery-ajax-cross-domain
C'est vraiment joli :) moi ça me rappelle Oblivion/Skyrim.
Aucun problème avec 4G sous un i3, c'est un Asus. Bon, ok, dans certains plans (surtout les grands paysages) les fps c'était pas la gloire mais, perso, ça me dérange pas trop.
(via http://lehollandaisvolant.net/index.php?mode=links&id=20130502231245 )
Aucun problème avec 4G sous un i3, c'est un Asus. Bon, ok, dans certains plans (surtout les grands paysages) les fps c'était pas la gloire mais, perso, ça me dérange pas trop.
(via http://lehollandaisvolant.net/index.php?mode=links&id=20130502231245 )