投稿時間:2021-06-29 01:38:27 RSSフィード2021-06-29 01:00 分まとめ(52件)

カテゴリー等 サイト名等 記事タイトル・トレンドワード等 リンクURL 頻出ワード・要約等/検索ボリューム 登録日
IT 気になる、記になる… 新型「AirPods」は今年第3四半期、新型「AirPods Pro」は来年第2四半期に発売か https://taisy0.com/2021/06/29/142451.html fronttron 2021-06-28 15:18:29
TECH Engadget Japanese Apple TV+『ファウンデーション』は9月配信、新予告編公開。アシモフの銀河帝国をシリーズ化 https://japanese.engadget.com/foundation-series-apple-tv-plus-sept-teaser-trailer-2nd-150221888.html apple 2021-06-28 15:02:21
AWS AWS Marketplace Using Shutterstock’s image datasets to train your computer vision models https://aws.amazon.com/blogs/awsmarketplace/using-shutterstocks-image-datasets-to-train-your-computer-vision-models/ Using Shutterstock s image datasets to train your computer vision modelsImage classification and object detection technology allows you to build scalable artificial intelligence models for business cases like visual search product recommendations autonomous vehicle object recognition content moderation and more Today services like Amazon Rekognition offer APIs to perform image analysis and object recognition However if your use case requires a more custom image classification … 2021-06-28 15:53:45
python Pythonタグが付けられた新着投稿 - Qiita 【決定木】決定木を可視化しつつ、木分割アルゴリズムをまとめた(主にジニ不純度) https://qiita.com/ryuki999/items/c6c7d896061d7cca01c6 以上が決定木の分割のアルゴリズムになります。 2021-06-29 00:39:33
Program [全てのタグ]の新着質問一覧|teratail(テラテイル) 方針が合っているかはわかりませんが、リスト内の数字を合計する方法?がわかりません https://teratail.com/questions/346648?rss=all 方針が合っているかはわかりませんが、リスト内の数字を合計する方法がわかりません前提・実現したいこと「年の中の何日目かという数字を入力し、それが平年で何月何日になるかを表示するプログラムを書きなさい。 2021-06-29 00:59:39
Program [全てのタグ]の新着質問一覧|teratail(テラテイル) awkコマンドを一行ずつ読み込むと一行消えてしまう https://teratail.com/questions/346647?rss=all osprintnbspaposnbspssstxt 2021-06-29 00:53:10
Program [全てのタグ]の新着質問一覧|teratail(テラテイル) 【hover】左からボーダーラインを引きたい https://teratail.com/questions/346646?rss=all 【hover】左からボーダーラインを引きたいhoverアクションについてです。 2021-06-29 00:49:16
Program [全てのタグ]の新着質問一覧|teratail(テラテイル) 1つのアプリに複数のUnityファイルを配置する方法について https://teratail.com/questions/346645?rss=all Unityで作られたゲームを複数、同じスマホアプリのプロジェクト内に配置をして、一つクリックするとそのアプリ内でプレイできるようにしたいのですが、そのようなことは実装可能でしょうか。 2021-06-29 00:34:30
Program [全てのタグ]の新着質問一覧|teratail(テラテイル) python3問題集のenumerate()の問題で質問があります。 https://teratail.com/questions/346644?rss=all enumerate 2021-06-29 00:30:13
Program [全てのタグ]の新着質問一覧|teratail(テラテイル) WEB上で画像を開き、それをデータベースに登録する https://teratail.com/questions/346643?rss=all 2021-06-29 00:29:58
Program [全てのタグ]の新着質問一覧|teratail(テラテイル) エラーの改善をしたいです。 https://teratail.com/questions/346642?rss=all エラーの改善をしたいです。 2021-06-29 00:28:54
Program [全てのタグ]の新着質問一覧|teratail(テラテイル) SQLでviewを元にして作ったviewの値がnullになるときがあります。 https://teratail.com/questions/346641?rss=all SQLでviewを元にして作ったviewの値がnullになるときがあります。 2021-06-29 00:19:04
Program [全てのタグ]の新着質問一覧|teratail(テラテイル) Pythonの特殊メソッド__str__ について https://teratail.com/questions/346640?rss=all Pythonの特殊メソッドstrについて前提・実現したいことPythonの特殊メソッドstrについて調べていてstrは文字列を扱うときに必要とあリました。 2021-06-29 00:06:05
Program [全てのタグ]の新着質問一覧|teratail(テラテイル) JAVAFXで画面の作成をしたい https://teratail.com/questions/346639?rss=all JAVAFXで画面の作成をしたい前提・実現したいこと元々COBOLエンジニアでしたが、自分のスキルアップのためにJAVAを身に着けたいと思い、ここカ月JAVAの勉強をしております。 2021-06-29 00:01:14
Docker dockerタグが付けられた新着投稿 - Qiita Elastic StackをDocker上で実行してログモニタリングサービスを作成するまで④ - Spring Boot編 https://qiita.com/sgr0416st/items/3bb415783f1464aa7df6 デフォルトではfilebeatがログを読みこむ時間は秒おきになっていますこの様に検索結果が変わって新しいログを取得できた方、おめでとうございますこれで最終目標である「簡単なSpringWebアプリケーションをローカルで実行、ログを作成してそれをKibanaで可視化する」を達成することができました長いシリーズに渡ってこの記事を読んでくださりありがとうございました終わりに一つ一つは簡単でしたが、たびたび設定のミスがおきたため予想外に時間がかかってしまいました。 2021-06-29 00:54:49
Docker dockerタグが付けられた新着投稿 - Qiita Elastic StackをDocker上で実行してログモニタリングサービスを作成するまで③ - filebeat編 https://qiita.com/sgr0416st/items/74723ba2bb5667f5411a 初回のみKibanaに手動でindexpatternを登録する必要があるので、Kibanahttplocalhostにアクセスして、ホーム左上のアイコンからStackManagementgtIndexPatternsへと進んでCreateIndexPatternを選択してください。 2021-06-29 00:53:52
Docker dockerタグが付けられた新着投稿 - Qiita Elastic StackをDocker上で実行してログモニタリングサービスを作成するまで② - Kibana編 https://qiita.com/sgr0416st/items/28dc2df02bb946f94209 すると、DevToolsが開くので、まずは以下のコマンドをコピペして実行し、Elasticsearchと接続ができているか確認しましょう。 2021-06-29 00:52:26
Docker dockerタグが付けられた新着投稿 - Qiita Elastic StackをDocker上で実行してログモニタリングサービスを作成するまで① - Elasticsearch編 https://qiita.com/sgr0416st/items/d0d00723b49c3935137e ElasticStackをDocker上で実行してログモニタリングサービスを作成するまで①Elasticsearch編背景業務でElasticsearchを可視化するKibanaというツールを利用してログをモニタリングしているのですが、裏でどのような技術がどのように使われているのか理解していなかったためプロトタイプを実際に開発してみることで理解を深めようという目的で作ってみました。 2021-06-29 00:52:07
海外TECH Ars Technica Qualcomm does the bare minimum for the new Snapdragon 888 Plus SoC https://arstechnica.com/?p=1776701 improvements 2021-06-28 15:19:45
海外TECH Ars Technica How SNES emulators got a few pixels from complete perfection https://arstechnica.com/?p=1662472 emulation 2021-06-28 15:06:47
海外TECH DEV Community Provisioning an RDS Database with CloudFormation https://dev.to/aws/provisioning-an-rds-database-with-cloudformation-part-2-i6n Provisioning an RDS Database with CloudFormationIn part we automated the provisioning of your Amazon EC instance using AWS CloudFormation When you built the EC instance manually in the past you were seeing inconsistencies between environments had to manually test your infrastructure setup manually deploy your team s web app which happens all to infrequently All of this has been error prone and time consuming Bugs introduced into production code are more difficult and expensive to fix and your customers were ultimately the ones who suffered In addition to the EC instance you also need a Postgresql database In the past it was running on the same instance as your webapp and sometimes web app traffic impacted the database and vice versa In this post part you ll add an Amazon RDS Postgresql database to the CloudFormation template you built in part so that both the EC instance and the database can be provisioned together as a set of resources And since RDS is a managed service you won t have to do operating system patches or database patches ーit s all managed for you And eventually you want to introduce a continuous integration continuous deployment CI CD pipeline to automate the build test and deploy phases of your release process Both part and part set you up to do that As a reminder here s what we covered and where we re going automate the provisioning of your Amazon EC instance using AWS CloudFormation part add an Amazon RDS Postgresql database to your stack with CloudFormation this post part andcreate an AWS CodePipeline with CloudFormation part PrerequisitesTo work through the examples in this post you ll need an AWS account you can create your account here if you don t already have one the AWS CLI installed you can find instructions for installing the AWS CLI here anda key pair to use for SSH you can create a key pair following these instructions Unfamiliar with CloudFormation or feeling a little rusty Check out part or my Intro to CloudFormation post before getting started Updating the CloudFormation TemplateFirst we ll add the RDS database and then we ll add a security group to allow inbound traffic on port At the end of this post you ll delete the stack you ve created and any snapshots so that you don t incur any charges and then you can quickly customize and recreate the stack in the future Just want the code Grab it here Let s get started Add RDS Postgresql DatabaseFirst we ll add an RDS database resource with the type AWS RDS DBInstance to the CloudFormation template We set the Engine to the database engine we want to use in this case postgres rds yamlAWSTemplateFormatVersion Description Part Add a database with CloudFormationParameters AvailabilityZone Type AWS EC AvailabilityZone Name EnvironmentType Description Specify the Environment type of the stack Type String Default dev AllowedValues dev test prod AmiID Type AWS SSM Parameter Value lt AWS EC Image Id gt Description The ID of the AMI Default aws service ami amazon linux latest amzn ami hvm x gp KeyPairName Type String Description The name of an existing Amazon EC key pair in this region to use to SSH into the Amazon EC instances DBInstanceIdentifier Type String Default webapp db DBUsername NoEcho true Description Username for Postgresql database access Type String MinLength MaxLength AllowedPattern a zA Z a zA Z ConstraintDescription Must begin with a letter and contain only alphanumeric characters Default postgres DBPassword NoEcho true Description Password Postgresql database access Type String MinLength MaxLength AllowedPattern a zA Z ConstraintDescription Must contain only alphanumeric characters Mappings EnvironmentToInstanceType dev InstanceType t nano test InstanceType t micro prod InstanceType t smallResources WebAppInstance Type AWS EC Instance Properties AvailabilityZone Ref AvailabilityZone ImageId Ref AmiID InstanceType FindInMap EnvironmentToInstanceType Ref EnvironmentType InstanceType KeyName Ref KeyPairName SecurityGroupIds Ref WebAppSecurityGroup WebAppSecurityGroup Type AWS EC SecurityGroup Properties GroupName Join webapp security group Ref EnvironmentType GroupDescription Allow HTTP HTTPS and SSH inbound and outbound traffic SecurityGroupIngress IpProtocol tcp FromPort ToPort CidrIp IpProtocol tcp FromPort ToPort CidrIp IpProtocol tcp FromPort ToPort CidrIp WebAppEIP Type AWS EC EIP Properties Domain vpc InstanceId Ref WebAppInstance Tags Key Name Value Join webapp eip Ref EnvironmentType WebAppDatabase Type AWS RDS DBInstance Properties DBInstanceIdentifier Ref DBInstanceIdentifier AllocatedStorage DBInstanceClass db t small Engine postgres MasterUsername Ref DBUsername MasterUserPassword Ref DBPassword Tags Key Name Value Join webapp rds Ref EnvironmentType DeletionPolicy Snapshot UpdateReplacePolicy SnapshotOutputs WebsiteURL Value Sub http WebAppEIP Description WebApp URL WebServerPublicDNS Description Public DNS of EC instance Value GetAtt WebAppInstance PublicDnsName WebAppDatabaseEndpoint Description Connection endpoint for the database Value GetAtt WebAppDatabase Endpoint AddressIn the template above we ve also added new parameters to customize the name of the database the username and password as well as two new outputs to make our work easier WebServerPublicDNS and WebAppDatabasePublicDNS We ll use both of these outputs in step If you re creating your stack from scratch you can run the create stack command aws cloudformation create stack stack name rds example template body file rds yaml parameters ParameterKey AvailabilityZone ParameterValue us east a ParameterKey EnvironmentType ParameterValue dev ParameterKey KeyPairName ParameterValue jenna ParameterKey DBPassword ParameterValue AbcdOr if you re updating the stack you created in part you can use the update stack command instead Notice that we re only specifying the new DBPassword parameter and relying on the default values for DBInstanceIdentifier and DBUsername that are specified in the template If you d like to customize these values you can add them to the command in the same ParameterKey ParameterValue format shown above DeletionPolicy and UpdateReplacePolicyYou may have also noticed the DeletionPolicy and UpdateReplacePolicy properties set to Snapshot If and when you ever need to re provision the database you ll want to make sure you don t lose your precious data Some template changes will require the resource to be recreated as opposed to updated When this happens you ll want to be in control of how that happens and what happens to your data These two properties give you that control In the case of Snapshot CloudFormation will create a snapshot of the database when the stack is updated or deleted You can read more about update and delete behaviors of stack resources here After creating or updating the stack you ll now have your EC instance and supporting resources from part and an RDS database Right now no one can access that database instance from the outside world so next we ll enable inbound traffic to the Postgresql port Enable Inbound Traffic on Port To allow inbound traffic on port so that our EC instance can talk to the RDS database we ll add a security group with type AWS EC SecurityGroup rds yamlAWSTemplateFormatVersion Description Part Add a database with CloudFormationParameters AvailabilityZone Type AWS EC AvailabilityZone Name EnvironmentType Description Specify the Environment type of the stack Type String Default dev AllowedValues dev test prod AmiID Type AWS SSM Parameter Value lt AWS EC Image Id gt Description The ID of the AMI Default aws service ami amazon linux latest amzn ami hvm x gp KeyPairName Type String Description The name of an existing Amazon EC key pair in this region to use to SSH into the Amazon EC instances DBInstanceIdentifier Type String Default webapp db DBUsername NoEcho true Description Username for Postgresql database access Type String MinLength MaxLength AllowedPattern a zA Z a zA Z ConstraintDescription Must begin with a letter and contain only alphanumeric characters Default postgres DBPassword NoEcho true Description Password Postgresql database access Type String MinLength MaxLength AllowedPattern a zA Z ConstraintDescription Must contain only alphanumeric characters Mappings EnvironmentToInstanceType dev InstanceType t nano test InstanceType t micro prod InstanceType t smallResources WebAppInstance Type AWS EC Instance Properties AvailabilityZone Ref AvailabilityZone ImageId Ref AmiID InstanceType FindInMap EnvironmentToInstanceType Ref EnvironmentType InstanceType KeyName Ref KeyPairName SecurityGroupIds Ref WebAppSecurityGroup WebAppSecurityGroup Type AWS EC SecurityGroup Properties GroupName Join webapp security group Ref EnvironmentType GroupDescription Allow HTTP HTTPS and SSH inbound and outbound traffic SecurityGroupIngress IpProtocol tcp FromPort ToPort CidrIp IpProtocol tcp FromPort ToPort CidrIp IpProtocol tcp FromPort ToPort CidrIp WebAppEIP Type AWS EC EIP Properties Domain vpc InstanceId Ref WebAppInstance Tags Key Name Value Join webapp eip Ref EnvironmentType WebAppDatabase Type AWS RDS DBInstance Properties DBInstanceIdentifier Ref DBInstanceIdentifier VPCSecurityGroups GetAtt DBECSecurityGroup GroupId AllocatedStorage DBInstanceClass db t small Engine postgres MasterUsername Ref DBUsername MasterUserPassword Ref DBPassword Tags Key Name Value Join webapp rds Ref EnvironmentType DeletionPolicy Snapshot UpdateReplacePolicy Snapshot DBECSecurityGroup Type AWS EC SecurityGroup Properties GroupName Join webapp db security group Ref EnvironmentType GroupDescription Allow postgres inbound traffic SecurityGroupIngress IpProtocol tcp FromPort ToPort SourceSecurityGroupName Ref WebAppSecurityGroup Tags Key Name Value Join webapp db security group Ref EnvironmentType Outputs WebsiteURL Value Sub http WebAppEIP Description WebApp URL WebServerPublicDNS Description Public DNS of EC instance Value GetAtt WebAppInstance PublicDnsName WebAppDatabaseEndpoint Description Connection endpoint for the database Value GetAtt WebAppDatabase Endpoint AddressIn the template above we ve added the database security group and added it to the VPCSecurityGroups property We ve also set SourceSecurityGroupName to the WebAppSecurityGroup we created earlier to restrict the inbound traffic to that coming from the WebAppSecurityGroup or our EC instance To update your stack you ll use the update stack command with the same parameters and values as before aws cloudformation update stack stack name rds example template body file rds yaml parameters ParameterKey AvailabilityZone ParameterValue us east a ParameterKey EnvironmentType ParameterValue dev ParameterKey KeyPairName ParameterValue jenna ParameterKey DBPassword ParameterValue AbcdNow you should have your EC instance and supporting resources from part an RDS database and another security group exposing the database port But how do we know the EC instance can talk to the database Testing the Security GroupTo test your security group to make sure your EC instance can talk to the RDS database you provisioned in the last step you can SSH into the instance and use the psql client to connect to the database If you don t remember how to SSH into the instance you can read more about that in part or grab the WebServerPublicDNS from the Outputs Using the command below replace the WebServerPublicDNS and YOUR KEY PAIR NAME parts and SSH into the intstance ssh i YOUR KEY PAIR NAME pem ec user WebServerPublicDNSOnce you re in the EC instance you ll need to enable the postgresql library from the Amazon Linux Extras repository and then install it We could do this all in our CloudFormation template but this is only for demonstration purposes so we ll do it manually this one time You can run these commands to do that sudo amazon linux extras list Find the postgresql library and version to enable in the next commandsudo amazon linux extras enable postgresql ysudo yum clean metadatasudo yum install postgresqlNow that psql is available you can test the connection to the database like this replacing WebAppDatabaseEndpoint with the corresponding value in the Outputs psql h WebAppDatabaseEndpoint U postgres d postgresPassword for user postgres psql server SSL connection protocol TLSv cipher ECDHE RSA AES GCM SHA bits compression off Type help for help postgres gt Congrats You ve successfully allowed your EC instance to talk to your RDS database If the connection isn t successful check the CloudFormation console to make sure the RDS database and security group resources were created successfully Additionally you can check to make sure the database has the security group attached and the inbound rule opens up port the default postgres port Wrapping Up Delete Your Stack amp SnapshotsDon t forget to delete your stack so you don t accrue charges You can do that with the delete stack command aws cloudformation delete stack stack name rds exampleIf you left the DeletionPolicy and UpdateReplacePolicy properties set to snapshot and you no longer need those snapshots then you can also delete those snapshots using the AWS Console so you don t accrue charges for those either Navigate to the RDS Management Console From there go to the Snapshots menu option Select the snapshots created from your stack hint they will have a snapshot name that starts with your stack name and select Delete snapshot from the Actions menu What You LearnedIn this post we updated the CloudFormation template from part to provision an RDS database and enabled inbound traffic for the database Now that both your EC instance and RDS database and supporting resources are all managed with code you can setup and teardown the stack of resources together This sets you up for part where we ll create an AWS CodePipeline with CloudFormation part so we can build test and deploy our web app to the through each environment to production You can grab the final CloudFormation template we created here Like what you read Follow me here on Dev to or on Twitter to stay updated 2021-06-28 15:43:13
海外TECH DEV Community LikedList Questions: Delete nth node from end in Two Pass https://dev.to/kathanvakharia/likedlist-questions-delete-nth-node-from-end-in-two-pass-2j63 LikedList Questions Delete nth node from end in Two PassIn this series of posts I will discuss coding questions on the LinkedList Data structure The posts in this series will be organized in the following way Question Link Possible Explanation Documented C Code Time and Space Complexity Analysis The QuestionGiven the head of a linked list remove the nth node from the end of the list and return its head Constraints The number of nodes in the list is sz lt sz lt lt Node val lt lt n lt szGive yourself atleast mins to figure out the solution There are two approaches possible in this post we will see the first one Approach Two PassIf you think a bit nth node from end is list len n th node from beginning So our algorithm is Find the length of LinkedList →LDelete the L n th node from beginning C Code Definition of LinkedList Definition for singly linked list struct ListNode int val ListNode next ListNode val next nullptr ListNode int x val x next nullptr ListNode int x ListNode next val x next next SolutionListNode removeNthFromEnd ListNode head int n if LL is empty if head return head note first pass O n getting length of LL int cnt ListNode temp head while temp cnt temp temp gt next Standard Procedure to delete k th node from beginning note Required Node cnt n th node note we have to go cnt n times deep to stand at required node int k cnt n ListNode cur head ListNode prev nullptr it will point one node preceding to cur note second pass O n while k gt prev cur cur cur gt next k first node of the LL is to be deleted if prev temp cur cur cur gt next delete temp head cur cur is the new head else prev gt next cur gt next delete cur return head Complexity AnalysisN is the length of LinkedList K is the postion of node from end Time Complexity O N Space Complexity O We didn t use any extra space It turns out there s a better method to solve this question in single pass we shall see that method in next post 2021-06-28 15:37:37
海外TECH DEV Community tsParticles 1.30.0 is here! Confetti rework (all particles shapes supported, emojis too) https://dev.to/matteobruni/tsparticles-1-30-0-is-here-confetti-rework-all-particles-shapes-supported-emojis-too-2a4a tsParticles is here Confetti rework all particles shapes supported emojis too tsParticles New FeaturesAdded wobble effect to particles configurable in optionsAdded tilt effect to particles configurable in optionsAdded roll options to particles configurable in optionsAdded all new sections to editor Bug FixesFixed old TypeScript definitions generation fixes Simplified confetti preset if the first parameter is not specified a random id will be usedtsParticles will create an element if the id used is not valid Breaking ChangesConfetti animations are now split in three generic particles sections roll tilt wobble Removed confetti shape it s no longer neededThe library has changed the output folders the dist folder has been removed A note about the dist folder Imports import In most cases this change will affect only who are using internal imports This tsparticles dist can be safely replaced to tsparticles CDN or VanillaThis will affect also everyone using tsParticles with CDNs since the dist folder is no longer part of the path but if it s copied from the CDN website it s fine A note about wobble tilt and rollThese three new particles options sections will create a wonderful and realistic confetti effect to all particles You can use any shape with these effects even external ones self created or not The only one not compatible is confetti because it s been replaced by these properties What do they means RollRoll makes particles roll on their y axis They look like they re falling rolling on themself In these options you can set a back color that will be visible when the particle has flipped The color is optional and a darken or a enlighten section can be alternatively configured The reading values order is Back ColorDarkenEnlightenSo if enlighten and darken are both specified only darken will be read darken and enlighten have a value and enable the first will subtract the luminosity of the color for that value the second will add it only if the enable value is true TiltTilt is responsible for particles deformation the particles will be tilted following the specified parameters This is not animated by default the options are similar to rotate they don t have path since is not valid here If a value is set all particles will be tilted for that angle both horizontally and vertically using cos and sin functions when animated the angle will be increased or decreased depending on set direction WobbleWobble is the horizontal movement that simulates the air resistance The particles will bounce from left to right with a configurable speed and distance Let s see the new confetti options in actionYes you saw right Confetti can be emojis too 2021-06-28 15:35:37
海外TECH DEV Community SolidJS Official Release: The long road to 1.0 https://dev.to/ryansolid/solidjs-official-release-the-long-road-to-1-0-4ldd SolidJS Official Release The long road to It s been a long road to get here It s been so long I can t even remember when I started I logged on to an old private Bitbucket Repo and found initial commit on a repo aptly named framework from August st But I m pretty sure that was my second prototype of a Reactive JavaScript Framework that would eventually become SolidJS So I can safely say a stable release has been s of hours and at least years in the making But I m sure the commenters on Reddit HN won t even read this far before getting in with Another day another new JavaScript Framework Seriously don t let me down I keep a scorecard What is Solid It s a JavaScript framework like React or Svelte What makes it unique is that it flies in the face conventional knowledge to deliver what many have said to be impossible A reactive and precompiled Virtual DOM less JSX framework with all the flexibility of React and simple mental model of Svelte A framework that values the explicity and composability of declarative JavaScript while staying close to the metal of the underlying DOM It marries high level and low level abstractions Simply put it is anything that you want it to be A few people have suggested that Solid is the future Michel Weststrate mweststrate Finally played with an idea that lingered in my head for a couple of years A reactive component library And it worked splendidly Then discovered the work by RyanCarniato who build that already with SolidJS MobX jsx So super stoked about that I think this is the future PM Jul But it is also firmly rooted in the past when JavaScript Frameworks were simpler and you had real DOM nodes at your finger tips When your JSX elements are just real DOM nodes const myButton lt button onClick gt console log Hello gt Click Me lt button gt myButton instanceof HTMLButtonElementWhen your control flows are runtime JavaScript lt div gt showComponent amp amp lt MyComp gt lt div gt custom end user created component lt Paginated list someList numberOfItems gt item gt lt div gt item description lt div gt lt Paginated gt When you can compose and build your primitives how you want function App const count setCount createSignal custom primitive with same syntax const state setState createTweenState createEffect gt no need for that dependency list we know when you update const c count yep I m nested createEffect gt document title Weird Sum c state Did I mention no stale closures to worry about Our component only runs once const t setInterval gt setCount count onCleanup gt clearInterval t other stuff Well you feel like you are cheating And not just at benchmarks You are not supposed to get your cake and eat it too Full TypeScript support A wonderful Vite starter template All the modern tooling and IDE support you get for free by using JSX Why you should be excitedIt isn t just the amazing developer experience Solid is fully featured Powerful PrimitivesSolid is built on the back of simple general purpose Reactive primitives Solid embraces this like no Framework before having its very renderer built entirely of the same primitives you use to build your App Afterall are these really any different const el lt div gt Initial Text lt div gt createEffect gt el textContent getNewText versusrender gt lt MyGiantApp gt document getElementById app Every part of Solid is extensible because every part could be developed in user land You get the high level abstractions that make you productive but you don t need to leave them to get low level capabilities people enjoyed back when jQuery was king Solid has a compiler but it s there to help you not limit you You can compose behaviors everywhere and use the same primitives It s all one syntax Solid has even brought Directives to JSX directive using the same primitivesfunction accordion node isOpen let initialHeight createEffect gt if initialHeight initialHeight node offsetHeight px node style height isOpen initialHeight use it like this lt div use accordion isOpen gt some expandable content lt div gt Sophisticated StoresSince Solid will likely never have React compatibility it is important to integrate well with the ecosystem that is already there Stores both bring an easy in house method of state management and bring Solid s pinpoint updates to solutions you might already be familiar with like Redux and XState Stores use nested proxies with opt in diffing for immutable data that lets you update one atom of data and only have those specific parts of the view update Not re rendering Components but literally updating the DOM elements in place No need for memoized selectors it works and it works well Next Generation FeaturesSolid has all the next generation features How about Concurrent Rendering and Transitions to start We ve spent the last years developing out a Suspense on the server with Streaming Server Side Rendering and Progressive Hydration This setup works amazingly well even when deployed to a Cloudflare Worker Best in Class PerformanceI was going to let this one go as people get tired of hearing it After all this news is several years old at this point Solid is the fastest and often the smallest JavaScript Framework in the browser and on the server I won t bore you with the details you can read about it elsewhere But we did a survey recently and it seems our users are happy with our performance as well Who voted There was more than one of you What s Next represents stability and commitment to quality but there is a lot more yet to do We are working on Solid Start a Vite based Isomorphic Starter that has all the best practices and Server rendering built in with the ability to deploy to multiple platforms And while I started this alone years ago I m hardly alone now It is only through the dedicated work of the community that we have a REPL countless rd party libraries to handle everything from drag and drop and animations to Custom Elements that render D scenes Solid has been seeing adoption in tooling for IDEs with work being done on Atom and serving as the engine behind Glue Codes And an early adopter and perhaps influencer of Builder io s JSX Lite Honestly there are too many people to thank Those that have come and gone but left a mark From the early adopters who said encouraging words in our original Spectrum channel that kept me motivated to the growing team of ecosystem collaborators and core maintainers A project like this is dead in the water without others believing in it So you have my deepest thanks There is a lot more to do But in the meanwhile check out our website solidjs com with docs examples and new tutorials And come and say hi on our Discord It s never been easier to get started with Solid 2021-06-28 15:27:24
海外TECH DEV Community React Hooks : Demystifying the useEffect hook in under 15 minutes [examples + video] https://dev.to/thenerdydev/react-hooks-demystifying-the-useeffect-hook-in-under-15-minutes-examples-video-4n46 React Hooks Demystifying the useEffect hook in under minutes examples video Hey everyone In this article let us understand about the useEffect React Hook in under minutes Example Counter Example for useEffect CODE import useState useEffect from react const Effect props gt const counter setCounter useState useEffect gt console log In Effect js AFTER RENDER return lt div gt lt button onClick gt setCounter prevCounter gt prevCounter gt Increment Counter lt button gt lt h gt Current Value counter lt h gt lt button onClick gt setCounter prevCounter gt prevCounter gt Decrement Counter lt button gt lt div gt export default Effect Example API Call Side Effect example useEffect CODE import useState useEffect from react const APICallEffect props gt const todo setTodo useState null const id setId useState const fetchTodo id gt return fetch id then response gt response json useEffect gt console log Effect ran fetchTodo id then setTodo id const incrementId gt setId prevId gt prevId if todo null return lt h gt Loading lt h gt return lt div gt lt h gt id id todo todo title lt h gt lt button onClick incrementId gt incrementId lt button gt lt div gt export default APICallEffect Example useEffect with cleanup CODE import useState useEffect Fragment from react const EffectWithCleanup props gt const xCoordinate setXCoordinate useState const yCoordinate setYCoordinate useState const handleCoordinateUpdate event gt console log event clientX event clientY setXCoordinate event clientX setYCoordinate event clientY useEffect gt console log useEffect ran window addEventListener mousemove handleCoordinateUpdate return gt console log cleanup window removeEventListener mousemove handleCoordinateUpdate return lt Fragment gt lt div gt lt h gt X coordinate xCoordinate lt h gt lt h gt Y coordinate yCoordinate lt h gt lt div gt lt Fragment gt export default EffectWithCleanup Video So this was it for this one If you are looking to learn Web Development I have curated a FREE course for you on my YouTube Channel check the below article Web Developer Full Course HTML CSS JavaScript Node js and MongoDB The Nerdy Dev・Apr ・ min read html css node javascript Spare Hours If so utilize them by creating these JavaScript Projects in under Hours JavaScript Projects in Hours The Nerdy Dev・Oct ・ min read javascript webdev Follow me on Twitter Check out my YouTube Channel 2021-06-28 15:21:06
海外TECH DEV Community Making a game: Avoiding burnout https://dev.to/saluki/making-a-game-avoiding-burnout-14jo Making a game Avoiding burnoutMaking a game Avoiding burnout by SethOne of the most common reasons that a game will not get finished is burnout It s probably the number project killer out there in fact and it doesn t just stop projects from getting finished it also discourages people from making games This is why it is very important to acknowledge that burnout is a thing and for you to be proactive in preventing it from shutting down your game or any other long term project for that matter If you can avoid burnout you can keep working And if you can keep working you can finish your game The post Making a game Avoiding burnout is available in full on Saluki Tech 2021-06-28 15:11:16
海外TECH DEV Community Rebuilding FactoryBot in 150 lines of code https://dev.to/alexandreruban/rebuilding-factorybot-in-150-lines-of-code-29o0 Rebuilding FactoryBot in lines of codeFactoryBot is a gem that enables you to create fake data for your tests If you work with Ruby on Rails there are good chances that you worked with the gem on a few projects In this article we will rebuild a FactoryBot clone called TinyFactory in about lines of code We will learn amazing Ruby features such as How the elegant FactoryBot syntax works under the hoodHow to create a gemHow to use blocks and procsHow to use method missing and instance evalBy the end of the article you will know enough to go through the source code of the real factory bot repository on your own if you want to To get the most out of this article you should take your time and build the gem with me it is guided step by step for you to understand everything Are you ready to learn some cool things in Ruby Let s get started Creating the TinyFactory gemLet s start by creating a new gem called TinyFactory with the bundle gem command bundle gem tiny factorycd tiny factoryIf you re creating a gem for the first time I ll quickly describe the main files that were created for you otherwise you can skip directly to the next section The tiny factory gempspec file contains the specification of your gem It lists various information about the gem the author and the list of the dependencies The Rakefile looks like this by default frozen string literal truerequire bundler gem tasks require rake testtask Rake TestTask new test do t t libs lt lt test t libs lt lt lib t test files FileList test test rb endtask default testThis code means that the default rake task will run all the test files of the test folder ending with test rb To run this default rake task simply type bundle exec rake in your terminal The test folder contains the tests you ll write to test your gem The test helper rb file comes with some boilerplate code to automatically add the files from your lib folder in the load path We will write some tests in this article later Finally the lib folder is where you will write your source code All the Ruby gems are built with these conventions so next time you open the source code of a gem you will find the same folder hierarchy and you won t be lost Testing the TinyFactory gem Adding an integration testTo clearly define what we will build in this article let s first write an integration test We will consider that we have succeeded in our mission when all the integration tests are green Let s create a file called integration test rb in our test folder test integration test rbrequire test helper class IntegrationTest lt Minitest Test def setup TinyFactory define user do first name Alexandre last name Ruban email first name hey com downcase end end def test attributes for attributes attributes for user assert kind of Hash attributes assert equal Alexandre attributes first name assert equal Ruban attributes last name assert equal alexandre hey com attributes email end def test build user build user assert kind of User user assert user new record assert equal Alexandre user first name assert equal Ruban user last name assert equal alexandre hey com user email end def test create user create user assert kind of User user assert user persisted assert equal Alexandre user first name assert equal Ruban user last name assert equal alexandre hey com user email endendAs you can see the syntax in the setup method is close to the real FactoryBot syntax This is what we will build step by step in this article To make our test pass later we still need to add a little bit of boilerplate Adding the required dependenciesTo make our test pass we need to add a User model to our application This User model will inherit from ActiveRecord Base to simulate a real model in a Rails application Let s add all the dependencies we need in the gemspec tiny factory gemspecrequire relative lib tiny factory version Gem Specification new do spec Don t remove the automatically generated code Add these dependencies at the end spec add development dependency activerecord gt spec add development dependency sqlite gt spec add dependency activesupport gt endAs you can see we add a development dependency on active record and sqlite This is because we ll need a User model inheriting from ActiveRecord Base We will also need to save User instances in a sqlite database in memory Note that we also added a dependency on active support that we will talk about later in the article Now that we listed the dependencies we can run the bundle install command Bundler might complain that there are some TODO in the gemspec file Removing them should enable you to run bundle install without any troubles Creating our User modelLet s create the User model in the test helper rb file test test helper rbrequire tiny factory require minitest autorun require active record ActiveRecord Base establish connection database memory adapter sqlite class CreateSchema lt ActiveRecord Migration def self up create table users force true do t t string first name t string last name t string email end endendCreateSchema migrate up class User lt ActiveRecord Base validates first name last name email presence trueendThis piece of code creates a new connection to a sqlite database in memory runs a migration that creates the users table and creates the User model that inherits from ActiveRecord Base just like you would do in a Rails application As we required the test helper in our integration test rb file the User model will be available here as well Now that our test files and our dependencies are all set we are ready to dive into the FactoryBot code The two steps of FactoryBotFactoryBot works in two steps You define a factoryYou run the factoryThe definition is what happens when we write those lines in our integration test TinyFactory define user do first name Alexandre last name Ruban email first name hey com downcase endWe then run the factory when we use one of the methods attributes for build or create Defining a FactoryWe will start this article by understanding how to define the user factory of our integration test The definition relies on two simple classes Factory and Attribute Let s understand them The Factory classThe Factory class is responsible for holding the factory name and the attributes definitions Let s make that clear with a piece of code lib tiny factory factory rbmodule TinyFactory class Factory A factory has a factory name and holds the attributes attr reader factory name def initialize factory name factory name factory name attributes end Here comes the Attribute object def add attribute name definition attributes lt lt Attribute new name definition end endendIn our example the factory name is user and the attributes are first name last name and email Now that we understand that our Factory holds its name and adds attributes definitions to a list of attributes let s move on to the Attribute class The Attribute classThe Attribute class is the simplest of all It s only responsible for holding an attribute name and its definition lib tiny factory attribute rbmodule TinyFactory class Attribute def initialize name definition name name to sym definition definition end endendLet s take our email attribute as an example When we write email first name hey com downcase in the integration test what we are creating under the hood is an Attribute with its name equals to email and its definition equals to a proc that we could write like this Proc new first name hey com downcase Now if you re not familiar with procs you will understand them much more after reading this article so keep going A proc is an object that holds a piece of code that will be evaluated later Here the definition Proc new first name hey com downcase has not been evaluated yet It is a piece of code waiting to be called We will see later in the article that the definition is evaluated when you run the factory Adding syntactic sugarNow that we have the Factory and the Attribute objects it s time to reveal the mysteries behind this beautiful syntax TinyFactory define user do first name Alexandre last name Ruban email first name hey com downcase endWith the Factory and Attribute classes we just coded we could define a factory like this factory TinyFactory Factory new user factory add attribute first name Proc new Alexandre factory add attribute last name Proc new Alexandre factory add attribute email Proc new first name hey com downcase This works but it is not very elegant We are building a gem that will be used by a lot of developers and we want it to have an easy to remember API To make our syntax elegant we will add syntactic sugar This means that our gem will keep the same features it already has but we will make the API easier to write and remember Let s transform our current syntax into the elegant syntax First we need to add the TinyFactory define method lib tiny factory rb This was generated by the bundle gem tiny factory commandrequire tiny factory version You need to require the files we just createdrequire tiny factory factory require tiny factory attribute module TinyFactory def self define name amp block factory Factory new name factory instance eval amp block factory endendThe Tinyfactory define method instanciates a new Factory with a name of user in our example and then calls instance eval with the block on it What does the instance eval method do It evaluates the block in the context of the instance on which it was called This means that factory instance eval amp block is equivalent in our example to writing factory first name Alexandre factory last name Ruban factory email first name hey com downcase All right but our factory does not respond to first name or last name or even email It only responds to add attribute Let s change that by adding the method missing method to our Factory class What is method missing It s a Ruby method that gets called when the method was not found on the object or any of its ancestors Let s do a small example for you to understand class RandomendRandom new email gt undefined method email for lt Random xfaae gt NoMethodError As you can see calling email on an instance of the Random raises a NoMethodError We can change that by adding method missing to the Random classclass Random def method missing name args amp block puts The method name was called puts The method was called with args as arguments if args any puts The method was also given a block if block endendRandom new first name gt The method first name was calledRandom new names Alexandre Ruban gt The method names was called gt The method was called with Alexandre Ruban as argumentsRandom new email first name hey com downcase gt The method email was called gt The method was also given a blockAs you can see method missing prevents the NoMethodError The name of the missing method that was called on the object becomes the first argument of method missing The arguments of the missing method that was called can be retrieved with args which turns those arguments into an array Last but not least if a block was passed to the missing method it can be transformed as a proc and passed as an argument What we want is to make those two syntax equivalent factory add attribute email first name hey com downcase factory first name first name hey com downcase This can be achieved with method missing like this lib tiny factory factory rbmodule TinyFactory class Factory All the previous code def method missing name amp block add attribute name block end endendNow calling first name and passing a block to an instance of Factory is equivalent to calling add attribute with first name and passing the block What is the amp signed used for before the block It is used to convert a block to a proc and vice versa If you pass a block to a function amp block will convert it to a proc that you can store for later evaluation Similarly if you have a variable my proc that stores a proc amp my proc will convert the proc to a block It s as simple as that This is what syntactic sugar is You are only making the API simpler to remember and more elegant Adding a factory registryThere is one last thing we need to do to complete our factory definition We want to store all the defined factories in a registry to be able to retrieve them later based on their name This will be useful when running one factory Let s add this feature very quickly when we define the Factory lib tiny factory rbmodule TinyFactory factories def self factories factories end def self register factory factory factories lt lt factory end Edit the define method here def self define name amp block factory Factory new name factory instance eval amp block register factory factory factory end All the previous code endNow all the factories that are defined are stored in the TinyFactory factories array Wow Nice work our Factory user is now correctly defined Let s manually test it to see what happens by creating a test rb file at the root of the project test rb This line enables you to require tiny factory here You do not need to understand it LOAD PATH unshift File expand path lib dir require tiny factory factory TinyFactory define user do first name Alexandre last name Ruban email first name hey com downcase endp factoryIf we then run this script in the console here is what we get ruby test rb gt lt TinyFactory Factory xffd factory name user attributes lt TinyFactory Attribute xffcd name first name definition lt Proc xffce test rb gt gt lt TinyFactory Attribute xffcc name last name definition lt Proc xffccb test rb gt gt lt TinyFactory Attribute xffcb name email definition lt Proc xffcb test rb gt gt gt As we can see we get back a Factory object with a factory name of user and holding three attributes first name last name and email each of them holding their definition proc That s a great achievement already Now it s time for us to run the factory with one of the three methods attributes for build or create Running a FactoryNow that our Factory is defined we need to run it In our example it can mean three things Return a hash of attributes attributes for Return a built instance build Return a created instance persisted in the database create We will start by making attributes for work and then it will be very easy to add the buildand createfeatures Making the attributes for strategy workFor each of these three methods we will define a strategy Let s start with the AttributesFor strategy lib tiny factory strategy attributes for rbmodule TinyFactory class Strategy class AttributesFor def initialize result end def get attribute result attribute end def set attribute value result attribute value end def result result end end endendThe AttributesFor class is responsible for holding the result which is the hash of attributes that attributes for user returns in our integration test What can we do with this class We can get attributes from the result hash set attributes to the result hash and get the final result of our computation Easy Now let s see how we can run this strategy We will use TinyFactory attributes for user for now instead of attributes for user This syntactic sugar will be added at the end of the article Let s add the TinyFactory attributes for method lib tiny factory rb All the previous requires Don t forget to add this new requirerequire tiny factory strategy attributes for module TinyFactory All the previous code def self attributes for factory name find factory factory name run Strategy AttributesFor end def self find factory factory name factories find factory factory factory name factory name endendAs you can see we defined a TinyFactory attributes for method that looks for the factory by its name and the calls run on it with the AttributesFor strategy class Let s add the run method to the Factory class lib tiny factory factory rbmodule TinyFactory class Factory All the previous code def run strategy class strategy strategy class new attributes each do attribute attribute add to strategy end strategy result end endendAs you can see here we create a new instance of the strategy class then iterate through all the attributes of the factory and add each attribute to the strategy thanks to the Attribute add to method Finally we return the strategy result You guessed it we are missing a add to method on the Attribute class Let s add it lib tiny factory attribute rbmodule TinyFactory class Attribute def initialize name definition name name definition definition end def add to strategy Not the final implementation strategy set name definition call end endendLet s explain the add to method carrefully because there is a trick In our integration test example our user factory has a first name attribute and its definition is equivalent to Proc new Alexandre In this case definition call return Alexandre That means that when we do strategy set name definition call we are adding to the result hash the key first name and the value Alexandre Now let s take a look at our email attribute and its definition that is equivalent to Proc new  first name hey com downcase This is more complicated because the first name method is not defined on the email attribute How might we retrieve its value We need to have a look at the strategy But the strategy does not respond to the first name method either What are we going to use You probably guessed it method missing lib tiny factory strategy attributes for rbmodule TinyFactory class Strategy class AttributesFor All the previous code def get attribute result attribute end def method missing attribute get attribute end endendNow our strategy responds to the first name method and returns the value that was set earlier on the result hash of the strategy instance The final implementation of the add to method is as follows lib tiny factory attribute rbmodule TinyFactory class Attribute def initialize name definition name name definition definition end def add to strategy strategy set name strategy instance eval amp definition end endendNotice the amp before definition It converts the definition proc to a bloc Remember the amp sign before a block converts it to a proc and the amp sign before a proc converts it back to a block it s as simple as that We did it In the integration test if you replace attributes for user with TinyFactory attributes for user the test is green We ll add the syntactic sugar to avoid having to write TinyFactory at the end of the article but that s already a huge step forward Making the build strategy workTo do this we need to add a TinyFactory Strategy Build lib tiny factory strategy build rbmodule TinyFactory class Strategy class Build One small difference here the strategy needs to be initialized with a class In our example as we are building a User instance our build strategy will be initialized with the User class def initialize klass instance klass new end def get attribute instance send attribute end def set attribute value instance send attribute value end def method missing attribute get attribute end def result instance end end endendNotice how it s almost the same as the AttributesFor strategy The result of the strategy is not a Hash but an instance of the class passed to the initialize method This means that to read an attribute we need to send the attribute name to the instance and to set an attribute with some value we need to send the message attribute with the value As you noticed we changed the number of arguments taken by the initialize method of a strategy We want all our strategies to have the same API to make them interchangeable This is known in Object Oriented Programming as polymorphism Let s change the AttributesFor strategy so that is also initialized with an argument module TinyFactory class Strategy class AttributesFor We use an underscore here to indicate the argument passed is never used def initialize result end All the rest of the code end endendEven if we don t use the argument passed to initialize in the AttributesFor strategy we still add it because we want to keep the same API between all of our strategies This is called polymorphism and it s one of the most powerful features of OOP If we didn t do that we would need to check with if and else statements if the strategy we are using is AttributesFor or Build This is called type checking and it s a code smell Let s go back to our Build strategy We said that we are creating an instance of a class but which class By convention when we create a factory with a name of user the class of the instance we build will be User Let s add a tiny bit of code to create this convention lib tiny factory factory rbmodule TinyFactory class Factory All the previous code def run strategy class strategy strategy class new build class attributes each do attribute attribute add to strategy end strategy result end private def build class This is why we need ActiveSupport as a dependency classify and constantize are Active Support methods factory name to s classify constantize end endendThanks to ActiveSupport classify and ActiveSupport constantize a factory with a name of user will have a build class of User and a factory with a name of billing information will have a build class of BillingInformation This is the convention we created We guess the class to pass to the strategy from the name of the factory Wow That s great progress One last thing to make it work we need to require the file in our tiny factory rb and create the build method lib tiny factory rb Add this require to the listrequire tiny factory strategy build module TinyFactory All the previous code def self build factory name find factory factory name run Strategy Build endendYou can now check that both the attributes for and the build integration tests pass if you replace attributes for user with TinyFactory attributes for user and build user with TinyFactory build user Making the create strategy workThis one is much much easier we already did all the work We simply need to add our TinyFactroy Strategy Create lib tiny factory strategy create rbmodule TinyFactory class Strategy class Create lt Build def result instance save instance end end endendThe Create strategy is the same as the Build strategy except that weneed to save the result instance in the database before we return it To do this we make the Create strategy inherit from the Build strategy and simply override the result method Once again let s add the TinyFactory create method and require the create strategy rb file lib tiny factory rb Add this require to the listrequire tiny factory strategy create module TinyFactory All the previous code def self create factory name find factory factory name run Strategy Create endendYou can now make the create integration test pass by using TinyFactory create user instead of create user You did it Let s now add one last piece of syntactic sugar and we will be done with this FactoryBot clone and you will know enough to dig through the real source code The TinyFactory Syntax Default moduleIn our tests we want to use attributes for user instead of TinyFactory attributes for user it is too verbose and we care about the syntax we will use every day as developers Let s add one last piece of syntactic sugar by creating a TinyFactory Syntax Methods module lib tiny factory syntax methods rbmodule TinyFactory module Syntax module Methods def attributes for name TinyFactory attributes for name end def build name TinyFactory build name end def create name TinyFactory create name end end endendThe three methods created here only delegate to the TinyFactory module This is very simple but will improve our experience as developers when we use the library To use this module we simply need to add this line in our test helper and to require the file in tiny factory rb lib tiny factory rb Add this require statementrequire tiny factory syntax methods test test helper rb All the previous code class Minitest Test include TinyFactory Syntax MethodsendHow does this work Our integration test inherits from Minitest Test By including our syntactic sugar module in Minitest Test we automatically gain access to the attributes for build and create methods that delegate to the TinyFactory module Let s run the integration test from the beginning of the article now Everything should be green you are now able to understand how FactoryBot works Congratulations TakeawaysIn this articles we learned To create a gem with the bundle gem commandTo convert a block to a proc and vice versa with the amp characterTo intercept class to undefined methods on an object thanks to method missingThat polymorphism is an important concept in Object Oriented Programming If you want to learn more about the topic I highly recommend the bottles of OOP book by Sandi MetzThat it is possible to add syntactic sugar to your code to make it more elegant and easy to rememberHow the real FactoryBot works Did you like this article If you liked this article and want to be notified when I publish more follow me on Twitter Feel free to share this article with your developer friends and coworkers 2021-06-28 15:10:45
海外TECH DEV Community The 3 aria-label techniques that level up your HTML https://dev.to/melnik909/the-3-aria-label-techniques-that-level-up-your-html-397p The aria label techniques that level up your HTML Give more information about the context where this element isWe often deal with buttons that have some limitations The popular one of them is a space limit We can t use long text because buttons will not fit in So we have to use short text that calls for action But there is the problem users need more information that helps them to understand what they should do If users don t have vision disabilities they get information using around the context of this button But if users have disabilities they can t do that So they more difficult to understand what to do with a button We can help them adding more information about a button using the aria label attribute For example ASOS adds the additional text Clear recent searches that describes what the button does don t do this lt button type button gt Clear lt button gt you can use this instead lt button type button aria label Clear recent searches gt Clear lt button gt Verbs tell users this element leads to actionThere is a best practice using the aria label attribute to help screen reader users understand how to interact with an element But I think there is a problem People use inaccurate description For example they write saved items for the link that goes to the page with saved items So users will hear saved items link I suggest using verbs in the aria label to help users understand this element leads to action For example I d write go to my saved items instead of saved items In this case users hear go to my saved items link I think it more clear don t do this lt a arial label Saved items href gt lt a gt you can use this instead lt a arial label Go to my saved items href gt lt a gt Create a more easy interactionIf you want to make user friendly interfaces for screen reader users you should know they voice all elements that have semantic For example I created the link that has the img and p elements When users will interact with it they have to interact the times So we should simplify that by creating another way of interacting For example ASOS developers get all required information using the aria label attribute Then all child elements are hidden using the aria hidden attribute so that they didn t duplicate the text from the aria label And users will get much more comfortable experience without unnecessary interactions don t do this lt a href class product card gt lt div class product card preview gt lt img src only sons oversize jpg alt Only Sons oversize vest with palmistry back print in white gt lt div gt lt div class product card body gt lt div class product card description gt lt p gt Only Sons oversize vest with palmistry back print in white lt p gt lt div gt lt span class product card price gt £ lt span gt lt div gt lt a gt you can use this instead lt a href aria label Only Sons oversize vest with palmistry back print in white Price £ class product card gt lt div aria hidden true class product card preview gt lt img src only sons oversize jpg alt Only Sons oversize vest with palmistry back print in white gt lt div gt lt div aria hidden true class product card body gt lt div class product card description gt lt p gt Only Sons oversize vest with palmistry back print in white lt p gt lt div gt lt span class product card price gt £ lt span gt lt div gt lt a gt P S If you like my post you can say thank you using one from the following ways Buy my merch for frontendersFollow me on TwitterP S S This post was written with the support of my patrons Ashlea Gable Ben Rinehart Sergio Kagiema Vlad Bazhanov Spiridon Konofaos Jesse Willard Tanya Ten 2021-06-28 15:07:22
海外TECH DEV Community The magic of react-query and supabase https://dev.to/ankitjey/the-magic-of-react-query-and-supabase-1pom The magic of react query and supabaseIt s been a while since I wrote my last article on state management in React using Context Here s the link for anyone who wants to give it a read And using custom hooks is still the primary way for me for state management and I have been recommending that to people as well In the previous post I had mentioned about UI state theme ux state vs Server state fetched data I want to follow up on the sequel article I had promised Let s get into it What we are going to buildLet s not make yet another todo list I think having some real world data will help understand things better For this part we are going to make an app where you can search movies from the TMDB api add it to your profile as recommendation What we are going to useNextJS I by default use NextJS for any react application I build nowadays over CRA react query Data fetching caching tool going to help us with our global server state problems supabase Supabase is something I have fallen in love with It is an open source alternative to firebase auth database storage but the best part is it s Postgres This will serve entirely as our backend You will see how tailwindcss For styling our app Gotta say all of these have the best developer experience you could ask for Let s get started Setting up the clientFirst we need to create the next app and setup tailwind in it Setting up the backend supabase Login into supabase and create a project By default supabase provides you with auth In this tutorial I won t be going all out on auth will just do the login After you create databases all of them are accessible through the supabase client using an anon key that you get when you create a project This is also where the best part of their auth architecture comes into place All of the data by default are accessible to anyone using the anon key But you can use row level policies on each table to achieve role auth based authorization Let s first create a few tables using the inbuilt SQL editor in the dashboard based on what we are trying to build CREATE TABLE users id uuid references auth users PRIMARY KEY name text username text unique CREATE TABLE movies movie id integer PRIMARY KEY title text poster path text overview text release date date CREATE TABLE recommendations id uuid NOT NULL DEFAULT extensions uuid generate v primary key id user id uuid constraint user id foreign key user id references users id movie id integer constraint movie id foreign key movie id references movies movie id CREATE UNIQUE INDEX user id movie id on recommendations using BTREE movie id user id You can create all the tables and relationships using the UI too if you want but you have both the options After running this the tables will be created for you Let s see how our schema looks like using this schema visualizer Initializing the clientLet s install the client yarn add supabase supabase jsCreate a file called app supabase ts and initialize the client import createClient from supabase supabase js const supabase createClient process env SUPABASE URL process env SUPABASE ANON KEY export default supabase Make sure you copy over the project URL and anon key from your dashboard and paste it in env local file Before we go further let s setup react query as well React Query is often described as the missing data fetching library for React but in more technical terms it makes fetching caching synchronizing and updating server state in your React applications a breeze Setting up React QueryInstall the package usingyarn add react queryand add the following to your app js imports const queryClient new QueryClient defaultOptions queries retry function MyApp Component pageProps AppProps return lt QueryClientProvider client queryClient gt lt Component pageProps gt lt ReactQueryDevtools initialIsOpen false gt lt QueryClientProvider gt export default MyAppReact query has default retry of times for queries you can set your custom ones We have set it to We are also using the devtools which is an awesome tool and helps us view queries and states easily Let s clarify a few things before going into this react query is data fetching and tool you can use anyway you like A few people confuse this with Apollo Client but Apollo Client is for GraphQL React Query agnostic to what you are using to fetch data and just deals with promises Which means you can deal with REST GraphQL API file system request as long as a promise is returned With React Query queries are when you are fetching data from the server and mutations when you are changing data on the server SignupIn signup we would be using supabase auth to signup and also create a user in the database with additional details Create a page in pages auth signup tsx for the signup formimport useRouter from next router import useState from react import Loader from components ui loader export default function Signup const router useRouter const email setEmail useState const password setPassword useState const name setName useState const username setUsername useState return lt div className min h screen grid place items center text xl gt lt div className w lg w shadow lg flex flex col items center gt lt h className text xl font semibold gt Sign up lt h gt lt div className mt w full lg w auto px gt lt p gt Name lt p gt lt input type text className h focus outline none shadow sm border p rounded mt w full lg w auto onChange e gt setName e target value gt lt div gt lt div className mt w full lg w auto px gt lt p gt Email lt p gt lt input type text className h focus outline none shadow sm border p rounded mt w full lg w auto onChange e gt setEmail e target value gt lt div gt lt div className mt w full lg w auto px gt lt p gt Password lt p gt lt input className h focus outline none shadow sm border p rounded mt w full lg w auto type password onChange e gt setPassword e target value gt lt div gt lt div className my w full lg w auto px gt lt p gt Username lt p gt lt input type text className h focus outline none shadow sm border p rounded mt w full lg w auto onChange e gt setUsername e target value gt lt div gt lt div className mb w gt lt button className bg blue text white px py rounded w full gt lt span gt Sign up lt span gt lt button gt lt div gt lt div gt lt div gt Let s create a custom hook in hooks useCreateUser tsWe can always have the fetching mutating inside the component but having separate custom hooks gives rise to cleaner code import useMutation useQueryClient from react query import supabase from app supabase interface User name string email string username string password string const createUser async user User gt Check if username exists const data userWithUsername await supabase from users select eq username user username single if userWithUsername throw new Error User with username exists const data error signUpError await supabase auth signUp email user email password user password if signUpError throw signUpError return data export default function useCreateUser user User return useMutation gt createUser user onSuccess async data gt const data insertData error insertError await supabase from users insert name user name username user username id data user id if insertError throw insertError return insertData Let s go through the above code First we have the method the create the user In there we first check whether an user with the username exists and if it does we throw an error So a thing to notice here is that the supabase client by default doesn t throw an error instead returns it in the return object Then we use supabase auth signUp method with email and password We have disabled the email verification in supabase auth dashboard for this tutorial If it succeeds we return the data we get back Next we have the default export which uses the useMutation hook from react query We pass in the function we created above Also since we also want to insert a user in our users table we have onSuccess side effect in options which gets the data returned by the createUser method Here we use supabase from to build a insert query and we use the user id returned from the signup success Perfect now we add the logic in pages auth signup import useCreateUser from hooks useCreateUser export default function Signup const createUserMutation useCreateUser email password name username if createUserMutation isSuccess router push createUserMutation isError amp amp lt p className text sm mb text red gt createUserMutation error message lt p gt lt button className bg blue text white px py rounded w full onClick gt createUserMutation mutate gt createUserMutation isLoading lt span gt lt Loader height width gt lt span gt lt span gt Sign up lt span gt lt button gt We import the custom hook and define it in our component We add an onclick action on the button which triggers the mutation We also use the isLoading isError error for displaying We use the isSuccess to route the user to the home page Now on entering the details and clicking signup a user should be created and you should be redirected to the signup page LoginLet s quickly add the login page as well Let s create a new page at auth login route and add some simple ui export default function Login const email setEmail useState const password setPassword useState return lt div className min h screen grid place items center text xl gt lt div className w lg w shadow lg flex flex col items center gt lt div className mt w full lg w auto px gt lt p gt Email lt p gt lt input type text onChange e gt setEmail e target value className h focus outline none shadow sm border p rounded mt w full lg w auto gt lt div gt lt div className my w full lg w auto px gt lt p gt Password lt p gt lt input className h focus outline none shadow sm border p rounded mt w full lg w auto type password onChange e gt setPassword e target value gt lt div gt lt div className mb gt lt button className bg blue text white px py rounded gt Login lt button gt lt div gt lt div gt lt div gt Create a similar hook called hooks useLogin tsimport useMutation from react query import supabase from app supabase const login async email password gt const data error await supabase auth signIn email password if error throw new Error error message return data export default function useLogin email password return useMutation login gt login email password And similarly in pages auth login tsx const loginMutation useLogin email password if loginMutation isSuccess router push loginMutation isError amp amp lt p className text sm mb text red gt loginMutation error message lt p gt lt button className bg blue text white px py rounded w full onClick gt loginMutation mutate gt loginMutation isLoading lt span gt lt Loader height width gt lt span gt lt span gt Login lt span gt lt button gt It s pretty similar to signup we call the supabase auth signIn method and redirect the user if the mutation is successful Now if you enter your credentials login should work Authenticated PagesNow when the user logs in we want to fetch the user details name and username in our case which will be available to the entire app Let s create a hook for that Create a file in hooks useUser tsimport useQuery from react query import supabase from app supabase const getUser async userId gt const data error await supabase from users select eq id userId single if error throw new Error error message if data throw new Error User not found return data export default function useUser const user supabase auth user return useQuery user gt getUser user id The useQuery hook needs a unique key as the first parameter gt At its core React Query manages query caching for you based on query keys Query keys can be as simple as a string or as complex as an array of many strings and nested objects As long as the query key is serializable and unique to the query s data you can use it Read more here We define a getUser method which uses the supabase client query builder This is equivalent toSELECT FROM users where id lt userId gt In the default export we use the supabase auth user method which returns the user if session exists Note the user id in the getUser method call this is because the auth user method can initially return null and eventually resolves to a value Now we want to make our home page authenticated So when a user doesn t have a session he will be redirected to the login page To do that let s create a file in components Protected tsximport Loader from ui loader import useRouter from next router import useUser from hooks useUser export default function ProtectedWrapper children const router useRouter const isLoading isError useUser if isLoading return lt div className h screen grid place items center gt lt Loader height width gt lt div gt if isError router push auth login return lt div className h screen grid place items center gt lt Loader height width gt lt div gt return lt div gt children lt div gt This is a wrapper component which basically checks for the session and redirects if it s not there Let s see how it happens So we are using the useUser we defined earlier and destructuring isLoading and isError from the it If it s loading we display a loader and if the query errors we redirect the user The isLoading state happens when the query is being fetched for the first time likely during component mount for the first time window reload The isError state is when the useUser query errors This is the beauty of react query If the session doesn t exist the supabase auth user will never resolve to a value and the getUser call will throw an error Also when the value returned from supabase auth user changes from null to user the query is automatically refetched Now let s use this ProtectedWrapper inside our index page import ProtectedWrapper from components Protected export default function Home return lt ProtectedWrapper gt lt ProtectedWrapper gt Let s see it in action This one is when there is no session This one is where browser session exists Awesome we can now use this wrapper in pages which we want to be authenticated Displaying the userLet s create a Navbar componentimport Link from next link import Loader from ui loader import useRouter from next router export default function Navbar return lt div className flex items center justify around py bg blue text white shadow gt lt Link href gt lt div className text xl gt Home lt div gt lt Link gt lt div className text xl flex items center space x gt lt div gt lt Link href search gt Search lt Link gt lt div gt lt div gt Username lt div gt lt div className cursor pointer gt Logout feather icon lt svg xmlns width height viewBox fill none stroke currentColor strokeWidth strokeLinecap round strokeLinejoin round className feather feather log out gt lt path d M Ha Va h gt lt path gt lt polyline points gt lt polyline gt lt line x y x y gt lt line gt lt svg gt lt div gt lt div gt lt div gt Now let s say we want to display the username in our Navbar we don t have to do anything but reuse the useUser query again in the Navbar component React query by default caches all queries for mins can be changed after which the query is refetched Here s how import useUser from hooks useUser export default function Navbar const data isLoading useUser userId user id lt div gt isLoading lt span gt lt Loader height width gt lt span gt data username lt div gt A few things that react query takes care for us hereWe didn t have to add any logic to share the state we can just use the data from the hookWe get the state object in navbar as well which we use to display a loading indication incase the user is being fetchedNo declaring of many initial states and dispatching of actions Log outLet s also add the log out logic in the navbar You know the script create a hook and use the hook import useMutation useQueryClient from react query import supabase from app supabase const logout async gt const error await supabase auth signOut if error throw error export default function useLogOut const queryClient useQueryClient return useMutation gt logout onSuccess gt queryClient removeQueries We use the supabase auth signOut which destroys the session and logs the user out A thing to notice here is since our app uses queries to display data and not any kind of store we need to remove the queries once a user logs out To do that we use the queryClient from the useQueryClient hook and on the success side effect we remove all the queries using queryClient removeQueries method import useLogOut from hooks useLogOut import useRouter from next router export default function Navbar const logoutMutation useLogOut const router useRouter if logoutMutation isSuccess router push auth login lt div className cursor pointer onClick gt logoutMutation mutate gt lt svg lt svg gt lt div gt Done clicking the logout button now destroys the session and redirects to the login page Searching for moviesWe know the pattern now let s create a hook for searching movies Create a file in hooks useMovies tsimport useQuery from react query const searchMovies async query gt const response await fetch process env NEXT PUBLIC TMDB API KEY amp query query amp language en US amp page if response ok throw new Error Error searching movies return response json export default function useMovies query return useQuery movies gt searchMovies query enabled false The enabled false here means the query doesn t run automatically and has to be manually triggered using refetch More hereCreate a page called search tsximport Navbar from components layouts navbar import Search from components search import ProtectedWrapper from components Protected export default function Home return lt ProtectedWrapper gt lt div className min h screen gt lt Navbar gt lt div className container mx auto gt lt Search gt lt div gt lt div gt lt ProtectedWrapper gt And the Search component in components search index tsximport useState from react import useMovies from hooks useMovies import SearchResultItem from SearchResultItem import Loader from ui loader export default function Search const query setQuery useState const refetch isFetching data isSuccess isIdle useMovies query return lt div className mt text xl flex flex col items center gt lt div className flex gt lt input className border shadow px py rounded focus outline none onChange e gt setQuery e target value gt lt button className bg blue py px shadow rounded text white w onClick gt refetch gt isFetching lt span gt lt Loader height width gt lt span gt Search lt button gt lt div gt lt div className mt gt isSuccess amp amp lt div className grid place items center gt data results sort a b gt b popularity a popularity map item index gt lt SearchResultItem title item title overview item overview key index poster path item poster path release date item release date gt lt div gt lt div gt isSuccess amp amp data results length amp amp lt div className mt gt lt p gt No results found lt p gt lt div gt isIdle amp amp lt div className mt gt Search for a movie lt div gt lt div gt And the search item componentimport dayjs from dayjs export default function SearchResultItem title overview poster path release date return lt div className flex w mt shadow rounded py gt lt div className h w grid place items center flex none gt lt img src poster path alt poster height width gt lt div gt lt div className px flex flex col justify around gt lt p className text xl gt title lt p gt lt p className text base gt overview slice lt p gt lt p className text base gt dayjs release date format YYYY lt p gt lt button className w px py text base bg blue text white rounded gt Add lt button gt lt div gt lt div gt Now we can search for a movie and are displaying it in a list One thing you will notice that even if you change pages and come back to the search page the movie results if you had searched would have been cached and are shown Woohoo Adding a movie to your recommendationLet s create another hook for that In a file hooks useAddMovie tsimport useMutation from react query import supabase from app supabase interface Movie movie id number title string overview string poster path string release date string const addMovie async movie Movie user id string gt const error await supabase from movies upsert movie single if error throw error const data error err await supabase from recommendations upsert movie id movie movie id user id onConflict user id movie id single if err throw err return data export default function useAddMovie movie Movie const user supabase auth user return useMutation gt addMovie movie user id Note that we are using upsert in both the calls one to save the movie details so a duplicate movie isn t added and second to prevent a duplicate entry in recommendation we have the onConflict clause to satisfy the unique index constraint Also we are using supabase auth user to pass in the user id for the second method Then in components search SearchResultItem tsx imports export default function SearchResultItem id title overview poster path release date const addMovie useAddMovie movie id id title overview poster path release date lt button className w px py text base bg blue text white rounded onClick gt addMovie mutate gt addMovie isLoading lt span gt lt Loader height width gt lt span gt Add lt button gt Awesome now we can add a movie to our list The last thing remaining is to display them in the home screen Displaying your recommendationsCreate a file in hooks useRecommendations tsimport useQuery from react query import supabase from app supabase const fetchRecommendations async user id gt const data error await supabase from recommendation select movie eq user id user id if error throw new Error error message return data export default function useRecommendations const user supabase auth user return useQuery recommendations gt fetchRecommendations user id Here we are fetching from the foreign table movie using the movie id foreign key and matching by the user id Let s update our components recommendations index tsximport Link from next link import useRecommendations from hooks useRecommendations import MovieCard from MovieCard import Loader from ui loader export default function Recommendations const data isSuccess isLoading useRecommendations if isLoading return lt div className h screen grid place items center gt lt Loader height width gt lt div gt return lt div gt lt h className text xl my gt Your recommendations lt h gt lt hr gt isSuccess amp amp data length amp amp lt div className mt text xl grid place items center gt lt p gt You have no recommendations yet lt p gt lt p gt lt span className cursor pointer text blue gt lt Link href search gt Search lt Link gt lt span gt lt span gt for movies and add them to your recommendations lt span gt lt p gt lt div gt isSuccess amp amp lt div className grid grid cols gap x gap y gt data map movie movie id title overview poster path release date gt lt MovieCard key movie id title title poster path poster path gt lt div gt lt div gt And components recommendations MovieCard tsxexport default function MovieCard title poster path return lt div className grid place items center shadow rounded py gt lt img src poster path gt lt p className mt text xl font semibold gt title lt p gt lt div gt Perfect now when we load the home page we have a loader when the query is fetched If you go into search and add a movie you will see the home page will have fetched that automatically That s because when move to a different page the recommendations query becomes inactive and is automatically fetched again on component mount If you open devtools you will also notice that the useUser query is also being fetched multiple times when we go to a new page Stale queries are refetched automatically in the background when New instances of the query mount The window is refocused The network is reconnected The query is optionally configured with a refetch interval This behaviour is good but sometimes undesirable Gladly we can configure it in query default options const queryClient new QueryClient defaultOptions queries retry refetchOnMount false refetchOnWindowFocus false We can also add this individually to a query Now that we have disabled auto fetch on remount we want to refetch the query when we add a movie from search page For this we can again use the queryClient from the useQueryClient hook Here we want to use the refetchQueries method If the query is currently being used in the same page you can use invalidateQueries method which makes the stale and are refetched automatically Since our use case is for a different page we will use refetchQueries instead In our hooks useAddMovie ts file export default function useAddMovie movie Movie const queryClient useQueryClient const user supabase auth user return useMutation gt addMovie movie user id onSuccess gt queryClient refetchQueries recommendations Now when you add a movie the query is refetched automatically The end resultReact query has so many features it s impossible to cover them all in a go You can play around with react query with an application even better if you refactor an existing one to react query The code until this point is on githubThat s it for this part In the next part we will build upon this app and add lists which you can create and add your recommendations into and more features We will delve more into supabase row level policies etc and more react query features Thanks for reading up to this point If you liked the post like and share it on twitter Documentation linksNextJS React Query Supabase Auth Supabase Client Tailwind CSS 2021-06-28 15:06:09
海外TECH Engadget How I inadvertently became a vinyl nerd https://www.engadget.com/u-turn-audio-orbit-plus-kanto-yu4-irl-150023872.html?src=rss_b2c kanto 2021-06-28 15:45:23
海外TECH Engadget Issac Asimov’s 'Foundation' lands on Apple TV+ September 24 https://www.engadget.com/apple-tv-plus-foundation-isaac-asimov-release-date-152711615.html?src=rss_b2c apple 2021-06-28 15:27:11
Cisco Cisco Blog F5 & Cisco ACI Essentials: ServiceCenter — One stop shop for IP address facts https://blogs.cisco.com/datacenter/f5-cisco-aci-essentials-servicecenter-one-stop-shop-for-ip-address-facts F amp Cisco ACI Essentials ServiceCenter ーOne stop shop for IP address factsDebugging a network issue can be daunting involving s of IP addresses spread across your entire deployment Imagine having a tool that can get all the information you want from an IP address with a click of a button The F ACI ServiceCenter is designed to do exactly that and more 2021-06-28 15:00:43
海外科学 NYT > Science The Largest Comet Ever Found Is Making Its Move Into a Sky Near You https://www.nytimes.com/2021/06/28/science/comet-largest-ever-seen.html telescope 2021-06-28 15:52:16
金融 RSS FILE - 日本証券業協会 J-IRISS https://www.jsda.or.jp/anshin/j-iriss/index.html iriss 2021-06-28 15:01:00
金融 金融庁ホームページ 審判期日の予定を更新しました。 https://www.fsa.go.jp/policy/kachoukin/06.html 期日 2021-06-28 16:00:00
金融 金融庁ホームページ 池田泉州銀行に対する信託兼営認可について公表しました。 https://www.fsa.go.jp/news/r2/ginkou/202106kenei/202106.html 池田泉州銀行 2021-06-28 16:00:00
ニュース ジェトロ ビジネスニュース(通商弘報) グジャラート州、GIFTシティーにインド初の国際的海運ビジネスクラスター構想 https://www.jetro.go.jp/biznews/2021/06/114fc72b4fd3a9c7.html 海運 2021-06-28 15:40:00
ニュース ジェトロ ビジネスニュース(通商弘報) 世界の生計費ランキング、アフリカではチャドが前年に続き首位 https://www.jetro.go.jp/biznews/2021/06/c2102c5964fefa04.html 生計 2021-06-28 15:30:00
ニュース ジェトロ ビジネスニュース(通商弘報) 5月の二輪生産台数、前年同月比2.7倍の20万9,000台 https://www.jetro.go.jp/biznews/2021/06/7a4a39be7453876e.html 生産 2021-06-28 15:20:00
ニュース ジェトロ ビジネスニュース(通商弘報) 5月の自動車生産台数、前年同月比2.5倍の14万台 https://www.jetro.go.jp/biznews/2021/06/c7f77686e4ec9aff.html 自動車 2021-06-28 15:10:00
ニュース BBC News - Home Covid: Easing measures on 19 July very likely, says Boris Johnson https://www.bbc.co.uk/news/uk-57630553 england 2021-06-28 15:39:55
ニュース BBC News - Home Mixing Covid vaccines gives good protection, study suggests https://www.bbc.co.uk/news/health-57636356 suggests 2021-06-28 15:01:02
ニュース BBC News - Home Ministry of Defence 'sorry' after secret papers left at bus stop https://www.bbc.co.uk/news/uk-57642108 jeremy 2021-06-28 15:52:46
ニュース BBC News - Home Spain, Malta and Portugal introduce measures for UK travellers https://www.bbc.co.uk/news/business-57634932 travellers 2021-06-28 15:26:12
ニュース BBC News - Home Elephant and Castle fire: Two hurt in huge blaze at railway arches https://www.bbc.co.uk/news/uk-england-london-57642027 castle 2021-06-28 15:48:03
ニュース BBC News - Home World number one Djokovic sees off spirited British teenager Draper https://www.bbc.co.uk/sport/tennis/57633074 World number one Djokovic sees off spirited British teenager DraperBritish teenager Jack Draper takes the opening set off Novak Djokovic but the defending champion fights back to reach the Wimbledon second round 2021-06-28 15:29:38
ニュース BBC News - Home Masks, social distancing and smaller crowds - yet Wimbledon still feels the same https://www.bbc.co.uk/sport/tennis/57637381 restrictions 2021-06-28 15:22:06
ニュース BBC News - Home Wimbledon 2021: 'Shot of the tournament?' Frances Tiafoe hits brilliant forehand winner https://www.bbc.co.uk/sport/av/tennis/57644233 Wimbledon x Shot of the tournament x Frances Tiafoe hits brilliant forehand winnerWatch Frances Tiafoe hit a brilliant forehand winner described as potentially the best of the tournament during his first round match with Stefanos Tsitsipas at Wimbledon 2021-06-28 15:44:33
ニュース BBC News - Home Wimbledon 2021: Novak Djokovic beats Jack Draper - best shots https://www.bbc.co.uk/sport/av/tennis/57642857 draper 2021-06-28 15:39:25
北海道 北海道新聞 ロボットペッパー生産停止 ソフトバンクG販売不振か https://www.hokkaido-np.co.jp/article/560914/ 販売 2021-06-29 00:17:00
北海道 北海道新聞 トウカイテイオー最後の産駒、7歳キセキノテイオー 能力検査に合格、7月デビュー目指す https://www.hokkaido-np.co.jp/article/560788/ 能力 2021-06-29 00:09:56
仮想通貨 BITPRESS(ビットプレス) LVC、7/27まで「暗号資産デビュー2000円現金プレゼント!新規口座開設キャンペーン」実施 https://bitpress.jp/count2/3_14_12611 開設 2021-06-29 00:03:02

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)