IT |
ITmedia 総合記事一覧 |
[ITmedia ビジネスオンライン] 丸亀製麺のうどん弁当が2000万食を突破 増収にも寄与 |
https://www.itmedia.co.jp/business/articles/2204/14/news142.html
|
itmedia |
2022-04-14 21:42:00 |
js |
JavaScriptタグが付けられた新着投稿 - Qiita |
create-react-appでReact18がインストールされた後にReact17へ戻す方法(JavaScript編) |
https://qiita.com/GrowUp-Haruno/items/93c94b5f314655ed457e
|
createreactappでReactがインストールされた後にReactへ戻す方法JavaScript編createreactappでReactがインストールされた後にReactへ戻す方法JavaScript編先日、ReactがリリースされてCRAもReactに対応しました。 |
2022-04-14 21:20:22 |
AWS |
AWSタグが付けられた新着投稿 - Qiita |
Amazon AWSにおける、リージョンごとのAZなどの数 |
https://qiita.com/MH35JP/items/1df91ccd2874e09c3598
|
amazonaws |
2022-04-14 21:51:52 |
Docker |
dockerタグが付けられた新着投稿 - Qiita |
docker, rails, mysql, skip-javascript, skip-turbolinks, webpackの環境構築 |
https://qiita.com/kkosuke/items/3f73d14e549a06070b65
|
dockerrailsmysqlskip |
2022-04-14 21:03:25 |
golang |
Goタグが付けられた新着投稿 - Qiita |
【Go, FileServer】画像の配信 |
https://qiita.com/michida/items/fdd0d71559b0f9ce9c7e
|
skinparamre |
2022-04-14 21:20:25 |
Ruby |
Railsタグが付けられた新着投稿 - Qiita |
Rubyで気象庁過去データからのスクレイピング |
https://qiita.com/zuuumiii/items/51e515328e3bcde0f985
|
積算温度 |
2022-04-14 22:00:19 |
Ruby |
Railsタグが付けられた新着投稿 - Qiita |
docker, rails, mysql, skip-javascript, skip-turbolinks, webpackの環境構築 |
https://qiita.com/kkosuke/items/3f73d14e549a06070b65
|
dockerrailsmysqlskip |
2022-04-14 21:03:25 |
技術ブログ |
Developers.IO |
S3からBigQueryへ連携する方法いろいろ(Omni/Transfer Service) |
https://dev.classmethod.jp/articles/bq-access-s3/
|
bigquery |
2022-04-14 12:13:04 |
海外TECH |
Ars Technica |
Ars Frontiers, the first Ars Technica conference, comes to DC |
https://arstechnica.com/?p=1846162
|
frontiers |
2022-04-14 12:00:27 |
海外TECH |
DEV Community |
NestJS: un framework Node.js complet ? |
https://dev.to/sfeircode/nestjs-un-framework-nodejs-complet--428
|
NestJS un framework Node js complet Cet article a étépubliédans le magazine Programmez n° paru le janvier Merci encore àeux et àSfeir pour cette opportunité De nos jours l informatique est un milieu qui évolue si rapidement que le time to market la durée entre la conception d une idée et le moment oùle produit fini arrive entre les mains des utilisateurs est devenu un indicateur primordial Pour produire rapidement des fonctionnalités les développeurs se basent depuis longtemps sur des frameworks qui sont conçus pour augmenter la productivitéen prenant en charge une partie de la complexitédu développement NestJS Nest est un framework open source conçu pour développer des applications sur la plateforme Node js Il est écrit en Typescript qu il supporte nativement bien qu il permette aussi de développer son application en Javascript Le véritable avantage de Nest est d accélérer le démarrage du projet en proposant une architecture inspirée d Angular qui permet aux équipes de développer des applications facilement testables scalables et maintenables dans le temps Il compte million de téléchargements hebdomadaires sur npm en avril Son fonctionnement peut être comparéàcelui de Spring pour Java avec un système d annotations et d injection de dépendances Nest a une documentation extrêmement claire fournie et détaillée avec un grand nombre d exemples d utilisations ce qui en fait un framework facile àprendre en main et sa communautéest très active Dans cet article nous allons voir ensemble un exemple d application écrite avec Nest la gestion d une liste personnelle de séries avec notes et commentaires Cette application permet de lister les avis sur des séries et de créer un nouvel avis àl aide d un formulaire Le code qui a servi d exemple est disponible sur github CeliaDoolaeghe my list of series Premiers pas et configurationEn tant que framework Nest a fait des choix en amont pour que les développeurs n aient pas àfaire la configuration du projet eux mêmes ce qui est une étape souvent longue àmettre en place et assez pénible mais qui n apporte aucune valeur métier Nest fournit donc une CLI qui va créer rapidement et facilement une application de base déjàconfigurée et prête àl emploi avec l arborescence suivante Le projet générémarche immédiatement il suffit de le lancer avec npm start et nous avons déjàune application qui tourne sur localhost même si elle ne fait qu afficher “Hello World dans le navigateur Nest fournit nativement la configuration de Typescript Eslint et Prettier qui s occupent respectivement du typage de Javascript de la vérification des conventions de code et du formatage Ces configurations restent modifiables si besoin et même supprimables comme n importe quelle autre dépendance Ce sont des outils qui sont largement utilisés par la communautédes développeurs Javascript car ils facilitent la gestion du projet et surtout sa maintenabilitédans le temps Dans le package json un certain nombre de scripts sont déjàdéfinis notamment les scripts nécessaires pour démarrer l application avec hot reload pour la phase de développement faire tourner eslint et prettier ou encore lancer les tests Nest installe et configure par défaut le framework de test Jest le plus répandu sur les applications Javascript Si on lance le script npm test nous avons déjà test qui passe qui est làpour l exemple Des tests end to end sont également présents dans le dossier test Nous pouvons bien sûr installer en plus n importe quelle dépendance souhaitée comme dans n importe quel projet Node js PerformancesPar défaut Nest est construit au dessus d Express le framework Node js open source le plus répandu Mais si la performance est au cœur de vos préoccupations Nest est également compatible avec Fastify un autre framework open source centrésur la performance Les modulesLa première complexitédans un projet c est l architecture pour assurer la maintenabilitédu projet dans le temps il faut une structure claire et scalable Il faut limiter au maximum l entropie c est à dire la tendance naturelle des projets informatiques àse complexifier avec le temps avec un impact sur la productivitédans le développement de nouvelles fonctionnalités Nest a fait le choix d une architecture modulaire chaque fonctionnalitésera vue comme un Module Un module se compose d abord d un ou plusieurs controllers qui exposent des routes Un module contient des providers qui sont des classes àcomportement métier base de données etc Un module peut exporter des classes et être importédans d autres modules Chaque module contient tout ce qui est nécessaire àson fonctionnement Prenons par exemple une fonctionnalitéqui servirait juste àcréer un avis sur une série Nous créons un module CreateReviewModule qui expose une route permettant de noter une série en laissant un commentaire Module controllers CreateReviewController imports MongooseModule forFeature name SeriesReview name schema SeriesReviewSchema providers CreateReviewRepository CommentChecker export class CreateReviewModule Ici on voit que notre module expose un controller CreateReviewController qui contient la route Il importe le module Mongoose un ORM qui gère pour nous le mapping entre nos entités et la base de données MongoDB dans laquelle nous allons stocker les notes et commentaires des séries l ORM n est pas obligatoire àvous de choisir pour un exemple comme ici c est plus simple Enfin nous voyons dans les providers deux classes CreateReviewRepository qui est chargéde la sauvegarde en base de données et CommentChecker qui sera chargéde vérifier que le contenu du commentaire est autorisé par exemple pour éviter de sauvegarder un commentaire avec du langage injurieux Toutes les classes qui sont répertoriées dans les providers peuvent ensuite être injectées dans les controllers ou les autres providers Les classes exportées par les modules que nous importons peuvent également être injectées dans les classes de notre module Dans cet exemple on voit facilement le périmètre de notre fonctionnalité toutes les dépendances de notre controller sont listées dans ce module Lorsqu on parle de maintenabilitédans le temps la capacitéàanticiper les impacts de changements dans notre code compte beaucoup et l architecture préconisée par Nest permet de plus facilement prédire les impacts de nos changements Cette architecture est également scalable car l ajout de nouveaux modules n impactent pas ceux qui sont déjàprésents chaque nouvelle fonctionnalitévient juste s ajouter dans le root module c est à dire celui qui va ensuite importer tous les autres modules La complexitélocale dans les modules reste liée àla complexitémétier et non àla taille du projet Par exemple dans notre projet nous pouvons imaginer deux modules un pour lister les avis existants et un autre pour créer un nouvel avis Les deux modules se servent du même module Mongoose pour la base de données mais peuvent aussi avoir besoin d autres modules propres par exemple pour récupérer les affiches des séries dans la liste des avis Chaque module n importe que ce dont il a besoin dans un souci de responsabilitélimitée Injection de dépendancesAvant d aller plus loin faisons un petit apartésur l injection de dépendances A la base c est le cinquième des principes SOLID de la Programmation Orientée Objet D pour Dependency Inversion L idée est qu une classe de “haut niveau gestion des règles métier ne soit pas directement liée àune classe de “bas niveau gestion de l infrastructure Par exemple on crée une interface avec des fonctions de lecture en base de données et on injecte dans les classes métier une classe qui implémente cette interface Ce qui est intéressant ici c est que notre classe métier n a pas la responsabilitéd instancier la classe qui lit en base de données elle s attend àavoir une classe qui respecte la bonne interface et peut donc appeler ses fonctions sans se soucier de l implémentation Notre classe métier n a pas besoin de savoir que cette implémentation est en MongoDB ou PostgreSQL ou encore un mock pour les tests unitaires nous y reviendrons dans le paragraphe sur les tests On sépare bien les responsabilités de chaque classe En tout cas c est sur ce principe que se base Nest en déclarant une classe en tant que provider dans un module elle devient injectable dans les autres classes du module Maintenant nous allons voir concrètement comment construire le code autour de ce principe Controller et validationCréons maintenant une route pour donner son avis sur une série Il s agit d une route POST puisque nous créons un nouvel avis Un avis contient le titre de la série une note comprise entre et et un commentaire optionnel La première chose àfaire en dehors des tests si vous faites du TDD ici nous y reviendrons après est de créer la route d ajout de commentaire C est le rôle du Controller qui va répondre lors d un appel àla route Nest fournit les annotations nécessaires pour créer une route Post récupérer le body et retourner automatiquement un statut Created si aucune exception n est renvoyée Il ne reste donc au développeur qu àimplémenter le vrai code métier àsavoir vérifier que si un commentaire est présent alors il doit être valide sans contenu injurieux puis sauvegarder cet avis en base de données Controller export class CreateReviewController constructor private commentChecker CommentChecker private createReviewRepository CreateReviewRepository Post series reviews async grade Body gradeRequest ReviewRequest Promise lt void gt if gradeRequest comment const isValidComment this commentChecker check gradeRequest comment if isValidComment throw new BadRequestException message This comment is not acceptable await this createReviewRepository save gradeRequest Comme on peut le voir ici les classes CommentChecker et CreateReviewRepository sont des dépendances injectées par le constructeur qui est gérépar Nest grâce au module que nous avons déclaréplus tôt L annotation Post est suffisante pour déclarer la route àNest L annotation Body permet de récupérer le body qui est envoyédans le Post qu on peut directement typer On renvoie ici Promise lt void gt car Nest s occupe de renvoyer un statut par défaut sur les routes Post bien qu on puisse surcharger ce comportement si besoin Finalement en plus des annotations nous n avons écrit que les règles métier de gestion des avis et c est ce qui compte passer du temps sur la valeur métier apportée par notre code et non la forme pour le faire fonctionner qui est gérée par le framework Il ne reste qu àimplémenter les fonctions dans les classes CommentChecker et CreateReviewRepository et nous avons làune route opérationnelle A noter ici que si le commentaire est invalide nous renvoyons une exception de type BadRequestException qui contient le statut Bad Request et dans lequel nous passons juste un message explicatif Validation du bodyQuand on soumet une requête il faut d abord valider que le body soumis répond ànos spécifications tous les champs obligatoires doivent être présents la note doit être numérique etc Il existe deux dépendances class validator et class transformer qui permettent d assurer cette validation àtravers des annotations sur la classe du body Ici nous appliquons des règles de validation sur la classe ReviewRequest export class ReviewRequest ApiProperty description Title of the series IsNotEmpty title string ApiProperty description Grade between and IsNumber Min Max grade number ApiPropertyOptional description A comment on the series IsOptional IsNotEmpty comment string constructor title string grade number comment string this title title this grade grade this comment comment Chaque champ se voit associer ses règles de validation Le titre ne doit pas être vide La note doit être numérique et sa valeur doit être comprise entre et Le commentaire est optionnel mais s il est présent il ne doit pas être vide Les annotations sont très explicites ici et permettent de mettre en place les règles de validation les plus simples Si la validation du body échoue alors Nest renvoie un statut Bad Request avec un message qui indique quel champ est en erreur et pour quelle raison Il est aussi possible de faire des validations sur des tableaux vérifier qu il n est pas vide que chaque élément du tableau correspond aux règles énoncées etc Les annotations disponibles sont très riches Et si ma validation est plus complexe Parfois nous avons besoin d exprimer des règles qui ne font pas partie des annotations de validation proposées par défaut Dans ce cas il est d abord possible de créer ses propres annotations pour exécuter une vérification spécifique sur un champ Par exemple on peut vérifier qu une chaîne de caractères commence bien par un mot spécifique si c est notre besoin Mais on peut aussi imaginer une validation qui nécessiterait de lire plusieurs champs Par exemple dans notre cas si la note associée àun avis est basse on peut exiger que le commentaire soit obligatoire pour justifier cette note tout en le laissant optionnel sinon Comment gérer ce cas On peut créer un Pipe de validation C est une classe dont le comportement s exécute avant que le controller ne récupère le body Elle a accès àl objet en entrée en entier et laisse le soin au développeur d écrire les règles de validation Nous pouvons donc implémenter de cette manière n importe quelle règle de validation d un objet pour s assurer qu il soit bien valide lorsqu il arrive dans le controller Dans notre exemple si la note est inférieure à et qu il n y a pas de commentaire alors nous renvoyons une BadRequestException sinon l objet est valide Injectable export class MandatoryCommentOnBadGradePipe implements PipeTransform transform value unknown ReviewRequest const reviewRequest plainToClass ReviewRequest value if reviewRequest grade lt amp amp reviewRequest comment throw new BadRequestException Comment is mandatory when grade is lower than return reviewRequest SwaggerLes plus attentifs l auront remarqué àquoi servent les annotations ApiProperty Une fois que notre route est en place nous avons envie de la tester Bien sûr nous pouvons utiliser curl Postman ou n importe quel autre outil permettant de faire des appels d API Mais l éco système autour de Nest fournit des dépendances permettant de générer dynamiquement la documentation Swagger àpartir des annotations La mise en place est très simple il suffit de quelques lignes dans le fichier main ts pour que cette documentation soit déployée sur une route de notre application Pour notre route de création d un avis le rendu donnerait Le schéma du body est directement générépar les annotations ApiProperty et ApiPropertyOptional et la description qu ils contiennent On obtient une documentation standard facile àpartager car directement hébergée sur notre application et facile àutiliser grâce àl option “Try it out nous reviendrons sur l authentification par la suite Tests unitairesChose promise chose due nous allons parler maintenant des tests unitaires Pour qu une application reste maintenable dans le temps il ne suffit pas que l architecture nous aide àcomprendre les fonctionnalités impactées par nos changements il faut aussi que des tests unitaires et ou end to end soient présents pour assurer que nos changements ne créent pas de régressions dans les règles métier déjàexistantes Grâce àl injection de dépendances évoquée plus tôt les classes implémentées sont facilement testables unitairement car les dépendances peuvent être mockées c est à dire remplacées par des fausses instances oùnous contrôlons le comportement et les retours Pour tester un controller Nest fournit les outils pour créer des modules de test oùl on peut injecter nos dépendances mockées let app INestApplication let commentCheckerMock CommentChecker let createReviewRepository CreateReviewRepository beforeEach async gt commentCheckerMock as CommentChecker commentCheckerMock check jest fn mockReturnValue true createReviewRepository as CreateReviewRepository createReviewRepository save jest fn const moduleFixture TestingModule await Test createTestingModule controllers CreateReviewController providers CommentChecker CreateReviewRepository overrideGuard AuthGuard useValue overrideProvider CommentChecker useValue commentCheckerMock overrideProvider CreateReviewRepository useValue createReviewRepository compile app moduleFixture createNestApplication app useGlobalPipes new ValidationPipe await app init it valid review with no comment gt return request app getHttpServer post series reviews send title Test grade expect Ici nous créons une fausse instance de CommentChecker et de CreateReviewRepository nous utilisons Jest pour la fausse implémentation des fonctions de ces deux classes et nous les fournissons en providers au module de test Ensuite il ne reste dans le test qu àappeler la route et vérifier le retour Nous pouvons ensuite créer des tests pour tous les cas gérés par notre code renvoyer une erreur si l un des champs obligatoires est manquant si la note n est pas comprise entre et si le commentaire est injurieux etc Bien sûr les tests peuvent parfaitement être écrits avant l implémentation comme préconisépar le TDD Test Driven Development Sécuritéet AuthentificationLa plupart des applications ne sont pas accessibles librement au grand public et nécessitent donc d être sécurisées Les préconisations classiques telles que l installation de la dépendance helmet pour pré configurer les headers HTTP par exemple sont toujours de mise et ne doivent pas être oubliées Elle fait d ailleurs partie des recommandations de sécurité de Nest Pour gérer l authentification dans une application Node js en express par exemple nous pourrions utiliser un middleware spécifique c est à dire une fonction qu on applique sur des routes et qui s exécutent avant que les controllers ne soient appelés Dans Nest les middlewares existent aussi ils ont la même définition mais ne sont pas la solution idéale préconisée Les guards marchent sur le même modèle mais ont l avantage de connaître le contexte dans lequel ils sont appelés ils savent quelle route est appelée mais aussi quel controller sera exécutési la validation passe Un guard peut se faire injecter une dépendance par exemple un service qui gère la vérification d un token Ici nous avons un exemple de guard qui protège les routes àl aide d une authentification de type Basic c est à dire que les requêtes HTTP ont un header authorization qui contient username et password encodés en base On vérifie ensuite que l utilisateur est bien reconnu par l application Injectable export class AuthGuard implements CanActivate constructor private authService AuthService async canActivate context ExecutionContext Promise lt boolean gt const request context switchToHttp getRequest lt Request gt if request headers authorization throw new UnauthorizedException const basic token request headers authorization split const isValidToken await this authService validateBasicToken token if basic Basic isValidToken throw new UnauthorizedException return true L authentification Basic n est pas la méthode la plus sûre mais ce modèle est compatible avec d autres techniques d authentification comme JWT Pour appliquer ce guard il suffit d ajouter ànos controllers l annotation UseGuard AuthGuard Nous aurions aussi pu définir ce guard en global dans le module AppModule Nos routes sont désormais sécurisées et le SwaggerModule peut prendre une option qui permet de saisir l authentification basique directement depuis le swagger Interface avec Nest MVCNous avons maintenant une route pour donner un avis sur une série mais le swagger n est pas vraiment adaptépour la plupart des utilisateurs non développeurs…L idéal serait de créer un petit formulaire qui soumet l avis ànotre API On peut bien sûr brancher une interface externe ànos apis Nest est compatible avec toutes les dépendances npm comme cors par exemple qui autorise les appels cross origin entre un frontend et un backend qui ne seraient pas hébergés sur le même domaine Sinon Nest permet d implémenter toutes les facettes du MVC Model View Controller nous avons déjàvu les parties Model et Controller précédemment mais nous pouvons aussi implémenter la partie View directement Il s agit ici de faire des vues simples avec un langage de templating type handlebars ou ejs pour faire du SSR Server Side Rendering Pour des interfaces complexes ou hautement dynamiques cela ne sera peut être pas suffisant mais pour notre formulaire ce sera parfait Tout d abord il faut écrire le fichier handlebars qui contiendra notre formulaire Il s agit làd une page de html classique avec du templating de type mustache dans lequel on peut ajouter du css pour le design et du js pour les comportements par exemple pour vérifier les valeurs des champs obligatoires avant la soumission du formulaire Du point de vue de Nest notre interface est un module comme les autres qu il faut donc importer dans AppModule Notre controller fait simplement le lien entre le fichier create review hbs et la route interface dans le navigateur Controller export class CreateReviewFormController Get interface ApiExcludeEndpoint Render create review createReviewForm void Rendering form Si nous avons besoin d injecter des valeurs dans la page àl aide du templating il suffit que le controller renvoie un objet contenant les valeurs àafficher Ici nous n en avons pas besoin L annotation ApiExcludeEndpoint évitera àcette route propre àl interface de se retrouver dans le swagger Lorsque nous entrons l url http localhost interface dans le navigateur nous pouvons désormais voir notre formulaire Le design est très simple dans cet exemple mais l important est d avoir une interface qui permet àdes utilisateurs ne maîtrisant pas swagger d utiliser notre application On peut bien sûr faire des interfaces bien plus jolies que celle ci On pourrait d ailleurs l étendre avec une autre page permettant de lister les séries pour lesquelles un avis a étéposté afficher dans un encart la série ayant obtenu la meilleure moyenne etc Chaque écran supplémentaire sera simplement un module de plus àajouter dans l application Les points forts et points faibles de NestJSNest possède de nombreux avantages lorsqu il s agit de démarrer une nouvelle application D abord la CLI permet d avoir immédiatement un projet opérationnel L architecture modulaire préconisée permet l évolutivitéet la maintenabilitédans le temps en gardant la maîtrise de la complexité Nest permet l utilisation de n importe quelle dépendance externe et ne se ferme pas àde nouveaux usages La communautéest très réactive et de nombreux cas d usage sont documentés En revanche le framework est très riche et complexe et on peut facilement se perdre dans la documentation lorsqu on bloque sur un point très précis D ailleurs il n est pas rare de devoir rechercher sur Google comment faire une chose précise par exemple injecter un service dans un guard plutôt que de se baser sur la documentation D ailleurs cette documentation manque parfois de conseils sur des bonnes pratiques pour justement garantir la maintenabilitédu projet Pour aller plus loinNest propose encore beaucoup d extensions qui permettent d enrichir son projet et que je n ai pas présentéici mais qu il peut être intéressant de découvrir On peut citer par exemple des préconisations pour la mise en place de CQRS ou de health checks ou encore l outil de génération de documentation Compodoc ConclusionNest est un framework sur lequel je travaille personnellement au quotidien et qui tourne en production d un site e commerce connu Il facilite grandement mon travail de développeuse car il apporte des réponses prêtes àl emploi àdes questions que tout projet soulève àun moment donné évolutivitéet maintenabilitédans le temps sécurité authentification etc Le framework est très riche et ce qu il ne fait pas peut être gérépar des outils externes car il n est pas ferméàl extension àtravers d autres dépendances Il fait ce qu on attend principalement d un framework c est à dire qu il nous soulage de la complexitéde l architecture du projet et nous laisse nous concentrer sur la complexitémétier de notre application celle qui apporte de la valeur ànos utilisateurs |
2022-04-14 12:12:05 |
Apple |
AppleInsider - Frontpage News |
Apple calls Meta hypocrites for nearly 50% commission on VR purchases |
https://appleinsider.com/articles/22/04/14/apple-calls-meta-hypocrites-for-nearly-50-commission-on-vr-purchases?utm_medium=rss
|
Apple calls Meta hypocrites for nearly commission on VR purchasesApple is torching Meta over the metaverse company s plans to charge developers up to for virtual goods sold through the Meta Quest store Meta s Horizon Worlds could take up to in commission feesOn Monday Meta announced it would take an additional cut from goods sold in Horizon Worlds after taking a platform fee for being on the Meta Quest Store In an email to MarketWatch Apple Senior Director of Corporate Communications Fred Sainz called the move hypocritical since Meta has previously criticized Apple s take Read more |
2022-04-14 12:53:33 |
Apple |
AppleInsider - Frontpage News |
Apple helped suppliers double clean energy use in 2021 |
https://appleinsider.com/articles/22/04/14/apple-helped-suppliers-double-clean-energy-use-in-2021?utm_medium=rss
|
Apple helped suppliers double clean energy use in Apple has announced that through its renewable energy efforts its supply chain avoided million metric tons of carbon emissions during Lisa Jackson VP of environment policy and social initiatives Credit AppleThrough efforts such as using the world s first low carbon aluminium in the iPhone SE Apple is continuing to progress toward a goal of becoming entirely carbon neutral by Now it has announced that over the course of the efforts of its suppliers meant the equivalent of removing three million cars from the road for one year Read more |
2022-04-14 12:16:46 |
海外TECH |
Engadget |
Apple's AirPods Pro are on sale for $175 again |
https://www.engadget.com/apples-airpods-pro-are-on-sale-for-175-again-124633984.html?src=rss
|
Apple x s AirPods Pro are on sale for againApple s best sounding earbuds have been discounted on and off throughout the past few months and now they re back down to one of the best prices we ve seen all year The AirPods Pro are percent off again at Amazon bringing them down to That s just about the lowest price we ve seen since the holiday shopping season they were cheaper earlier this month and it puts the Pros back in line with the rest of Apple s audio lineup which has been on sale for the past few days Buy AirPods Pro at Amazon If over ear headphones aren t your thing the AirPods Pro are your next best bet if you want an Apple device that has above average audio quality Not only do the AirPods Pro sound better than the company s standard earbuds but they also have strong ANC that blocks out most surrounding noises And you still get Transparency mode while lets you hop in and out of conversations easily and support for spatial audio They re also arguably the best AirPods to get if you care about fit since you can get a more accurate fit for your ear thanks to their interchangeable tips The AirPods Pro also have the H chip inside which enables things like hands free Siri access and quick pairing and switching between Apple devices It s one of the biggest draws of AirPods ーif you re steeped in the Apple ecosystem already these earbuds will work seamlessly with all of your gadgets The Pros should last for five hours before they need more juice and you ll get hours of total listening time when you employ the power kept in its MagSafe charging case With the Pros are back on sale you ll find that you can get most Apple headphones and earbuds at a discount right now The new third generation AirPods are down to and the second generation earbuds are on sale for only Even the AirPods Max are cheaper than usual at the time of writing this the space gray blue and silver models are down to thanks to a sale price and an additional coupon that knocks another off their final price Buy AirPods rd gen at Amazon Buy AirPods nd gen at Amazon Buy AirPods Max at Amazon Follow EngadgetDeals on Twitter for the latest tech deals and buying advice |
2022-04-14 12:46:33 |
海外TECH |
Engadget |
MIT engineers built a robot for emergency stroke surgeries |
https://www.engadget.com/mit-engineers-robot-emergency-stroke-surgeries-121643239.html?src=rss
|
MIT engineers built a robot for emergency stroke surgeriesRemote robotic assisted surgery is far from new with various educational and research institutions developing machines doctors can control from other locations over the years There hasn t been a lot of movement on that front when it comes to endovascular treatments for stroke patients which is why a team of MIT engineers has been developing a telerobotic system surgeons can use over the past few years The team which has published its paper in Science Robotics has now presented a robotic arm that doctors can control remotely using a modified joystick to treat stroke patients That arm has a magnet attached to its wrist and surgeons can adjust its orientation to guide a magnetic wire through the patient s arteries and vessels in order to remove blood clots in their brain Similar to in person procedures surgeons will have to rely on live imaging to get to the blood clot except the machine will allow them to treat patients not physically in the room with them nbsp There s a critical window of time after a stroke s onset during which endovascular treatment should be administered to save a patient s life or to preserve their brain function Problem is the procedure is quite complex and takes years to master It involves guiding a thin wire through vessels and arteries without damaging any of them after all Neurosurgeons trained in the procedure are usually found in major hospitals and patients in remote locations that have to be transported to these larger centers might miss that critical time window With this machine surgeons can be anywhere and still perform the procedure Another upside It minimizes the doctos exposure to radiation from X ray imaging During their tests the MIT engineers only had to train a group of neurosurgeons for an hour to use the machine By the end of that hour the surgeons were able to successfully use the machine to remove the fake blood clots in a transparent model with life size vessels replicating the complex arteries of the brain MIT professor and team member Xuanhe Zhao said quot We imagine instead of transporting a patient from a rural area to a large city they could go to a local hospital where nurses could set up this system A neurosurgeon at a major medical center could watch live imaging of the patient and use the robot to operate in that golden hour That s our future dream quot You can watch a demo of the machine below |
2022-04-14 12:17:13 |
海外TECH |
CodeProject Latest Articles |
Modernizing Java Apps and Data on Azure - Part Five: Data Modernization |
https://www.codeproject.com/Articles/5329179/Modernizing-Java-Apps-and-Data-on-Azure-Part-Five
|
azure |
2022-04-14 12:20:00 |
海外科学 |
NYT > Science |
How to Choose a Mental Health App |
https://www.nytimes.com/2022/04/13/well/mind/mental-health-apps-therapy.html
|
appthere |
2022-04-14 12:31:34 |
金融 |
RSS FILE - 日本証券業協会 |
諸外国における国民ID制度に関する調査 |
https://www.jsda.or.jp/anshin/mynumber/idtyousa.html
|
外国 |
2022-04-14 12:57:00 |
ニュース |
BBC News - Home |
Elon Musk makes offer to buy Twitter |
https://www.bbc.co.uk/news/business-61104231?at_medium=RSS&at_campaign=KARANGA
|
extraordinary |
2022-04-14 12:26:37 |
ニュース |
BBC News - Home |
Covid levels starting to fall in UK, says ONS |
https://www.bbc.co.uk/news/health-61106918?at_medium=RSS&at_campaign=KARANGA
|
onsabout |
2022-04-14 12:03:39 |
ニュース |
BBC News - Home |
PM vows to set record straight over claims he misled MPs over parties |
https://www.bbc.co.uk/news/uk-politics-61105335?at_medium=RSS&at_campaign=KARANGA
|
partygate |
2022-04-14 12:15:51 |
ニュース |
BBC News - Home |
GP sexually abused 48 patients over 35 years |
https://www.bbc.co.uk/news/uk-scotland-61107919?at_medium=RSS&at_campaign=KARANGA
|
examinations |
2022-04-14 12:41:39 |
ニュース |
BBC News - Home |
Which other countries send asylum seekers overseas? |
https://www.bbc.co.uk/news/uk-61106231?at_medium=RSS&at_campaign=KARANGA
|
rwanda |
2022-04-14 12:47:13 |
ビジネス |
ダイヤモンド・オンライン - 新着記事 |
マスク氏、ツイッターに買収提案 非公開化目指す - WSJ発 |
https://diamond.jp/articles/-/301690
|
非公開 |
2022-04-14 21:04:00 |
ビジネス |
不景気.com |
DDホールディングスの22年2月期は73億円の営業赤字、無配 - 不景気.com |
https://www.fukeiki.com/2022/04/dd-hd-2022-loss.html
|
飲食 |
2022-04-14 12:51:53 |
ビジネス |
不景気.com |
サマンサタバサの22年2月期は41億円の最終赤字、減損で - 不景気.com |
https://www.fukeiki.com/2022/04/samantha-thavasa-2022-loss2.html
|
最終赤字 |
2022-04-14 12:23:18 |
北海道 |
北海道新聞 |
<Fノート>新庄監督と落合博満氏 意外な共通点とは |
https://www.hokkaido-np.co.jp/article/669631/
|
落合博満 |
2022-04-14 21:17:04 |
北海道 |
北海道新聞 |
GW明けにも通常ダイヤへ 全線再開の東北新幹線 |
https://www.hokkaido-np.co.jp/article/669638/
|
東北新幹線 |
2022-04-14 21:16:00 |
北海道 |
北海道新聞 |
ポーランドで世界バレー 男子、ロシア開催中止 |
https://www.hokkaido-np.co.jp/article/669637/
|
世界バレー |
2022-04-14 21:16:00 |
北海道 |
北海道新聞 |
6月開催YOSAKOI パレード会場縮小 有料席のみ観覧可 |
https://www.hokkaido-np.co.jp/article/669635/
|
yosakoi |
2022-04-14 21:09:05 |
北海道 |
北海道新聞 |
道内の町村議「なり手不足」深刻化 統一地方選まで1年 |
https://www.hokkaido-np.co.jp/article/669634/
|
地方議員 |
2022-04-14 21:06:17 |
ビジネス |
東洋経済オンライン |
中国「民営リチウム大手」、先手の海外進出で躍進 贛鋒鋰業、2021年の売上高は倍増、純利益は5倍 | 「財新」中国Biz&Tech | 東洋経済オンライン |
https://toyokeizai.net/articles/-/580618?utm_source=rss&utm_medium=http&utm_campaign=link_back
|
biztech |
2022-04-14 21:30:00 |
コメント
コメントを投稿