Je fais beaucoup de Rust ces derniers temps et je cherchais un framework qui puisse m'aider à produire mes requêtes SQL en sachant que je voulais tout sauf une horreur orientée structures comme peut l'être le couple JPA / Hibernate.
Au détour d'un coup de fil, @LapinFeroce me parle de Diesel qui est l'équivalent de Ktorm mais pour Rust. Autant vous dire qu'à la simple lecture de l'exemple de la home page j'étais déjà conquise 😻
Comment calculer la retraite d'un assimilé salarié (en 2021) ?
En un code d'exemple :
// use macro_rules! <name of macro>{<Body>}
macro_rules! add {
// macth like arm for macro
($a:expr,$b:expr) => {
// macro expand to this code
{
// $a and $b will be templated using the value/variable provided to macro
$a+$b
}
}
}
// Usage in code
fn main(){
// call to macro, $a=1 and $b=2
add!(1,2);
}
Attention à ne pas abuser de la méta-programmation car cela peut augmenter significativement les temps de compilation.
Il implémente l'interface log qui est l'équivalent de SLF4J de Java/Kotlin mais pour Rust.
Il a la particularité de pouvoir se configurer directement dans le code en plus de fichier Yaml :
use log::LevelFilter;
use log4rs::append::console::ConsoleAppender;
use log4rs::append::file::FileAppender;
use log4rs::encode::pattern::PatternEncoder;
use log4rs::config::{Appender, Config, Logger, Root};
fn main() {
let stdout = ConsoleAppender::builder().build();
let requests = FileAppender::builder()
.encoder(Box::new(PatternEncoder::new("{d} - {m}{n}")))
.build("log/requests.log")
.unwrap();
let config = Config::builder()
.appender(Appender::builder().build("stdout", Box::new(stdout)))
.appender(Appender::builder().build("requests", Box::new(requests)))
.logger(Logger::builder().build("app::backend::db", LevelFilter::Info))
.logger(Logger::builder()
.appender("requests")
.additive(false)
.build("app::requests", LevelFilter::Info))
.build(Root::builder().appender("stdout").build(LevelFilter::Warn))
.unwrap();
let handle = log4rs::init_config(config).unwrap();
// use handle to change logger configuration at runtime
}
Et sa façade log reprend l'API de SLF4J mais sous forme de macros :
let world = "World";
trace!("Hello {}!", world);
debug!("Hello {}!", world);
info!("Hello {}!", world);
warn!("Hello {}!", world);
error!("Hello {}!", world);
À voir pour les performances, mais l'idée de reprendre l'API d'une façade qui a fait ses preuves pour y coller l'implémentation que l'on veut derrière est la bienvenue !
Vous voulez dire qu'abandonner sa concentration sur la route pendant plusieurs secondes pour toucher de manière précise un écran tactile stresse incroyablement les conducteurs.
En sachant que pour ces écrans, un simple effleurement de surface peut faire entrer dans un mauvais menu, augmentant d'autant le danger et la durée de manipulation, ce qui énerve plus encore.
Et que les conducteurs ont l'inquiétude de protéger leur sécurité et encore plus celle de ceux qu'ils transportent et ne sont pas amusés à faire joujou avec une interface différente pour chaque véhicule.
Et qu'il aura fallu presque 10 ans avant que ces retours ne prennent dans la tête des constructeurs automobiles mais qu'ils n'en parlent à cette heure qu'à demi-mot.
C'est gens-là se droguent ou sont-ils simplement stupides ? D'odieux connards peut-être ? (Oui je suis une conductrice agacée)
Plusieurs outils dédiés à l'amélioration d'images via modèles ML.
J'adore ce genre d'article. Il s'agit d'un "bug" hein, mais pas d'une tentative pour Microsoft de récupérer nos données confidentielles de navigation en dehors de tout cadre RGPD.
D'ailleurs, c'est tellement un "bug" que le code de Edge a été modifié pour envoyer toutes les URL visitées à l'adresse https://bingapis.com/api/v7/followweb/isfollowable*?, malgré les procédures de test et de contrôle qualité misent en œuvre chez Redmond.
Et puis c'est tellement un "bug" qu'à cette adresse a été développé un serveur dédié à la récupération de ces informations confidentielles de navigation pour les y stocker et les analyser.
Enfin, c'est tellement un "bug" que dernière cette adresse a été montée une infrastructure matérielle monstrueuse capable d'encaisser la charge de dingue que l'envoie de toutes ces données confidentielles de navigation implique.
Repense au passif de Microsoft et à la vie privée... Se dit que prétendre à un "bug" peut lui éviter un procès pour violation du RGPD... Doit faire partie des conspis, Microsoft est trop honnête n'est-ce pas ...?
Rappelons-nous qu'aucun citoyen européen n'a élu Ursula Van Der Leyen pour qu'elle siège à la tête de l'UE et qu'en conséquence, nous pouvons nous questionner sur la légitimité de ses décisions, notamment vis-à-vis du fait d'attaquer économiquement et militairement un pays allié comme la Russie.
En tout cas, prendre des décisions qui sabotent notre économie tout en valorisant celle des autres... Que va-t-il advenir de nos enfants lorsque des géants comment l'Inde, la Chine ou la Russie n'auront plus structurellement besoin de nous pour échanger...? #Facepalm
En trois étapes :
- Exécuter la commande
cargo install --color=always --force grcov
pour récupérer l'utilitaire (qui sera automatiquement ajouté à votre PATH user). - Démarrer Intellij IDEA.
- Installer / Activer le plugin Rust depuis la market place.
Enjoy
En résumé, la méthode du trait doit prendre en paramètre un
&Fn(X) -> Y
et non un
Fn(X) -> Y
Sinon, Rust ne peut pas garantir l'exécution de la fonction puisque le trait prendrait possession de la fonction. Or cette closure peut être un pointeur sur fonction, ce qui retirerait la propriété de cette dernière de sa structure.
Code d'exemple
fn fun_test(value: i32, f: &dyn Fn(i32) -> i32) -> i32 {
println!("{}", f(value));
value
}
fn times2(value: i32) -> i32 {
2 * value
}
fn main() {
fun_test(5, ×2);
}
Explication
Il y a trois types possibles de fonctions :
- Fn qui ne peut pas modifier l'objet qu'elle capture.
- FnMut qui peut modifier l'objet qu'elle capture.
- FnOnce la plus restrictive. Ne peut être appelée qu'une seule fois car une fois invoquée elle se consomme elle-même ainsi que l'objet qu'elle capture.
Ce qui est super c'est que la documentation possède un tableau comparant la complexité des différentes structures en fonction des cas d'utilisation.
Tout est dans le titre.
Donc les noms de domaine en .net
voire en .com
pourront être saisis par toute autorité, sans contrôle, ni jugement qui s'appuierait sur des accords internationaux :
(5) pour assurer le respect de la loi applicable, des règles ou réglementations gouvernementales, ou conformément à toute ordonnance légale ou assignation de tout gouvernement, autorité administrative ou gouvernementale, ou tribunal compétent [un nom de domaine pourra être transféré à l'autorité qui l'aura demandé].
Il y a des agents de la NSA au juridique de VeriSign en ce moment ? Espérons que ce soit rejeté, car mis à part un vilain pouet sur Mastodonte qu'avons-nous comme contre pouvoir effectif ? #Démocrature
Différences entre les enums Option et Result en Rust.
Il n'y a pas à dire, à chaque fois que je code et où le langage m'oblige à utiliser des Optional, je me dis que c'est un langage pourri. Et ceci inclus Rust malgré tout le bien que je pense de lui 😤 !
La meilleure façon de gérer les cas de nullité se trouve dans Kotlin 🥰, TypeScript et Groovy. Le type Optional est une technique archaïque et verbeuse quand on vient du null-check de Kotlin.
Mais bon j'ai déjà expliqué par le passé en quoi le paradigme fonctionnel pure était un cancer métastasé 🤮. Et entre C++ et Rust pour de la programmation système il n'y a plus vraiment de discussion à cette heure, donc faisons-nous violence avec les Optional.
Mon rêve serait un langage natif reprenant la syntaxe de Kotlin (sauf tout ce qui touche aux getter/setter) avec le borrow checker de Rust et qui produise des binaires natifs. Je pense que je peux rêver encore longtemps 🥲
J'aurai bien l'envie d'en rire si seulement ce genre de pensées destructrices du corps social ne se diffusait pas doucement dans notre société.
Si l'on écoute l'auteur, se lever tôt est aussi un acte raciste car il ramène à l'époque où les propriétaires d'esclaves les obligeaient à se lever à l'aube pour travailler dans les champs de coton.
C'est hyper dur parce qu'il faut que je protège mes enfants de ces bêtises qui déferlent sans cesse sur internet. C'est d'autant plus dur que pour expliquer que c'est du grand n'importe quoi, il faut y passer un temps prodigieux. Et c'est encore plus dur parce que le nombre de sales types qui surfent sur cette vague en recherche de profit ne fait que monter parce qu'il y a du profit à se faire (les articles sont clivants, font le buzz, sont mis en avant dans les algorithmes et rémunèrent plus).
@Timo as-tu lu la bio de l'auteur ?
Top writer in Racism
Comme si le racisme de 2023 aux USA était plus fort qu'au 19ème et 20ème siècles en plein apartheid... Pardon, il est effectivement plus fort, mais il s'agit d'un racisme qui s'est inverser. Les jeunes noirs haïssent les blancs parce qu'ils sont blancs, peu importe leur condition de vie, peu importe leur origine, peu importe leur réussite.
Mais heureusement, en changeant la définition du mot "racisme" on peut se permettre bien des choses. Les USA, cette poubelle !
Réponse => NON il ne l'est pas
(en tout cas en 2023 à l'heure où j'écris ceci)
Par contre les jeunes sont inscrits par défaut et il faut se désinscrire explicitement pour ne pas y participer de force. C'est du "pas obligatoire mais un peu forcé quand même"... #Macronie
Manipe à faire
Aller sur son compte volontaire sur le site du SNU (ou se le créer si besoin) et cliquer sur le bouton « Se désister du SNU ».
Je recommande à tous les parents de protéger leurs enfants de l'embrigadement et de la propagande d'état, sans même évoquer les violences et les abus des encadrants lors des séjours.
Merci @Sebsauvage pour son poste sur le SNU.
Voici le barème d'imposition sur les revenus actualisé pour 2023
Tranche de revenu imposable |
Taux d’imposition |
---|---|
0€ à 10 777€ |
0% |
10 778€ à 27 478€ |
11% |
27 479€ à 78 570€ |
30% |
78 571€ à 168 994€ |
41% |
Plus de 168 994€ |
45% |
L'article mentionne plusieurs techniques pour réduire son assiette imposable, mais cela revient globalement a dépenser ce que l'on a gagné dans quelque chose pour en récupérer une partie seulement.